From ded583576b85cef940ed8f1365ec818eda1400bf Mon Sep 17 00:00:00 2001 From: Ali Arshad Date: Fri, 6 Dec 2024 22:48:23 +0500 Subject: [PATCH 1/6] new project started --- .github/FUNDING.yml | 5 - .github/ISSUE_TEMPLATE/---bug-report.md | 37 - .github/ISSUE_TEMPLATE/---feature-request.md | 15 - .github/ISSUE_TEMPLATE/--support-question.md | 14 - .gitignore | 1 + .travis.yml | 33 - .vscode-test.mjs | 5 + .vscode/extensions.json | 5 + .vscode/launch.json | 32 +- .vscode/settings.json | 10 +- .vscode/tasks.json | 56 +- .vscodeignore | 22 +- CHANGELOG.md | 152 +-- CODE_OF_CONDUCT.md | 46 - CONTRIBUTING.md | 90 -- LICENSE | 22 - PULL_REQUEST_TEMPLATE.md | 25 - README.md | 387 +----- code-settings-sync.code-workspace | 10 + configs/webpack.config.js | 45 - configs/webpack.development.config.js | 9 - configs/webpack.production.config.js | 11 - debug.log | 1 - eslint.config.mjs | 28 + install_local.txt | 3 - package.json | 83 +- package.nls.de.json | 144 --- package.nls.es.json | 144 --- package.nls.fr.json | 143 -- package.nls.hu.json | 143 -- package.nls.it.json | 144 --- package.nls.ja.json | 144 --- package.nls.json | 144 --- package.nls.ko.json | 138 -- package.nls.pt-br.json | 145 --- package.nls.ru.json | 144 --- package.nls.tr.json | 144 --- package.nls.zh-cn.json | 144 --- package.nls.zh-tw.json | 144 --- release-notes.json | 52 - scripts/deploy.sh | 8 - src/commons.ts | 531 -------- src/enums.ts | 13 - src/environmentPath.ts | 196 --- src/extension.ts | 74 +- src/localize.ts | 86 -- src/lockfile.ts | 34 - src/models/cloudSettings.model.ts | 6 - src/models/customConfig.model.ts | 33 - src/models/extensionConfig.model.ts | 10 - src/models/language-pack.model.ts | 3 - src/models/localConfig.model.ts | 10 - src/models/settingType.model.ts | 6 - src/models/state.model.ts | 10 - src/models/webview.model.ts | 9 - src/pragmaUtil.ts | 291 ----- src/service/autoUpload.service.ts | 99 -- src/service/file.service.ts | 240 ---- src/service/github.oauth.service.ts | 136 -- src/service/github.service.ts | 203 --- src/service/plugin.service.ts | 243 ---- src/service/webview.service.ts | 479 ------- src/state.ts | 5 - src/sync.ts | 1145 ----------------- src/test/extension.test.ts | 15 + src/util.ts | 31 - test/extension.test.ts | 3 - test/index.ts | 8 - test/pragmaUtil/index.ts | 105 -- test/pragmaUtil/testSettings.txt | 35 - test/service/fileService/dummyrc | 3 - test/service/fileService/fileService.test.ts | 36 - tsconfig.json | 25 +- tslint.json | 29 - ui/gist-selection/gist-selection.html | 95 -- ui/gist-selection/gist-selection.js | 89 -- ui/landing-page/landing-page.html | 178 --- ui/landing-page/landing-page.js | 40 - ui/settings/settings.html | 68 - ui/settings/settings.js | 269 ---- ui/shared/fonts.js | 19 - ui/shared/page-header.js | 18 - ui/shared/styles.css | 199 --- .../vendor/bootstrap/css/bootstrap.min.css | 7 - .../vendor/bootstrap/js/bootstrap.min.js | 7 - .../fontawesome/css/fontawesome.min.css | 5 - .../vendor/fontawesome/css/solid.min.css | 5 - .../fontawesome/webfonts/fa-solid-900.ttf | Bin 191832 -> 0 bytes ui/shared/vendor/google/OpenSans-Bold.ttf | Bin 103616 -> 0 bytes ui/shared/vendor/google/Roboto-Bold.ttf | Bin 170064 -> 0 bytes ui/shared/vendor/google/Roboto-Regular.ttf | Bin 170984 -> 0 bytes .../vendor/jquery/jquery-3.3.1.slim.min.js | 2 - ui/shared/vendor/lodash/lodash.min.js | 137 -- ui/shared/vendor/popper.js/popper.min.js | 5 - vsc-extension-quickstart.md | 48 + webpack.config.js | 48 + 96 files changed, 383 insertions(+), 8080 deletions(-) delete mode 100644 .github/FUNDING.yml delete mode 100644 .github/ISSUE_TEMPLATE/---bug-report.md delete mode 100644 .github/ISSUE_TEMPLATE/---feature-request.md delete mode 100644 .github/ISSUE_TEMPLATE/--support-question.md delete mode 100644 .travis.yml create mode 100644 .vscode-test.mjs create mode 100644 .vscode/extensions.json delete mode 100644 CODE_OF_CONDUCT.md delete mode 100644 CONTRIBUTING.md delete mode 100644 LICENSE delete mode 100644 PULL_REQUEST_TEMPLATE.md create mode 100644 code-settings-sync.code-workspace delete mode 100644 configs/webpack.config.js delete mode 100644 configs/webpack.development.config.js delete mode 100644 configs/webpack.production.config.js delete mode 100644 debug.log create mode 100644 eslint.config.mjs delete mode 100644 install_local.txt delete mode 100644 package.nls.de.json delete mode 100644 package.nls.es.json delete mode 100644 package.nls.fr.json delete mode 100644 package.nls.hu.json delete mode 100644 package.nls.it.json delete mode 100644 package.nls.ja.json delete mode 100644 package.nls.json delete mode 100644 package.nls.ko.json delete mode 100644 package.nls.pt-br.json delete mode 100644 package.nls.ru.json delete mode 100644 package.nls.tr.json delete mode 100644 package.nls.zh-cn.json delete mode 100644 package.nls.zh-tw.json delete mode 100644 release-notes.json delete mode 100644 scripts/deploy.sh delete mode 100644 src/commons.ts delete mode 100644 src/enums.ts delete mode 100644 src/environmentPath.ts delete mode 100644 src/localize.ts delete mode 100644 src/lockfile.ts delete mode 100644 src/models/cloudSettings.model.ts delete mode 100644 src/models/customConfig.model.ts delete mode 100644 src/models/extensionConfig.model.ts delete mode 100644 src/models/language-pack.model.ts delete mode 100644 src/models/localConfig.model.ts delete mode 100644 src/models/settingType.model.ts delete mode 100644 src/models/state.model.ts delete mode 100644 src/models/webview.model.ts delete mode 100644 src/pragmaUtil.ts delete mode 100644 src/service/autoUpload.service.ts delete mode 100644 src/service/file.service.ts delete mode 100644 src/service/github.oauth.service.ts delete mode 100644 src/service/github.service.ts delete mode 100644 src/service/plugin.service.ts delete mode 100644 src/service/webview.service.ts delete mode 100644 src/state.ts delete mode 100644 src/sync.ts create mode 100644 src/test/extension.test.ts delete mode 100644 src/util.ts delete mode 100644 test/extension.test.ts delete mode 100644 test/index.ts delete mode 100644 test/pragmaUtil/index.ts delete mode 100644 test/pragmaUtil/testSettings.txt delete mode 100644 test/service/fileService/dummyrc delete mode 100644 test/service/fileService/fileService.test.ts delete mode 100644 tslint.json delete mode 100644 ui/gist-selection/gist-selection.html delete mode 100644 ui/gist-selection/gist-selection.js delete mode 100644 ui/landing-page/landing-page.html delete mode 100644 ui/landing-page/landing-page.js delete mode 100644 ui/settings/settings.html delete mode 100644 ui/settings/settings.js delete mode 100644 ui/shared/fonts.js delete mode 100644 ui/shared/page-header.js delete mode 100644 ui/shared/styles.css delete mode 100644 ui/shared/vendor/bootstrap/css/bootstrap.min.css delete mode 100644 ui/shared/vendor/bootstrap/js/bootstrap.min.js delete mode 100644 ui/shared/vendor/fontawesome/css/fontawesome.min.css delete mode 100644 ui/shared/vendor/fontawesome/css/solid.min.css delete mode 100644 ui/shared/vendor/fontawesome/webfonts/fa-solid-900.ttf delete mode 100644 ui/shared/vendor/google/OpenSans-Bold.ttf delete mode 100644 ui/shared/vendor/google/Roboto-Bold.ttf delete mode 100644 ui/shared/vendor/google/Roboto-Regular.ttf delete mode 100644 ui/shared/vendor/jquery/jquery-3.3.1.slim.min.js delete mode 100644 ui/shared/vendor/lodash/lodash.min.js delete mode 100644 ui/shared/vendor/popper.js/popper.min.js create mode 100644 vsc-extension-quickstart.md create mode 100644 webpack.config.js diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index 0628997f..00000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1,5 +0,0 @@ -# These are supported funding model platforms - -github: shanalikhan -open_collective: code-settings-sync -issuehunt: code-settings-sync diff --git a/.github/ISSUE_TEMPLATE/---bug-report.md b/.github/ISSUE_TEMPLATE/---bug-report.md deleted file mode 100644 index 4d0a41d1..00000000 --- a/.github/ISSUE_TEMPLATE/---bug-report.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -name: "\U0001F41B Bug report" -about: "Bugs, missing documentation, or unexpected behavior \U0001F914" - ---- - -🐛 **Describe the bug** -A clear and concise description of what the bug is. You are always welcome to check the [Troubleshooting](https://github.com/shanalikhan/code-settings-sync/wiki/Troubleshooting) section before filing the ticket. - - -🌴 **Visual Studio Code Version :** [ VERSION_HERE ] -🌴 **Code Settings Sync Version :** [ VERSION_HERE ] -🌴 **Standard or Insiders :** [ _here_ ] -🌴 **Portable or Installed :** [ _here_ ] -🌴 **OSS or Official Build :** [ _here_ ] -🌴 **Operating System :** [ VERSION_HERE ] -🌴 **Occurs On:** [Upload / Download / Help Configuring ] -🌴 **Proxy Enabled:** [ Yes / No ] -🌴 **Gist Id:** [ ID_HERE ] - - - -📰 **To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -💪 **Expected behavior** -A clear and concise description of what you expected to happen. - -📺 **Console Error Log** -If applicable, add screenshots or paste the console log from developer console of VSCode (Help Menu > Developer Tool - Console Tab). - -📺 **Additional context** -Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/---feature-request.md b/.github/ISSUE_TEMPLATE/---feature-request.md deleted file mode 100644 index 99bdb14d..00000000 --- a/.github/ISSUE_TEMPLATE/---feature-request.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -name: "\U0001F4A1 Feature request" -about: "I have a suggestion (and might want to implement myself \U0001F642)! " - ---- - -💡 **Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -💡 **Describe the solution you'd like** -A clear and concise description of what you want to happen. - - -💡 **Additional context** -Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/--support-question.md b/.github/ISSUE_TEMPLATE/--support-question.md deleted file mode 100644 index f77149b4..00000000 --- a/.github/ISSUE_TEMPLATE/--support-question.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -name: "❓ Support Question" -about: " \U0001F6D1 If you have a question \U0001F4AC, please check out our support - channels! " - ---- - -I will recommend to discuss about project over the slack. - -You can join the community from the following link: - -https://join.slack.com/t/codesettingssync/shared_invite/enQtNzQyODMzMzI5MDQ3LWNmZjVkZjE2YTg0MzY1Y2EyYzVmYThmNzg2YjZkNjhhZWY3ZTEzN2I3ZTAxMjkwNWU0ZjMyZGFhMjdiZDI3ODU - -Feel free to open ticket here. diff --git a/.gitignore b/.gitignore index c99c7b65..e1183eeb 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ package-lock.json *.vsix *.lock *.log +.history diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 16e9a25b..00000000 --- a/.travis.yml +++ /dev/null @@ -1,33 +0,0 @@ -language: node_js -node_js: - - node -before_install: - - npm install npm@latest -g - - npm install node-pre-gyp - - npm i --no-optional - - npm dedupe - - npm up - - npm install -g vsce - -install: - - vsce package -script: - - npm run tslint-check - - npm run compile - -deploy: - provider: script - script: bash scripts/deploy.sh - on: - branch: master - - -notifications: - slack: - secure: R9xqGEFOQHI+6oaiGz7+4zOErZydinpg+7tQd0xaCy8qRswcVtPT+yX6RAgsEGS+RXaOoVz9N534XJIdLXyW/nN8vD898Dwq4nf+lUMiRuuPrvCLk2rh50FFDRi6aoeCv1qxeNswf2ahNnFILV4FE8t2r/+P2vYeB/pJ8DChFTlz3+mjXuawH9cW+hLR6DOC7307dLHGq6SuhIvfyuysu6ZU9tyKVRWW/BsQgmz+PtlfA1HGAVzg0Yc8KhGGuWdSZydOcSisUWX2f8+BL1HGPXbzlMqJinb7z7k8HJVjddH88Tfa2Jphs/rxoKr+enlqqeCNdCIlRQ8p093bkw9B2Rmo2/xYfc2w0JnzEK5q8EibsDapn2V7hcNCd2hO1MuXTus4L43ZBxoJZoQfiyYPIYRTgo4mCT4B4AKzOuvaNZ/sXYN6I7UTwY1iXzUW3ntdn49tWJmFdUuDNwj+im+X89xdRqUWVaJD9cfgG9070MIle2CFFMGL0OXLwJRnoj3ySOLuJVThL68qVoX5E4NZn4HDdMKtmf7h8P36BUG2zmuq6n48NEiLlWgLd8HWXZEIkVnBytnnQ/+5Bg5ZZsHCEpIjcPGPuUXa5WpJlZdcqDvaQJ7NRjckDYhGqHz7AqLxMWnwcOAPWrWOYnKymh38ncGgznfjR3JSy8ZBXMU6xDw= - email: - on_success: never - on_failure: always - -env: - secure: RoVxN0hSdHzA5TEA/zW5gJcAXP7qPjLSOjWTeu+m2Ooo3XgxiHSsnld7pTMU/fDYsBjAlakiv1cLU505iBIp8I7aBb7oW2rKs/YlXHeSlYUpYpwWj7/ploiY2Zg2L+s1Ojfg3X/tAaR0jSRYsffPSlZJmUL+Wom+R5pDx64nCh2hJ2egu04Co+3QSQySWrcFbUrT7phJPVW5OHYQDc+68i9QS9ptPzuKgGu1CxsYphMPsiA0EPzTUu88hPPov7UvvE7NmDnq94ObgQbkVrpMrnQFuid0EGHAeN05/RpBhQHQ7s6/eZTPIj7EAISXDMzu0X6XsbYKNLwWyjKxdpUYyl7lUFqUQYlmCk05mgH1392LqJdpYkm6NFscdU4LHiHUzpOaOBNzpewl18eQbXq/iJei6AiEw7MxwhbCh6Kg6EzhPRpBX2Pv53EBHhcSvzgkl66lau/a7HFSnQ6G4DNl6A8akD2CV9+r2r2uAj80ZBfSPIa5lTmWoJvuOw33pW2YwJn5GMyoMXydewjPCMHLIx+PNd57M1LToVdOlbrKGL1u9Xrb0FHV2DKLYslW21Dr0LCoP+NwcRcnM2R/lUKXIh5MSKLnk31jMgXrgezr+1eaOBZwo+X0gfj5YNWSA71sUXrg9AbCIP74zyUyowbkm3b1HwVFu8JtcP/ON8xqC6A= diff --git a/.vscode-test.mjs b/.vscode-test.mjs new file mode 100644 index 00000000..b62ba25f --- /dev/null +++ b/.vscode-test.mjs @@ -0,0 +1,5 @@ +import { defineConfig } from '@vscode/test-cli'; + +export default defineConfig({ + files: 'out/test/**/*.test.js', +}); diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..dd01eb35 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": ["dbaeumer.vscode-eslint", "amodio.tsl-problem-matcher", "ms-vscode.extension-test-runner"] +} diff --git a/.vscode/launch.json b/.vscode/launch.json index 29e14514..c42edc04 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,27 +1,21 @@ // A launch configuration that compiles the extension and then opens it inside a new window +// Use IntelliSense to learn about possible attributes. +// Hover to view descriptions of existing attributes. +// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 { - "version": "0.1.0", - "configurations": [{ - "name": "Launch Extension", - "type": "extensionHost", - "request": "launch", - "runtimeExecutable": "${execPath}", - "args": ["--extensionDevelopmentPath=${workspaceRoot}"], - "stopOnEntry": false, - "sourceMaps": true, - "outFiles": ["${workspaceRoot}/out/**/*.js"], - "preLaunchTask": "build" - }, + "version": "0.2.0", + "configurations": [ { - "name": "Launch Tests", + "name": "Run Extension", "type": "extensionHost", "request": "launch", - "runtimeExecutable": "${execPath}", - "args": ["--extensionDevelopmentPath=${workspaceRoot}", "--extensionTestsPath=${workspaceRoot}/out/test"], - "stopOnEntry": false, - "sourceMaps": true, - "outFiles": ["${workspaceRoot}/out/test/**/*.js"], - "preLaunchTask": "test_build" + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}" + ], + "outFiles": [ + "${workspaceFolder}/dist/**/*.js" + ], + "preLaunchTask": "${defaultBuildTask}" } ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index f454cfdb..16a5c022 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,9 +1,13 @@ // Place your settings in this file to overwrite default and user settings. { "files.exclude": { - "out": false // set this to true to hide the "out" folder with the compiled JS files + "out": false, // set this to true to hide the "out" folder with the compiled JS files + "dist": false // set this to true to hide the "dist" folder with the compiled JS files }, "search.exclude": { - "out": true // set this to false to include "out" folder in search results - } + "out": true, // set this to false to include "out" folder in search results + "dist": true // set this to false to include "dist" folder in search results + }, + // Turn off tsc task auto detection since we have the necessary tasks as npm scripts + "typescript.tsc.autoDetect": "off" } diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 343e3cfe..c2ab68ae 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -1,20 +1,40 @@ +// See https://go.microsoft.com/fwlink/?LinkId=733558 +// for the documentation about the tasks.json format { - // See https://go.microsoft.com/fwlink/?LinkId=733558 - // for the documentation about the tasks.json format - "version": "2.0.0", - "tasks": [ - { - "label": "build", - "type": "shell", - "command": "npm", - "args": ["run", "compile", "--loglevel", "silent"], - "problemMatcher": "$tsc-watch" - }, - { - "label": "test_build", - "type": "shell", - "command": "tsc", - "args": ["-p", "./"] - } - ] + "version": "2.0.0", + "tasks": [ + { + "type": "npm", + "script": "watch", + "problemMatcher": "$ts-webpack-watch", + "isBackground": true, + "presentation": { + "reveal": "never", + "group": "watchers" + }, + "group": { + "kind": "build", + "isDefault": true + } + }, + { + "type": "npm", + "script": "watch-tests", + "problemMatcher": "$tsc-watch", + "isBackground": true, + "presentation": { + "reveal": "never", + "group": "watchers" + }, + "group": "build" + }, + { + "label": "tasks: watch-tests", + "dependsOn": [ + "npm: watch", + "npm: watch-tests" + ], + "problemMatcher": [] + } + ] } diff --git a/.vscodeignore b/.vscodeignore index b66eaaf4..d255964e 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -1,16 +1,14 @@ .vscode/** -typings/** -out/test/** -test/** +.vscode-test/** +out/** +node_modules/** src/** -**/*.map .gitignore -tsconfig.json -vsc-extension-quickstart.md -node_modules -.github -debug.log -scripts -tslint.json +.yarnrc webpack.config.js -*.log \ No newline at end of file +vsc-extension-quickstart.md +**/tsconfig.json +**/eslint.config.mjs +**/*.map +**/*.ts +**/.vscode-test.* diff --git a/CHANGELOG.md b/CHANGELOG.md index e84f5d03..34ae2a70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,143 +1,9 @@ -# ChangeLog : Settings Sync [![Tweet](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/intent/tweet?text=Synchronize%20your%20%40VisualStudio%20%40code%20Settings%20Across%20Multiple%20Machines%20using%20%40github%20GIST%20by%20%40itsShanKhan&url=https://github.com/shanalikhan/code-settings-sync&via=code&hashtags=code,vscode,SettingsSync,developers) [![Follow](https://img.shields.io/twitter/follow/itsShanKhan.svg?style=social&label=Follow)](https://twitter.com/intent/follow?screen_name=itsShanKhan) - -[![Version](https://vsmarketplacebadge.apphb.com/version/Shan.code-settings-sync.svg)](https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync) [![Travis](https://img.shields.io/travis/rust-lang/rust.svg)](https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync) [![Master course](https://img.shields.io/badge/Supported%20by-VSCode%20Power%20User%20Course%20%E2%86%92-gray.svg?colorA=444444&colorB=4F44D6)](https://t.co/8BEMyhpKU5?amp=1) - -#### v3.4.3 - September 23,2019 - -* Share GitHub Gist ID message Fixed [#1033](https://github.com/shanalikhan/code-settings-sync/issues/1033) -* Consistency between GitHub Gist and Description across extension readme [#1023](https://github.com/shanalikhan/code-settings-sync/issues/1023) -* Snippets Sync. Fixed [#993](https://github.com/shanalikhan/code-settings-sync/issues/993) -* GitHub Api connection improved [#1027](https://github.com/shanalikhan/code-settings-sync/issues/1027) -* Extension always asks to enable Force Upload [#1016](https://github.com/shanalikhan/code-settings-sync/issues/1016) - Thanks for PR [#1026](https://github.com/shanalikhan/code-settings-sync/pull/1026) by [@karl-lunarg](https://github.com/karl-lunarg) -* UX Improved for the Force Upload [#1035](https://github.com/shanalikhan/code-settings-sync/issues/1035) - Thanks for PR [#1042](https://github.com/shanalikhan/code-settings-sync/pull/1042) by [@karl-lunarg](https://github.com/karl-lunarg) -* Webview does not set a content security policy [#1010](https://github.com/shanalikhan/code-settings-sync/issues/1010) - Thanks for PR [#1020](https://github.com/shanalikhan/code-settings-sync/pull/1020) by [@ParkourKarthik](https://github.com/ParkourKarthik) -* Icon Improved - Thanks for PR [#1022](https://github.com/shanalikhan/code-settings-sync/pull/1022) by [@Pustur](https://github.com/Pustur) -* Improved German Languauge Support - Thanks for PR [#1040](https://github.com/shanalikhan/code-settings-sync/pull/1040) by [@jan-di](https://github.com/jan-di) -* Improved Chinese Language Support - Thanks for PR [#1028](https://github.com/shanalikhan/code-settings-sync/pull/1028) by [@YunChaoTsai](https://github.com/YunChaoTsai) -* Readme Improved - Thanks for PR [#1031](https://github.com/shanalikhan/code-settings-sync/pull/1031) by [@faliure](https://github.com/faliure) -* Slack Link Updated -* Node Modules Updated - -#### v3.4.2 - August 21, 2019 - -* Multiple Lanugages Support Improved [#1009](https://github.com/shanalikhan/code-settings-sync/pull/1009) by [@ XanatosX](https://github.com/XanatosX ) , [#999](https://github.com/shanalikhan/code-settings-sync/pull/999) by [@o3LL](https://github.com/o3LL) , [#994](https://github.com/shanalikhan/code-settings-sync/pull/994) by [@mijien0179](https://github.com/mijien0179) , [#981](https://github.com/shanalikhan/code-settings-sync/pull/981) by [@ryul1206](https://github.com/ryul1206) -* Hide GitHub Token on Summary [#974](https://github.com/shanalikhan/code-settings-sync/issues/974) -* Only Show "Share Gist" Dialog when Public Gist is created [#977](https://github.com/shanalikhan/code-settings-sync/issues/977) -* Sync Pragma Improved [#1003](https://github.com/shanalikhan/code-settings-sync/issues/1003) - Thanks for PR [#1012](https://github.com/shanalikhan/code-settings-sync/pull/1012) by [@protium-dev](https://github.com/protium-dev) -* UI Bug Fix where users were unable to select GIST [#983](https://github.com/shanalikhan/code-settings-sync/issues/983) - -#### v3.4.1 - July 22, 2019 - -* Turn off notifications on code startup [#959](https://github.com/shanalikhan/code-settings-sync/issues/959) - Thanks for PR [#960](https://github.com/shanalikhan/code-settings-sync/pull/960) by [@arnohovhannisyan](https://github.com/arnohovhannisyan) -* Chinese Translation Improved - Thanks for PR [#966](https://github.com/shanalikhan/code-settings-sync/pull/966) by [@linsui](https://github.com/linsui) and [#961](https://github.com/shanalikhan/code-settings-sync/pull/961) by [@ziofat](https://github.com/ziofat) -* Russian Translation Improved - Thanks for PR [#957](https://github.com/shanalikhan/code-settings-sync/pull/957) by [@AndreyWV](https://github.com/AndreyWV) - -#### v3.4.0 - July 15, 2019 - -* Settings Sync now use Webviews to allow you to configure settings [#506](https://github.com/shanalikhan/code-settings-sync/issues/506) - Thanks for PR [#876](https://github.com/shanalikhan/code-settings-sync/pull/876) by [@arnohovhannisyan](https://github.com/arnohovhannisyan) -* code snippets not being synced after update to 3.3.0 [#927](https://github.com/shanalikhan/code-settings-sync/issues/927) - Thanks for PR [#928](https://github.com/shanalikhan/code-settings-sync/pull/928) by [@arnohovhannisyan](https://github.com/arnohovhannisyan) -* Implement upload delay setting [#390](https://github.com/shanalikhan/code-settings-sync/issues/390) - Thanks for PR [#925](https://github.com/shanalikhan/code-settings-sync/pull/925) by [@arnohovhannisyan](https://github.com/arnohovhannisyan) -* Dont Upload If GIST and settings content are the same. [#316](https://github.com/shanalikhan/code-settings-sync/issues/316) - Thanks for PR [#923](https://github.com/shanalikhan/code-settings-sync/pull/923) by [@arnohovhannisyan](https://github.com/arnohovhannisyan) -* Prevent accidental upload [#350](https://github.com/shanalikhan/code-settings-sync/issues/350) - Thanks for PR [#923](https://github.com/shanalikhan/code-settings-sync/pull/923) by [@arnohovhannisyan](https://github.com/arnohovhannisyan) - -#### v3.3.1 - June 25,2019 -* Small Improvements - -#### v3.3.0 - June 25,2019 - -* Code OSS Version Support Added [#668](https://github.com/shanalikhan/code-settings-sync/issues/668) - Thanks for PR [#859](https://github.com/shanalikhan/code-settings-sync/pull/859) by [@arnohovhannisyan](https://github.com/arnohovhannisyan) -* Remote Development Support Added [#870](https://github.com/shanalikhan/code-settings-sync/issues/870) - Thanks for PR [#871](https://github.com/shanalikhan/code-settings-sync/pull/871) by [@mjbvz](https://github.com/mjbvz) -* Pragma Util Support for `keybindings.json` Added [#800](https://github.com/shanalikhan/code-settings-sync/issues/800) - Thanks for PR [#854](https://github.com/shanalikhan/code-settings-sync/pull/854) by [@njkevlani](https://github.com/njkevlani) -* Support OS specific `keybindings.json` in single file [#515](https://github.com/shanalikhan/code-settings-sync/issues/515) - Thanks for PR [#854](https://github.com/shanalikhan/code-settings-sync/pull/854) by [@njkevlani](https://github.com/njkevlani) -* Improved Auto Upload Process [#839](https://github.com/shanalikhan/code-settings-sync/issues/839) - Thanks for PR [#909](https://github.com/shanalikhan/code-settings-sync/pull/909) by [@arnohovhannisyan](https://github.com/arnohovhannisyan) -* Improved Pragma Util to ignore some values[#865](https://github.com/shanalikhan/code-settings-sync/issues/865) - Thanks for PR [#872](https://github.com/shanalikhan/code-settings-sync/pull/872) by [@ioprotium](https://github.com/ioprotium) -* Ignore auto-upload process for some settings [#754](https://github.com/shanalikhan/code-settings-sync/issues/754) - Thanks for PR [#872](https://github.com/shanalikhan/code-settings-sync/pull/872) by [@ioprotium](https://github.com/ioprotium) -* Language localization improved and more languages added. [#886](https://github.com/shanalikhan/code-settings-sync/issues/886) - Thanks for PR [#915](https://github.com/shanalikhan/code-settings-sync/pull/915) by [@arnohovhannisyan](https://github.com/arnohovhannisyan) -* Improved Command line text [#891](https://github.com/shanalikhan/code-settings-sync/issues/891 ) - by [@nawordar](https://github.com/nawordar) -* Support For Azure Data Studio -* Node Modules Updated and code refactoring. - -#### v3.2.9 - April 18,2019 - -* Bug : Fixed Code that kills Extension Host for MacOS [#827](https://github.com/shanalikhan/code-settings-sync/issues/827) - Thanks for PR [#834](https://github.com/shanalikhan/code-settings-sync/pull/834) by [@arnohovhannisyan](https://github.com/arnohovhannisyan) -* Bug : Download From Public Gist not working [#816](https://github.com/shanalikhan/code-settings-sync/issues/816) -* Bug : Auto Upload Fix [#832](https://github.com/shanalikhan/code-settings-sync/issues/832) - Thanks for PR [#835](https://github.com/shanalikhan/code-settings-sync/pull/835) by [@arnohovhannisyan](https://github.com/arnohovhannisyan) -* Improvement - Inserts some empty lines in the beginning of `settings.json` [#819](https://github.com/shanalikhan/code-settings-sync/issues/819) - Thanks for PR [#828](https://github.com/shanalikhan/code-settings-sync/pull/828) by [@knyhle](https://github.com/knyhle) -* Wiki : Update Documentation - Thanks for PR [#828](https://github.com/shanalikhan/code-settings-sync/pull/845) by [@colinaaa](https://github.com/colinaaa) - -#### v3.2.8 - April 04,2019 - -* Bug : auto upload doesn't work when make change on settings [#801](https://github.com/shanalikhan/code-settings-sync/issues/801) - Thanks for PR [#807](https://github.com/shanalikhan/code-settings-sync/pull/807) by [@arnohovhannisyan](https://github.com/arnohovhannisyan) -* Bug : Auto Upload / Download : Disable change detection for workspace storage folder [#708](https://github.com/shanalikhan/code-settings-sync/issues/708) - Thanks for PR [#811](https://github.com/shanalikhan/code-settings-sync/pull/811) by [@knyhle](https://github.com/knyhle) -* Pretiffy Custom Settings JSON - Thanks for PR [#812](https://github.com/shanalikhan/code-settings-sync/pull/812) by [@knyhle](https://github.com/knyhle) -* Improvement - Remove manual visx package installation in favour of extension download by CLI [#820](https://github.com/shanalikhan/code-settings-sync/issues/820) -* Improvement - Remove replaceCodeSettings from Settings Sync configurations [#805](https://github.com/shanalikhan/code-settings-sync/issues/805) - -#### v3.2.7 - March 06,2019 - -* Bug : Fixing Extensions Sync on Windows [#789](https://github.com/shanalikhan/code-settings-sync/issues/789) - Thanks for PR [#791](https://github.com/shanalikhan/code-settings-sync/pull/791) by [@LuisUrrutia](https://github.com/LuisUrrutia) - -#### v3.2.6 - March 05,2019 - -* Bug : Syncing of extensions not working in portable mode [#756](https://github.com/shanalikhan/code-settings-sync/issues/756) - Thanks for PR [#782](https://github.com/shanalikhan/code-settings-sync/pull/782) by [@LuisUrrutia](https://github.com/LuisUrrutia) -* Bug : Fixing NODE_TLS_REJECT_UNAUTHORIZED [#776](https://github.com/shanalikhan/code-settings-sync/issues/776) - Thanks for PR [#779](https://github.com/shanalikhan/code-settings-sync/pull/779) by [@MattMorgis](https://github.com/MattMorgis) -* Documentation Updated -* Packages Updated - -#### v3.2.5 - Feb 15,2019 - -* Bug : Not working with VSCode 1.31 [#762](https://github.com/shanalikhan/code-settings-sync/issues/762) - Thanks for PR [#763](https://github.com/shanalikhan/code-settings-sync/pull/763) by [@nekonenene](https://github.com/nekonenene) -* Bug : Multi-line settings aren't ignored properly using sync pragma [#701](https://github.com/shanalikhan/code-settings-sync/issues/701) - Thanks for PR [#750](https://github.com/shanalikhan/code-settings-sync/pull/750) by [@ioprotium](https://github.com/ioprotium) -* Packages updated, small improvements - -#### v3.2.3 - 11 Dec, 2018 - -* Startup : Long startup activation time on the first start [#656](https://github.com/shanalikhan/code-settings-sync/issues/656) - Thanks for PR [#717](https://github.com/shanalikhan/code-settings-sync/pull/717) by [@thejewdude](https://github.com/thejewdude) -* Feature : Adding coder.com support [#714](https://github.com/shanalikhan/code-settings-sync/issues/714) - Thanks for PR [#720](https://github.com/shanalikhan/code-settings-sync/pull/720) by [@deansheather](https://github.com/deansheather) - -#### v3.2.2 - 26 Nov, 2018 - -* Sync Advance Setting Menu doesnt open when JSON not Valid [#683](https://github.com/shanalikhan/code-settings-sync/issues/683) - -#### v3.2.1 - 23 Nov, 2018 - -* Bug : Only install missing extensions in Portable Vs Code [#687](https://github.com/shanalikhan/code-settings-sync/issues/687) -* Bug : Error: Cannot read property 'token' of undefined [#685](https://github.com/shanalikhan/code-settings-sync/issues/685) -* Bug : sync-ignore isn't ignoring my local value, it deletes it [#686](https://github.com/shanalikhan/code-settings-sync/issues/686) -* Bug : Download of extension packages failed [#642](https://github.com/shanalikhan/code-settings-sync/issues/642) - Thanks for PR [#705](https://github.com/shanalikhan/code-settings-sync/pull/705) by [@emptyother](https://github.com/emptyother) - - -#### v3.2.0 - 17 Oct, 2018 - -* Prompt to reload VSCode after installing extensions [#629](https://github.com/shanalikhan/code-settings-sync/issues/629) -* Keep output of CLI installation command [#628](https://github.com/shanalikhan/code-settings-sync/issues/628) -* Dont write default settings sync config to code settings.json [#513](https://github.com/shanalikhan/code-settings-sync/issues/513) -* vscodium download settings fails [#650](https://github.com/shanalikhan/code-settings-sync/issues/650) - Thanks for PR [#651](https://github.com/shanalikhan/code-settings-sync/pull/651) by [@stripedpajamas](https://github.com/stripedpajamas) -* Does not work with Portable Visual Studio Code [#331](https://github.com/shanalikhan/code-settings-sync/issues/331) -* Flatpak Support for Settings Sync [#621](https://github.com/shanalikhan/code-settings-sync/issues/621) - Thanks for PR [#657](https://github.com/shanalikhan/code-settings-sync/pull/657) by [@laloch](https://github.com/laloch) -* Per-platform / per-hostname inline settings [#640](https://github.com/shanalikhan/code-settings-sync/issues/640) - Thanks for PR [#667](https://github.com/shanalikhan/code-settings-sync/pull/667) by [@ioprotium](https://github.com/ioprotium) -* Idea/Suggestion: Adds support to sync custom files [#258](https://github.com/shanalikhan/code-settings-sync/issues/258) - Thanks for PR [#258](https://github.com/shanalikhan/code-settings-sync/pull/258) by [@tkrtmy](https://github.com/tkrtmy) - - -For Previous releases change log view the [post](http://shanalikhan.github.io/2016/05/14/Visual-studio-code-sync-settings-release-notes.html) - - -## [Contributions](https://github.com/shanalikhan/code-settings-sync/blob/master/CONTRIBUTING.md) - -### Financial - -[](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=4W3EWHHBSYMM8&lc=IE&item_name=Code%20Settings%20Sync&item_number=visual%20studio%20code%20settings%20sync¤cy_code=USD&bn=PP%2dDonationsBF%3abtn_donate_SM%2egif%3aNonHosted) - -I also welcome financial contributions in case of special feature requests on my [open collective](https://opencollective.com/code-settings-sync). - -### Community - -You may join slack community and disscus the ideas over there. - - -Drawing - - -I'm looking for contributors to work with me so we can make the extension smoother and more feature rich. -Let me know if anyone is willing to [contribute](https://github.com/shanalikhan/code-settings-sync/blob/master/CONTRIBUTING.md). - +# Change Log + +All notable changes to the "code-settings-sync" extension will be documented in this file. + +Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. + +## [Unreleased] + +- Initial release \ No newline at end of file diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md deleted file mode 100644 index 3d1146d9..00000000 --- a/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,46 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. - -## Our Standards - -Examples of behavior that contributes to creating a positive environment include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a professional setting - -## Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at shanalikhan@hotmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] - -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 5f04c346..00000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,90 +0,0 @@ -# Contributing - -## Wiki - -See (and edit!) our public Wiki. - -https://github.com/shanalikhan/code-settings-sync/wiki/Contributing - -I encourage you to create new pages or make helpful edits to all parts of the wiki. Try to ask before making major changes to pages you didn't create, but just do whatever you think is best. Feel free to make a user page and collect your notes there so everyone can learn. - -## Slack - -Join our public Slack: - - -Drawing - - -If you need any help or want someone to set up the workspace with you and get you stepping through code in your editor, make some noise in #contributors. Don't be afraid to speak up! - -If you are looking forward to solve issues, you can select any issue you want but it would be great if you start with these issues, for these issues I will be specifically asking for help : - -https://github.com/shanalikhan/code-settings-sync/labels/good%20first%20issue - -https://github.com/shanalikhan/code-settings-sync/labels/PR-Welcome - - -## Setup Extension Locally - -``` -git clone https://github.com/shanalikhan/code-settings-sync.git -cd code-settings-sync -npm install -code . -``` - -Checkout the lastest version branch available and Hit `F5` to run Settings Sync in debug mode. - -Git and Node should be enough to run this extension. Execute the commands above and you will be able to run the extension in Code. - -**PR Base Branch Guideline:** -PR usually dont merge into `master` branch but in the version name branch like `v3.1.0`. -You will always see the next version branch if which current work is being done by me and other contributors. You need to set base branch and create PR for that branch. - -## Run Tests -Make sure the changes you made are not breaking the tests cases! - -All the test cases are in `/test` directory. Add new test cases if application with your PR. - -To run the tests, -1. `cd path/to/code-settings-sync && npm install && code .` -2. `Launch Extension` by pressing `F5` -3. From Debugger menu, start `Launch Tests` - - -## Bounty Programs - Fix and Earn ! - -There might be several issue present on the [IssueHunt](https://issuehunt.io/repos/47984369) from which you can earn money by fixing those issues. Feel free to start! - - - -## Financial contributions - -You can contribute me financially by two ways: - -1. Sending donation directly to my PayPal - -[](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=4W3EWHHBSYMM8&lc=IE&item_name=Code%20Settings%20Sync&item_number=visual%20studio%20code%20settings%20sync¤cy_code=USD&bn=PP%2dDonationsBF%3abtn_donate_SM%2egif%3aNonHosted) - -2. If you looking forward to add some special features for your company, for this I also welcome financial contributions in full transparency on my [open collective](https://opencollective.com/code-settings-sync). - -[![issuehunt-image](https://github.com/BoostIO/issuehunt-materials/blob/master/issuehunt-badge@1x.png?raw=true)](https://issuehunt.io/repos/47984369) - - -## Credits - -### Contributors - -Thank you to all the people who have already contributed to Settings Sync! - - -### Backers - -Thank you to all our backers! [[Become a backer](https://opencollective.com/code-settings-sync#backer)] - - - -### Sponsors - -Thank you to all our sponsors! (please ask your company to also support this open source project by [becoming a sponsor](https://opencollective.com/code-settings-sync/order/3849#)) diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 3c0206df..00000000 --- a/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015 Shan Khan - -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/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 23f9227a..00000000 --- a/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,25 +0,0 @@ -#### Short description of what this resolves: - - -#### Changes proposed in this pull request: - -- -- -- - -**Fixes**: # - -#### How Has This Been Tested? - - - - -#### Screenshots (if appropriate): - - -#### Checklist: - - -- [ ] I have read the [contribution](https://github.com/shanalikhan/code-settings-sync/blob/master/CONTRIBUTING.md#setup-extension-locally) guidelines. -- [ ] My change requires a change to the documentation and GitHub Wiki. -- [ ] I have updated the documentation and Wiki accordingly. diff --git a/README.md b/README.md index 91387a1d..c8cbbd5f 100644 --- a/README.md +++ b/README.md @@ -1,316 +1,71 @@ -# Settings Sync [![Tweet](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/intent/tweet?text=Synchronize%20your%20%40VisualStudio%20%40code%20Settings%20Across%20Multiple%20Machines%20using%20%40github%20GIST%20by%20%40itsShanKhan&url=https://github.com/shanalikhan/code-settings-sync&via=code&hashtags=code,vscode,SettingsSync,developers) [![Follow](https://img.shields.io/twitter/follow/itsShanKhan.svg?style=social&label=Follow)](https://twitter.com/intent/follow?screen_name=itsShanKhan) - -**Previously known as Visual Studio Code Settings Sync** - -[![Version](https://vsmarketplacebadge.apphb.com/version/Shan.code-settings-sync.svg)](https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync) [![Travis](https://img.shields.io/travis/rust-lang/rust.svg)](https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync) -[![Greenkeeper badge](https://badges.greenkeeper.io/shanalikhan/code-settings-sync.svg)](https://greenkeeper.io/) -[![Master course](https://img.shields.io/badge/Supported%20by-VSCode%20Power%20User%20Course%20%E2%86%92-gray.svg?colorA=444444&colorB=4F44D6)](https://t.co/8BEMyhpKU5?amp=1) - -## Support - -While being free and open source, if you find it useful, please consider supporting it by donating via PayPal or Open Collective. If you are using it in office as a team, please ask your company to support us via Open Collective from just 2\$ per month! - - - - - - -
- - - -
-
- - - -
- *2$ Per Month -
-
- -Drawing - -
-
- -**Type Sync in command Palette in order to view all commands.** - -## Key Features - -``` -1. Use your GitHub account token and Gist. -2. Easy to Upload and Download on one click. -3. Show a summary page at the end with details about config and extensions effected. -4. Auto download Latest Settings on Startup. -5. Auto upload Settings on file change. -6. Share the Gist with other users and let them download your settings. -7. Supports GitHub Enterprise -8. Support pragmas with @sync keywords: host, os and env are supported. -9. GUI for changing settings / logging in -10. Allows you to Sync any file across your machines. -``` - -## It Syncs - -``` -All extensions and complete User Folder that Contains -1. Settings File -2. Keybinding File -3. Launch File -4. Snippets Folder -5. VSCode Extensions & Extensions Configurations -6. Workspaces Folder -``` - -## Shortcuts - -``` -1. Upload Key : Shift + Alt + U -2. Download Key : Shift + Alt + D - -(on macOS: Shift + Option + U / Shift + Option + D) -``` - -## Configure Settings Sync - - -Settings Sync Configuration page will be opened automatically on code start and requires two things to setup: - -1. GitHub Token -2. GitHub Gist Id - -GitHub Token needs to be retrived by your GitHub account while Settings Sync creates GIST if you are first time user. - -Following are the steps you need to perform to configure. - -- Click on `Login with GitHub` . -- Login GitHub on Browser and close the browser tab once you get Success message. -- If you are using Settings Sync first time GIST will be created automatically when you upload your settings. -- If you already have GitHub Gist, new window will be opened to allow you to select the GitHub Gist or `Skip` to create new Gist. - - - -![Login with GitHub](https://shanalikhan.github.io/img/login-with-github.png) - - -![Existing Gist](https://shanalikhan.github.io/img/existing-gist.png) - - -You can always **verify created gist** by going to `https://gist.github.com` and checking for a gist named `cloudSettings` - - -## Upload Your Settings - -**Press Shift + Alt + U** (macOS: Shift + Option + U) - -> Type ">Sync" In Command Palette into order download / upload - -When downloading or uploading for the first time, the welcome page will automatically open, where you can configure the Settings Sync. - -Once you select upload, after uploading the settings. You will see the Summary details with the list of each files and extensions uploaded. - -## Download your Settings - -**Press Shift + Alt + D** (macOS: Shift + Option + D) - -> Type ">Sync" In Command Palette into order download / upload - -When downloading or uploading for the first time, the welcome page will automatically open, where you can configure the Settings Sync. - -Once you select download, after downloading. Settings Sync will display you Summary containing the list of each files and extension being downloaded. - -New popup will be opened to allow you to restart the code to apply the settings. - -## Reset Extension Settings - -> Select **"> Sync : Reset Extension Settings"** in the Command Palette to reset your settings - - -## Settings - -Settings can be changed through the settings page, which can be accessed through **"> Sync : Advanced Options > Open Settings Page"** - -There are two types of settings in Settings Sync. -I will recommend you to read the configurations details [here](https://dev.to/shanalikhan/visual-studio-code-settings-sync-configurations-mn0). - - -### Gist Settings - -Gist Settings are stored in `settings.json` file of Code. -You can customize the settings in gist settings like: - -``` -1. Configure Gist Id (Environment) -2. Configure auto upload / download for GitHub Gist -3. Configure extension sync behaviour -4. Configure force download -4. Configure force upload -6. Configure quiet sync -``` - -```json - "sync.gist": "0c929b1a6c51015cdc9e0fe2e369ea4c", - "sync.autoDownload": false, - "sync.autoUpload": false, - "sync.forceDownload": false, - "sync.forceUpload": false, - "sync.quietSync": false, - "sync.removeExtensions": true, - "sync.syncExtensions": true -``` - -### Global Settings - -Global settings are present in `syncLocalSettings.json` inside `User` folder. These settings will be shared across multiple Gist Environments. - - -You can customize the sync: - -``` -1. Options by which files / folders and settings to exclude from upload. -2. Configure default Gist Environment name. -3. Replace the code settings after downloading. -4. Change the Gist description while creating new one in github. -5. Configure GitHub Enterprise Url -``` - -```json -{ - "ignoreUploadFiles": [ - "state.*", - "syncLocalSettings.json", - ".DS_Store", - "sync.lock", - "projects.json", - "projects_cache_vscode.json", - "projects_cache_git.json", - "projects_cache_svn.json", - "gpm_projects.json", - "gpm-recentItems.json" - ], - "ignoreUploadFolders": [ - "workspaceStorage" - ], - "ignoreExtensions": [], - "gistDescription": "Visual Studio Code Settings Sync Gist", - "version": 340, - "token": "YOUR_GITHUB_TOKEN", - "downloadPublicGist": false, - "supportedFileExtensions": [ "json", "code-snippets" ], - "openTokenLink": true, - "disableUpdateMessage": false, - "lastUpload": null, - "lastDownload": null, - "githubEnterpriseUrl": null, - "askGistDescription": false, - "customFiles": {}, - "hostName": null, - "universalKeybindings": false, - "autoUploadDelay": 20 -} -``` - -I will recommend you to read the configurations details [here](https://dev.to/shanalikhan/visual-studio-code-settings-sync-configurations-mn0). - - -## Features - -### Toggle Auto-Upload on change - -Auto-upload is **disabled by default**. When the settings are changed and saved this feature will automatically start the upload process and save the settings online. - -Please make sure you have valid github Token and Gist available to make it work properly. - -Select Command **"Sync : Advanced Options > Toggle Auto-Upload on Settings Change"** command to Turn ON / OFF the auto-upload. - -### Toggle Auto Download - -Auto Download is **disabled by default**. It will sync all the setting by default when the editor starts. -Please make sure you have valid github Token and Gist available to make it work properly. - -Select Command **"Sync : Advanced Options > Toggle Auto-Download On Startup"** command to Turn ON / OFF the auto download. - -### Toggle Force Download - -Force Download is **disabled by default**. By default, extension won't download the latest settings if you already have the latest downloaded version, but sometimes when you delete some extension locally and don't upload the settings it will still show that you have latest versions by date or time checks, by turning this ON it will always download the cloud settings on startup. - -Please make sure you have valid github Token and Gist available to make it work properly. - -Select Command **"Sync : Advanced Options > Toggle Force Download"** command to Turn ON / OFF the force download. - -### Toggle Force Upload - -Force Upload is **disabled by default**. By default, extension won't upload the settings if the gist has newer or identical content. By turning this ON it will always upload without checking for newer settings in the gist. - -Please make sure you have valid github Token and Gist available to make it work properly. - -Select Command **"Sync : Advanced Options > Toggle Force Upload"** command to Turn ON / OFF the force upload. - -### Toggle Summary - -Summary is **enabled by default** which shows all files and extensions that are added or deleted on a single page. -You may turn it off in order to make a upload and download process clean and quiet. - -Select Command **"Sync : Advanced Options > Show Summary Page On Upload / Download"** command to Turn ON / OFF the auto download. - - -### Custom Sync - -Settings Sync allows you to sync the files other from `User` folder. For example, your workspace settings and much more. Its upon you to utilize the full potential of Settings Sync across your machines or your teams machines. Read about custom sync [here](https://github.com/shanalikhan/code-settings-sync/wiki/Custom-Sync). - -### Sync Pragmas - -You can even manage which settings you want to ignore from being upload or download. Settings Sync even allows you to manage your `home` and `office` computer specific settings even OS related settings in single GitHub Gist. Read details about [Sync Pragmas here](https://github.com/shanalikhan/code-settings-sync/wiki/Sync-Pragmas). - -### Share Settings Across Teams & Users - -If you are looking to share your settings. Read the details [here](https://dev.to/shanalikhan/how-to-share-your-visual-studio-code-settings-and-extensions-39k). Settings Sync needs to create new Public GitHub Gist to share your settings with other users. - -### Troubleshooting - -If you ever get into problem while setting up the Settings Sync. You can check our troubleshooting guide that cover those scenarios [here](https://github.com/shanalikhan/code-settings-sync/wiki/Troubleshooting), you can also add your solution there if its not available there to help other users. - -## How To Contribute - -You can contribute in different ways. Read the details [here](https://github.com/shanalikhan/code-settings-sync/blob/master/CONTRIBUTING.md) - -**Fix and Earn** - You can also earn money by fixing the issues - Check the issues under bounty program [here](https://github.com/shanalikhan/code-settings-sync/labels/bounty). - -## Credits - -### Contributors - -Thank you to all the people who have already contributed to Settings Sync! - - -### Backers - -Thank you to all our backers! [[Become a backer](https://opencollective.com/code-settings-sync#backer)] - - -[](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=4W3EWHHBSYMM8&lc=IE&item_name=Code%20Settings%20Sync&item_number=visual%20studio%20code%20settings%20sync¤cy_code=USD&bn=PP%2dDonationsBF%3abtn_donate_SM%2egif%3aNonHosted) - -### Sponsors - -Thank you to all our sponsors! (please ask your company to also support this open source project by [becoming a sponsor](https://opencollective.com/code-settings-sync)) - -## [Contributors](https://github.com/shanalikhan/code-settings-sync/graphs/contributors) - -# [Release Notes](https://shanalikhan.github.io/2016/05/14/Visual-studio-code-sync-settings-release-notes.html) - -# License - -[![Version](https://img.shields.io/badge/license-MIT-green.svg)](https://github.com/shanalikhan/code-settings-sync/blob/master/LICENSE) - -[![Version](https://vsmarketplacebadge.apphb.com/version/Shan.code-settings-sync.svg)](https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync) - -[![Installs](https://vsmarketplacebadge.apphb.com/installs/Shan.code-settings-sync.svg)](https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync) - -[![Ratings](https://vsmarketplacebadge.apphb.com/rating/Shan.code-settings-sync.svg)](https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync) - -[![Master course](https://img.shields.io/badge/Supported%20by-VSCode%20Power%20User%20Course%20%E2%86%92-gray.svg?colorA=444444&colorB=4F44D6)](https://t.co/8BEMyhpKU5?amp=1) - - -Drawing - +# code-settings-sync README + +This is the README for your extension "code-settings-sync". After writing up a brief description, we recommend including the following sections. + +## Features + +Describe specific features of your extension including screenshots of your extension in action. Image paths are relative to this README file. + +For example if there is an image subfolder under your extension project workspace: + +\!\[feature X\]\(images/feature-x.png\) + +> Tip: Many popular extensions utilize animations. This is an excellent way to show off your extension! We recommend short, focused animations that are easy to follow. + +## Requirements + +If you have any requirements or dependencies, add a section describing those and how to install and configure them. + +## Extension Settings + +Include if your extension adds any VS Code settings through the `contributes.configuration` extension point. + +For example: + +This extension contributes the following settings: + +* `myExtension.enable`: Enable/disable this extension. +* `myExtension.thing`: Set to `blah` to do something. + +## Known Issues + +Calling out known issues can help limit users opening duplicate issues against your extension. + +## Release Notes + +Users appreciate release notes as you update your extension. + +### 1.0.0 + +Initial release of ... + +### 1.0.1 + +Fixed issue #. + +### 1.1.0 + +Added features X, Y, and Z. + +--- + +## Following extension guidelines + +Ensure that you've read through the extensions guidelines and follow the best practices for creating your extension. + +* [Extension Guidelines](https://code.visualstudio.com/api/references/extension-guidelines) + +## Working with Markdown + +You can author your README using Visual Studio Code. Here are some useful editor keyboard shortcuts: + +* Split the editor (`Cmd+\` on macOS or `Ctrl+\` on Windows and Linux). +* Toggle preview (`Shift+Cmd+V` on macOS or `Shift+Ctrl+V` on Windows and Linux). +* Press `Ctrl+Space` (Windows, Linux, macOS) to see a list of Markdown snippets. + +## For more information + +* [Visual Studio Code's Markdown Support](http://code.visualstudio.com/docs/languages/markdown) +* [Markdown Syntax Reference](https://help.github.com/articles/markdown-basics/) + +**Enjoy!** diff --git a/code-settings-sync.code-workspace b/code-settings-sync.code-workspace new file mode 100644 index 00000000..248c7997 --- /dev/null +++ b/code-settings-sync.code-workspace @@ -0,0 +1,10 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": { + "typescript.tsc.autoDetect": "off" + } +} \ No newline at end of file diff --git a/configs/webpack.config.js b/configs/webpack.config.js deleted file mode 100644 index 49212e9c..00000000 --- a/configs/webpack.config.js +++ /dev/null @@ -1,45 +0,0 @@ -"use strict"; - -const path = require("path"); -const { CleanWebpackPlugin } = require("clean-webpack-plugin"); - -/** @type WebpackOptions */ -const config = { - stats: { - warningsFilter: /Critical dependency: the request of a dependency is an expression/ - }, - target: "node", - entry: "./src/extension.ts", - output: { - filename: "extension.js", - path: path.resolve(__dirname, "../out"), - libraryTarget: "commonjs2", - devtoolModuleFilenameTemplate: "file:///[absolute-resource-path]" - }, - resolve: { - extensions: [".ts", ".js"], - alias: { - deepmerge$: path.resolve( - __dirname, - "../node_modules/deepmerge/dist/umd.js" - ) - } - }, - module: { - rules: [ - { - test: /\.ts$/, - exclude: /node_modules/, - loader: "ts-loader" - } - ] - }, - externals: { - vscode: "commonjs vscode", - "vscode-fsevents": "commonjs vscode-fsevents", - "original-fs": "commonjs original-fs" - }, - plugins: [new CleanWebpackPlugin()] -}; - -module.exports = config; diff --git a/configs/webpack.development.config.js b/configs/webpack.development.config.js deleted file mode 100644 index 5b97ec30..00000000 --- a/configs/webpack.development.config.js +++ /dev/null @@ -1,9 +0,0 @@ -"use strict"; - -const merge = require('webpack-merge'); -const common = require('./webpack.config.js'); - -module.exports = merge(common, { - mode: 'development', - devtool: 'source-map' -}); \ No newline at end of file diff --git a/configs/webpack.production.config.js b/configs/webpack.production.config.js deleted file mode 100644 index bf2cbb86..00000000 --- a/configs/webpack.production.config.js +++ /dev/null @@ -1,11 +0,0 @@ -"use strict"; - -const merge = require('webpack-merge'); -const common = require('./webpack.config.js'); - -module.exports = merge(common, { - mode: 'production', - optimization: { - minimize: true - } -}); \ No newline at end of file diff --git a/debug.log b/debug.log deleted file mode 100644 index e3552b9b..00000000 --- a/debug.log +++ /dev/null @@ -1 +0,0 @@ -[1214/215632:ERROR:stream_listen_socket.cc(143)] send failed: WSAGetLastError()==0 diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000..d5c0b53a --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,28 @@ +import typescriptEslint from "@typescript-eslint/eslint-plugin"; +import tsParser from "@typescript-eslint/parser"; + +export default [{ + files: ["**/*.ts"], +}, { + plugins: { + "@typescript-eslint": typescriptEslint, + }, + + languageOptions: { + parser: tsParser, + ecmaVersion: 2022, + sourceType: "module", + }, + + rules: { + "@typescript-eslint/naming-convention": ["warn", { + selector: "import", + format: ["camelCase", "PascalCase"], + }], + + curly: "warn", + eqeqeq: "warn", + "no-throw-literal": "warn", + semi: "warn", + }, +}]; \ No newline at end of file diff --git a/install_local.txt b/install_local.txt deleted file mode 100644 index faf9d665..00000000 --- a/install_local.txt +++ /dev/null @@ -1,3 +0,0 @@ -npm install -vsce package -code --install-extension code-settings-sync-3.2.5.vsix diff --git a/package.json b/package.json index 6c870bc5..1a9e79bd 100644 --- a/package.json +++ b/package.json @@ -7,16 +7,23 @@ "publisher": "Shan", "author": { "name": "Shan Khan", - "url": "http://shanalikhan.github.io", + "url": "https://shanalikhan.github.io", "email": "shanalikhan@hotmail.com" }, + "contributors": [ + { + "name": "Ali Arshad", + "url": "https://aliinnov8s.github.io", + "email": "aliarshad2068@outlook.com" + } + ], "homepage": "https://shanalikhan.github.io", "galleryBanner": { "color": "#3B4859", "theme": "dark" }, "engines": { - "vscode": "^1.35.1" + "vscode": "^1.95.0" }, "badges": [ { @@ -59,11 +66,11 @@ "workspace-sync", "multi-root ready" ], - "extensionKind": "ui", - "activationEvents": [ - "*" + "extensionKind": [ + "ui" ], - "main": "./out/extension.js", + "activationEvents": [], + "main": "./dist/extension.js", "contributes": { "commands": [ { @@ -144,48 +151,28 @@ } }, "scripts": { - "vscode:prepublish": "npm run tslint-check && webpack --config configs/webpack.production.config.js", - "compile": "webpack --config configs/webpack.development.config.js", - "watch": "webpack --config configs/webpack.development.config.js --watch", - "postinstall": "node ./node_modules/vscode/bin/install", - "tslint-check": "tslint -c ./tslint.json ./src/**/*.ts ./src/*.ts", - "format": "prettier --write './src/**/*.ts'", - "test": "npm run tslint-check && tsc -p ./ && mocha --recursive \"./out/test/**/*.js\"" + "vscode:prepublish": "npm run package", + "compile": "webpack", + "watch": "webpack --watch", + "package": "webpack --mode production --devtool hidden-source-map", + "compile-tests": "tsc -p . --outDir out", + "watch-tests": "tsc -p . -w --outDir out", + "pretest": "npm run compile-tests && npm run compile && npm run lint", + "lint": "eslint src", + "test": "vscode-test" }, "devDependencies": { - "@types/chai": "4.2.1", - "@types/express": "^4.16.1", - "@types/lodash": "^4.14.123", - "@types/node-fetch": "^2.3.3", - "@types/fs-extra": "^8.0.0", - "@types/mocha": "^5.2.6", - "@types/node": "^12.0.9", - "@types/recursive-readdir": "^2.2.0", - "chai": "^4.2.0", - "clean-webpack-plugin": "^3.0.0", - "mocha": "^6.0.2", - "prettier": "^1.16.4", - "ts-loader": "^5.3.3", - "tslint": "^5.15.0", - "tslint-plugin-prettier": "^2.0.1", - "typescript": "^3.4.1", - "vscode": "^1.1.33", - "webpack": "^4.29.6", - "webpack-cli": "^3.3.0", - "webpack-merge": "^4.2.1" - }, - "dependencies": { - "@octokit/rest": "^16.23.2", - "adm-zip": "^0.4.13", - "const": "^1.0.0", - "express": "^4.16.4", - "fs-extra": "^8.0.1", - "https-proxy-agent": "^2.2.1", - "lockfile": "^1.0.4", - "lodash": "^4.17.15", - "node-fetch": "^2.5.0", - "recursive-readdir": "^2.2.2", - "temp": "^0.9.0", - "vscode-chokidar": "^2.1.6" + "@types/vscode": "^1.95.0", + "@types/mocha": "^10.0.9", + "@types/node": "20.x", + "@typescript-eslint/eslint-plugin": "^8.10.0", + "@typescript-eslint/parser": "^8.7.0", + "eslint": "^9.13.0", + "typescript": "^5.6.3", + "ts-loader": "^9.5.1", + "webpack": "^5.95.0", + "webpack-cli": "^5.1.4", + "@vscode/test-cli": "^0.0.10", + "@vscode/test-electron": "^2.4.1" } -} +} \ No newline at end of file diff --git a/package.nls.de.json b/package.nls.de.json deleted file mode 100644 index 0cfab05f..00000000 --- a/package.nls.de.json +++ /dev/null @@ -1,144 +0,0 @@ -{ - "cmd.downloadSettings.error.removeExtFail": "Sync: Einige Erweiterungen konnten nicht entfernt werden", - "cmd.downloadSettings.error.unableSave": "Sync: Die Extension Datei konnte nicht gespeichert werden.", - "cmd.downloadSettings.info.downloaded": "Sync: Herunterladen Abgeschlossen.", - "cmd.downloadSettings.info.gotLatestVersion": "Sync: Du hast bereits die neueste Version der gespeicherten Einstellungen.", - "cmd.downloadSettings.info.readdingOnline": "Sync: Lese Online Einstellungen.", - "cmd.downloadSettings.title": "Sync: Einstellungen für das Herunterladen", - "cmd.howSetting.title": "Sync: Wie wird diese Erweiterung konfiguriert", - "cmd.otherOptions.customizedSync": "Sync: Hinzufügen eines benutzerdefinierten Sync Datei-Pfades", - "cmd.otherOptions.customizedSync.done": "Sync: {0} wurde registriert.", - "cmd.otherOptions.customizedSync.placeholder": "Geben Sie einen absoluten Pfad für die zusätzlichen hochzuladende Datei ein.", - "cmd.otherOptions.customizedSync.prompt": "(ex. /Pfad/zu/.eslintrc) wird in einen speziellen Pfad hoch bzw. heruntergeladen.", - "cmd.otherOptions.downloadCustomFile": "Sync: Importiere Benutzerdefinierte Sync-Datei zu Ihrem Arbeitsbereich", - "cmd.otherOptions.downloadCustomFile.done": "Heruntergeladen von {0}.", - "cmd.otherOptions.downloadCustomFile.placeholder": "Wählen Sie die Datei, die Sie in das Basisverzeichnis des aktuellen Arbeitsverzeichnis herunterladen möchten", - "cmd.otherOptions.downloadSetting": "Sync: Einstellungen herunterladen", - "cmd.otherOptions.editLocalSetting": "Sync: Lokale Einstellungen der Erweiterung bearbeiten", - "cmd.otherOptions.error.toggleFail": "Sync: Kann nicht umschalten.", - "cmd.otherOptions.joinCommunity": "Sync: Community beitreten", - "cmd.otherOptions.openIssue": "Sync: Problem melden", - "cmd.otherOptions.openSettingsPage": "Sync: Einstellungen öffnen", - "cmd.otherOptions.preserve": "Sync: Aufbewahren der Einstellungen um ein Überschreiben nach dem Herunterladen zu verhindern.", - "cmd.otherOptions.preserve.info.done1": "Sync: erledigt. {0} - Wert wird aus der settings.json nach dem Herunterladen entfernt.", - "cmd.otherOptions.preserve.info.done2": "Sync: erledigt. Die Erweiterung behält den Wert {0}: {1} in der settings.json nach dem Herunterladen.", - "cmd.otherOptions.preserve.placeholder": "Drücken Sie eine beliebige Taste um settings.json aufzubewahren.", - "cmd.otherOptions.preserve.prompt": "Beispiel: Geben Sie ihren lokalen Proxy in 'http.proxy' an. Dadurch wird er lokal überschrieben. Wenn es leer ist, wird der Proxy entfernt.", - "cmd.otherOptions.quietSync.off": "Sync: Es wird eine Ausgabe beim Hoch-/Herunterladen angezeigt.", - "cmd.otherOptions.quietSync.on": "Sync: Die Statusleiste wird beim Hoch-/Herunterladen aktualisiert.", - "cmd.otherOptions.releaseNotes": "Sync: Veröffentlichungshinweise", - "cmd.otherOptions.shareSetting": "Sync: Einstellungen als öffentlichen GIST freigeben", - "cmd.otherOptions.shareSetting.beforeConfirm": "Sync: Hiermit entfernen Sie den aktuellen GIST, die Einstellungen werden in einem öffentlichen GIST gespeichert. Wollen Sie fortfahren?", - "cmd.otherOptions.title": "Sync: Erweiterte Optionen", - "cmd.otherOptions.toggleAutoDownload": "Sync: Umschalten des automatischen Herunterladens beim Start von VSCode", - "cmd.otherOptions.toggleAutoDownload.off": "Sync: Automatisches Herunterladen AUSGESCHALTET.", - "cmd.otherOptions.toggleAutoDownload.on": "Sync: Automatisches Herunterladen EINGESCHALTET.", - "cmd.otherOptions.toggleAutoUpload": "Sync: Umschalten des automatischen Hochladens beim Ändern der Einstellungen", - "cmd.otherOptions.toggleAutoUpload.off": "Sync: Automatischen Hochladen AUSGESCHALTET.", - "cmd.otherOptions.toggleAutoUpload.on": "Sync: Automatischen Hochladen EINGESCHALTET.", - "cmd.otherOptions.toggleForceDownload": "Sync: Umschalten des erzwungenen Herunterladen", - "cmd.otherOptions.toggleForceDownload.off": "Sync: Herunterladen erzwingen DEAKTIVIERT", - "cmd.otherOptions.toggleForceDownload.on": "Sync: Herunterladen erzwingen AKTIVIERT.", - "cmd.otherOptions.toggleForceUpload": "Sync: Umschalten des erzwungenen Hochladen", - "cmd.otherOptions.toggleForceUpload.off": "Sync: Hochladen erzwingen DEAKTIVIERT.", - "cmd.otherOptions.toggleForceUpload.on": "Sync: Hochladen erzwingen AKTIVIERT.", - "cmd.otherOptions.toggleSummaryPage": "Sync: Umschalten ob die Zusammenfassungsseite beim Hoch-/Herunterladen angezeigt werden soll.", - "cmd.otherOptions.triggerReset": "Sync: Wollen Sie die Einstellungen wirklich zurücksetzen?", - "cmd.otherOptions.warning.tokenNotRequire": "Sync: Sync-Einstellungen wird zukünftig nicht mehr nach Ihrem GitHub-Token fragen.", - "cmd.resetSettings.info.resetting": "- Sync: Zurücksetzen Ihrer Einstellungen.", - "cmd.resetSettings.info.settingClear": "Sync: Einstellungen wurden gelöscht.", - "cmd.resetSettings.title": "Sync: Zurücksetzen der Sync-Einstellungen", - "cmd.updateSettings.error.gistNotSave": "Sync: GIST WURDE NICHT GESPEICHERT", - "cmd.updateSettings.error.newGistCreateFail": "Sync: Es konnte kein neuer GIST erstellt werden.", - "cmd.updateSettings.error.readGistFail": "Sync: die GIST-ID: {0} kann NICHT GELESEN WERDEN.", - "cmd.updateSettings.info.gotLatestVersion": "Sync: Sie haben bereits die neueste Version der gespeicherten Einstellungen hochgeladen.", - "cmd.updateSettings.info.newGistCreated": "Sync: Es wurde ein neuer GIST erstellt.", - "cmd.updateSettings.info.readding": "Sync: Lesen der Online Einstellungen und Erweiterungen.", - "cmd.updateSettings.info.shareGist": "Sync: Teilen Sie die Id mit anderen Benutzern dieser Erweiterung, um Ihre Einstellungen mit diesen zu teilen.", - "cmd.updateSettings.info.uploadCanceled": "Sync: Upload-Vorgang Abgebrochen.", - "cmd.updateSettings.info.uploading": "Sync: Hochladen/Aktualisieren Ihrer Einstellungen auf GitHub.", - "cmd.updateSettings.info.uploadingDone": "Sync: Übertragung Abgeschlossen. GIST-ID: {0}. Bitte kopieren Sie diese ID um die Einstellungen an einem anderen Gerät herunterladen zu können.", - "cmd.updateSettings.info.uploadingFile": "Sync: Hochladen der Dateien.", - "cmd.updateSettings.info.uploadingSuccess": "Sync: Erfolgreich hochgeladen.", - "cmd.updateSettings.title": "Sync: Aktualisiere die Einstellungen", - "cmd.updateSettings.warning.OSNotSupported": "Sync Pragma-OS-Wert {0} nicht unterstützt in Zeile {1}", - "cmd.updateSettings.warning.noToken": "Sync: Bitte setzen Sie Ihren GitHub-Token in den Einstellungen oder deaktivieren Sie \"downloadPublicGist' in der lokalen Sync-Einstellungen-Datei.", - "common.action.donate": "Spenden Sie jetzt", - "common.action.joinCommunity": "Treten Sie der Community bei", - "common.action.openExtPage": "Öffnen Sie die Seite der Erweiterung", - "common.action.openExtTutorial": "Anleitung öffnen", - "common.action.releaseNotes": "Versionshinweise", - "common.action.support": "Unterstützen Sie dieses Projekt", - "common.action.writeReview": "Schreiben Sie eine Bewertung", - "common.button.no": "Nein", - "common.button.yes": "Ja", - "common.error.canNotSave": "Sync: Einstellungen konnten nicht gespeichert werden. Bitte stellen Sie sicher, dass Sie eine gültige settings.json haben.", - "common.error.connection": "Sync: Es besteht keine Internetverbindung oder es konnte keine Verbindungen zu GitHub hergestellt werden. Der Fehler wurde in der Konsole protokolliert.", - "common.error.gistNotSave": "Sync: GIST nicht gespeichert.", - "common.error.invalidGistId": "Sync: Ungültige Gist-Id eingegeben. Überprüfen Sie Ihren GIST: https://gist.github.com//.", - "common.error.invalidToken": "Sync: Ungültiger/Abgelaufener GitHub-Token. Bitte generieren Sie einen neuen Token mit den Berechtigungen aus der readme-Datei. Der Fehler wurde in der Konsole protokolliert.", - "common.error.message": "Sync: Fehler wurde in der Konsole protokolliert. Um die Konsole zu öffnen gehen Sie wie folgt vor (Menü Hilfe > Entwicklungstools umschalten).", - "common.error.tokenNotSave": "Sync: Token wurde nicht gespeichert.", - "common.info.donate": "Sync: Gefällt Ihnen diese Erweiterung? Wollen Sie eine Bewertung schreiben oder Spenden? ;)", - "common.info.excludeFile": "Sync: Sie können Dateien oder Ordner in den Einstellungen für das Herunterladen auschließen.", - "common.info.gistSaved": "Sync: Gist Gespeichert", - "common.info.initAutoUpload": "Sync: Auto-Upload wird in {0} Sekunden eingeleitet.", - "common.info.installed": "Sync: Einstellungen erstellt, vielen Dank für die Installation!", - "common.info.needHelp": "Sync: Brauchen Sie Hilfe bei der Konfiguration dieser Erweiterung?", - "common.info.setToken": "Sync: Jetzt können Sie Ihre GitHub-Token manuell in `syncLocalSettings.json` eintragen", - "common.info.tokenSaved": "Sync: Token Gespeichert", - "common.info.updateTo": "Synchronisieren: Aktualisiert auf v{0}", - "common.info.updating": "Sync: Update Läuft... Bitte warten.", - "common.placeholder.enterGistId": "Bitte geben Sie Gist-Id ein", - "common.placeholder.enterGithubAccessToken": "Geben Sie Ihren persönlichen GitHub Zugangs-Token ein", - "common.placeholder.multipleGist": "Gist-Name (z.B.: Persönliche Einstellungen)", - "common.prompt.enterGistId": "Geben Sie die Gist-Id von zuvor hochgeladenen Einstellungen an. Sie können auch manuell im code Einstellungen (sync.gist). Drücken Sie [Enter] oder [Esc], um abzubrechen.", - "common.prompt.enterGithubAccessToken": "Sie können den Token auch manuell hinzufügen (User-Ordner/syncLocalSettings.json). Drücken Sie [Enter] oder [Esc], um abzubrechen.", - "common.prompt.gistForceUpload": "Sync: Der Upload ersetzt die Einstellungen in GitHub Gist. Erwägen Sie, die Einstellungen herunterzuladen oder einen erzwungenen Upload durchzuführen. Möchten Sie immer noch mit Nachdruck hochladen?", - "common.prompt.gistNewer": "Sync: Die Einstellungen in Gist haben sich seit dem letzten Download geändert. Möchten Sie Ihre aktuellen lokalen Einstellungen trotzdem in das Gist hochladen?", - "common.prompt.multipleGist": "Ermöglicht Ihnen die richtigen Einstellungen zu identifizieren, sollten mehrere vorhanden sein.", - "common.prompt.restartCode": "Wollen Sie das Programm neustarten, um die neuen Einstellungen und Erweiterungen zu übernehmen?", - "ext.config.autoDownload": "Lädt die Einstellungen beim Start von VSCode automatisch herunter", - "ext.config.autoDownload.name": "Automatisch herunterladen", - "ext.config.autoUpload": "Lädt die Einstellungen automatisch hoch, sobald sie geändert werden.", - "ext.config.autoUpload.name": "Automatisch hochladen", - "ext.config.forceDownload": "Lädt die Einstellungen auch dann herunter, wenn sie bereits aktuell sind.", - "ext.config.forceDownload.name": "Herunterladen erzwingen", - "ext.config.forceUpload": "Lädt die Einstellungen auch dann hoch, wenn sie im GIST bereits neuer sind.", - "ext.config.forceUpload.name": "Hochladen erzwingen", - "ext.config.gist": "GitHub GIST-ID für die Sync-Einstellungen.", - "ext.config.gist.name": "Gist-ID", - "ext.config.gist.placeholder": "Geben Sie Ihre GIST-ID ein", - "ext.config.host": "Speichern Sie Ihre Einstellungen auf Ihrem GitHub Enterprise Host.", - "ext.config.lastDownload": "Datum, an dem die Einstellungen das letzte Mal heruntergeladen wurden. Leeren Sie dieses Feld, um die Einstellungen manuell herunterzuladen.", - "ext.config.lastUpload": "Datum, an dem die Einstellungen das letzte Mal hochgeladen wurden. Leeren Sie dieses Feld, um die Einstellungen manuell hochzuladen.", - "ext.config.pathPrefix": "Geben Sie hier Ihren GitHub Enterprise API-Präfix ein, wenn Sie GHE verwenden möchten. In der Regel \"/api/v3\". Wird nur verwendet, wenn ein Host festgelegt wurde.", - "ext.config.quietSync": "Zeigt das Ergebnis der Synchronisierung in der Statusleiste anstatt der Ausgabe an.", - "ext.config.quietSync.name": "Hintergrund Synchronisation", - "ext.config.removeExtensions": "Entfernt Erweiterungen, die in den heruntergeladenen Einstellungen nicht enthalten sind.", - "ext.config.removeExtensions.name": "Entfernen von Erweiterungen beim Herunterladen", - "ext.config.syncExtensions": "Deaktiviert die Synchronisation von Erweiterungen komplett", - "ext.config.syncExtensions.name": "Erweiterungen synchronisieren", - "ext.config.title": "Synchronisierung der VSCode Einstellungen", - "ext.globalConfig.askGistDescription.name": "Fragen Gist Namen", - "ext.globalConfig.autoUploadDelay.name": "Verzögerung für das automatische Hochladen", - "ext.globalConfig.autoUploadDelay.placeholder": "Geben Sie die Anzahl der Sekunden für die Verzögerung ein", - "ext.globalConfig.downloadPublicGist.name": "Herunterladen eines öffentlichen Gist", - "ext.globalConfig.gistDescription.name": "GIST Beschreibung", - "ext.globalConfig.gistDescription.placeholder": "Eingeben der GIST Beschreibung", - "ext.globalConfig.githubEnterpriseUrl.name": "GitHub Enterprise-URL (optional)", - "ext.globalConfig.githubEnterpriseUrl.placeholder": "Geben Sie Ihre GitHub Enterprise URL ein", - "ext.globalConfig.hostName.name": "Hostname (optional)", - "ext.globalConfig.hostName.placeholder": "Hostname eingeben", - "ext.globalConfig.ignoreExtensions.name": "Ignorierte Erweiterungen", - "ext.globalConfig.ignoreExtensions.placeholder": "Geben Sie eine Erweiterung pro Zeile ein (vollständiger Name)", - "ext.globalConfig.ignoreUploadFiles.name": "Ignorierte Dateien", - "ext.globalConfig.ignoreUploadFiles.placeholder": "Geben Sie einen Dateinamen pro Zeile ein", - "ext.globalConfig.ignoreUploadFolders.name": "Ignorierte Ordner", - "ext.globalConfig.ignoredUploadFolders.placeholder": "Geben Sie einen Ordner pro Zeile ein", - "ext.globalConfig.openTokenLink.name": "Öffnen des Token Link", - "ext.globalConfig.supportedFileExtensions.name": "Unterstützte Datei-Erweiterungen", - "ext.globalConfig.supportedFileExtensions.placeholder": "Geben Sie eine Datei-Erweiterung pro Zeile an", - "ext.globalConfig.token.name": "Zugriffs-Token", - "ext.globalConfig.token.placeholder": "Geben Sie Ihren Token ein" -} \ No newline at end of file diff --git a/package.nls.es.json b/package.nls.es.json deleted file mode 100644 index b6547ea1..00000000 --- a/package.nls.es.json +++ /dev/null @@ -1,144 +0,0 @@ -{ - "cmd.downloadSettings.error.removeExtFail": "Sincronización: no se puede eliminar algunas de las extensiones.", - "cmd.downloadSettings.error.unableSave": "Sincronización: no se puede guardar la configuración de la extensión de archivo.", - "cmd.downloadSettings.info.downloaded": "Sincronización: Descarga Completa.", - "cmd.downloadSettings.info.gotLatestVersion": "Sincronización: ya tienes la última versión de la configuración guardada.", - "cmd.downloadSettings.info.readdingOnline": "Sincronización: Ajustes De Lectura En Línea.", - "cmd.downloadSettings.title": "Sincronización: La Configuración De Descarga", - "cmd.howSetting.title": "Sincronización: Cómo Configurar", - "cmd.otherOptions.customizedSync": "Sincronización: Añadir Personalizado de Sincronización ruta de acceso del Archivo", - "cmd.otherOptions.customizedSync.done": "Sincronización: {0} ha sido registrado.", - "cmd.otherOptions.customizedSync.placeholder": "Escriba una ruta de acceso absoluta de los adicionales de archivo cargado.", - "cmd.otherOptions.customizedSync.prompt": "(ex. /ruta/a/.eslintrc) será cargado y descargado en la ruta de acceso especificada.", - "cmd.otherOptions.downloadCustomFile": "Sincronización: Importación Personalizada de Sincronización de Archivo de área de trabajo", - "cmd.otherOptions.downloadCustomFile.done": "Descargar {0}.", - "cmd.otherOptions.downloadCustomFile.placeholder": "Seleccione el archivo que desea descargar a la raíz del espacio de trabajo que usted está trabajando.", - "cmd.otherOptions.downloadSetting": "Sincronización: la Configuración de Descarga de Público ESENCIAL", - "cmd.otherOptions.editLocalSetting": "Sincronización: Editar La Extensión De La Configuración Local", - "cmd.otherOptions.error.toggleFail": "Sincronización: no se puede Alternar.", - "cmd.otherOptions.joinCommunity": "Sincronización: Únete A La Comunidad", - "cmd.otherOptions.openIssue": "Sincronización: Tema Abierto", - "cmd.otherOptions.openSettingsPage": "Sincronización: Abrir La Configuración", - "cmd.otherOptions.preserve": "Sincronización: Preservar La Configuración De Dejar De Reemplazar Después De La Descarga", - "cmd.otherOptions.preserve.info.done1": "Sincronización: Hecho. {0} valor será eliminado de la configuración.json después de la descarga.", - "cmd.otherOptions.preserve.info.done2": "Sincronización: Hecho. Extensión mantendrá {0}: {1} en el establecimiento.json después de la descarga.", - "cmd.otherOptions.preserve.placeholder": "Introduzca cualquier Tecla de ajustes.json para preservar.", - "cmd.otherOptions.preserve.prompt": "Ejemplo: Escribir 'http.proxy' => tienda de este equipo proxy y sobrescribir , si el conjunto vacío va a quitar el proxy.", - "cmd.otherOptions.quietSync.off": "Sincronización: Resumen se muestra en la carga/descarga.", - "cmd.otherOptions.quietSync.on": "Sincronización: barra de Estado será actualizado previa de carga/descarga.", - "cmd.otherOptions.releaseNotes": "Sincronización: Notas De La Versión", - "cmd.otherOptions.shareSetting": "Sincronización: Compartir valores con Público ESENCIAL", - "cmd.otherOptions.shareSetting.beforeConfirm": "Sincronización: Esto eliminará actual GIST y cargar la configuración en el nuevo público ESENCIAL. ¿Desea continuar?", - "cmd.otherOptions.title": "Sincronización: Opciones Avanzadas", - "cmd.otherOptions.toggleAutoDownload": "Sincronización: Activar La Descarga Automática En El Arranque", - "cmd.otherOptions.toggleAutoDownload.off": "Sincronización: Descarga Automática DESACTIVADA en VSCode de Inicio.", - "cmd.otherOptions.toggleAutoDownload.on": "Sincronización: Descarga Automática activada después DE VSCode de Inicio.", - "cmd.otherOptions.toggleAutoUpload": "Sincronización: Activar Auto-Cargar En La Configuración De Cambio", - "cmd.otherOptions.toggleAutoUpload.off": "Sincronización: carga Automática de Cambio de Configuración de Apagado.", - "cmd.otherOptions.toggleAutoUpload.on": "Sincronización: carga Automática de Cambio de Configuración de Encendido. Esto tendrá efecto después de reiniciar.", - "cmd.otherOptions.toggleForceDownload": "Sincronización: Alternar La Fuerza De Descarga", - "cmd.otherOptions.toggleForceDownload.off": "Sincronización: La Fuerza De La Descarga De Apagado.", - "cmd.otherOptions.toggleForceDownload.on": "Sincronización: La Fuerza De La Descarga De Encendido.", - "cmd.otherOptions.toggleForceUpload": "Sincronización: Alternar La Fuerza De Carga", - "cmd.otherOptions.toggleForceUpload.off": "Sincronización: La Fuerza De Cargar Apagado.", - "cmd.otherOptions.toggleForceUpload.on": "Sincronización: La Fuerza De Carga Encendido.", - "cmd.otherOptions.toggleSummaryPage": "Sincronización: Alternar Mostrar La Página De Resumen En La Carga/Descarga", - "cmd.otherOptions.triggerReset": "Sincronización: ¿desea restablecer la configuración ?", - "cmd.otherOptions.warning.tokenNotRequire": "Sincronización: Ajustes de Sincronización de no pedir GitHub Token a partir de ahora.", - "cmd.resetSettings.info.resetting": "Sincronización: Al Restablecer Su Configuración.", - "cmd.resetSettings.info.settingClear": "Sincronización: La Configuración Se Borra.", - "cmd.resetSettings.title": "Sincronización: Restablecer La Configuración De La Extensión", - "cmd.updateSettings.error.gistNotSave": "Sincronización: los GIST NO se GUARDAN", - "cmd.updateSettings.error.newGistCreateFail": "Sincronización: no se puede crear el Gist.", - "cmd.updateSettings.error.readGistFail": "Sincronización: GIST ID: {0} no se puede LEER.", - "cmd.updateSettings.info.gotLatestVersion": "Sincronización: Ya has subido la última versión de la configuración guardada.", - "cmd.updateSettings.info.newGistCreated": "Sincronización: Nueva esencia creada.", - "cmd.updateSettings.info.readding": "Sincronización: Ajustes de Lectura y Extensiones.", - "cmd.updateSettings.info.shareGist": "Sincronización: Compartir la Identificación con otros usuarios de la extensión para compartir la configuración.", - "cmd.updateSettings.info.uploadCanceled": "Sincronización: El Proceso De Carga De Cancelado.", - "cmd.updateSettings.info.uploading": "Sincronización: Cargar/Actualizar La Configuración En GitHub.", - "cmd.updateSettings.info.uploadingDone": "Sincronización: Carga Completa. GIST ID: {0}. Por favor, copiar y utilizar este ID en otras máquinas para la configuración de descarga.", - "cmd.updateSettings.info.uploadingFile": "Sincronización: La Carga De Archivos De Datos.", - "cmd.updateSettings.info.uploadingSuccess": "Sincronización: Se Cargó Correctamente.", - "cmd.updateSettings.title": "Sincronización: Actualización/Cargar La Configuración De", - "cmd.updateSettings.warning.OSNotSupported": "Sincronización de Pragma OS valor {0} no se admite en la línea {1}", - "cmd.updateSettings.warning.noToken": "Sincronización: Conjunto de GitHub Token o desactivar el downloadPublicGist' desde el local de la configuración de Sincronización de archivos.", - "common.action.donate": "Dona Ahora", - "common.action.joinCommunity": "Únete A La Comunidad", - "common.action.openExtPage": "Abra La Extensión De La Página", - "common.action.openExtTutorial": "Abra Tutorial", - "common.action.releaseNotes": "Notas De La Versión", - "common.action.support": "Apoyar Este Proyecto", - "common.action.writeReview": "Escribe Una Reseña", - "common.button.no": "No", - "common.button.yes": "Sí", - "common.error.canNotSave": "Sincronización: no se puede Guardar la Configuración. Por favor, asegúrese de que usted tiene válido JSON configuración.archivo json. (por ejemplo: No comas finales)", - "common.error.connection": "Sincronización: Internet No está Conectado o no se puede Conectar a GitHub. La excepción se Registra en la Consola", - "common.error.gistNotSave": "Sincronización: Los Gist No Se Guardan.", - "common.error.invalidGistId": "Sincronización: No Válido Gist Id Introducido. Compruebe su esencia: https://gist.github.com//.", - "common.error.invalidToken": "Sincronización: No Válido O Caducado GitHub Token. Por favor, generar nuevas token con los ámbitos mencionados en el archivo léame. La excepción se Registra en la Consola.", - "common.error.message": "Sincronización: Error Registrado En la Consola (menú Ayuda > Activar Herramientas de Desarrollador).", - "common.error.tokenNotSave": "Sincronización: Token No Se Guardan.", - "common.info.donate": "Sincronización: ¿te gusta esta extensión? Acerca de cómo escribir una reseña o el envío de una donación? ", - "common.info.excludeFile": "Sincronización: puede excluir cualquier archivo/carpeta para la carga y la configuración de descarga.", - "common.info.gistSaved": "Sincronización: Gist Guardado", - "common.info.initAutoUpload": "Sincronización: Carga Automática De Iniciar En {0} Segundos.", - "common.info.installed": "Sincronización: Ajustes creado, gracias por la instalación!", - "common.info.needHelp": "Sincronización: Necesita Ayuda para configurar esta extensión?", - "common.info.setToken": "Sincronización: Ahora Usted puede configurar su GitHub token manualmente en `syncLocalSettings.json`", - "common.info.tokenSaved": "Sincronización: Token Guardado", - "common.info.updateTo": "Sincronización: Actualizado a la v{0}", - "common.info.updating": "Sincronización: Actualización En Progreso... Por Favor Espere.", - "common.placeholder.enterGistId": "Entrar En Esencia Id", - "common.placeholder.enterGithubAccessToken": "Entrar En GitHub Personal Token De Acceso", - "common.placeholder.multipleGist": "Gist Nombre (por ejemplo: la Configuración Personal)", - "common.prompt.enterGistId": "Introduzca Esencia de Identificación de cargado previamente la configuración. También puede configurar manualmente en el código de configuración (sincronización.gist). Pulse [Enter] o [Esc] para cancelar.", - "common.prompt.enterGithubAccessToken": "Usted también agregar manualmente un símbolo (token) de la Carpeta de Usuario/syncLocalSettings.json). Pulse [Enter] o [Esc] para cancelar.", - "common.prompt.gistForceUpload": "Sincronización: La carga reemplazará la configuración en GitHub Gist. Considere descargar la configuración o realizar una carga forzada. ¿Todavía quieres subir con fuerza?", - "common.prompt.gistNewer": "Sincronización: La configuración de Gist ha cambiado desde la última vez que la descargó. ¿Desea cargar su configuración local actual a Gist de todos modos?", - "common.prompt.multipleGist": "Permite identificar las opciones de configuración si tiene varios gist.", - "common.prompt.restartCode": "¿Desea volver a cargar para aplicar extensiones y configuraciones?", - "ext.config.autoDownload": "Conjunto es cierto para Descargar automáticamente los ajustes en el código de inicio. [Código Necesario Reiniciar]", - "ext.config.autoDownload.name": "Descarga Automática", - "ext.config.autoUpload": "Conjunto es cierto para Carga Automática en la configuración de cambio. [Código Necesario Reiniciar]", - "ext.config.autoUpload.name": "Carga Automática", - "ext.config.forceDownload": "Se establece en true si desea descargar los ajustes, incluso cuando se tiene la configuración más reciente.", - "ext.config.forceDownload.name": "La Fuerza De La Descarga", - "ext.config.forceUpload": "Se establece en true si desea cargar la configuración incluso cuando la ESENCIA tiene una configuración nueva.", - "ext.config.forceUpload.name": "Fuerza De Carga", - "ext.config.gist": "GitHub ESENCIA de IDENTIFICACIÓN para la Configuración de Sincronización.", - "ext.config.gist.name": "Gist ID", - "ext.config.gist.placeholder": "Entrar en Esencia ID", - "ext.config.host": "Establece a su GitHub Enterprise host si desea utilizar GHE.", - "ext.config.lastDownload": "La configuración de Sincronización de la última fecha de descarga. Establecer como vacío si desea manualmente golpe de descarga.", - "ext.config.lastUpload": "La configuración de Sincronización de la última fecha de subida. Establecer como vacío si desea manualmente golpe de descarga.", - "ext.config.pathPrefix": "Establece a su GitHub Enterprise API prefijo si desea utilizar GHE. Normalmente '/api/v3'. Sólo se utiliza cuando el host está configurado.", - "ext.config.quietSync": "Cuando se establece en true, se mostrará el resultado en la barra de estado en lugar de la página de resumen.", - "ext.config.quietSync.name": "Tranquilo Sync", - "ext.config.removeExtensions": "Establece en false si no desea eliminar extensiones, mientras que la descarga.", - "ext.config.removeExtensions.name": "Quitar Las Extensiones De", - "ext.config.syncExtensions": "Establece en false si usted no desea cargar/descargar las extensiones.", - "ext.config.syncExtensions.name": "Sincronización De Extensiones", - "ext.config.title": "Código De Configuración De La Configuración De Sincronización De La Configuración De", - "ext.globalConfig.askGistDescription.name": "Pida A Los Gist Nombre", - "ext.globalConfig.autoUploadDelay.name": "Carga Automática De Retardo", - "ext.globalConfig.autoUploadDelay.placeholder": "Ingrese la cantidad de segundos de retardo de auto-carga", - "ext.globalConfig.downloadPublicGist.name": "Descargar Público Esencial", - "ext.globalConfig.gistDescription.name": "Gist Descripción", - "ext.globalConfig.gistDescription.placeholder": "Entrar En Esencia Descripción", - "ext.globalConfig.githubEnterpriseUrl.name": "GitHub Enterprise URL (opcional)", - "ext.globalConfig.githubEnterpriseUrl.placeholder": "Entrar en GitHub Enterprise URL", - "ext.globalConfig.hostName.name": "Nombre de host (opcional)", - "ext.globalConfig.hostName.placeholder": "Introduzca Nombre De Host", - "ext.globalConfig.ignoreExtensions.name": "Ignorado Extensiones", - "ext.globalConfig.ignoreExtensions.placeholder": "Introduzca una extensión por línea (nombre completo)", - "ext.globalConfig.ignoreUploadFiles.name": "Archivos Ignorados", - "ext.globalConfig.ignoreUploadFiles.placeholder": "Introduzca un archivo por línea", - "ext.globalConfig.ignoreUploadFolders.name": "Ignorado Carpetas", - "ext.globalConfig.ignoredUploadFolders.placeholder": "Entrar en una carpeta por cada línea", - "ext.globalConfig.openTokenLink.name": "Abierto Token De Enlace", - "ext.globalConfig.supportedFileExtensions.name": "Las Extensiones De Archivo", - "ext.globalConfig.supportedFileExtensions.placeholder": "Introduzca una extensión de archivo por línea", - "ext.globalConfig.token.name": "Token De Acceso", - "ext.globalConfig.token.placeholder": "Introduzca Token" -} \ No newline at end of file diff --git a/package.nls.fr.json b/package.nls.fr.json deleted file mode 100644 index 74395337..00000000 --- a/package.nls.fr.json +++ /dev/null @@ -1,143 +0,0 @@ -{ - "cmd.downloadSettings.error.removeExtFail": "Sync: Impossible de supprimer certaines extensions.", - "cmd.downloadSettings.error.unableSave": "Sync: Impossible d'enregistrer les paramètres de l'extension de fichier.", - "cmd.downloadSettings.info.downloaded": "Sync: Téléchargement terminé.", - "cmd.downloadSettings.info.gotLatestVersion": "Sync: Vous avez déjà la dernière version des paramètres enregistrés.", - "cmd.downloadSettings.info.readdingOnline": "Sync: Lecture des paramètres en ligne.", - "cmd.downloadSettings.title": "Sync: Paramètres de téléchargement", - "cmd.howSetting.title": "Sync: Comment configurer", - "cmd.otherOptions.customizedSync": "Sync: Ajouter un chemin d'accès au fichier de synchronisation personnalisé", - "cmd.otherOptions.customizedSync.done": "Sync: {0} a été enregistré.", - "cmd.otherOptions.customizedSync.placeholder": "Entrez un chemin d'accès absolu au fichier supplémentaires uploadé.", - "cmd.otherOptions.customizedSync.prompt": "(ex. /chemin/vers/.eslintrc) sera uploadé et téléchargé vers le chemin spécifié.", - "cmd.otherOptions.downloadCustomFile": "Sync: Importer un Fichier de Synchronisation Personnalisé à l'espace de travail", - "cmd.otherOptions.downloadCustomFile.done": "Téléchargé: {0}.", - "cmd.otherOptions.downloadCustomFile.placeholder": "Sélectionnez le fichier que vous souhaitez télécharger à la racine de l'espace de travail actuel.", - "cmd.otherOptions.downloadSetting": "Sync: Télécharger les configuration depuis un GIST public", - "cmd.otherOptions.editLocalSetting": "Sync: Modifier les paramètres locaux de l'extension", - "cmd.otherOptions.error.toggleFail": "Sync: Impossible d'activer.", - "cmd.otherOptions.joinCommunity": "Sync: Rejoignez la communauté", - "cmd.otherOptions.openIssue": "Sync: Créer une \"Issue\"", - "cmd.otherOptions.openSettingsPage": "Sync: Ouvrir les paramètres", - "cmd.otherOptions.preserve": "Sync: Empêche le remplacement des paramètres au téléchargement", - "cmd.otherOptions.preserve.info.done1": "Sync: Fait. La valeur de {0} sera supprimée dans settings.json après le téléchargement.", - "cmd.otherOptions.preserve.info.done2": "Sync: Fait. L'extension gardera {0}: {1} dans settings.json après le téléchargement.", - "cmd.otherOptions.preserve.placeholder": "Entrez n'importe quelle clé de settings.json pour la préserver.", - "cmd.otherOptions.preserve.prompt": "Exemple: Écrivez 'http.proxy' => enregistre ce proxy et le remplacer, si vide le proxy sera supprimé.", - "cmd.otherOptions.quietSync.off": "Sync: Un résumé s'affiche lors du téléchargement/upload.", - "cmd.otherOptions.quietSync.on": "Sync: La barre de statut sera mis à jour lors d'un téléchargement/upload.", - "cmd.otherOptions.releaseNotes": "Sync: Notes de version", - "cmd.otherOptions.shareSetting": "Sync: Partagez vos paramètres grâce aux GIST public", - "cmd.otherOptions.shareSetting.beforeConfirm": "Sync: Cela permettra de supprimer le GIST actuel et uploadera vos paramètres sur un nouveau GIST public. Voulez-vous continuer?", - "cmd.otherOptions.title": "Sync: Options avancées", - "cmd.otherOptions.toggleAutoDownload": "Sync: Active le téléchargement automatique au démarrage", - "cmd.otherOptions.toggleAutoDownload.off": "Sync: Téléchargement automatique DÉSACTIVÉE au démarrage de VSCode.", - "cmd.otherOptions.toggleAutoDownload.on": "Sync: Téléchargement automatique ACTIVÉ au démarrage de VSCode.", - "cmd.otherOptions.toggleAutoUpload": "Sync: Activer / Désactiver l'upload automatique lorsque vous changez vos paramètres", - "cmd.otherOptions.toggleAutoUpload.off": "Sync: L'upload automatique lors de modification des paramètres est désactivé.", - "cmd.otherOptions.toggleAutoUpload.on": "Sync: L'upload automatique lors de modification des paramètres est activé. Cela prendra effet après le redémarrage.", - "cmd.otherOptions.toggleForceDownload": "Sync: Permet de forcer le téléchargement", - "cmd.otherOptions.toggleForceDownload.off": "Sync: Téléchargement forcé désactivé.", - "cmd.otherOptions.toggleForceDownload.on": "Sync: Téléchargement forcé activé.", - "cmd.otherOptions.toggleForceUpload": "Sync: Activer l'upload forcé", - "cmd.otherOptions.toggleForceUpload.off": "Sync: Upload forcé désactivé.", - "cmd.otherOptions.toggleForceUpload.on": "Sync: Upload forcé activé.", - "cmd.otherOptions.toggleSummaryPage": "Sync: Active l'affichage de la page \"Résumé\" lors d'un téléchargement/upload", - "cmd.otherOptions.triggerReset": "Sync: Voulez-vous réinitialiser les paramètres ?", - "cmd.otherOptions.warning.tokenNotRequire": "Sync: Settings Sync ne vous demandera plus de Token GitHub à partir de maintenant.", - "cmd.resetSettings.info.resetting": "Sync: Réinitialisation de vos paramètres.", - "cmd.resetSettings.info.settingClear": "Sync: Paramètres effacés.", - "cmd.resetSettings.title": "Sync: Réinitialise les paramètres de l'extension", - "cmd.updateSettings.error.gistNotSave": "Sync: GIST NON ENREGISTRÉ", - "cmd.updateSettings.error.newGistCreateFail": "Sync: Impossible de créer le Gist.", - "cmd.updateSettings.error.readGistFail": "Sync: GIST ID: {0} NE PEUT ETRE LU.", - "cmd.updateSettings.info.gotLatestVersion": "Sync: Vous avez déjà téléchargé la dernière version des paramètres enregistrés.", - "cmd.updateSettings.info.newGistCreated": "Sync: Nouveau gist créé.", - "cmd.updateSettings.info.readding": "Sync: Lecture des paramètres et des extensions.", - "cmd.updateSettings.info.shareGist": "Sync: Partager l'Id avec un autre utilisateur de l'extension pour partager les paramètres.", - "cmd.updateSettings.info.uploadCanceled": "Sync: Processus de téléchargement annulé.", - "cmd.updateSettings.info.uploading": "Sync: Upload/Mise À Jour de vos paramètres sur GitHub.", - "cmd.updateSettings.info.uploadingDone": "Sync: Upload complet. GIST ID: {0}. Merci de copiez et d'utiliser cette ID dans d'autres machines pour télécharger les paramètres.", - "cmd.updateSettings.info.uploadingFile": "Sync:, Upload des fichiers de données.", - "cmd.updateSettings.info.uploadingSuccess": "Sync: Uploadé avec succès.", - "cmd.updateSettings.title": "Sync: Mettre À Jour/Uploader vos paramètres", - "cmd.updateSettings.warning.OSNotSupported": "Sync Pragma OS de la valeur {0} non pris en charge à la ligne {1}", - "cmd.updateSettings.warning.noToken": "Sync: Ajoutez un Token GitHub ou désactivez 'downloadPublicGist' de votre fichier local des paramètres de synchronisation.", - "common.action.donate": "Faites un don maintenant", - "common.action.joinCommunity": "Rejoignez la communauté", - "common.action.openExtPage": "Ouvrir la page de l'extension", - "common.action.openExtTutorial": "Ouvrir le tutoriel", - "common.action.releaseNotes": "Notes de version", - "common.action.support": "Soutenir ce projet", - "common.action.writeReview": "Écrire une review", - "common.button.no": "Non", - "common.button.yes": "Oui", - "common.error.canNotSave": "Sync: Impossible d'enregistrer les paramètres. Assurez-vous d'avoir un JSON valide dans votre fichier settings.json.", - "common.error.connection": "Sync: Pas de connection internet ou impossible de se connecter à GitHub. Exception enregistré dans la Console", - "common.error.gistNotSave": "Sync: Gist non enregistré.", - "common.error.invalidGistId": "Sync: Gist Id non valide. Vérifiez votre gist: https://gist.github.com//.", - "common.error.invalidToken": "Sync: Token Github non valide ou expiré. Veuillez créer un nouveau token avec des étendues mentionné dans le fichier le readme. Exception Enregistré dans la Console.", - "common.error.message": "Sync: Erreur enregistré dans la Console (menu Aide > activer / désactiver les Outils de développement).", - "common.error.tokenNotSave": "Sync: Token Non Enregistré.", - "common.info.donate": "Sync: Aimez-vous cette extension? Souhaitez-vous écrire une review ou envoyer un don? ;)", - "common.info.excludeFile": "Synchronisation: Vous pouvez exclure n'importe quel fichier/dossier pour l'upload et paramètres pour le téléchargement.", - "common.info.gistSaved": "Sync: Gist Enregistré", - "common.info.initAutoUpload": "Sync: Le téléchargement automatique démarrera dans {0} secondes.", - "common.info.installed": "Sync: Paramètres créés, je vous remercie d'avoir installé cette extension!", - "common.info.needHelp": "Sync: Besoin d'aide pour configurer cette extension?", - "common.info.setToken": "Synchronisation: Vous pouvez désormais paramétrer votre Token GitHub manuellement dans \"syncLocalSettings.json\"", - "common.info.tokenSaved": "Sync: Token Enregistré", - "common.info.updateTo": "Sync: Mise à jour à v{0}", - "common.info.updating": "Sync: Mise à jour en cours... Veuillez patienter.", - "common.placeholder.enterGistId": "Entrez Gist Id", - "common.placeholder.enterGithubAccessToken": "Entrez GitHub Personal Access Token", - "common.placeholder.multipleGist": "Gist Name (par exemple: Paramètres Personnels)", - "common.prompt.enterGistId": "Entrez le Gist Id de vos paramètres précédemment uploadé. Vous pouvez également définir le manuellement dans les paramètres de VSCode (sync.gist). Appuyez sur la touche [Enter] ou [Esc] pour annuler.", - "common.prompt.enterGithubAccessToken": "Vous aussi ajouter manuellement un token (Dossier Utilisateur/syncLocalSettings.json). Appuyez sur la touche [Enter] ou [Esc] pour annuler.", - "common.prompt.gistForceUpload": "Sync: Le téléchargement remplacera les paramètres dans GitHub Gist. Pensez à télécharger les paramètres ou à effectuer un téléchargement forcé. Voulez-vous toujours télécharger avec force?", - "common.prompt.gistNewer": "Sync: Les paramètres dans Gist ont changé depuis votre dernier téléchargement. Voulez-vous quand même télécharger vos paramètres locaux actuels dans Gist?", - "common.prompt.multipleGist": "Vous permet d'identifier les paramètres si vous avez plusieurs de gist.", - "common.prompt.restartCode": "Voulez-vous recharger afin d'appliquer les extensions et les configurations?", - "ext.config.autoDownload": "Changez la valeur à true pour télécharger automatiquement les paramètres lors du démarrage de VSCode. [Redémarrage de VSCode Nécessaire]", - "ext.config.autoDownload.name": "Téléchargement Automatique", - "ext.config.autoUpload": "Changez la valeur à true afin d'uploader automatiquement lors de modification des paramètres. [Redémarrage de VSCode Nécessaire]", - "ext.config.forceDownload": "Changez la valeur à true si vous souhaitez télécharger les paramètres, même lorsque vous avez les derniers paramètres.", - "ext.config.forceDownload.name": "Forcer Le Téléchargement", - "ext.config.forceUpload": "Changez la valeur à true si vous souhaitez uploader les paramètres, même lorsque le GIST a de nouveaux paramètres.", - "ext.config.forceUpload.name": "Forcer l'upload", - "ext.config.gist": "GitHub GIST ID pour Settings Sync.", - "ext.config.gist.name": "Gist ID", - "ext.config.gist.placeholder": "Entrez Gist ID", - "ext.config.host": "Changez la valeur à votre hôte GitHub Entreprise si vous souhaitez utiliser GHE.", - "ext.config.lastDownload": "Settings Sync dernière date de téléchargement. Laissez vide si vous souhaitez télécharger manuellement.", - "ext.config.lastUpload": "Settings Sync dernière date d'upload. Laissez vide si vous souhaitez uploader manuellement", - "ext.config.pathPrefix": "Changez la valeur à votre GitHub Enterprise API préfixe si vous souhaitez utiliser GHE. Normalement '/api/v3'. Utilisé uniquement lorsque l'hôte est défini.", - "ext.config.quietSync": "Lorsque la valeur est true, affiche le résultat dans la barre d'état au lieu de la page de résumé.", - "ext.config.quietSync.name": "Sync silencieuse", - "ext.config.removeExtensions": "Changez la valeur à false si vous ne voulez pas supprimer des extensions pendant le téléchargement.", - "ext.config.removeExtensions.name": "Supprimer Des Extensions", - "ext.config.syncExtensions": "Changez la valeur à false si vous ne voulez pas uploader/télécharger l'extensions.", - "ext.config.syncExtensions.name": "Synchronisation Des Extensions", - "ext.config.title": "Paramètres de configuration de la synchronisation des paramètres VSCode", - "ext.globalConfig.askGistDescription.name": "Demande le nom du Gist", - "ext.globalConfig.autoUploadDelay.name": "Délai de l'upload automatique", - "ext.globalConfig.autoUploadDelay.placeholder": "Entrez le montant de secondes avant chaque upload automatique", - "ext.globalConfig.downloadPublicGist.name": "Télécharger un Gist Public", - "ext.globalConfig.gistDescription.name": "Description du Gist", - "ext.globalConfig.gistDescription.placeholder": "Entrez un description du Gist", - "ext.globalConfig.githubEnterpriseUrl.name": "GitHub Enterprise URL (facultatif)", - "ext.globalConfig.githubEnterpriseUrl.placeholder": "Entrez GitHub Enterprise URL", - "ext.globalConfig.hostName.name": "Nom d'hôte (facultatif)", - "ext.globalConfig.hostName.placeholder": "Entrez Le Nom D'Hôte", - "ext.globalConfig.ignoreExtensions.name": "Ignorer Des Extensions", - "ext.globalConfig.ignoreExtensions.placeholder": "Entrez une extension par ligne (nom complet)", - "ext.globalConfig.ignoreUploadFiles.name": "Fichiers Ignorés", - "ext.globalConfig.ignoreUploadFiles.placeholder": "Entrez un fichier par ligne", - "ext.globalConfig.ignoreUploadFolders.name": "Ignorer Des Dossiers", - "ext.globalConfig.ignoredUploadFolders.placeholder": "Entrez un dossier par ligne", - "ext.globalConfig.openTokenLink.name": "Ouvrir Le Lien vers le Token", - "ext.globalConfig.supportedFileExtensions.name": "Extensions de fichier pris en charge", - "ext.globalConfig.supportedFileExtensions.placeholder": "Saisissez une extension de fichier par ligne", - "ext.globalConfig.token.name": "Token D'Accès", - "ext.globalConfig.token.placeholder": "Entrez un Token" -} diff --git a/package.nls.hu.json b/package.nls.hu.json deleted file mode 100644 index 9d3fbd29..00000000 --- a/package.nls.hu.json +++ /dev/null @@ -1,143 +0,0 @@ -{ - "cmd.downloadSettings.error.removeExtFail": "Fordította: Képes eltávolítani bizonyos fájlokat.", - "cmd.downloadSettings.error.unableSave": "Fordította: Nem lehet menteni kiterjesztését a beállítások, a fájl.", - "cmd.downloadSettings.info.downloaded": "Fordította: Letöltés Teljes.", - "cmd.downloadSettings.info.gotLatestVersion": "Fordította: már a legújabb verzió a mentett beállítások.", - "cmd.downloadSettings.info.readdingOnline": "Fordította: Olvasási Beállítások Online.", - "cmd.downloadSettings.title": "Fordította: Letöltési Beállítások", - "cmd.howSetting.title": "Fordította: Hogyan Kell Beállítani", - "cmd.otherOptions.customizedSync": "Fordította: Add Egyéni Fordította: Fájl elérési útját", - "cmd.otherOptions.customizedSync.done": "Fordította: {0} regisztrálták.", - "cmd.otherOptions.customizedSync.placeholder": "Adjon meg egy abszolút elérési útvonalát, előfordulhat, hogy a feltöltött fájl.", - "cmd.otherOptions.customizedSync.prompt": "(ex. /path/to/.eslintrc) feltöltésre kerül, illetve a letöltött fájl a megadott elérési utat.", - "cmd.otherOptions.downloadCustomFile": "Fordította: Import Egyéni Fordította: Fájlt munkaterület", - "cmd.otherOptions.downloadCustomFile.done": "A letöltött {0}.", - "cmd.otherOptions.downloadCustomFile.placeholder": "Válassza ki a kívánt fájlt kell letölteni, hogy a gyökér a munkaterület, amelyen dolgozik.", - "cmd.otherOptions.downloadSetting": "Fordította: Letöltési Beállítások a Nyilvános GIST", - "cmd.otherOptions.editLocalSetting": "Fordította: Edit Kiterjesztését Helyi Beállítások", - "cmd.otherOptions.error.toggleFail": "Fordította: Nem Kapcsoló.", - "cmd.otherOptions.joinCommunity": "Fordította: Csatlakozzon Közösségi", - "cmd.otherOptions.openIssue": "Fordította: Nyitott Kérdés", - "cmd.otherOptions.openSettingsPage": "Fordította: Nyissa Meg A Beállításokat", - "cmd.otherOptions.preserve": "Fordította: Megőrizni A Beállítást, Hogy Ne Felülbírálja Letöltés Után", - "cmd.otherOptions.preserve.info.done1": "Fordította: Kész. {0} érték el lesz távolítva a beállítások.json letöltése után.", - "cmd.otherOptions.preserve.info.done2": "Fordította: Kész. Kiterjesztését fogja {0}: {1} a beállítást.json letöltése után.", - "cmd.otherOptions.preserve.placeholder": "Adja meg bármelyik Gombot, a beállítások.json megőrizni.", - "cmd.otherOptions.preserve.prompt": "Példa: Írd http.proxy' => tárolja a számítógép proxy, illetve felülírása , ha meghatározott üres, akkor távolítsa el a proxy.", - "cmd.otherOptions.quietSync.off": "Fordította: Összefoglaló jelenik meg, amikor letöltés/feltöltés.", - "cmd.otherOptions.quietSync.on": "Fordította: állapotsor után fogjuk frissíteni letöltés/feltöltés.", - "cmd.otherOptions.releaseNotes": "Fordította: Kiadási Megjegyzések", - "cmd.otherOptions.shareSetting": "Fordította: Share Beállítások a Nyilvános GIST", - "cmd.otherOptions.shareSetting.beforeConfirm": "Fordította: Ez eltávolítja az aktuális GIST-ben, illetve feltöltési beállítások az új állami LÉNYEGET. Akarod, hogy folytassam?", - "cmd.otherOptions.title": "Fordította: Speciális Beállítások", - "cmd.otherOptions.toggleAutoDownload": "Fordította: Kapcsoló Automatikus Letöltés Bekapcsoláskor", - "cmd.otherOptions.toggleAutoDownload.off": "Fordította: Automatikus Letöltés KI van kapcsolva után VSCode Indítási.", - "cmd.otherOptions.toggleAutoDownload.on": "Fordította: Automatikus Letöltés bekapcsolása után VSCode Indítási.", - "cmd.otherOptions.toggleAutoUpload": "Fordította: Kapcsoló Automatikus Feltöltés A Beállítások Módosítása", - "cmd.otherOptions.toggleAutoUpload.off": "Fordította: Automatikus feltöltés Beállítás Módosítása Kapcsolva.", - "cmd.otherOptions.toggleAutoUpload.on": "Fordította: Automatikus feltöltés Beállítás Módosítása Kapcsolva. Ez akkor lép érvénybe, amikor az újraindítás.", - "cmd.otherOptions.toggleForceDownload": "Fordította: Kapcsoló Erő Letöltés", - "cmd.otherOptions.toggleForceDownload.off": "Fordította: Erő Letöltés Ki Van Kapcsolva.", - "cmd.otherOptions.toggleForceDownload.on": "Fordította: Erő Letöltés Kapcsolva.", - "cmd.otherOptions.toggleForceUpload": "Fordította: Kapcsoló Erő Feltöltés", - "cmd.otherOptions.toggleForceUpload.off": "Fordította: Erő Feltöltés Ki Van Kapcsolva.", - "cmd.otherOptions.toggleForceUpload.on": "Fordította: Erő Feltöltés Kapcsolva.", - "cmd.otherOptions.toggleSummaryPage": "Fordította: Kapcsoló Show-Gyűjtő Oldal Feltöltés/Letöltés", - "cmd.otherOptions.triggerReset": "Fordította: akarod, hogy állítsa vissza a beállításokat ?", - "cmd.otherOptions.warning.tokenNotRequire": "Fordította: Beállítások a Szinkronizálás nem fogja megkérdezni a GitHub Token mostantól.", - "cmd.resetSettings.info.resetting": "Fordította: Újraindítani A Beállításokat.", - "cmd.resetSettings.info.settingClear": "Fordította: Beállítások Törölve.", - "cmd.resetSettings.title": "Fordította: Hosszabbító Beállítások Visszaállítása", - "cmd.updateSettings.error.gistNotSave": "Fordította: LÉNYEGET NEM MENTETT", - "cmd.updateSettings.error.newGistCreateFail": "Fordította: Nem sikerült létrehozni Lényeget.", - "cmd.updateSettings.error.readGistFail": "Fordította: LÉNYEGET ID: {0} NEM OLVASTAM.", - "cmd.updateSettings.info.gotLatestVersion": "Fordította: Már feltöltötte a mentett beállítások legújabb verzióját.", - "cmd.updateSettings.info.newGistCreated": "Fordította: Új lényeget létre.", - "cmd.updateSettings.info.readding": "Fordította: Olvasási Beállítások, majd a Fájlokat.", - "cmd.updateSettings.info.shareGist": "Fordította: oszd meg az Id más kiterjesztését a felhasználók számára, hogy megosszák a beállításokat.", - "cmd.updateSettings.info.uploadCanceled": "Fordította: Feltöltési Folyamat Elmarad.", - "cmd.updateSettings.info.uploading": "Fordította: Feltöltés/Frissítése A Beállításokat A GitHub.", - "cmd.updateSettings.info.uploadingDone": "Fordította: Feltöltés Befejeződött. GIST-ID: {0}. Kérem másolja használja ID más gépek beállítások letöltése.", - "cmd.updateSettings.info.uploadingFile": "Fordította: Fájlok Feltöltése Adatokkal.", - "cmd.updateSettings.info.uploadingSuccess": "Fordította: Feltöltött Sikeresen.", - "cmd.updateSettings.title": "Fordította: Frissítés/Feltöltési Beállítások", - "cmd.updateSettings.warning.OSNotSupported": "Fordította: Pragma OS érték a {0} nem támogatott a sor {1}", - "cmd.updateSettings.warning.noToken": "Fordította: Állítsa be a GitHub Token vagy letiltása 'downloadPublicGist a helyi Szinkronizálási beállítások fájlt.", - "common.action.donate": "Adományozni Most", - "common.action.joinCommunity": "Csatlakozzon Közösségi", - "common.action.openExtPage": "Nyitva Kiterjesztését Oldal", - "common.action.openExtTutorial": "Nyílt Bemutató", - "common.action.releaseNotes": "Kiadási Megjegyzések", - "common.action.support": "Támogatja Ezt A Projektet", - "common.action.writeReview": "Írd Felülvizsgálat", - "common.button.no": "Nem", - "common.button.yes": "Igen", - "common.error.canNotSave": "Fordította: Nem lehet Menteni a Beállításokat. Kérjük, győződjön meg arról, hogy érvényes JSON beállítások.json fájlt. (például: Nem záró vesszőt)", - "common.error.connection": "Fordította: Internet Nincs Csatlakoztatva, vagy Nem tud Csatlakozni a GitHub. Kivétel Bejelentkezett Konzol", - "common.error.gistNotSave": "Fordította: Lényeget Nem Mentette Meg.", - "common.error.invalidGistId": "Fordította: Érvénytelen Lényeget Id Lépett. Ellenőrizze a lényeget: https://gist.github.com//.", - "common.error.invalidToken": "Fordította: Érvénytelen, Lejárt/GitHub Token. Kérjük, ezáltal új token a hatókörök említette a readme-t. Kivétel Bejelentkezett Konzol.", - "common.error.message": "Fordította: Hiba Naplózásra Konzol (Súgó menü > Kapcsoló Fejlesztő Eszközök).", - "common.error.tokenNotSave": "Fordította: Token Nem Mentette Meg.", - "common.info.donate": "Fordította: tetszik ez a kiterjesztés? Hogy az írásban felülvizsgálatot, vagy küld egy adomány? ", - "common.info.excludeFile": "Fordította: kizárhat bármely fájl/mappa a feltöltés, illetve a beállítások letöltéséhez.", - "common.info.gistSaved": "Fordította: Lényeget Elmentett", - "common.info.initAutoUpload": "Fordította: Automatikus Feltöltés Kezdeményező A {0} Másodperc.", - "common.info.installed": "Fordította: Beállítások létre, köszönöm, telepítése!", - "common.info.needHelp": "Fordította: Segítség konfigurálása ez a kiterjesztés?", - "common.info.setToken": "Fordította: Most beállíthatjuk, Hogy a GitHub token kézzel a `syncLocalSettings.json`", - "common.info.tokenSaved": "Fordította: Token Elmentett", - "common.info.updateTo": "Fordította: Frissített v{0}", - "common.info.updating": "Fordította: Frissítése Folyamatban Kérem Várjon.", - "common.placeholder.enterGistId": "Adja Meg Lényeget Id", - "common.placeholder.enterGithubAccessToken": "Írja Be A GitHub Személyes Access Token", - "common.placeholder.multipleGist": "Lényeg a Neve (például: Személyes Beállítások)", - "common.prompt.enterGistId": "Adja meg Lényeget Id a korábban feltöltött beállítások. Azt is beállíthatja kézzel a kódot a beállítások (fordította.gist). Nyomja meg az [Enter] vagy az [Esc] lemondani.", - "common.prompt.enterGithubAccessToken": "Te kézzel is hozzáadhat egy token (Felhasználói Mappa/syncLocalSettings.json). Nyomja meg az [Enter] vagy az [Esc] lemondani.", - "common.prompt.gistForceUpload": "Fordította: A feltöltés felváltja a GitHub Gist beállításait. Fontolja meg a beállítások letöltését vagy egy kényszerű feltöltést. Még mindig erőteljesen szeretne feltölteni?", - "common.prompt.gistNewer": "Fordította: A Gist beállításai megváltoztak az utóbbi letöltés óta. Egyébként feltölti a jelenlegi helyi beállításait a Gistbe?", - "common.prompt.multipleGist": "Lehetővé teszi, hogy azonosítsa a beállítások ha több lényeget.", - "common.prompt.restartCode": "Akarod, hogy újra alkalmazni fájlokat, konfigurációk?", - "ext.config.autoDownload": "Állítsa igaz, hogy az Automatikus Letöltés beállításai kód kezdeni. [Kód Újraindítás Szükséges]", - "ext.config.autoDownload.name": "Automatikus Letöltés", - "ext.config.autoUpload": "Állítsa igaz, hogy az Automatikus Feltöltés a beállítások módosítása. [Kód Újraindítás Szükséges]", - "ext.config.autoUpload.name": "Automatikus Feltöltés", - "ext.config.forceDownload": "Állítsa be, hogy igaz, ha szeretné letölteni a beállítások akkor is, ha a legújabb beállítások.", - "ext.config.forceDownload.name": "Erő Letöltés", - "ext.config.forceUpload": "Állítsa be, hogy igaz, ha a feltölteni kívánt a beállítások akkor is, ha a LÉNYEGET újabb beállításokat.", - "ext.config.forceUpload.name": "Erő Feltöltés", - "ext.config.gist": "A GitHub LÉNYEGET ID a Beállítások Szinkronizálása.", - "ext.config.gist.name": "Lényeg ID", - "ext.config.gist.placeholder": "Adja meg Lényeget ID", - "ext.config.host": "Állítsa be, hogy a GitHub Enterprise fogadó, ha használni szeretnénk, GHE.", - "ext.config.lastDownload": "Beállítások a Szinkronizálás utolsó letöltés dátuma. Állítsa be, mint üres, ha kézzel szeretné hit le.", - "ext.config.lastUpload": "Beállítások a Szinkronizálás utolsó feltöltés időpontja. Állítsa be, mint üres, ha kézzel szeretné hit le.", - "ext.config.pathPrefix": "Állítsa be, hogy a GitHub Enterprise API előtag, ha használni szeretnénk, GHE. Általában '/api/v3'. Csak akkor kell használni, ha az állomás épülete.", - "ext.config.quietSync": "Ha értéke true, akkor megmutatja az eredményt az állapotsoron, ahelyett, gyűjtő oldal.", - "ext.config.quietSync.name": "Csendes Fordította:", - "ext.config.removeExtensions": "Állítsa be, hogy hamis, ha nem szeretné, hogy távolítsa el a kiterjesztések letöltése közben.", - "ext.config.removeExtensions.name": "Távolítsa El A Fájlokat", - "ext.config.syncExtensions": "Állítsa be, hogy hamis, ha nem akarod, hogy a feltöltés/letöltés a fájlokat.", - "ext.config.syncExtensions.name": "Fordította: Z", - "ext.config.title": "Kód Beállítások A Szinkronizálás Konfigurációs Beállítások", - "ext.globalConfig.askGistDescription.name": "Kérdezd Meg Lényeget Név", - "ext.globalConfig.autoUploadDelay.name": "Automatikus Feltöltés Késedelem", - "ext.globalConfig.autoUploadDelay.placeholder": "Adja meg az összeget másodperc késleltetés az automatikus feltöltés", - "ext.globalConfig.downloadPublicGist.name": "Letöltés Nyilvános Gist", - "ext.globalConfig.gistDescription.name": "Lényeg Leírás", - "ext.globalConfig.gistDescription.placeholder": "Adja Meg Lényeget Leírás", - "ext.globalConfig.githubEnterpriseUrl.name": "A GitHub Enterprise URL (opcionális)", - "ext.globalConfig.githubEnterpriseUrl.placeholder": "Írja be a GitHub Enterprise URL", - "ext.globalConfig.hostName.name": "Hálózati név (nem kötelező)", - "ext.globalConfig.hostName.placeholder": "Adja Meg Hostname", - "ext.globalConfig.ignoreExtensions.name": "Figyelmen Kívül Fájlokat", - "ext.globalConfig.ignoreExtensions.placeholder": "Adjon meg egy kiterjesztés soronként (teljes név)", - "ext.globalConfig.ignoreUploadFiles.placeholder": "Adjon meg egy fájl soronként", - "ext.globalConfig.ignoreUploadFolders.name": "Figyelmen Kívül Mappák", - "ext.globalConfig.ignoredUploadFolders.placeholder": "Adjon meg egy mappát, soronként", - "ext.globalConfig.openTokenLink.name": "Nyitva Token Link", - "ext.globalConfig.supportedFileExtensions.name": "Támogatott Fájl Kiterjesztések", - "ext.globalConfig.supportedFileExtensions.placeholder": "Adja meg a fájl kiterjesztését soronként", - "ext.globalConfig.token.name": "Access Token", - "ext.globalConfig.token.placeholder": "Adja Meg Token" -} \ No newline at end of file diff --git a/package.nls.it.json b/package.nls.it.json deleted file mode 100644 index 2d36c27e..00000000 --- a/package.nls.it.json +++ /dev/null @@ -1,144 +0,0 @@ -{ - "cmd.downloadSettings.error.removeExtFail": "Sync: Impossibile rimuovere alcune estensioni.", - "cmd.downloadSettings.error.unableSave": "Sync: Impossibile salvare le impostazioni dell'estensione del file.", - "cmd.downloadSettings.info.downloaded": "Sync: Scarica Completo.", - "cmd.downloadSettings.info.gotLatestVersion": "Sync: Hai già l'ultima versione di impostazioni salvate.", - "cmd.downloadSettings.info.readdingOnline": "Sync: Impostazioni Di Lettura On-Line.", - "cmd.downloadSettings.title": "Sync: Impostazioni Di Download", - "cmd.howSetting.title": "Sync: Come Configurare", - "cmd.otherOptions.customizedSync": "Sync: Aggiungere Sincronizzazione Personalizzata percorso del File", - "cmd.otherOptions.customizedSync.done": "Sync: {0} è stato registrato.", - "cmd.otherOptions.customizedSync.placeholder": "Immettere un percorso assoluto di ulteriori file caricato.", - "cmd.otherOptions.customizedSync.prompt": "(ex. /path/to/.eslintrc) saranno caricati e scaricati il percorso specificato.", - "cmd.otherOptions.downloadCustomFile": "Sync: Importazione di Sincronizzazione Personalizzata File di area di lavoro", - "cmd.otherOptions.downloadCustomFile.done": "Scaricato {0}.", - "cmd.otherOptions.downloadCustomFile.placeholder": "Selezionare il file che si desidera scaricare per il root del lavoro che si sta lavorando.", - "cmd.otherOptions.downloadSetting": "Sync: Impostazioni di Download dal Pubblico GIST", - "cmd.otherOptions.editLocalSetting": "Sync: Modificare L'Estensione Impostazioni Locali", - "cmd.otherOptions.error.toggleFail": "Sync: Impossibile Passare.", - "cmd.otherOptions.joinCommunity": "Sync: Unisciti Alla Community", - "cmd.otherOptions.openIssue": "Sync: Questione Aperta", - "cmd.otherOptions.openSettingsPage": "Sync: Aprire Impostazioni", - "cmd.otherOptions.preserve": "Sync: Conservare L'Impostazione Di Smettere Di Ignorare Dopo Il Download", - "cmd.otherOptions.preserve.info.done1": "Sync: Fatto. {0} valore sarà rimosso da impostazioni.json dopo il download.", - "cmd.otherOptions.preserve.info.done2": "Sync: Fatto. Estensione terrà {0}: {1} in impostazione.json dopo il download.", - "cmd.otherOptions.preserve.placeholder": "Inserisci il Tasto delle impostazioni.json per preservare.", - "cmd.otherOptions.preserve.prompt": "Esempio: Scrivere 'http.proxy' => archivio di questo computer proxy e sovrascrivere il file , se è impostato il vuoto sarà rimuovere il proxy.", - "cmd.otherOptions.quietSync.off": "Sync: Riepilogo verrà mostrato al momento del download/upload.", - "cmd.otherOptions.quietSync.on": "Sync: barra di Stato verrà aggiornato durante il download/upload.", - "cmd.otherOptions.releaseNotes": "Sync: Note Di Rilascio", - "cmd.otherOptions.shareSetting": "Sync: Impostazioni di Condivisione con il Pubblico GIST", - "cmd.otherOptions.shareSetting.beforeConfirm": "Sync: Questo consente di rimuovere corrente GIST e caricare le impostazioni sul nuovo pubblico GIST. Vuoi continuare?", - "cmd.otherOptions.title": "Sync: Opzioni Avanzate", - "cmd.otherOptions.toggleAutoDownload": "Sync: Per Attivare / Disattivare Il Download Automatico All'Avvio", - "cmd.otherOptions.toggleAutoDownload.off": "Sync: Download Automatico DISATTIVATA su VSCode di Avvio.", - "cmd.otherOptions.toggleAutoDownload.on": "Sync: Download Automatico acceso su VSCode di Avvio.", - "cmd.otherOptions.toggleAutoUpload": "Sync: Attivare E Disattivare Auto-Caricare Sulla Modifica Delle Impostazioni Di", - "cmd.otherOptions.toggleAutoUpload.off": "Sync: upload Automatico su di Cambiare l'Impostazione Disattivata.", - "cmd.otherOptions.toggleAutoUpload.on": "Sync: upload Automatico su di Cambiare l'Impostazione attivata. Questo avrà effetto dopo il riavvio.", - "cmd.otherOptions.toggleForceDownload": "Sync: Attiva / Disattiva La Forza Scaricare", - "cmd.otherOptions.toggleForceDownload.off": "Sync: Forza Scaricare Spento.", - "cmd.otherOptions.toggleForceDownload.on": "Sync: Forza Scaricare Acceso.", - "cmd.otherOptions.toggleForceUpload": "Sync: Attiva / Disattiva La Forza Di Upload", - "cmd.otherOptions.toggleForceUpload.off": "Sync: Forza Caricare Spento.", - "cmd.otherOptions.toggleForceUpload.on": "Sync: Forza Caricare Acceso.", - "cmd.otherOptions.toggleSummaryPage": "Sync: Attiva / Disattiva La Mostra Pagina Di Riepilogo Su Upload/Download", - "cmd.otherOptions.triggerReset": "Sync: si desidera ripristinare le impostazioni ?", - "cmd.otherOptions.warning.tokenNotRequire": "Sync: Impostazioni di Sincronizzazione non chiedere GitHub Token da ora in poi.", - "cmd.resetSettings.info.resetting": "Sync: Il Ripristino Delle Impostazioni.", - "cmd.resetSettings.info.settingClear": "Sync: Impostazioni Cancellato.", - "cmd.resetSettings.title": "Sync: Ripristina Le Impostazioni Di Estensione", - "cmd.updateSettings.error.gistNotSave": "Sync: GIST NON SALVATI", - "cmd.updateSettings.error.newGistCreateFail": "Sync: Impossibile creare il Gist.", - "cmd.updateSettings.error.readGistFail": "Sync: GIST ID: {0} non RIESCE A LEGGERE.", - "cmd.updateSettings.info.gotLatestVersion": "Sync: Hai già caricato l'ultima versione delle impostazioni salvate.", - "cmd.updateSettings.info.newGistCreated": "Sync: Nuovo gist creato.", - "cmd.updateSettings.info.readding": "Sync: Impostazioni di Lettura e le Estensioni.", - "cmd.updateSettings.info.shareGist": "Sync: Condividere l'Id con altra estensione agli utenti di condividere le impostazioni.", - "cmd.updateSettings.info.uploadCanceled": "Sync: Il Processo Di Caricamento Annullato.", - "cmd.updateSettings.info.uploading": "Sync: Caricamento/Aggiornamento Le Impostazioni In GitHub.", - "cmd.updateSettings.info.uploadingDone": "Sync: Completamento Del Caricamento. GIST ID: {0}. Si prega di copiare e utilizzare l'ID in altre macchine per scaricare le impostazioni.", - "cmd.updateSettings.info.uploadingFile": "Sincronizzare Il Caricamento Di File Di Dati.", - "cmd.updateSettings.info.uploadingSuccess": "Sync: Caricato Con Successo.", - "cmd.updateSettings.title": "Sync: Aggiornamento/Carica Impostazioni", - "cmd.updateSettings.warning.OSNotSupported": "Sync Pragma OS valore di {0} non è supportato in linea di {1}", - "cmd.updateSettings.warning.noToken": "Sync: Set di GitHub Token o disabilita 'downloadPublicGist' locali le impostazioni di Sincronizzazione di file.", - "common.action.donate": "Dona Ora", - "common.action.joinCommunity": "Partecipare Comunità", - "common.action.openExtPage": "Aprire La Pagina Estensione", - "common.action.openExtTutorial": "Aprire Tutorial", - "common.action.releaseNotes": "Note Di Rilascio", - "common.action.support": "Sostenere Questo Progetto", - "common.action.writeReview": "Scrivi La Recensione", - "common.button.no": "No", - "common.button.yes": "Sì", - "common.error.canNotSave": "Sync: Impossibile Salvare le Impostazioni. Si prega di assicurarsi di avere una valida JSON impostazioni.file json. (ad esempio: assenza di virgole finali)", - "common.error.connection": "Sync: Internet Non è Collegato o non è in Grado di Connettersi a GitHub. Eccezione Registrato in Console", - "common.error.gistNotSave": "Sync: Gist Non Salvati.", - "common.error.invalidGistId": "Sync: Invalid Gist Id Inserito. Verificare il succo: https://gist.github.com//.", - "common.error.invalidToken": "Sync: Non Valido O Scaduto GitHub Token. Si prega di generare nuovo token con gli ambiti menzionati nel readme. Eccezione Registrato in Console.", - "common.error.message": "Sync: Errore Registrato In Console (menu Aiuto > Toggle Strumenti di sviluppo).", - "common.error.tokenNotSave": "Sync: Token Non Salvati.", - "common.info.donate": "Sync: ti piace questa estensione? Come circa la scrittura di una recensione o di invio di una donazione? ", - "common.info.excludeFile": "Sync: Si può escludere ogni file/cartella per l'upload e impostazioni per il download.", - "common.info.gistSaved": "Sync: Gist Salvato", - "common.info.initAutoUpload": "Sync: Upload Automatico Di Iniziare A {0} Secondi.", - "common.info.installed": "Sync: le Impostazioni create, la ringrazio per l'installazione!", - "common.info.needHelp": "Sync: Bisogno di Aiuto per configurare questa estensione?", - "common.info.setToken": "Sync: Ora È possibile impostare il GitHub token manualmente nel `syncLocalSettings.json`", - "common.info.tokenSaved": "Sync: Token Salvato", - "common.info.updateTo": "Sync: Aggiornato alla v{0}", - "common.info.updating": "Sync: Aggiornamento In Corso... Attendere Prego.", - "common.placeholder.enterGistId": "Inserisci Il Gist Id", - "common.placeholder.enterGithubAccessToken": "Inserire GitHub Personali Token Di Accesso", - "common.placeholder.multipleGist": "Gist Nome (ad esempio: Impostazioni Personali)", - "common.prompt.enterGistId": "Inserisci il Gist Id precedentemente caricato le impostazioni. È anche possibile impostare manualmente le impostazioni del codice (sync.gist). Premere il tasto [Enter] o il tasto [Esc] per annullare.", - "common.prompt.enterGithubAccessToken": "Puoi anche aggiungere manualmente un token (Cartella Utente/syncLocalSettings.json). Premere il tasto [Enter] o il tasto [Esc] per annullare.", - "common.prompt.gistForceUpload": "Sync: Il caricamento sostituirà le impostazioni in GitHub Gist. Valuta di scaricare le impostazioni o eseguire un caricamento forzato. Vuoi ancora caricare forzatamente?", - "common.prompt.gistNewer": "Sync: Le impostazioni in Gist sono cambiate dall'ultima volta che le hai scaricate. Vuoi caricare comunque le tue impostazioni locali attuali su Gist?", - "common.prompt.multipleGist": "Consente di identificare le impostazioni, se si dispone di più gist.", - "common.prompt.restartCode": "Vuoi ricaricare per applicare le estensioni e le configurazioni?", - "ext.config.autoDownload": "Il Set e ' vero per il Download Automatico le impostazioni del codice di avvio. [Codice Di Riavvio Richiesto]", - "ext.config.autoDownload.name": "Il Download Automatico", - "ext.config.autoUpload": "Impostare la verità Upload Automatico su modifica impostazioni. [Codice Di Riavvio Richiesto]", - "ext.config.autoUpload.name": "Upload Automatico", - "ext.config.forceDownload": "Impostare a true se si desidera scaricare le impostazioni anche quando si hanno le ultime impostazioni.", - "ext.config.forceDownload.name": "Forza Scaricare", - "ext.config.forceUpload": "Impostare a true se si desidera caricare le impostazioni anche quando il GIST impostazioni più recenti.", - "ext.config.forceUpload.name": "Forza Caricare", - "ext.config.gist": "GitHub GIST ID Impostazioni di Sincronizzazione.", - "ext.config.gist.name": "Gist ID", - "ext.config.gist.placeholder": "Inserisci il Gist ID", - "ext.config.host": "Impostare la GitHub Enterprise host se si desidera utilizzare GHE.", - "ext.config.lastDownload": "Impostazioni di Sincronizzazione di download ultima data. Impostare come vuoto se si desidera configurare manualmente colpito il download.", - "ext.config.lastUpload": "Impostazioni di Sincronizzazione ultima data di caricamento. Impostare come vuoto se si desidera configurare manualmente colpito il download.", - "ext.config.pathPrefix": "Impostare la GitHub Enterprise API prefisso, se si desidera utilizzare GHE. Normalmente '/api/v3'. Utilizzato solo quando l'host è impostato.", - "ext.config.quietSync": "Quando è impostato su true, verrà visualizzato il risultato nella barra di stato, invece della pagina di riepilogo.", - "ext.config.quietSync.name": "Tranquilla Sync", - "ext.config.removeExtensions": "Impostare a false se non si desidera rimuovere le estensioni durante il download.", - "ext.config.removeExtensions.name": "Rimuovere Le Estensioni", - "ext.config.syncExtensions": "Impostare a false se non si desidera caricare/scaricare le estensioni.", - "ext.config.syncExtensions.name": "Sincronizzazione Delle Estensioni", - "ext.config.title": "Codice Impostazioni Impostazioni Di Configurazione Di Sincronizzazione", - "ext.globalConfig.askGistDescription.name": "Chiedi Gist Nome", - "ext.globalConfig.autoUploadDelay.name": "Upload Automatico Di Ritardo", - "ext.globalConfig.autoUploadDelay.placeholder": "Immettere il numero di secondi di ritardo di auto-upload", - "ext.globalConfig.downloadPublicGist.name": "Scarica Pubblico Gist", - "ext.globalConfig.gistDescription.name": "Gist Descrizione", - "ext.globalConfig.gistDescription.placeholder": "Inserisci Il Gist Descrizione", - "ext.globalConfig.githubEnterpriseUrl.name": "GitHub Enterprise URL (opzionale)", - "ext.globalConfig.githubEnterpriseUrl.placeholder": "Inserire GitHub Enterprise URL", - "ext.globalConfig.hostName.name": "Hostname (opzionale)", - "ext.globalConfig.hostName.placeholder": "Immettere Il Nome Dell'Host", - "ext.globalConfig.ignoreExtensions.name": "Ignorato Estensioni", - "ext.globalConfig.ignoreExtensions.placeholder": "Inserire un'estensione per linea (cognome e nome)", - "ext.globalConfig.ignoreUploadFiles.name": "File Ignorati", - "ext.globalConfig.ignoreUploadFiles.placeholder": "Inserire un file per riga", - "ext.globalConfig.ignoreUploadFolders.name": "Ignorate Le Cartelle", - "ext.globalConfig.ignoredUploadFolders.placeholder": "Inserire una cartella per ogni linea", - "ext.globalConfig.openTokenLink.name": "Aprire Token Link", - "ext.globalConfig.supportedFileExtensions.name": "Estensioni Di File Supportati", - "ext.globalConfig.supportedFileExtensions.placeholder": "Inserire un file di estensione per linea", - "ext.globalConfig.token.name": "Token Di Accesso", - "ext.globalConfig.token.placeholder": "Inserisci Il Token" -} \ No newline at end of file diff --git a/package.nls.ja.json b/package.nls.ja.json deleted file mode 100644 index b78b00dc..00000000 --- a/package.nls.ja.json +++ /dev/null @@ -1,144 +0,0 @@ -{ - "ext.config.title": "Code Settings Sync の設定", - "ext.config.gist": "Settings Sync で使用する GitHub Gist ID", - "ext.config.lastUpload": "Settings Sync の最新アップロード日。手動でダウンロードする場合は空にしてください", - "ext.config.lastDownload": "Settings Sync の最新ダウンロード日。手動でダウンロードする場合は空にしてください", - "ext.config.autoDownload": "VSCode 起動時に設定を自動でダウンロードします。[VSCode の再起動が必要です]", - "ext.config.autoUpload": "設定変更時に自動でアップロードします。[VSCode の再起動が必要です]", - "ext.config.forceDownload": "最新の設定が既に存在する場合でも強制的に設定をダウンロードします", - "ext.config.forceUpload": "Gist に新しい設定が存在する場合でも強制的に設定をアップロードします", - "ext.config.host": "GHE を使用する場合は GitHub Enterprise のホストを設定してください", - "ext.config.pathPrefix": "GHE を使用する場合は GitHub Enterprise API のプレフィックスを設定してください。通常は '/api/v3' です。ホストが設定されている場合にのみ使用されます", - "ext.config.quietSync": "結果をサマリーページではなくステータスバーに表示します", - "ext.config.removeExtensions": "ダウンロード中に拡張機能を削除します", - "ext.config.syncExtensions": "拡張機能をアップロード・ダウンロードします", - "cmd.howSetting.title": "Sync: Settings Sync の設定方法を参照", - "cmd.updateSettings.title": "Sync: アップデート・アップロードの設定", - "cmd.updateSettings.info.uploading": "Sync: GitHub の設定をアップデート・アップロードしています", - "cmd.updateSettings.info.uploadingFile": "Sync: ファイルのデータをアップロードしています", - "cmd.updateSettings.info.uploadingDone": "Sync: アップロード完了。Gist ID: {0}。設定をダウンロードするには、この ID を他のマシンにコピーして使用してください", - "cmd.updateSettings.info.uploadingSuccess": "Sync: アップロード完了", - "cmd.updateSettings.info.shareGist": "Sync: 設定を他のユーザに共有するには ID を共有してください", - "cmd.updateSettings.info.readding": "Sync: 設定を拡張機能を読み込んでいます", - "cmd.updateSettings.info.uploadCanceled": "Sync: アップロードがキャンセルされました", - "cmd.updateSettings.info.newGistCreated": "Sync: 新規 Gist を作成しました", - "cmd.updateSettings.info.gotLatestVersion": "Sync: 保存済み設定の最新バージョンはすでにアップロードされています。", - "cmd.updateSettings.warning.noToken": "Sync: GitHub トークンを設定するか、ローカルの同期設定ファイルから 'downloadPublicGist' を無効にしてください", - "cmd.updateSettings.warning.OSNotSupported": "Sync: {1} 行目の値 {0} はサポートされていません", - "cmd.updateSettings.error.newGistCreateFail": "Sync: Gist を作成できません", - "cmd.updateSettings.error.readGistFail": "Sync: Gist ID: {0} を読み込めません", - "cmd.updateSettings.error.gistNotSave": "Sync: Gist が保存されていません", - "cmd.downloadSettings.title": "Sync: 設定をダウンロード", - "cmd.downloadSettings.info.downloaded": "Sync: ダウンロードが完了しました", - "cmd.downloadSettings.info.readdingOnline": "Sync: 設定をオンラインから読み込んでいます", - "cmd.downloadSettings.info.gotLatestVersion": "Sync: 既に最新の設定に更新されています", - "cmd.downloadSettings.error.removeExtFail": "Sync: 削除できない拡張機能があります", - "cmd.downloadSettings.error.unableSave": "Sync: 拡張機能の設定ファイルを保存できません", - "cmd.resetSettings.title": "Sync: 拡張機能の設定を初期化", - "cmd.resetSettings.info.resetting": "Sync: 設定をリセットしています", - "cmd.resetSettings.info.settingClear": "Sync: 設定をクリアしました", - "cmd.otherOptions.title": "Sync: 高度なオプション", - "cmd.otherOptions.openSettingsPage": "Sync: 設定を開く", - "cmd.otherOptions.editLocalSetting": "Sync: 拡張機能のローカル設定を編集", - "cmd.otherOptions.shareSetting": "Sync: Public Gist の共有設定", - "cmd.otherOptions.shareSetting.beforeConfirm": "Sync: 現在の Gist が削除され、新規の Public Gist に設定がアップロードされます。続けますか?", - "cmd.otherOptions.downloadSetting": "Sync: Public Gist から設定をダウンロードします", - "cmd.otherOptions.toggleForceDownload": "Sync: 強制ダウンロード機能の切り替え", - "cmd.otherOptions.toggleForceDownload.on": "Sync: 強制的にダウンロードします", - "cmd.otherOptions.toggleForceDownload.off": "Sync: 強制的にダウンロードしません", - "cmd.otherOptions.toggleForceUpload": "Sync: 強制アップロード機能の切り替え", - "cmd.otherOptions.toggleForceUpload.on": "Sync: 強制的にアップロードします", - "cmd.otherOptions.toggleForceUpload.off": "Sync: 強制的にアップロードしません", - "cmd.otherOptions.toggleAutoUpload": "Sync: 設定変更時の自動アップロード機能の切り替え", - "cmd.otherOptions.toggleAutoUpload.on": "Sync: 設定変更時に設定を自動アップロードします。[VSCode の再起動が必要です]", - "cmd.otherOptions.toggleAutoUpload.off": "Sync: 設定変更時に設定を自動アップロードしません", - "cmd.otherOptions.toggleAutoDownload": "Sync: 起動時の自動ダウンロード機能の切り替え", - "cmd.otherOptions.toggleAutoDownload.on": "Sync: VSCode を起動時に設定を自動ダウンロードする", - "cmd.otherOptions.toggleAutoDownload.off": "Sync: VSCode を起動時に設定を自動ダウンロードしない", - "cmd.otherOptions.toggleSummaryPage": "Sync: アップロード・ダウンロード時の概要画面表示の切り替え", - "cmd.otherOptions.preserve": "Sync: ダウンロード後の上書きを禁止する設定を保持する", - "cmd.otherOptions.preserve.placeholder": "Sync: 設定を保持するために settings.json から任意のキーを入力してください", - "cmd.otherOptions.preserve.prompt": "Sync: 例: 'http.proxy' と入力することでこのコンピュータのプロキシを保存して上書きします。空の場合プロキシが削除されます", - "cmd.otherOptions.preserve.info.done1": "Sync: 同期完了。ダウンロード後に {0} の値は settings.json から削除されます", - "cmd.otherOptions.preserve.info.done2": "Sync: 同期完了。ダウンロード後に拡張機能は {0}:{1} を settings.json に保持します", - "cmd.otherOptions.customizedSync": "Sync: カスタム同期ファイルのパスを追加", - "cmd.otherOptions.customizedSync.placeholder": "Sync: 追加でアップロードするファイルの絶対パスを入力してください", - "cmd.otherOptions.customizedSync.prompt": "(例: /path/to/.eslintrc) は指定されたパスにアップロード・ダウンロードされます", - "cmd.otherOptions.customizedSync.done": "Sync: {0} が登録されています", - "cmd.otherOptions.downloadCustomFile": "Sync: カスタム同期ファイルをワークスペースに挿入します", - "cmd.otherOptions.downloadCustomFile.placeholder": "Sync: 作業中のワークスペースのルートにダウンロードするファイルを選択してください", - "cmd.otherOptions.downloadCustomFile.done": "Sync: {0} をダウンロードしました", - "cmd.otherOptions.joinCommunity": "Sync: コミュニティに参加", - "cmd.otherOptions.openIssue": "Sync: Issue を開く", - "cmd.otherOptions.releaseNotes": "Sync: リリースノート", - "cmd.otherOptions.quietSync.on": "Sync: ステータスバーはダウンロード・アップロード時に更新されます.", - "cmd.otherOptions.quietSync.off": "Sync: ダウンロード・アップロード時に概要が表示されます", - "cmd.otherOptions.warning.tokenNotRequire": "Sync: Settings Sync は今後 GitHub トークンを要求しません", - "cmd.otherOptions.error.toggleFail": "Sync: 切り替えができません", - "cmd.otherOptions.triggerReset": "Sync: 設定をリセットしますか?", - "common.info.installed": "Sync: 設定を生成しました。インストールありがとうございます!", - "common.info.needHelp": "Sync: この拡張機能の設定に関するヘルプが必要ですか?", - "common.info.excludeFile": "Sync: 任意のアップロードするのファイル・フォルダとダウンロードする設定を除外", - "common.info.updating": "Sync: アップデート中です。お待ちください", - "common.info.initAutoUpload": "Sync: 自動アップロードは {0} 秒以内に開始されました", - "common.info.setToken": "Sync: 'syncLocalSettings.json' 内で手動で GitHub トークンを設定できます", - "common.info.tokenSaved": "Sync: トークンが保存されました", - "common.info.gistSaved": "Sync: Gist は保存されました", - "common.info.updateTo": "Sync: v{0} にアップデートしました", - "common.info.donate": "Sync: この拡張機能は気に入りましたか?レビューを書いたり寄付を送ったりしませんか?", - "common.error.message": "Sync: コンソールのログインエラー ([ヘルプ] > [開発者ツールの切り替え])", - "common.error.connection": "Sync: インターネットに接続されていないため GitHub に接続できません。コンソールにログが記録されています", - "common.error.canNotSave": "Sync: 設定を保存できません。settings.json が有効であるか確認してください (例: 末尾のカンマは不要です)", - "common.error.invalidToken": "Sync: GitHub トークンは無効または期限切れです。README に記載されているスコープで新規トークンを発行してください。コンソールにログが記録されています", - "common.error.invalidGistId": "Sync: Gist ID が無効です。Gist を確認してください: https://gist.github.com//", - "common.error.tokenNotSave": "Sync: トークンが保存されていません", - "common.error.gistNotSave": "Sync: Gist が保存されていません", - "common.action.openExtPage": "拡張機能のページを開く", - "common.action.openExtTutorial": "ターミナルを開く", - "common.action.releaseNotes": "リリースノート", - "common.action.writeReview": "レビューを書く", - "common.action.support": "このプロジェクトを支援", - "common.action.joinCommunity": "コミュニティに参加する", - "common.action.donate": "寄付する", - "common.placeholder.enterGithubAccessToken": "GitHub Personl Access Token を入力してください", - "common.placeholder.enterGistId": "Gist ID を入力してください", - "common.placeholder.multipleGist": "Gist Name (例: Personal Settings)", - "common.prompt.multipleGist": "Gist が複数ある場合、個別に設定できます", - "common.prompt.enterGistId": "以前にアップロードした設定から Gist ID を入力してください。VSCode Settings (sync.gist) で手動で設定することもできます。キャンセルするには [Enter] または [Esc] キーを押してください", - "common.prompt.enterGithubAccessToken": "手動でトークンを追加することができます (User Folder/syncLocalSettings.json)。キャンセルするには [Enter] または [Esc] キーを押してください", - "common.prompt.restartCode": "拡張機能と設定を適用するためにリロードしますか?", - "common.prompt.gistForceUpload": "Sync: アップロードにより、GitHub Gistの設定が置き換えられます。 設定をダウンロードするか、強制アップロードを行うことを検討してください。 それでも強制的にアップロードしますか?", - "common.prompt.gistNewer": "Sync: Gistの設定は、最後にダウンロードしてから変更されています。 とにかく、現在のローカル設定をGistにアップロードしますか?", - "common.button.no": "番号", - "common.button.yes": "はい", - "ext.globalConfig.token.name": "アクセストークン", - "ext.globalConfig.token.placeholder": "トークンを入力してください", - "ext.globalConfig.githubEnterpriseUrl.name": "GitHub Enterprise の URL (オプション)", - "ext.globalConfig.githubEnterpriseUrl.placeholder": "GitHub Enterprise の URL を入力してください", - "ext.globalConfig.ignoreUploadFolders.name": "フォルダを無視", - "ext.globalConfig.ignoredUploadFolders.placeholder": "1行に1つのフォルダ名を入力してください", - "ext.globalConfig.ignoreExtensions.name": "拡張子を無視", - "ext.globalConfig.ignoreExtensions.placeholder": "1行に1つの拡張機能名をフルネームで入力してください", - "ext.globalConfig.hostName.name": "ホスト名 (オプション)", - "ext.globalConfig.hostName.placeholder": "ホスト名を入力してください", - "ext.globalConfig.ignoreUploadFiles.name": "ファイルを無視", - "ext.globalConfig.ignoreUploadFiles.placeholder": "1行に1つのファイル名を入力してください", - "ext.globalConfig.supportedFileExtensions.name": "サポートされているファイルの拡張子", - "ext.globalConfig.supportedFileExtensions.placeholder": "1行に1つの拡張子を入力してください", - "ext.globalConfig.gistDescription.name": "Gist の説明", - "ext.globalConfig.gistDescription.placeholder": "Gist の説明を入力してください", - "ext.globalConfig.autoUploadDelay.name": "自動アップロードの遅延", - "ext.globalConfig.autoUploadDelay.placeholder": "自動アップロードの遅延時間 (秒) を入力してください", - "ext.globalConfig.askGistDescription.name": "Gist Name の確認", - "ext.globalConfig.downloadPublicGist.name": "公開 Gist のダウンロード", - "ext.globalConfig.openTokenLink.name": "トークンのリンクを開く", - "ext.config.gist.name": "Gist ID", - "ext.config.gist.placeholder": "Gist ID を入力してください", - "ext.config.autoDownload.name": "自動ダウンロード", - "ext.config.autoUpload.name": "自動アップロード", - "ext.config.forceDownload.name": "強制ダウンロード", - "ext.config.forceUpload.name": "強制アップロード", - "ext.config.quietSync.name": "出力抑制同期", - "ext.config.removeExtensions.name": "拡張機能の削除", - "ext.config.syncExtensions.name": "拡張機能の同期" -} diff --git a/package.nls.json b/package.nls.json deleted file mode 100644 index 6d0eea95..00000000 --- a/package.nls.json +++ /dev/null @@ -1,144 +0,0 @@ -{ - "ext.config.title": "Code Settings Sync Configuration Settings", - "ext.config.gist": "GitHub GIST ID for Settings Sync.", - "ext.config.lastUpload": "Settings Sync last upload date. Set it as empty if you want to manually hit download.", - "ext.config.lastDownload": "Settings Sync last download date. Set it as empty if you want to manually hit download.", - "ext.config.autoDownload": "Set it true to Auto Download the settings on code start. [Code Restart Required]", - "ext.config.autoUpload": "Set it true to Auto Upload on the settings change. [Code Restart Required]", - "ext.config.forceDownload": "Set it to true if you want to download the settings even when you have the latest settings.", - "ext.config.forceUpload": "Set it to true if you want to upload the settings even when the GIST has newer settings.", - "ext.config.host": "Set it to your GitHub Enterprise host if you want to use GHE.", - "ext.config.pathPrefix": "Set it to your GitHub Enterprise API prefix if you want to use GHE. Normally '/api/v3'. Only used when host is set.", - "ext.config.quietSync": "When set to true, will show the result in status bar instead of summary page.", - "ext.config.removeExtensions": "Set it to false if you don't want to remove extensions while downloading.", - "ext.config.syncExtensions": "Set it to false if you don't want to upload/download the extensions.", - "cmd.howSetting.title": "Sync: How To Configure", - "cmd.updateSettings.title": "Sync: Update/Upload Settings", - "cmd.updateSettings.info.uploading": "Sync: Uploading/Updating Your Settings In GitHub.", - "cmd.updateSettings.info.uploadingFile": "Sync: Uploading Files Data.", - "cmd.updateSettings.info.uploadingDone": "Sync: Upload Complete. GIST ID: {0}. Please copy and use this ID in other machines to download settings.", - "cmd.updateSettings.info.uploadingSuccess": "Sync: Uploaded Successfully.", - "cmd.updateSettings.info.shareGist": "Sync: Share the Id with other extension users to share the settings.", - "cmd.updateSettings.info.readding": "Sync: Reading Settings and Extensions.", - "cmd.updateSettings.info.uploadCanceled": "Sync: Upload Process Cancelled.", - "cmd.updateSettings.info.newGistCreated": "Sync: New gist created.", - "cmd.updateSettings.info.gotLatestVersion": "Sync: You have already uploaded the latest version of saved settings.", - "cmd.updateSettings.warning.noToken": "Sync: Set GitHub Token or disable 'downloadPublicGist' from local Sync settings file.", - "cmd.updateSettings.warning.OSNotSupported": "Sync Pragma OS value {0} not supported at line {1}", - "cmd.updateSettings.error.newGistCreateFail": "Sync: Unable to create Gist.", - "cmd.updateSettings.error.readGistFail": "Sync: GIST ID: {0} UNABLE TO READ.", - "cmd.updateSettings.error.gistNotSave": "Sync: GIST NOT SAVED", - "cmd.downloadSettings.title": "Sync: Download Settings", - "cmd.downloadSettings.info.downloaded": "Sync: Download Complete.", - "cmd.downloadSettings.info.readdingOnline": "Sync: Reading Settings Online.", - "cmd.downloadSettings.info.gotLatestVersion": "Sync: You already have the latest version of saved settings.", - "cmd.downloadSettings.error.removeExtFail": "Sync: Unable to remove some extensions.", - "cmd.downloadSettings.error.unableSave": "Sync: Unable to save extension settings file.", - "cmd.resetSettings.title": "Sync: Reset Extension Settings", - "cmd.resetSettings.info.resetting": "Sync: Resetting Your Settings.", - "cmd.resetSettings.info.settingClear": "Sync: Settings Cleared.", - "cmd.otherOptions.title": "Sync: Advanced Options", - "cmd.otherOptions.openSettingsPage": "Sync: Open Settings", - "cmd.otherOptions.editLocalSetting": "Sync: Edit Extension Local Settings", - "cmd.otherOptions.shareSetting": "Sync: Share Settings with Public GIST", - "cmd.otherOptions.shareSetting.beforeConfirm": "Sync: This will remove current GIST and upload settings on new public GIST. Do you want to continue?", - "cmd.otherOptions.downloadSetting": "Sync: Download Settings from Public GIST", - "cmd.otherOptions.toggleForceDownload": "Sync: Toggle Force Download", - "cmd.otherOptions.toggleForceDownload.on": "Sync: Force Download Turned On.", - "cmd.otherOptions.toggleForceDownload.off": "Sync: Force Download Turned Off.", - "cmd.otherOptions.toggleForceUpload": "Sync: Toggle Force Upload", - "cmd.otherOptions.toggleForceUpload.on": "Sync: Force Upload Turned On.", - "cmd.otherOptions.toggleForceUpload.off": "Sync: Force Upload Turned Off.", - "cmd.otherOptions.toggleAutoUpload": "Sync: Toggle Auto-Upload On Settings Change", - "cmd.otherOptions.toggleAutoUpload.on": "Sync: Auto upload on Setting Change Turned On. This will take effect after restart.", - "cmd.otherOptions.toggleAutoUpload.off": "Sync: Auto upload on Setting Change Turned Off.", - "cmd.otherOptions.toggleAutoDownload": "Sync: Toggle Auto-Download On Startup", - "cmd.otherOptions.toggleAutoDownload.on": "Sync: Auto Download turned ON upon VSCode Startup.", - "cmd.otherOptions.toggleAutoDownload.off": "Sync: Auto Download turned OFF upon VSCode Startup.", - "cmd.otherOptions.toggleSummaryPage": "Sync: Toggle Show Summary Page On Upload/Download", - "cmd.otherOptions.preserve": "Sync: Preserve Setting To Stop Override After Download", - "cmd.otherOptions.preserve.placeholder": "Enter any Key from settings.json to preserve.", - "cmd.otherOptions.preserve.prompt": "Example: Write 'http.proxy' => store this computer proxy and overwrite it , if set empty it will remove proxy.", - "cmd.otherOptions.preserve.info.done1": "Sync: Done. {0} value will be removed from settings.json after downloading.", - "cmd.otherOptions.preserve.info.done2": "Sync: Done. Extension will keep {0}: {1} in setting.json after downloading.", - "cmd.otherOptions.customizedSync": "Sync: Add Custom Sync File path", - "cmd.otherOptions.customizedSync.placeholder": "Enter an absolute path of the additional uploaded file.", - "cmd.otherOptions.customizedSync.prompt": "(ex. /path/to/.eslintrc) will be uploaded and downloaded to the specified path.", - "cmd.otherOptions.customizedSync.done": "Sync: {0} has been registered.", - "cmd.otherOptions.downloadCustomFile": "Sync: Import Custom Sync File to workspace", - "cmd.otherOptions.downloadCustomFile.placeholder": "Select the file you want to download to the root of the workspace you are working on.", - "cmd.otherOptions.downloadCustomFile.done": "Downloaded {0}.", - "cmd.otherOptions.joinCommunity": "Sync: Join Community", - "cmd.otherOptions.openIssue": "Sync: Open Issue", - "cmd.otherOptions.releaseNotes": "Sync: Release Notes", - "cmd.otherOptions.quietSync.on": "Sync: Status bar will be updated upon download/upload.", - "cmd.otherOptions.quietSync.off": "Sync: Summary will be shown upon download/upload.", - "cmd.otherOptions.warning.tokenNotRequire": "Sync: Settings Sync will not ask for GitHub Token from now on.", - "cmd.otherOptions.error.toggleFail": "Sync: Unable to Toggle.", - "cmd.otherOptions.triggerReset": "Sync: Do you want to reset the settings ?", - "common.info.installed": "Sync: Settings created, thank you for installing!", - "common.info.needHelp": "Sync: Need Help configuring this extension?", - "common.info.excludeFile": "Sync: You can exclude any file/folder for upload and settings for download.", - "common.info.updating": "Sync: Updating In Progress… Please Wait.", - "common.info.initAutoUpload": "Sync: Auto Upload Initiating In {0} Seconds.", - "common.info.setToken": "Sync: Now You can set your GitHub token manually in `syncLocalSettings.json`", - "common.info.tokenSaved": "Sync: Token Saved", - "common.info.gistSaved": "Sync: Gist Saved", - "common.info.updateTo": "Sync: Updated to v{0}", - "common.info.donate": "Sync: Do you like this extension? How about writing a review or sending a donation? ;)", - "common.error.message": "Sync: Error Logged In Console (Help menu > Toggle Developer Tools).", - "common.error.connection": "Sync: Internet Not Connected or Unable to Connect to GitHub. Exception Logged in Console", - "common.error.canNotSave": "Sync: Unable to Save Settings. Please make sure you have valid JSON settings.json file. (e.g.: No trailing commas)", - "common.error.invalidToken": "Sync: Invalid/Expired GitHub Token. Please generate new token with scopes mentioned in readme. Exception Logged in Console.", - "common.error.invalidGistId": "Sync: Invalid Gist Id Entered. Verify your gist: https://gist.github.com//.", - "common.error.tokenNotSave": "Sync: Token Not Saved.", - "common.error.gistNotSave": "Sync: Gist Not Saved.", - "common.action.openExtPage": "Open Extension Page", - "common.action.openExtTutorial": "Open Tutorial", - "common.action.releaseNotes": "Release Notes", - "common.action.writeReview": "Write Review", - "common.action.support": "Support This Project", - "common.action.joinCommunity": "Join Community", - "common.action.donate": "Donate Now", - "common.placeholder.enterGithubAccessToken": "Enter GitHub Personal Access Token", - "common.placeholder.enterGistId": "Enter Gist Id", - "common.placeholder.multipleGist": "Gist Name (e.g.: Personal Settings)", - "common.prompt.multipleGist": "Allows you to identify the settings if you have multiple gist.", - "common.prompt.enterGistId": "Enter Gist Id from previously uploaded settings. You can also set manually in code settings (sync.gist). Press [Enter] or [Esc] to cancel.", - "common.prompt.enterGithubAccessToken": "You also manually add a token (User Folder/syncLocalSettings.json). Press [Enter] or [Esc] to cancel.", - "common.prompt.restartCode": "Do you want to reload to apply extensions and configurations?", - "common.prompt.gistForceUpload": "Sync: The upload will replace the settings in GitHub Gist. Consider downloading the settings or doing a forced upload. Do you still want to upload forcefully?", - "common.prompt.gistNewer": "Sync: The settings in the Gist have changed since you last downloaded them. Do you want to upload your current local settings to the Gist anyway?", - "common.button.no": "No", - "common.button.yes": "Yes", - "ext.globalConfig.token.name": "Access Token", - "ext.globalConfig.token.placeholder": "Enter Token", - "ext.globalConfig.githubEnterpriseUrl.name": "GitHub Enterprise URL (optional)", - "ext.globalConfig.githubEnterpriseUrl.placeholder": "Enter GitHub Enterprise URL", - "ext.globalConfig.ignoreUploadFolders.name": "Ignored Folders", - "ext.globalConfig.ignoredUploadFolders.placeholder": "Enter one folder per line", - "ext.globalConfig.ignoreExtensions.name": "Ignored Extensions", - "ext.globalConfig.ignoreExtensions.placeholder": "Enter one extension per line (full name)", - "ext.globalConfig.hostName.name": "Hostname (optional)", - "ext.globalConfig.hostName.placeholder": "Enter Hostname", - "ext.globalConfig.ignoreUploadFiles.name": "Ignored Files", - "ext.globalConfig.ignoreUploadFiles.placeholder": "Enter one file per line", - "ext.globalConfig.supportedFileExtensions.name": "Supported File Extensions", - "ext.globalConfig.supportedFileExtensions.placeholder": "Enter one file extension per line", - "ext.globalConfig.gistDescription.name": "Gist Description", - "ext.globalConfig.gistDescription.placeholder": "Enter Gist Description", - "ext.globalConfig.autoUploadDelay.name": "Auto Upload Delay", - "ext.globalConfig.autoUploadDelay.placeholder": "Enter the amount of seconds to delay auto-upload", - "ext.globalConfig.askGistDescription.name": "Ask Gist Name", - "ext.globalConfig.downloadPublicGist.name": "Download Public Gist", - "ext.globalConfig.openTokenLink.name": "Open Token Link", - "ext.config.gist.name": "Gist ID", - "ext.config.gist.placeholder": "Enter Gist ID", - "ext.config.autoDownload.name": "Auto Download", - "ext.config.autoUpload.name": "Auto Upload", - "ext.config.forceDownload.name": "Force Download", - "ext.config.forceUpload.name": "Force Upload", - "ext.config.quietSync.name": "Quiet Sync", - "ext.config.removeExtensions.name": "Remove Extensions", - "ext.config.syncExtensions.name": "Sync Extensions" -} diff --git a/package.nls.ko.json b/package.nls.ko.json deleted file mode 100644 index ea264db5..00000000 --- a/package.nls.ko.json +++ /dev/null @@ -1,138 +0,0 @@ -{ - "ext.config.title": "Code Settings Sync 설정", - "ext.config.gist": "Settings Sync에 사용할 GitHub GIST ID.", - "ext.config.lastDownload": "Settings Sync의 마지막 다운로드 날짜입니다. 수동으로 다운받길 원하면 비워두세요.", - "ext.config.lastUpload": "Settings Sync의 마지막 업로드 날짜입니다. 수동으로 다운받길 원하면 비워두세요.", - "ext.config.autoDownload": "VSCode가 실행될 때 설정을 자동으로 다운로드합니다. [코드 재시작 필요]", - "ext.config.autoUpload": "설정이 변경되면 변경된 설정을 자동으로 업로드합니다. [코드 재시작 필요]", - "ext.config.forceDownload": "로컬 설정의 버전에 무관하게 강제로 설정을 다운로드합니다.", - "ext.config.forceUpload": "Gist에 존재하는 설정 버전과 무관하게 강제로 현재 설정을 업로드합니다.", - "ext.config.host": "GHE를 사용하려면 GitHub Enterprise 호스트를 설정하십시오.", - "ext.config.pathPrefix": "GHE를 사용하기 위해서는 GitHub Enterprise API의 접두사가 필요합니다. 일반적으로 '/api/v3'를 사용합니다. 호스트가 설정되어있을 때만 사용됩니다.", - "ext.config.quietSync": "설정시 결과를 알림창 대신 상태바에 표시합니다.", - "ext.config.askGistDescription": "생성시 Gist 이름을 묻습니다. 여러 개의 Gist가 존재할 때 식별에 도움이 됩니다.", - "ext.config.removeExtensions": "동기화 다운로드로 인해 확장(extension)이 삭제되는 걸 막고 싶다면 False로 설정하세요.", - "ext.config.syncExtensions": "만약 확장(extension)이 업로드/다운로드되는 걸 원하지 않으면 False로 설정하세요.", - "cmd.howSetting.title": "Sync: 환경설정 방법", - "cmd.updateSettings.title": "Sync: 업데이트/업로드 설정", - "cmd.updateSettings.info.uploading": "Sync: GitHub에서 설정을 업로드/업데이트하는 중입니다.", - "cmd.updateSettings.info.uploadingFile": "Sync: 파일 데이터를 업로드 중 입니다.", - "cmd.updateSettings.info.uploadingDone": "Sync: 업로드 완료. GIST ID: {0}. 다른 기기에서도 설정을 다운받으려면 이 ID를 복사해서 사용하세요.", - "cmd.updateSettings.info.uploadingSuccess": "Sync: 업로드 완료", - "cmd.updateSettings.info.shareGist": "Sync: ID를 공유하여 다른 확장(extension) 사용자들과 설정을 공유하세요.", - "cmd.updateSettings.info.readding": "Sync: 설정과 확장을 읽고 있습니다.", - "cmd.updateSettings.info.uploadCanceled": "Sync: 업로드 동작이 취소되었습니다.", - "cmd.updateSettings.info.newGistCreated": "Sync: 새로운 Gist가 생성되었습니다.", - "cmd.updateSettings.info.gotLatestVersion": "Sync: 저장된 설정의 최신 버전을 이미 업로드했습니다.", - "cmd.updateSettings.warning.noToken": "Sync: 로컬 설정 동기화 파일에서 'downloadPublicGist'를 끄거나 GitHub 토큰을 설정하세요.", - "cmd.updateSettings.warning.OSNotSupported": "동기화 Pragma 운영체제 값 {0} 는 line {1} 에서 지원되지 않습니다.", - "cmd.updateSettings.error.newGistCreateFail": "Sync: 새로운 Gist 생성에 실패했습니다.", - "cmd.updateSettings.error.readGistFail": "Sync: GIST ID: {0} 읽기에 실패했습니다.", - "cmd.updateSettings.error.gistNotSave": "Sync: Gist가 저장되지 않았습니다.", - "cmd.downloadSettings.title": "Sync: 다운로드 설정", - "cmd.downloadSettings.info.downloaded": "Sync: 다운로드 완료.", - "cmd.downloadSettings.info.readdingOnline": "Sync: 온라인에서 설정을 읽고 있습니다.", - "cmd.downloadSettings.info.gotLatestVersion": "Sync: 로컬 설정이 이미 최신 버전입니다.", - "cmd.downloadSettings.error.removeExtFail": "Sync: 일부 확장(extension)을 제거하는데 실패했습니다.", - "cmd.downloadSettings.error.unableSave": "Sync: 확장(extension) 설정파일을 저장하는데 실패했습니다.", - "cmd.resetSettings.title": "Sync: 설정 초기화", - "cmd.resetSettings.info.resetting": "Sync: 설정을 초기화 중입니다.", - "cmd.resetSettings.info.settingClear": "Sync: 설정이 초기화되었습니다.", - "cmd.otherOptions.title": "Sync: 고급 옵션", - "cmd.otherOptions.openSettingsPage": "Sync: 설정 열기", - "cmd.otherOptions.editLocalSetting": "Sync: 확장(extension)의 로컬 설정 편집하기", - "cmd.otherOptions.shareSetting": "Sync: Public GIST로 설정 공유하기", - "cmd.otherOptions.shareSetting.beforeConfirm": "Sync: 현재 Gist를 삭제하고 새 public Gist에 설정을 업로드합니다. 계속하시겠습니까?", - "cmd.otherOptions.downloadSetting": "Sync: public Gist로부터 설정 다운로드", - "cmd.otherOptions.toggleForceDownload": "Sync: 강제 다운로드 켜기/끄기", - "cmd.otherOptions.toggleForceDownload.on": "Sync: 강제 다운로드 켜기", - "cmd.otherOptions.toggleForceDownload.off": "Sync: 강제 다운로드 끄기", - "cmd.otherOptions.toggleForceUpload": "Sync: 강제 업로드 켜기/끄기", - "cmd.otherOptions.toggleForceUpload.on": "Sync: 강제 업로드 켜기", - "cmd.otherOptions.toggleForceUpload.off": "Sync: 강제 업로드 끄기", - "cmd.otherOptions.toggleAutoUpload": "Sync: 설정이 변경될 때 자동 업로드 켜기/끄기", - "cmd.otherOptions.toggleAutoUpload.on": "Sync: 설정이 변경될 때 자동 업로드하기 켜기. VSCode가 재시작한 뒤에 적용됩니다.", - "cmd.otherOptions.toggleAutoUpload.off": "Sync: 설정이 변경될 때 자동 업로드하기 끄기", - "cmd.otherOptions.toggleAutoDownload": "Sync: VSCode가 시작될 때 자동 다운로드 켜기/끄기", - "cmd.otherOptions.toggleAutoDownload.on": "Sync: VSCode가 시작될 때 자동 다운로드 켜기", - "cmd.otherOptions.toggleAutoDownload.off": "Sync: VSCode가 시작될 때 자동 다운로드 끄기", - "cmd.otherOptions.toggleSummaryPage": "Sync: 업로드/다운로드 시 요약 페이지 표시 켜기/끄기", - "cmd.otherOptions.preserve": "Sync: 다운로드 후 설정을 보호해 덮어쓰기 방지하기", - "cmd.otherOptions.preserve.placeholder": "settings.json를 보호할 암호(key)를 입력하세요.", - "cmd.otherOptions.preserve.prompt": "Example: 'http.proxy' 작성 => 컴퓨터 프록시를 저장 및 덮어씁니다. 비어있으면 프록시가 제거됩니다.", - "cmd.otherOptions.preserve.info.done1": "Sync: 완료. 다운로드 후 {0} 값이 settings.json에서 제거되었습니다.", - "cmd.otherOptions.preserve.info.done2": "Sync: 완료. 다운로드 후 {0}: {1} 는 settings.json에 유지됩니다.", - "cmd.otherOptions.customizedSync": "Sync: 사용자 정의 동기화 파일 추가", - "cmd.otherOptions.customizedSync.placeholder": "추가 업로드 파일의 절대 경로를 입력하십시오.", - "cmd.otherOptions.customizedSync.prompt": "(예: /path/to/.eslintrc)가 업로드되고 지정된 경로로 다운로드될 것입니다.", - "cmd.otherOptions.customizedSync.done": "Sync: {0}가 등록되었습니다.", - "cmd.otherOptions.downloadCustomFile": "Sync: 사용자 정의 동기화 파일을 현재 작업영역에 불러옵니다.", - "cmd.otherOptions.downloadCustomFile.placeholder": "현재 작업영역의 루트(root)에 다운로드 받을 파일을 선택하세요.", - "cmd.otherOptions.downloadCustomFile.done": "{0} 다운로드됨.", - "cmd.otherOptions.joinCommunity": "Sync: 커뮤니티 가입", - "cmd.otherOptions.openIssue": "Sync: 이슈(issue) 열기", - "cmd.otherOptions.releaseNotes": "Sync: 릴리즈 노트", - "cmd.otherOptions.quietSync.on": "Sync: 업/다운로드시 상태바에 표시됩니다.", - "cmd.otherOptions.quietSync.off": "Sync: 업/다운로드시 알림창이 표시됩니다.", - "cmd.otherOptions.warning.tokenNotRequire": "Sync: 이제부터 Settings Sync에서 GitHub 토큰을 묻지 않습니다.", - "cmd.otherOptions.error.toggleFail": "Sync: 설정/해제 할 수 없습니다.", - "cmd.otherOptions.triggerReset": "Sync: 설정을 초기화할까요?", - "common.info.installed": "Sync: 확장이 설치되었습니다. 설치해주셔서 감사합니다!", - "common.info.needHelp": "Sync: 이 확장(extension)을 환경설정하는 데 도움이 필요하십니까?", - "common.info.excludeFile": "Sync: 업/다운로드시 특정 파일 및 폴더를 제외할 수 있습니다.", - "common.info.updating": "Sync: 업데이트 중입니다... 잠시만 기다려주세요.", - "common.info.initAutoUpload": "Sync: {0}초 뒤 자동 업로드가 시작됩니다.", - "common.info.setToken": "Sync: 이제 'syncLocalSetings.json'에서 GitHub 토큰을 수동으로 설정할 수 있습니다.", - "common.info.tokenSaved": "Sync: Token이 저장되었습니다.", - "common.info.gistSaved": "Sync: Gist가 저장되었습니다.", - "common.info.updateTo": "Sync: v{0}로 업데이트 되었습니다.", - "common.info.donate": "Sync: 이 확장(extension)이 마음에 드셨나요? 리뷰를 쓰거나 기부를 해보는 건 어떠세요? ;)", - "common.error.message": "Sync: 콘솔에 오류가 기록되었습니다. (메뉴의 `도움말 > 개발자 도구 설정/해제`에서 볼 수 있습니다.)", - "common.error.connection": "Sync: 인터넷이 연결되지 않았거나 GitHub에 연결할 수 없습니다. 콘솔에 예외(exception)가 기록되었습니다.", - "common.error.canNotSave": "Sync: 설정을 저장할 수 없습니다. settings.json 파일이 유효한 JSON인지 확인해 주세요. (예: 끝에 콤마','가 없는 경우)", - "common.error.invalidToken": "Sync: 유효하지 않거나 만료된 GitHub 토큰입니다. Readme에 언급된 범위에서 새 토큰을 생성해 주세요. 콘솔에 예외(exception)가 기록되었습니다.", - "common.error.invalidGistId": "Sync: 유효하지 않은 Gist Id가 입력되었습니다. 당신의 Gist를 확인해주세요: https://gist.github.com/<당신의_사용자이름>/.", - "common.error.tokenNotSave": "Sync: 토큰이 저장되지 않았습니다.", - "common.error.gistNotSave": "Sync: Gist가 저장되지 않았습니다.", - "common.action.openExtPage": "확장(extension) 페이지 열기", - "common.action.openExtTutorial": "튜토리얼 열기", - "common.action.releaseNotes": "릴리즈 노트", - "common.action.writeReview": "리뷰 작성하기", - "common.action.support": "이 프로젝트 지원하기", - "common.action.joinCommunity": "커뮤니티 참여", - "common.action.donate": "기부하기", - "common.placeholder.enterGithubAccessToken": "GitHub 개인(personal) 액세스 토큰을 입력하세요.", - "common.placeholder.enterGistId": "Gist Id를 입력하세요.", - "common.placeholder.multipleGist": "Gist 이름 (예: 개인 설정)", - "common.prompt.multipleGist": "여러 개의 Gist가 있는 경우, 당신에게 설정을 식별하도록 허용하기", - "common.prompt.enterGistId": "이전에 업로드된 설정으로부터 Gist ID 입력. VSCode설정 중 `sync.gist`에서 수동으로 설정할 수도 있습니다. [Enter]를 누르거나 취소하려면 [Esc]를 누르세요.", - "common.prompt.enterGithubAccessToken": "수동으로 토큰을 추가합니다.(사용자 폴더/syncLocalSettings.json). [Enter]를 누르거나 취소하려면 [Esc]를 누르세요.", - "common.prompt.restartCode": "확장(extensions) 및 구성을 적용하기 위해 VScode를 재시작하시겠습니까?", - "common.prompt.gistForceUpload": "Sync: 업로드하면 GitHub Gist의 설정이 대체됩니다. 설정을 다운로드하거나 강제 업로드를 고려하십시오. 여전히 강제로 업로드 하시겠습니까?", - "common.prompt.gistNewer": "Sync: 마지막으로 다운로드 한 이후 Gist의 설정이 변경되었습니다. 어쨌든 현재 로컬 설정을 Gist에 업로드 하시겠습니까?", - "common.button.no": "아니", - "common.button.yes": "예", - "ext.globalConfig.token.name": "액세스 토큰", - "ext.globalConfig.token.placeholder": "토큰을 입력하세요.", - "ext.globalConfig.githubEnterpriseUrl.name": "GitHub Enterpirse URL(선택사항)", - "ext.globalConfig.githubEnterpriseUrl.placeholder": "GitHub Enterprise URL을 입력하세요", - "ext.globalConfig.ignoreUploadFolders.name": "무시할 폴더", - "ext.globalConfig.ignoredUploadFolders.placeholder": "한 줄에 하나의 폴더를 입력하세요", - "ext.globalConfig.ignoreExtensions.name": "무시할 확장(extension)", - "ext.globalConfig.ignoreExtensions.placeholder": "한 줄에 하나의 확장(extension)을 풀네임으로 입력하세요.", - "ext.globalConfig.hostName.name": "호스트명 (선택사항)", - "ext.globalConfig.hostName.placeholder": "호스트명을 입력하세요", - "ext.globalConfig.ignoreUploadFiles.name": "무시할 파일", - "ext.globalConfig.ignoreUploadFiles.placeholder": "한 줄에 한 파일씩 입력하세요", - "ext.globalConfig.supportedFileExtensions.name": "지원할 파일 확장자", - "ext.globalConfig.supportedFileExtensions.placeholder": "한 줄에 하나의 파일 확장자를 입력하세요", - "ext.globalConfig.gistDescription.name": "Gist 설명", - "ext.globalConfig.gistDescription.placeholder": "Gist 설명을 입력하세요", - "ext.globalConfig.autoUploadDelay.name": "자동 업로드 간격", - "ext.globalConfig.autoUploadDelay.placeholder": "자동 업로드 간격을 초 단위로 입력하세요", - "ext.globalConfig.askGistDescription.name": "Gist 이름", - "ext.globalConfig.downloadPublicGist.name": "public Gist 다운로드", - "ext.globalConfig.openTokenLink.name": "토큰 링크 열기", - "ext.config.gist.name": "Gist ID", - "ext.config.gist.placeholder": "Gist ID를 입력하세요" -} \ No newline at end of file diff --git a/package.nls.pt-br.json b/package.nls.pt-br.json deleted file mode 100644 index 73022592..00000000 --- a/package.nls.pt-br.json +++ /dev/null @@ -1,145 +0,0 @@ -{ - "cmd.downloadSettings.error.removeExtFail": "Sync: não é Possível remover algumas extensões.", - "cmd.downloadSettings.error.unableSave": "Sync: não é Possível salvar as configurações da extensão do arquivo.", - "cmd.downloadSettings.info.downloaded": "Sincronização: Baixar Completo.", - "cmd.downloadSettings.info.gotLatestVersion": "Sincronização: Você já tem a versão mais recente de configurações salvas.", - "cmd.downloadSettings.info.readdingOnline": "Sincronização: Definições De Leitura On-Line.", - "cmd.downloadSettings.title": "Sincronização: Configurações De Download", - "cmd.howSetting.title": "Sincronização: Como Configurar", - "cmd.otherOptions.customizedSync": "Sincronização: Adicionar Sincronização Personalizada caminho do Arquivo", - "cmd.otherOptions.customizedSync.done": "Sincronização: {0} foi registrado.", - "cmd.otherOptions.customizedSync.placeholder": "Inserir um caminho absoluto do adicional arquivo carregado.", - "cmd.otherOptions.customizedSync.prompt": "(ex. /caminho/para/.eslintrc) será carregado e descarregado para o caminho especificado.", - "cmd.otherOptions.downloadCustomFile": "Sincronização: a Importação de Sincronização Personalizada Arquivo de espaço de trabalho", - "cmd.otherOptions.downloadCustomFile.done": "Baixado {0}.", - "cmd.otherOptions.downloadCustomFile.placeholder": "Selecione o arquivo que você deseja transferir para a raiz do espaço de trabalho que você está trabalhando.", - "cmd.otherOptions.downloadSetting": "Sincronização: Configurações de Download de Público ESSÊNCIA", - "cmd.otherOptions.editLocalSetting": "Sincronização: Editar Extensão De Configurações Locais", - "cmd.otherOptions.error.toggleFail": "Sync: não é Possível Alternar.", - "cmd.otherOptions.joinCommunity": "Sincronização: Junte-Se A Comunidade", - "cmd.otherOptions.openIssue": "Sincronização: Questão Aberta", - "cmd.otherOptions.openSettingsPage": "Sincronização: Configuração Abrir", - "cmd.otherOptions.preserve": "Sincronização: Preservar A Configuração Para Parar De Substituição Após O Download", - "cmd.otherOptions.preserve.info.done1": "Sincronização: Feito. {0} valor será removido a partir de definições.json após o download.", - "cmd.otherOptions.preserve.info.done2": "Sincronização: Feito. Extensão irá mantê - {0}: {1} na definição.json após o download.", - "cmd.otherOptions.preserve.placeholder": "Introduzir a Chave de configurações.json para preservar.", - "cmd.otherOptions.preserve.prompt": "Exemplo: Escrever 'http.proxy' => guarde este computador de proxy e substituí-lo , se o conjunto vazio, ele irá remover o proxy.", - "cmd.otherOptions.quietSync.off": "Sincronização: Resumo será mostrado após o download/upload.", - "cmd.otherOptions.quietSync.on": "Sincronização: a barra de Status será atualizada após o download/upload.", - "cmd.otherOptions.releaseNotes": "Sincronização: Notas De Lançamento", - "cmd.otherOptions.shareSetting": "Sincronização: Definições de Partilha com o Público ESSÊNCIA", - "cmd.otherOptions.shareSetting.beforeConfirm": "Sincronização: Isto irá remover a actual ESSÊNCIA e configurações de upload no novo pública ESSÊNCIA. Você deseja continuar?", - "cmd.otherOptions.title": "Sincronização: Opções Avançadas", - "cmd.otherOptions.toggleAutoDownload": "Sincronização: A Alternância De Download Automático Na Inicialização", - "cmd.otherOptions.toggleAutoDownload.off": "Sincronização: Download Automático DESLIGADO após VSCode de Inicialização.", - "cmd.otherOptions.toggleAutoDownload.on": "Sincronização: Download Automático ligado ao VSCode de Inicialização.", - "cmd.otherOptions.toggleAutoUpload": "Sincronização: A Alternância De Auto-Carregamento Sobre A Alteração De Configurações De", - "cmd.otherOptions.toggleAutoUpload.off": "Sincronização: upload Automático na Alteração de Configuração Desligado.", - "cmd.otherOptions.toggleAutoUpload.on": "Sincronização: upload Automático na Alteração de Configuração ativada. Isso terá efeito após a reinicialização.", - "cmd.otherOptions.toggleForceDownload": "Sincronização: A Alternância De Força Download", - "cmd.otherOptions.toggleForceDownload.off": "Sincronização: A Força De Download Desligado.", - "cmd.otherOptions.toggleForceDownload.on": "Sincronização: A Força De Download Ativado.", - "cmd.otherOptions.toggleForceUpload": "Sincronização: A Alternância De Força Upload", - "cmd.otherOptions.toggleForceUpload.off": "Sincronização: A Força De Carregar Desligado.", - "cmd.otherOptions.toggleForceUpload.on": "Sincronização: A Força De Carregar Ativado.", - "cmd.otherOptions.toggleSummaryPage": "Sincronização: A Alternância De Mostrar Página De Resumo De Upload/Download", - "cmd.otherOptions.triggerReset": "Sincronização: você deseja redefinir as configurações ?", - "cmd.otherOptions.warning.tokenNotRequire": "Sincronização: Definições de Sincronização não vai pedir para o GitHub Token a partir de agora.", - "cmd.resetSettings.info.resetting": "Sincronização: Redefinir As Configurações.", - "cmd.resetSettings.info.settingClear": "Sincronização: Definições Limpo.", - "cmd.resetSettings.title": "Sincronização: Redefinir As Configurações De Extensão", - "cmd.updateSettings.error.gistNotSave": "Sincronização: a ESSÊNCIA NÃO SALVO", - "cmd.updateSettings.error.newGistCreateFail": "Sync: não é Possível criar Essência.", - "cmd.updateSettings.error.readGistFail": "Sincronização: a ESSÊNCIA ID: {0} não é POSSÍVEL LER.", - "cmd.updateSettings.info.gotLatestVersion": "Sincronização: Você já fez o upload da versão mais recente das configurações salvas.", - "cmd.updateSettings.info.newGistCreated": "Sincronização: a Nova essência criado.", - "cmd.updateSettings.info.readding": "Sincronização: Definições de Leitura e de Extensões.", - "cmd.updateSettings.info.shareGist": "Sincronização: Compartilhar a Identificação com outra extensão do blog para compartilhar as configurações.", - "cmd.updateSettings.info.uploadCanceled": "Sincronização: O Processo De Carregar Cancelado.", - "cmd.updateSettings.info.uploading": "Sincronização: Uploading/Atualização De Suas Configurações No GitHub.", - "cmd.updateSettings.info.uploadingDone": "Sincronização: A Transferência Concluída. ESSÊNCIA ID: {0}. Por favor, copiar e utilizar este ID de outras máquinas para transferir definições.", - "cmd.updateSettings.info.uploadingFile": "Sincronização: Upload De Arquivos De Dados.", - "cmd.updateSettings.info.uploadingSuccess": "Sincronização: Carregado Com Êxito.", - "cmd.updateSettings.title": "Sincronização: Atualização/Carregar Configurações", - "cmd.updateSettings.warning.OSNotSupported": "Sincronização Pragma OS value {0} não é suportado linha {1}", - "cmd.updateSettings.warning.noToken": "Sincronização: a Definir GitHub Token ou desactivar 'downloadPublicGist' a partir do local de definições de Sincronização de arquivo.", - "common.action.donate": "Doe Agora", - "common.action.joinCommunity": "Participe Da Comunidade", - "common.action.openExtPage": "Abrir Página De Extensão", - "common.action.openExtTutorial": "Abrir Um Tutorial", - "common.action.releaseNotes": "Notas De Lançamento", - "common.action.support": "Apoiar Este Projeto", - "common.action.writeReview": "Escrever Análise", - "common.button.no": "Não", - "common.button.yes": "Sim", - "common.error.canNotSave": "Sync: não é Possível Salvar as Configurações. Por favor, certifique-se de que você tem válidos JSON configurações.json arquivo. (por exemplo: Sem a vírgula decimal)", - "common.error.connection": "Sincronização: a Internet Não está Conectado ou não é Possível Conectar-se para o GitHub. Exceção Registrada no Console", - "common.error.gistNotSave": "Sincronização: A Essência Não Salvos.", - "common.error.invalidGistId": "Sincronização: Erro De Essência De Identificação Inseridos. Verifique a sua essência: https://gist.github.com//.", - "common.error.invalidToken": "Sincronização: Inválido Ou Expirou GitHub Token. Por favor, gerar novo token com âmbitos mencionados no leia-me. Exceção Registrada no Console.", - "common.error.message": "Sincronização: Erro Registrado No Console (menu Ajuda > Alternância de Ferramentas do Desenvolvedor).", - "common.error.tokenNotSave": "Sincronização: Token Não Salvos.", - "common.info.donate": "Sincronização: você gosta de esta extensão? Que tal escrever um comentário ou enviando um donativo? ", - "common.info.excludeFile": "Sincronização: Você pode excluir qualquer arquivo/pasta para carregar e definições para download.", - "common.info.gistSaved": "Sincronização: A Essência Salvo", - "common.info.initAutoUpload": "Sincronização: Upload Automático De Iniciar No {0} Segundos.", - "common.info.installed": "Sincronização: Definições criadas, agradecer a você para instalar!", - "common.info.needHelp": "Sincronização: Precisa de Ajuda para configurar esta extensão?", - "common.info.setToken": "Sincronização: Agora Você pode definir o seu GitHub token manualmente em `syncLocalSettings.json`", - "common.info.tokenSaved": "Sincronização: Token Salvo", - "common.info.updateTo": "Sincronização: Atualizado para v{0}", - "common.info.updating": "Sincronização: A Atualização Em Andamento... Por Favor, Aguarde.", - "common.placeholder.enterGistId": "Digite Essência De Identificação", - "common.placeholder.enterGithubAccessToken": "Introduza O GitHub Pessoal Token De Acesso", - "common.placeholder.multipleGist": "Gist Nome (por exemplo: Definições Pessoais)", - "common.prompt.enterGistId": "Digite Essência Identificação de carregado anteriormente configurações. Você também pode definir manualmente no código (configurações de sincronização.gist). Pressione [Enter] ou a tecla [Esc] para cancelar.", - "common.prompt.enterGithubAccessToken": "Você também adicionar manualmente um token (Pasta de Usuário/syncLocalSettings.json). Pressione [Enter] ou a tecla [Esc] para cancelar.", - "common.prompt.gistForceUpload": "Sincronização: O upload substituirá as configurações no GitHub Gist. Considere baixar as configurações ou fazer um upload forçado. Você ainda deseja fazer o upload com força?", - "common.prompt.gistNewer": "Sincronização: As configurações no Gist foram alteradas desde o último download. Deseja fazer o upload de suas configurações locais atuais para o Gist?", - "common.prompt.multipleGist": "Permite identificar as configurações se você tiver vários essência.", - "common.prompt.restartCode": "Você deseja recarregar para aplicar extensões e configurações?", - "ext.config.autoDownload": "Defina true para Baixar automaticamente as configurações no código de iniciar. [Código Necessário Reiniciar]", - "ext.config.autoDownload.name": "Download Automático", - "ext.config.autoUpload": "Defina true para Carregamento Automático sobre a alteração de definições. [Código Necessário Reiniciar]", - "ext.config.autoUpload.name": "Carregamento Automático", - "ext.config.forceDownload": "Defina para true se deseja baixar as configurações, mesmo quando você tem as últimas definições.", - "ext.config.forceDownload.name": "Força De Download", - "ext.config.forceUpload": "Defina para true se deseja carregar as configurações, mesmo quando a ESSÊNCIA tem configurações mais recentes.", - "ext.config.forceUpload.name": "Força Upload", - "ext.config.gist": "GIST do GitHub IDENTIFICAÇÃO para as Configurações de Sincronização.", - "ext.config.gist.name": "Essência ID", - "ext.config.gist.placeholder": "Digite Essência de IDENTIFICAÇÃO", - "ext.config.host": "Defini-lo para o seu GitHub Empresa de hospedagem se você deseja usar GHE.", - "ext.config.lastDownload": "Definições de Sincronização última data da transferência. Definir como vazio se você deseja manualmente bater download.", - "ext.config.lastUpload": "Definições de Sincronização última data de envio. Definir como vazio se você deseja manualmente bater download.", - "ext.config.pathPrefix": "Defini-lo para o seu GitHub Empresa API prefixo, se você deseja usar GHE. Normalmente '/api/v3'. Usado apenas quando o host é definido.", - "ext.config.quietSync": "Quando definida como true, vai mostrar o resultado na barra de status em vez de página de resumo.", - "ext.config.quietSync.name": "Silencioso De Sincronização", - "ext.config.removeExtensions": "Definido para false se você não deseja remover extensões para download.", - "ext.config.removeExtensions.name": "Remover Extensões De", - "ext.config.syncExtensions": "Definido para false se você não quiser fazer o upload/download de extensões.", - "ext.config.syncExtensions.name": "Sincronização De Extensões", - "ext.config.title": "Código De Definições De Sincronização De Definições De Configuração", - "ext.globalConfig.askGistDescription.name": "Pergunte Gist Nome", - "ext.globalConfig.autoUploadDelay.name": "Upload Automático De Atraso", - "ext.globalConfig.autoUploadDelay.placeholder": "Insira a quantidade de segundos de atraso auto-upload", - "ext.globalConfig.downloadPublicGist.name": "Download Pública Essência", - "ext.globalConfig.gistDescription.name": "Essência Descrição", - "ext.globalConfig.gistDescription.placeholder": "Digite Essência Descrição", - "ext.globalConfig.githubEnterpriseUrl.name": "O GitHub Enterprise URL (opcional)", - "ext.globalConfig.githubEnterpriseUrl.placeholder": "Introduza o GitHub Empresa de URL", - "ext.globalConfig.hostName.name": "Hostname (opcional)", - "ext.globalConfig.hostName.placeholder": "Introduza O Nome De Host", - "ext.globalConfig.ignoreExtensions.name": "Ignorado Extensões", - "ext.globalConfig.ignoreExtensions.placeholder": "Introduza uma extensão por linha (nome completo)", - "ext.globalConfig.ignoreUploadFiles.name": "Arquivos Ignorados", - "ext.globalConfig.ignoreUploadFiles.placeholder": "Inserir um arquivo por linha", - "ext.globalConfig.ignoreUploadFolders.name": "Ignorado Pastas", - "ext.globalConfig.ignoredUploadFolders.placeholder": "Insira uma pasta por linha", - "ext.globalConfig.openTokenLink.name": "Abrir Token Link", - "ext.globalConfig.supportedFileExtensions.name": "Extensões De Arquivo Suportadas", - "ext.globalConfig.supportedFileExtensions.placeholder": "Digite uma extensão de arquivo por linha", - "ext.globalConfig.token.name": "Token De Acesso", - "ext.globalConfig.token.placeholder": "Digite Token" -} - diff --git a/package.nls.ru.json b/package.nls.ru.json deleted file mode 100644 index 7d1c3012..00000000 --- a/package.nls.ru.json +++ /dev/null @@ -1,144 +0,0 @@ -{ - "cmd.downloadSettings.error.removeExtFail": "Sync: Не удалось удалить некоторые расширения.", - "cmd.downloadSettings.error.unableSave": "Sync: Не удалось сохранить файл настроек расширения.", - "cmd.downloadSettings.info.downloaded": "Sync: Загрузка завершена", - "cmd.downloadSettings.info.gotLatestVersion": "Sync: У Вас уже установлена последняя версия сохраненных настроек.", - "cmd.downloadSettings.info.readdingOnline": "Sync: Чтение удаленных настроек.", - "cmd.downloadSettings.title": "Sync: Скачать настройки", - "cmd.howSetting.title": "Sync: Инструкция по настройке", - "cmd.otherOptions.customizedSync": "Sync: Добавить путь для синхронизации файлов", - "cmd.otherOptions.customizedSync.done": "Sync: Файл {0} был зарегистрирован.", - "cmd.otherOptions.customizedSync.placeholder": "Введите абсолютный путь к дополнительно загружаемому файлу.", - "cmd.otherOptions.customizedSync.prompt": "(прим.: /путь/к/.eslintrc) этот файл будет синхронизирован", - "cmd.otherOptions.downloadCustomFile": "Sync: Импортировать другой файл настроек в рабочей области", - "cmd.otherOptions.downloadCustomFile.done": "{0} скачен.", - "cmd.otherOptions.downloadCustomFile.placeholder": "Выберите файл, который Вы хотите скачать в корневой каталог активной рабочей области.", - "cmd.otherOptions.downloadSetting": "Sync: Скачать настройки из публичного Gist", - "cmd.otherOptions.editLocalSetting": "Sync: Редактирование параметров синхронизации на этом устройстве", - "cmd.otherOptions.error.toggleFail": "Sync: Не удалось изменить значение.", - "cmd.otherOptions.joinCommunity": "Присоединиться к сообществу", - "cmd.otherOptions.openIssue": "Sync: Создать issue", - "cmd.otherOptions.openSettingsPage": "Sync: Открыть Параметры", - "cmd.otherOptions.preserve": "Sync: Сохранить локальные значения настроек при скачивании удаленных настроек", - "cmd.otherOptions.preserve.info.done1": "Синхронизации: Готово. {0} значение будет удалено из settings.json после синхронизации.", - "cmd.otherOptions.preserve.info.done2": "Синхронизации: Готово. Будет сохранено {0}: {1} в settings.json после синхронизации.", - "cmd.otherOptions.preserve.placeholder": "Введите ключ из settings.json для сохранения локального значения настройки.", - "cmd.otherOptions.preserve.prompt": "Пример: Введите 'http.proxy' => сохранит локальную настройку прокси при синхронизации.", - "cmd.otherOptions.quietSync.off": "Sync: Результат синхронизации будет показан после завершения операции.", - "cmd.otherOptions.quietSync.on": "Sync: Строка состояния будет обновляться во время синхронизации.", - "cmd.otherOptions.releaseNotes": "Sync: Примечания к выпуску", - "cmd.otherOptions.shareSetting": "Sync: Поделиться настройками при помощи публичного Gist", - "cmd.otherOptions.shareSetting.beforeConfirm": "Sync: Это удалит текущий Gist и загрузит настройки в новый публичный Gist. Вы действительно хотите продолжить?", - "cmd.otherOptions.title": "Sync: Дополнительные Параметры", - "cmd.otherOptions.toggleAutoDownload": "Sync: Вкл./выкл. автоматическое скачивание настроек при загрузке приложения", - "cmd.otherOptions.toggleAutoDownload.off": "Sync: Автоматическое скачивание настроек при запуске VSCode отключено.", - "cmd.otherOptions.toggleAutoDownload.on": "Sync: Автоматическое скачивание настроек при запуске VSCode включено.", - "cmd.otherOptions.toggleAutoUpload": "Sync: Вкл./выкл. автоматическую загрузку настроек при изменении параметров", - "cmd.otherOptions.toggleAutoUpload.off": "Sync: Автоматическая загрузка при изменении параметров отключена.", - "cmd.otherOptions.toggleAutoUpload.on": "Sync: Автоматическая загрузка при изменении параметров включена. Изменения вступят в силу после перезагрузки VSCode.", - "cmd.otherOptions.toggleForceDownload": "Sync: Вкл./выкл. принудительное скачивание настроек", - "cmd.otherOptions.toggleForceDownload.off": "Sync: Принудительное скачивание отключено.", - "cmd.otherOptions.toggleForceDownload.on": "Sync: Принудительное скачивание включено.", - "cmd.otherOptions.toggleForceUpload": "Sync: Вкл./выкл. принудительную загрузку", - "cmd.otherOptions.toggleForceUpload.off": "Sync: Принудительная загрузка отключена.", - "cmd.otherOptions.toggleForceUpload.on": "Sync: Принудительная загрузка включена.", - "cmd.otherOptions.toggleSummaryPage": "Sync: Вкл./выкл. показ страницы результата скачивания/загрузки настроек", - "cmd.otherOptions.triggerReset": "Sync: Сбросить настройки синхронизации?", - "cmd.otherOptions.warning.tokenNotRequire": "Sync: Настройки синхронизации больше не будут требовать токен GitHub.", - "cmd.resetSettings.info.resetting": "Sync: Сброс Настроек.", - "cmd.resetSettings.info.settingClear": "Sync: Настройки Сброшены.", - "cmd.resetSettings.title": "Sync: Сброс настроек синхронизации", - "cmd.updateSettings.error.gistNotSave": "Sync: Gist не сохранен", - "cmd.updateSettings.error.newGistCreateFail": "Sync: Не удалось создать Gist.", - "cmd.updateSettings.error.readGistFail": "Sync: Не удалось прочитать Gist ID {0}.", - "cmd.updateSettings.info.gotLatestVersion": "Sync: Вы уже загрузили последнюю версию сохраненных настроек.", - "cmd.updateSettings.info.newGistCreated": "Sync: Создан новый Gist.", - "cmd.updateSettings.info.readding": "Sync: Чтение настроек и расширений.", - "cmd.updateSettings.info.shareGist": "Sync: Поделиться настройками с другими пользователями расширения, отправив ID.", - "cmd.updateSettings.info.uploadCanceled": "Sync: Загрузка отменена.", - "cmd.updateSettings.info.uploading": "Sync: Загрузка/обновление настроек в GitHub.", - "cmd.updateSettings.info.uploadingDone": "Sync: Загрузка Завершена. Gist ID: {0}. Пожалуйста, скопируйте и используйте этот идентификатор на других устройствах для синхронизации настроек.", - "cmd.updateSettings.info.uploadingFile": "Sync: Загрузка файлов данных.", - "cmd.updateSettings.info.uploadingSuccess": "Sync: Успешная загрузка.", - "cmd.updateSettings.title": "Sync: Загрузить/обновить настройки.", - "cmd.updateSettings.warning.OSNotSupported": "Sync: Значение Pragma OS {0} в строке {1} не поддерживается", - "cmd.updateSettings.warning.noToken": "Sync: Введите токен GitHub или отключите настройку 'downloadPublicGist' в настройках.", - "common.action.donate": "Пожертвовать", - "common.action.joinCommunity": "Присоединяйтесь к сообществу", - "common.action.openExtPage": "Открыть страницу расширения", - "common.action.openExtTutorial": "Открыть руководство пользователя", - "common.action.releaseNotes": "Информация о выпуске", - "common.action.support": "Поддержать проект", - "common.action.writeReview": "Написать отзыв", - "common.button.no": "нет", - "common.button.yes": "Да", - "common.error.canNotSave": "Sync: Не удалось сохранить настройки. Пожалуйста, убедитесь в корректности файла `settings.json`. (Например, проверьте на отсутствие завершающих запятых)", - "common.error.connection": "Sync: Интернет не подключен или невозможно подключиться к GitHub. Ошибка выведена в консоль", - "common.error.gistNotSave": "Sync: Gist не сохранен.", - "common.error.invalidGistId": "Sync: Введен некорректный Gist ID. Проверьте Ваш Gist на https://gist.github.com/<имя_пользователя>/.", - "common.error.invalidToken": "Sync: Некорректный или недействительный токен GitHub. Пожалуйста, создайте новый токен с правами доступа, перечисленными в README. Ошибка выведена в консоль.", - "common.error.message": "Sync: Ошибка выведена в консоль (Справка > Показать/скрыть средства разработчика).", - "common.error.tokenNotSave": "Sync: Токен не сохранён.", - "common.info.donate": "Sync: Нравится расширение? Как насчет оставить отзыв или отправить пожертвование?", - "common.info.excludeFile": "Sync: Вы можете исключить любой файл/папку из загрузки и настроек для скачивания", - "common.info.gistSaved": "Sync: Gist сохранен", - "common.info.initAutoUpload": "Sync: Автоматическая загрузка начнется через {0} секунд.", - "common.info.installed": "Sync: Настройки созданы, спасибо за установку расширения!", - "common.info.needHelp": "Sync: Нужна помощь в настройке расширения?", - "common.info.setToken": "Sync: Теперь Вы можете вручную установить Ваш токен GitHub в `syncLocalSettings.json`", - "common.info.tokenSaved": "Sync: Токен сохранен", - "common.info.updateTo": "Sync: Обновлено до v{0}", - "common.info.updating": "Sync: Обновление В Процессе... Пожалуйста, Подождите.", - "common.placeholder.enterGistId": "Введите Gist ID", - "common.placeholder.enterGithubAccessToken": "Введите токен GitHub", - "common.placeholder.multipleGist": "Имя Gist (Например: Personal Settings)", - "common.prompt.enterGistId": "Введите Gist ID от ранее сохраненных настроек. Вы также можете вручную задать его в параметрах (sync.gist). Нажмите [Enter] или [Esc] для отмены.", - "common.prompt.enterGithubAccessToken": "Вы также можете вручную добавить токен (User Folder/syncLocalSettings.json). Нажмите [Enter] или [Esc] для отмены.", - "common.prompt.gistForceUpload": "Sync: Загрузка заменит настройки в GitHub Gist. Попробуйте загрузить настройки или выполнить принудительную загрузку. Вы все еще хотите загружать принудительно?", - "common.prompt.gistNewer": "Sync: Настройки в Gist изменились с момента их последней загрузки. Вы хотите загрузить текущие локальные настройки в Gist?", - "common.prompt.multipleGist": "Поможет определить настройки если Вы используете несколько репозиториев для сохранения настроек.", - "common.prompt.restartCode": "Перезагрузить VSCode для применения расширений и параметров?", - "ext.config.autoDownload": "Установите значение true для автоматической загрузки настроек при запуске приложения. [Требуется перезагрузка VSCode]", - "ext.config.autoDownload.name": "Автоматическое скачивание", - "ext.config.autoUpload": "Установите значение true для автоматической загрузки при изменении параметров. [Требуется перезагрузка VSCode]", - "ext.config.autoUpload.name": "Автоматическая загрузка", - "ext.config.forceDownload": "Установите значение true, для принудительного скачивания настроек (локальные настройки будут перезаписаны даже если у вас более новая версия настроек).", - "ext.config.forceDownload.name": "Принудительное скачивание", - "ext.config.forceUpload": "Установите значение true для загрузки настроек, даже если Gist содержит более новые настройки (удаленные настройки будут перезаписаны даже если там содержится более новая версия настроек).", - "ext.config.forceUpload.name": "Принудительная загрузка", - "ext.config.gist": "GitHub Gist ID для сохранения настроек синхронизации.", - "ext.config.gist.name": "Gist ID", - "ext.config.gist.placeholder": "Введите Gist ID", - "ext.config.host": "Введите адрес Вашего домена GitHub Enterprise для использования GHE.", - "ext.config.lastDownload": "Дата последнего скачивания настроек. Установить пустое значение для скачивания настроек вручную.", - "ext.config.lastUpload": "Дата последней загрузки настроек. Установить пустое значение для скачивания настроек вручную.", - "ext.config.pathPrefix": "Установите префикс Вашего GitHub Enterprise API для работы с GHE. Обычно '/api/v3'. Используется только если введен домен GitHub Enterprise.", - "ext.config.quietSync": "Установите значение true для показа результата в строке состояния вместо страницы.", - "ext.config.quietSync.name": "\"Тихая\" синхронизация", - "ext.config.removeExtensions": "Установите значение false, если вы не хотите, чтобы расширения удалялись во время скачивания настроек.", - "ext.config.removeExtensions.name": "Удалить расширения", - "ext.config.syncExtensions": "Установите значение true для синхронизации расширений.", - "ext.config.syncExtensions.name": "Синхронизация расширений", - "ext.config.title": "Настройки расширения Code Settings Sync", - "ext.globalConfig.askGistDescription.name": "Задать имя Gist", - "ext.globalConfig.autoUploadDelay.name": "Задержка перед автозагрузкой", - "ext.globalConfig.autoUploadDelay.placeholder": "Введите количество секунд для задержки перед автозагрузкой", - "ext.globalConfig.downloadPublicGist.name": "Скачать настройки из публичного Gist", - "ext.globalConfig.gistDescription.name": "Описание Gist", - "ext.globalConfig.gistDescription.placeholder": "Введите описание Gist", - "ext.globalConfig.githubEnterpriseUrl.name": "Домен GitHub Enterprise (не обязательно)", - "ext.globalConfig.githubEnterpriseUrl.placeholder": "Введите домен GitHub Enterprise", - "ext.globalConfig.hostName.name": "Hostname (необязательно)", - "ext.globalConfig.hostName.placeholder": "Введите hostname", - "ext.globalConfig.ignoreExtensions.name": "Игнорируемые расширения", - "ext.globalConfig.ignoreExtensions.placeholder": "Введите одно расширение на строку (полное название)", - "ext.globalConfig.ignoreUploadFiles.name": "Игнорируемые файлы", - "ext.globalConfig.ignoreUploadFiles.placeholder": "Введите один файл на строку", - "ext.globalConfig.ignoreUploadFolders.name": "Игнорируемые папки", - "ext.globalConfig.ignoredUploadFolders.placeholder": "Введите по одной папке на строку", - "ext.globalConfig.openTokenLink.name": "Open Token Link", - "ext.globalConfig.supportedFileExtensions.name": "Поддерживаемые расширения файлов", - "ext.globalConfig.supportedFileExtensions.placeholder": "Введите расширение файла на строку", - "ext.globalConfig.token.name": "Токен доступа", - "ext.globalConfig.token.placeholder": "Введите Токен" -} \ No newline at end of file diff --git a/package.nls.tr.json b/package.nls.tr.json deleted file mode 100644 index df08e488..00000000 --- a/package.nls.tr.json +++ /dev/null @@ -1,144 +0,0 @@ -{ - "cmd.downloadSettings.error.removeExtFail": "Bazı uzantıları kaldırmak Mümkün Sync.", - "cmd.downloadSettings.error.unableSave": "Uzantı ayarları dosyası kaydedilemedi çeviri:.", - "cmd.downloadSettings.info.downloaded": "Çeviri: İndirme Tamamlandı.", - "cmd.downloadSettings.info.gotLatestVersion": "Çeviri: önceden kaydedilmiş ayarları en son sürümü.", - "cmd.downloadSettings.info.readdingOnline": "Çeviri: Okuma Ayarları Çevrimiçi.", - "cmd.downloadSettings.title": "Çeviri: İndirme Ayarları", - "cmd.howSetting.title": "Yapılandırma Sync: ", - "cmd.otherOptions.customizedSync": "Sync: Sync Add Özel Dosya yolu", - "cmd.otherOptions.customizedSync.done": "{0} çeviri: kayıtlı.", - "cmd.otherOptions.customizedSync.placeholder": "Ek yüklenen dosyanın mutlak bir yol girin.", - "cmd.otherOptions.customizedSync.prompt": "(ex. ///yolu.eslintrc) yüklenen ve belirtilen yol yüklenir.", - "cmd.otherOptions.downloadCustomFile": "Çeviri: Al Özel Senkron çalışma alanı Dosyası ", - "cmd.otherOptions.downloadCustomFile.done": "{0} indirilmiş.", - "cmd.otherOptions.downloadCustomFile.placeholder": "Üzerinde çalıştığınız çalışma alanı köküne indirmek istediğiniz dosyayı seçin.", - "cmd.otherOptions.downloadSetting": "Kamu ÖZÜ senkronizasyon: İndirme Ayarları ", - "cmd.otherOptions.editLocalSetting": "Çeviri: Düzenleme Uzantısı Yerel Ayarları", - "cmd.otherOptions.error.toggleFail": "Geçiş Yapılamıyor çeviri:.", - "cmd.otherOptions.joinCommunity": "Çeviri: Katılmak Topluluk", - "cmd.otherOptions.openIssue": "Sync: Açık Sorunu", - "cmd.otherOptions.openSettingsPage": "Sync: Açık Ayarları", - "cmd.otherOptions.preserve": "Geçersiz Durdurmak İçin Ayar İndirildikten Sonra Korumak Çeviri: ", - "cmd.otherOptions.preserve.info.done1": "Çeviri: Bitti. {0} değerini ayarlar silinecektir.indirdikten sonra json.", - "cmd.otherOptions.preserve.info.done2": "Çeviri: Bitti. Uzantısı {1} {0}: ortamda devam edecektir.indirdikten sonra json.", - "cmd.otherOptions.preserve.placeholder": "Ayarlardan herhangi bir Tuşa basın.json korumak için.", - "cmd.otherOptions.preserve.prompt": "Örnek: http Yazın.proxy' => deposu bu bilgisayara proxy ve bunun üzerine , eğer boş küme proxy kaldıracaktır.", - "cmd.otherOptions.quietSync.off": "Çeviri: Özet download/upload üzerine gösterilecektir.", - "cmd.otherOptions.quietSync.on": "Çeviri: Durum Çubuğu yükleme indirme üzerine güncellenecektir.", - "cmd.otherOptions.releaseNotes": "Çeviri: Sürüm Notları", - "cmd.otherOptions.shareSetting": "Kamu ÖZÜ ile senkronizasyon: Paylaşım Ayarları ", - "cmd.otherOptions.shareSetting.beforeConfirm": "Sync: Bu yeni ortak KONUSUNU güncel KONUSUNU ve yükleme ayarları kaldıracaktır. Devam etmek istiyor musunuz?", - "cmd.otherOptions.title": "Çeviri: Gelişmiş Seçenekler", - "cmd.otherOptions.toggleAutoDownload": "Başlangıç Sync: Otomatik Aç / Kapat-Download ", - "cmd.otherOptions.toggleAutoDownload.off": "Sync: Otomatik İndirme VSCode Başlangıçta KAPALI.", - "cmd.otherOptions.toggleAutoDownload.on": "Sync: Otomatik İndirme VSCode Başlangıçta açık.", - "cmd.otherOptions.toggleAutoUpload": "Ayarlar Senkronizasyon: Otomatik Aç / Kapat-Upload Değiştirin", - "cmd.otherOptions.toggleAutoUpload.off": "Değiştirme Ayarı senkronizasyon: Otomatik Yükleme Kapalı.", - "cmd.otherOptions.toggleAutoUpload.on": "Değiştirme Ayarı senkronizasyon: Otomatik Yükleme Açık. Bu yeniden başlatma sonra yürürlüğe girecek.", - "cmd.otherOptions.toggleForceDownload": "Çeviri: Geçiş Güç İndir", - "cmd.otherOptions.toggleForceDownload.off": "Çeviri: Force Download Kapalı.", - "cmd.otherOptions.toggleForceDownload.on": "Çeviri: Force Download Açık.", - "cmd.otherOptions.toggleForceUpload": "Çeviri: Geçiş Güç Yüklemek", - "cmd.otherOptions.toggleForceUpload.off": "Çeviri: Force Upload Kapattı.", - "cmd.otherOptions.toggleForceUpload.on": "Çeviri: Force Upload Açık.", - "cmd.otherOptions.toggleSummaryPage": "Yükleme/İndirme Sync: * Toggle Özet Sayfası ", - "cmd.otherOptions.triggerReset": "Çeviri: ayarları sıfırlamak istiyor Musunuz ?", - "cmd.otherOptions.warning.tokenNotRequire": "Sync: Sync GitHub Ayarları Simge için artık sormayacağım.", - "cmd.resetSettings.info.resetting": "Çeviri: Ayarlarınız Sıfırlanıyor.", - "cmd.resetSettings.info.settingClear": "Çeviri: Ayarlar Temizlenir.", - "cmd.resetSettings.title": "Çeviri: Sıfırlama Uzatma Ayarları", - "cmd.updateSettings.error.gistNotSave": "Çeviri: ÖZÜ KAYITLI DEĞİL ", - "cmd.updateSettings.error.newGistCreateFail": "Konusunu oluşturulamadı çeviri:.", - "cmd.updateSettings.error.readGistFail": "OKUMAK İÇİN {0} MÜMKÜN çeviren: ESAS NUMARASI:.", - "cmd.updateSettings.info.gotLatestVersion": "Çeviri: Kayıtlı ayarların en son sürümünü zaten yüklediniz.", - "cmd.updateSettings.info.newGistCreated": "Oluşturulan Sync: Yeni fikri.", - "cmd.updateSettings.info.readding": "Çeviri: Okuma Ayarları ve Uzantıları.", - "cmd.updateSettings.info.shareGist": "Sync: diğer abone ile ayarları paylaşmak Kimliği Paylaşımı.", - "cmd.updateSettings.info.uploadCanceled": "İptal Çeviren: Yükleme İşlemi.", - "cmd.updateSettings.info.uploading": "Çeviri: Yükleme/GitHub Ayarlarını Güncelleme.", - "cmd.updateSettings.info.uploadingDone": "Çeviri: Tam Karşıya. {0} KONUSUNU ID:. Lütfen kopyalayın ve ayarları indirmek için diğer makinelerde bu KİMLİĞİ kullanın.", - "cmd.updateSettings.info.uploadingFile": "Senkron: Veri Dosyaları Yüklemek.", - "cmd.updateSettings.info.uploadingSuccess": "Başarıyla Yüklendi Çeviri:.", - "cmd.updateSettings.title": "Çeviri: Güncelleme/Yükleme Ayarları", - "cmd.updateSettings.warning.OSNotSupported": "{0} Sync Pragma OS değeri {1}satırında desteklenmeyen ", - "cmd.updateSettings.warning.noToken": "Yerel Senkronizasyon ayarları senkronizasyon: Set GitHub Token veya devre dışı bırak 'downloadPublicGist' dosyası.", - "common.action.donate": "Şimdi Bağış ", - "common.action.joinCommunity": "Topluluğuna Katılın ", - "common.action.openExtPage": "Açık Uzatma Sayfa", - "common.action.openExtTutorial": "Açık Öğretici", - "common.action.releaseNotes": "Sürüm Notları", - "common.action.support": "Destek Bu Proje", - "common.action.writeReview": "Gözden Geçirme ", - "common.button.no": "Hayır", - "common.button.yes": "Evet", - "common.error.canNotSave": "Ayarlar kaydedilemedi çeviri:. Geçerli JSON ayarları olduğundan emin olun lütfen.json dosyası. (örn: sondaki virgül)", - "common.error.connection": "GitHub Bağlanmak için Bağlı ya da Yapamaz Sync: İnternet Değil. Özel durum Konsolunda Oturum ", - "common.error.gistNotSave": "Kaydedilen Çeviri: Özü.", - "common.error.invalidGistId": "Çeviri: Geçersiz Özü Kimliği Girdi. Özetle sizin: https://gist.github.com//doğrulayın.", - "common.error.invalidToken": "Çeviri: Geçersiz/GitHub Token Sona Erdi. Readme belirtilen kapsam ile yeni bir belirteç oluşturmak lütfen. Özel durum Konsolunda Oturum.", - "common.error.message": "Çeviri: Hata (menü > Değiştir Geliştirici Araçları Yardım) Konsol giriş yapmış.", - "common.error.tokenNotSave": "Kayıtlı Değil Token Sync.", - "common.info.donate": "Çeviri: bu uzantı sever misiniz? Hakkında bir inceleme yazmak ya da bir bağış göndermek nasıl? ", - "common.info.excludeFile": "Yükleme ve indirme için ayarları için herhangi bir dosya/klasör hariç tutabilirsiniz çeviri:.", - "common.info.gistSaved": "Çeviri: Özü Kurtardı", - "common.info.initAutoUpload": "{0} Saniye Başlatan Sync: Otomatik Yükleme.", - "common.info.installed": "Oluşturulan çeviri: Ayarlar, yükleme için teşekkürler!", - "common.info.needHelp": "Sync: bu uzantı yapılandırma konusunda Yardıma mı İhtiyacınız var?", - "common.info.setToken": "Çeviri: Şimdi GitHub elle syncLocalSettings olarak `simge ayarlayabilirsiniz.json`", - "common.info.tokenSaved": "Çeviri: Simge Kurtardı", - "common.info.updateTo": "{0}v için Güncelleme Sync: ", - "common.info.updating": "Çeviri: İlerleme Güncelleme... Lütfen Bekleyin.", - "common.placeholder.enterGistId": "Konusunu Kimliği Girin ", - "common.placeholder.enterGithubAccessToken": "Token GitHub Kişisel Erişim Girin ", - "common.placeholder.multipleGist": "Esas Adı (örneğin: Kişisel Ayarlar)", - "common.prompt.enterGistId": "Önceden yüklenmiş ayarları Konusunu Kimliğini girin. Ayrıca el ile kod ayarları (eşitleme ayarlayabilirsiniz.özü). Basın [Enter] veya [Esc] iptal etmek için.", - "common.prompt.enterGithubAccessToken": "Ayrıca el/syncLocalSettings Klasör belirteci (bir Kullanıcı ekleyin.json). Basın [Enter] veya [Esc] iptal etmek için.", - "common.prompt.gistForceUpload": "Çeviri: TYükleme GitHub Gist'teki ayarları değiştirecek. Ayarları indirmeyi veya zorunlu bir yükleme yapmayı düşünün. Hala zorla yüklemek istiyor musunuz?", - "common.prompt.gistNewer": "Çeviri: Gist'teki ayarlar, en son indirdiğinizden bu yana değişti. Mevcut yerel ayarlarınızı yine de Gist’e yüklemek ister misiniz?", - "common.prompt.multipleGist": "Birden çok fikri varsa ayarları belirlemenizi sağlar.", - "common.prompt.restartCode": "Uzantıları ve yapılandırmaları uygulamak için yeniden yüklemek ister misiniz?", - "ext.config.autoDownload": "Ayarlamak true Otomatik kod başlangıç ayarları İndirmek. [Kod Yeniden Başlatma Gerekli]", - "ext.config.autoDownload.name": "Otomatik İndirme", - "ext.config.autoUpload": "Doğru ayarları değiştir Yükleme Otomatik olarak ayarlayın. [Kod Yeniden Başlatma Gerekli]", - "ext.config.autoUpload.name": "Otomatik Yükle", - "ext.config.forceDownload": "Eğer en son ayarlar varsa bile ayarları indirmek istiyorsanız true olarak ayarlayın.", - "ext.config.forceDownload.name": "Kuvvet İndir", - "ext.config.forceUpload": "Eğer ÖZÜ yeni ayarları olsa bile ayarları yüklemek istiyorsanız true olarak ayarlayın.", - "ext.config.forceUpload.name": "Güç Yükleme", - "ext.config.gist": "Ayarları Eşitlemek için GitHub KONUSUNU KİMLİĞİ.", - "ext.config.gist.name": "Konusunu KİMLİĞİ", - "ext.config.gist.placeholder": "Konusunu KİMLİĞİ girin ", - "ext.config.host": "Eğer GHE kullanmak istiyorsanız GitHub Enterprise ev sahibi olarak ayarlayın.", - "ext.config.lastDownload": "Ayarları son indirme tarihi Sync. El ile karşıdan vurmak istiyorsan boş olarak ayarlayın.", - "ext.config.lastUpload": "Ayarları son yükleme tarihi Sync. El ile karşıdan vurmak istiyorsan boş olarak ayarlayın.", - "ext.config.pathPrefix": "Eğer GHE kullanmak istiyorsanız GitHub Enterprise API önek ayarlayın. Normalde '/api/v3. Ana ayarlandığında yalnızca kullanılır.", - "ext.config.quietSync": "True olarak ayarlandığında, bunun yerine sayfa sayfa durum çubuğunda sonucu gösterir.", - "ext.config.quietSync.name": "Sessiz Sync", - "ext.config.removeExtensions": "Eğer indirirken uzantıları kaldırmak istemiyorsanız false olarak ayarlayın.", - "ext.config.removeExtensions.name": "Uzantıları Kaldırmak ", - "ext.config.syncExtensions": "Eğer/uzantıları karşıdan yüklemek istemiyorsan false olarak ayarlayın.", - "ext.config.syncExtensions.name": "Sync Uzantıları", - "ext.config.title": "Kod Ayarları Eşitleme Yapılandırma Ayarları", - "ext.globalConfig.askGistDescription.name": "Özü Adını Sor ", - "ext.globalConfig.autoUploadDelay.name": "Otomatik Yükleme Gecikme", - "ext.globalConfig.autoUploadDelay.placeholder": "Otomatik gecikme için upload saniye miktarını girin", - "ext.globalConfig.downloadPublicGist.name": "İndir Kamu Özü", - "ext.globalConfig.gistDescription.name": "Özetle Açıklama", - "ext.globalConfig.gistDescription.placeholder": "Özetle Açıklama Girin ", - "ext.globalConfig.githubEnterpriseUrl.name": "(İsteğe bağlı)GitHub Enterprise URL ", - "ext.globalConfig.githubEnterpriseUrl.placeholder": "GitHub Enterprise URL girin ", - "ext.globalConfig.hostName.name": "Ana bilgisayar adı (isteğe bağlı)", - "ext.globalConfig.hostName.placeholder": "Makine Adını Girin ", - "ext.globalConfig.ignoreExtensions.name": "Göz Ardı Uzantıları", - "ext.globalConfig.ignoreExtensions.placeholder": "(Tam adı)satır başına bir uzantısı girin ", - "ext.globalConfig.ignoreUploadFiles.name": "Yoksayılan Dosyaları", - "ext.globalConfig.ignoreUploadFiles.placeholder": "Satır başına bir dosya girin ", - "ext.globalConfig.ignoreUploadFolders.name": "Göz Ardı Klasörler", - "ext.globalConfig.ignoredUploadFolders.placeholder": "Satır başına bir klasör girin ", - "ext.globalConfig.openTokenLink.name": "Açık Token Linki", - "ext.globalConfig.supportedFileExtensions.name": "Desteklenen Dosya Uzantıları", - "ext.globalConfig.supportedFileExtensions.placeholder": "Satır başına bir dosya uzantısı girin ", - "ext.globalConfig.token.name": "Erişim Belirteci", - "ext.globalConfig.token.placeholder": "Token Girin " -} \ No newline at end of file diff --git a/package.nls.zh-cn.json b/package.nls.zh-cn.json deleted file mode 100644 index 16dc0c34..00000000 --- a/package.nls.zh-cn.json +++ /dev/null @@ -1,144 +0,0 @@ -{ - "cmd.downloadSettings.error.removeExtFail": "Sync: 不能移除一些扩展", - "cmd.downloadSettings.error.unableSave": "Sync: 无法保存扩展配置文件。", - "cmd.downloadSettings.info.downloaded": "Sync: 下载完成。", - "cmd.downloadSettings.info.gotLatestVersion": "Sync: 你已经应用了最新版本的配置", - "cmd.downloadSettings.info.readdingOnline": "Sync: 正在读取远程设置。", - "cmd.downloadSettings.title": "Sync: 下载配置", - "cmd.howSetting.title": "Sync: 如何配置", - "cmd.otherOptions.customizedSync": "Sync: 添加自定义的文件同步路径", - "cmd.otherOptions.customizedSync.done": "Sync: {0} 已经被注册。", - "cmd.otherOptions.customizedSync.placeholder": "输入额外上传文件的绝对路径。", - "cmd.otherOptions.customizedSync.prompt": "(例如 /path/to/.eslintrc) 将被上传和下载到指定的路径。", - "cmd.otherOptions.downloadCustomFile": "Sync: 导入自定义同步文件到工作区", - "cmd.otherOptions.downloadCustomFile.done": "{0} 下载完成。", - "cmd.otherOptions.downloadCustomFile.placeholder": "选择你想要的文件下载到你正在使用的工作空间的根目录下。", - "cmd.otherOptions.downloadSetting": "Sync: 从公开 Gist 下载配置", - "cmd.otherOptions.editLocalSetting": "Sync: 编辑扩展本地设置", - "cmd.otherOptions.error.toggleFail": "Sync: 无法切换。", - "cmd.otherOptions.joinCommunity": "Sync: 加入社区", - "cmd.otherOptions.openIssue": "Sync: 打开 Issue", - "cmd.otherOptions.openSettingsPage": "Sync: 打开设置", - "cmd.otherOptions.preserve": "Sync: 防止配置在下载后覆盖", - "cmd.otherOptions.preserve.info.done1": "Sync: 完成。下载完成后将从 setting.json 中删除 {0}", - "cmd.otherOptions.preserve.info.done2": "Sync: 完成。下载完成后扩展将在 settings.json 中保留 {0}:{1} 。", - "cmd.otherOptions.preserve.placeholder": "输入 settings.json 中的任意字段以保留", - "cmd.otherOptions.preserve.prompt": "例如:输入 'http.proxy' => 在本机存储该配置,并覆盖同步后的配置。如果设置为空,则会移除同步后配置中的这一字段。", - "cmd.otherOptions.quietSync.off": "Sync: 将在上传或下载时显示摘要。", - "cmd.otherOptions.quietSync.on": "Sync: 将在上传或下载后更新状态栏。", - "cmd.otherOptions.releaseNotes": "Sync: 更新日志", - "cmd.otherOptions.shareSetting": "Sync: 在公开 Gist 上分享配置", - "cmd.otherOptions.shareSetting.beforeConfirm": "Sync: 这将移除当前的 Gist 并将配置发布到新的公开 Gist 。你确定继续吗?", - "cmd.otherOptions.title": "Sync: 高级选项", - "cmd.otherOptions.toggleAutoDownload": "Sync: 切换启动时自动下载", - "cmd.otherOptions.toggleAutoDownload.off": "Sync: VSCode 启动时自动下载已关闭", - "cmd.otherOptions.toggleAutoDownload.on": "Sync: VSCode 启动时自动下载已开启", - "cmd.otherOptions.toggleAutoUpload": "Sync: 切换配置更新后自动上传", - "cmd.otherOptions.toggleAutoUpload.off": "Sync: 自动上传配置已关闭。", - "cmd.otherOptions.toggleAutoUpload.on": "Sync: 自动上传配置已开启。重启后生效。", - "cmd.otherOptions.toggleForceDownload": "Sync: 开关强制下载", - "cmd.otherOptions.toggleForceDownload.off": "Sync: 强制下载已关闭。", - "cmd.otherOptions.toggleForceDownload.on": "Sync: 强制下载已开启。", - "cmd.otherOptions.toggleForceUpload": "Sync: 切换强制上传", - "cmd.otherOptions.toggleForceUpload.off": "Sync: 强制上传已关闭。", - "cmd.otherOptions.toggleForceUpload.on": "Sync: 强制上传已开启。", - "cmd.otherOptions.toggleSummaryPage": "Sync: 开关同步时显示摘要页面", - "cmd.otherOptions.triggerReset": "Sync: 确定要重置设置吗?", - "cmd.otherOptions.warning.tokenNotRequire": "Sync: Settings Sync 将不再要求填写 GitHub 令牌。", - "cmd.resetSettings.info.resetting": "Sync: 正在重置你的设置。", - "cmd.resetSettings.info.settingClear": "Sync: 设置已清除。", - "cmd.resetSettings.title": "Sync: 重置扩展设置", - "cmd.updateSettings.error.gistNotSave": "Sync: Gist 没有保存", - "cmd.updateSettings.error.newGistCreateFail": "Sync: 无法创建 Gist。", - "cmd.updateSettings.error.readGistFail": "Sync: 无法读取 Gist ID:{0}。", - "cmd.updateSettings.info.gotLatestVersion": "Sync: 您已经上传了最新版本的已保存设置。", - "cmd.updateSettings.info.newGistCreated": "Sync: 已创建新的 Gist。", - "cmd.updateSettings.info.readding": "Sync: 正在读取设置和扩展", - "cmd.updateSettings.info.shareGist": "Sync: 与其他用户分享 Gist ID 来共享配置", - "cmd.updateSettings.info.uploadCanceled": "Sync: 上传已取消。", - "cmd.updateSettings.info.uploading": "Sync: 上传/更新您的配置到 GitHub", - "cmd.updateSettings.info.uploadingDone": "Sync: 上传完成。Gist ID:{0}。请复制这个 ID 并将其用于其他设备来下载配置。", - "cmd.updateSettings.info.uploadingFile": "Sync: 上传文件数据。", - "cmd.updateSettings.info.uploadingSuccess": "Sync: 上传成功。", - "cmd.updateSettings.title": "Sync: 更新/上传配置", - "cmd.updateSettings.warning.OSNotSupported": "同步 Pragma OS 值 {0} 不被支持。行:{1}", - "cmd.updateSettings.warning.noToken": "Sync: 设置 GitHub 令牌或从本地同步设置文件中禁用 'downloadPublicGist' 。", - "common.action.donate": "现在捐赠", - "common.action.joinCommunity": "加入社区", - "common.action.openExtPage": "打开扩展主页", - "common.action.openExtTutorial": "打开教程", - "common.action.releaseNotes": "更新日志", - "common.action.support": "支持这个项目", - "common.action.writeReview": "去写评论", - "common.button.no": "没有", - "common.button.yes": "是", - "common.error.canNotSave": "Sync: 保存设置失败。请确保你的 setting.json 文件合法 (例如 : 没有逗号尾随)", - "common.error.connection": "Sync: 未连接到网络或者连接 GitHub 失败。错误信息已打印到控制台", - "common.error.gistNotSave": "Sync: Gist 未保存。", - "common.error.invalidGistId": "Sync: Gist Id 无效。请确认你的 Gist : https://gist.github.com// 是否有效", - "common.error.invalidToken": "Sync: GitHub 令牌无效或已过期。请重新生成。错误信息已打印到控制台", - "common.error.message": "Sync: 错误信息已打印在控制台 (帮助 > 切换开发人员工具)。", - "common.error.tokenNotSave": "Sync: 令牌未保存。", - "common.info.donate": "Sync: 你喜欢这个扩展吗?要不留下评论或捐助我怎么样 ;)", - "common.info.excludeFile": "Sync: 你可以在上传和下载中忽略任何文件或文件夹", - "common.info.gistSaved": "Sync: Gist 已保存", - "common.info.initAutoUpload": "Sync: {0} 秒后开始自动上传", - "common.info.installed": "Sync: 配置已创建。感谢您的使用!", - "common.info.needHelp": "Sync: 需要帮助来配置此扩展吗?", - "common.info.setToken": "Sync: 现现在你可以在 `syncLocalSettings.json` 中手动设置 GitHub 令牌", - "common.info.tokenSaved": "Sync: 令牌已保存", - "common.info.updateTo": "Sync: 更新至 v{0}", - "common.info.updating": "Sync: 正在更新... 请稍候。", - "common.placeholder.enterGistId": "请输入 Gist Id", - "common.placeholder.enterGithubAccessToken": "请输入 GitHub Token", - "common.placeholder.multipleGist": "Gist 名 [ 例如 : Personal Settings ]", - "common.prompt.enterGistId": "请输入上一次上传设置的 Gist Id 。你也可以手动添加到 VSCode 的配置文件 (sync.gist 字段) 。按下 [Enter] 确认或者 输入 'esc' 取消", - "common.prompt.enterGithubAccessToken": "链接打开了!你可以手动添加到用户目录/syncLocalSettings.json 。按下 [Enter] 确认或者 输入 'esc' 取消", - "common.prompt.gistForceUpload": "Sync: 上传将替换GitHub Gist中的设置。 考虑下载设置或强制上传。 你还想强力上传吗?", - "common.prompt.gistNewer": "Sync: 自上次下载以来,Gist中的设置已更改。 您是否要将当前的本地设置上传到Gist?", - "common.prompt.multipleGist": "如果你有多个 Gist 设置,使你可以识别设置", - "common.prompt.restartCode": "你是否要重新加载 VSCode 来应用扩展和设置?", - "ext.config.autoDownload": "设置为 true 在编辑器打开时自动下载远程配置。[需要重启]", - "ext.config.autoDownload.name": "自动下载", - "ext.config.autoUpload": "设置为 true 在编辑器打开时自动上传本地配置。[需要重启]", - "ext.config.autoUpload.name": "自动上传", - "ext.config.forceDownload": "设置为 true 将会下载远程配置,即便本地已有更新的配置。", - "ext.config.forceDownload.name": "强制下载", - "ext.config.forceUpload": "如果即使 Gist 具有较新设置你仍想上传设置,请设置为 true 。", - "ext.config.forceUpload.name": "强制上传", - "ext.config.gist": "设置同步使用的 GitHub Gist ID", - "ext.config.gist.name": "Gist ID", - "ext.config.gist.placeholder": "请输入 Gist ID", - "ext.config.host": "如果你是 GitHub 企业用户,设置为 GitHub 企业版服务器。", - "ext.config.lastDownload": "最后下载时间。如果你要手动下载,请将其设置为空", - "ext.config.lastUpload": "最后上传时间。如果你要手动下载,请将其设置为空", - "ext.config.pathPrefix": "如果你是 GitHub 企业用户,设置 GitHub 的 API 前缀。通常是 '/api/v3' 。只在 host 字段设置后生效", - "ext.config.quietSync": "如果设置为 true ,开启静默模式。上传和下载的概要信息显示在状态栏而非输出面板", - "ext.config.quietSync.name": "静默同步", - "ext.config.removeExtensions": "设置为 false 如果你不想在下载时移除扩展。", - "ext.config.removeExtensions.name": "删除扩展", - "ext.config.syncExtensions": "设置为 false 如果你不想上传/下载扩展。", - "ext.config.syncExtensions.name": "同步扩展", - "ext.config.title": "代码同步配置", - "ext.globalConfig.askGistDescription.name": "创建 Gist 时询问名称,这可以帮助您在您的多个 Gist 中找到这个配置", - "ext.globalConfig.autoUploadDelay.name": "自动上传延迟", - "ext.globalConfig.autoUploadDelay.placeholder": "输入延迟的秒数", - "ext.globalConfig.downloadPublicGist.name": "下载公开 Gist", - "ext.globalConfig.gistDescription.name": "Gist 描述说明", - "ext.globalConfig.gistDescription.placeholder": "请输入描述", - "ext.globalConfig.githubEnterpriseUrl.name": "GitHub 企业版地址(可选)", - "ext.globalConfig.githubEnterpriseUrl.placeholder": "输入 GitHub 企业版 URL", - "ext.globalConfig.hostName.name": "主机名(可选)", - "ext.globalConfig.hostName.placeholder": "输入主机名", - "ext.globalConfig.ignoreExtensions.name": "忽略的扩展", - "ext.globalConfig.ignoreExtensions.placeholder": "每行输入一个扩展名(全名)", - "ext.globalConfig.ignoreUploadFiles.name": "忽略的文件", - "ext.globalConfig.ignoreUploadFiles.placeholder": "每行输入一个文件", - "ext.globalConfig.ignoreUploadFolders.name": "忽略文件夹", - "ext.globalConfig.ignoredUploadFolders.placeholder": "每行输入一个文件夹", - "ext.globalConfig.openTokenLink.name": "打开令牌链接", - "ext.globalConfig.supportedFileExtensions.name": "支持的文件扩展", - "ext.globalConfig.supportedFileExtensions.placeholder": "每行输入一个文件扩展", - "ext.globalConfig.token.name": "获取令牌", - "ext.globalConfig.token.placeholder": "输入令牌" -} diff --git a/package.nls.zh-tw.json b/package.nls.zh-tw.json deleted file mode 100644 index e29e2e1e..00000000 --- a/package.nls.zh-tw.json +++ /dev/null @@ -1,144 +0,0 @@ -{ - "cmd.downloadSettings.error.removeExtFail": "Sync: 無法移除一些延伸模組", - "cmd.downloadSettings.error.unableSave": "Sync: 無法儲存延伸模組設定檔案。", - "cmd.downloadSettings.info.downloaded": "Sync: 下載完成。", - "cmd.downloadSettings.info.gotLatestVersion": "Sync: 你已經應用了最新版本的設定", - "cmd.downloadSettings.info.readdingOnline": "Sync: 正在讀取線上設定。", - "cmd.downloadSettings.title": "Sync: 下載設定", - "cmd.howSetting.title": "Sync: 如何設定", - "cmd.otherOptions.customizedSync": "Sync: 增加自定義的檔案同步路徑", - "cmd.otherOptions.customizedSync.done": "Sync: {0} 已經被註冊。", - "cmd.otherOptions.customizedSync.placeholder": "輸入額外上傳檔案的絶對路徑。", - "cmd.otherOptions.customizedSync.prompt": "(例如 /path/to/.eslintrc) 將被上傳和下載到指定的路徑。", - "cmd.otherOptions.downloadCustomFile": "Sync: 導入自定義同步檔案到工作區", - "cmd.otherOptions.downloadCustomFile.done": "{0} 下載完成。", - "cmd.otherOptions.downloadCustomFile.placeholder": "選擇你想要的檔案下載到你正在使用的工作空間的根目錄下。", - "cmd.otherOptions.downloadSetting": "Sync: 從公開 Gist 下載設定", - "cmd.otherOptions.editLocalSetting": "Sync: 編輯本機延伸模組設定", - "cmd.otherOptions.error.toggleFail": "Sync: 無法切換。", - "cmd.otherOptions.joinCommunity": "Sync: 加入社群", - "cmd.otherOptions.openIssue": "Sync: 打開 Issue", - "cmd.otherOptions.openSettingsPage": "Sync: 打開設定", - "cmd.otherOptions.preserve": "Sync: 保存電腦裡的設定,避免被下載的設定覆蓋", - "cmd.otherOptions.preserve.info.done1": "Sync: 完成。下載完成後將從 setting.json 中刪除 {0}", - "cmd.otherOptions.preserve.info.done2": "Sync: 完成。下載完成後延伸模組將在 settings.json 中保留 {0}:{1} 。", - "cmd.otherOptions.preserve.placeholder": "輸入 settings.json 中的任意欄位以保留", - "cmd.otherOptions.preserve.prompt": "例如:輸入 'http.proxy' => 在本機存儲該設定,並覆蓋同步後的設定。如果設定為空白,則會移除同步後設定中的這一欄位。", - "cmd.otherOptions.quietSync.off": "Sync: 將在上傳或下載時顯示摘要。", - "cmd.otherOptions.quietSync.on": "Sync: 將在上傳或下載後更新狀態欄。", - "cmd.otherOptions.releaseNotes": "Sync: 更新日誌", - "cmd.otherOptions.shareSetting": "Sync: 在公開 Gist 上分享設定", - "cmd.otherOptions.shareSetting.beforeConfirm": "Sync: 這將移除當前的 Gist 並將設定發佈到新的公開 Gist 。你確定繼續嗎?", - "cmd.otherOptions.title": "Sync: 進階選項", - "cmd.otherOptions.toggleAutoDownload": "Sync: 切換啟動時自動下載", - "cmd.otherOptions.toggleAutoDownload.off": "Sync: VSCode 啟動時自動下載已停用", - "cmd.otherOptions.toggleAutoDownload.on": "Sync: VSCode 啟動時自動下載已啟用", - "cmd.otherOptions.toggleAutoUpload": "Sync: 切換設定更新後自動上傳", - "cmd.otherOptions.toggleAutoUpload.off": "Sync: 自動上傳設定已停用。", - "cmd.otherOptions.toggleAutoUpload.on": "Sync: 自動上傳設定已啟用。重啟後生效。", - "cmd.otherOptions.toggleForceDownload": "Sync: 開關強制下載", - "cmd.otherOptions.toggleForceDownload.off": "Sync: 強制下載已停用。", - "cmd.otherOptions.toggleForceDownload.on": "Sync: 強制下載已啟用。", - "cmd.otherOptions.toggleForceUpload": "Sync: 切換強制上傳", - "cmd.otherOptions.toggleForceUpload.off": "Sync: 強制上傳已停用。", - "cmd.otherOptions.toggleForceUpload.on": "Sync: 強制上傳已啟用。", - "cmd.otherOptions.toggleSummaryPage": "Sync: 開關同步時顯示摘要頁面", - "cmd.otherOptions.triggerReset": "Sync: 確定要重設設定嗎?", - "cmd.otherOptions.warning.tokenNotRequire": "Sync: Settings Sync 將不再要求填寫 GitHub 令牌。", - "cmd.resetSettings.info.resetting": "Sync: 正在重設你的設定。", - "cmd.resetSettings.info.settingClear": "Sync: 設定已清除。", - "cmd.resetSettings.title": "Sync: 重設延伸模組設定", - "cmd.updateSettings.error.gistNotSave": "Sync: Gist 沒有儲存", - "cmd.updateSettings.error.newGistCreateFail": "Sync: 無法創建 Gist。", - "cmd.updateSettings.error.readGistFail": "Sync: 無法讀取 Gist ID:{0}。", - "cmd.updateSettings.info.gotLatestVersion": "Sync: 您已經上傳了最新版本的已保存設定。", - "cmd.updateSettings.info.newGistCreated": "Sync: 已創建新的 Gist。", - "cmd.updateSettings.info.readding": "Sync: 正在讀取設定和延伸模組", - "cmd.updateSettings.info.shareGist": "Sync: 與其他用戶分享 Gist ID 來共享設定", - "cmd.updateSettings.info.uploadCanceled": "Sync: 上傳已取消。", - "cmd.updateSettings.info.uploading": "Sync: 上傳/更新您的設定到 GitHub", - "cmd.updateSettings.info.uploadingDone": "Sync: 上傳完成。Gist ID:{0}。請複製這個 ID 並將其用於其他裝置來下載設定。", - "cmd.updateSettings.info.uploadingFile": "Sync: 上傳檔案資料。", - "cmd.updateSettings.info.uploadingSuccess": "Sync: 上傳成功。", - "cmd.updateSettings.title": "Sync: 更新/上傳設定", - "cmd.updateSettings.warning.OSNotSupported": "不支援同步 Pragma OS 值 {0}。行:{1}", - "cmd.updateSettings.warning.noToken": "Sync: 設定 GitHub 令牌或從本機同步設定檔案中禁用 'downloadPublicGist' 。", - "common.action.donate": "現在捐贈", - "common.action.joinCommunity": "加入社群", - "common.action.openExtPage": "打開延伸模組主頁", - "common.action.openExtTutorial": "打開教學", - "common.action.releaseNotes": "更新日誌", - "common.action.support": "支持這個專案", - "common.action.writeReview": "寫評論", - "common.button.no": "沒有", - "common.button.yes": "是", - "common.error.canNotSave": "Sync: 儲存設定失敗。請確保你的 setting.json 檔案合法 (例如 : 沒有逗號尾隨)", - "common.error.connection": "Sync: 未連接到網絡或者連接 GitHub 失敗。錯誤信息已列印到控制台", - "common.error.gistNotSave": "Sync: Gist 未儲存。", - "common.error.invalidGistId": "Sync: Gist Id 無效。請確認你的 Gist : https://gist.github.com// 是否有效", - "common.error.invalidToken": "Sync: GitHub 令牌無效或已過期。請重新生成。錯誤信息已列印到控制台", - "common.error.message": "Sync: 錯誤信息已列印在控制台 (幫助 > 切換開發人員工具)。", - "common.error.tokenNotSave": "Sync: 令牌未儲存。", - "common.info.donate": "Sync: 你喜歡這個延伸模組嗎?要不留下評論或捐助我怎麼樣 :)", - "common.info.excludeFile": "Sync: 你可以在上傳和下載中忽略任何檔案或資料夾", - "common.info.gistSaved": "Sync: Gist 已儲存", - "common.info.initAutoUpload": "Sync: {0} 秒後開始自動上傳", - "common.info.installed": "Sync: 已建立設定。感謝您的使用!", - "common.info.needHelp": "Sync: 需要幫助來設定此延伸模組嗎?", - "common.info.setToken": "Sync: 現現在你可以在 `syncLocalSettings.json` 中手動設定 GitHub 令牌", - "common.info.tokenSaved": "Sync: 令牌已儲存", - "common.info.updateTo": "Sync: 更新至 v{0}", - "common.info.updating": "Sync: 正在更新... 請稍候。", - "common.placeholder.enterGistId": "請輸入 Gist Id", - "common.placeholder.enterGithubAccessToken": "請輸入 GitHub Token", - "common.placeholder.multipleGist": "Gist 名 [ 例如 : Personal Settings ]", - "common.prompt.enterGistId": "請輸入上一次上傳設定的 Gist Id 。你也可以手動增加到 VSCode 的設定檔案 (sync.gist 欄位) 。按下 [Enter] 確認或者 輸入 'esc' 取消", - "common.prompt.enterGithubAccessToken": "連結打開了!你可以手動增加到用戶目錄/syncLocalSettings.json 。按下 [Enter] 確認或者 輸入 'esc' 取消", - "common.prompt.gistForceUpload": "Sync: 上傳將替換GitHub Gist中的設置。 考慮下載設置或強制上傳。 你還想強力上傳嗎?", - "common.prompt.gistNewer": "Sync: 自上次下載以來,Gist中的設置已更改。 您是否要將當前的本地設置上傳到Gist?", - "common.prompt.multipleGist": "如果你有多個 Gist 設定,使你可以識別設定", - "common.prompt.restartCode": "你是否要重新啟動 VSCode 以應用延伸模組和設定?", - "ext.config.autoDownload": "設定為 true 在編輯器打開時自動下載線上設定。[需要重啟]", - "ext.config.autoDownload.name": "自動下載", - "ext.config.autoUpload": "設定為 true 在編輯器打開時自動上傳本機設定。[需要重啟]", - "ext.config.autoUpload.name": "自動上傳", - "ext.config.forceDownload": "設定為 true 將會下載線上設定,即便本機已有更新的設定。", - "ext.config.forceDownload.name": "強制下載", - "ext.config.forceUpload": "如果即使 Gist 具有較新設定你仍想上傳設定,請設定為 true 。", - "ext.config.forceUpload.name": "強制上傳", - "ext.config.gist": "設定同步使用的 GitHub Gist ID", - "ext.config.gist.name": "Gist ID", - "ext.config.gist.placeholder": "請輸入 Gist ID", - "ext.config.host": "如果你是 GitHub 企業用戶,設定為 GitHub 企業版伺服器。", - "ext.config.lastDownload": "最後下載時間。如果你要手動下載,請將其設定為空白", - "ext.config.lastUpload": "最後上傳時間。如果你要手動下載,請將其設定為空白", - "ext.config.pathPrefix": "如果你是 GitHub 企業用戶,設定 GitHub 的 API 前綴。通常是 '/api/v3' 。只在 host 欄位設定後生效", - "ext.config.quietSync": "如果設定為 true ,將顯示結果在狀態欄而非輸出面板", - "ext.config.quietSync.name": "静音模式同步", - "ext.config.removeExtensions": "設定為 false 如果你不想在下載時移除延伸模組。", - "ext.config.removeExtensions.name": "刪除延伸模組", - "ext.config.syncExtensions": "設定為 false 如果你不想上傳/下載延伸模組。", - "ext.config.syncExtensions.name": "同步延伸模組", - "ext.config.title": "Code Settings Sync 設定", - "ext.globalConfig.askGistDescription.name": "創建 Gist 時詢問名稱,這可以幫助您在您的多個 Gist 中找到這個設定", - "ext.globalConfig.autoUploadDelay.name": "自動上傳延遲", - "ext.globalConfig.autoUploadDelay.placeholder": "輸入延遲的秒數", - "ext.globalConfig.downloadPublicGist.name": "下載公開 Gist", - "ext.globalConfig.gistDescription.name": "Gist 描述說明", - "ext.globalConfig.gistDescription.placeholder": "請輸入描述", - "ext.globalConfig.githubEnterpriseUrl.name": "GitHub 企業版 URL(可選)", - "ext.globalConfig.githubEnterpriseUrl.placeholder": "輸入 GitHub 企業版 URL", - "ext.globalConfig.hostName.name": "主機名(可選)", - "ext.globalConfig.hostName.placeholder": "輸入主機名", - "ext.globalConfig.ignoreExtensions.name": "忽略的延伸模組", - "ext.globalConfig.ignoreExtensions.placeholder": "每行輸入一個延伸模組名稱(全名)", - "ext.globalConfig.ignoreUploadFiles.name": "忽略的檔案", - "ext.globalConfig.ignoreUploadFiles.placeholder": "每行輸入一個檔案", - "ext.globalConfig.ignoreUploadFolders.name": "忽略資料夾", - "ext.globalConfig.ignoredUploadFolders.placeholder": "每行輸入一個資料夾", - "ext.globalConfig.openTokenLink.name": "打開令牌連結", - "ext.globalConfig.supportedFileExtensions.name": "支援的檔案延伸模組", - "ext.globalConfig.supportedFileExtensions.placeholder": "每行輸入一個檔案延伸模組", - "ext.globalConfig.token.name": "獲取令牌", - "ext.globalConfig.token.placeholder": "輸入令牌" -} diff --git a/release-notes.json b/release-notes.json deleted file mode 100644 index 1c3b7536..00000000 --- a/release-notes.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "changes": [ - { - "details": "Add content security policy for webviews", - "type": "NEW", - "color": "success", - "author": "ParkourKarthik", - "pullRequest": "1020" - }, - { - "details": "Improve UX for the Force Upload", - "type": "NEW", - "color": "success", - "author": "karl-lunarg", - "pullRequest": "1042" - }, - { - "details": "Extension always asks to enable Force Upload", - "type": "FIX", - "color": "danger", - "author": "karl-lunarg", - "pullRequest": "1026" - }, - { - "details": "Languages, Icon and Wiki Improved", - "type": "NEW", - "color": "success" - }, - { - "details": "Github Gist Name Consistency across extension", - "type": "FIX", - "color": "danger" - }, - { - "details": "Snippets Sync. Fixed", - "type": "FIX", - "color": "danger" - }, - { - "details": "Share Settings Dialog Fixed", - "type": "FIX", - "color": "danger" - }, - { - "details": "Github Sync Improved", - "type": "FIX", - "color": "danger" - } - - ], - "currentVersion": "v3.4.3" -} diff --git a/scripts/deploy.sh b/scripts/deploy.sh deleted file mode 100644 index bf87a1c4..00000000 --- a/scripts/deploy.sh +++ /dev/null @@ -1,8 +0,0 @@ -npm install node-pre-gyp -npm i --no-optional -npm dedupe -npm up -npm install -g vsce -printf "Applying Token" -echo "[{\"name\":\"Shan\",\"pat\":\"$VSCE_TOKEN\"}]" > ~/.vsce -vsce publish diff --git a/src/commons.ts b/src/commons.ts deleted file mode 100644 index 7f5ab4ce..00000000 --- a/src/commons.ts +++ /dev/null @@ -1,531 +0,0 @@ -"use strict"; -import * as vscode from "vscode"; -import { Environment } from "./environmentPath"; -import localize from "./localize"; -import { CustomConfig } from "./models/customConfig.model"; -import { ExtensionConfig } from "./models/extensionConfig.model"; -import { LocalConfig } from "./models/localConfig.model"; -import { AutoUploadService } from "./service/autoUpload.service"; -import { File, FileService } from "./service/file.service"; -import { ExtensionInformation } from "./service/plugin.service"; -import { WebviewService } from "./service/webview.service"; -import { state } from "./state"; - -export default class Commons { - public static outputChannel: vscode.OutputChannel = null; - public static LogException( - error: any, - message: string, - msgBox: boolean, - callback?: () => void - ): void { - if (error) { - console.error(error); - if (error.status === 500) { - message = localize("common.error.connection"); - msgBox = false; - } else if (error.status === 401) { - msgBox = true; - message = localize("common.error.invalidToken"); - } else if (error.status === 4) { - message = localize("common.error.canNotSave"); - } else if (error.message) { - try { - message = JSON.parse(error.message).message; - if (message.toLowerCase() === "not found") { - msgBox = true; - message = localize("common.error.invalidGistId"); - } - } catch (error) { - // message = error.message; - } - } - } - - if (msgBox === true) { - vscode.window.showErrorMessage(message); - vscode.window.setStatusBarMessage("").dispose(); - } else { - vscode.window.setStatusBarMessage(message, 5000); - } - - if (callback) { - callback.apply(this); - } - } - - public static GetInputBox(token: boolean) { - if (token) { - const options: vscode.InputBoxOptions = { - placeHolder: localize("common.placeholder.enterGithubAccessToken"), - password: false, - prompt: localize("common.prompt.enterGithubAccessToken"), - ignoreFocusOut: true - }; - return options; - } else { - const options: vscode.InputBoxOptions = { - placeHolder: localize("common.placeholder.enterGistId"), - password: false, - prompt: localize("common.prompt.enterGistId"), - ignoreFocusOut: true - }; - return options; - } - } - - public autoUploadService: AutoUploadService; - public webviewService = new WebviewService(); - - public ERROR_MESSAGE: string = localize("common.error.message"); - - constructor() { - this.InitializeAutoUpload(); - } - - public async InitializeAutoUpload() { - const ignored = AutoUploadService.GetIgnoredItems( - await this.GetCustomSettings() - ); - this.autoUploadService = new AutoUploadService(ignored); - } - - public async HandleStartWatching() { - if (this.autoUploadService) { - this.autoUploadService.StartWatching(); - } else { - await this.InitializeAutoUpload(); - this.HandleStartWatching(); - } - } - - public async HandleStopWatching() { - if (this.autoUploadService) { - this.autoUploadService.StopWatching(); - } else { - await this.InitializeAutoUpload(); - this.HandleStopWatching(); - } - } - - public async InitalizeSettings(): Promise { - const settings = new LocalConfig(); - const extSettings = this.GetSettings(); - const cusSettings = await this.GetCustomSettings(); - - settings.customConfig = cusSettings; - settings.extConfig = extSettings; - return settings; - } - - public async GetCustomSettings(): Promise { - let customSettings = new CustomConfig(); - try { - const customExist: boolean = await FileService.FileExists( - state.environment.FILE_CUSTOMIZEDSETTINGS - ); - if (customExist) { - const customSettingStr: string = await FileService.ReadFile( - state.environment.FILE_CUSTOMIZEDSETTINGS - ); - const tempObj = JSON.parse(customSettingStr); - - Object.assign(customSettings, tempObj); - customSettings.token = customSettings.token.trim(); - } - } catch (e) { - customSettings = null; - Commons.LogException( - e, - "Sync : Unable to read " + - state.environment.FILE_CUSTOMIZEDSETTINGS_NAME + - ". Make sure its Valid JSON.", - true - ); - vscode.commands.executeCommand( - "vscode.open", - vscode.Uri.parse( - "http://shanalikhan.github.io/2017/02/19/Option-to-ignore-settings-folders-code-settings-sync.html" - ) - ); - } - return customSettings; - } - - public async SetCustomSettings(setting: CustomConfig): Promise { - try { - await FileService.WriteFile( - state.environment.FILE_CUSTOMIZEDSETTINGS, - JSON.stringify(setting, null, 4) - ); - return true; - } catch (e) { - Commons.LogException( - e, - "Sync : Unable to write " + - state.environment.FILE_CUSTOMIZEDSETTINGS_NAME, - true - ); - return false; - } - } - - public async StartMigrationProcess(): Promise { - const fileExist: boolean = await FileService.FileExists( - state.environment.FILE_CUSTOMIZEDSETTINGS - ); - let customSettings: CustomConfig = null; - const firstTime: boolean = !fileExist; - let fileChanged: boolean = firstTime; - - if (fileExist) { - customSettings = await this.GetCustomSettings(); - } else { - customSettings = new CustomConfig(); - } - // vscode.workspace.getConfiguration().update("sync.version", undefined, true); - - if (firstTime) { - const openExtensionPage = localize("common.action.openExtPage"); - vscode.window.showInformationMessage(localize("common.info.installed")); - vscode.window - .showInformationMessage( - localize("common.info.needHelp"), - openExtensionPage - ) - .then((val: string) => { - if (val === openExtensionPage) { - vscode.commands.executeCommand( - "vscode.open", - vscode.Uri.parse( - "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" - ) - ); - } - }); - } else if (customSettings.version < Environment.CURRENT_VERSION) { - fileChanged = true; - // #TODO : Remove this in new update - const newIgnoredList = new CustomConfig().ignoreUploadFiles; - newIgnoredList.forEach(m => { - if (customSettings.ignoreUploadFiles.indexOf(m) === -1) { - customSettings.ignoreUploadFiles.push(m); - } - }); - - if (state.context.globalState.get("synctoken")) { - const token = state.context.globalState.get("synctoken"); - if (token !== "") { - customSettings.token = String(token); - state.context.globalState.update("synctoken", ""); - vscode.window.showInformationMessage( - localize("common.info.setToken") - ); - } - } - - const releaseNotes = localize("common.action.releaseNotes"); - const writeReview = localize("common.action.writeReview"); - const support = localize("common.action.support"); - const joinCommunity = localize("common.action.joinCommunity"); - if (!customSettings.disableUpdateMessage) { - vscode.window - .showInformationMessage( - localize("common.info.updateTo", Environment.getVersion()), - releaseNotes, - writeReview, - support, - joinCommunity - ) - .then((val: string) => { - if (val === releaseNotes) { - vscode.commands.executeCommand( - "vscode.open", - vscode.Uri.parse( - "http://shanalikhan.github.io/2016/05/14/Visual-studio-code-sync-settings-release-notes.html" - ) - ); - } - if (val === writeReview) { - vscode.commands.executeCommand( - "vscode.open", - vscode.Uri.parse( - "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync#review-details" - ) - ); - } - if (val === support) { - vscode.commands.executeCommand( - "vscode.open", - vscode.Uri.parse( - "https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=4W3EWHHBSYMM8&lc=IE&item_name=Code%20Settings%20Sync&item_number=visual%20studio%20code%20settings%20sync¤cy_code=USD&bn=PP-DonationsBF:btn_donate_SM.gif:NonHosted" - ) - ); - } - if (val === joinCommunity) { - vscode.commands.executeCommand( - "vscode.open", - vscode.Uri.parse( - "https://join.slack.com/t/codesettingssync/shared_invite/enQtNzQyODMzMzI5MDQ3LWNmZjVkZjE2YTg0MzY1Y2EyYzVmYThmNzg2YjZkNjhhZWY3ZTEzN2I3ZTAxMjkwNWU0ZjMyZGFhMjdiZDI3ODU" - ) - ); - } - }); - } - } - - if (fileChanged) { - customSettings.version = Environment.CURRENT_VERSION; - await this.SetCustomSettings(customSettings); - } - return true; - } - - public async SaveSettings(setting: ExtensionConfig): Promise { - const config = vscode.workspace.getConfiguration("sync"); - const allKeysUpdated = new Array>(); - - const keys = Object.keys(setting); - keys.forEach(async keyName => { - if (setting[keyName] == null) { - setting[keyName] = ""; - } - if (keyName.toLowerCase() !== "token") { - if (config.get(keyName) !== setting[keyName]) { - allKeysUpdated.push(config.update(keyName, setting[keyName], true)); - } - } - }); - - try { - await Promise.all(allKeysUpdated); - if (state.context.globalState.get("syncCounter")) { - const counter = state.context.globalState.get("syncCounter"); - let count: number = parseInt(counter + "", 10); - if (count % 450 === 0) { - this.DonateMessage(); - } - count = count + 1; - state.context.globalState.update("syncCounter", count); - } else { - state.context.globalState.update("syncCounter", 1); - } - return true; - } catch (err) { - Commons.LogException(err, this.ERROR_MESSAGE, true); - return false; - } - } - - public async DonateMessage(): Promise { - const donateNow = localize("common.action.donate"); - const writeReview = localize("common.action.writeReview"); - const res = await vscode.window.showInformationMessage( - localize("common.info.donate"), - donateNow, - writeReview - ); - - if (res === donateNow) { - vscode.commands.executeCommand( - "vscode.open", - vscode.Uri.parse( - "https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=4W3EWHHBSYMM8&lc=IE&item_name=Code%20Settings%20Sync&item_number=visual%20studio%20code%20settings%20sync¤cy_code=USD&bn=PP-DonationsBF:btn_donate_SM.gif:NonHosted" - ) - ); - } else if (res === writeReview) { - vscode.commands.executeCommand( - "vscode.open", - vscode.Uri.parse( - "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync#review-details" - ) - ); - } - } - - public GetSettings(): ExtensionConfig { - const settings = new ExtensionConfig(); - - for (const key of Object.keys(settings)) { - if (key !== "token") { - settings[key] = vscode.workspace.getConfiguration("sync").get(key); - } - } - - settings.gist = settings.gist.trim(); - return settings; - } - - public async GetTokenAndSave(sett: CustomConfig): Promise { - const opt = Commons.GetInputBox(true); - - const token = ((await vscode.window.showInputBox(opt)) || "").trim(); - - if (token && token !== "esc") { - sett.token = token; - const saved = await this.SetCustomSettings(sett); - if (saved) { - vscode.window.setStatusBarMessage( - localize("common.info.tokenSaved"), - 1000 - ); - } - } - - return token; - } - public async GetGistAndSave(sett: ExtensionConfig): Promise { - const opt = Commons.GetInputBox(false); - - const gist = ((await vscode.window.showInputBox(opt)) || "").trim(); - - if (gist && gist !== "esc") { - sett.gist = gist; - const saved = await this.SaveSettings(sett); - if (saved) { - vscode.window.setStatusBarMessage( - localize("common.info.gistSaved"), - 1000 - ); - } - return gist; - } - } - - /** - * IgnoreSettings - */ - public async GetIgnoredSettings(settings: string[]): Promise { - const ignoreSettings: object = {}; - const config = vscode.workspace.getConfiguration(); - const keysUpdated: Array> = []; - - for (const key of settings) { - let keyValue: object = null; - keyValue = config.get(key, null); - if (keyValue !== null) { - ignoreSettings[key] = keyValue; - keysUpdated.push(config.update(key, undefined, true)); - } - } - - await Promise.all(keysUpdated); - - return ignoreSettings; - } - - /** - * RestoreIgnoredSettings - */ - public SetIgnoredSettings(ignoredSettings: object): void { - const config = vscode.workspace.getConfiguration(); - const keysUpdated: Array> = []; - for (const key of Object.keys(ignoredSettings)) { - keysUpdated.push(config.update(key, ignoredSettings[key], true)); - } - } - - /** - * AskGistDescription - */ - public async AskGistDescription(): Promise { - return vscode.window.showInputBox({ - prompt: localize("common.prompt.multipleGist"), - ignoreFocusOut: true, - placeHolder: localize("common.placeholder.multipleGist") - }); - } - - public ShowSummaryOutput( - upload: boolean, - files: File[], - removedExtensions: ExtensionInformation[], - addedExtensions: ExtensionInformation[], - ignoredExtensions: ExtensionInformation[], - syncSettings: LocalConfig - ) { - if (Commons.outputChannel === null) { - Commons.outputChannel = vscode.window.createOutputChannel( - "Code Settings Sync" - ); - } - - const outputChannel = Commons.outputChannel; - outputChannel.appendLine( - `CODE SETTINGS SYNC ${upload ? "UPLOAD" : "DOWNLOAD"} SUMMARY` - ); - outputChannel.appendLine(`Version: ${Environment.getVersion()}`); - outputChannel.appendLine(`--------------------`); - outputChannel.appendLine( - `GitHub Token: ${ - syncSettings.customConfig.token - ? syncSettings.customConfig.token.slice(0, 4) + "**********" - : "Anonymous" - }` - ); - outputChannel.appendLine(`GitHub Gist: ${syncSettings.extConfig.gist}`); - outputChannel.appendLine( - `GitHub Gist Type: ${syncSettings.publicGist ? "Public" : "Secret"}` - ); - outputChannel.appendLine(``); - if (!syncSettings.customConfig.token) { - outputChannel.appendLine( - `Anonymous Gist cannot be edited, the extension will always create a new one during upload.` - ); - } - outputChannel.appendLine( - `Restarting Visual Studio Code may be required to apply color and file icon theme.` - ); - outputChannel.appendLine(`--------------------`); - - outputChannel.appendLine(`Files ${upload ? "Upload" : "Download"}ed:`); - files - .filter(item => item.fileName.indexOf(".") > 0) - .forEach(item => { - outputChannel.appendLine(` ${item.fileName} > ${item.gistName}`); - }); - - outputChannel.appendLine(``); - outputChannel.appendLine(`Extensions Ignored:`); - - if (!ignoredExtensions || ignoredExtensions.length === 0) { - outputChannel.appendLine(` No extensions ignored.`); - } else { - ignoredExtensions.forEach(extn => { - outputChannel.appendLine(` ${extn.name} v${extn.version}`); - }); - } - - outputChannel.appendLine(``); - outputChannel.appendLine(`Extensions Removed:`); - - if (!syncSettings.extConfig.removeExtensions) { - outputChannel.appendLine(` Feature Disabled.`); - } else { - if (!removedExtensions || removedExtensions.length === 0) { - outputChannel.appendLine(` No extensions removed.`); - } else { - removedExtensions.forEach(extn => { - outputChannel.appendLine(` ${extn.name} v${extn.version}`); - }); - } - } - - if (addedExtensions) { - outputChannel.appendLine(``); - outputChannel.appendLine(`Extensions Added:`); - - if (addedExtensions.length === 0) { - outputChannel.appendLine(` No extensions installed.`); - } - - addedExtensions.forEach(extn => { - outputChannel.appendLine(` ${extn.name} v${extn.version}`); - }); - } - - outputChannel.appendLine(`--------------------`); - outputChannel.append(`Done.`); - outputChannel.show(true); - } -} diff --git a/src/enums.ts b/src/enums.ts deleted file mode 100644 index c283304e..00000000 --- a/src/enums.ts +++ /dev/null @@ -1,13 +0,0 @@ -export enum OsType { - Windows = "win32", - Linux = "linux", - Mac = "darwin" -} - -export enum SettingType { - Settings = 1, - Launch, - KeyBindings, - Locale, - Extensions -} diff --git a/src/environmentPath.ts b/src/environmentPath.ts deleted file mode 100644 index 3f677141..00000000 --- a/src/environmentPath.ts +++ /dev/null @@ -1,196 +0,0 @@ -"use strict"; - -import { normalize, resolve } from "path"; -import * as vscode from "vscode"; -import { OsType } from "./enums"; -import { state } from "./state"; - -export const SUPPORTED_OS: string[] = Object.keys(OsType) - .filter(k => !/\d/.test(k)) - .map(k => k.toLowerCase()); // . ["windows", "linux", "mac"]; - -export function osTypeFromString(osName: string): OsType { - const capitalized: string = - osName[0].toUpperCase() + osName.substr(1).toLowerCase(); - return OsType[capitalized]; -} - -export class Environment { - public static CURRENT_VERSION: number = 343; - public static getVersion(): string { - return ( - Environment.CURRENT_VERSION.toString().slice(0, 1) + - "." + - Environment.CURRENT_VERSION.toString().slice(1, 2) + - "." + - Environment.CURRENT_VERSION.toString().slice(2, 3) - ); - } - - // public isInsiders: boolean = false; - // public isOss: boolean = false; - // public isCoderCom: boolean = false; - // public homeDir: string | null = null; - - public isPortable: boolean = false; - public USER_FOLDER: string = null; - - public CODE_BIN: string; - - public EXTENSION_FOLDER: string = null; - public PATH: string = null; - public OsType: OsType = null; - - public FILE_SETTING: string = null; - public FILE_LAUNCH: string = null; - public FILE_KEYBINDING: string = null; - public FILE_LOCALE: string = null; - public FILE_EXTENSION: string = null; - public FILE_CLOUDSETTINGS: string = null; - public FILE_SYNC_LOCK: string = null; - - public FILE_CUSTOMIZEDSETTINGS_NAME: string = "syncLocalSettings.json"; - public FILE_CUSTOMIZEDSETTINGS: string = null; - - public FILE_SETTING_NAME: string = "settings.json"; - public FILE_LAUNCH_NAME: string = "launch.json"; - public FILE_KEYBINDING_NAME: string = "keybindings.json"; - public FILE_KEYBINDING_MAC: string = "keybindingsMac.json"; - public FILE_KEYBINDING_DEFAULT: string = "keybindings.json"; - public FILE_EXTENSION_NAME: string = "extensions.json"; - public FILE_LOCALE_NAME: string = "locale.json"; - public FILE_SYNC_LOCK_NAME: string = "sync.lock"; - - public FILE_CLOUDSETTINGS_NAME: string = "cloudSettings"; - - public FOLDER_SNIPPETS: string = null; - - constructor() { - state.context.globalState.update("_", undefined); // Make sure the global state folder exists. This is needed for using this.context.globalStoragePath to access user folder - - this.isPortable = !!process.env.VSCODE_PORTABLE; - - this.OsType = process.platform as OsType; - if (!this.isPortable) { - this.PATH = resolve(state.context.globalStoragePath, "../../..").concat( - normalize("/") - ); - this.USER_FOLDER = resolve(this.PATH, "User").concat(normalize("/")); - this.EXTENSION_FOLDER = resolve( - vscode.extensions.all.filter( - extension => !extension.packageJSON.isBuiltin - )[0].extensionPath, - ".." - ).concat(normalize("/")); // Gets first non-builtin extension's path - } else { - this.PATH = process.env.VSCODE_PORTABLE; - this.USER_FOLDER = resolve(this.PATH, "user-data/User").concat( - normalize("/") - ); - this.EXTENSION_FOLDER = resolve(this.PATH, "extensions").concat( - normalize("/") - ); - } - - /* Start Legacy Code - - this.isInsiders = /insiders/.test(this.context.asAbsolutePath("")); - this.isOss = /\boss\b/.test(this.context.asAbsolutePath("")); - this.isCoderCom = - vscode.extensions.getExtension("coder.coder") !== undefined; - const isXdg = - !this.isInsiders && - !this.isCoderCom && - process.platform === "linux" && - !!process.env.XDG_DATA_HOME; - this.homeDir = isXdg - ? process.env.XDG_DATA_HOME - : process.env[process.platform === "win32" ? "USERPROFILE" : "HOME"]; - const configSuffix = `; $; {isXdg || this.isCoderCom ? "" : "."; }vscode$; { - this.isInsiders ? "-insiders" : this.isOss ? "-oss" : ""; - }`; - - if (!this.isPortable) { - if (process.platform === "darwin") { - this.PATH = process.env.HOME + "/Library/Application Support"; - this.OsType = OsType.Mac; - } else if (process.platform === "linux") { - if (!this.isCoderCom) { - this.PATH = - isXdg && !!process.env.XDG_CONFIG_HOME - ? process.env.XDG_CONFIG_HOME - : os.homedir() + "/.config"; - } else { - this.PATH = "/tmp"; - } - this.OsType = OsType.Linux; - } else if (process.platform === "win32") { - this.PATH = process.env.APPDATA; - this.OsType = OsType.Windows; - } else { - this.PATH = "/var/local"; - this.OsType = OsType.Linux; - } - } - - if (this.isPortable) { - this.PATH = process.env.VSCODE_PORTABLE; - if (process.platform === "darwin") { - this.OsType = OsType.Mac; - } else if (process.platform === "linux") { - this.OsType = OsType.Linux; - } else if (process.platform === "win32") { - this.OsType = OsType.Windows; - } else { - this.OsType = OsType.Linux; - } - } - - if (!this.isPortable) { - const possibleCodePaths = []; - if (this.isInsiders) { - possibleCodePaths.push("/Code - Insiders"); - } else if (this.isOss) { - possibleCodePaths.push("/Code - OSS"); - possibleCodePaths.push("/VSCodium"); - } else { - possibleCodePaths.push("/Code"); - } - for (const possibleCodePath of possibleCodePaths) { - try { - fs.statSync(this.PATH + possibleCodePath); - this.PATH = this.PATH + possibleCodePath; - break; - } catch (e) { - console.error("Error :" + possibleCodePath); - console.error(e); - } - } - this.ExtensionFolder = path.join( - this.homeDir, - configSuffix, - "extensions" - ); - this.USER_FOLDER = this.PATH.concat("/User/"); - } else { - this.USER_FOLDER = this.PATH.concat("/user-data/User/"); - this.ExtensionFolder = this.PATH.concat("/extensions/"); - } - - End Legacy Code */ - - this.FILE_EXTENSION = this.USER_FOLDER.concat(this.FILE_EXTENSION_NAME); - this.FILE_SETTING = this.USER_FOLDER.concat(this.FILE_SETTING_NAME); - this.FILE_LAUNCH = this.USER_FOLDER.concat(this.FILE_LAUNCH_NAME); - this.FILE_KEYBINDING = this.USER_FOLDER.concat(this.FILE_KEYBINDING_NAME); - this.FILE_LOCALE = this.USER_FOLDER.concat(this.FILE_LOCALE_NAME); - this.FOLDER_SNIPPETS = this.USER_FOLDER.concat("/snippets/"); - this.FILE_CLOUDSETTINGS = this.USER_FOLDER.concat( - this.FILE_CLOUDSETTINGS_NAME - ); - this.FILE_CUSTOMIZEDSETTINGS = this.USER_FOLDER.concat( - this.FILE_CUSTOMIZEDSETTINGS_NAME - ); - this.FILE_SYNC_LOCK = this.USER_FOLDER.concat(this.FILE_SYNC_LOCK_NAME); - } -} diff --git a/src/extension.ts b/src/extension.ts index 4b3f8e36..c2bef2cd 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,48 +1,26 @@ -"use strict"; - -import * as vscode from "vscode"; -import { Environment } from "./environmentPath"; -import { state } from "./state"; -import { Sync } from "./sync"; - -export async function activate(context: vscode.ExtensionContext) { - state.context = context; - state.environment = new Environment(); - - const sync = new Sync(); - - sync.bootstrap(); - - context.subscriptions.push( - vscode.commands.registerCommand( - "extension.updateSettings", - (optArgument?: string) => { - sync.upload.bind(sync, optArgument)(); - } - ) - ); - context.subscriptions.push( - vscode.commands.registerCommand( - "extension.downloadSettings", - sync.download.bind(sync) - ) - ); - context.subscriptions.push( - vscode.commands.registerCommand( - "extension.resetSettings", - sync.reset.bind(sync) - ) - ); - context.subscriptions.push( - vscode.commands.registerCommand( - "extension.HowSettings", - sync.how.bind(sync) - ) - ); - context.subscriptions.push( - vscode.commands.registerCommand( - "extension.otherOptions", - sync.advance.bind(sync) - ) - ); -} +// The module 'vscode' contains the VS Code extensibility API +// Import the module and reference it with the alias vscode in your code below +import * as vscode from 'vscode'; + +// This method is called when your extension is activated +// Your extension is activated the very first time the command is executed +export function activate(context: vscode.ExtensionContext) { + + // Use the console to output diagnostic information (console.log) and errors (console.error) + // This line of code will only be executed once when your extension is activated + console.log('Congratulations, your extension "code-settings-sync" is now active!'); + + // The command has been defined in the package.json file + // Now provide the implementation of the command with registerCommand + // The commandId parameter must match the command field in package.json + const disposable = vscode.commands.registerCommand('code-settings-sync.helloWorld', () => { + // The code you place here will be executed every time your command is executed + // Display a message box to the user + vscode.window.showInformationMessage('Hello World from code-settings-sync!'); + }); + + context.subscriptions.push(disposable); +} + +// This method is called when your extension is deactivated +export function deactivate() {} diff --git a/src/localize.ts b/src/localize.ts deleted file mode 100644 index a88ce0fd..00000000 --- a/src/localize.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { existsSync, readFileSync } from "fs-extra"; -import { resolve } from "path"; -import { extensions } from "vscode"; -import { ILanguagePack } from "./models/language-pack.model"; - -export class Localize { - private bundle = this.resolveLanguagePack(); - private options: { locale: string }; - - public localize(key: string, ...args: string[]): string { - const message = this.bundle[key] || key; - return this.format(message, args); - } - - private init() { - try { - this.options = { - ...this.options, - ...JSON.parse(process.env.VSCODE_NLS_CONFIG || "{}") - }; - } catch (err) { - throw err; - } - } - - private format(message: string, args: string[] = []): string { - return args.length - ? message.replace( - /\{(\d+)\}/g, - (match, rest: any[]) => args[rest[0]] || match - ) - : message; - } - - private resolveLanguagePack(): ILanguagePack { - this.init(); - - const languageFormat = "package.nls{0}.json"; - const defaultLanguage = languageFormat.replace("{0}", ""); - - const rootPath = extensions.getExtension("Shan.code-settings-sync") - .extensionPath; - - const resolvedLanguage = this.recurseCandidates( - rootPath, - languageFormat, - this.options.locale - ); - - const languageFilePath = resolve(rootPath, resolvedLanguage); - - try { - const defaultLanguageBundle = JSON.parse( - resolvedLanguage !== defaultLanguage - ? readFileSync(resolve(rootPath, defaultLanguage), "utf-8") - : "{}" - ); - - const resolvedLanguageBundle = JSON.parse( - readFileSync(languageFilePath, "utf-8") - ); - - return { ...defaultLanguageBundle, ...resolvedLanguageBundle }; - } catch (err) { - throw err; - } - } - - private recurseCandidates( - rootPath: string, - format: string, - candidate: string - ): string { - const filename = format.replace("{0}", `.${candidate}`); - const filepath = resolve(rootPath, filename); - if (existsSync(filepath)) { - return filename; - } - if (candidate.split("-")[0] !== candidate) { - return this.recurseCandidates(rootPath, format, candidate.split("-")[0]); - } - return format.replace("{0}", ""); - } -} - -export default Localize.prototype.localize.bind(new Localize()); diff --git a/src/lockfile.ts b/src/lockfile.ts deleted file mode 100644 index e3df2842..00000000 --- a/src/lockfile.ts +++ /dev/null @@ -1,34 +0,0 @@ -import * as lockfile from "lockfile"; -import { Util } from "./util"; - -interface IOptions { - wait?: number; - pollPeriod?: number; - stale?: number; - retries?: number; - retryWait?: number; -} - -export default { - Check, - Lock, - Unlock -}; - -export function Check( - filepath: string, - options: IOptions = {} -): Promise { - return Util.promisify(lockfile.check)(filepath, options); -} - -export function Lock( - filepath: string, - options: IOptions = {} -): Promise { - return Util.promisify(lockfile.lock)(filepath, options); -} - -export function Unlock(filepath: string): Promise { - return Util.promisify(lockfile.unlock)(filepath); -} diff --git a/src/models/cloudSettings.model.ts b/src/models/cloudSettings.model.ts deleted file mode 100644 index f57a4195..00000000 --- a/src/models/cloudSettings.model.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { Environment } from "../environmentPath"; - -export class CloudSettings { - public lastUpload: Date = null; - public extensionVersion: string = "v" + Environment.getVersion(); -} diff --git a/src/models/customConfig.model.ts b/src/models/customConfig.model.ts deleted file mode 100644 index 15203845..00000000 --- a/src/models/customConfig.model.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Environment } from "../environmentPath"; - -export class CustomConfig { - public ignoreUploadFiles: string[] = [ - "state.*", - "syncLocalSettings.json", - ".DS_Store", - "sync.lock", - "projects.json", - "projects_cache_vscode.json", - "projects_cache_git.json", - "projects_cache_svn.json", - "gpm_projects.json", - "gpm-recentItems.json" - ]; - public ignoreUploadFolders: string[] = ["workspaceStorage"]; - public ignoreExtensions: string[] = []; - public gistDescription: string = "Visual Studio Code Settings Sync Gist"; - public version: number = Environment.CURRENT_VERSION; - public token: string = ""; - public downloadPublicGist: boolean = false; - public supportedFileExtensions: string[] = ["json", "code-snippets"]; - public openTokenLink: boolean = true; - public disableUpdateMessage: boolean = false; - public lastUpload: Date = null; - public lastDownload: Date = null; - public githubEnterpriseUrl: string = null; - public askGistDescription: boolean = false; - public customFiles: { [key: string]: string } = {}; - public hostName: string = null; - public universalKeybindings: boolean = false; - public autoUploadDelay: number = 20; -} diff --git a/src/models/extensionConfig.model.ts b/src/models/extensionConfig.model.ts deleted file mode 100644 index d74242c2..00000000 --- a/src/models/extensionConfig.model.ts +++ /dev/null @@ -1,10 +0,0 @@ -export class ExtensionConfig { - public gist = null; - public quietSync = false; - public removeExtensions = true; - public syncExtensions = true; - public autoDownload = false; - public autoUpload = false; - public forceDownload = false; - public forceUpload = false; -} diff --git a/src/models/language-pack.model.ts b/src/models/language-pack.model.ts deleted file mode 100644 index f4571408..00000000 --- a/src/models/language-pack.model.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface ILanguagePack { - [key: string]: string; -} diff --git a/src/models/localConfig.model.ts b/src/models/localConfig.model.ts deleted file mode 100644 index 20a4fcbf..00000000 --- a/src/models/localConfig.model.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { CustomConfig } from "./customConfig.model"; -import { ExtensionConfig } from "./extensionConfig.model"; - -export class LocalConfig { - public publicGist: boolean = false; - public userName: string = null; - public name: string = null; - public extConfig = new ExtensionConfig(); - public customConfig = new CustomConfig(); -} diff --git a/src/models/settingType.model.ts b/src/models/settingType.model.ts deleted file mode 100644 index 638c640a..00000000 --- a/src/models/settingType.model.ts +++ /dev/null @@ -1,6 +0,0 @@ -export enum UISettingType { - TextInput = "textinput", - NumberInput = "numberinput", - Checkbox = "checkbox", - TextArea = "textarea" -} diff --git a/src/models/state.model.ts b/src/models/state.model.ts deleted file mode 100644 index 30d3944a..00000000 --- a/src/models/state.model.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { ExtensionContext } from "vscode"; -import Commons from "../commons"; -import { Environment } from "../environmentPath"; - -export interface IExtensionState { - context?: ExtensionContext; - environment?: Environment; - commons?: Commons; - instanceID: string; -} diff --git a/src/models/webview.model.ts b/src/models/webview.model.ts deleted file mode 100644 index 09f8649e..00000000 --- a/src/models/webview.model.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { WebviewPanel } from "vscode"; - -export interface IWebview { - name: string; - htmlPath: string; - htmlContent?: string; - webview?: WebviewPanel; - replaceables: Array<{}>; -} diff --git a/src/pragmaUtil.ts b/src/pragmaUtil.ts deleted file mode 100644 index 1bd9938d..00000000 --- a/src/pragmaUtil.ts +++ /dev/null @@ -1,291 +0,0 @@ -import { OsType } from "./enums"; -import { osTypeFromString, SUPPORTED_OS } from "./environmentPath"; -import localize from "./localize"; - -/** - * Comment/Uncomment lines if matches OS name or Hostname. - * Usage: @sync os=[OS name] host=[hostName] - * Notes: Hostname must be defined in sync.host setting. It could be used for parse any JSON valid string. - * @export - * @class PragmaUtil - */ -export default class PragmaUtil { - /** - * Process @sync pragma statements before file is saved. - * Comment lines that don't match with the user OS or host value. - * @static - * @param {string} newContent a valid JSON string - * @returns {string} - * @memberof PragmaUtil - */ - public static processBeforeWrite( - localContent: string, - newContent: string, - osType: OsType, - hostName: string - ): string { - const parsedLines: string[] = []; - const lines = newContent.split("\n"); - let osMatch: RegExpMatchArray; - let osFromPragma: string; - - let hostMatch: RegExpMatchArray; - let hostFromPragma: string; - - let envMatch: RegExpMatchArray; - let envFromPragma: string; - let currentLine: string = ""; - - for (let index = 0; index < lines.length; index++) { - let shouldComment = false; - currentLine = lines[index]; - if (this.PragmaRegExp.test(currentLine)) { - try { - // check OS pragma - osMatch = currentLine.match(/os=(\w+)/); - if (osMatch !== null) { - osFromPragma = osMatch[1].toLowerCase(); - - if (!SUPPORTED_OS.includes(osFromPragma)) { - continue; - } - if (osTypeFromString(osFromPragma) !== osType) { - shouldComment = true; - } - } - // check host pragma - hostMatch = currentLine.match(/host=(\S+)/); - if (hostMatch !== null) { - hostFromPragma = hostMatch[1]; - if ( - hostName === null || - hostName === "" || - hostFromPragma.toLowerCase() !== hostName.toLowerCase() - ) { - shouldComment = true; - } - } - - // check env pragma - envMatch = currentLine.match(/env=(\S+)/); - if (envMatch !== null) { - envFromPragma = envMatch[1]; - if (process.env[envFromPragma.toUpperCase()] === undefined) { - shouldComment = true; - } - } - parsedLines.push(currentLine); - index = this.checkNextLines( - lines, - parsedLines, - index, - false, - shouldComment - ); - } catch (e) { - console.error("Sync: Error processing pragmas ", e.message); - continue; - } - } else if (this.IgnorePragmaRegExp.test(currentLine)) { - index = this.checkNextLines(lines, parsedLines, index, true, false); - } else { - parsedLines.push(currentLine); - } - } - - let result = parsedLines.join("\n"); - const ignoredBlocks = this.getIgnoredBlocks(localContent); // get the settings that must prevail - if (ignoredBlocks) { - result = result.replace(/{\s*\n/, `{\n${ignoredBlocks}\n\n\n`); // 3 lines breaks to separate from other settings - } - // check is a valid JSON - - // remove comments and trailing comma - const uncommented = this.removeAllComments(result).replace(/,\s*\}/g, " }"); - try { - JSON.parse(uncommented); - } catch (e) { - console.error( - "Sync: Result content is not a valid JSON.", - e.message, - uncommented - ); - } - - return result; - } - - /** - * Remove @sync-ignore settings before upload. - * - * @static - * @param {string} fileContent - * @returns {string} - * @memberof PragmaUtil - */ - public static async processBeforeUpload( - fileContent: string - ): Promise { - const lines = fileContent.split("\n"); - let osMatch: RegExpMatchArray; - let osFromPragma: string; - - let hostMatch: RegExpMatchArray; - let hostFromPragma: string; - - let envMatch: RegExpMatchArray; - let envFromPragma: string; - - const parsedLines: string[] = []; - let currentLine = ""; - - for (let index = 0; index < lines.length; index++) { - currentLine = lines[index]; - - if (this.IgnorePragmaRegExp.test(currentLine)) { - index = this.checkNextLines(lines, parsedLines, index, true); - } else if (this.PragmaRegExp.test(currentLine)) { - // alert not supported OS - osMatch = currentLine.match(this.OSPragmaWhiteSpacesSupportRegExp); - if (osMatch !== null) { - osFromPragma = osMatch[1] || osMatch[2] || osMatch[3]; - - if (osFromPragma !== "" && /\s/.test(osFromPragma)) { - currentLine = currentLine.replace( - osFromPragma, - osFromPragma.trimLeft() - ); - } - - const trimmed = osFromPragma.toLowerCase().trim(); - if (!SUPPORTED_OS.includes(trimmed)) { - console.warn("Sync: Invalid OS", osFromPragma); - throw new Error( - localize( - "cmd.updateSettings.warning.OSNotSupported", - trimmed, - index + 1 - ) - ); - } - } - - hostMatch = currentLine.match(this.HostPragmaWhiteSpacesSupportRegExp); - if (hostMatch !== null) { - hostFromPragma = hostMatch[1] || hostMatch[2] || hostMatch[3]; - if (hostFromPragma !== "" && /\s/.test(hostFromPragma)) { - currentLine = currentLine.replace( - hostFromPragma, - hostFromPragma.trimLeft() - ); - } - } - - envMatch = currentLine.match(this.EnvPragmaWhiteSpacesSupportRegExp); - if (envMatch !== null) { - envFromPragma = envMatch[1] || envMatch[2] || envMatch[3]; - if (envFromPragma !== "" && /\s/.test(envFromPragma)) { - currentLine = currentLine.replace( - envFromPragma, - envFromPragma.trimLeft() - ); - } - } - - parsedLines.push(currentLine); - index = this.checkNextLines(lines, parsedLines, index, false, false); - } else { - parsedLines.push(currentLine); - } - } - return parsedLines.join("\n"); - } - - public static getIgnoredBlocks(content: string): string { - content = content.replace(/\@sync ignore/g, "@sync-ignore"); - const ignoredLines: string[] = []; - const lines = content.split("\n"); - let currentLine = ""; - for (let index = 0; index < lines.length; index++) { - currentLine = lines[index]; - if (this.IgnorePragmaRegExp.test(currentLine)) { - ignoredLines.push(currentLine); - index = this.checkNextLines( - lines, - ignoredLines, - index, - false, - false, - true - ); - } - } - return ignoredLines.join("\n"); - } - - public static removeAllComments(text: string): string { - return text.replace(/(? 0) { - currentLine = lines[++currentIndex]; - if (this.OpenBlockRegExp.test(currentLine)) { - ++openBlocks; - } else if (this.CloseBlockRegExp.test(currentLine)) { - --openBlocks; - if (checkTrailingComma && !currentLine.trim().endsWith(",")) { - // we add a coma to avoid parse error when we paste the ignored settings at the - // beginning of the file - currentLine = currentLine.trimRight() + ","; - } - } - if (!shouldIgnore) { - parsedLines.push(this.toggleComments(currentLine, shouldComment)); - } - } - - return currentIndex; - } -} diff --git a/src/service/autoUpload.service.ts b/src/service/autoUpload.service.ts deleted file mode 100644 index ba97963e..00000000 --- a/src/service/autoUpload.service.ts +++ /dev/null @@ -1,99 +0,0 @@ -import * as vscode from "vscode"; -import { watch } from "vscode-chokidar"; -import localize from "../localize"; -import lockfile from "../lockfile"; -import { CustomConfig } from "../models/customConfig.model"; -import { state } from "../state"; -import { Util } from "../util"; -import { FileService } from "./file.service"; - -export class AutoUploadService { - public static GetIgnoredItems(customSettings: CustomConfig) { - return [ - ...customSettings.ignoreUploadFolders.map(folder => `**/${folder}/**`), - ...customSettings.ignoreUploadFiles.map(file => `**/${file}`) - ]; - } - - public watching = false; - - private watcher = watch(state.environment.USER_FOLDER, { - depth: 2, - ignored: this.ignored - }); - - constructor(private ignored: string[]) { - vscode.extensions.onDidChange(async () => { - if (this.watching && vscode.window.state.focused) { - console.log("Sync: Extensions changed"); - if (await lockfile.Check(state.environment.FILE_SYNC_LOCK)) { - return; - } else { - await lockfile.Lock(state.environment.FILE_SYNC_LOCK); - } - const customConfig = await state.commons.GetCustomSettings(); - if (!customConfig.downloadPublicGist) { - await this.InitiateAutoUpload(); - } - await lockfile.Unlock(state.environment.FILE_SYNC_LOCK); - return; - } - }); - } - - public async StartWatching() { - this.StopWatching(); - - this.watching = true; - - this.watcher.addListener("change", async (path: string) => { - if (this.watching && vscode.window.state.focused) { - console.log(`Sync: ${FileService.ExtractFileName(path)} changed`); - if (await lockfile.Check(state.environment.FILE_SYNC_LOCK)) { - return; - } else { - await lockfile.Lock(state.environment.FILE_SYNC_LOCK); - } - - const customConfig = await state.commons.GetCustomSettings(); - if (customConfig) { - const fileType: string = path - .substring(path.lastIndexOf("."), path.length) - .slice(1); - if ( - customConfig.supportedFileExtensions.includes(fileType) && - !customConfig.downloadPublicGist - ) { - await this.InitiateAutoUpload(); - } - } - await lockfile.Unlock(state.environment.FILE_SYNC_LOCK); - return; - } - }); - } - - public StopWatching() { - if (this.watcher) { - this.watcher.removeAllListeners(); - } - this.watching = false; - } - - private async InitiateAutoUpload() { - const customSettings = await state.commons.GetCustomSettings(); - - vscode.window.setStatusBarMessage("").dispose(); - vscode.window.setStatusBarMessage( - localize("common.info.initAutoUpload").replace( - "{0}", - customSettings.autoUploadDelay - ), - 5000 - ); - - await Util.Sleep(customSettings.autoUploadDelay * 1000); - - vscode.commands.executeCommand("extension.updateSettings", "forceUpdate"); - } -} diff --git a/src/service/file.service.ts b/src/service/file.service.ts deleted file mode 100644 index 288064da..00000000 --- a/src/service/file.service.ts +++ /dev/null @@ -1,240 +0,0 @@ -"use strict"; - -import * as fs from "fs-extra"; -import * as path from "path"; -import * as recursiveRead from "recursive-readdir"; -import { CustomConfig } from "../models/customConfig.model"; - -export class File { - constructor( - public fileName: string, - public content: string, - public filePath: string, - public gistName: string - ) {} -} -export class FileService { - public static CUSTOMIZED_SYNC_PREFIX = "|customized_sync|"; - - public static async ReadFile(filePath: string): Promise { - try { - const data = await fs.readFile(filePath, { encoding: "utf8" }); - return data; - } catch (err) { - console.error(err); - throw err; - } - } - - public static async IsDirectory(filepath: string): Promise { - try { - const stat = await fs.lstat(filepath); - return stat.isDirectory(); - } catch (err) { - return false; - } - } - - public static async GetFile( - filePath: string, - fileName: string - ): Promise { - const fileExists: boolean = await FileService.FileExists(filePath); - - if (!fileExists) { - return null; - } - - const content = await FileService.ReadFile(filePath); - - if (content === null) { - return null; - } - - const pathFromUser: string = filePath.substring( - filePath.lastIndexOf("User") + 5, - filePath.length - ); - - const arr: string[] = pathFromUser.indexOf("/") - ? pathFromUser.split("/") - : pathFromUser.split(path.sep); - - let gistName: string = ""; - - arr.forEach((element, index) => { - if (index < arr.length - 1) { - gistName += element + "|"; - } else { - gistName += element; - } - }); - - const file: File = new File(fileName, content, filePath, gistName); - return file; - } - - public static async WriteFile( - filePath: string, - data: string - ): Promise { - if (!data) { - console.error( - new Error( - "Unable to write file. FilePath :" + filePath + " Data :" + data - ) - ); - return false; - } - try { - await fs.writeFile(filePath, data); - return true; - } catch (err) { - console.error(err); - return false; - } - } - - public static async ListFiles( - directory: string, - customSettings: CustomConfig - ): Promise { - function folderMatcher(file: string, stats: fs.Stats) { - if (stats.isDirectory()) { - return customSettings.ignoreUploadFolders.some(fold => { - return file.split(path.sep).includes(fold); - }); - } - return false; - } - function fileExtensionMatcher(file: string, stats: fs.Stats) { - if (stats.isDirectory()) { - return false; - } - const ext = path.extname(file).slice(1); - if (!customSettings.supportedFileExtensions.includes(ext)) { - return true; - } - return false; - } - const files = await recursiveRead(directory, [ - ...customSettings.ignoreUploadFiles, - folderMatcher, - fileExtensionMatcher - ]); - return Promise.all( - files.map(file => { - return FileService.GetFile(file, path.basename(file)); - }) - ); - } - - public static async CreateDirTree( - userFolder: string, - fileName: string - ): Promise { - let fullPath: string = userFolder; - let result: string; - - let paths: string[] = null; - if (fileName.indexOf("|") > -1) { - paths = fileName.split("|"); - } else if (fileName.indexOf("//") > -1) { - paths = fileName.split("//"); - } else if (fileName.indexOf("\\") > -1) { - paths = fileName.split("\\"); - } - - if (paths != null) { - for (let i = 0; i < paths.length - 1; i++) { - const element = paths[i]; - fullPath += element + path.sep; - await FileService.CreateDirectory(fullPath); - } - - result = fullPath + paths[paths.length - 1]; - return result; - } else { - result = fullPath + fileName; - - return result; - } - } - - public static async DeleteFile(filePath: string): Promise { - try { - const stat: boolean = await FileService.FileExists(filePath); - if (stat) { - await fs.unlink(filePath); - } - return true; - } catch (err) { - console.error("Unable to delete file. File Path is :" + filePath); - return false; - } - } - - public static async FileExists(filePath: string): Promise { - try { - await fs.access(filePath, fs.constants.F_OK); - return true; - } catch (err) { - return false; - } - } - - public static async CreateDirectory(name: string): Promise { - try { - await fs.mkdir(name); - return true; - } catch (err) { - if (err.code === "EEXIST") { - return false; - } - throw err; - } - } - - public static async GetCustomFile( - filePath: string, - fileName: string - ): Promise { - const fileExists: boolean = await FileService.FileExists(filePath); - - if (!fileExists) { - return null; - } - - const content = await FileService.ReadFile(filePath); - - if (content === null) { - return null; - } - - // for identifing Customized Sync file - const gistName: string = FileService.CUSTOMIZED_SYNC_PREFIX + fileName; - - const file: File = new File(fileName, content, filePath, gistName); - return file; - } - - public static async CreateCustomDirTree(filePath: string): Promise { - const dir = path.dirname(filePath); - const fileExists = await FileService.FileExists(dir); - - if (!fileExists) { - // mkdir recursively - await fs.mkdirs(dir); - } - - return filePath; - } - - public static ExtractFileName(fullPath: string): string { - return path.basename(fullPath); - } - - public static ConcatPath(...filePaths: string[]): string { - return filePaths.join(path.sep); - } -} diff --git a/src/service/github.oauth.service.ts b/src/service/github.oauth.service.ts deleted file mode 100644 index ca2256ff..00000000 --- a/src/service/github.oauth.service.ts +++ /dev/null @@ -1,136 +0,0 @@ -import * as express from "express"; -import { Server } from "http"; -import fetch from "node-fetch"; -import { URL, URLSearchParams } from "url"; -import Commons from "../commons"; -import { state } from "../state"; - -export class GitHubOAuthService { - public app: express.Express; - public server: Server; - - constructor(public port: number) { - this.app = express(); - this.app.use(express.json(), express.urlencoded({ extended: false })); - } - - public async StartProcess(cmd?: string) { - const customSettings = await state.commons.GetCustomSettings(); - const host = customSettings.githubEnterpriseUrl - ? new URL(customSettings.githubEnterpriseUrl) - : new URL("https://github.com"); - - this.server = this.app.listen(this.port); - this.app.get("/callback", async (req, res) => { - try { - const params = new URLSearchParams( - await (await this.getToken(req.param("code"), host)).text() - ); - - res.send(` - - - - - - - - -

Success! You may now close this tab.

- - - - `); - this.server.close(); - - const token = params.get("access_token"); - this.saveToken(token); - - const user = await this.getUser(token, host); - - const gists: any[] = await this.getGists(token, user, host); - - const gistViewList: any[] = gists.map(m => { - return { - id: m.id, - description: m.description, - updated_at: m.updated_at - }; - }); - - state.commons.webviewService.OpenGistSelectionpage(gistViewList, cmd); - } catch (err) { - const error = new Error(err); - Commons.LogException(error, state.commons.ERROR_MESSAGE, true); - } - }); - } - - public getToken(code: string, host: URL) { - const params = new URLSearchParams(); - params.append("client_id", "cfd96460d8b110e2351b"); - params.append("client_secret", "ed46bd3a0f736e0da57308e86ca5fa3cf8688582"); - params.append("code", code); - - const promise = fetch(`https://${host.hostname}/login/oauth/access_token`, { - method: "POST", - body: params - }); - - promise.catch(err => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - return promise; - } - - public async getGists(token: string, user: string, host: URL) { - const promise = fetch(`https://api.${host.hostname}/users/${user}/gists`, { - method: "GET", - headers: { Authorization: `token ${token}` } - }); - - promise.catch(err => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - const res = await promise; - const gists = await res.json(); - return gists; - } - - public async saveToken(token: string) { - const currentSettings = await state.commons.GetCustomSettings(); - currentSettings.token = token; - state.commons.SetCustomSettings(currentSettings); - } - - public async getUser(token: string, host: URL) { - const promise = fetch(`https://api.${host.hostname}/user`, { - method: "GET", - headers: { Authorization: `token ${token}` } - }); - - promise.catch(err => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - const res = await promise; - const json = await res.json(); - return json.login; - } -} diff --git a/src/service/github.service.ts b/src/service/github.service.ts deleted file mode 100644 index c9c2221d..00000000 --- a/src/service/github.service.ts +++ /dev/null @@ -1,203 +0,0 @@ -"use strict"; - -import * as GitHubApi from "@octokit/rest"; -import * as HttpsProxyAgent from "https-proxy-agent"; -import * as vscode from "vscode"; -import Commons from "../commons"; -import { CloudSettings } from "../models/cloudSettings.model"; -import { state } from "../state"; -import { File } from "./file.service"; - -interface IEnv { - [key: string]: string | undefined; - http_proxy: string; - HTTP_PROXY: string; -} - -interface IFixGistResponse extends Omit { - files: any | GitHubApi.GistsGetResponseFiles; -} - -export class GitHubService { - public userName: string = null; - public name: string = null; - private github: GitHubApi = null; - private GIST_JSON_EMPTY: any = { - description: "Visual Studio Code Sync Settings Gist", - public: false, - files: { - "settings.json": { - content: "// Empty" - }, - "launch.json": { - content: "// Empty" - }, - "keybindings.json": { - content: "// Empty" - }, - "extensions.json": { - content: "// Empty" - }, - "locale.json": { - content: "// Empty" - }, - "keybindingsMac.json": { - content: "// Empty" - }, - cloudSettings: { - content: "// Empty" - } - } - }; - - constructor(userToken: string, basePath: string) { - const githubApiConfig: GitHubApi.Options = {}; - - const proxyURL: string = - vscode.workspace.getConfiguration("http").get("proxy") || - (process.env as IEnv).http_proxy || - (process.env as IEnv).HTTP_PROXY; - if (basePath) { - githubApiConfig.baseUrl = basePath; - } - - if (proxyURL) { - githubApiConfig.agent = new HttpsProxyAgent(proxyURL); - } - - if (userToken !== null && userToken !== "") { - githubApiConfig.auth = `token ${userToken}`; - } - try { - this.github = new GitHubApi(githubApiConfig); - } catch (err) { - console.error(err); - } - if (userToken !== null && userToken !== "") { - this.github.users - .getAuthenticated({}) - .then(res => { - this.userName = res.data.login; - this.name = res.data.name; - console.log( - "Sync : Connected with user : " + "'" + this.userName + "'" - ); - }) - .catch(err => { - console.error(err); - }); - } - } - - public AddFile(list: File[], GIST_JSON_B: any) { - for (const file of list) { - if (file.content !== "") { - GIST_JSON_B.files[file.gistName] = {}; - GIST_JSON_B.files[file.gistName].content = file.content; - } - } - return GIST_JSON_B; - } - - public async CreateEmptyGIST( - publicGist: boolean, - gistDescription: string - ): Promise { - if (publicGist) { - this.GIST_JSON_EMPTY.public = true; - } else { - this.GIST_JSON_EMPTY.public = false; - } - if (gistDescription !== null && gistDescription !== "") { - this.GIST_JSON_EMPTY.description = gistDescription; - } - - try { - const res = await this.github.gists.create(this.GIST_JSON_EMPTY); - if (res.data && res.data.id) { - return res.data.id.toString(); - } else { - console.error("ID is null"); - console.log("Sync : " + "Response from GitHub is: "); - console.log(res); - } - } catch (err) { - console.error(err); - throw err; - } - } - - // This should return GitHubApi.Response but Types are wrong - public async ReadGist( - GIST: string - ): Promise> { - const promise = this.github.gists.get({ gist_id: GIST }); - const res = await promise.catch(err => { - if (String(err).includes("HttpError: Not Found")) { - return Commons.LogException(err, "Sync: Invalid Gist ID", true); - } - Commons.LogException(err, state.commons.ERROR_MESSAGE, true); - }); - if (res) { - return res; - } - } - - public async IsGistNewer( - GIST: string, - localLastDownload: Date - ): Promise { - const gist = await this.ReadGist(GIST); - if (!gist) { - return; - } - let gistCloudSetting: CloudSettings = null; - try { - gistCloudSetting = JSON.parse(gist.data.files.cloudSettings.content); - const gistLastUpload = new Date(gistCloudSetting.lastUpload); - if (!localLastDownload) { - return false; - } - return gistLastUpload > new Date(localLastDownload); - } catch (err) { - return false; - } - } - - public UpdateGIST(gistObject: any, files: File[]): any { - const allFiles: string[] = Object.keys(gistObject.data.files); - for (const fileName of allFiles) { - let exists = false; - - for (const settingFile of files) { - if (settingFile.gistName === fileName) { - exists = true; - } - } - - if (!exists && !fileName.startsWith("keybindings")) { - gistObject.data.files[fileName] = null; - } - } - - gistObject.data = this.AddFile(files, gistObject.data); - return gistObject; - } - - public async SaveGIST(gistObject: any): Promise { - gistObject.gist_id = gistObject.id; - // tslint:disable-next-line:comment-format - //TODO : use github.gists.update when issue is fixed. - const promise = this.github.request("PATCH /gists/:gist_id", gistObject); - const res = await promise.catch(err => { - if (String(err).includes("HttpError: Not Found")) { - return Commons.LogException(err, "Sync: Invalid Gist ID", true); - } - Commons.LogException(err, state.commons.ERROR_MESSAGE, true); - }); - - if (res) { - return true; - } - } -} diff --git a/src/service/plugin.service.ts b/src/service/plugin.service.ts deleted file mode 100644 index 12abe312..00000000 --- a/src/service/plugin.service.ts +++ /dev/null @@ -1,243 +0,0 @@ -"use strict"; -import * as vscode from "vscode"; - -export class ExtensionInformation { - public static fromJSON(text: string) { - try { - // TODO: JSON.parse may throw error - // Throw custom error should be more friendly - const obj = JSON.parse(text); - const meta = new ExtensionMetadata( - obj.meta.galleryApiUrl, - obj.meta.id, - obj.meta.downloadUrl, - obj.meta.publisherId, - obj.meta.publisherDisplayName, - obj.meta.date - ); - const item = new ExtensionInformation(); - item.metadata = meta; - item.name = obj.name; - item.publisher = obj.publisher; - item.version = obj.version; - return item; - } catch (err) { - throw new Error(err); - } - } - - public static fromJSONList(text: string) { - const extList: ExtensionInformation[] = []; - try { - // TODO: JSON.parse may throw error - // Throw custom error should be more friendly - const list = JSON.parse(text); - list.forEach(obj => { - const meta = new ExtensionMetadata( - obj.metadata.galleryApiUrl, - obj.metadata.id, - obj.metadata.downloadUrl, - obj.metadata.publisherId, - obj.metadata.publisherDisplayName, - obj.metadata.date - ); - const item = new ExtensionInformation(); - item.metadata = meta; - item.name = obj.name; - item.publisher = obj.publisher; - item.version = obj.version; - - if (item.name !== "code-settings-sync") { - extList.push(item); - } - }); - } catch (err) { - throw new Error(err); - } - - return extList; - } - - public metadata: ExtensionMetadata; - public name: string; - public version: string; - public publisher: string; -} - -export class ExtensionMetadata { - constructor( - public galleryApiUrl: string, - public id: string, - public downloadUrl: string, - public publisherId: string, - public publisherDisplayName: string, - public date: string - ) {} -} - -export class PluginService { - public static GetMissingExtensions( - remoteExt: string, - ignoredExtensions: string[] - ) { - const remoteList = ExtensionInformation.fromJSONList(remoteExt); - const localList = this.CreateExtensionList(); - - return remoteList.filter( - ext => - !ignoredExtensions.includes(ext.name) && - !localList.map(e => e.name).includes(ext.name) - ); - } - - public static GetDeletedExtensions( - remoteExtensions: ExtensionInformation[], - ignoredExtensions: string[] - ) { - const localExtensions = this.CreateExtensionList(); - - // for (var i = 0; i < remoteList.length; i++) { - - // var ext = remoteList[i]; - // var found: boolean = false; - - // for (var j = 0; j < localList.length; j++) { - // var localExt = localList[j]; - // if (ext.name == localExt.name) { - // found = true; - // break; - // } - // } - // if (!found) { - // deletedList.push(localExt); - // } - - // } - - return localExtensions.filter( - ext => - ext.name !== "code-settings-sync" && - !remoteExtensions.map(e => e.name).includes(ext.name) && - !ignoredExtensions.includes(ext.name) - ); - } - - public static CreateExtensionList() { - return vscode.extensions.all - .filter(ext => !ext.packageJSON.isBuiltin) - .map(ext => { - const meta = ext.packageJSON.__metadata || { - id: ext.packageJSON.uuid, - publisherId: ext.id, - publisherDisplayName: ext.packageJSON.publisher - }; - const data = new ExtensionMetadata( - meta.galleryApiUrl, - meta.id, - meta.downloadUrl, - meta.publisherId, - meta.publisherDisplayName, - meta.date - ); - const info = new ExtensionInformation(); - info.metadata = data; - info.name = ext.packageJSON.name; - info.publisher = ext.packageJSON.publisher; - info.version = ext.packageJSON.version; - return info; - }); - } - - public static async DeleteExtension( - extension: ExtensionInformation - ): Promise { - try { - await vscode.commands.executeCommand( - "workbench.extensions.uninstallExtension", - `${extension.publisher}.${extension.name}` - ); - return true; - } catch (err) { - throw new Error(err); - } - } - - public static async DeleteExtensions( - extensionsJson: string, - ignoredExtensions: string[] - ): Promise { - const remoteExtensions = ExtensionInformation.fromJSONList(extensionsJson); - const toDelete = PluginService.GetDeletedExtensions( - remoteExtensions, - ignoredExtensions - ); - - return Promise.all( - toDelete.map(async selectedExtension => { - try { - await PluginService.DeleteExtension(selectedExtension); - return selectedExtension; - } catch (err) { - throw new Error( - `Sync : Unable to delete extension ${selectedExtension.name} ${selectedExtension.version}: ${err}` - ); - } - }) - ); - } - - public static async InstallExtensions( - extensions: string, - ignoredExtensions: string[], - notificationCallBack: (...data: any[]) => void - ): Promise { - let addedExtensions: ExtensionInformation[] = []; - const missingExtensions = PluginService.GetMissingExtensions( - extensions, - ignoredExtensions - ); - if (missingExtensions.length === 0) { - notificationCallBack("Sync : No Extensions needs to be installed."); - return []; - } - addedExtensions = await PluginService.InstallWithAPI( - missingExtensions, - notificationCallBack - ); - return addedExtensions; - } - - public static async InstallWithAPI( - missingExtensions: ExtensionInformation[], - notificationCallBack: (...data: any[]) => void - ): Promise { - const addedExtensions: ExtensionInformation[] = []; - const missingExtensionsCount = missingExtensions.length; - notificationCallBack("TOTAL EXTENSIONS : " + missingExtensionsCount); - notificationCallBack(""); - notificationCallBack(""); - for (const ext of missingExtensions) { - const name = ext.publisher + "." + ext.name; - try { - notificationCallBack(""); - notificationCallBack(`[x] - EXTENSION: ${ext.name} - INSTALLING`); - await vscode.commands.executeCommand( - "workbench.extensions.installExtension", - name - ); - notificationCallBack(""); - notificationCallBack(`[x] - EXTENSION: ${ext.name} INSTALLED.`); - notificationCallBack( - ` ${missingExtensions.indexOf(ext) + - 1} OF ${missingExtensionsCount} INSTALLED`, - true - ); - notificationCallBack(""); - addedExtensions.push(ext); - } catch (err) { - throw new Error(err); - } - } - return addedExtensions; - } -} diff --git a/src/service/webview.service.ts b/src/service/webview.service.ts deleted file mode 100644 index 8bad69c1..00000000 --- a/src/service/webview.service.ts +++ /dev/null @@ -1,479 +0,0 @@ -import { readFileSync } from "fs-extra"; -import { has, set } from "lodash"; -import { URL } from "url"; -import * as vscode from "vscode"; -import Commons from "../commons"; -import localize from "../localize"; -import { CustomConfig } from "../models/customConfig.model"; -import { ExtensionConfig } from "../models/extensionConfig.model"; -import { UISettingType } from "../models/settingType.model"; -import { IWebview } from "../models/webview.model"; -import { state } from "../state"; -import { GitHubOAuthService } from "./github.oauth.service"; - -export class WebviewService { - private globalSettings = [ - { - name: localize("ext.globalConfig.token.name"), - placeholder: localize("ext.globalConfig.token.placeholder"), - type: UISettingType.TextInput, - correspondingSetting: "token" - }, - { - name: localize("ext.globalConfig.githubEnterpriseUrl.name"), - placeholder: localize("ext.globalConfig.githubEnterpriseUrl.placeholder"), - type: UISettingType.TextInput, - correspondingSetting: "githubEnterpriseUrl" - }, - - { - name: localize("ext.globalConfig.ignoreUploadFolders.name"), - placeholder: localize("ext.globalConfig.ignoreUploadFolders.placeholder"), - type: UISettingType.TextArea, - correspondingSetting: "ignoreUploadFolders" - }, - { - name: localize("ext.globalConfig.ignoreExtensions.name"), - placeholder: localize("ext.globalConfig.ignoreExtensions.placeholder"), - type: UISettingType.TextArea, - correspondingSetting: "ignoreExtensions" - }, - { - name: localize("ext.globalConfig.hostName.name"), - placeholder: localize("ext.globalConfig.hostName.placeholder"), - type: UISettingType.TextInput, - correspondingSetting: "hostName" - }, - { - name: localize("ext.globalConfig.ignoreUploadFiles.name"), - placeholder: localize("ext.globalConfig.ignoreUploadFiles.placeholder"), - type: UISettingType.TextArea, - correspondingSetting: "ignoreUploadFiles" - }, - { - name: localize("ext.globalConfig.supportedFileExtensions.name"), - placeholder: localize( - "ext.globalConfig.supportedFileExtensions.placeholder" - ), - type: UISettingType.TextArea, - correspondingSetting: "supportedFileExtensions" - }, - { - name: localize("ext.globalConfig.gistDescription.name"), - placeholder: localize("ext.globalConfig.gistDescription.placeholder"), - type: UISettingType.TextInput, - correspondingSetting: "gistDescription" - }, - { - name: localize("ext.globalConfig.autoUploadDelay.name"), - placeholder: localize("ext.globalConfig.autoUploadDelay.placeholder"), - type: UISettingType.NumberInput, - correspondingSetting: "autoUploadDelay" - }, - { - name: localize("ext.globalConfig.askGistDescription.name"), - placeholder: "", - type: UISettingType.Checkbox, - correspondingSetting: "askGistDescription" - }, - { - name: localize("ext.globalConfig.downloadPublicGist.name"), - placeholder: "", - type: UISettingType.Checkbox, - correspondingSetting: "downloadPublicGist" - }, - { - name: localize("ext.globalConfig.openTokenLink.name"), - placeholder: "", - type: UISettingType.Checkbox, - correspondingSetting: "openTokenLink" - } - ]; - - private environmentSettings = [ - { - name: localize("ext.config.gist.name"), - placeholder: localize("ext.config.gist.placeholder"), - type: UISettingType.TextInput, - correspondingSetting: "gist", - tooltip: localize("ext.config.gist") - }, - { - name: localize("ext.config.autoDownload.name"), - placeholder: "", - type: UISettingType.Checkbox, - correspondingSetting: "autoDownload", - tooltip: localize("ext.config.autoDownload") - }, - { - name: localize("ext.config.autoUpload.name"), - placeholder: "", - type: UISettingType.Checkbox, - correspondingSetting: "autoUpload", - tooltip: localize("ext.config.autoUpload") - }, - { - name: localize("ext.config.forceDownload.name"), - placeholder: "", - type: UISettingType.Checkbox, - correspondingSetting: "forceDownload", - tooltip: localize("ext.config.forceDownload") - }, - { - name: localize("ext.config.forceUpload.name"), - placeholder: "", - type: UISettingType.Checkbox, - correspondingSetting: "forceUpload", - tooltip: localize("ext.config.forceUpload") - }, - { - name: localize("ext.config.quietSync.name"), - placeholder: "", - type: UISettingType.Checkbox, - correspondingSetting: "quietSync", - tooltip: localize("ext.config.quietSync") - }, - { - name: localize("ext.config.removeExtensions.name"), - placeholder: "", - type: UISettingType.Checkbox, - correspondingSetting: "removeExtensions", - tooltip: localize("ext.config.removeExtensions") - }, - { - name: localize("ext.config.syncExtensions.name"), - placeholder: "", - type: UISettingType.Checkbox, - correspondingSetting: "syncExtensions", - tooltip: localize("ext.config.syncExtensions") - } - ]; - - private webviews: IWebview[] = [ - { - name: "landing-page", - htmlPath: "landing-page.html", - replaceables: [ - { - find: "@RELEASE_NOTES", - replace: "releaseNotes" - }, - { - find: "@CHECKED", - replace: "checked" - } - ] - }, - { - name: "settings", - htmlPath: "settings.html", - replaceables: [ - { - find: "@GLOBAL_DATA", - replace: "customSettings" - }, - { - find: "@ENV_DATA", - replace: "extSettings" - }, - { - find: "@GLOBAL_MAP", - replace: this.globalSettings - }, - { - find: "@ENV_MAP", - replace: this.environmentSettings - } - ] - }, - { - name: "gist-selection", - htmlPath: "gist-selection.html", - replaceables: [ - { - find: "@GISTS", - replace: "gists" - }, - { - find: "@SKIP", - replace: "skip" - } - ] - } - ]; - - constructor() { - this.webviews = this.webviews.map(view => { - return { - ...view, - htmlContent: readFileSync( - `${state.context.extensionPath}/ui/${view.name}/${view.htmlPath}`, - "utf-8" - ) - }; - }); - } - - public OpenSettingsPage( - customSettings: CustomConfig, - extSettings: ExtensionConfig - ): vscode.WebviewPanel { - const webview = this.webviews[1]; - const content: string = this.GenerateContent({ - content: webview.htmlContent, - items: webview.replaceables, - customSettings, - extSettings - }); - if (webview.webview) { - webview.webview.webview.html = content; - webview.webview.reveal(); - return webview.webview; - } - const settingsPanel = vscode.window.createWebviewPanel( - "syncSettings", - "Sync Settings", - vscode.ViewColumn.One, - { - retainContextWhenHidden: true, - enableScripts: true - } - ); - settingsPanel.webview.html = content; - settingsPanel.webview.onDidReceiveMessage(async message => { - if (message === "openGist") { - const [customConfig, extConfig] = await Promise.all([ - state.commons.GetCustomSettings(), - state.commons.GetSettings() - ]); - const host = customConfig.githubEnterpriseUrl - ? new URL(customConfig.githubEnterpriseUrl) - : new URL("https://github.com"); - const username = await new GitHubOAuthService(0).getUser( - customConfig.token, - host - ); - if (!username) { - return Commons.LogException( - null, - "Sync: Invalid Access Token.", - true - ); - } - vscode.env.openExternal( - vscode.Uri.parse( - `https://gist.${host.hostname}/${username}/${extConfig.gist}` - ) - ); - return; - } - this.ReceiveSettingChange(message, customSettings, extSettings); - }); - webview.webview = settingsPanel; - settingsPanel.onDidDispose(() => (webview.webview = null)); - return settingsPanel; - } - - public UpdateSettingsPage( - customSettings: CustomConfig, - extSettings: ExtensionConfig - ) { - const webview = this.webviews[1]; - if (webview.webview) { - webview.webview.webview.html = this.GenerateContent({ - content: webview.htmlContent, - items: webview.replaceables, - customSettings, - extSettings - }); - } - } - - public ReceiveSettingChange( - message: { - command: string; - text: string; - type: string; - }, - customSettings: CustomConfig, - extSettings: ExtensionConfig - ) { - let value: any = message.text; - if (message.text === "true" || message.text === "false") { - value = message.text === "true"; - } - if (message.type === "global") { - if (has(customSettings, message.command)) { - set(customSettings, message.command, value); - state.commons.SetCustomSettings(customSettings); - } - } else { - extSettings[message.command] = value; - state.commons.SaveSettings(extSettings); - } - } - - public IsLandingPageEnabled(): boolean { - return !state.context.globalState.get( - "landingPage.dontShowThisAgain" - ); - } - - public OpenLandingPage(cmd?: string) { - const webview = this.webviews[0]; - const releaseNotes = require("../../release-notes.json"); - const content: string = this.GenerateContent({ - content: webview.htmlContent, - items: webview.replaceables, - releaseNotes, - checked: this.IsLandingPageEnabled() - }); - if (webview.webview) { - webview.webview.webview.html = content; - webview.webview.reveal(); - return webview.webview; - } - const landingPanel = vscode.window.createWebviewPanel( - "landingPage", - "Welcome to Settings Sync", - vscode.ViewColumn.One, - { - retainContextWhenHidden: true, - enableScripts: true - } - ); - landingPanel.webview.onDidReceiveMessage(async message => { - switch (message.command) { - case "loginWithGitHub": - new GitHubOAuthService(54321).StartProcess(cmd); - const customSettings = await state.commons.GetCustomSettings(); - const host = customSettings.githubEnterpriseUrl - ? new URL(customSettings.githubEnterpriseUrl) - : new URL("https://github.com"); - vscode.commands.executeCommand( - "vscode.open", - vscode.Uri.parse( - `https://${host.hostname}/login/oauth/authorize?scope=gist%20read:user&client_id=cfd96460d8b110e2351b&redirect_uri=http://localhost:54321/callback` - ) - ); - break; - case "editConfiguration": - this.OpenSettingsPage( - await state.commons.GetCustomSettings(), - await state.commons.GetSettings() - ); - break; - case "downloadPublicGist": - const [extConfig, customConfig] = await Promise.all([ - state.commons.GetSettings(), - state.commons.GetCustomSettings() - ]); - const publicGist = await vscode.window.showInputBox({ - placeHolder: localize("common.placeholder.enterGistId"), - ignoreFocusOut: true - }); - if (!publicGist) { - break; - } - await state.commons.SetCustomSettings({ - ...customConfig, - downloadPublicGist: true - }); - await state.commons.SaveSettings({ - ...extConfig, - gist: publicGist - }); - vscode.window.showInformationMessage( - localize("cmd.otherOptions.warning.tokenNotRequire") - ); - vscode.commands.executeCommand("extension.downloadSettings"); - break; - case "dontShowThisAgain": - await state.context.globalState.update( - "landingPage.dontShowThisAgain", - message.data - ); - break; - } - }); - landingPanel.webview.html = content; - webview.webview = landingPanel; - landingPanel.onDidDispose(() => (webview.webview = null)); - return landingPanel; - } - - public OpenGistSelectionpage(gists: any, cmd?: string) { - const webview = this.webviews[2]; - const content: string = this.GenerateContent({ - content: webview.htmlContent, - items: webview.replaceables, - gists, - skip: - cmd !== "extension.downloadSettings" - ? `Skip (new one will be created upon first upload)` - : "" - }); - if (webview.webview) { - webview.webview.webview.html = content; - webview.webview.reveal(); - return webview.webview; - } - const gistSelectionPanel = vscode.window.createWebviewPanel( - "selectGist", - "Select Your Existing Gist", - vscode.ViewColumn.One, - { - retainContextWhenHidden: true, - enableScripts: true - } - ); - gistSelectionPanel.webview.html = content; - gistSelectionPanel.webview.onDidReceiveMessage(async message => { - if (!message.close) { - const extSettings = await state.commons.GetSettings(); - extSettings.gist = message.id; - state.commons.SaveSettings(extSettings); - } else { - gistSelectionPanel.dispose(); - } - }); - webview.webview = gistSelectionPanel; - gistSelectionPanel.onDidDispose(() => { - webview.webview = null; - if (cmd) { - vscode.commands.executeCommand(cmd); - } - }); - return gistSelectionPanel; - } - - private GenerateContent(options: any) { - const toReplace: Array<{}> = []; - options.items.forEach(option => { - if (typeof option.replace === "string") { - toReplace.push({ - ...option, - replace: JSON.stringify(options[option.replace]) - }); - } else { - toReplace.push({ - find: option.find, - replace: JSON.stringify(option.replace) - }); - } - }); - return toReplace - .reduce( - (acc, cur: any) => acc.replace(new RegExp(cur.find, "g"), cur.replace), - options.content - ) - .replace( - new RegExp("@PWD", "g"), - vscode.Uri.file(state.context.extensionPath) - .with({ - scheme: "vscode-resource" - }) - .toString() - ); - } -} diff --git a/src/state.ts b/src/state.ts deleted file mode 100644 index a51155cf..00000000 --- a/src/state.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { IExtensionState } from "./models/state.model"; - -export const state: IExtensionState = { - instanceID: Math.random().toString() -}; diff --git a/src/sync.ts b/src/sync.ts deleted file mode 100644 index 3e926481..00000000 --- a/src/sync.ts +++ /dev/null @@ -1,1145 +0,0 @@ -import * as fs from "fs-extra"; -import * as vscode from "vscode"; - -import Commons from "./commons"; -import { OsType } from "./enums"; -import localize from "./localize"; -import * as lockfile from "./lockfile"; -import { CloudSettings } from "./models/cloudSettings.model"; -import { CustomConfig } from "./models/customConfig.model"; -import { ExtensionConfig } from "./models/extensionConfig.model"; -import { LocalConfig } from "./models/localConfig.model"; -import PragmaUtil from "./pragmaUtil"; -import { File, FileService } from "./service/file.service"; -import { GitHubService } from "./service/github.service"; -import { ExtensionInformation, PluginService } from "./service/plugin.service"; -import { state } from "./state"; - -export class Sync { - /** - * Run when extension have been activated - */ - public async bootstrap(): Promise { - state.commons = new Commons(); - - await state.commons.StartMigrationProcess(); - const startUpSetting = await state.commons.GetSettings(); - const startUpCustomSetting = await state.commons.GetCustomSettings(); - - if (startUpSetting) { - const tokenAvailable: boolean = - startUpCustomSetting.token != null && startUpCustomSetting.token !== ""; - const gistAvailable: boolean = - startUpSetting.gist != null && startUpSetting.gist !== ""; - - if (!startUpCustomSetting.downloadPublicGist && !tokenAvailable) { - if (state.commons.webviewService.IsLandingPageEnabled()) { - state.commons.webviewService.OpenLandingPage(); - return; - } - } - - if (gistAvailable) { - if (startUpSetting.autoDownload) { - vscode.commands - .executeCommand("extension.downloadSettings") - .then(async () => { - if ( - startUpSetting.autoUpload && - tokenAvailable && - gistAvailable - ) { - await state.commons.HandleStartWatching(); - return; - } - }); - } else { - if (startUpSetting.autoUpload && tokenAvailable && gistAvailable) { - await state.commons.HandleStartWatching(); - return; - } - } - } - } - } - /** - * Upload setting to github gist - */ - public async upload(optArgument?: string): Promise { - // @ts-ignore - // const args = arguments; - let github: GitHubService = null; - const localConfig = await state.commons.InitalizeSettings(); - - if (!localConfig.customConfig.token) { - state.commons.webviewService.OpenLandingPage("extension.updateSettings"); - return; - } - - const allSettingFiles: File[] = []; - let uploadedExtensions: ExtensionInformation[] = []; - const ignoredExtensions: ExtensionInformation[] = []; - const dateNow = new Date(); - await state.commons.HandleStopWatching(); - - try { - localConfig.publicGist = false; - if (optArgument && optArgument === "publicGIST") { - localConfig.publicGist = true; - } - - github = new GitHubService( - localConfig.customConfig.token, - localConfig.customConfig.githubEnterpriseUrl - ); - - await startGitProcess.call( - this, - localConfig.extConfig, - localConfig.customConfig - ); - } catch (error) { - Commons.LogException(error, state.commons.ERROR_MESSAGE, true); - return; - } - - async function startGitProcess( - syncSetting: ExtensionConfig, - customSettings: CustomConfig - ) { - vscode.window.setStatusBarMessage( - localize("cmd.updateSettings.info.uploading"), - 2000 - ); - - if (customSettings.downloadPublicGist) { - if (customSettings.token == null || customSettings.token === "") { - vscode.window.showInformationMessage( - localize("cmd.updateSettings.warning.noToken") - ); - - return; - } - } - - vscode.window.setStatusBarMessage( - localize("cmd.updateSettings.info.readding"), - 2000 - ); - - // var remoteList = ExtensionInformation.fromJSONList(file.content); - // var deletedList = PluginService.GetDeletedExtensions(uploadedExtensions); - if (syncSetting.syncExtensions) { - uploadedExtensions = PluginService.CreateExtensionList(); - if ( - customSettings.ignoreExtensions && - customSettings.ignoreExtensions.length > 0 - ) { - uploadedExtensions = uploadedExtensions.filter(extension => { - if (customSettings.ignoreExtensions.includes(extension.name)) { - ignoredExtensions.push(extension); - return false; - } - return true; - }); - } - uploadedExtensions.sort((a, b) => a.name.localeCompare(b.name)); - const extensionFileName = state.environment.FILE_EXTENSION_NAME; - const extensionFilePath = state.environment.FILE_EXTENSION; - const extensionFileContent = JSON.stringify( - uploadedExtensions, - undefined, - 2 - ); - const extensionFile: File = new File( - extensionFileName, - extensionFileContent, - extensionFilePath, - extensionFileName - ); - allSettingFiles.push(extensionFile); - } - - const contentFiles = await FileService.ListFiles( - state.environment.USER_FOLDER, - customSettings - ); - - const customExist: boolean = await FileService.FileExists( - state.environment.FILE_CUSTOMIZEDSETTINGS - ); - if (customExist) { - const customFileKeys: string[] = Object.keys( - customSettings.customFiles - ); - if (customFileKeys.length > 0) { - for (const key of customFileKeys) { - const val = customSettings.customFiles[key]; - const customFile: File = await FileService.GetCustomFile(val, key); - if (customFile !== null) { - allSettingFiles.push(customFile); - } - } - } - } else { - Commons.LogException(null, state.commons.ERROR_MESSAGE, true); - return; - } - for (const snippetFile of contentFiles) { - if (snippetFile.fileName !== state.environment.FILE_KEYBINDING_MAC) { - if (snippetFile.content !== "") { - if ( - snippetFile.fileName === state.environment.FILE_KEYBINDING_NAME - ) { - snippetFile.gistName = - state.environment.OsType === OsType.Mac && - !customSettings.universalKeybindings - ? state.environment.FILE_KEYBINDING_MAC - : state.environment.FILE_KEYBINDING_DEFAULT; - } - if ( - snippetFile.fileName === state.environment.FILE_SETTING_NAME || - snippetFile.fileName === state.environment.FILE_KEYBINDING_MAC || - snippetFile.fileName === state.environment.FILE_KEYBINDING_DEFAULT - ) { - try { - const parsedContent = await PragmaUtil.processBeforeUpload( - snippetFile.content - ); - snippetFile.content = parsedContent; - } catch (e) { - Commons.LogException(null, e.message, true); - console.error(e); - return; - } - } - allSettingFiles.push(snippetFile); - } - } - } - - const extProp = new CloudSettings(); - extProp.lastUpload = dateNow; - const fileName: string = state.environment.FILE_CLOUDSETTINGS_NAME; - const fileContent: string = JSON.stringify(extProp); - const file: File = new File(fileName, fileContent, "", fileName); - allSettingFiles.push(file); - - let completed: boolean = false; - - let newGIST: boolean = false; - try { - if (syncSetting.gist == null || syncSetting.gist === "") { - if (customSettings.askGistDescription) { - customSettings.gistDescription = await state.commons.AskGistDescription(); - } - newGIST = true; - const gistID = await github.CreateEmptyGIST( - localConfig.publicGist, - customSettings.gistDescription - ); - if (gistID) { - syncSetting.gist = gistID; - vscode.window.setStatusBarMessage( - localize("cmd.updateSettings.info.newGistCreated"), - 2000 - ); - } else { - vscode.window.showInformationMessage( - localize("cmd.updateSettings.error.newGistCreateFail") - ); - return; - } - } - - let gistObj = await github.ReadGist(syncSetting.gist); - - if (!gistObj) { - return; - } - - if (gistObj.data.owner !== null) { - const gistOwnerName: string = gistObj.data.owner.login.trim(); - if (github.userName != null) { - const userName: string = github.userName.trim(); - if (gistOwnerName !== userName) { - Commons.LogException( - null, - "Sync : You cant edit GIST for user : " + - gistObj.data.owner.login, - true, - () => { - console.log("Sync : Current User : " + "'" + userName + "'"); - console.log( - "Sync : Gist Owner User : " + "'" + gistOwnerName + "'" - ); - } - ); - return; - } - } - } - - if (gistObj.data.public === true) { - localConfig.publicGist = true; - } - - if ( - !allSettingFiles.some(fileToUpload => { - if (fileToUpload.gistName === "cloudSettings") { - return false; - } - if (!gistObj.data.files[fileToUpload.gistName]) { - return true; - } - if ( - gistObj.data.files[fileToUpload.gistName].content !== - fileToUpload.content - ) { - console.info(`Sync: file ${fileToUpload.gistName} has changed`); - return true; - } - }) - ) { - // Gist files are the same as the local files. - if (!localConfig.extConfig.forceUpload) { - vscode.window.setStatusBarMessage( - localize("cmd.updateSettings.info.gotLatestVersion"), - 5000 - ); - // Exit early to avoid unneeded upload. - return; - } - // Fall through to upload code for forced upload case. - } else { - // Gist files are different from the local files. - const gistNewer = await github.IsGistNewer( - syncSetting.gist, - customSettings.lastDownload - ); - if (!customSettings.lastDownload) { - // Unable to compare the last gist upload time with the - // last download time, so ask user to force upload. - const message = await vscode.window.showInformationMessage( - localize("common.prompt.gistForceUpload"), - localize("common.button.yes"), - localize("common.button.no") - ); - if (message !== localize("common.button.yes")) { - vscode.window.setStatusBarMessage( - localize("cmd.updateSettings.info.uploadCanceled"), - 3000 - ); - return; - } - // Fall through to upload code for one-time forced upload. - } else if (gistNewer && !localConfig.extConfig.forceUpload) { - // Last local download is prior to the last gist upload, so - // the local settings may be out of date. - const message = await vscode.window.showInformationMessage( - localize("common.prompt.gistNewer"), - localize("common.button.yes"), - localize("common.button.no") - ); - if (message !== localize("common.button.yes")) { - vscode.window.setStatusBarMessage( - localize("cmd.updateSettings.info.uploadCanceled"), - 3000 - ); - return; - } - // Fall through to upload code for one-time forced upload. - } - // !gistNewer: Last local download is later or the same as last Gist upload, - // so OK to upload - fall through to upload code below. - } - - vscode.window.setStatusBarMessage( - localize("cmd.updateSettings.info.uploadingFile"), - 3000 - ); - - gistObj = github.UpdateGIST(gistObj, allSettingFiles); - completed = await github.SaveGIST(gistObj.data); - if (!completed) { - vscode.window.showErrorMessage( - localize("cmd.updateSettings.error.gistNotSave") - ); - return; - } - } catch (err) { - Commons.LogException(err, state.commons.ERROR_MESSAGE, true); - return; - } - - if (completed) { - try { - customSettings.lastUpload = dateNow; - customSettings.lastDownload = dateNow; - await state.commons.SaveSettings(syncSetting); - await state.commons.SetCustomSettings(customSettings); - if (newGIST) { - vscode.window.showInformationMessage( - localize( - "cmd.updateSettings.info.uploadingDone", - syncSetting.gist - ) - ); - } - - if (optArgument && optArgument === "publicGIST") { - vscode.window.showInformationMessage( - localize("cmd.updateSettings.info.shareGist") - ); - } - - if (!syncSetting.quietSync) { - state.commons.ShowSummaryOutput( - true, - allSettingFiles, - null, - uploadedExtensions, - ignoredExtensions, - localConfig - ); - vscode.window.setStatusBarMessage("").dispose(); - } else { - vscode.window.setStatusBarMessage("").dispose(); - vscode.window.setStatusBarMessage( - localize("cmd.updateSettings.info.uploadingSuccess"), - 5000 - ); - } - if (syncSetting.autoUpload) { - await state.commons.HandleStartWatching(); - } - } catch (err) { - Commons.LogException(err, state.commons.ERROR_MESSAGE, true); - } - } - } - } - /** - * Download setting from github gist - */ - public async download(): Promise { - const localSettings: LocalConfig = await state.commons.InitalizeSettings(); - - if ( - localSettings.customConfig.downloadPublicGist - ? !localSettings.extConfig.gist - : !localSettings.customConfig.token || !localSettings.extConfig.gist - ) { - state.commons.webviewService.OpenLandingPage( - "extension.downloadSettings" - ); - return; - } - - await state.commons.HandleStopWatching(); - - try { - await StartDownload(localSettings.extConfig, localSettings.customConfig); - } catch (err) { - Commons.LogException(err, state.commons.ERROR_MESSAGE, true); - return; - } - - async function StartDownload( - syncSetting: ExtensionConfig, - customSettings: CustomConfig - ) { - const github = new GitHubService( - customSettings.token, - customSettings.githubEnterpriseUrl - ); - vscode.window.setStatusBarMessage("").dispose(); - vscode.window.setStatusBarMessage( - localize("cmd.downloadSettings.info.readdingOnline"), - 2000 - ); - - const res = await github.ReadGist(syncSetting.gist); - - if (!res) { - return; - } - - let addedExtensions: ExtensionInformation[] = []; - let deletedExtensions: ExtensionInformation[] = []; - const ignoredExtensions: string[] = - customSettings.ignoreExtensions || new Array(); - const updatedFiles: File[] = []; - const actionList: Array> = []; - - if (res.data.public === true) { - localSettings.publicGist = true; - } - const keys = Object.keys(res.data.files); - if (keys.indexOf(state.environment.FILE_CLOUDSETTINGS_NAME) > -1) { - const cloudSettGist: object = JSON.parse( - res.data.files[state.environment.FILE_CLOUDSETTINGS_NAME].content - ); - const cloudSett: CloudSettings = Object.assign( - new CloudSettings(), - cloudSettGist - ); - - const lastUploadStr: string = customSettings.lastUpload - ? customSettings.lastUpload.toString() - : ""; - const lastDownloadStr: string = customSettings.lastDownload - ? customSettings.lastDownload.toString() - : ""; - - let upToDate: boolean = false; - if (lastDownloadStr !== "") { - upToDate = - new Date(lastDownloadStr).getTime() === - new Date(cloudSett.lastUpload).getTime(); - } - - if (lastUploadStr !== "") { - upToDate = - upToDate || - new Date(lastUploadStr).getTime() === - new Date(cloudSett.lastUpload).getTime(); - } - - if (!syncSetting.forceDownload) { - if (upToDate) { - vscode.window.setStatusBarMessage("").dispose(); - vscode.window.setStatusBarMessage( - localize("cmd.downloadSettings.info.gotLatestVersion"), - 5000 - ); - return; - } - } - customSettings.lastDownload = cloudSett.lastUpload; - } - - keys.forEach(gistName => { - if (res.data.files[gistName]) { - if (res.data.files[gistName].content) { - const prefix = FileService.CUSTOMIZED_SYNC_PREFIX; - if (gistName.indexOf(prefix) > -1) { - const fileName = gistName.split(prefix).join(""); // |customized_sync|.htmlhintrc => .htmlhintrc - if (!(fileName in customSettings.customFiles)) { - // syncLocalSettings.json > customFiles doesn't have key - return; - } - const f: File = new File( - fileName, - res.data.files[gistName].content, - customSettings.customFiles[fileName], - gistName - ); - updatedFiles.push(f); - } else if (gistName.indexOf(".") > -1) { - if (customSettings.universalKeybindings) { - if (gistName === state.environment.FILE_KEYBINDING_MAC) { - return; - } - } else { - if ( - state.environment.OsType === OsType.Mac && - gistName === state.environment.FILE_KEYBINDING_DEFAULT - ) { - return; - } - if ( - state.environment.OsType !== OsType.Mac && - gistName === state.environment.FILE_KEYBINDING_MAC - ) { - return; - } - } - const f: File = new File( - gistName, - res.data.files[gistName].content, - null, - gistName - ); - updatedFiles.push(f); - } - } - } else { - console.log(gistName + " key in response is empty."); - } - }); - - for (const file of updatedFiles) { - let writeFile: boolean = false; - let content: string = file.content; - - if (content !== "") { - if (file.gistName === state.environment.FILE_EXTENSION_NAME) { - if (syncSetting.syncExtensions) { - if (syncSetting.removeExtensions) { - try { - deletedExtensions = await PluginService.DeleteExtensions( - content, - ignoredExtensions - ); - } catch (err) { - vscode.window.showErrorMessage( - localize("cmd.downloadSettings.error.removeExtFail") - ); - throw new Error(err); - } - } - - try { - if (!syncSetting.quietSync) { - Commons.outputChannel = vscode.window.createOutputChannel( - "Code Settings Sync" - ); - Commons.outputChannel.clear(); - Commons.outputChannel.appendLine( - `Realtime Extension Download Summary` - ); - Commons.outputChannel.appendLine(`--------------------`); - Commons.outputChannel.show(); - } - - addedExtensions = await PluginService.InstallExtensions( - content, - ignoredExtensions, - (message: string, dispose: boolean) => { - if (!syncSetting.quietSync) { - Commons.outputChannel.appendLine(message); - } else { - console.log(message); - if (dispose) { - vscode.window.setStatusBarMessage( - "Sync : " + message, - 3000 - ); - } - } - } - ); - } catch (err) { - throw new Error(err); - } - } - } else { - writeFile = true; - if ( - file.gistName === state.environment.FILE_KEYBINDING_DEFAULT || - file.gistName === state.environment.FILE_KEYBINDING_MAC - ) { - let test: string = ""; - state.environment.OsType === OsType.Mac && - !customSettings.universalKeybindings - ? (test = state.environment.FILE_KEYBINDING_MAC) - : (test = state.environment.FILE_KEYBINDING_DEFAULT); - if (file.gistName !== test) { - writeFile = false; - } - } - if (writeFile) { - if (file.gistName === state.environment.FILE_KEYBINDING_MAC) { - file.fileName = state.environment.FILE_KEYBINDING_DEFAULT; - } - let filePath: string = ""; - if (file.filePath !== null) { - filePath = await FileService.CreateCustomDirTree(file.filePath); - } else { - filePath = await FileService.CreateDirTree( - state.environment.USER_FOLDER, - file.fileName - ); - } - - if ( - file.gistName === state.environment.FILE_SETTING_NAME || - file.gistName === state.environment.FILE_KEYBINDING_MAC || - file.gistName === state.environment.FILE_KEYBINDING_DEFAULT - ) { - const fileExists = await FileService.FileExists(filePath); - - if (fileExists) { - const localContent = await FileService.ReadFile(filePath); - content = PragmaUtil.processBeforeWrite( - localContent, - content, - state.environment.OsType, - localSettings.customConfig.hostName - ); - } - } - - actionList.push( - FileService.WriteFile(filePath, content) - .then(() => { - // TODO : add Name attribute in File and show information message here with name , when required. - }) - .catch(err => { - Commons.LogException( - err, - state.commons.ERROR_MESSAGE, - true - ); - return; - }) - ); - } - } - } - } - - await Promise.all(actionList); - const settingsUpdated = await state.commons.SaveSettings(syncSetting); - const customSettingsUpdated = await state.commons.SetCustomSettings( - customSettings - ); - if (settingsUpdated && customSettingsUpdated) { - if (!syncSetting.quietSync) { - state.commons.ShowSummaryOutput( - false, - updatedFiles, - deletedExtensions, - addedExtensions, - null, - localSettings - ); - if (deletedExtensions.length > 0 || addedExtensions.length > 0) { - const message = await vscode.window.showInformationMessage( - localize("common.prompt.restartCode"), - "Yes" - ); - if (message === "Yes") { - vscode.commands.executeCommand("workbench.action.reloadWindow"); - } - } - vscode.window.setStatusBarMessage("").dispose(); - } else { - vscode.window.setStatusBarMessage("").dispose(); - vscode.window.setStatusBarMessage( - localize("cmd.downloadSettings.info.downloaded"), - 5000 - ); - } - if (syncSetting.autoUpload) { - await state.commons.HandleStartWatching(); - } - } else { - vscode.window.showErrorMessage( - localize("cmd.downloadSettings.error.unableSave") - ); - } - } - } - /** - * Reset the setting to Sync - */ - public async reset(): Promise { - let extSettings: ExtensionConfig = null; - let localSettings: CustomConfig = null; - - vscode.window.setStatusBarMessage( - localize("cmd.resetSettings.info.resetting"), - 2000 - ); - - try { - extSettings = new ExtensionConfig(); - localSettings = new CustomConfig(); - - await Promise.all([ - state.context.globalState.update("landingPage.dontShowThisAgain", false) - ]); - - const [extSaved, customSaved, lockExist] = await Promise.all([ - state.commons.SaveSettings(extSettings), - state.commons.SetCustomSettings(localSettings), - FileService.FileExists(state.environment.FILE_SYNC_LOCK) - ]); - - if (!lockExist) { - fs.closeSync(fs.openSync(state.environment.FILE_SYNC_LOCK, "w")); - } - - // check is sync locking - if (await lockfile.Check(state.environment.FILE_SYNC_LOCK)) { - await lockfile.Unlock(state.environment.FILE_SYNC_LOCK); - } - - if (extSaved && customSaved) { - vscode.window.showInformationMessage( - localize("cmd.resetSettings.info.settingClear") - ); - } - - state.commons.webviewService.UpdateSettingsPage( - localSettings, - extSettings - ); - } catch (err) { - Commons.LogException( - err, - "Sync : Unable to clear settings. Error Logged on console. Please open an issue.", - true - ); - } - } - public async how() { - return vscode.commands.executeCommand( - "vscode.open", - vscode.Uri.parse( - "http://shanalikhan.github.io/2015/12/15/Visual-Studio-Code-Sync-Settings.html" - ) - ); - } - public async advance() { - const setting: ExtensionConfig = await state.commons.GetSettings(); - const customSettings: CustomConfig = await state.commons.GetCustomSettings(); - if (customSettings == null) { - vscode.window - .showInformationMessage( - localize("cmd.otherOptions.triggerReset"), - localize("common.button.yes") - ) - .then(val => { - if (val === localize("common.button.yes")) { - vscode.commands.executeCommand("extension.resetSettings"); - } - }); - } - const localSetting: LocalConfig = new LocalConfig(); - const tokenAvailable: boolean = - customSettings.token != null && customSettings.token !== ""; - const gistAvailable: boolean = setting.gist != null && setting.gist !== ""; - - const items: string[] = [ - "cmd.otherOptions.openSettingsPage", - "cmd.otherOptions.editLocalSetting", - "cmd.otherOptions.shareSetting", - "cmd.otherOptions.downloadSetting", - "cmd.otherOptions.toggleForceDownload", - "cmd.otherOptions.toggleForceUpload", - "cmd.otherOptions.toggleAutoUpload", - "cmd.otherOptions.toggleAutoDownload", - "cmd.otherOptions.toggleSummaryPage", - "cmd.otherOptions.customizedSync", - "cmd.otherOptions.downloadCustomFile", - "cmd.otherOptions.joinCommunity", - "cmd.otherOptions.openIssue", - "cmd.otherOptions.releaseNotes" - ].map(localize); - - let selectedItem: number = 0; - let settingChanged: boolean = false; - - const item = await vscode.window.showQuickPick(items); - - // if not pick anyone, do nothing - if (!item) { - return; - } - - const index = items.findIndex(v => v === item); - - const handlerMap = [ - async () => { - state.commons.webviewService.OpenSettingsPage(customSettings, setting); - }, - async () => { - const file: vscode.Uri = vscode.Uri.file( - state.environment.FILE_CUSTOMIZEDSETTINGS - ); - fs.openSync(file.fsPath, "r"); - const document = await vscode.workspace.openTextDocument(file); - await vscode.window.showTextDocument( - document, - vscode.ViewColumn.One, - true - ); - }, - async () => { - // share public gist - const answer = await vscode.window.showInformationMessage( - localize("cmd.otherOptions.shareSetting.beforeConfirm"), - "Yes" - ); - - if (answer === "Yes") { - localSetting.publicGist = true; - settingChanged = true; - setting.gist = ""; - selectedItem = 1; - customSettings.downloadPublicGist = false; - await state.commons.SetCustomSettings(customSettings); - } - }, - async () => { - // Download Settings from Public GIST - selectedItem = 2; - customSettings.downloadPublicGist = true; - settingChanged = true; - await state.commons.SetCustomSettings(customSettings); - }, - async () => { - // toggle force download - selectedItem = 3; - settingChanged = true; - setting.forceDownload = !setting.forceDownload; - }, - async () => { - // toggle force upload - selectedItem = 4; - settingChanged = true; - setting.forceUpload = !setting.forceUpload; - }, - async () => { - // toggle auto upload - selectedItem = 5; - settingChanged = true; - setting.autoUpload = !setting.autoUpload; - }, - async () => { - // auto download on startup - selectedItem = 6; - settingChanged = true; - if (!setting) { - vscode.commands.executeCommand("extension.HowSettings"); - return; - } - if (!gistAvailable) { - vscode.commands.executeCommand("extension.HowSettings"); - return; - } - - setting.autoDownload = !setting.autoDownload; - }, - async () => { - // page summary toggle - selectedItem = 7; - settingChanged = true; - - if (!tokenAvailable || !gistAvailable) { - vscode.commands.executeCommand("extension.HowSettings"); - return; - } - setting.quietSync = !setting.quietSync; - }, - async () => { - // add customized sync file - const options: vscode.InputBoxOptions = { - ignoreFocusOut: true, - placeHolder: localize("cmd.otherOptions.customizedSync.placeholder"), - prompt: localize("cmd.otherOptions.customizedSync.prompt") - }; - const input = await vscode.window.showInputBox(options); - - if (input) { - const fileName: string = FileService.ExtractFileName(input); - if (fileName === "") { - return; - } - customSettings.customFiles[fileName] = input; - const done: boolean = await state.commons.SetCustomSettings( - customSettings - ); - if (done) { - vscode.window.showInformationMessage( - localize("cmd.otherOptions.customizedSync.done", fileName) - ); - } - } - }, - async () => { - // Import customized sync file to workspace - const customFiles = await this.getCustomFilesFromGist( - customSettings, - setting - ); - if (customFiles.length < 1) { - return; - } - const options: vscode.QuickPickOptions = { - ignoreFocusOut: true, - placeHolder: localize( - "cmd.otherOptions.downloadCustomFile.placeholder" - ) - }; - const fileName = await vscode.window.showQuickPick( - customFiles.map(file => { - return file.fileName; - }), - options - ); - // if not pick anyone, do nothing - if (!fileName) { - return; - } - const selected = customFiles.find(f => { - return f.fileName === fileName; - }); - if (selected && vscode.workspace.rootPath) { - const downloadPath = FileService.ConcatPath( - vscode.workspace.rootPath, - selected.fileName - ); - const done = await FileService.WriteFile( - downloadPath, - selected.content - ); - if (done) { - vscode.window.showInformationMessage( - localize("cmd.otherOptions.downloadCustomFile.done", downloadPath) - ); - } - } - }, - async () => { - vscode.commands.executeCommand( - "vscode.open", - vscode.Uri.parse( - "https://join.slack.com/t/codesettingssync/shared_invite/enQtNzQyODMzMzI5MDQ3LWNmZjVkZjE2YTg0MzY1Y2EyYzVmYThmNzg2YjZkNjhhZWY3ZTEzN2I3ZTAxMjkwNWU0ZjMyZGFhMjdiZDI3ODU" - ) - ); - }, - async () => { - vscode.commands.executeCommand( - "vscode.open", - vscode.Uri.parse( - "https://github.com/shanalikhan/code-settings-sync/issues/new" - ) - ); - }, - async () => { - vscode.commands.executeCommand( - "vscode.open", - vscode.Uri.parse( - "http://shanalikhan.github.io/2016/05/14/Visual-studio-code-sync-settings-release-notes.html" - ) - ); - } - ]; - - try { - await handlerMap[index](); - if (settingChanged) { - if (selectedItem === 1) { - await state.commons.HandleStopWatching(); - } - await state.commons - .SaveSettings(setting) - .then((added: boolean) => { - if (added) { - const callbackMap = { - 1: async () => { - return await vscode.commands.executeCommand( - "extension.updateSettings", - "publicGIST" - ); - }, - 2: async () => { - return await vscode.window.showInformationMessage( - localize("cmd.otherOptions.warning.tokenNotRequire") - ); - }, - 3: async () => { - const message = setting.forceDownload - ? "cmd.otherOptions.toggleForceDownload.on" - : "cmd.otherOptions.toggleForceDownload.off"; - return vscode.window.showInformationMessage( - localize(message) - ); - }, - 4: async () => { - const message = setting.forceUpload - ? "cmd.otherOptions.toggleForceUpload.on" - : "cmd.otherOptions.toggleForceUpload.off"; - return vscode.window.showInformationMessage( - localize(message) - ); - }, - 5: async () => { - const message = setting.autoUpload - ? "cmd.otherOptions.toggleAutoUpload.on" - : "cmd.otherOptions.toggleAutoUpload.off"; - return vscode.window.showInformationMessage( - localize(message) - ); - }, - 6: async () => { - const message = setting.autoDownload - ? "cmd.otherOptions.toggleAutoDownload.on" - : "cmd.otherOptions.toggleAutoDownload.off"; - return vscode.window.showInformationMessage( - localize(message) - ); - }, - 7: async () => { - const message = setting.quietSync - ? "cmd.otherOptions.quietSync.on" - : "cmd.otherOptions.quietSync.off"; - return vscode.window.showInformationMessage( - localize(message) - ); - } - }; - - if (callbackMap[selectedItem]) { - return callbackMap[selectedItem](); - } - } else { - return vscode.window.showErrorMessage( - localize("cmd.otherOptions.error.toggleFail") - ); - } - }) - .catch(err => { - Commons.LogException( - err, - "Sync : Unable to toggle. Please open an issue.", - true - ); - }); - } - } catch (err) { - Commons.LogException(err, "Error", true); - return; - } - } - - private async getCustomFilesFromGist( - customSettings: CustomConfig, - syncSetting: ExtensionConfig - ): Promise { - const github = new GitHubService( - customSettings.token, - customSettings.githubEnterpriseUrl - ); - const res = await github.ReadGist(syncSetting.gist); - if (!res) { - return []; - } - const keys = Object.keys(res.data.files); - const customFiles: File[] = []; - keys.forEach(gistName => { - if (res.data.files[gistName]) { - if (res.data.files[gistName].content) { - const prefix = FileService.CUSTOMIZED_SYNC_PREFIX; - if (gistName.indexOf(prefix) > -1) { - const fileName = gistName.split(prefix).join(""); // |customized_sync|.htmlhintrc => .htmlhintrc - const f: File = new File( - fileName, - res.data.files[gistName].content, - fileName in customSettings.customFiles - ? customSettings.customFiles[fileName] - : null, - gistName - ); - customFiles.push(f); - } - } - } - }); - return customFiles; - } -} diff --git a/src/test/extension.test.ts b/src/test/extension.test.ts new file mode 100644 index 00000000..4ca0ab41 --- /dev/null +++ b/src/test/extension.test.ts @@ -0,0 +1,15 @@ +import * as assert from 'assert'; + +// You can import and use all API from the 'vscode' module +// as well as import your extension to test it +import * as vscode from 'vscode'; +// import * as myExtension from '../../extension'; + +suite('Extension Test Suite', () => { + vscode.window.showInformationMessage('Start all tests.'); + + test('Sample test', () => { + assert.strictEqual(-1, [1, 2, 3].indexOf(5)); + assert.strictEqual(-1, [1, 2, 3].indexOf(0)); + }); +}); diff --git a/src/util.ts b/src/util.ts deleted file mode 100644 index d090b916..00000000 --- a/src/util.ts +++ /dev/null @@ -1,31 +0,0 @@ -"use strict"; - -export class Util { - public static async Sleep(ms: number): Promise { - return new Promise(resolve => { - setTimeout(() => { - resolve(ms); - }, ms); - }); - } - /** - * promisify the function - * it will be remove when vscode use node@^8.0 - * @param fn - */ - public static promisify( - fn: (...args: any[]) => any - ): (...whatever: any[]) => Promise { - return function(...argv) { - return new Promise((resolve, reject) => { - fn.call(this, ...argv, (err, data) => { - if (err) { - reject(err); - } else { - resolve(data); - } - }); - }); - }; - } -} diff --git a/test/extension.test.ts b/test/extension.test.ts deleted file mode 100644 index 1f248602..00000000 --- a/test/extension.test.ts +++ /dev/null @@ -1,3 +0,0 @@ -describe("PragmaUtil", () => { - require("./pragmaUtil"); -}); diff --git a/test/index.ts b/test/index.ts deleted file mode 100644 index abb2dd76..00000000 --- a/test/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -import * as testRunner from "vscode/lib/testrunner"; - -testRunner.configure({ - ui: "bdd", - useColors: true, - timeout: 5000 -}); -module.exports = testRunner; diff --git a/test/pragmaUtil/index.ts b/test/pragmaUtil/index.ts deleted file mode 100644 index 87a46edf..00000000 --- a/test/pragmaUtil/index.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { expect } from "chai"; -import fs = require("fs"); -import { OsType } from "../../src/enums"; -import PragmaUtil from "../../src/pragmaUtil"; - -let testSettings = null; - -describe("Process before upload", function() { - this.beforeAll(() => { - testSettings = fs.readFileSync( - __dirname + "/../../../test/pragmaUtil/testSettings.txt", - "utf8" - ); - }); - - it("should trim os, host and env", async () => { - const result = await PragmaUtil.processBeforeUpload(testSettings); - await expect(result).to.match(/@sync os=linux host=trim env=TEST_ENV/); - }); - - it("should uncomment all lines", async () => { - const commentedSettings = ` - // @sync os=linux - // "window": 1, - // @sync os=mac - // "server": "http://exmaple.com - `; - - const result = await PragmaUtil.processBeforeUpload(commentedSettings); - await expect(result) - .to.match(/\s+"window"/) - .and.to.match(/\s+"server"/); - }); - - it("should uncomment lines before write file for os=linux", () => { - const commentedSettings = `{ - // @sync os=linux - // "linux": 1, - // @sync os=mac - "mac": 1 - }`; - const processed = PragmaUtil.processBeforeWrite( - commentedSettings, - commentedSettings, - OsType.Linux, - null - ); - expect(processed) - .to.match(/\s+"linux"/) - .and.to.match(/\s+\/\/\s+"mac"/); - }); - - it("should not comment os=linux settings lines", async () => { - let processed = await PragmaUtil.processBeforeUpload(testSettings); - processed = PragmaUtil.processBeforeWrite( - processed, - processed, - OsType.Linux, - null - ); - expect(processed).to.match(/\s+"not_commented"/); - }); - - it("should leave only settings that matches with os=mac host=mac2 env=TEST_ENV", async () => { - const processed = await PragmaUtil.processBeforeUpload(testSettings); - // tslint:disable-next-line:no-string-literal - process.env["TEST_ENV"] = "1"; - await expect( - PragmaUtil.processBeforeWrite(processed, processed, OsType.Mac, "mac2") - ) - .to.match(/\n\s+"mac2"/) - .and.match(/\n\s+"mactest"/); - }); - - it("should remove all comments and parse JSON", () => { - const possibleJson = PragmaUtil.removeAllComments(testSettings); - expect(JSON.parse.bind(null, possibleJson)).to.not.throw(); - }); - - it("should parse multi-line settings", () => { - const commentedSettings = `{ - // @sync os=linux - "multi": { - "setting": false, - "settingWithBrackets": "{} []", - "multi": { - } - }, - // @sync os=mac - "mac": 1 - }`; - const processed = PragmaUtil.processBeforeWrite( - commentedSettings, - commentedSettings, - OsType.Mac, - null - ); - expect(processed) - .to.match(/\/{2}\s+"multi"/) - .and.to.match(/\/{2}\s+"setting"/) - .and.to.match(/\/{2}\s+"settingWithBrackets"/) - .and.to.match(/\/{2}\s+},/) - .and.to.match(/\s+"mac"/); - }); -}); diff --git a/test/pragmaUtil/testSettings.txt b/test/pragmaUtil/testSettings.txt deleted file mode 100644 index 14f05281..00000000 --- a/test/pragmaUtil/testSettings.txt +++ /dev/null @@ -1,35 +0,0 @@ -{ - - // @sync os=windows host=h1 - "setting.test": 1, - - // @sync os=windows host=h2 - "setting.test": 2, - - // @sync os= linux host= trim env= TEST_ENV - //"setting.test": 3, - - // @sync os=linux - "not_commented": 4, - - // @sync host=_mac1_ os=mac - "setting.test": 5, - - // @sync host=mac2 os=mac env=TEST_ENV - //"mac2": 3, - - // @sync host=mac2 - //"server": "http://example.com", - - // @sync os=mac - "mactest": "", - - // @sync host=test1 - "onlyHost": "", - - // @sync-ignore - "test4": 12, - - // @sync ignore - "test5": 12 -} \ No newline at end of file diff --git a/test/service/fileService/dummyrc b/test/service/fileService/dummyrc deleted file mode 100644 index 02eb9c90..00000000 --- a/test/service/fileService/dummyrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "hoge": true, -} \ No newline at end of file diff --git a/test/service/fileService/fileService.test.ts b/test/service/fileService/fileService.test.ts deleted file mode 100644 index ac6dfcd2..00000000 --- a/test/service/fileService/fileService.test.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { expect } from "chai"; - -import { File, FileService } from "../../../src/service/file.service"; - -describe("FileService", () => { - it("should get custom file info", async () => { - const expected = new File( - "dummyrc", - '{\n "hoge": true,\n}', - __dirname + "/../../../../test/service/fileService/dummyrc", - "|customized_sync|dummyrc" - ); - const actual = await FileService.GetCustomFile( - __dirname + "/../../../../test/service/fileService/dummyrc", // __dirname => out/src/test/service - "dummyrc" - ); - expect(actual).to.deep.equals(expected); - }); - - it("should return null if file does not exists", async () => { - const actual = await FileService.GetCustomFile( - __dirname + "/../../../../test/service/fileService/hoge", - "hoge" - ); - expect(actual).to.be.equals(null); - }); - - it("should join by path separator", () => { - const actual = FileService.ConcatPath( - "/User/path/to", - "hoge/piyo", - "hoge.txt" - ); - expect(actual).to.be.equals("/User/path/to/hoge/piyo/hoge.txt"); - }); -}); diff --git a/tsconfig.json b/tsconfig.json index 1fe9bcaf..8a79f20f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,13 +1,16 @@ { - "compilerOptions": { - "module": "commonjs", - "target": "es5", - "outDir": "out", - "lib": ["es2015", "es2016", "es2017", "es2018", "esnext"], - "sourceMap": true, - "rootDir": ".", - "noUnusedLocals": true, - "noUnusedParameters": true - }, - "exclude": ["node_modules", ".vscode-test"] + "compilerOptions": { + "module": "Node16", + "target": "ES2022", + "lib": [ + "ES2022" + ], + "sourceMap": true, + "rootDir": "src", + "strict": true /* enable all strict type-checking options */ + /* Additional Checks */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + } } diff --git a/tslint.json b/tslint.json deleted file mode 100644 index e37dd33b..00000000 --- a/tslint.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "extends": [ - "tslint:recommended", - "tslint-plugin-prettier" - ], - "rules": { - "prefer-for-of": false, - "prettier": [ - true, - { - "singleQuote": false - } - ], - "max-classes-per-file": false, - "object-literal-sort-keys": false, - "trailing-comma": false, - "arrow-parens": false, - "no-console": false, - "object-literal-key-quotes": false, - "max-line-length": { - "options": { - "limit": 260 - } - } - }, - "linterOptions": { - "exclude": [] - } -} \ No newline at end of file diff --git a/ui/gist-selection/gist-selection.html b/ui/gist-selection/gist-selection.html deleted file mode 100644 index 2322ba79..00000000 --- a/ui/gist-selection/gist-selection.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - - - - - - - -
- -

- Select Your Existing Gist -

-
-
-
- - - - - - - - - - - diff --git a/ui/gist-selection/gist-selection.js b/ui/gist-selection/gist-selection.js deleted file mode 100644 index 22d30af2..00000000 --- a/ui/gist-selection/gist-selection.js +++ /dev/null @@ -1,89 +0,0 @@ -//import { debug } from "vscode"; - -// @ts-nocheck -function appendHTML(parent, html) { - var div = document.createElement("div"); - div.innerHTML = html; - while (div.children.length > 0) { - parent.appendChild(div.children[0]); - } - div.remove(); -} - -const vscode = acquireVsCodeApi(); -/* https://stackoverflow.com/questions/3177836/how-to-format-time-since-xxx-e-g-4-minutes-ago-similar-to-stack-exchange-site */ -function timeSince(date) { - var seconds = Math.floor((new Date() - date) / 1000); - - var interval = Math.floor(seconds / 31536000); - - if (interval > 1) { - return interval + " years"; - } - interval = Math.floor(seconds / 2592000); - if (interval > 1) { - return interval + " months"; - } - interval = Math.floor(seconds / 86400); - if (interval > 1) { - return interval + " days"; - } - interval = Math.floor(seconds / 3600); - if (interval > 1) { - return interval + " hours"; - } - interval = Math.floor(seconds / 60); - if (interval > 1) { - return interval + " minutes"; - } - return Math.floor(seconds) + " seconds"; -} - -function appendHTML(parent, html) { - var div = document.createElement("div"); - div.innerHTML = html; - while (div.children.length > 0) { - parent.appendChild(div.children[0]); - } - div.remove(); -} - -function saveGistId(id) { - vscode.postMessage({ id }); - $("#modal").modal(); -} - -const selectionContainer = document.querySelector("#selectionContainer"); - -document - .querySelector(".modal-content") - .classList.add( - document.body.className.includes("vscode-dark") ? "bg-dark" : "bg-light" - ); - -const skipContainer = document.querySelector("#skipContainer"); -appendHTML(skipContainer, skip); - -const selectionTemplate = ` -`; - -if (!gists.length) { - appendHTML( - selectionContainer, - "

No Gists found on your account. Skip this window and upload the settings to create a new Gist.

" - ); -} else { - gists - .sort((a, b) => new Date(b.updated_at) - new Date(a.updated_at)) - .forEach(gist => { - const html = selectionTemplate - .replace(new RegExp("@description", "g"), gist.description) - .replace(new RegExp("@id", "g"), gist.id) - .replace( - new RegExp("@timestamp", "g"), - timeSince(new Date(gist.updated_at)) - ); - appendHTML(selectionContainer, html); - }); -} - diff --git a/ui/landing-page/landing-page.html b/ui/landing-page/landing-page.html deleted file mode 100644 index 0288c197..00000000 --- a/ui/landing-page/landing-page.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - - - - - - - - -
-
-

- What's New in - - vX.X.X - - -

-
-
-
-

- Configuration -

-

- Login via GitHub to setup Settings Sync, or configure the settings - manually. -

- - -
-
-

- Show Your Support -

-

- While being free and open source, if you find - Settings Sync - useful, please consider supporting it by donating via PayPal or Open - Collective. -

- - -
-
-
- -
-
- - -
-
- - - - - - - diff --git a/ui/landing-page/landing-page.js b/ui/landing-page/landing-page.js deleted file mode 100644 index b3556322..00000000 --- a/ui/landing-page/landing-page.js +++ /dev/null @@ -1,40 +0,0 @@ -// @ts-nocheck -const vscode = acquireVsCodeApi(); - -function sendCommand(command, data) { - vscode.postMessage({ - command, - data - }); -} - -function appendHTML(parent, html) { - var div = document.createElement("div"); - div.innerHTML = html; - while (div.children.length > 0) { - parent.appendChild(div.children[0]); - } - div.remove(); -} - -const releaseNoteTemplate = `
@TYPE@NOTE @EXTRA
`; - -const notesElement = document.querySelector("#notes"); -releaseNotes.changes.forEach(change => { - const html = releaseNoteTemplate - .replace(new RegExp("@NOTE", "g"), change.details) - .replace(new RegExp("@TYPE", "g"), change.type) - .replace(new RegExp("@COLOR", "g"), change.color) - .replace( - new RegExp("@EXTRA", "g"), - change.author && change.pullRequest - ? `(Thanks to @${change.author} for PR #${change.pullRequest})` - : "" - ); - appendHTML(notesElement, html); -}); - -const currentVersionElement = document.querySelector("#current-version"); -currentVersionElement.innerHTML = releaseNotes.currentVersion; - -document.querySelector("#customCheck1").checked = checked === "true"; diff --git a/ui/settings/settings.html b/ui/settings/settings.html deleted file mode 100644 index 5697b2b3..00000000 --- a/ui/settings/settings.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - - - - - - -
-
-

- Environment Settings -

-
-

-
-
-

- Global Settings -

-
-
-
- - - - - - - - - - - diff --git a/ui/settings/settings.js b/ui/settings/settings.js deleted file mode 100644 index 17e5d4c1..00000000 --- a/ui/settings/settings.js +++ /dev/null @@ -1,269 +0,0 @@ -// @ts-nocheck - -function appendHTML(parent, html) { - var div = document.createElement("div"); - div.innerHTML = html; - while (div.children.length > 0) { - parent.appendChild(div.children[0]); - } - div.remove(); -} - -const vscode = acquireVsCodeApi(); - -const textInputTemplate = `
- - @tooltip - -
`; - -const textInputGroupTemplate = `
- - @tooltip -
- -
- -
-
-
`; - -const numberInputTemplate = `
- - @tooltip - -
`; - -const checkboxTemplate = `
- - - @tooltip -
`; - -const textareaTemplate = `
- - @tooltip - -
`; - -const globalParent = document.getElementById("globalSettings"); -const envParent = document.getElementById("environmentSettings"); -const saveStatus = document.getElementById("saveStatus"); - -globalMap.forEach(settingMap => { - let template; - switch (settingMap.type) { - case "textinput": - template = textInputTemplate; - break; - case "numberinput": - template = numberInputTemplate; - break; - case "checkbox": - template = checkboxTemplate; - break; - case "textarea": - template = textareaTemplate; - break; - } - const html = template - .replace(new RegExp("@name", "g"), settingMap.name) - .replace(new RegExp("@placeholder", "g"), settingMap.placeholder) - .replace( - new RegExp("@correspondingSetting", "g"), - settingMap.correspondingSetting - ) - .replace(new RegExp("@tooltip"), "") - .replace(new RegExp("@settingType", "g"), "global"); - appendHTML(globalParent, html); -}); - -envMap.forEach(envMap => { - let template; - switch (envMap.type) { - case "textinput": - template = textInputTemplate; - break; - case "numberinput": - template = textInputTemplate; - break; - case "checkbox": - template = checkboxTemplate; - break; - } - const isInputGroup = envMap.correspondingSetting === "gist"; - let disabledStatus = ""; - if (isInputGroup) { - template = textInputGroupTemplate; - if (!_.get(envData, "gist") || !_.get(globalData, "token")) { - disabledStatus = "disabled"; - } - } - const html = template - .replace(new RegExp("@name", "g"), envMap.name) - .replace(new RegExp("@placeholder", "g"), envMap.placeholder) - .replace( - new RegExp("@correspondingSetting", "g"), - envMap.correspondingSetting - ) - .replace( - new RegExp("@tooltip"), - ` - - - ` - ) - .replace(new RegExp("@settingType", "g"), "env") - .replace( - new RegExp("@action", "g"), - `inputGroupAction('${envMap.correspondingSetting}')` - ) - .replace(new RegExp("@disabled", "g"), disabledStatus); - appendHTML(envParent, html); -}); - -$(document).ready(function() { - save(); - $('[data-toggle="tooltip"]').tooltip({ container: "html" }); - $(".text") - .each((i, el) => { - if ($(el).attr("settingType") === "global") { - $(el).val(_.get(globalData, $(el).attr("setting"))); - } else { - $(el).val(envData[$(el).attr("setting")]); - } - }) - .change(function() { - save(); - let val = $(this).val(); - vscode.postMessage({ - command: $(this).attr("setting"), - text: val, - type: $(this).attr("settingType") - }); - }); - $(".number") - .each((i, el) => { - if ($(el).attr("settingType") === "global") { - $(el).val(_.get(globalData, $(el).attr("setting"))); - } else { - $(el).val(envData[$(el).attr("setting")]); - } - }) - .change(function() { - save(); - let val = Number($(this).val()); - vscode.postMessage({ - command: $(this).attr("setting"), - text: val, - type: $(this).attr("settingType") - }); - }); - $(".checkbox") - .each((i, el) => { - if ($(el).attr("settingType") === "global") { - $(el).prop("checked", _.get(globalData, $(el).attr("setting"))); - } else { - $(el).prop("checked", envData[$(el).attr("setting")]); - } - }) - .change(function() { - save(); - let val = $(this).is(":checked"); - vscode.postMessage({ - command: $(this).attr("setting"), - text: val, - type: $(this).attr("settingType") - }); - }); - $(".textarea") - .each((i, el) => { - let str = ""; - const items = _.get(globalData, $(el).attr("setting")); - items.forEach(item => (str += item + "\n")); - $(el).val(str.slice(0, -1)); - $(el).prop("rows", items.length); - }) - .change(function() { - save(); - let val = []; - $(this) - .val() - .split("\n") - .forEach(item => { - if (item !== "") { - val.push(item); - } - }); - vscode.postMessage({ - command: $(this).attr("setting"), - text: val, - type: "global" - }); - }); -}); - -function save() { - saveStatus.innerHTML = ``; - setTimeout( - () => - (saveStatus.innerHTML = ``), - 1000 - ); -} - -function inputGroupAction(setting) { - if (setting === "gist") { - vscode.postMessage("openGist"); - } -} diff --git a/ui/shared/fonts.js b/ui/shared/fonts.js deleted file mode 100644 index c8341802..00000000 --- a/ui/shared/fonts.js +++ /dev/null @@ -1,19 +0,0 @@ -// @ts-nocheck - -document.querySelector("font-injector").innerHTML = ``; diff --git a/ui/shared/page-header.js b/ui/shared/page-header.js deleted file mode 100644 index a27dd99e..00000000 --- a/ui/shared/page-header.js +++ /dev/null @@ -1,18 +0,0 @@ -// @ts-nocheck - -document.querySelector("page-header").innerHTML = ` -

- -Settings Sync -

-

-Synchronize settings, snippets, themes, icons, launch, -keybindings, workspaces and extensions across machines -using GitHub Gist. -

-
`; diff --git a/ui/shared/styles.css b/ui/shared/styles.css deleted file mode 100644 index cea26430..00000000 --- a/ui/shared/styles.css +++ /dev/null @@ -1,199 +0,0 @@ -html, -body { - height: 100%; - width: 100%; - display: flex; - flex-direction: column; - font-family: "Roboto", sans-serif; - letter-spacing: 0.0625em; -} - -body.vscode-dark { - background-color: #1b1b1b; - color: #e9e9e9; -} - -body.vscode-light { - background-color: #fff; - color: #1b1b1b; -} - -.vscode-light .logo { - -webkit-filter: invert(1) opacity(0.5); - filter: invert(1) opacity(0.5); -} - -.tooltip { - display: block; -} - -.content-row { - flex-grow: 1; - overflow-y: hidden; - padding-bottom: 1rem; -} - -.modal-header { - border-bottom: none; -} - -.modal-footer { - border-top: none; -} - -.modal-body { - padding: 0rem 1rem; -} - -.footer > .col-one { - padding-left: 0; -} - -.footer > .col-two { - padding-right: 0; -} - -.footer { - margin: 0; -} - -.scrollable { - overflow-y: auto; -} - -.content { - background-color: burlywood; - overflow: scroll; -} - -:root { - --btn: #0e629c; - --btn-hover: #15496e; - --btn-click: #0e3450; - --link: dodgerblue; - --link-hover: rgb(15, 109, 204); -} - -.dock-bottom-left { - position: fixed; - bottom: 4rem; - left: 4rem; -} - -.dock-bottom-right { - position: fixed; - bottom: 1rem; - right: 1rem; - background-color: rgb(42, 42, 42); - border-radius: 1.5rem; - padding-left: 1rem; - padding-right: 1rem; - padding-top: 0.5rem; - padding-bottom: 0.5rem; -} - -.logo { - padding-right: 0.5rem; - filter: opacity(0.5); -} - -.change { - line-height: 150%; -} - -.badge-success { - color: #fff; - background-color: #73c991; -} - -.badge-danger { - color: #fff; - background-color: #ce4f59; -} - -.badge { - vertical-align: 2px; - line-height: 120%; - width: 6rem; -} - -body { - position: relative; - min-height: 35rem; - background-position: center; - background-repeat: no-repeat; - background-attachment: scroll; - background-size: cover; - margin-top: 40px; - margin-bottom: 40px; -} - -body h1 { - font-size: 3.5rem; - line-height: 2.5rem; - font-weight: bold; - color: #808080 !important; - font-family: "Open Sans"; - display: flex; - align-items: center; /* align vertical */ - justify-content: center; /* align horizontal */ -} - -body h2 { - /* max-width: 20rem; */ - font-size: 1rem; -} - -body h3 { - /* max-width: 20rem; */ - font-size: 1.5rem; -} - -.btn { - -webkit-box-shadow: 0 0.1875rem 0.1875rem 0 rgba(0, 0, 0, 0.1) !important; - box-shadow: 0 0.1875rem 0.1875rem 0 rgba(0, 0, 0, 0.1) !important; - padding: 1rem; - font-size: 80%; - text-transform: uppercase; - letter-spacing: 0.15rem; - border: 0; - width: 100%; - height: 100%; - display: flex; - justify-content: center; /* align horizontal */ - align-items: center; /* align vertical */ -} - -.btn-primary { - color: #fff !important; -} - -.btn-primary, -.btn-primary:focus { - background-color: var(--btn) !important; -} - -.btn-primary:hover, -.btn-primary:active { - background-color: var(--btn-hover) !important; -} - -.text, -.textarea, -.number { - -webkit-box-shadow: 0 0.1875rem 0.1875rem 0 rgba(0, 0, 0, 0.1) !important; - box-shadow: 0 0.1875rem 0.1875rem 0 rgba(0, 0, 0, 0.1) !important; - padding: 1.25rem 2rem; - height: auto; - border: 0; -} - -a { - color: var(--link); -} - -a:focus, -a:hover { - text-decoration: none; - color: var(--link-hover); -} diff --git a/ui/shared/vendor/bootstrap/css/bootstrap.min.css b/ui/shared/vendor/bootstrap/css/bootstrap.min.css deleted file mode 100644 index 92e3fe87..00000000 --- a/ui/shared/vendor/bootstrap/css/bootstrap.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v4.3.1 (https://getbootstrap.com/) - * Copyright 2011-2019 The Bootstrap Authors - * Copyright 2011-2019 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[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}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.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-repeat:no-repeat;background-position:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.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") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip{display:block}.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E");background-repeat:no-repeat;background-position:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip{display:block}.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn: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){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:no-repeat 50%/50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:calc(1rem + .4rem);padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-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-top-left-radius:0;border-bottom-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}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion>.card{overflow:hidden}.accordion>.card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion>.card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion>.card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.accordion>.card .card-header{margin-bottom:-1px}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;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){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}@media (min-width:576px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-sm .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-md .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:992px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-lg .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:1200px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-xl .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush .list-group-item:last-child{margin-bottom:-1px}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{margin-bottom:0;border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);content:""}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #dee2e6;border-bottom-right-radius:.3rem;border-bottom-left-radius:.3rem}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:0s .6s opacity}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@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;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50%/100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!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}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;overflow-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}} -/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/ui/shared/vendor/bootstrap/js/bootstrap.min.js b/ui/shared/vendor/bootstrap/js/bootstrap.min.js deleted file mode 100644 index c4c0d1f9..00000000 --- a/ui/shared/vendor/bootstrap/js/bootstrap.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v4.3.1 (https://getbootstrap.com/) - * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e((t=t||self).bootstrap={},t.jQuery,t.Popper)}(this,function(t,g,u){"use strict";function i(t,e){for(var n=0;nthis._items.length-1||t<0))if(this._isSliding)g(this._element).one(Q.SLID,function(){return e.to(t)});else{if(n===t)return this.pause(),void this.cycle();var i=ndocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},t._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},t._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:Ee},je="show",He="out",Re={HIDE:"hide"+De,HIDDEN:"hidden"+De,SHOW:"show"+De,SHOWN:"shown"+De,INSERTED:"inserted"+De,CLICK:"click"+De,FOCUSIN:"focusin"+De,FOCUSOUT:"focusout"+De,MOUSEENTER:"mouseenter"+De,MOUSELEAVE:"mouseleave"+De},xe="fade",Fe="show",Ue=".tooltip-inner",We=".arrow",qe="hover",Me="focus",Ke="click",Qe="manual",Be=function(){function i(t,e){if("undefined"==typeof u)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var t=i.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=g(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(g(this.getTipElement()).hasClass(Fe))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),g.removeData(this.element,this.constructor.DATA_KEY),g(this.element).off(this.constructor.EVENT_KEY),g(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&g(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if("none"===g(this.element).css("display"))throw new Error("Please use show on visible elements");var t=g.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){g(this.element).trigger(t);var n=_.findShadowRoot(this.element),i=g.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=_.getUID(this.constructor.NAME);o.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&g(o).addClass(xe);var s="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();g(o).data(this.constructor.DATA_KEY,this),g.contains(this.element.ownerDocument.documentElement,this.tip)||g(o).appendTo(l),g(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new u(this.element,o,{placement:a,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:We},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}}),g(o).addClass(Fe),"ontouchstart"in document.documentElement&&g(document.body).children().on("mouseover",null,g.noop);var c=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,g(e.element).trigger(e.constructor.Event.SHOWN),t===He&&e._leave(null,e)};if(g(this.tip).hasClass(xe)){var h=_.getTransitionDurationFromElement(this.tip);g(this.tip).one(_.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},t.hide=function(t){var e=this,n=this.getTipElement(),i=g.Event(this.constructor.Event.HIDE),o=function(){e._hoverState!==je&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),g(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(g(this.element).trigger(i),!i.isDefaultPrevented()){if(g(n).removeClass(Fe),"ontouchstart"in document.documentElement&&g(document.body).children().off("mouseover",null,g.noop),this._activeTrigger[Ke]=!1,this._activeTrigger[Me]=!1,this._activeTrigger[qe]=!1,g(this.tip).hasClass(xe)){var r=_.getTransitionDurationFromElement(n);g(n).one(_.TRANSITION_END,o).emulateTransitionEnd(r)}else o();this._hoverState=""}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(t){g(this.getTipElement()).addClass(Ae+"-"+t)},t.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},t.setContent=function(){var t=this.getTipElement();this.setElementContent(g(t.querySelectorAll(Ue)),this.getTitle()),g(t).removeClass(xe+" "+Fe)},t.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=Se(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?g(e).parent().is(t)||t.empty().append(e):t.text(g(e).text())},t.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},t._getOffset=function(){var e=this,t={};return"function"==typeof this.config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,e.config.offset(t.offsets,e.element)||{}),t}:t.offset=this.config.offset,t},t._getContainer=function(){return!1===this.config.container?document.body:_.isElement(this.config.container)?g(this.config.container):g(document).find(this.config.container)},t._getAttachment=function(t){return Pe[t.toUpperCase()]},t._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(t){if("click"===t)g(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(t){return i.toggle(t)});else if(t!==Qe){var e=t===qe?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=t===qe?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;g(i.element).on(e,i.config.selector,function(t){return i._enter(t)}).on(n,i.config.selector,function(t){return i._leave(t)})}}),g(this.element).closest(".modal").on("hide.bs.modal",function(){i.element&&i.hide()}),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},t._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},t._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Me:qe]=!0),g(e.getTipElement()).hasClass(Fe)||e._hoverState===je?e._hoverState=je:(clearTimeout(e._timeout),e._hoverState=je,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===je&&e.show()},e.config.delay.show):e.show())},t._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Me:qe]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=He,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){e._hoverState===He&&e.hide()},e.config.delay.hide):e.hide())},t._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},t._getConfig=function(t){var e=g(this.element).data();return Object.keys(e).forEach(function(t){-1!==Oe.indexOf(t)&&delete e[t]}),"number"==typeof(t=l({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),_.typeCheckConfig(be,t,this.constructor.DefaultType),t.sanitize&&(t.template=Se(t.template,t.whiteList,t.sanitizeFn)),t},t._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},t._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Ne);null!==e&&e.length&&t.removeClass(e.join(""))},t._handlePopperPlacementChange=function(t){var e=t.instance;this.tip=e.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},t._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(g(t).removeClass(xe),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},i._jQueryInterface=function(n){return this.each(function(){var t=g(this).data(Ie),e="object"==typeof n&&n;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),g(this).data(Ie,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return Le}},{key:"NAME",get:function(){return be}},{key:"DATA_KEY",get:function(){return Ie}},{key:"Event",get:function(){return Re}},{key:"EVENT_KEY",get:function(){return De}},{key:"DefaultType",get:function(){return ke}}]),i}();g.fn[be]=Be._jQueryInterface,g.fn[be].Constructor=Be,g.fn[be].noConflict=function(){return g.fn[be]=we,Be._jQueryInterface};var Ve="popover",Ye="bs.popover",ze="."+Ye,Xe=g.fn[Ve],$e="bs-popover",Ge=new RegExp("(^|\\s)"+$e+"\\S+","g"),Je=l({},Be.Default,{placement:"right",trigger:"click",content:"",template:''}),Ze=l({},Be.DefaultType,{content:"(string|element|function)"}),tn="fade",en="show",nn=".popover-header",on=".popover-body",rn={HIDE:"hide"+ze,HIDDEN:"hidden"+ze,SHOW:"show"+ze,SHOWN:"shown"+ze,INSERTED:"inserted"+ze,CLICK:"click"+ze,FOCUSIN:"focusin"+ze,FOCUSOUT:"focusout"+ze,MOUSEENTER:"mouseenter"+ze,MOUSELEAVE:"mouseleave"+ze},sn=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),(e.prototype.constructor=e).__proto__=n;var o=i.prototype;return o.isWithContent=function(){return this.getTitle()||this._getContent()},o.addAttachmentClass=function(t){g(this.getTipElement()).addClass($e+"-"+t)},o.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},o.setContent=function(){var t=g(this.getTipElement());this.setElementContent(t.find(nn),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(on),e),t.removeClass(tn+" "+en)},o._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},o._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Ge);null!==e&&0=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||tli{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:fa-spin 2s infinite linear}.fa-pulse{animation:fa-spin 1s infinite steps(8)}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-wizard:before{content:"\f6e8"}.fa-haykal:before{content:"\f666"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto} \ No newline at end of file diff --git a/ui/shared/vendor/fontawesome/css/solid.min.css b/ui/shared/vendor/fontawesome/css/solid.min.css deleted file mode 100644 index a0d56287..00000000 --- a/ui/shared/vendor/fontawesome/css/solid.min.css +++ /dev/null @@ -1,5 +0,0 @@ -/*! - * Font Awesome Free 5.9.0 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - */ -@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:auto;src:url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa,.fas{font-family:"Font Awesome 5 Free";font-weight:900} \ No newline at end of file diff --git a/ui/shared/vendor/fontawesome/webfonts/fa-solid-900.ttf b/ui/shared/vendor/fontawesome/webfonts/fa-solid-900.ttf deleted file mode 100644 index c6c3dd4d40e6935dbda5f4fc671956c41b768a09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191832 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 JlKu;TE2wOj%Q1qdB^k`WJpqvW9V}9KNYfOicm{ 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 R-Q)Ro=L@j@Nd4~k{{Y?~eeVDO diff --git a/ui/shared/vendor/google/OpenSans-Bold.ttf b/ui/shared/vendor/google/OpenSans-Bold.ttf deleted file mode 100644 index 96fabd865df70de92f2a4bdc24d65306759fe726..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 103616 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 z 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 z

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

n{#NV($fZ=b2Ttd7 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�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 Lv7{_*LQnk1zZlrgRDjh{?=p_(BF9M+nn-P!% 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 U=0&&n0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,u,s,l,c,f,d,p,h,g,v,y,m,b,x="sizzle"+1*new Date,w=e.document,C=0,T=0,E=ae(),N=ae(),k=ae(),A=function(e,t){return e===t&&(f=!0),0},D={}.hasOwnProperty,S=[],L=S.pop,j=S.push,q=S.push,O=S.slice,P=function(e,t){for(var n=0,r=e.length;n+~]|"+I+")"+I+"*"),_=new RegExp("="+I+"*([^\\]'\"]*?)"+I+"*\\]","g"),U=new RegExp(M),V=new RegExp("^"+R+"$"),X={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+B),PSEUDO:new RegExp("^"+M),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+I+"*(even|odd|(([+-]|)(\\d*)n|)"+I+"*(?:([+-]|)"+I+"*(\\d+)|))"+I+"*\\)|)","i"),bool:new RegExp("^(?:"+H+")$","i"),needsContext:new RegExp("^"+I+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+I+"*((?:-\\d)?\\d*)"+I+"*\\)|)(?=[^-]|$)","i")},Q=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,G=/^[^{]+\{\s*\[native \w/,K=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,J=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+I+"?|("+I+")|.)","ig"),ee=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){d()},ie=me(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{q.apply(S=O.call(w.childNodes),w.childNodes),S[w.childNodes.length].nodeType}catch(e){q={apply:S.length?function(e,t){j.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function oe(e,t,r,i){var o,u,l,c,f,h,y,m=t&&t.ownerDocument,C=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==C&&9!==C&&11!==C)return r;if(!i&&((t?t.ownerDocument||t:w)!==p&&d(t),t=t||p,g)){if(11!==C&&(f=K.exec(e)))if(o=f[1]){if(9===C){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&b(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return q.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return q.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!k[e+" "]&&(!v||!v.test(e))){if(1!==C)m=t,y=e;else if("object"!==t.nodeName.toLowerCase()){(c=t.getAttribute("id"))?c=c.replace(te,ne):t.setAttribute("id",c=x),u=(h=a(e)).length;while(u--)h[u]="#"+c+" "+ye(h[u]);y=h.join(","),m=J.test(e)&&ge(t.parentNode)||t}if(y)try{return q.apply(r,m.querySelectorAll(y)),r}catch(e){}finally{c===x&&t.removeAttribute("id")}}}return s(e.replace($,"$1"),t,r,i)}function ae(){var e=[];function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}return t}function ue(e){return e[x]=!0,e}function se(e){var t=p.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function le(e,t){var n=e.split("|"),i=n.length;while(i--)r.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function de(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pe(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return ue(function(t){return t=+t,ue(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ge(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},d=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==p&&9===a.nodeType&&a.documentElement?(p=a,h=p.documentElement,g=!o(p),w!==p&&(i=p.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=se(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=se(function(e){return e.appendChild(p.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=G.test(p.getElementsByClassName),n.getById=se(function(e){return h.appendChild(e).id=x,!p.getElementsByName||!p.getElementsByName(x).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&g)return t.getElementsByClassName(e)},y=[],v=[],(n.qsa=G.test(p.querySelectorAll))&&(se(function(e){h.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+I+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+I+"*(?:value|"+H+")"),e.querySelectorAll("[id~="+x+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+x+"+*").length||v.push(".#.+[+~]")}),se(function(e){e.innerHTML="";var t=p.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+I+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(n.matchesSelector=G.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&se(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),y.push("!=",M)}),v=v.length&&new RegExp(v.join("|")),y=y.length&&new RegExp(y.join("|")),t=G.test(h.compareDocumentPosition),b=t||G.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===p||e.ownerDocument===w&&b(w,e)?-1:t===p||t.ownerDocument===w&&b(w,t)?1:c?P(c,e)-P(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],u=[t];if(!i||!o)return e===p?-1:t===p?1:i?-1:o?1:c?P(c,e)-P(c,t):0;if(i===o)return ce(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)u.unshift(n);while(a[r]===u[r])r++;return r?ce(a[r],u[r]):a[r]===w?-1:u[r]===w?1:0},p):p},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&d(e),t=t.replace(_,"='$1']"),n.matchesSelector&&g&&!k[t+" "]&&(!y||!y.test(t))&&(!v||!v.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,p,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==p&&d(e),b(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==p&&d(e);var i=r.attrHandle[t.toLowerCase()],o=i&&D.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(A),f){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:ue,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return X.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&U.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+I+")"+e+"("+I+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace(W," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),u="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,s){var l,c,f,d,p,h,g=o!==a?"nextSibling":"previousSibling",v=t.parentNode,y=u&&t.nodeName.toLowerCase(),m=!s&&!u,b=!1;if(v){if(o){while(g){d=t;while(d=d[g])if(u?d.nodeName.toLowerCase()===y:1===d.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?v.firstChild:v.lastChild],a&&m){b=(p=(l=(c=(f=(d=v)[x]||(d[x]={}))[d.uniqueID]||(f[d.uniqueID]={}))[e]||[])[0]===C&&l[1])&&l[2],d=p&&v.childNodes[p];while(d=++p&&d&&d[g]||(b=p=0)||h.pop())if(1===d.nodeType&&++b&&d===t){c[e]=[C,p,b];break}}else if(m&&(b=p=(l=(c=(f=(d=t)[x]||(d[x]={}))[d.uniqueID]||(f[d.uniqueID]={}))[e]||[])[0]===C&&l[1]),!1===b)while(d=++p&&d&&d[g]||(b=p=0)||h.pop())if((u?d.nodeName.toLowerCase()===y:1===d.nodeType)&&++b&&(m&&((c=(f=d[x]||(d[x]={}))[d.uniqueID]||(f[d.uniqueID]={}))[e]=[C,b]),d===t))break;return(b-=i)===r||b%r==0&&b/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[x]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?ue(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=P(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:ue(function(e){var t=[],n=[],r=u(e.replace($,"$1"));return r[x]?ue(function(e,t,n,i){var o,a=r(e,null,i,[]),u=e.length;while(u--)(o=a[u])&&(e[u]=!(t[u]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:ue(function(e){return function(t){return oe(e,t).length>0}}),contains:ue(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:ue(function(e){return V.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:pe(!1),disabled:pe(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xe(e,t,n){for(var r=0,i=t.length;r-1&&(o[l]=!(a[l]=f))}}else y=we(y===a?y.splice(h,y.length):y),i?i(null,a,y,s):q.apply(a,y)})}function Te(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],u=a||r.relative[" "],s=a?1:0,c=me(function(e){return e===t},u,!0),f=me(function(e){return P(t,e)>-1},u,!0),d=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];s1&&be(d),s>1&&ye(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),n,s0,i=e.length>0,o=function(o,a,u,s,c){var f,h,v,y=0,m="0",b=o&&[],x=[],w=l,T=o||i&&r.find.TAG("*",c),E=C+=null==w?1:Math.random()||.1,N=T.length;for(c&&(l=a===p||a||c);m!==N&&null!=(f=T[m]);m++){if(i&&f){h=0,a||f.ownerDocument===p||(d(f),u=!g);while(v=e[h++])if(v(f,a||p,u)){s.push(f);break}c&&(C=E)}n&&((f=!v&&f)&&y--,o&&b.push(f))}if(y+=m,n&&m!==y){h=0;while(v=t[h++])v(b,x,a,u);if(o){if(y>0)while(m--)b[m]||x[m]||(x[m]=L.call(s));x=we(x)}q.apply(s,x),c&&!o&&x.length>0&&y+t.length>1&&oe.uniqueSort(s)}return c&&(C=E,l=w),b};return n?ue(o):o}return u=oe.compile=function(e,t){var n,r=[],i=[],o=k[e+" "];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Te(t[n]))[x]?r.push(o):i.push(o);(o=k(e,Ee(i,r))).selector=e}return o},s=oe.select=function(e,t,n,i){var o,s,l,c,f,d="function"==typeof e&&e,p=!i&&a(e=d.selector||e);if(n=n||[],1===p.length){if((s=p[0]=p[0].slice(0)).length>2&&"ID"===(l=s[0]).type&&9===t.nodeType&&g&&r.relative[s[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;d&&(t=t.parentNode),e=e.slice(s.shift().value.length)}o=X.needsContext.test(e)?0:s.length;while(o--){if(l=s[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),J.test(s[0].type)&&ge(t.parentNode)||t))){if(s.splice(o,1),!(e=i.length&&ye(s)))return q.apply(n,i),n;break}}}return(d||u(e,p))(i,t,!g,n,!t||J.test(e)&&ge(t.parentNode)||t),n},n.sortStable=x.split("").sort(A).join("")===x,n.detectDuplicates=!!f,d(),n.sortDetached=se(function(e){return 1&e.compareDocumentPosition(p.createElement("fieldset"))}),se(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||le("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&se(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||le("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),se(function(e){return null==e.getAttribute("disabled")})||le(H,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);w.find=E,w.expr=E.selectors,w.expr[":"]=w.expr.pseudos,w.uniqueSort=w.unique=E.uniqueSort,w.text=E.getText,w.isXMLDoc=E.isXML,w.contains=E.contains,w.escapeSelector=E.escape;var N=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},k=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},A=w.expr.match.needsContext;function D(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var S=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function L(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):"string"!=typeof t?w.grep(e,function(e){return s.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(L(this,e||[],!1))},not:function(e){return this.pushStack(L(this,e||[],!0))},is:function(e){return!!L(this,"string"==typeof e&&A.test(e)?w(e):e||[],!1).length}});var j,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:q.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),S.test(i[1])&&w.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,j=w(r);var O=/^(?:parents|prev(?:Until|All))/,P={children:!0,contents:!0,next:!0,prev:!0};w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&w.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?w.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?s.call(w(e),this[0]):s.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function H(e,t){while((e=e[t])&&1!==e.nodeType);return e}w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return N(e,"parentNode")},parentsUntil:function(e,t,n){return N(e,"parentNode",n)},next:function(e){return H(e,"nextSibling")},prev:function(e){return H(e,"previousSibling")},nextAll:function(e){return N(e,"nextSibling")},prevAll:function(e){return N(e,"previousSibling")},nextUntil:function(e,t,n){return N(e,"nextSibling",n)},prevUntil:function(e,t,n){return N(e,"previousSibling",n)},siblings:function(e){return k((e.parentNode||{}).firstChild,e)},children:function(e){return k(e.firstChild)},contents:function(e){return D(e,"iframe")?e.contentDocument:(D(e,"template")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=w.filter(r,i)),this.length>1&&(P[e]||w.uniqueSort(i),O.test(e)&&i.reverse()),this.pushStack(i)}});var I=/[^\x20\t\r\n\f]+/g;function R(e){var t={};return w.each(e.match(I)||[],function(e,n){t[n]=!0}),t}w.Callbacks=function(e){e="string"==typeof e?R(e):w.extend({},e);var t,n,r,i,o=[],a=[],u=-1,s=function(){for(i=i||e.once,r=t=!0;a.length;u=-1){n=a.shift();while(++u-1)o.splice(n,1),n<=u&&u--}),this},has:function(e){return e?w.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||s()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function B(e){return e}function M(e){throw e}function W(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.extend({Deferred:function(t){var n=[["notify","progress",w.Callbacks("memory"),w.Callbacks("memory"),2],["resolve","done",w.Callbacks("once memory"),w.Callbacks("once memory"),0,"resolved"],["reject","fail",w.Callbacks("once memory"),w.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},"catch":function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(t){w.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var u=this,s=arguments,l=function(){var e,l;if(!(t=o&&(r!==M&&(u=void 0,s=[e]),n.rejectWith(u,s))}};t?c():(w.Deferred.getStackHook&&(c.stackTrace=w.Deferred.getStackHook()),e.setTimeout(c))}}return w.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:B,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:B)),n[2][3].add(a(0,e,g(r)?r:M))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],u=t[5];i[t[1]]=a.add,u&&a.add(function(){r=u},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=w.Deferred(),u=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&(W(e,a.done(u(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)W(i[n],u(n),a.reject);return a.promise()}});var $=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&$.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},w.readyException=function(t){e.setTimeout(function(){throw t})};var F=w.Deferred();w.fn.ready=function(e){return F.then(e)["catch"](function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||F.resolveWith(r,[w]))}}),w.ready.then=F.then;function z(){r.removeEventListener("DOMContentLoaded",z),e.removeEventListener("load",z),w.ready()}"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener("DOMContentLoaded",z),e.addEventListener("load",z));var _=function(e,t,n,r,i,o,a){var u=0,s=e.length,l=null==n;if("object"===b(n)){i=!0;for(u in n)_(e,t,u,n[u],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(w(e),n)})),t))for(;u1,null,!0)},removeData:function(e){return this.each(function(){J.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=K.get(e,t),n&&(!r||Array.isArray(n)?r=K.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=w.queue(e,t),r=n.length,i=n.shift(),o=w._queueHooks(e,t),a=function(){w.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return K.get(e,n)||K.access(e,n,{empty:w.Callbacks("once memory").add(function(){K.remove(e,[t+"queue",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&D(e,t)?w.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}!function(){var e=r.createDocumentFragment().appendChild(r.createElement("div")),t=r.createElement("input");t.setAttribute("type","radio"),t.setAttribute("checked","checked"),t.setAttribute("name","t"),e.appendChild(t),h.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var xe=r.documentElement,we=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Te=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function Ne(){return!1}function ke(){try{return r.activeElement}catch(e){}}function Ae(e,t,n,r,i,o){var a,u;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(u in t)Ae(e,u,n,r,t[u],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Ne;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,u,s,l,c,f,d,p,h,g,v=K.get(e);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(xe,i),n.guid||(n.guid=w.guid++),(s=v.events)||(s=v.events={}),(a=v.handle)||(a=v.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(I)||[""]).length;while(l--)p=g=(u=Te.exec(t[l])||[])[1],h=(u[2]||"").split(".").sort(),p&&(f=w.event.special[p]||{},p=(i?f.delegateType:f.bindType)||p,f=w.event.special[p]||{},c=w.extend({type:p,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(d=s[p])||((d=s[p]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(p,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?d.splice(d.delegateCount++,0,c):d.push(c),w.event.global[p]=!0)}},remove:function(e,t,n,r,i){var o,a,u,s,l,c,f,d,p,h,g,v=K.hasData(e)&&K.get(e);if(v&&(s=v.events)){l=(t=(t||"").match(I)||[""]).length;while(l--)if(u=Te.exec(t[l])||[],p=g=u[1],h=(u[2]||"").split(".").sort(),p){f=w.event.special[p]||{},d=s[p=(r?f.delegateType:f.bindType)||p]||[],u=u[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=d.length;while(o--)c=d[o],!i&&g!==c.origType||n&&n.guid!==c.guid||u&&!u.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(d.splice(o,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(e,c));a&&!d.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||w.removeEvent(e,p,v.handle),delete s[p])}else for(p in s)w.event.remove(e,p+t[l],n,r,!0);w.isEmptyObject(s)&&K.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,u,s=new Array(arguments.length),l=(K.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(s[0]=t,n=1;n=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&u.push({elem:l,handlers:o})}return l=this,s\x20\t\r\n\f]*)[^>]*)\/>/gi,Se=/\s*$/g;function qe(e,t){return D(e,"table")&&D(11!==t.nodeType?t:t.firstChild,"tr")?w(e).children("tbody")[0]||e:e}function Oe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Pe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function He(e,t){var n,r,i,o,a,u,s,l;if(1===t.nodeType){if(K.hasData(e)&&(o=K.access(e),a=K.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n1&&"string"==typeof v&&!h.checkClone&&Le.test(v))return e.each(function(i){var o=e.eq(i);y&&(t[0]=v.call(this,i,o.html())),Re(o,t,n,r)});if(d&&(i=be(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(s=(u=w.map(ve(i,"script"),Oe)).length;f")},clone:function(e,t,n){var r,i,o,a,u=e.cloneNode(!0),s=w.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(a=ve(u),r=0,i=(o=ve(e)).length;r0&&ye(a,!s&&ve(e,"script")),u},cleanData:function(e){for(var t,n,r,i=w.event.special,o=0;void 0!==(n=e[o]);o++)if(Y(n)){if(t=n[K.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[K.expando]=void 0}n[J.expando]&&(n[J.expando]=void 0)}}}),w.fn.extend({detach:function(e){return Be(this,e,!0)},remove:function(e){return Be(this,e)},text:function(e){return _(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||qe(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=qe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return _(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Se.test(e)&&!ge[(pe.exec(e)||["",""])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n=0&&(s+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-s-u-.5))),s}function et(e,t,n){var r=We(e),i=Fe(e,t,r),o="border-box"===w.css(e,"boxSizing",!1,r),a=o;if(Me.test(i)){if(!n)return i;i="auto"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===w.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?"border":"content"),a,r,i)+"px"}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,u=Q(t),s=Ue.test(t),l=e.style;if(s||(t=Ke(u)),a=w.cssHooks[t]||w.cssHooks[u],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(w.cssNumber[u]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(s?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,u=Q(t);return Ue.test(t)||(t=Ke(u)),(a=w.cssHooks[t]||w.cssHooks[u])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),"normal"===i&&t in Xe&&(i=Xe[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),w.each(["height","width"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!_e.test(w.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):ue(e,Ve,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=We(e),a="border-box"===w.css(e,"boxSizing",!1,o),u=r&&Ze(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(u-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,"border",!1,o)-.5)),u&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=w.css(e,t)),Je(e,n,u)}}}),w.cssHooks.marginLeft=ze(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,"marginLeft"))||e.getBoundingClientRect().left-ue(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),w.each({margin:"",padding:"",border:"Width"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(w.cssHooks[e+t].set=Je)}),w.fn.extend({css:function(e,t){return _(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=We(e),i=t.length;a1)}}),w.fn.delay=function(t,n){return t=w.fx?w.fx.speeds[t]||t:t,n=n||"fx",this.queue(n,function(n,r){var i=e.setTimeout(n,t);r.stop=function(){e.clearTimeout(i)}})},function(){var e=r.createElement("input"),t=r.createElement("select").appendChild(r.createElement("option"));e.type="checkbox",h.checkOn=""!==e.value,h.optSelected=t.selected,(e=r.createElement("input")).value="t",e.type="radio",h.radioValue="t"===e.value}();var tt,nt=w.expr.attrHandle;w.fn.extend({attr:function(e,t){return _(this,w.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?w.prop(e,t,n):(1===o&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?tt:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&"radio"===t&&D(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(I);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),tt={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\w+/g),function(e,t){var n=nt[t]||w.find.attr;nt[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=nt[a],nt[a]=i,i=null!=n(e,t,r)?a:null,nt[a]=o),i}});var rt=/^(?:input|select|textarea|button)$/i,it=/^(?:a|area)$/i;w.fn.extend({prop:function(e,t){return _(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,"tabindex");return t?parseInt(t,10):rt.test(e.nodeName)||it.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),h.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){w.propFix[this.toLowerCase()]=this});function ot(e){return(e.match(I)||[]).join(" ")}function at(e){return e.getAttribute&&e.getAttribute("class")||""}function ut(e){return Array.isArray(e)?e:"string"==typeof e?e.match(I)||[]:[]}w.fn.extend({addClass:function(e){var t,n,r,i,o,a,u,s=0;if(g(e))return this.each(function(t){w(this).addClass(e.call(this,t,at(this)))});if((t=ut(e)).length)while(n=this[s++])if(i=at(n),r=1===n.nodeType&&" "+ot(i)+" "){a=0;while(o=t[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(u=ot(r))&&n.setAttribute("class",u)}return this},removeClass:function(e){var t,n,r,i,o,a,u,s=0;if(g(e))return this.each(function(t){w(this).removeClass(e.call(this,t,at(this)))});if(!arguments.length)return this.attr("class","");if((t=ut(e)).length)while(n=this[s++])if(i=at(n),r=1===n.nodeType&&" "+ot(i)+" "){a=0;while(o=t[a++])while(r.indexOf(" "+o+" ")>-1)r=r.replace(" "+o+" "," ");i!==(u=ot(r))&&n.setAttribute("class",u)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,at(this),t),t)}):this.each(function(){var t,i,o,a;if(r){i=0,o=w(this),a=ut(e);while(t=a[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else void 0!==e&&"boolean"!==n||((t=at(this))&&K.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":K.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&(" "+ot(at(n))+" ").indexOf(t)>-1)return!0;return!1}});var st=/\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?"":e+""})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(st,""):null==n?"":n}}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,"value");return null!=t?t:ot(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,u=a?null:[],s=a?o+1:i.length;for(r=o<0?s:a?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),w.each(["radio","checkbox"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},h.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),h.focusin="onfocusin"in e;var lt=/^(?:focusinfocus|focusoutblur)$/,ct=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(t,n,i,o){var a,u,s,l,c,d,p,h,y=[i||r],m=f.call(t,"type")?t.type:t,b=f.call(t,"namespace")?t.namespace.split("."):[];if(u=h=s=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!lt.test(m+w.event.triggered)&&(m.indexOf(".")>-1&&(m=(b=m.split(".")).shift(),b.sort()),c=m.indexOf(":")<0&&"on"+m,t=t[w.expando]?t:new w.Event(m,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=b.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+b.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:w.makeArray(n,[t]),p=w.event.special[m]||{},o||!p.trigger||!1!==p.trigger.apply(i,n))){if(!o&&!p.noBubble&&!v(i)){for(l=p.delegateType||m,lt.test(l+m)||(u=u.parentNode);u;u=u.parentNode)y.push(u),s=u;s===(i.ownerDocument||r)&&y.push(s.defaultView||s.parentWindow||e)}a=0;while((u=y[a++])&&!t.isPropagationStopped())h=u,t.type=a>1?l:p.bindType||m,(d=(K.get(u,"events")||{})[t.type]&&K.get(u,"handle"))&&d.apply(u,n),(d=c&&u[c])&&d.apply&&Y(u)&&(t.result=d.apply(u,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||p._default&&!1!==p._default.apply(y.pop(),n)||!Y(i)||c&&g(i[m])&&!v(i)&&((s=i[c])&&(i[c]=null),w.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,ct),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,ct),w.event.triggered=void 0,s&&(i[c]=s)),t.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),h.focusin||w.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=K.access(r,t);i||r.addEventListener(e,n,!0),K.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=K.access(r,t)-1;i?K.access(r,t,i):(r.removeEventListener(e,n,!0),K.remove(r,t))}}});var ft=/\[\]$/,dt=/\r?\n/g,pt=/^(?:submit|button|image|reset|file)$/i,ht=/^(?:input|select|textarea|keygen)/i;function gt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||ft.test(e)?r(e,i):gt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==b(t))r(e,t);else for(i in t)gt(e+"["+i+"]",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)gt(n,e[n],t,i);return r.join("&")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,"elements");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(":disabled")&&ht.test(this.nodeName)&&!pt.test(e)&&(this.checked||!de.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(dt,"\r\n")}}):{name:t.name,value:n.replace(dt,"\r\n")}}).get()}}),w.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},h.createHTMLDocument=function(){var e=r.implementation.createHTMLDocument("").body;return e.innerHTML="

",2===e.childNodes.length}(),w.parseHTML=function(e,t,n){if("string"!=typeof e)return[];"boolean"==typeof t&&(n=t,t=!1);var i,o,a;return t||(h.createHTMLDocument?((i=(t=r.implementation.createHTMLDocument("")).createElement("base")).href=r.location.href,t.head.appendChild(i)):t=r),o=S.exec(e),a=!n&&[],o?[t.createElement(o[1])]:(o=be([e],t,a),a&&a.length&&w(a).remove(),w.merge([],o.childNodes))},w.offset={setOffset:function(e,t,n){var r,i,o,a,u,s,l,c=w.css(e,"position"),f=w(e),d={};"static"===c&&(e.style.position="relative"),u=f.offset(),o=w.css(e,"top"),s=w.css(e,"left"),(l=("absolute"===c||"fixed"===c)&&(o+s).indexOf("auto")>-1)?(a=(r=f.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(s)||0),g(t)&&(t=t.call(e,n,w.extend({},u))),null!=t.top&&(d.top=t.top-u.top+a),null!=t.left&&(d.left=t.left-u.left+i),"using"in t?t.using.call(e,d):f.css(d)}},w.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){w.offset.setOffset(this,e,t)});var t,n,r=this[0];if(r)return r.getClientRects().length?(t=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:t.top+n.pageYOffset,left:t.left+n.pageXOffset}):{top:0,left:0}},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===w.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===w.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=w(e).offset()).top+=w.css(e,"borderTopWidth",!0),i.left+=w.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-w.css(r,"marginTop",!0),left:t.left-i.left-w.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===w.css(e,"position"))e=e.offsetParent;return e||xe})}}),w.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n="pageYOffset"===t;w.fn[e]=function(r){return _(this,function(e,r,i){var o;if(v(e)?o=e:9===e.nodeType&&(o=e.defaultView),void 0===i)return o?o[t]:e[r];o?o.scrollTo(n?o.pageXOffset:i,n?i:o.pageYOffset):e[r]=i},e,r,arguments.length)}}),w.each(["top","left"],function(e,t){w.cssHooks[t]=ze(h.pixelPosition,function(e,n){if(n)return n=Fe(e,t),Me.test(n)?w(e).position()[t]+"px":n})}),w.each({Height:"height",Width:"width"},function(e,t){w.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){w.fn[r]=function(i,o){var a=arguments.length&&(n||"boolean"!=typeof i),u=n||(!0===i||!0===o?"margin":"border");return _(this,function(t,n,i){var o;return v(t)?0===r.indexOf("outer")?t["inner"+e]:t.document.documentElement["client"+e]:9===t.nodeType?(o=t.documentElement,Math.max(t.body["scroll"+e],o["scroll"+e],t.body["offset"+e],o["offset"+e],o["client"+e])):void 0===i?w.css(t,n,u):w.style(t,n,i,u)},t,a?i:void 0,a)}})}),w.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,t){w.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),w.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),w.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),w.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),g(e))return r=o.call(arguments,2),i=function(){return e.apply(t||this,r.concat(o.call(arguments)))},i.guid=e.guid=e.guid||w.guid++,i},w.holdReady=function(e){e?w.readyWait++:w.ready(!0)},w.isArray=Array.isArray,w.parseJSON=JSON.parse,w.nodeName=D,w.isFunction=g,w.isWindow=v,w.camelCase=Q,w.type=b,w.now=Date.now,w.isNumeric=function(e){var t=w.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},"function"==typeof define&&define.amd&&define("jquery",[],function(){return w});var vt=e.jQuery,yt=e.$;return w.noConflict=function(t){return e.$===w&&(e.$=yt),t&&e.jQuery===w&&(e.jQuery=vt),w},t||(e.jQuery=e.$=w),w}); diff --git a/ui/shared/vendor/lodash/lodash.min.js b/ui/shared/vendor/lodash/lodash.min.js deleted file mode 100644 index c9112634..00000000 --- a/ui/shared/vendor/lodash/lodash.min.js +++ /dev/null @@ -1,137 +0,0 @@ -/** - * @license - * Lodash lodash.com/license | Underscore.js 1.8.3 underscorejs.org/LICENSE - */ -;(function(){function n(n,t,r){switch(r.length){case 0:return n.call(t);case 1:return n.call(t,r[0]);case 2:return n.call(t,r[0],r[1]);case 3:return n.call(t,r[0],r[1],r[2])}return n.apply(t,r)}function t(n,t,r,e){for(var u=-1,i=null==n?0:n.length;++u"']/g,G=RegExp(V.source),H=RegExp(K.source),J=/<%-([\s\S]+?)%>/g,Y=/<%([\s\S]+?)%>/g,Q=/<%=([\s\S]+?)%>/g,X=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,nn=/^\w*$/,tn=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,rn=/[\\^$.*+?()[\]{}|]/g,en=RegExp(rn.source),un=/^\s+|\s+$/g,on=/^\s+/,fn=/\s+$/,cn=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,an=/\{\n\/\* \[wrapped with (.+)\] \*/,ln=/,? & /,sn=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,hn=/\\(\\)?/g,pn=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,_n=/\w*$/,vn=/^[-+]0x[0-9a-f]+$/i,gn=/^0b[01]+$/i,dn=/^\[object .+?Constructor\]$/,yn=/^0o[0-7]+$/i,bn=/^(?:0|[1-9]\d*)$/,xn=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,jn=/($^)/,wn=/['\n\r\u2028\u2029\\]/g,mn="[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?(?:\\u200d(?:[^\\ud800-\\udfff]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?)*",An="(?:[\\u2700-\\u27bf]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])"+mn,kn="(?:[^\\ud800-\\udfff][\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]?|[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\ud800-\\udfff])",En=RegExp("['\u2019]","g"),Sn=RegExp("[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]","g"),On=RegExp("\\ud83c[\\udffb-\\udfff](?=\\ud83c[\\udffb-\\udfff])|"+kn+mn,"g"),In=RegExp(["[A-Z\\xc0-\\xd6\\xd8-\\xde]?[a-z\\xdf-\\xf6\\xf8-\\xff]+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?=[\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000]|[A-Z\\xc0-\\xd6\\xd8-\\xde]|$)|(?:[A-Z\\xc0-\\xd6\\xd8-\\xde]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?=[\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000]|[A-Z\\xc0-\\xd6\\xd8-\\xde](?:[a-z\\xdf-\\xf6\\xf8-\\xff]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])|$)|[A-Z\\xc0-\\xd6\\xd8-\\xde]?(?:[a-z\\xdf-\\xf6\\xf8-\\xff]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+(?:['\u2019](?:d|ll|m|re|s|t|ve))?|[A-Z\\xc0-\\xd6\\xd8-\\xde]+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?|\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])|\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])|\\d+",An].join("|"),"g"),Rn=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]"),zn=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Wn="Array Buffer DataView Date Error Float32Array Float64Array Function Int8Array Int16Array Int32Array Map Math Object Promise RegExp Set String Symbol TypeError Uint8Array Uint8ClampedArray Uint16Array Uint32Array WeakMap _ clearTimeout isFinite parseInt setTimeout".split(" "),Un={}; -Un["[object Float32Array]"]=Un["[object Float64Array]"]=Un["[object Int8Array]"]=Un["[object Int16Array]"]=Un["[object Int32Array]"]=Un["[object Uint8Array]"]=Un["[object Uint8ClampedArray]"]=Un["[object Uint16Array]"]=Un["[object Uint32Array]"]=true,Un["[object Arguments]"]=Un["[object Array]"]=Un["[object ArrayBuffer]"]=Un["[object Boolean]"]=Un["[object DataView]"]=Un["[object Date]"]=Un["[object Error]"]=Un["[object Function]"]=Un["[object Map]"]=Un["[object Number]"]=Un["[object Object]"]=Un["[object RegExp]"]=Un["[object Set]"]=Un["[object String]"]=Un["[object WeakMap]"]=false; -var Bn={};Bn["[object Arguments]"]=Bn["[object Array]"]=Bn["[object ArrayBuffer]"]=Bn["[object DataView]"]=Bn["[object Boolean]"]=Bn["[object Date]"]=Bn["[object Float32Array]"]=Bn["[object Float64Array]"]=Bn["[object Int8Array]"]=Bn["[object Int16Array]"]=Bn["[object Int32Array]"]=Bn["[object Map]"]=Bn["[object Number]"]=Bn["[object Object]"]=Bn["[object RegExp]"]=Bn["[object Set]"]=Bn["[object String]"]=Bn["[object Symbol]"]=Bn["[object Uint8Array]"]=Bn["[object Uint8ClampedArray]"]=Bn["[object Uint16Array]"]=Bn["[object Uint32Array]"]=true, -Bn["[object Error]"]=Bn["[object Function]"]=Bn["[object WeakMap]"]=false;var Ln={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Cn=parseFloat,Dn=parseInt,Mn=typeof global=="object"&&global&&global.Object===Object&&global,Tn=typeof self=="object"&&self&&self.Object===Object&&self,$n=Mn||Tn||Function("return this")(),Fn=typeof exports=="object"&&exports&&!exports.nodeType&&exports,Nn=Fn&&typeof module=="object"&&module&&!module.nodeType&&module,Pn=Nn&&Nn.exports===Fn,Zn=Pn&&Mn.process,qn=function(){ -try{var n=Nn&&Nn.require&&Nn.require("util").types;return n?n:Zn&&Zn.binding&&Zn.binding("util")}catch(n){}}(),Vn=qn&&qn.isArrayBuffer,Kn=qn&&qn.isDate,Gn=qn&&qn.isMap,Hn=qn&&qn.isRegExp,Jn=qn&&qn.isSet,Yn=qn&&qn.isTypedArray,Qn=b("length"),Xn=x({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e", -"\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a", -"\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I", -"\u0129":"i","\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r", -"\u0159":"r","\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ", -"\u0133":"ij","\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"}),nt=x({"&":"&","<":"<",">":">",'"':""","'":"'"}),tt=x({"&":"&","<":"<",">":">",""":'"',"'":"'"}),rt=function x(mn){function An(n){if(yu(n)&&!ff(n)&&!(n instanceof Ln)){if(n instanceof On)return n;if(oi.call(n,"__wrapped__"))return Fe(n)}return new On(n)}function kn(){}function On(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=T}function Ln(n){ -this.__wrapped__=n,this.__actions__=[],this.__dir__=1,this.__filtered__=false,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Mn(n){var t=-1,r=null==n?0:n.length;for(this.clear();++t=t?n:t)),n}function _t(n,t,e,u,i,o){var f,c=1&t,a=2&t,l=4&t;if(e&&(f=i?e(n,u,i,o):e(n)),f!==T)return f;if(!du(n))return n;if(u=ff(n)){if(f=me(n),!c)return Lr(n,f)}else{var s=vo(n),h="[object Function]"==s||"[object GeneratorFunction]"==s;if(af(n))return Ir(n,c);if("[object Object]"==s||"[object Arguments]"==s||h&&!i){if(f=a||h?{}:Ae(n),!c)return a?Mr(n,lt(f,n)):Dr(n,at(f,n))}else{if(!Bn[s])return i?n:{};f=ke(n,s,c)}}if(o||(o=new Zn), -i=o.get(n))return i;if(o.set(n,f),pf(n))return n.forEach(function(r){f.add(_t(r,t,e,r,n,o))}),f;if(sf(n))return n.forEach(function(r,u){f.set(u,_t(r,t,e,u,n,o))}),f;var a=l?a?ve:_e:a?Uu:Wu,p=u?T:a(n);return r(p||n,function(r,u){p&&(u=r,r=n[u]),ot(f,u,_t(r,t,e,u,n,o))}),f}function vt(n){var t=Wu(n);return function(r){return gt(r,n,t)}}function gt(n,t,r){var e=r.length;if(null==n)return!e;for(n=Qu(n);e--;){var u=r[e],i=t[u],o=n[u];if(o===T&&!(u in n)||!i(o))return false}return true}function dt(n,t,r){if(typeof n!="function")throw new ti("Expected a function"); -return bo(function(){n.apply(T,r)},t)}function yt(n,t,r,e){var u=-1,i=o,a=true,l=n.length,s=[],h=t.length;if(!l)return s;r&&(t=c(t,E(r))),e?(i=f,a=false):200<=t.length&&(i=O,a=false,t=new Nn(t));n:for(;++ut}function Rt(n,t){return null!=n&&oi.call(n,t)}function zt(n,t){return null!=n&&t in Qu(n)}function Wt(n,t,r){for(var e=r?f:o,u=n[0].length,i=n.length,a=i,l=Ku(i),s=1/0,h=[];a--;){var p=n[a];a&&t&&(p=c(p,E(t))),s=Ci(p.length,s), -l[a]=!r&&(t||120<=u&&120<=p.length)?new Nn(a&&p):T}var p=n[0],_=-1,v=l[0];n:for(;++_r.length?t:Et(t,hr(r,0,-1)),r=null==t?t:t[Me(Ve(r))],null==r?T:n(r,t,e)}function Lt(n){return yu(n)&&"[object Arguments]"==Ot(n)}function Ct(n){ -return yu(n)&&"[object ArrayBuffer]"==Ot(n)}function Dt(n){return yu(n)&&"[object Date]"==Ot(n)}function Mt(n,t,r,e,u){if(n===t)return true;if(null==n||null==t||!yu(n)&&!yu(t))return n!==n&&t!==t;n:{var i=ff(n),o=ff(t),f=i?"[object Array]":vo(n),c=o?"[object Array]":vo(t),f="[object Arguments]"==f?"[object Object]":f,c="[object Arguments]"==c?"[object Object]":c,a="[object Object]"==f,o="[object Object]"==c;if((c=f==c)&&af(n)){if(!af(t)){t=false;break n}i=true,a=false}if(c&&!a)u||(u=new Zn),t=i||_f(n)?se(n,t,r,e,Mt,u):he(n,t,f,r,e,Mt,u);else{ -if(!(1&r)&&(i=a&&oi.call(n,"__wrapped__"),f=o&&oi.call(t,"__wrapped__"),i||f)){n=i?n.value():n,t=f?t.value():t,u||(u=new Zn),t=Mt(n,t,r,e,u);break n}if(c)t:if(u||(u=new Zn),i=1&r,f=_e(n),o=f.length,c=_e(t).length,o==c||i){for(a=o;a--;){var l=f[a];if(!(i?l in t:oi.call(t,l))){t=false;break t}}if((c=u.get(n))&&u.get(t))t=c==t;else{c=true,u.set(n,t),u.set(t,n);for(var s=i;++at?r:0,Se(t,r)?n[t]:T}function Xt(n,t,r){var e=-1;return t=c(t.length?t:[$u],E(ye())),n=Gt(n,function(n,r,u){return{a:c(t,function(t){return t(n)}), -b:++e,c:n}}),w(n,function(n,t){var e;n:{e=-1;for(var u=n.a,i=t.a,o=u.length,f=r.length;++e=f){e=c;break n}e=c*("desc"==r[e]?-1:1);break n}}e=n.b-t.b}return e})}function nr(n,t){return tr(n,t,function(t,r){return zu(n,r)})}function tr(n,t,r){for(var e=-1,u=t.length,i={};++et||9007199254740991t&&(t=-t>u?0:u+t),r=r>u?u:r,0>r&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0,r=Ku(u);++e=u){for(;e>>1,o=n[i];null!==o&&!wu(o)&&(r?o<=t:ot.length?n:Et(n,hr(t,0,-1)),null==n||delete n[Me(Ve(t))]}function jr(n,t,r,e){for(var u=n.length,i=e?u:-1;(e?i--:++ie)return e?br(n[0]):[];for(var u=-1,i=Ku(e);++u=e?n:hr(n,t,r)}function Ir(n,t){if(t)return n.slice();var r=n.length,r=gi?gi(r):new n.constructor(r);return n.copy(r),r}function Rr(n){var t=new n.constructor(n.byteLength);return new vi(t).set(new vi(n)),t}function zr(n,t){return new n.constructor(t?Rr(n.buffer):n.buffer,n.byteOffset,n.length); -}function Wr(n,t){if(n!==t){var r=n!==T,e=null===n,u=n===n,i=wu(n),o=t!==T,f=null===t,c=t===t,a=wu(t);if(!f&&!a&&!i&&n>t||i&&o&&c&&!f&&!a||e&&o&&c||!r&&c||!u)return 1;if(!e&&!i&&!a&&nu?T:i,u=1),t=Qu(t);++eo&&f[0]!==a&&f[o-1]!==a?[]:B(f,a),o-=c.length,or?r?or(t,n):t:(r=or(t,Oi(n/D(t))),Rn.test(t)?Or(M(r),0,n).join(""):r.slice(0,n))}function te(t,r,e,u){function i(){for(var r=-1,c=arguments.length,a=-1,l=u.length,s=Ku(l+c),h=this&&this!==$n&&this instanceof i?f:t;++at||e)&&(1&n&&(i[2]=h[2],t|=1&r?0:4),(r=h[3])&&(e=i[3],i[3]=e?Ur(e,r,h[4]):r,i[4]=e?B(i[3],"__lodash_placeholder__"):h[4]),(r=h[5])&&(e=i[5],i[5]=e?Br(e,r,h[6]):r,i[6]=e?B(i[5],"__lodash_placeholder__"):h[6]),(r=h[7])&&(i[7]=r),128&n&&(i[8]=null==i[8]?h[8]:Ci(i[8],h[8])),null==i[9]&&(i[9]=h[9]),i[0]=h[0],i[1]=t),n=i[0],t=i[1], -r=i[2],e=i[3],u=i[4],f=i[9]=i[9]===T?c?0:n.length:Li(i[9]-a,0),!f&&24&t&&(t&=-25),c=t&&1!=t?8==t||16==t?Kr(n,t,f):32!=t&&33!=t||u.length?Jr.apply(T,i):te(n,t,r,e):Pr(n,t,r),Le((h?co:yo)(c,i),n,t)}function ce(n,t,r,e){return n===T||lu(n,ei[r])&&!oi.call(e,r)?t:n}function ae(n,t,r,e,u,i){return du(n)&&du(t)&&(i.set(t,n),Yt(n,t,T,ae,i),i.delete(t)),n}function le(n){return xu(n)?T:n}function se(n,t,r,e,u,i){var o=1&r,f=n.length,c=t.length;if(f!=c&&!(o&&c>f))return false;if((c=i.get(n))&&i.get(t))return c==t; -var c=-1,a=true,l=2&r?new Nn:T;for(i.set(n,t),i.set(t,n);++cr&&(r=Li(e+r,0)),_(n,ye(t,3),r)):-1}function Pe(n,t,r){var e=null==n?0:n.length;if(!e)return-1;var u=e-1;return r!==T&&(u=ku(r),u=0>r?Li(e+u,0):Ci(u,e-1)),_(n,ye(t,3),u,true)}function Ze(n){return(null==n?0:n.length)?wt(n,1):[]; -}function qe(n){return n&&n.length?n[0]:T}function Ve(n){var t=null==n?0:n.length;return t?n[t-1]:T}function Ke(n,t){return n&&n.length&&t&&t.length?er(n,t):n}function Ge(n){return null==n?n:$i.call(n)}function He(n){if(!n||!n.length)return[];var t=0;return n=i(n,function(n){if(hu(n))return t=Li(n.length,t),true}),A(t,function(t){return c(n,b(t))})}function Je(t,r){if(!t||!t.length)return[];var e=He(t);return null==r?e:c(e,function(t){return n(r,T,t)})}function Ye(n){return n=An(n),n.__chain__=true,n; -}function Qe(n,t){return t(n)}function Xe(){return this}function nu(n,t){return(ff(n)?r:uo)(n,ye(t,3))}function tu(n,t){return(ff(n)?e:io)(n,ye(t,3))}function ru(n,t){return(ff(n)?c:Gt)(n,ye(t,3))}function eu(n,t,r){return t=r?T:t,t=n&&null==t?n.length:t,fe(n,128,T,T,T,T,t)}function uu(n,t){var r;if(typeof t!="function")throw new ti("Expected a function");return n=ku(n),function(){return 0<--n&&(r=t.apply(this,arguments)),1>=n&&(t=T),r}}function iu(n,t,r){return t=r?T:t,n=fe(n,8,T,T,T,T,T,t),n.placeholder=iu.placeholder, -n}function ou(n,t,r){return t=r?T:t,n=fe(n,16,T,T,T,T,T,t),n.placeholder=ou.placeholder,n}function fu(n,t,r){function e(t){var r=c,e=a;return c=a=T,_=t,s=n.apply(e,r)}function u(n){var r=n-p;return n-=_,p===T||r>=t||0>r||g&&n>=l}function i(){var n=Go();if(u(n))return o(n);var r,e=bo;r=n-_,n=t-(n-p),r=g?Ci(n,l-r):n,h=e(i,r)}function o(n){return h=T,d&&c?e(n):(c=a=T,s)}function f(){var n=Go(),r=u(n);if(c=arguments,a=this,p=n,r){if(h===T)return _=n=p,h=bo(i,t),v?e(n):s;if(g)return h=bo(i,t),e(p)}return h===T&&(h=bo(i,t)), -s}var c,a,l,s,h,p,_=0,v=false,g=false,d=true;if(typeof n!="function")throw new ti("Expected a function");return t=Su(t)||0,du(r)&&(v=!!r.leading,l=(g="maxWait"in r)?Li(Su(r.maxWait)||0,t):l,d="trailing"in r?!!r.trailing:d),f.cancel=function(){h!==T&&lo(h),_=0,c=p=a=h=T},f.flush=function(){return h===T?s:o(Go())},f}function cu(n,t){if(typeof n!="function"||null!=t&&typeof t!="function")throw new ti("Expected a function");var r=function(){var e=arguments,u=t?t.apply(this,e):e[0],i=r.cache;return i.has(u)?i.get(u):(e=n.apply(this,e), -r.cache=i.set(u,e)||i,e)};return r.cache=new(cu.Cache||Fn),r}function au(n){if(typeof n!="function")throw new ti("Expected a function");return function(){var t=arguments;switch(t.length){case 0:return!n.call(this);case 1:return!n.call(this,t[0]);case 2:return!n.call(this,t[0],t[1]);case 3:return!n.call(this,t[0],t[1],t[2])}return!n.apply(this,t)}}function lu(n,t){return n===t||n!==n&&t!==t}function su(n){return null!=n&&gu(n.length)&&!_u(n)}function hu(n){return yu(n)&&su(n)}function pu(n){if(!yu(n))return false; -var t=Ot(n);return"[object Error]"==t||"[object DOMException]"==t||typeof n.message=="string"&&typeof n.name=="string"&&!xu(n)}function _u(n){return!!du(n)&&(n=Ot(n),"[object Function]"==n||"[object GeneratorFunction]"==n||"[object AsyncFunction]"==n||"[object Proxy]"==n)}function vu(n){return typeof n=="number"&&n==ku(n)}function gu(n){return typeof n=="number"&&-1=n}function du(n){var t=typeof n;return null!=n&&("object"==t||"function"==t)}function yu(n){return null!=n&&typeof n=="object"; -}function bu(n){return typeof n=="number"||yu(n)&&"[object Number]"==Ot(n)}function xu(n){return!(!yu(n)||"[object Object]"!=Ot(n))&&(n=di(n),null===n||(n=oi.call(n,"constructor")&&n.constructor,typeof n=="function"&&n instanceof n&&ii.call(n)==li))}function ju(n){return typeof n=="string"||!ff(n)&&yu(n)&&"[object String]"==Ot(n)}function wu(n){return typeof n=="symbol"||yu(n)&&"[object Symbol]"==Ot(n)}function mu(n){if(!n)return[];if(su(n))return ju(n)?M(n):Lr(n);if(wi&&n[wi]){n=n[wi]();for(var t,r=[];!(t=n.next()).done;)r.push(t.value); -return r}return t=vo(n),("[object Map]"==t?W:"[object Set]"==t?L:Lu)(n)}function Au(n){return n?(n=Su(n),n===$||n===-$?1.7976931348623157e308*(0>n?-1:1):n===n?n:0):0===n?n:0}function ku(n){n=Au(n);var t=n%1;return n===n?t?n-t:n:0}function Eu(n){return n?pt(ku(n),0,4294967295):0}function Su(n){if(typeof n=="number")return n;if(wu(n))return F;if(du(n)&&(n=typeof n.valueOf=="function"?n.valueOf():n,n=du(n)?n+"":n),typeof n!="string")return 0===n?n:+n;n=n.replace(un,"");var t=gn.test(n);return t||yn.test(n)?Dn(n.slice(2),t?2:8):vn.test(n)?F:+n; -}function Ou(n){return Cr(n,Uu(n))}function Iu(n){return null==n?"":yr(n)}function Ru(n,t,r){return n=null==n?T:Et(n,t),n===T?r:n}function zu(n,t){return null!=n&&we(n,t,zt)}function Wu(n){return su(n)?qn(n):Vt(n)}function Uu(n){if(su(n))n=qn(n,true);else if(du(n)){var t,r=ze(n),e=[];for(t in n)("constructor"!=t||!r&&oi.call(n,t))&&e.push(t);n=e}else{if(t=[],null!=n)for(r in Qu(n))t.push(r);n=t}return n}function Bu(n,t){if(null==n)return{};var r=c(ve(n),function(n){return[n]});return t=ye(t),tr(n,r,function(n,r){ -return t(n,r[0])})}function Lu(n){return null==n?[]:S(n,Wu(n))}function Cu(n){return $f(Iu(n).toLowerCase())}function Du(n){return(n=Iu(n))&&n.replace(xn,Xn).replace(Sn,"")}function Mu(n,t,r){return n=Iu(n),t=r?T:t,t===T?zn.test(n)?n.match(In)||[]:n.match(sn)||[]:n.match(t)||[]}function Tu(n){return function(){return n}}function $u(n){return n}function Fu(n){return qt(typeof n=="function"?n:_t(n,1))}function Nu(n,t,e){var u=Wu(t),i=kt(t,u);null!=e||du(t)&&(i.length||!u.length)||(e=t,t=n,n=this,i=kt(t,Wu(t))); -var o=!(du(e)&&"chain"in e&&!e.chain),f=_u(n);return r(i,function(r){var e=t[r];n[r]=e,f&&(n.prototype[r]=function(){var t=this.__chain__;if(o||t){var r=n(this.__wrapped__);return(r.__actions__=Lr(this.__actions__)).push({func:e,args:arguments,thisArg:n}),r.__chain__=t,r}return e.apply(n,a([this.value()],arguments))})}),n}function Pu(){}function Zu(n){return Ie(n)?b(Me(n)):rr(n)}function qu(){return[]}function Vu(){return false}mn=null==mn?$n:rt.defaults($n.Object(),mn,rt.pick($n,Wn));var Ku=mn.Array,Gu=mn.Date,Hu=mn.Error,Ju=mn.Function,Yu=mn.Math,Qu=mn.Object,Xu=mn.RegExp,ni=mn.String,ti=mn.TypeError,ri=Ku.prototype,ei=Qu.prototype,ui=mn["__core-js_shared__"],ii=Ju.prototype.toString,oi=ei.hasOwnProperty,fi=0,ci=function(){ -var n=/[^.]+$/.exec(ui&&ui.keys&&ui.keys.IE_PROTO||"");return n?"Symbol(src)_1."+n:""}(),ai=ei.toString,li=ii.call(Qu),si=$n._,hi=Xu("^"+ii.call(oi).replace(rn,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),pi=Pn?mn.Buffer:T,_i=mn.Symbol,vi=mn.Uint8Array,gi=pi?pi.allocUnsafe:T,di=U(Qu.getPrototypeOf,Qu),yi=Qu.create,bi=ei.propertyIsEnumerable,xi=ri.splice,ji=_i?_i.isConcatSpreadable:T,wi=_i?_i.iterator:T,mi=_i?_i.toStringTag:T,Ai=function(){try{var n=je(Qu,"defineProperty"); -return n({},"",{}),n}catch(n){}}(),ki=mn.clearTimeout!==$n.clearTimeout&&mn.clearTimeout,Ei=Gu&&Gu.now!==$n.Date.now&&Gu.now,Si=mn.setTimeout!==$n.setTimeout&&mn.setTimeout,Oi=Yu.ceil,Ii=Yu.floor,Ri=Qu.getOwnPropertySymbols,zi=pi?pi.isBuffer:T,Wi=mn.isFinite,Ui=ri.join,Bi=U(Qu.keys,Qu),Li=Yu.max,Ci=Yu.min,Di=Gu.now,Mi=mn.parseInt,Ti=Yu.random,$i=ri.reverse,Fi=je(mn,"DataView"),Ni=je(mn,"Map"),Pi=je(mn,"Promise"),Zi=je(mn,"Set"),qi=je(mn,"WeakMap"),Vi=je(Qu,"create"),Ki=qi&&new qi,Gi={},Hi=Te(Fi),Ji=Te(Ni),Yi=Te(Pi),Qi=Te(Zi),Xi=Te(qi),no=_i?_i.prototype:T,to=no?no.valueOf:T,ro=no?no.toString:T,eo=function(){ -function n(){}return function(t){return du(t)?yi?yi(t):(n.prototype=t,t=new n,n.prototype=T,t):{}}}();An.templateSettings={escape:J,evaluate:Y,interpolate:Q,variable:"",imports:{_:An}},An.prototype=kn.prototype,An.prototype.constructor=An,On.prototype=eo(kn.prototype),On.prototype.constructor=On,Ln.prototype=eo(kn.prototype),Ln.prototype.constructor=Ln,Mn.prototype.clear=function(){this.__data__=Vi?Vi(null):{},this.size=0},Mn.prototype.delete=function(n){return n=this.has(n)&&delete this.__data__[n], -this.size-=n?1:0,n},Mn.prototype.get=function(n){var t=this.__data__;return Vi?(n=t[n],"__lodash_hash_undefined__"===n?T:n):oi.call(t,n)?t[n]:T},Mn.prototype.has=function(n){var t=this.__data__;return Vi?t[n]!==T:oi.call(t,n)},Mn.prototype.set=function(n,t){var r=this.__data__;return this.size+=this.has(n)?0:1,r[n]=Vi&&t===T?"__lodash_hash_undefined__":t,this},Tn.prototype.clear=function(){this.__data__=[],this.size=0},Tn.prototype.delete=function(n){var t=this.__data__;return n=ft(t,n),!(0>n)&&(n==t.length-1?t.pop():xi.call(t,n,1), ---this.size,true)},Tn.prototype.get=function(n){var t=this.__data__;return n=ft(t,n),0>n?T:t[n][1]},Tn.prototype.has=function(n){return-1e?(++this.size,r.push([n,t])):r[e][1]=t,this},Fn.prototype.clear=function(){this.size=0,this.__data__={hash:new Mn,map:new(Ni||Tn),string:new Mn}},Fn.prototype.delete=function(n){return n=be(this,n).delete(n),this.size-=n?1:0,n},Fn.prototype.get=function(n){return be(this,n).get(n); -},Fn.prototype.has=function(n){return be(this,n).has(n)},Fn.prototype.set=function(n,t){var r=be(this,n),e=r.size;return r.set(n,t),this.size+=r.size==e?0:1,this},Nn.prototype.add=Nn.prototype.push=function(n){return this.__data__.set(n,"__lodash_hash_undefined__"),this},Nn.prototype.has=function(n){return this.__data__.has(n)},Zn.prototype.clear=function(){this.__data__=new Tn,this.size=0},Zn.prototype.delete=function(n){var t=this.__data__;return n=t.delete(n),this.size=t.size,n},Zn.prototype.get=function(n){ -return this.__data__.get(n)},Zn.prototype.has=function(n){return this.__data__.has(n)},Zn.prototype.set=function(n,t){var r=this.__data__;if(r instanceof Tn){var e=r.__data__;if(!Ni||199>e.length)return e.push([n,t]),this.size=++r.size,this;r=this.__data__=new Fn(e)}return r.set(n,t),this.size=r.size,this};var uo=Fr(mt),io=Fr(At,true),oo=Nr(),fo=Nr(true),co=Ki?function(n,t){return Ki.set(n,t),n}:$u,ao=Ai?function(n,t){return Ai(n,"toString",{configurable:true,enumerable:false,value:Tu(t),writable:true})}:$u,lo=ki||function(n){ -return $n.clearTimeout(n)},so=Zi&&1/L(new Zi([,-0]))[1]==$?function(n){return new Zi(n)}:Pu,ho=Ki?function(n){return Ki.get(n)}:Pu,po=Ri?function(n){return null==n?[]:(n=Qu(n),i(Ri(n),function(t){return bi.call(n,t)}))}:qu,_o=Ri?function(n){for(var t=[];n;)a(t,po(n)),n=di(n);return t}:qu,vo=Ot;(Fi&&"[object DataView]"!=vo(new Fi(new ArrayBuffer(1)))||Ni&&"[object Map]"!=vo(new Ni)||Pi&&"[object Promise]"!=vo(Pi.resolve())||Zi&&"[object Set]"!=vo(new Zi)||qi&&"[object WeakMap]"!=vo(new qi))&&(vo=function(n){ -var t=Ot(n);if(n=(n="[object Object]"==t?n.constructor:T)?Te(n):"")switch(n){case Hi:return"[object DataView]";case Ji:return"[object Map]";case Yi:return"[object Promise]";case Qi:return"[object Set]";case Xi:return"[object WeakMap]"}return t});var go=ui?_u:Vu,yo=Ce(co),bo=Si||function(n,t){return $n.setTimeout(n,t)},xo=Ce(ao),jo=function(n){n=cu(n,function(n){return 500===t.size&&t.clear(),n});var t=n.cache;return n}(function(n){var t=[];return 46===n.charCodeAt(0)&&t.push(""),n.replace(tn,function(n,r,e,u){ -t.push(e?u.replace(hn,"$1"):r||n)}),t}),wo=fr(function(n,t){return hu(n)?yt(n,wt(t,1,hu,true)):[]}),mo=fr(function(n,t){var r=Ve(t);return hu(r)&&(r=T),hu(n)?yt(n,wt(t,1,hu,true),ye(r,2)):[]}),Ao=fr(function(n,t){var r=Ve(t);return hu(r)&&(r=T),hu(n)?yt(n,wt(t,1,hu,true),T,r):[]}),ko=fr(function(n){var t=c(n,kr);return t.length&&t[0]===n[0]?Wt(t):[]}),Eo=fr(function(n){var t=Ve(n),r=c(n,kr);return t===Ve(r)?t=T:r.pop(),r.length&&r[0]===n[0]?Wt(r,ye(t,2)):[]}),So=fr(function(n){var t=Ve(n),r=c(n,kr);return(t=typeof t=="function"?t:T)&&r.pop(), -r.length&&r[0]===n[0]?Wt(r,T,t):[]}),Oo=fr(Ke),Io=pe(function(n,t){var r=null==n?0:n.length,e=ht(n,t);return ur(n,c(t,function(n){return Se(n,r)?+n:n}).sort(Wr)),e}),Ro=fr(function(n){return br(wt(n,1,hu,true))}),zo=fr(function(n){var t=Ve(n);return hu(t)&&(t=T),br(wt(n,1,hu,true),ye(t,2))}),Wo=fr(function(n){var t=Ve(n),t=typeof t=="function"?t:T;return br(wt(n,1,hu,true),T,t)}),Uo=fr(function(n,t){return hu(n)?yt(n,t):[]}),Bo=fr(function(n){return mr(i(n,hu))}),Lo=fr(function(n){var t=Ve(n);return hu(t)&&(t=T), -mr(i(n,hu),ye(t,2))}),Co=fr(function(n){var t=Ve(n),t=typeof t=="function"?t:T;return mr(i(n,hu),T,t)}),Do=fr(He),Mo=fr(function(n){var t=n.length,t=1=t}),of=Lt(function(){return arguments}())?Lt:function(n){return yu(n)&&oi.call(n,"callee")&&!bi.call(n,"callee")},ff=Ku.isArray,cf=Vn?E(Vn):Ct,af=zi||Vu,lf=Kn?E(Kn):Dt,sf=Gn?E(Gn):Tt,hf=Hn?E(Hn):Nt,pf=Jn?E(Jn):Pt,_f=Yn?E(Yn):Zt,vf=ee(Kt),gf=ee(function(n,t){return n<=t}),df=$r(function(n,t){ -if(ze(t)||su(t))Cr(t,Wu(t),n);else for(var r in t)oi.call(t,r)&&ot(n,r,t[r])}),yf=$r(function(n,t){Cr(t,Uu(t),n)}),bf=$r(function(n,t,r,e){Cr(t,Uu(t),n,e)}),xf=$r(function(n,t,r,e){Cr(t,Wu(t),n,e)}),jf=pe(ht),wf=fr(function(n,t){n=Qu(n);var r=-1,e=t.length,u=2--n)return t.apply(this,arguments)}},An.ary=eu,An.assign=df,An.assignIn=yf,An.assignInWith=bf,An.assignWith=xf,An.at=jf,An.before=uu,An.bind=Ho,An.bindAll=Nf,An.bindKey=Jo,An.castArray=function(){if(!arguments.length)return[];var n=arguments[0];return ff(n)?n:[n]},An.chain=Ye,An.chunk=function(n,t,r){if(t=(r?Oe(n,t,r):t===T)?1:Li(ku(t),0),r=null==n?0:n.length,!r||1>t)return[];for(var e=0,u=0,i=Ku(Oi(r/t));et?0:t,e)):[]},An.dropRight=function(n,t,r){var e=null==n?0:n.length;return e?(t=r||t===T?1:ku(t),t=e-t,hr(n,0,0>t?0:t)):[]},An.dropRightWhile=function(n,t){return n&&n.length?jr(n,ye(t,3),true,true):[]; -},An.dropWhile=function(n,t){return n&&n.length?jr(n,ye(t,3),true):[]},An.fill=function(n,t,r,e){var u=null==n?0:n.length;if(!u)return[];for(r&&typeof r!="number"&&Oe(n,t,r)&&(r=0,e=u),u=n.length,r=ku(r),0>r&&(r=-r>u?0:u+r),e=e===T||e>u?u:ku(e),0>e&&(e+=u),e=r>e?0:Eu(e);r>>0,r?(n=Iu(n))&&(typeof t=="string"||null!=t&&!hf(t))&&(t=yr(t),!t&&Rn.test(n))?Or(M(n),0,r):n.split(t,r):[]},An.spread=function(t,r){if(typeof t!="function")throw new ti("Expected a function");return r=null==r?0:Li(ku(r),0), -fr(function(e){var u=e[r];return e=Or(e,0,r),u&&a(e,u),n(t,this,e)})},An.tail=function(n){var t=null==n?0:n.length;return t?hr(n,1,t):[]},An.take=function(n,t,r){return n&&n.length?(t=r||t===T?1:ku(t),hr(n,0,0>t?0:t)):[]},An.takeRight=function(n,t,r){var e=null==n?0:n.length;return e?(t=r||t===T?1:ku(t),t=e-t,hr(n,0>t?0:t,e)):[]},An.takeRightWhile=function(n,t){return n&&n.length?jr(n,ye(t,3),false,true):[]},An.takeWhile=function(n,t){return n&&n.length?jr(n,ye(t,3)):[]},An.tap=function(n,t){return t(n), -n},An.throttle=function(n,t,r){var e=true,u=true;if(typeof n!="function")throw new ti("Expected a function");return du(r)&&(e="leading"in r?!!r.leading:e,u="trailing"in r?!!r.trailing:u),fu(n,t,{leading:e,maxWait:t,trailing:u})},An.thru=Qe,An.toArray=mu,An.toPairs=zf,An.toPairsIn=Wf,An.toPath=function(n){return ff(n)?c(n,Me):wu(n)?[n]:Lr(jo(Iu(n)))},An.toPlainObject=Ou,An.transform=function(n,t,e){var u=ff(n),i=u||af(n)||_f(n);if(t=ye(t,4),null==e){var o=n&&n.constructor;e=i?u?new o:[]:du(n)&&_u(o)?eo(di(n)):{}; -}return(i?r:mt)(n,function(n,r,u){return t(e,n,r,u)}),e},An.unary=function(n){return eu(n,1)},An.union=Ro,An.unionBy=zo,An.unionWith=Wo,An.uniq=function(n){return n&&n.length?br(n):[]},An.uniqBy=function(n,t){return n&&n.length?br(n,ye(t,2)):[]},An.uniqWith=function(n,t){return t=typeof t=="function"?t:T,n&&n.length?br(n,T,t):[]},An.unset=function(n,t){return null==n||xr(n,t)},An.unzip=He,An.unzipWith=Je,An.update=function(n,t,r){return null!=n&&(r=Er(r),n=lr(n,t,r(Et(n,t)),void 0)),n},An.updateWith=function(n,t,r,e){ -return e=typeof e=="function"?e:T,null!=n&&(r=Er(r),n=lr(n,t,r(Et(n,t)),e)),n},An.values=Lu,An.valuesIn=function(n){return null==n?[]:S(n,Uu(n))},An.without=Uo,An.words=Mu,An.wrap=function(n,t){return nf(Er(t),n)},An.xor=Bo,An.xorBy=Lo,An.xorWith=Co,An.zip=Do,An.zipObject=function(n,t){return Ar(n||[],t||[],ot)},An.zipObjectDeep=function(n,t){return Ar(n||[],t||[],lr)},An.zipWith=Mo,An.entries=zf,An.entriesIn=Wf,An.extend=yf,An.extendWith=bf,Nu(An,An),An.add=Qf,An.attempt=Ff,An.camelCase=Uf,An.capitalize=Cu, -An.ceil=Xf,An.clamp=function(n,t,r){return r===T&&(r=t,t=T),r!==T&&(r=Su(r),r=r===r?r:0),t!==T&&(t=Su(t),t=t===t?t:0),pt(Su(n),t,r)},An.clone=function(n){return _t(n,4)},An.cloneDeep=function(n){return _t(n,5)},An.cloneDeepWith=function(n,t){return t=typeof t=="function"?t:T,_t(n,5,t)},An.cloneWith=function(n,t){return t=typeof t=="function"?t:T,_t(n,4,t)},An.conformsTo=function(n,t){return null==t||gt(n,t,Wu(t))},An.deburr=Du,An.defaultTo=function(n,t){return null==n||n!==n?t:n},An.divide=nc,An.endsWith=function(n,t,r){ -n=Iu(n),t=yr(t);var e=n.length,e=r=r===T?e:pt(ku(r),0,e);return r-=t.length,0<=r&&n.slice(r,e)==t},An.eq=lu,An.escape=function(n){return(n=Iu(n))&&H.test(n)?n.replace(K,nt):n},An.escapeRegExp=function(n){return(n=Iu(n))&&en.test(n)?n.replace(rn,"\\$&"):n},An.every=function(n,t,r){var e=ff(n)?u:bt;return r&&Oe(n,t,r)&&(t=T),e(n,ye(t,3))},An.find=Fo,An.findIndex=Ne,An.findKey=function(n,t){return p(n,ye(t,3),mt)},An.findLast=No,An.findLastIndex=Pe,An.findLastKey=function(n,t){return p(n,ye(t,3),At); -},An.floor=tc,An.forEach=nu,An.forEachRight=tu,An.forIn=function(n,t){return null==n?n:oo(n,ye(t,3),Uu)},An.forInRight=function(n,t){return null==n?n:fo(n,ye(t,3),Uu)},An.forOwn=function(n,t){return n&&mt(n,ye(t,3))},An.forOwnRight=function(n,t){return n&&At(n,ye(t,3))},An.get=Ru,An.gt=ef,An.gte=uf,An.has=function(n,t){return null!=n&&we(n,t,Rt)},An.hasIn=zu,An.head=qe,An.identity=$u,An.includes=function(n,t,r,e){return n=su(n)?n:Lu(n),r=r&&!e?ku(r):0,e=n.length,0>r&&(r=Li(e+r,0)),ju(n)?r<=e&&-1r&&(r=Li(e+r,0)),v(n,t,r)):-1},An.inRange=function(n,t,r){return t=Au(t),r===T?(r=t,t=0):r=Au(r),n=Su(n),n>=Ci(t,r)&&n=n},An.isSet=pf,An.isString=ju,An.isSymbol=wu,An.isTypedArray=_f,An.isUndefined=function(n){return n===T},An.isWeakMap=function(n){return yu(n)&&"[object WeakMap]"==vo(n)},An.isWeakSet=function(n){return yu(n)&&"[object WeakSet]"==Ot(n)},An.join=function(n,t){return null==n?"":Ui.call(n,t)},An.kebabCase=Bf,An.last=Ve,An.lastIndexOf=function(n,t,r){var e=null==n?0:n.length;if(!e)return-1;var u=e;if(r!==T&&(u=ku(r),u=0>u?Li(e+u,0):Ci(u,e-1)), -t===t)n:{for(r=u+1;r--;)if(n[r]===t){n=r;break n}n=r}else n=_(n,d,u,true);return n},An.lowerCase=Lf,An.lowerFirst=Cf,An.lt=vf,An.lte=gf,An.max=function(n){return n&&n.length?xt(n,$u,It):T},An.maxBy=function(n,t){return n&&n.length?xt(n,ye(t,2),It):T},An.mean=function(n){return y(n,$u)},An.meanBy=function(n,t){return y(n,ye(t,2))},An.min=function(n){return n&&n.length?xt(n,$u,Kt):T},An.minBy=function(n,t){return n&&n.length?xt(n,ye(t,2),Kt):T},An.stubArray=qu,An.stubFalse=Vu,An.stubObject=function(){ -return{}},An.stubString=function(){return""},An.stubTrue=function(){return true},An.multiply=rc,An.nth=function(n,t){return n&&n.length?Qt(n,ku(t)):T},An.noConflict=function(){return $n._===this&&($n._=si),this},An.noop=Pu,An.now=Go,An.pad=function(n,t,r){n=Iu(n);var e=(t=ku(t))?D(n):0;return!t||e>=t?n:(t=(t-e)/2,ne(Ii(t),r)+n+ne(Oi(t),r))},An.padEnd=function(n,t,r){n=Iu(n);var e=(t=ku(t))?D(n):0;return t&&et){var e=n;n=t,t=e}return r||n%1||t%1?(r=Ti(),Ci(n+r*(t-n+Cn("1e-"+((r+"").length-1))),t)):ir(n,t)},An.reduce=function(n,t,r){var e=ff(n)?l:j,u=3>arguments.length;return e(n,ye(t,4),r,u,uo)},An.reduceRight=function(n,t,r){ -var e=ff(n)?s:j,u=3>arguments.length;return e(n,ye(t,4),r,u,io)},An.repeat=function(n,t,r){return t=(r?Oe(n,t,r):t===T)?1:ku(t),or(Iu(n),t)},An.replace=function(){var n=arguments,t=Iu(n[0]);return 3>n.length?t:t.replace(n[1],n[2])},An.result=function(n,t,r){t=Sr(t,n);var e=-1,u=t.length;for(u||(u=1,n=T);++en||9007199254740991=i)return n;if(i=r-D(e),1>i)return e;if(r=o?Or(o,0,i).join(""):n.slice(0,i),u===T)return r+e;if(o&&(i+=r.length-i),hf(u)){if(n.slice(i).search(u)){var f=r;for(u.global||(u=Xu(u.source,Iu(_n.exec(u))+"g")), -u.lastIndex=0;o=u.exec(f);)var c=o.index;r=r.slice(0,c===T?i:c)}}else n.indexOf(yr(u),i)!=i&&(u=r.lastIndexOf(u),-1e.__dir__?"Right":"")}),e},Ln.prototype[n+"Right"]=function(t){return this.reverse()[n](t).reverse()}}),r(["filter","map","takeWhile"],function(n,t){var r=t+1,e=1==r||3==r;Ln.prototype[n]=function(n){var t=this.clone();return t.__iteratees__.push({ -iteratee:ye(n,3),type:r}),t.__filtered__=t.__filtered__||e,t}}),r(["head","last"],function(n,t){var r="take"+(t?"Right":"");Ln.prototype[n]=function(){return this[r](1).value()[0]}}),r(["initial","tail"],function(n,t){var r="drop"+(t?"":"Right");Ln.prototype[n]=function(){return this.__filtered__?new Ln(this):this[r](1)}}),Ln.prototype.compact=function(){return this.filter($u)},Ln.prototype.find=function(n){return this.filter(n).head()},Ln.prototype.findLast=function(n){return this.reverse().find(n); -},Ln.prototype.invokeMap=fr(function(n,t){return typeof n=="function"?new Ln(this):this.map(function(r){return Bt(r,n,t)})}),Ln.prototype.reject=function(n){return this.filter(au(ye(n)))},Ln.prototype.slice=function(n,t){n=ku(n);var r=this;return r.__filtered__&&(0t)?new Ln(r):(0>n?r=r.takeRight(-n):n&&(r=r.drop(n)),t!==T&&(t=ku(t),r=0>t?r.dropRight(-t):r.take(t-n)),r)},Ln.prototype.takeRightWhile=function(n){return this.reverse().takeWhile(n).reverse()},Ln.prototype.toArray=function(){return this.take(4294967295); -},mt(Ln.prototype,function(n,t){var r=/^(?:filter|find|map|reject)|While$/.test(t),e=/^(?:head|last)$/.test(t),u=An[e?"take"+("last"==t?"Right":""):t],i=e||/^find/.test(t);u&&(An.prototype[t]=function(){var t=this.__wrapped__,o=e?[1]:arguments,f=t instanceof Ln,c=o[0],l=f||ff(t),s=function(n){return n=u.apply(An,a([n],o)),e&&h?n[0]:n};l&&r&&typeof c=="function"&&1!=c.length&&(f=l=false);var h=this.__chain__,p=!!this.__actions__.length,c=i&&!h,f=f&&!p;return!i&&l?(t=f?t:new Ln(this),t=n.apply(t,o),t.__actions__.push({ -func:Qe,args:[s],thisArg:T}),new On(t,h)):c&&f?n.apply(this,o):(t=this.thru(s),c?e?t.value()[0]:t.value():t)})}),r("pop push shift sort splice unshift".split(" "),function(n){var t=ri[n],r=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",e=/^(?:pop|shift)$/.test(n);An.prototype[n]=function(){var n=arguments;if(e&&!this.__chain__){var u=this.value();return t.apply(ff(u)?u:[],n)}return this[r](function(r){return t.apply(ff(r)?r:[],n)})}}),mt(Ln.prototype,function(n,t){var r=An[t];if(r){var e=r.name+""; -(Gi[e]||(Gi[e]=[])).push({name:t,func:r})}}),Gi[Jr(T,2).name]=[{name:"wrapper",func:T}],Ln.prototype.clone=function(){var n=new Ln(this.__wrapped__);return n.__actions__=Lr(this.__actions__),n.__dir__=this.__dir__,n.__filtered__=this.__filtered__,n.__iteratees__=Lr(this.__iteratees__),n.__takeCount__=this.__takeCount__,n.__views__=Lr(this.__views__),n},Ln.prototype.reverse=function(){if(this.__filtered__){var n=new Ln(this);n.__dir__=-1,n.__filtered__=true}else n=this.clone(),n.__dir__*=-1;return n; -},Ln.prototype.value=function(){var n,t=this.__wrapped__.value(),r=this.__dir__,e=ff(t),u=0>r,i=e?t.length:0;n=0;for(var o=i,f=this.__views__,c=-1,a=f.length;++c=this.__values__.length;return{done:n,value:n?T:this.__values__[this.__index__++]}},An.prototype.plant=function(n){for(var t,r=this;r instanceof kn;){ -var e=Fe(r);e.__index__=0,e.__values__=T,t?u.__wrapped__=e:t=e;var u=e,r=r.__wrapped__}return u.__wrapped__=n,t},An.prototype.reverse=function(){var n=this.__wrapped__;return n instanceof Ln?(this.__actions__.length&&(n=new Ln(this)),n=n.reverse(),n.__actions__.push({func:Qe,args:[Ge],thisArg:T}),new On(n,this.__chain__)):this.thru(Ge)},An.prototype.toJSON=An.prototype.valueOf=An.prototype.value=function(){return wr(this.__wrapped__,this.__actions__)},An.prototype.first=An.prototype.head,wi&&(An.prototype[wi]=Xe), -An}();typeof define=="function"&&typeof define.amd=="object"&&define.amd?($n._=rt, define(function(){return rt})):Nn?((Nn.exports=rt)._=rt,Fn._=rt):$n._=rt}).call(this); \ No newline at end of file diff --git a/ui/shared/vendor/popper.js/popper.min.js b/ui/shared/vendor/popper.js/popper.min.js deleted file mode 100644 index 94a5c26f..00000000 --- a/ui/shared/vendor/popper.js/popper.min.js +++ /dev/null @@ -1,5 +0,0 @@ -/* - Copyright (C) Federico Zivolo 2019 - Distributed under the MIT License (license terms are at http://opensource.org/licenses/MIT). - */(function(e,t){'object'==typeof exports&&'undefined'!=typeof module?module.exports=t():'function'==typeof define&&define.amd?define(t):e.Popper=t()})(this,function(){'use strict';function e(e){return e&&'[object Function]'==={}.toString.call(e)}function t(e,t){if(1!==e.nodeType)return[];var o=e.ownerDocument.defaultView,n=o.getComputedStyle(e,null);return t?n[t]:n}function o(e){return'HTML'===e.nodeName?e:e.parentNode||e.host}function n(e){if(!e)return document.body;switch(e.nodeName){case'HTML':case'BODY':return e.ownerDocument.body;case'#document':return e.body;}var i=t(e),r=i.overflow,p=i.overflowX,s=i.overflowY;return /(auto|scroll|overlay)/.test(r+s+p)?e:n(o(e))}function r(e){return 11===e?pe:10===e?se:pe||se}function p(e){if(!e)return document.documentElement;for(var o=r(10)?document.body:null,n=e.offsetParent||null;n===o&&e.nextElementSibling;)n=(e=e.nextElementSibling).offsetParent;var i=n&&n.nodeName;return i&&'BODY'!==i&&'HTML'!==i?-1!==['TH','TD','TABLE'].indexOf(n.nodeName)&&'static'===t(n,'position')?p(n):n:e?e.ownerDocument.documentElement:document.documentElement}function s(e){var t=e.nodeName;return'BODY'!==t&&('HTML'===t||p(e.firstElementChild)===e)}function d(e){return null===e.parentNode?e:d(e.parentNode)}function a(e,t){if(!e||!e.nodeType||!t||!t.nodeType)return document.documentElement;var o=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,n=o?e:t,i=o?t:e,r=document.createRange();r.setStart(n,0),r.setEnd(i,0);var l=r.commonAncestorContainer;if(e!==l&&t!==l||n.contains(i))return s(l)?l:p(l);var f=d(e);return f.host?a(f.host,t):a(e,d(t).host)}function l(e){var t=1=o.clientWidth&&n>=o.clientHeight}),l=0a[e]&&!t.escapeWithReference&&(n=Q(f[o],a[e]-('right'===e?f.width:f.height))),le({},o,n)}};return l.forEach(function(e){var t=-1===['left','top'].indexOf(e)?'secondary':'primary';f=fe({},f,m[t](e))}),e.offsets.popper=f,e},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,o=t.popper,n=t.reference,i=e.placement.split('-')[0],r=Z,p=-1!==['top','bottom'].indexOf(i),s=p?'right':'bottom',d=p?'left':'top',a=p?'width':'height';return o[s]r(n[s])&&(e.offsets.popper[d]=r(n[s])),e}},arrow:{order:500,enabled:!0,fn:function(e,o){var n;if(!K(e.instance.modifiers,'arrow','keepTogether'))return e;var i=o.element;if('string'==typeof i){if(i=e.instance.popper.querySelector(i),!i)return e;}else if(!e.instance.popper.contains(i))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),e;var r=e.placement.split('-')[0],p=e.offsets,s=p.popper,d=p.reference,a=-1!==['left','right'].indexOf(r),l=a?'height':'width',f=a?'Top':'Left',m=f.toLowerCase(),h=a?'left':'top',c=a?'bottom':'right',u=S(i)[l];d[c]-us[c]&&(e.offsets.popper[m]+=d[m]+u-s[c]),e.offsets.popper=g(e.offsets.popper);var b=d[m]+d[l]/2-u/2,w=t(e.instance.popper),y=parseFloat(w['margin'+f],10),E=parseFloat(w['border'+f+'Width'],10),v=b-e.offsets.popper[m]-y-E;return v=ee(Q(s[l]-u,v),0),e.arrowElement=i,e.offsets.arrow=(n={},le(n,m,$(v)),le(n,h,''),n),e},element:'[x-arrow]'},flip:{order:600,enabled:!0,fn:function(e,t){if(W(e.instance.modifiers,'inner'))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var o=v(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement,e.positionFixed),n=e.placement.split('-')[0],i=T(n),r=e.placement.split('-')[1]||'',p=[];switch(t.behavior){case ge.FLIP:p=[n,i];break;case ge.CLOCKWISE:p=G(n);break;case ge.COUNTERCLOCKWISE:p=G(n,!0);break;default:p=t.behavior;}return p.forEach(function(s,d){if(n!==s||p.length===d+1)return e;n=e.placement.split('-')[0],i=T(n);var a=e.offsets.popper,l=e.offsets.reference,f=Z,m='left'===n&&f(a.right)>f(l.left)||'right'===n&&f(a.left)f(l.top)||'bottom'===n&&f(a.top)f(o.right),g=f(a.top)f(o.bottom),b='left'===n&&h||'right'===n&&c||'top'===n&&g||'bottom'===n&&u,w=-1!==['top','bottom'].indexOf(n),y=!!t.flipVariations&&(w&&'start'===r&&h||w&&'end'===r&&c||!w&&'start'===r&&g||!w&&'end'===r&&u);(m||b||y)&&(e.flipped=!0,(m||b)&&(n=p[d+1]),y&&(r=z(r)),e.placement=n+(r?'-'+r:''),e.offsets.popper=fe({},e.offsets.popper,D(e.instance.popper,e.offsets.reference,e.placement)),e=P(e.instance.modifiers,e,'flip'))}),e},behavior:'flip',padding:5,boundariesElement:'viewport'},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,o=t.split('-')[0],n=e.offsets,i=n.popper,r=n.reference,p=-1!==['left','right'].indexOf(o),s=-1===['top','left'].indexOf(o);return i[p?'left':'top']=r[o]-(s?i[p?'width':'height']:0),e.placement=T(t),e.offsets.popper=g(i),e}},hide:{order:800,enabled:!0,fn:function(e){if(!K(e.instance.modifiers,'hide','preventOverflow'))return e;var t=e.offsets.reference,o=C(e.instance.modifiers,function(e){return'preventOverflow'===e.name}).boundaries;if(t.bottomo.right||t.top>o.bottom||t.rightwindow.devicePixelRatio||!me),c='bottom'===o?'top':'bottom',g='right'===n?'left':'right',b=H('transform');if(d='bottom'==c?'HTML'===l.nodeName?-l.clientHeight+h.bottom:-f.height+h.bottom:h.top,s='right'==g?'HTML'===l.nodeName?-l.clientWidth+h.right:-f.width+h.right:h.left,a&&b)m[b]='translate3d('+s+'px, '+d+'px, 0)',m[c]=0,m[g]=0,m.willChange='transform';else{var w='bottom'==c?-1:1,y='right'==g?-1:1;m[c]=d*w,m[g]=s*y,m.willChange=c+', '+g}var E={"x-placement":e.placement};return e.attributes=fe({},E,e.attributes),e.styles=fe({},m,e.styles),e.arrowStyles=fe({},e.offsets.arrow,e.arrowStyles),e},gpuAcceleration:!0,x:'bottom',y:'right'},applyStyle:{order:900,enabled:!0,fn:function(e){return j(e.instance.popper,e.styles),V(e.instance.popper,e.attributes),e.arrowElement&&Object.keys(e.arrowStyles).length&&j(e.arrowElement,e.arrowStyles),e},onLoad:function(e,t,o,n,i){var r=L(i,t,e,o.positionFixed),p=O(o.placement,r,t,e,o.modifiers.flip.boundariesElement,o.modifiers.flip.padding);return t.setAttribute('x-placement',p),j(t,{position:o.positionFixed?'fixed':'absolute'}),o},gpuAcceleration:void 0}}},ue}); -//# sourceMappingURL=popper.min.js.map diff --git a/vsc-extension-quickstart.md b/vsc-extension-quickstart.md new file mode 100644 index 00000000..f518bb84 --- /dev/null +++ b/vsc-extension-quickstart.md @@ -0,0 +1,48 @@ +# Welcome to your VS Code Extension + +## What's in the folder + +* This folder contains all of the files necessary for your extension. +* `package.json` - this is the manifest file in which you declare your extension and command. + * The sample plugin registers a command and defines its title and command name. With this information VS Code can show the command in the command palette. It doesn’t yet need to load the plugin. +* `src/extension.ts` - this is the main file where you will provide the implementation of your command. + * The file exports one function, `activate`, which is called the very first time your extension is activated (in this case by executing the command). Inside the `activate` function we call `registerCommand`. + * We pass the function containing the implementation of the command as the second parameter to `registerCommand`. + +## Setup + +* install the recommended extensions (amodio.tsl-problem-matcher, ms-vscode.extension-test-runner, and dbaeumer.vscode-eslint) + + +## Get up and running straight away + +* Press `F5` to open a new window with your extension loaded. +* Run your command from the command palette by pressing (`Ctrl+Shift+P` or `Cmd+Shift+P` on Mac) and typing `Hello World`. +* Set breakpoints in your code inside `src/extension.ts` to debug your extension. +* Find output from your extension in the debug console. + +## Make changes + +* You can relaunch the extension from the debug toolbar after changing code in `src/extension.ts`. +* You can also reload (`Ctrl+R` or `Cmd+R` on Mac) the VS Code window with your extension to load your changes. + + +## Explore the API + +* You can open the full set of our API when you open the file `node_modules/@types/vscode/index.d.ts`. + +## Run tests + +* Install the [Extension Test Runner](https://marketplace.visualstudio.com/items?itemName=ms-vscode.extension-test-runner) +* Run the "watch" task via the **Tasks: Run Task** command. Make sure this is running, or tests might not be discovered. +* Open the Testing view from the activity bar and click the Run Test" button, or use the hotkey `Ctrl/Cmd + ; A` +* See the output of the test result in the Test Results view. +* Make changes to `src/test/extension.test.ts` or create new test files inside the `test` folder. + * The provided test runner will only consider files matching the name pattern `**.test.ts`. + * You can create folders inside the `test` folder to structure your tests any way you want. + +## Go further + +* Reduce the extension size and improve the startup time by [bundling your extension](https://code.visualstudio.com/api/working-with-extensions/bundling-extension). +* [Publish your extension](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) on the VS Code extension marketplace. +* Automate builds by setting up [Continuous Integration](https://code.visualstudio.com/api/working-with-extensions/continuous-integration). diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 00000000..37d7024f --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,48 @@ +//@ts-check + +'use strict'; + +const path = require('path'); + +//@ts-check +/** @typedef {import('webpack').Configuration} WebpackConfig **/ + +/** @type WebpackConfig */ +const extensionConfig = { + target: 'node', // VS Code extensions run in a Node.js-context 📖 -> https://webpack.js.org/configuration/node/ + mode: 'none', // this leaves the source code as close as possible to the original (when packaging we set this to 'production') + + entry: './src/extension.ts', // the entry point of this extension, 📖 -> https://webpack.js.org/configuration/entry-context/ + output: { + // the bundle is stored in the 'dist' folder (check package.json), 📖 -> https://webpack.js.org/configuration/output/ + path: path.resolve(__dirname, 'dist'), + filename: 'extension.js', + libraryTarget: 'commonjs2' + }, + externals: { + vscode: 'commonjs vscode' // the vscode-module is created on-the-fly and must be excluded. Add other modules that cannot be webpack'ed, 📖 -> https://webpack.js.org/configuration/externals/ + // modules added here also need to be added in the .vscodeignore file + }, + resolve: { + // support reading TypeScript and JavaScript files, 📖 -> https://github.com/TypeStrong/ts-loader + extensions: ['.ts', '.js'] + }, + module: { + rules: [ + { + test: /\.ts$/, + exclude: /node_modules/, + use: [ + { + loader: 'ts-loader' + } + ] + } + ] + }, + devtool: 'nosources-source-map', + infrastructureLogging: { + level: "log", // enables logging required for problem matchers + }, +}; +module.exports = [ extensionConfig ]; \ No newline at end of file From 27c43ec7601bfe42bcbfef1be85f2b72ad1adf6a Mon Sep 17 00:00:00 2001 From: Ali Arshad Date: Fri, 6 Dec 2024 23:12:01 +0500 Subject: [PATCH 2/6] Basic started to work --- .vscode/launch.json | 26 +++++----- dist/extension.js | 110 ++++++++++++++++++++++++++++++++++++++++++ dist/extension.js.map | 1 + package.json | 4 ++ 4 files changed, 126 insertions(+), 15 deletions(-) create mode 100644 dist/extension.js create mode 100644 dist/extension.js.map diff --git a/.vscode/launch.json b/.vscode/launch.json index c42edc04..ccdb134d 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -3,19 +3,15 @@ // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 { - "version": "0.2.0", - "configurations": [ - { - "name": "Run Extension", - "type": "extensionHost", - "request": "launch", - "args": [ - "--extensionDevelopmentPath=${workspaceFolder}" - ], - "outFiles": [ - "${workspaceFolder}/dist/**/*.js" - ], - "preLaunchTask": "${defaultBuildTask}" - } - ] + "version": "0.2.0", + "configurations": [ + { + "name": "Run Extension", + "type": "extensionHost", + "request": "launch", + "args": ["--extensionDevelopmentPath=${workspaceFolder}"], + "outFiles": ["${workspaceFolder}/dist/**/*.js"], + "preLaunchTask": "${defaultBuildTask}" + } + ] } diff --git a/dist/extension.js b/dist/extension.js new file mode 100644 index 00000000..3b824143 --- /dev/null +++ b/dist/extension.js @@ -0,0 +1,110 @@ +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ([ +/* 0 */ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.activate = activate; +exports.deactivate = deactivate; +// The module 'vscode' contains the VS Code extensibility API +// Import the module and reference it with the alias vscode in your code below +const vscode = __importStar(__webpack_require__(1)); +// This method is called when your extension is activated +// Your extension is activated the very first time the command is executed +function activate(context) { + // Use the console to output diagnostic information (console.log) and errors (console.error) + // This line of code will only be executed once when your extension is activated + console.log('Congratulations, your extension "code-settings-sync" is now active!'); + // The command has been defined in the package.json file + // Now provide the implementation of the command with registerCommand + // The commandId parameter must match the command field in package.json + const disposable = vscode.commands.registerCommand('code-settings-sync.helloWorld', () => { + // The code you place here will be executed every time your command is executed + // Display a message box to the user + vscode.window.showInformationMessage('Hello World from code-settings-sync!'); + }); + context.subscriptions.push(disposable); +} +// This method is called when your extension is deactivated +function deactivate() { } + + +/***/ }), +/* 1 */ +/***/ ((module) => { + +module.exports = require("vscode"); + +/***/ }) +/******/ ]); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ +/******/ // startup +/******/ // Load entry module and return exports +/******/ // This entry module is referenced by other modules so it can't be inlined +/******/ var __webpack_exports__ = __webpack_require__(0); +/******/ module.exports = __webpack_exports__; +/******/ +/******/ })() +; +//# sourceMappingURL=extension.js.map \ No newline at end of file diff --git a/dist/extension.js.map b/dist/extension.js.map new file mode 100644 index 00000000..dd4265cc --- /dev/null +++ b/dist/extension.js.map @@ -0,0 +1 @@ +{"version":3,"file":"extension.js","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,4BAgBC;AAGD,gCAA+B;AAzB/B,6DAA6D;AAC7D,8EAA8E;AAC9E,oDAAiC;AAEjC,yDAAyD;AACzD,0EAA0E;AAC1E,SAAgB,QAAQ,CAAC,OAAgC;IAExD,4FAA4F;IAC5F,gFAAgF;IAChF,OAAO,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;IAEnF,wDAAwD;IACxD,qEAAqE;IACrE,uEAAuE;IACvE,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACxF,+EAA+E;QAC/E,oCAAoC;QACpC,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,sCAAsC,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACxC,CAAC;AAED,2DAA2D;AAC3D,SAAgB,UAAU,KAAI,CAAC;;;;;;;ACzB/B;;;;;UCAA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;UEtBA;UACA;UACA;UACA","sources":["webpack://code-settings-sync/./src/extension.ts","webpack://code-settings-sync/external commonjs \"vscode\"","webpack://code-settings-sync/webpack/bootstrap","webpack://code-settings-sync/webpack/before-startup","webpack://code-settings-sync/webpack/startup","webpack://code-settings-sync/webpack/after-startup"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/package.json b/package.json index 1a9e79bd..060c5fd0 100644 --- a/package.json +++ b/package.json @@ -73,6 +73,10 @@ "main": "./dist/extension.js", "contributes": { "commands": [ + { + "command": "code-settings-sync.helloWorld", + "title": "Hello World" + }, { "command": "extension.HowSettings", "title": "%cmd.howSetting.title%" From 97196b073ccfd296094121a749bb4a048d118754 Mon Sep 17 00:00:00 2001 From: Ali Arshad Date: Fri, 6 Dec 2024 23:34:23 +0500 Subject: [PATCH 3/6] packages upgraded --- dist/1.extension.js | 453 + dist/1.extension.js.map | 1 + dist/extension.js | 91821 +++++++++++++++- dist/extension.js.map | 2 +- package.json | 42 +- src/commons.ts | 531 + src/enums.ts | 13 + src/environmentPath.ts | 196 + src/extension.ts | 53 +- src/localize.ts | 86 + src/lockfile.ts | 34 + src/models/cloudSettings.model.ts | 6 + src/models/customConfig.model.ts | 33 + src/models/extensionConfig.model.ts | 10 + src/models/language-pack.model.ts | 3 + src/models/localConfig.model.ts | 10 + src/models/settingType.model.ts | 6 + src/models/state.model.ts | 10 + src/models/webview.model.ts | 9 + src/pragmaUtil.ts | 291 + src/service/autoUpload.service.ts | 99 + src/service/file.service.ts | 240 + src/service/github.oauth.service.ts | 136 + src/service/github.service.ts | 203 + src/service/plugin.service.ts | 243 + src/service/webview.service.ts | 479 + src/state.ts | 5 + src/sync.ts | 1145 + src/test/extension.test.ts | 16 +- src/test/index.ts | 8 + src/test/pragmaUtil/index.ts | 105 + src/test/pragmaUtil/testSettings.txt | 35 + src/test/service/fileService/dummyrc | 3 + .../service/fileService/fileService.test.ts | 36 + src/ui/gist-selection/gist-selection.html | 95 + src/ui/gist-selection/gist-selection.js | 89 + src/ui/landing-page/landing-page.html | 178 + src/ui/landing-page/landing-page.js | 40 + src/ui/settings/settings.html | 68 + src/ui/settings/settings.js | 269 + src/ui/shared/fonts.js | 19 + src/ui/shared/page-header.js | 18 + src/ui/shared/styles.css | 199 + .../vendor/bootstrap/css/bootstrap.min.css | 7 + .../vendor/bootstrap/js/bootstrap.min.js | 7 + .../fontawesome/css/fontawesome.min.css | 5 + .../vendor/fontawesome/css/solid.min.css | 5 + .../fontawesome/webfonts/fa-solid-900.ttf | Bin 0 -> 191832 bytes src/ui/shared/vendor/google/OpenSans-Bold.ttf | Bin 0 -> 103616 bytes src/ui/shared/vendor/google/Roboto-Bold.ttf | Bin 0 -> 170064 bytes .../shared/vendor/google/Roboto-Regular.ttf | Bin 0 -> 170984 bytes .../vendor/jquery/jquery-3.3.1.slim.min.js | 2 + src/ui/shared/vendor/lodash/lodash.min.js | 137 + src/ui/shared/vendor/popper.js/popper.min.js | 5 + src/util.ts | 31 + webpack.config.js | 36 +- 56 files changed, 97504 insertions(+), 69 deletions(-) create mode 100644 dist/1.extension.js create mode 100644 dist/1.extension.js.map create mode 100644 src/commons.ts create mode 100644 src/enums.ts create mode 100644 src/environmentPath.ts create mode 100644 src/localize.ts create mode 100644 src/lockfile.ts create mode 100644 src/models/cloudSettings.model.ts create mode 100644 src/models/customConfig.model.ts create mode 100644 src/models/extensionConfig.model.ts create mode 100644 src/models/language-pack.model.ts create mode 100644 src/models/localConfig.model.ts create mode 100644 src/models/settingType.model.ts create mode 100644 src/models/state.model.ts create mode 100644 src/models/webview.model.ts create mode 100644 src/pragmaUtil.ts create mode 100644 src/service/autoUpload.service.ts create mode 100644 src/service/file.service.ts create mode 100644 src/service/github.oauth.service.ts create mode 100644 src/service/github.service.ts create mode 100644 src/service/plugin.service.ts create mode 100644 src/service/webview.service.ts create mode 100644 src/state.ts create mode 100644 src/sync.ts create mode 100644 src/test/index.ts create mode 100644 src/test/pragmaUtil/index.ts create mode 100644 src/test/pragmaUtil/testSettings.txt create mode 100644 src/test/service/fileService/dummyrc create mode 100644 src/test/service/fileService/fileService.test.ts create mode 100644 src/ui/gist-selection/gist-selection.html create mode 100644 src/ui/gist-selection/gist-selection.js create mode 100644 src/ui/landing-page/landing-page.html create mode 100644 src/ui/landing-page/landing-page.js create mode 100644 src/ui/settings/settings.html create mode 100644 src/ui/settings/settings.js create mode 100644 src/ui/shared/fonts.js create mode 100644 src/ui/shared/page-header.js create mode 100644 src/ui/shared/styles.css create mode 100644 src/ui/shared/vendor/bootstrap/css/bootstrap.min.css create mode 100644 src/ui/shared/vendor/bootstrap/js/bootstrap.min.js create mode 100644 src/ui/shared/vendor/fontawesome/css/fontawesome.min.css create mode 100644 src/ui/shared/vendor/fontawesome/css/solid.min.css create mode 100644 src/ui/shared/vendor/fontawesome/webfonts/fa-solid-900.ttf create mode 100644 src/ui/shared/vendor/google/OpenSans-Bold.ttf create mode 100644 src/ui/shared/vendor/google/Roboto-Bold.ttf create mode 100644 src/ui/shared/vendor/google/Roboto-Regular.ttf create mode 100644 src/ui/shared/vendor/jquery/jquery-3.3.1.slim.min.js create mode 100644 src/ui/shared/vendor/lodash/lodash.min.js create mode 100644 src/ui/shared/vendor/popper.js/popper.min.js create mode 100644 src/util.ts diff --git a/dist/1.extension.js b/dist/1.extension.js new file mode 100644 index 00000000..0cb4ba00 --- /dev/null +++ b/dist/1.extension.js @@ -0,0 +1,453 @@ +"use strict"; +exports.id = 1; +exports.ids = [1]; +exports.modules = { + +/***/ 487: +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ toFormData: () => (/* binding */ toFormData) +/* harmony export */ }); +/* harmony import */ var fetch_blob_from_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(444); +/* harmony import */ var formdata_polyfill_esm_min_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(430); + + + +let s = 0; +const S = { + START_BOUNDARY: s++, + HEADER_FIELD_START: s++, + HEADER_FIELD: s++, + HEADER_VALUE_START: s++, + HEADER_VALUE: s++, + HEADER_VALUE_ALMOST_DONE: s++, + HEADERS_ALMOST_DONE: s++, + PART_DATA_START: s++, + PART_DATA: s++, + END: s++ +}; + +let f = 1; +const F = { + PART_BOUNDARY: f, + LAST_BOUNDARY: f *= 2 +}; + +const LF = 10; +const CR = 13; +const SPACE = 32; +const HYPHEN = 45; +const COLON = 58; +const A = 97; +const Z = 122; + +const lower = c => c | 0x20; + +const noop = () => {}; + +class MultipartParser { + /** + * @param {string} boundary + */ + constructor(boundary) { + this.index = 0; + this.flags = 0; + + this.onHeaderEnd = noop; + this.onHeaderField = noop; + this.onHeadersEnd = noop; + this.onHeaderValue = noop; + this.onPartBegin = noop; + this.onPartData = noop; + this.onPartEnd = noop; + + this.boundaryChars = {}; + + boundary = '\r\n--' + boundary; + const ui8a = new Uint8Array(boundary.length); + for (let i = 0; i < boundary.length; i++) { + ui8a[i] = boundary.charCodeAt(i); + this.boundaryChars[ui8a[i]] = true; + } + + this.boundary = ui8a; + this.lookbehind = new Uint8Array(this.boundary.length + 8); + this.state = S.START_BOUNDARY; + } + + /** + * @param {Uint8Array} data + */ + write(data) { + let i = 0; + const length_ = data.length; + let previousIndex = this.index; + let {lookbehind, boundary, boundaryChars, index, state, flags} = this; + const boundaryLength = this.boundary.length; + const boundaryEnd = boundaryLength - 1; + const bufferLength = data.length; + let c; + let cl; + + const mark = name => { + this[name + 'Mark'] = i; + }; + + const clear = name => { + delete this[name + 'Mark']; + }; + + const callback = (callbackSymbol, start, end, ui8a) => { + if (start === undefined || start !== end) { + this[callbackSymbol](ui8a && ui8a.subarray(start, end)); + } + }; + + const dataCallback = (name, clear) => { + const markSymbol = name + 'Mark'; + if (!(markSymbol in this)) { + return; + } + + if (clear) { + callback(name, this[markSymbol], i, data); + delete this[markSymbol]; + } else { + callback(name, this[markSymbol], data.length, data); + this[markSymbol] = 0; + } + }; + + for (i = 0; i < length_; i++) { + c = data[i]; + + switch (state) { + case S.START_BOUNDARY: + if (index === boundary.length - 2) { + if (c === HYPHEN) { + flags |= F.LAST_BOUNDARY; + } else if (c !== CR) { + return; + } + + index++; + break; + } else if (index - 1 === boundary.length - 2) { + if (flags & F.LAST_BOUNDARY && c === HYPHEN) { + state = S.END; + flags = 0; + } else if (!(flags & F.LAST_BOUNDARY) && c === LF) { + index = 0; + callback('onPartBegin'); + state = S.HEADER_FIELD_START; + } else { + return; + } + + break; + } + + if (c !== boundary[index + 2]) { + index = -2; + } + + if (c === boundary[index + 2]) { + index++; + } + + break; + case S.HEADER_FIELD_START: + state = S.HEADER_FIELD; + mark('onHeaderField'); + index = 0; + // falls through + case S.HEADER_FIELD: + if (c === CR) { + clear('onHeaderField'); + state = S.HEADERS_ALMOST_DONE; + break; + } + + index++; + if (c === HYPHEN) { + break; + } + + if (c === COLON) { + if (index === 1) { + // empty header field + return; + } + + dataCallback('onHeaderField', true); + state = S.HEADER_VALUE_START; + break; + } + + cl = lower(c); + if (cl < A || cl > Z) { + return; + } + + break; + case S.HEADER_VALUE_START: + if (c === SPACE) { + break; + } + + mark('onHeaderValue'); + state = S.HEADER_VALUE; + // falls through + case S.HEADER_VALUE: + if (c === CR) { + dataCallback('onHeaderValue', true); + callback('onHeaderEnd'); + state = S.HEADER_VALUE_ALMOST_DONE; + } + + break; + case S.HEADER_VALUE_ALMOST_DONE: + if (c !== LF) { + return; + } + + state = S.HEADER_FIELD_START; + break; + case S.HEADERS_ALMOST_DONE: + if (c !== LF) { + return; + } + + callback('onHeadersEnd'); + state = S.PART_DATA_START; + break; + case S.PART_DATA_START: + state = S.PART_DATA; + mark('onPartData'); + // falls through + case S.PART_DATA: + previousIndex = index; + + if (index === 0) { + // boyer-moore derrived algorithm to safely skip non-boundary data + i += boundaryEnd; + while (i < bufferLength && !(data[i] in boundaryChars)) { + i += boundaryLength; + } + + i -= boundaryEnd; + c = data[i]; + } + + if (index < boundary.length) { + if (boundary[index] === c) { + if (index === 0) { + dataCallback('onPartData', true); + } + + index++; + } else { + index = 0; + } + } else if (index === boundary.length) { + index++; + if (c === CR) { + // CR = part boundary + flags |= F.PART_BOUNDARY; + } else if (c === HYPHEN) { + // HYPHEN = end boundary + flags |= F.LAST_BOUNDARY; + } else { + index = 0; + } + } else if (index - 1 === boundary.length) { + if (flags & F.PART_BOUNDARY) { + index = 0; + if (c === LF) { + // unset the PART_BOUNDARY flag + flags &= ~F.PART_BOUNDARY; + callback('onPartEnd'); + callback('onPartBegin'); + state = S.HEADER_FIELD_START; + break; + } + } else if (flags & F.LAST_BOUNDARY) { + if (c === HYPHEN) { + callback('onPartEnd'); + state = S.END; + flags = 0; + } else { + index = 0; + } + } else { + index = 0; + } + } + + if (index > 0) { + // when matching a possible boundary, keep a lookbehind reference + // in case it turns out to be a false lead + lookbehind[index - 1] = c; + } else if (previousIndex > 0) { + // if our boundary turned out to be rubbish, the captured lookbehind + // belongs to partData + const _lookbehind = new Uint8Array(lookbehind.buffer, lookbehind.byteOffset, lookbehind.byteLength); + callback('onPartData', 0, previousIndex, _lookbehind); + previousIndex = 0; + mark('onPartData'); + + // reconsider the current character even so it interrupted the sequence + // it could be the beginning of a new sequence + i--; + } + + break; + case S.END: + break; + default: + throw new Error(`Unexpected state entered: ${state}`); + } + } + + dataCallback('onHeaderField'); + dataCallback('onHeaderValue'); + dataCallback('onPartData'); + + // Update properties for the next call + this.index = index; + this.state = state; + this.flags = flags; + } + + end() { + if ((this.state === S.HEADER_FIELD_START && this.index === 0) || + (this.state === S.PART_DATA && this.index === this.boundary.length)) { + this.onPartEnd(); + } else if (this.state !== S.END) { + throw new Error('MultipartParser.end(): stream ended unexpectedly'); + } + } +} + +function _fileName(headerValue) { + // matches either a quoted-string or a token (RFC 2616 section 19.5.1) + const m = headerValue.match(/\bfilename=("(.*?)"|([^()<>@,;:\\"/[\]?={}\s\t]+))($|;\s)/i); + if (!m) { + return; + } + + const match = m[2] || m[3] || ''; + let filename = match.slice(match.lastIndexOf('\\') + 1); + filename = filename.replace(/%22/g, '"'); + filename = filename.replace(/&#(\d{4});/g, (m, code) => { + return String.fromCharCode(code); + }); + return filename; +} + +async function toFormData(Body, ct) { + if (!/multipart/i.test(ct)) { + throw new TypeError('Failed to fetch'); + } + + const m = ct.match(/boundary=(?:"([^"]+)"|([^;]+))/i); + + if (!m) { + throw new TypeError('no or bad content-type header, no multipart boundary'); + } + + const parser = new MultipartParser(m[1] || m[2]); + + let headerField; + let headerValue; + let entryValue; + let entryName; + let contentType; + let filename; + const entryChunks = []; + const formData = new formdata_polyfill_esm_min_js__WEBPACK_IMPORTED_MODULE_1__.FormData(); + + const onPartData = ui8a => { + entryValue += decoder.decode(ui8a, {stream: true}); + }; + + const appendToFile = ui8a => { + entryChunks.push(ui8a); + }; + + const appendFileToFormData = () => { + const file = new fetch_blob_from_js__WEBPACK_IMPORTED_MODULE_0__.File(entryChunks, filename, {type: contentType}); + formData.append(entryName, file); + }; + + const appendEntryToFormData = () => { + formData.append(entryName, entryValue); + }; + + const decoder = new TextDecoder('utf-8'); + decoder.decode(); + + parser.onPartBegin = function () { + parser.onPartData = onPartData; + parser.onPartEnd = appendEntryToFormData; + + headerField = ''; + headerValue = ''; + entryValue = ''; + entryName = ''; + contentType = ''; + filename = null; + entryChunks.length = 0; + }; + + parser.onHeaderField = function (ui8a) { + headerField += decoder.decode(ui8a, {stream: true}); + }; + + parser.onHeaderValue = function (ui8a) { + headerValue += decoder.decode(ui8a, {stream: true}); + }; + + parser.onHeaderEnd = function () { + headerValue += decoder.decode(); + headerField = headerField.toLowerCase(); + + if (headerField === 'content-disposition') { + // matches either a quoted-string or a token (RFC 2616 section 19.5.1) + const m = headerValue.match(/\bname=("([^"]*)"|([^()<>@,;:\\"/[\]?={}\s\t]+))/i); + + if (m) { + entryName = m[2] || m[3] || ''; + } + + filename = _fileName(headerValue); + + if (filename) { + parser.onPartData = appendToFile; + parser.onPartEnd = appendFileToFormData; + } + } else if (headerField === 'content-type') { + contentType = headerValue; + } + + headerValue = ''; + headerField = ''; + }; + + for await (const chunk of Body) { + parser.write(chunk); + } + + parser.end(); + + return formData; +} + + +/***/ }) + +}; +; +//# sourceMappingURL=1.extension.js.map \ No newline at end of file diff --git a/dist/1.extension.js.map b/dist/1.extension.js.map new file mode 100644 index 00000000..33bd3857 --- /dev/null +++ b/dist/1.extension.js.map @@ -0,0 +1 @@ +{"version":3,"file":"1.extension.js","mappings":";;;;;;;;;;;;;;AAAwC;AACc;;AAEtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,YAAY,QAAQ;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,kBAAkB,qBAAqB;AACvC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,YAAY,YAAY;AACxB;AACA;AACA;AACA;AACA;AACA,OAAO,0DAA0D;AACjE;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA,cAAc,aAAa;AAC3B;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,kDAAkD,MAAM;AACxD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA,4DAA4D,YAAY,YAAY;AACpF;AACA;AACA;;AAEA;AACA;AACA;AACA,oCAAoC,EAAE,EAAE;AACxC;AACA,EAAE;AACF;AACA;;AAEO;AACP;AACA;AACA;;AAEA,+CAA+C;;AAE/C;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,kEAAQ;;AAE9B;AACA,sCAAsC,aAAa;AACnD;;AAEA;AACA;AACA;;AAEA;AACA,mBAAmB,oDAAI,yBAAyB,kBAAkB;AAClE;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,uCAAuC,aAAa;AACpD;;AAEA;AACA,uCAAuC,aAAa;AACpD;;AAEA;AACA;AACA;;AAEA;AACA;AACA,4DAA4D,YAAY;;AAExE;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA","sources":["webpack://code-settings-sync/./node_modules/node-fetch/src/utils/multipart-parser.js"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/dist/extension.js b/dist/extension.js index 3b824143..28225661 100644 --- a/dist/extension.js +++ b/dist/extension.js @@ -1,9 +1,9 @@ /******/ (() => { // webpackBootstrap -/******/ "use strict"; /******/ var __webpack_modules__ = ([ /* 0 */ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; @@ -44,21 +44,23 @@ exports.deactivate = deactivate; // The module 'vscode' contains the VS Code extensibility API // Import the module and reference it with the alias vscode in your code below const vscode = __importStar(__webpack_require__(1)); +const environmentPath_1 = __webpack_require__(2); +const state_1 = __webpack_require__(5); +const sync_1 = __webpack_require__(6); // This method is called when your extension is activated // Your extension is activated the very first time the command is executed function activate(context) { - // Use the console to output diagnostic information (console.log) and errors (console.error) - // This line of code will only be executed once when your extension is activated - console.log('Congratulations, your extension "code-settings-sync" is now active!'); - // The command has been defined in the package.json file - // Now provide the implementation of the command with registerCommand - // The commandId parameter must match the command field in package.json - const disposable = vscode.commands.registerCommand('code-settings-sync.helloWorld', () => { - // The code you place here will be executed every time your command is executed - // Display a message box to the user - vscode.window.showInformationMessage('Hello World from code-settings-sync!'); - }); - context.subscriptions.push(disposable); + state_1.state.context = context; + state_1.state.environment = new environmentPath_1.Environment(); + const sync = new sync_1.Sync(); + sync.bootstrap(); + context.subscriptions.push(vscode.commands.registerCommand("extension.updateSettings", (optArgument) => { + sync.upload.bind(sync, optArgument)(); + })); + context.subscriptions.push(vscode.commands.registerCommand("extension.downloadSettings", sync.download.bind(sync))); + context.subscriptions.push(vscode.commands.registerCommand("extension.resetSettings", sync.reset.bind(sync))); + context.subscriptions.push(vscode.commands.registerCommand("extension.HowSettings", sync.how.bind(sync))); + context.subscriptions.push(vscode.commands.registerCommand("extension.otherOptions", sync.advance.bind(sync))); } // This method is called when your extension is deactivated function deactivate() { } @@ -68,8 +70,91689 @@ function deactivate() { } /* 1 */ /***/ ((module) => { +"use strict"; module.exports = require("vscode"); +/***/ }), +/* 2 */ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Environment = exports.SUPPORTED_OS = void 0; +exports.osTypeFromString = osTypeFromString; +const path_1 = __webpack_require__(3); +const vscode = __importStar(__webpack_require__(1)); +const enums_1 = __webpack_require__(4); +const state_1 = __webpack_require__(5); +exports.SUPPORTED_OS = Object.keys(enums_1.OsType) + .filter(k => !/\d/.test(k)) + .map(k => k.toLowerCase()); // . ["windows", "linux", "mac"]; +function osTypeFromString(osName) { + const capitalized = osName[0].toUpperCase() + osName.substr(1).toLowerCase(); + return enums_1.OsType[capitalized]; +} +class Environment { + static CURRENT_VERSION = 343; + static getVersion() { + return (Environment.CURRENT_VERSION.toString().slice(0, 1) + + "." + + Environment.CURRENT_VERSION.toString().slice(1, 2) + + "." + + Environment.CURRENT_VERSION.toString().slice(2, 3)); + } + // public isInsiders: boolean = false; + // public isOss: boolean = false; + // public isCoderCom: boolean = false; + // public homeDir: string | null = null; + isPortable = false; + USER_FOLDER = null; + CODE_BIN; + EXTENSION_FOLDER = null; + PATH = null; + OsType = null; + FILE_SETTING = null; + FILE_LAUNCH = null; + FILE_KEYBINDING = null; + FILE_LOCALE = null; + FILE_EXTENSION = null; + FILE_CLOUDSETTINGS = null; + FILE_SYNC_LOCK = null; + FILE_CUSTOMIZEDSETTINGS_NAME = "syncLocalSettings.json"; + FILE_CUSTOMIZEDSETTINGS = null; + FILE_SETTING_NAME = "settings.json"; + FILE_LAUNCH_NAME = "launch.json"; + FILE_KEYBINDING_NAME = "keybindings.json"; + FILE_KEYBINDING_MAC = "keybindingsMac.json"; + FILE_KEYBINDING_DEFAULT = "keybindings.json"; + FILE_EXTENSION_NAME = "extensions.json"; + FILE_LOCALE_NAME = "locale.json"; + FILE_SYNC_LOCK_NAME = "sync.lock"; + FILE_CLOUDSETTINGS_NAME = "cloudSettings"; + FOLDER_SNIPPETS = null; + constructor() { + state_1.state.context.globalState.update("_", undefined); // Make sure the global state folder exists. This is needed for using this.context.globalStoragePath to access user folder + this.isPortable = !!process.env.VSCODE_PORTABLE; + this.OsType = process.platform; + if (!this.isPortable) { + this.PATH = (0, path_1.resolve)(state_1.state.context.globalStoragePath, "../../..").concat((0, path_1.normalize)("/")); + this.USER_FOLDER = (0, path_1.resolve)(this.PATH, "User").concat((0, path_1.normalize)("/")); + this.EXTENSION_FOLDER = (0, path_1.resolve)(vscode.extensions.all.filter(extension => !extension.packageJSON.isBuiltin)[0].extensionPath, "..").concat((0, path_1.normalize)("/")); // Gets first non-builtin extension's path + } + else { + this.PATH = process.env.VSCODE_PORTABLE; + this.USER_FOLDER = (0, path_1.resolve)(this.PATH, "user-data/User").concat((0, path_1.normalize)("/")); + this.EXTENSION_FOLDER = (0, path_1.resolve)(this.PATH, "extensions").concat((0, path_1.normalize)("/")); + } + /* Start Legacy Code + + this.isInsiders = /insiders/.test(this.context.asAbsolutePath("")); + this.isOss = /\boss\b/.test(this.context.asAbsolutePath("")); + this.isCoderCom = + vscode.extensions.getExtension("coder.coder") !== undefined; + const isXdg = + !this.isInsiders && + !this.isCoderCom && + process.platform === "linux" && + !!process.env.XDG_DATA_HOME; + this.homeDir = isXdg + ? process.env.XDG_DATA_HOME + : process.env[process.platform === "win32" ? "USERPROFILE" : "HOME"]; + const configSuffix = `; $; {isXdg || this.isCoderCom ? "" : "."; }vscode$; { + this.isInsiders ? "-insiders" : this.isOss ? "-oss" : ""; + }`; + + if (!this.isPortable) { + if (process.platform === "darwin") { + this.PATH = process.env.HOME + "/Library/Application Support"; + this.OsType = OsType.Mac; + } else if (process.platform === "linux") { + if (!this.isCoderCom) { + this.PATH = + isXdg && !!process.env.XDG_CONFIG_HOME + ? process.env.XDG_CONFIG_HOME + : os.homedir() + "/.config"; + } else { + this.PATH = "/tmp"; + } + this.OsType = OsType.Linux; + } else if (process.platform === "win32") { + this.PATH = process.env.APPDATA; + this.OsType = OsType.Windows; + } else { + this.PATH = "/var/local"; + this.OsType = OsType.Linux; + } + } + + if (this.isPortable) { + this.PATH = process.env.VSCODE_PORTABLE; + if (process.platform === "darwin") { + this.OsType = OsType.Mac; + } else if (process.platform === "linux") { + this.OsType = OsType.Linux; + } else if (process.platform === "win32") { + this.OsType = OsType.Windows; + } else { + this.OsType = OsType.Linux; + } + } + + if (!this.isPortable) { + const possibleCodePaths = []; + if (this.isInsiders) { + possibleCodePaths.push("/Code - Insiders"); + } else if (this.isOss) { + possibleCodePaths.push("/Code - OSS"); + possibleCodePaths.push("/VSCodium"); + } else { + possibleCodePaths.push("/Code"); + } + for (const possibleCodePath of possibleCodePaths) { + try { + fs.statSync(this.PATH + possibleCodePath); + this.PATH = this.PATH + possibleCodePath; + break; + } catch (e) { + console.error("Error :" + possibleCodePath); + console.error(e); + } + } + this.ExtensionFolder = path.join( + this.homeDir, + configSuffix, + "extensions" + ); + this.USER_FOLDER = this.PATH.concat("/User/"); + } else { + this.USER_FOLDER = this.PATH.concat("/user-data/User/"); + this.ExtensionFolder = this.PATH.concat("/extensions/"); + } + + End Legacy Code */ + this.FILE_EXTENSION = this.USER_FOLDER.concat(this.FILE_EXTENSION_NAME); + this.FILE_SETTING = this.USER_FOLDER.concat(this.FILE_SETTING_NAME); + this.FILE_LAUNCH = this.USER_FOLDER.concat(this.FILE_LAUNCH_NAME); + this.FILE_KEYBINDING = this.USER_FOLDER.concat(this.FILE_KEYBINDING_NAME); + this.FILE_LOCALE = this.USER_FOLDER.concat(this.FILE_LOCALE_NAME); + this.FOLDER_SNIPPETS = this.USER_FOLDER.concat("/snippets/"); + this.FILE_CLOUDSETTINGS = this.USER_FOLDER.concat(this.FILE_CLOUDSETTINGS_NAME); + this.FILE_CUSTOMIZEDSETTINGS = this.USER_FOLDER.concat(this.FILE_CUSTOMIZEDSETTINGS_NAME); + this.FILE_SYNC_LOCK = this.USER_FOLDER.concat(this.FILE_SYNC_LOCK_NAME); + } +} +exports.Environment = Environment; + + +/***/ }), +/* 3 */ +/***/ ((module) => { + +"use strict"; +module.exports = require("path"); + +/***/ }), +/* 4 */ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SettingType = exports.OsType = void 0; +var OsType; +(function (OsType) { + OsType["Windows"] = "win32"; + OsType["Linux"] = "linux"; + OsType["Mac"] = "darwin"; +})(OsType || (exports.OsType = OsType = {})); +var SettingType; +(function (SettingType) { + SettingType[SettingType["Settings"] = 1] = "Settings"; + SettingType[SettingType["Launch"] = 2] = "Launch"; + SettingType[SettingType["KeyBindings"] = 3] = "KeyBindings"; + SettingType[SettingType["Locale"] = 4] = "Locale"; + SettingType[SettingType["Extensions"] = 5] = "Extensions"; +})(SettingType || (exports.SettingType = SettingType = {})); + + +/***/ }), +/* 5 */ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.state = void 0; +exports.state = { + instanceID: Math.random().toString() +}; + + +/***/ }), +/* 6 */ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Sync = void 0; +const fs = __importStar(__webpack_require__(7)); +const vscode = __importStar(__webpack_require__(1)); +const commons_1 = __importDefault(__webpack_require__(46)); +const enums_1 = __webpack_require__(4); +const localize_1 = __importDefault(__webpack_require__(47)); +const lockfile = __importStar(__webpack_require__(250)); +const cloudSettings_model_1 = __webpack_require__(449); +const customConfig_model_1 = __webpack_require__(48); +const extensionConfig_model_1 = __webpack_require__(49); +const localConfig_model_1 = __webpack_require__(50); +const pragmaUtil_1 = __importDefault(__webpack_require__(450)); +const file_service_1 = __webpack_require__(255); +const github_service_1 = __webpack_require__(451); +const plugin_service_1 = __webpack_require__(486); +const state_1 = __webpack_require__(5); +class Sync { + /** + * Run when extension have been activated + */ + async bootstrap() { + state_1.state.commons = new commons_1.default(); + await state_1.state.commons.StartMigrationProcess(); + const startUpSetting = await state_1.state.commons.GetSettings(); + const startUpCustomSetting = await state_1.state.commons.GetCustomSettings(); + if (startUpSetting) { + const tokenAvailable = startUpCustomSetting.token != null && startUpCustomSetting.token !== ""; + const gistAvailable = startUpSetting.gist != null && startUpSetting.gist !== ""; + if (!startUpCustomSetting.downloadPublicGist && !tokenAvailable) { + if (state_1.state.commons.webviewService.IsLandingPageEnabled()) { + state_1.state.commons.webviewService.OpenLandingPage(); + return; + } + } + if (gistAvailable) { + if (startUpSetting.autoDownload) { + vscode.commands + .executeCommand("extension.downloadSettings") + .then(async () => { + if (startUpSetting.autoUpload && + tokenAvailable && + gistAvailable) { + await state_1.state.commons.HandleStartWatching(); + return; + } + }); + } + else { + if (startUpSetting.autoUpload && tokenAvailable && gistAvailable) { + await state_1.state.commons.HandleStartWatching(); + return; + } + } + } + } + } + /** + * Upload setting to github gist + */ + async upload(optArgument) { + // @ts-ignore + // const args = arguments; + let github = null; + const localConfig = await state_1.state.commons.InitalizeSettings(); + if (!localConfig.customConfig.token) { + state_1.state.commons.webviewService.OpenLandingPage("extension.updateSettings"); + return; + } + const allSettingFiles = []; + let uploadedExtensions = []; + const ignoredExtensions = []; + const dateNow = new Date(); + await state_1.state.commons.HandleStopWatching(); + try { + localConfig.publicGist = false; + if (optArgument && optArgument === "publicGIST") { + localConfig.publicGist = true; + } + github = new github_service_1.GitHubService(localConfig.customConfig.token, localConfig.customConfig.githubEnterpriseUrl); + await startGitProcess.call(this, localConfig.extConfig, localConfig.customConfig); + } + catch (error) { + commons_1.default.LogException(error, state_1.state.commons.ERROR_MESSAGE, true); + return; + } + async function startGitProcess(syncSetting, customSettings) { + vscode.window.setStatusBarMessage((0, localize_1.default)("cmd.updateSettings.info.uploading"), 2000); + if (customSettings.downloadPublicGist) { + if (customSettings.token == null || customSettings.token === "") { + vscode.window.showInformationMessage((0, localize_1.default)("cmd.updateSettings.warning.noToken")); + return; + } + } + vscode.window.setStatusBarMessage((0, localize_1.default)("cmd.updateSettings.info.readding"), 2000); + // var remoteList = ExtensionInformation.fromJSONList(file.content); + // var deletedList = PluginService.GetDeletedExtensions(uploadedExtensions); + if (syncSetting.syncExtensions) { + uploadedExtensions = plugin_service_1.PluginService.CreateExtensionList(); + if (customSettings.ignoreExtensions && + customSettings.ignoreExtensions.length > 0) { + uploadedExtensions = uploadedExtensions.filter(extension => { + if (customSettings.ignoreExtensions.includes(extension.name)) { + ignoredExtensions.push(extension); + return false; + } + return true; + }); + } + uploadedExtensions.sort((a, b) => a.name.localeCompare(b.name)); + const extensionFileName = state_1.state.environment.FILE_EXTENSION_NAME; + const extensionFilePath = state_1.state.environment.FILE_EXTENSION; + const extensionFileContent = JSON.stringify(uploadedExtensions, undefined, 2); + const extensionFile = new file_service_1.File(extensionFileName, extensionFileContent, extensionFilePath, extensionFileName); + allSettingFiles.push(extensionFile); + } + const contentFiles = await file_service_1.FileService.ListFiles(state_1.state.environment.USER_FOLDER, customSettings); + const customExist = await file_service_1.FileService.FileExists(state_1.state.environment.FILE_CUSTOMIZEDSETTINGS); + if (customExist) { + const customFileKeys = Object.keys(customSettings.customFiles); + if (customFileKeys.length > 0) { + for (const key of customFileKeys) { + const val = customSettings.customFiles[key]; + const customFile = await file_service_1.FileService.GetCustomFile(val, key); + if (customFile !== null) { + allSettingFiles.push(customFile); + } + } + } + } + else { + commons_1.default.LogException(null, state_1.state.commons.ERROR_MESSAGE, true); + return; + } + for (const snippetFile of contentFiles) { + if (snippetFile.fileName !== state_1.state.environment.FILE_KEYBINDING_MAC) { + if (snippetFile.content !== "") { + if (snippetFile.fileName === state_1.state.environment.FILE_KEYBINDING_NAME) { + snippetFile.gistName = + state_1.state.environment.OsType === enums_1.OsType.Mac && + !customSettings.universalKeybindings + ? state_1.state.environment.FILE_KEYBINDING_MAC + : state_1.state.environment.FILE_KEYBINDING_DEFAULT; + } + if (snippetFile.fileName === state_1.state.environment.FILE_SETTING_NAME || + snippetFile.fileName === state_1.state.environment.FILE_KEYBINDING_MAC || + snippetFile.fileName === state_1.state.environment.FILE_KEYBINDING_DEFAULT) { + try { + const parsedContent = await pragmaUtil_1.default.processBeforeUpload(snippetFile.content); + snippetFile.content = parsedContent; + } + catch (e) { + commons_1.default.LogException(null, e.message, true); + console.error(e); + return; + } + } + allSettingFiles.push(snippetFile); + } + } + } + const extProp = new cloudSettings_model_1.CloudSettings(); + extProp.lastUpload = dateNow; + const fileName = state_1.state.environment.FILE_CLOUDSETTINGS_NAME; + const fileContent = JSON.stringify(extProp); + const file = new file_service_1.File(fileName, fileContent, "", fileName); + allSettingFiles.push(file); + let completed = false; + let newGIST = false; + try { + if (syncSetting.gist == null || syncSetting.gist === "") { + if (customSettings.askGistDescription) { + customSettings.gistDescription = await state_1.state.commons.AskGistDescription(); + } + newGIST = true; + const gistID = await github.CreateEmptyGIST(localConfig.publicGist, customSettings.gistDescription); + if (gistID) { + syncSetting.gist = gistID; + vscode.window.setStatusBarMessage((0, localize_1.default)("cmd.updateSettings.info.newGistCreated"), 2000); + } + else { + vscode.window.showInformationMessage((0, localize_1.default)("cmd.updateSettings.error.newGistCreateFail")); + return; + } + } + let gistObj = await github.ReadGist(syncSetting.gist); + if (!gistObj) { + return; + } + if (gistObj.data.owner !== null) { + const gistOwnerName = gistObj.data.owner.login.trim(); + if (github.userName != null) { + const userName = github.userName.trim(); + if (gistOwnerName !== userName) { + commons_1.default.LogException(null, "Sync : You cant edit GIST for user : " + + gistObj.data.owner.login, true, () => { + console.log("Sync : Current User : " + "'" + userName + "'"); + console.log("Sync : Gist Owner User : " + "'" + gistOwnerName + "'"); + }); + return; + } + } + } + if (gistObj.data.public === true) { + localConfig.publicGist = true; + } + if (!allSettingFiles.some(fileToUpload => { + if (fileToUpload.gistName === "cloudSettings") { + return false; + } + if (!gistObj.data.files[fileToUpload.gistName]) { + return true; + } + if (gistObj.data.files[fileToUpload.gistName].content !== + fileToUpload.content) { + console.info(`Sync: file ${fileToUpload.gistName} has changed`); + return true; + } + })) { + // Gist files are the same as the local files. + if (!localConfig.extConfig.forceUpload) { + vscode.window.setStatusBarMessage((0, localize_1.default)("cmd.updateSettings.info.gotLatestVersion"), 5000); + // Exit early to avoid unneeded upload. + return; + } + // Fall through to upload code for forced upload case. + } + else { + // Gist files are different from the local files. + const gistNewer = await github.IsGistNewer(syncSetting.gist, customSettings.lastDownload); + if (!customSettings.lastDownload) { + // Unable to compare the last gist upload time with the + // last download time, so ask user to force upload. + const message = await vscode.window.showInformationMessage((0, localize_1.default)("common.prompt.gistForceUpload"), (0, localize_1.default)("common.button.yes"), (0, localize_1.default)("common.button.no")); + if (message !== (0, localize_1.default)("common.button.yes")) { + vscode.window.setStatusBarMessage((0, localize_1.default)("cmd.updateSettings.info.uploadCanceled"), 3000); + return; + } + // Fall through to upload code for one-time forced upload. + } + else if (gistNewer && !localConfig.extConfig.forceUpload) { + // Last local download is prior to the last gist upload, so + // the local settings may be out of date. + const message = await vscode.window.showInformationMessage((0, localize_1.default)("common.prompt.gistNewer"), (0, localize_1.default)("common.button.yes"), (0, localize_1.default)("common.button.no")); + if (message !== (0, localize_1.default)("common.button.yes")) { + vscode.window.setStatusBarMessage((0, localize_1.default)("cmd.updateSettings.info.uploadCanceled"), 3000); + return; + } + // Fall through to upload code for one-time forced upload. + } + // !gistNewer: Last local download is later or the same as last Gist upload, + // so OK to upload - fall through to upload code below. + } + vscode.window.setStatusBarMessage((0, localize_1.default)("cmd.updateSettings.info.uploadingFile"), 3000); + gistObj = github.UpdateGIST(gistObj, allSettingFiles); + completed = await github.SaveGIST(gistObj.data); + if (!completed) { + vscode.window.showErrorMessage((0, localize_1.default)("cmd.updateSettings.error.gistNotSave")); + return; + } + } + catch (err) { + commons_1.default.LogException(err, state_1.state.commons.ERROR_MESSAGE, true); + return; + } + if (completed) { + try { + customSettings.lastUpload = dateNow; + customSettings.lastDownload = dateNow; + await state_1.state.commons.SaveSettings(syncSetting); + await state_1.state.commons.SetCustomSettings(customSettings); + if (newGIST) { + vscode.window.showInformationMessage((0, localize_1.default)("cmd.updateSettings.info.uploadingDone", syncSetting.gist)); + } + if (optArgument && optArgument === "publicGIST") { + vscode.window.showInformationMessage((0, localize_1.default)("cmd.updateSettings.info.shareGist")); + } + if (!syncSetting.quietSync) { + state_1.state.commons.ShowSummaryOutput(true, allSettingFiles, null, uploadedExtensions, ignoredExtensions, localConfig); + vscode.window.setStatusBarMessage("").dispose(); + } + else { + vscode.window.setStatusBarMessage("").dispose(); + vscode.window.setStatusBarMessage((0, localize_1.default)("cmd.updateSettings.info.uploadingSuccess"), 5000); + } + if (syncSetting.autoUpload) { + await state_1.state.commons.HandleStartWatching(); + } + } + catch (err) { + commons_1.default.LogException(err, state_1.state.commons.ERROR_MESSAGE, true); + } + } + } + } + /** + * Download setting from github gist + */ + async download() { + const localSettings = await state_1.state.commons.InitalizeSettings(); + if (localSettings.customConfig.downloadPublicGist + ? !localSettings.extConfig.gist + : !localSettings.customConfig.token || !localSettings.extConfig.gist) { + state_1.state.commons.webviewService.OpenLandingPage("extension.downloadSettings"); + return; + } + await state_1.state.commons.HandleStopWatching(); + try { + await StartDownload(localSettings.extConfig, localSettings.customConfig); + } + catch (err) { + commons_1.default.LogException(err, state_1.state.commons.ERROR_MESSAGE, true); + return; + } + async function StartDownload(syncSetting, customSettings) { + const github = new github_service_1.GitHubService(customSettings.token, customSettings.githubEnterpriseUrl); + vscode.window.setStatusBarMessage("").dispose(); + vscode.window.setStatusBarMessage((0, localize_1.default)("cmd.downloadSettings.info.readdingOnline"), 2000); + const res = await github.ReadGist(syncSetting.gist); + if (!res) { + return; + } + let addedExtensions = []; + let deletedExtensions = []; + const ignoredExtensions = customSettings.ignoreExtensions || new Array(); + const updatedFiles = []; + const actionList = []; + if (res.data.public === true) { + localSettings.publicGist = true; + } + const keys = Object.keys(res.data.files); + if (keys.indexOf(state_1.state.environment.FILE_CLOUDSETTINGS_NAME) > -1) { + const cloudSettGist = JSON.parse(res.data.files[state_1.state.environment.FILE_CLOUDSETTINGS_NAME].content); + const cloudSett = Object.assign(new cloudSettings_model_1.CloudSettings(), cloudSettGist); + const lastUploadStr = customSettings.lastUpload + ? customSettings.lastUpload.toString() + : ""; + const lastDownloadStr = customSettings.lastDownload + ? customSettings.lastDownload.toString() + : ""; + let upToDate = false; + if (lastDownloadStr !== "") { + upToDate = + new Date(lastDownloadStr).getTime() === + new Date(cloudSett.lastUpload).getTime(); + } + if (lastUploadStr !== "") { + upToDate = + upToDate || + new Date(lastUploadStr).getTime() === + new Date(cloudSett.lastUpload).getTime(); + } + if (!syncSetting.forceDownload) { + if (upToDate) { + vscode.window.setStatusBarMessage("").dispose(); + vscode.window.setStatusBarMessage((0, localize_1.default)("cmd.downloadSettings.info.gotLatestVersion"), 5000); + return; + } + } + customSettings.lastDownload = cloudSett.lastUpload; + } + keys.forEach(gistName => { + if (res.data.files[gistName]) { + if (res.data.files[gistName].content) { + const prefix = file_service_1.FileService.CUSTOMIZED_SYNC_PREFIX; + if (gistName.indexOf(prefix) > -1) { + const fileName = gistName.split(prefix).join(""); // |customized_sync|.htmlhintrc => .htmlhintrc + if (!(fileName in customSettings.customFiles)) { + // syncLocalSettings.json > customFiles doesn't have key + return; + } + const f = new file_service_1.File(fileName, res.data.files[gistName].content, customSettings.customFiles[fileName], gistName); + updatedFiles.push(f); + } + else if (gistName.indexOf(".") > -1) { + if (customSettings.universalKeybindings) { + if (gistName === state_1.state.environment.FILE_KEYBINDING_MAC) { + return; + } + } + else { + if (state_1.state.environment.OsType === enums_1.OsType.Mac && + gistName === state_1.state.environment.FILE_KEYBINDING_DEFAULT) { + return; + } + if (state_1.state.environment.OsType !== enums_1.OsType.Mac && + gistName === state_1.state.environment.FILE_KEYBINDING_MAC) { + return; + } + } + const f = new file_service_1.File(gistName, res.data.files[gistName].content, null, gistName); + updatedFiles.push(f); + } + } + } + else { + console.log(gistName + " key in response is empty."); + } + }); + for (const file of updatedFiles) { + let writeFile = false; + let content = file.content; + if (content !== "") { + if (file.gistName === state_1.state.environment.FILE_EXTENSION_NAME) { + if (syncSetting.syncExtensions) { + if (syncSetting.removeExtensions) { + try { + deletedExtensions = await plugin_service_1.PluginService.DeleteExtensions(content, ignoredExtensions); + } + catch (err) { + vscode.window.showErrorMessage((0, localize_1.default)("cmd.downloadSettings.error.removeExtFail")); + throw new Error(err); + } + } + try { + if (!syncSetting.quietSync) { + commons_1.default.outputChannel = vscode.window.createOutputChannel("Code Settings Sync"); + commons_1.default.outputChannel.clear(); + commons_1.default.outputChannel.appendLine(`Realtime Extension Download Summary`); + commons_1.default.outputChannel.appendLine(`--------------------`); + commons_1.default.outputChannel.show(); + } + addedExtensions = await plugin_service_1.PluginService.InstallExtensions(content, ignoredExtensions, (message, dispose) => { + if (!syncSetting.quietSync) { + commons_1.default.outputChannel.appendLine(message); + } + else { + console.log(message); + if (dispose) { + vscode.window.setStatusBarMessage("Sync : " + message, 3000); + } + } + }); + } + catch (err) { + throw new Error(err); + } + } + } + else { + writeFile = true; + if (file.gistName === state_1.state.environment.FILE_KEYBINDING_DEFAULT || + file.gistName === state_1.state.environment.FILE_KEYBINDING_MAC) { + let test = ""; + state_1.state.environment.OsType === enums_1.OsType.Mac && + !customSettings.universalKeybindings + ? (test = state_1.state.environment.FILE_KEYBINDING_MAC) + : (test = state_1.state.environment.FILE_KEYBINDING_DEFAULT); + if (file.gistName !== test) { + writeFile = false; + } + } + if (writeFile) { + if (file.gistName === state_1.state.environment.FILE_KEYBINDING_MAC) { + file.fileName = state_1.state.environment.FILE_KEYBINDING_DEFAULT; + } + let filePath = ""; + if (file.filePath !== null) { + filePath = await file_service_1.FileService.CreateCustomDirTree(file.filePath); + } + else { + filePath = await file_service_1.FileService.CreateDirTree(state_1.state.environment.USER_FOLDER, file.fileName); + } + if (file.gistName === state_1.state.environment.FILE_SETTING_NAME || + file.gistName === state_1.state.environment.FILE_KEYBINDING_MAC || + file.gistName === state_1.state.environment.FILE_KEYBINDING_DEFAULT) { + const fileExists = await file_service_1.FileService.FileExists(filePath); + if (fileExists) { + const localContent = await file_service_1.FileService.ReadFile(filePath); + content = pragmaUtil_1.default.processBeforeWrite(localContent, content, state_1.state.environment.OsType, localSettings.customConfig.hostName); + } + } + actionList.push(file_service_1.FileService.WriteFile(filePath, content) + .then(() => { + // TODO : add Name attribute in File and show information message here with name , when required. + }) + .catch(err => { + commons_1.default.LogException(err, state_1.state.commons.ERROR_MESSAGE, true); + return; + })); + } + } + } + } + await Promise.all(actionList); + const settingsUpdated = await state_1.state.commons.SaveSettings(syncSetting); + const customSettingsUpdated = await state_1.state.commons.SetCustomSettings(customSettings); + if (settingsUpdated && customSettingsUpdated) { + if (!syncSetting.quietSync) { + state_1.state.commons.ShowSummaryOutput(false, updatedFiles, deletedExtensions, addedExtensions, null, localSettings); + if (deletedExtensions.length > 0 || addedExtensions.length > 0) { + const message = await vscode.window.showInformationMessage((0, localize_1.default)("common.prompt.restartCode"), "Yes"); + if (message === "Yes") { + vscode.commands.executeCommand("workbench.action.reloadWindow"); + } + } + vscode.window.setStatusBarMessage("").dispose(); + } + else { + vscode.window.setStatusBarMessage("").dispose(); + vscode.window.setStatusBarMessage((0, localize_1.default)("cmd.downloadSettings.info.downloaded"), 5000); + } + if (syncSetting.autoUpload) { + await state_1.state.commons.HandleStartWatching(); + } + } + else { + vscode.window.showErrorMessage((0, localize_1.default)("cmd.downloadSettings.error.unableSave")); + } + } + } + /** + * Reset the setting to Sync + */ + async reset() { + let extSettings = null; + let localSettings = null; + vscode.window.setStatusBarMessage((0, localize_1.default)("cmd.resetSettings.info.resetting"), 2000); + try { + extSettings = new extensionConfig_model_1.ExtensionConfig(); + localSettings = new customConfig_model_1.CustomConfig(); + await Promise.all([ + state_1.state.context.globalState.update("landingPage.dontShowThisAgain", false) + ]); + const [extSaved, customSaved, lockExist] = await Promise.all([ + state_1.state.commons.SaveSettings(extSettings), + state_1.state.commons.SetCustomSettings(localSettings), + file_service_1.FileService.FileExists(state_1.state.environment.FILE_SYNC_LOCK) + ]); + if (!lockExist) { + fs.closeSync(fs.openSync(state_1.state.environment.FILE_SYNC_LOCK, "w")); + } + // check is sync locking + if (await lockfile.Check(state_1.state.environment.FILE_SYNC_LOCK)) { + await lockfile.Unlock(state_1.state.environment.FILE_SYNC_LOCK); + } + if (extSaved && customSaved) { + vscode.window.showInformationMessage((0, localize_1.default)("cmd.resetSettings.info.settingClear")); + } + state_1.state.commons.webviewService.UpdateSettingsPage(localSettings, extSettings); + } + catch (err) { + commons_1.default.LogException(err, "Sync : Unable to clear settings. Error Logged on console. Please open an issue.", true); + } + } + async how() { + return vscode.commands.executeCommand("vscode.open", vscode.Uri.parse("http://shanalikhan.github.io/2015/12/15/Visual-Studio-Code-Sync-Settings.html")); + } + async advance() { + const setting = await state_1.state.commons.GetSettings(); + const customSettings = await state_1.state.commons.GetCustomSettings(); + if (customSettings == null) { + vscode.window + .showInformationMessage((0, localize_1.default)("cmd.otherOptions.triggerReset"), (0, localize_1.default)("common.button.yes")) + .then(val => { + if (val === (0, localize_1.default)("common.button.yes")) { + vscode.commands.executeCommand("extension.resetSettings"); + } + }); + } + const localSetting = new localConfig_model_1.LocalConfig(); + const tokenAvailable = customSettings.token != null && customSettings.token !== ""; + const gistAvailable = setting.gist != null && setting.gist !== ""; + const items = [ + "cmd.otherOptions.openSettingsPage", + "cmd.otherOptions.editLocalSetting", + "cmd.otherOptions.shareSetting", + "cmd.otherOptions.downloadSetting", + "cmd.otherOptions.toggleForceDownload", + "cmd.otherOptions.toggleForceUpload", + "cmd.otherOptions.toggleAutoUpload", + "cmd.otherOptions.toggleAutoDownload", + "cmd.otherOptions.toggleSummaryPage", + "cmd.otherOptions.customizedSync", + "cmd.otherOptions.downloadCustomFile", + "cmd.otherOptions.joinCommunity", + "cmd.otherOptions.openIssue", + "cmd.otherOptions.releaseNotes" + ].map(localize_1.default); + let selectedItem = 0; + let settingChanged = false; + const item = await vscode.window.showQuickPick(items); + // if not pick anyone, do nothing + if (!item) { + return; + } + const index = items.findIndex(v => v === item); + const handlerMap = [ + async () => { + state_1.state.commons.webviewService.OpenSettingsPage(customSettings, setting); + }, + async () => { + const file = vscode.Uri.file(state_1.state.environment.FILE_CUSTOMIZEDSETTINGS); + fs.openSync(file.fsPath, "r"); + const document = await vscode.workspace.openTextDocument(file); + await vscode.window.showTextDocument(document, vscode.ViewColumn.One, true); + }, + async () => { + // share public gist + const answer = await vscode.window.showInformationMessage((0, localize_1.default)("cmd.otherOptions.shareSetting.beforeConfirm"), "Yes"); + if (answer === "Yes") { + localSetting.publicGist = true; + settingChanged = true; + setting.gist = ""; + selectedItem = 1; + customSettings.downloadPublicGist = false; + await state_1.state.commons.SetCustomSettings(customSettings); + } + }, + async () => { + // Download Settings from Public GIST + selectedItem = 2; + customSettings.downloadPublicGist = true; + settingChanged = true; + await state_1.state.commons.SetCustomSettings(customSettings); + }, + async () => { + // toggle force download + selectedItem = 3; + settingChanged = true; + setting.forceDownload = !setting.forceDownload; + }, + async () => { + // toggle force upload + selectedItem = 4; + settingChanged = true; + setting.forceUpload = !setting.forceUpload; + }, + async () => { + // toggle auto upload + selectedItem = 5; + settingChanged = true; + setting.autoUpload = !setting.autoUpload; + }, + async () => { + // auto download on startup + selectedItem = 6; + settingChanged = true; + if (!setting) { + vscode.commands.executeCommand("extension.HowSettings"); + return; + } + if (!gistAvailable) { + vscode.commands.executeCommand("extension.HowSettings"); + return; + } + setting.autoDownload = !setting.autoDownload; + }, + async () => { + // page summary toggle + selectedItem = 7; + settingChanged = true; + if (!tokenAvailable || !gistAvailable) { + vscode.commands.executeCommand("extension.HowSettings"); + return; + } + setting.quietSync = !setting.quietSync; + }, + async () => { + // add customized sync file + const options = { + ignoreFocusOut: true, + placeHolder: (0, localize_1.default)("cmd.otherOptions.customizedSync.placeholder"), + prompt: (0, localize_1.default)("cmd.otherOptions.customizedSync.prompt") + }; + const input = await vscode.window.showInputBox(options); + if (input) { + const fileName = file_service_1.FileService.ExtractFileName(input); + if (fileName === "") { + return; + } + customSettings.customFiles[fileName] = input; + const done = await state_1.state.commons.SetCustomSettings(customSettings); + if (done) { + vscode.window.showInformationMessage((0, localize_1.default)("cmd.otherOptions.customizedSync.done", fileName)); + } + } + }, + async () => { + // Import customized sync file to workspace + const customFiles = await this.getCustomFilesFromGist(customSettings, setting); + if (customFiles.length < 1) { + return; + } + const options = { + ignoreFocusOut: true, + placeHolder: (0, localize_1.default)("cmd.otherOptions.downloadCustomFile.placeholder") + }; + const fileName = await vscode.window.showQuickPick(customFiles.map(file => { + return file.fileName; + }), options); + // if not pick anyone, do nothing + if (!fileName) { + return; + } + const selected = customFiles.find(f => { + return f.fileName === fileName; + }); + if (selected && vscode.workspace.rootPath) { + const downloadPath = file_service_1.FileService.ConcatPath(vscode.workspace.rootPath, selected.fileName); + const done = await file_service_1.FileService.WriteFile(downloadPath, selected.content); + if (done) { + vscode.window.showInformationMessage((0, localize_1.default)("cmd.otherOptions.downloadCustomFile.done", downloadPath)); + } + } + }, + async () => { + vscode.commands.executeCommand("vscode.open", vscode.Uri.parse("https://join.slack.com/t/codesettingssync/shared_invite/enQtNzQyODMzMzI5MDQ3LWNmZjVkZjE2YTg0MzY1Y2EyYzVmYThmNzg2YjZkNjhhZWY3ZTEzN2I3ZTAxMjkwNWU0ZjMyZGFhMjdiZDI3ODU")); + }, + async () => { + vscode.commands.executeCommand("vscode.open", vscode.Uri.parse("https://github.com/shanalikhan/code-settings-sync/issues/new")); + }, + async () => { + vscode.commands.executeCommand("vscode.open", vscode.Uri.parse("http://shanalikhan.github.io/2016/05/14/Visual-studio-code-sync-settings-release-notes.html")); + } + ]; + try { + await handlerMap[index](); + if (settingChanged) { + if (selectedItem === 1) { + await state_1.state.commons.HandleStopWatching(); + } + await state_1.state.commons + .SaveSettings(setting) + .then((added) => { + if (added) { + const callbackMap = { + 1: async () => { + return await vscode.commands.executeCommand("extension.updateSettings", "publicGIST"); + }, + 2: async () => { + return await vscode.window.showInformationMessage((0, localize_1.default)("cmd.otherOptions.warning.tokenNotRequire")); + }, + 3: async () => { + const message = setting.forceDownload + ? "cmd.otherOptions.toggleForceDownload.on" + : "cmd.otherOptions.toggleForceDownload.off"; + return vscode.window.showInformationMessage((0, localize_1.default)(message)); + }, + 4: async () => { + const message = setting.forceUpload + ? "cmd.otherOptions.toggleForceUpload.on" + : "cmd.otherOptions.toggleForceUpload.off"; + return vscode.window.showInformationMessage((0, localize_1.default)(message)); + }, + 5: async () => { + const message = setting.autoUpload + ? "cmd.otherOptions.toggleAutoUpload.on" + : "cmd.otherOptions.toggleAutoUpload.off"; + return vscode.window.showInformationMessage((0, localize_1.default)(message)); + }, + 6: async () => { + const message = setting.autoDownload + ? "cmd.otherOptions.toggleAutoDownload.on" + : "cmd.otherOptions.toggleAutoDownload.off"; + return vscode.window.showInformationMessage((0, localize_1.default)(message)); + }, + 7: async () => { + const message = setting.quietSync + ? "cmd.otherOptions.quietSync.on" + : "cmd.otherOptions.quietSync.off"; + return vscode.window.showInformationMessage((0, localize_1.default)(message)); + } + }; + if (callbackMap[selectedItem]) { + return callbackMap[selectedItem](); + } + } + else { + return vscode.window.showErrorMessage((0, localize_1.default)("cmd.otherOptions.error.toggleFail")); + } + }) + .catch(err => { + commons_1.default.LogException(err, "Sync : Unable to toggle. Please open an issue.", true); + }); + } + } + catch (err) { + commons_1.default.LogException(err, "Error", true); + return; + } + } + async getCustomFilesFromGist(customSettings, syncSetting) { + const github = new github_service_1.GitHubService(customSettings.token, customSettings.githubEnterpriseUrl); + const res = await github.ReadGist(syncSetting.gist); + if (!res) { + return []; + } + const keys = Object.keys(res.data.files); + const customFiles = []; + keys.forEach(gistName => { + if (res.data.files[gistName]) { + if (res.data.files[gistName].content) { + const prefix = file_service_1.FileService.CUSTOMIZED_SYNC_PREFIX; + if (gistName.indexOf(prefix) > -1) { + const fileName = gistName.split(prefix).join(""); // |customized_sync|.htmlhintrc => .htmlhintrc + const f = new file_service_1.File(fileName, res.data.files[gistName].content, fileName in customSettings.customFiles + ? customSettings.customFiles[fileName] + : null, gistName); + customFiles.push(f); + } + } + } + }); + return customFiles; + } +} +exports.Sync = Sync; + + +/***/ }), +/* 7 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +module.exports = { + // Export promiseified graceful-fs: + ...__webpack_require__(8), + // Export extra methods: + ...__webpack_require__(19), + ...__webpack_require__(28), + ...__webpack_require__(30), + ...__webpack_require__(36), + ...__webpack_require__(21), + ...__webpack_require__(43), + ...__webpack_require__(41), + ...__webpack_require__(24), + ...__webpack_require__(29) +} + + +/***/ }), +/* 8 */ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +// This is adapted from https://github.com/normalize/mz +// Copyright (c) 2014-2016 Jonathan Ong me@jongleberry.com and Contributors +const u = (__webpack_require__(9).fromCallback) +const fs = __webpack_require__(10) + +const api = [ + 'access', + 'appendFile', + 'chmod', + 'chown', + 'close', + 'copyFile', + 'fchmod', + 'fchown', + 'fdatasync', + 'fstat', + 'fsync', + 'ftruncate', + 'futimes', + 'lchmod', + 'lchown', + 'link', + 'lstat', + 'mkdir', + 'mkdtemp', + 'open', + 'opendir', + 'readdir', + 'readFile', + 'readlink', + 'realpath', + 'rename', + 'rm', + 'rmdir', + 'stat', + 'symlink', + 'truncate', + 'unlink', + 'utimes', + 'writeFile' +].filter(key => { + // Some commands are not available on some systems. Ex: + // fs.cp was added in Node.js v16.7.0 + // fs.lchown is not available on at least some Linux + return typeof fs[key] === 'function' +}) + +// Export cloned fs: +Object.assign(exports, fs) + +// Universalify async methods: +api.forEach(method => { + exports[method] = u(fs[method]) +}) + +// We differ from mz/fs in that we still ship the old, broken, fs.exists() +// since we are a drop-in replacement for the native module +exports.exists = function (filename, callback) { + if (typeof callback === 'function') { + return fs.exists(filename, callback) + } + return new Promise(resolve => { + return fs.exists(filename, resolve) + }) +} + +// fs.read(), fs.write(), fs.readv(), & fs.writev() need special treatment due to multiple callback args + +exports.read = function (fd, buffer, offset, length, position, callback) { + if (typeof callback === 'function') { + return fs.read(fd, buffer, offset, length, position, callback) + } + return new Promise((resolve, reject) => { + fs.read(fd, buffer, offset, length, position, (err, bytesRead, buffer) => { + if (err) return reject(err) + resolve({ bytesRead, buffer }) + }) + }) +} + +// Function signature can be +// fs.write(fd, buffer[, offset[, length[, position]]], callback) +// OR +// fs.write(fd, string[, position[, encoding]], callback) +// We need to handle both cases, so we use ...args +exports.write = function (fd, buffer, ...args) { + if (typeof args[args.length - 1] === 'function') { + return fs.write(fd, buffer, ...args) + } + + return new Promise((resolve, reject) => { + fs.write(fd, buffer, ...args, (err, bytesWritten, buffer) => { + if (err) return reject(err) + resolve({ bytesWritten, buffer }) + }) + }) +} + +// Function signature is +// s.readv(fd, buffers[, position], callback) +// We need to handle the optional arg, so we use ...args +exports.readv = function (fd, buffers, ...args) { + if (typeof args[args.length - 1] === 'function') { + return fs.readv(fd, buffers, ...args) + } + + return new Promise((resolve, reject) => { + fs.readv(fd, buffers, ...args, (err, bytesRead, buffers) => { + if (err) return reject(err) + resolve({ bytesRead, buffers }) + }) + }) +} + +// Function signature is +// s.writev(fd, buffers[, position], callback) +// We need to handle the optional arg, so we use ...args +exports.writev = function (fd, buffers, ...args) { + if (typeof args[args.length - 1] === 'function') { + return fs.writev(fd, buffers, ...args) + } + + return new Promise((resolve, reject) => { + fs.writev(fd, buffers, ...args, (err, bytesWritten, buffers) => { + if (err) return reject(err) + resolve({ bytesWritten, buffers }) + }) + }) +} + +// fs.realpath.native sometimes not available if fs is monkey-patched +if (typeof fs.realpath.native === 'function') { + exports.realpath.native = u(fs.realpath.native) +} else { + process.emitWarning( + 'fs.realpath.native is not a function. Is fs being monkey-patched?', + 'Warning', 'fs-extra-WARN0003' + ) +} + + +/***/ }), +/* 9 */ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +exports.fromCallback = function (fn) { + return Object.defineProperty(function (...args) { + if (typeof args[args.length - 1] === 'function') fn.apply(this, args) + else { + return new Promise((resolve, reject) => { + args.push((err, res) => (err != null) ? reject(err) : resolve(res)) + fn.apply(this, args) + }) + } + }, 'name', { value: fn.name }) +} + +exports.fromPromise = function (fn) { + return Object.defineProperty(function (...args) { + const cb = args[args.length - 1] + if (typeof cb !== 'function') return fn.apply(this, args) + else { + args.pop() + fn.apply(this, args).then(r => cb(null, r), cb) + } + }, 'name', { value: fn.name }) +} + + +/***/ }), +/* 10 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var fs = __webpack_require__(11) +var polyfills = __webpack_require__(12) +var legacy = __webpack_require__(14) +var clone = __webpack_require__(16) + +var util = __webpack_require__(17) + +/* istanbul ignore next - node 0.x polyfill */ +var gracefulQueue +var previousSymbol + +/* istanbul ignore else - node 0.x polyfill */ +if (typeof Symbol === 'function' && typeof Symbol.for === 'function') { + gracefulQueue = Symbol.for('graceful-fs.queue') + // This is used in testing by future versions + previousSymbol = Symbol.for('graceful-fs.previous') +} else { + gracefulQueue = '___graceful-fs.queue' + previousSymbol = '___graceful-fs.previous' +} + +function noop () {} + +function publishQueue(context, queue) { + Object.defineProperty(context, gracefulQueue, { + get: function() { + return queue + } + }) +} + +var debug = noop +if (util.debuglog) + debug = util.debuglog('gfs4') +else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) + debug = function() { + var m = util.format.apply(util, arguments) + m = 'GFS4: ' + m.split(/\n/).join('\nGFS4: ') + console.error(m) + } + +// Once time initialization +if (!fs[gracefulQueue]) { + // This queue can be shared by multiple loaded instances + var queue = global[gracefulQueue] || [] + publishQueue(fs, queue) + + // Patch fs.close/closeSync to shared queue version, because we need + // to retry() whenever a close happens *anywhere* in the program. + // This is essential when multiple graceful-fs instances are + // in play at the same time. + fs.close = (function (fs$close) { + function close (fd, cb) { + return fs$close.call(fs, fd, function (err) { + // This function uses the graceful-fs shared queue + if (!err) { + resetQueue() + } + + if (typeof cb === 'function') + cb.apply(this, arguments) + }) + } + + Object.defineProperty(close, previousSymbol, { + value: fs$close + }) + return close + })(fs.close) + + fs.closeSync = (function (fs$closeSync) { + function closeSync (fd) { + // This function uses the graceful-fs shared queue + fs$closeSync.apply(fs, arguments) + resetQueue() + } + + Object.defineProperty(closeSync, previousSymbol, { + value: fs$closeSync + }) + return closeSync + })(fs.closeSync) + + if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) { + process.on('exit', function() { + debug(fs[gracefulQueue]) + __webpack_require__(18).equal(fs[gracefulQueue].length, 0) + }) + } +} + +if (!global[gracefulQueue]) { + publishQueue(global, fs[gracefulQueue]); +} + +module.exports = patch(clone(fs)) +if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH && !fs.__patched) { + module.exports = patch(fs) + fs.__patched = true; +} + +function patch (fs) { + // Everything that references the open() function needs to be in here + polyfills(fs) + fs.gracefulify = patch + + fs.createReadStream = createReadStream + fs.createWriteStream = createWriteStream + var fs$readFile = fs.readFile + fs.readFile = readFile + function readFile (path, options, cb) { + if (typeof options === 'function') + cb = options, options = null + + return go$readFile(path, options, cb) + + function go$readFile (path, options, cb, startTime) { + return fs$readFile(path, options, function (err) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$readFile, [path, options, cb], err, startTime || Date.now(), Date.now()]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + } + }) + } + } + + var fs$writeFile = fs.writeFile + fs.writeFile = writeFile + function writeFile (path, data, options, cb) { + if (typeof options === 'function') + cb = options, options = null + + return go$writeFile(path, data, options, cb) + + function go$writeFile (path, data, options, cb, startTime) { + return fs$writeFile(path, data, options, function (err) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$writeFile, [path, data, options, cb], err, startTime || Date.now(), Date.now()]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + } + }) + } + } + + var fs$appendFile = fs.appendFile + if (fs$appendFile) + fs.appendFile = appendFile + function appendFile (path, data, options, cb) { + if (typeof options === 'function') + cb = options, options = null + + return go$appendFile(path, data, options, cb) + + function go$appendFile (path, data, options, cb, startTime) { + return fs$appendFile(path, data, options, function (err) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$appendFile, [path, data, options, cb], err, startTime || Date.now(), Date.now()]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + } + }) + } + } + + var fs$copyFile = fs.copyFile + if (fs$copyFile) + fs.copyFile = copyFile + function copyFile (src, dest, flags, cb) { + if (typeof flags === 'function') { + cb = flags + flags = 0 + } + return go$copyFile(src, dest, flags, cb) + + function go$copyFile (src, dest, flags, cb, startTime) { + return fs$copyFile(src, dest, flags, function (err) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$copyFile, [src, dest, flags, cb], err, startTime || Date.now(), Date.now()]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + } + }) + } + } + + var fs$readdir = fs.readdir + fs.readdir = readdir + var noReaddirOptionVersions = /^v[0-5]\./ + function readdir (path, options, cb) { + if (typeof options === 'function') + cb = options, options = null + + var go$readdir = noReaddirOptionVersions.test(process.version) + ? function go$readdir (path, options, cb, startTime) { + return fs$readdir(path, fs$readdirCallback( + path, options, cb, startTime + )) + } + : function go$readdir (path, options, cb, startTime) { + return fs$readdir(path, options, fs$readdirCallback( + path, options, cb, startTime + )) + } + + return go$readdir(path, options, cb) + + function fs$readdirCallback (path, options, cb, startTime) { + return function (err, files) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([ + go$readdir, + [path, options, cb], + err, + startTime || Date.now(), + Date.now() + ]) + else { + if (files && files.sort) + files.sort() + + if (typeof cb === 'function') + cb.call(this, err, files) + } + } + } + } + + if (process.version.substr(0, 4) === 'v0.8') { + var legStreams = legacy(fs) + ReadStream = legStreams.ReadStream + WriteStream = legStreams.WriteStream + } + + var fs$ReadStream = fs.ReadStream + if (fs$ReadStream) { + ReadStream.prototype = Object.create(fs$ReadStream.prototype) + ReadStream.prototype.open = ReadStream$open + } + + var fs$WriteStream = fs.WriteStream + if (fs$WriteStream) { + WriteStream.prototype = Object.create(fs$WriteStream.prototype) + WriteStream.prototype.open = WriteStream$open + } + + Object.defineProperty(fs, 'ReadStream', { + get: function () { + return ReadStream + }, + set: function (val) { + ReadStream = val + }, + enumerable: true, + configurable: true + }) + Object.defineProperty(fs, 'WriteStream', { + get: function () { + return WriteStream + }, + set: function (val) { + WriteStream = val + }, + enumerable: true, + configurable: true + }) + + // legacy names + var FileReadStream = ReadStream + Object.defineProperty(fs, 'FileReadStream', { + get: function () { + return FileReadStream + }, + set: function (val) { + FileReadStream = val + }, + enumerable: true, + configurable: true + }) + var FileWriteStream = WriteStream + Object.defineProperty(fs, 'FileWriteStream', { + get: function () { + return FileWriteStream + }, + set: function (val) { + FileWriteStream = val + }, + enumerable: true, + configurable: true + }) + + function ReadStream (path, options) { + if (this instanceof ReadStream) + return fs$ReadStream.apply(this, arguments), this + else + return ReadStream.apply(Object.create(ReadStream.prototype), arguments) + } + + function ReadStream$open () { + var that = this + open(that.path, that.flags, that.mode, function (err, fd) { + if (err) { + if (that.autoClose) + that.destroy() + + that.emit('error', err) + } else { + that.fd = fd + that.emit('open', fd) + that.read() + } + }) + } + + function WriteStream (path, options) { + if (this instanceof WriteStream) + return fs$WriteStream.apply(this, arguments), this + else + return WriteStream.apply(Object.create(WriteStream.prototype), arguments) + } + + function WriteStream$open () { + var that = this + open(that.path, that.flags, that.mode, function (err, fd) { + if (err) { + that.destroy() + that.emit('error', err) + } else { + that.fd = fd + that.emit('open', fd) + } + }) + } + + function createReadStream (path, options) { + return new fs.ReadStream(path, options) + } + + function createWriteStream (path, options) { + return new fs.WriteStream(path, options) + } + + var fs$open = fs.open + fs.open = open + function open (path, flags, mode, cb) { + if (typeof mode === 'function') + cb = mode, mode = null + + return go$open(path, flags, mode, cb) + + function go$open (path, flags, mode, cb, startTime) { + return fs$open(path, flags, mode, function (err, fd) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$open, [path, flags, mode, cb], err, startTime || Date.now(), Date.now()]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + } + }) + } + } + + return fs +} + +function enqueue (elem) { + debug('ENQUEUE', elem[0].name, elem[1]) + fs[gracefulQueue].push(elem) + retry() +} + +// keep track of the timeout between retry() calls +var retryTimer + +// reset the startTime and lastTime to now +// this resets the start of the 60 second overall timeout as well as the +// delay between attempts so that we'll retry these jobs sooner +function resetQueue () { + var now = Date.now() + for (var i = 0; i < fs[gracefulQueue].length; ++i) { + // entries that are only a length of 2 are from an older version, don't + // bother modifying those since they'll be retried anyway. + if (fs[gracefulQueue][i].length > 2) { + fs[gracefulQueue][i][3] = now // startTime + fs[gracefulQueue][i][4] = now // lastTime + } + } + // call retry to make sure we're actively processing the queue + retry() +} + +function retry () { + // clear the timer and remove it to help prevent unintended concurrency + clearTimeout(retryTimer) + retryTimer = undefined + + if (fs[gracefulQueue].length === 0) + return + + var elem = fs[gracefulQueue].shift() + var fn = elem[0] + var args = elem[1] + // these items may be unset if they were added by an older graceful-fs + var err = elem[2] + var startTime = elem[3] + var lastTime = elem[4] + + // if we don't have a startTime we have no way of knowing if we've waited + // long enough, so go ahead and retry this item now + if (startTime === undefined) { + debug('RETRY', fn.name, args) + fn.apply(null, args) + } else if (Date.now() - startTime >= 60000) { + // it's been more than 60 seconds total, bail now + debug('TIMEOUT', fn.name, args) + var cb = args.pop() + if (typeof cb === 'function') + cb.call(null, err) + } else { + // the amount of time between the last attempt and right now + var sinceAttempt = Date.now() - lastTime + // the amount of time between when we first tried, and when we last tried + // rounded up to at least 1 + var sinceStart = Math.max(lastTime - startTime, 1) + // backoff. wait longer than the total time we've been retrying, but only + // up to a maximum of 100ms + var desiredDelay = Math.min(sinceStart * 1.2, 100) + // it's been long enough since the last retry, do it again + if (sinceAttempt >= desiredDelay) { + debug('RETRY', fn.name, args) + fn.apply(null, args.concat([startTime])) + } else { + // if we can't do this job yet, push it to the end of the queue + // and let the next iteration check again + fs[gracefulQueue].push(elem) + } + } + + // schedule our next run if one isn't already scheduled + if (retryTimer === undefined) { + retryTimer = setTimeout(retry, 0) + } +} + + +/***/ }), +/* 11 */ +/***/ ((module) => { + +"use strict"; +module.exports = require("fs"); + +/***/ }), +/* 12 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var constants = __webpack_require__(13) + +var origCwd = process.cwd +var cwd = null + +var platform = process.env.GRACEFUL_FS_PLATFORM || process.platform + +process.cwd = function() { + if (!cwd) + cwd = origCwd.call(process) + return cwd +} +try { + process.cwd() +} catch (er) {} + +// This check is needed until node.js 12 is required +if (typeof process.chdir === 'function') { + var chdir = process.chdir + process.chdir = function (d) { + cwd = null + chdir.call(process, d) + } + if (Object.setPrototypeOf) Object.setPrototypeOf(process.chdir, chdir) +} + +module.exports = patch + +function patch (fs) { + // (re-)implement some things that are known busted or missing. + + // lchmod, broken prior to 0.6.2 + // back-port the fix here. + if (constants.hasOwnProperty('O_SYMLINK') && + process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) { + patchLchmod(fs) + } + + // lutimes implementation, or no-op + if (!fs.lutimes) { + patchLutimes(fs) + } + + // https://github.com/isaacs/node-graceful-fs/issues/4 + // Chown should not fail on einval or eperm if non-root. + // It should not fail on enosys ever, as this just indicates + // that a fs doesn't support the intended operation. + + fs.chown = chownFix(fs.chown) + fs.fchown = chownFix(fs.fchown) + fs.lchown = chownFix(fs.lchown) + + fs.chmod = chmodFix(fs.chmod) + fs.fchmod = chmodFix(fs.fchmod) + fs.lchmod = chmodFix(fs.lchmod) + + fs.chownSync = chownFixSync(fs.chownSync) + fs.fchownSync = chownFixSync(fs.fchownSync) + fs.lchownSync = chownFixSync(fs.lchownSync) + + fs.chmodSync = chmodFixSync(fs.chmodSync) + fs.fchmodSync = chmodFixSync(fs.fchmodSync) + fs.lchmodSync = chmodFixSync(fs.lchmodSync) + + fs.stat = statFix(fs.stat) + fs.fstat = statFix(fs.fstat) + fs.lstat = statFix(fs.lstat) + + fs.statSync = statFixSync(fs.statSync) + fs.fstatSync = statFixSync(fs.fstatSync) + fs.lstatSync = statFixSync(fs.lstatSync) + + // if lchmod/lchown do not exist, then make them no-ops + if (fs.chmod && !fs.lchmod) { + fs.lchmod = function (path, mode, cb) { + if (cb) process.nextTick(cb) + } + fs.lchmodSync = function () {} + } + if (fs.chown && !fs.lchown) { + fs.lchown = function (path, uid, gid, cb) { + if (cb) process.nextTick(cb) + } + fs.lchownSync = function () {} + } + + // on Windows, A/V software can lock the directory, causing this + // to fail with an EACCES or EPERM if the directory contains newly + // created files. Try again on failure, for up to 60 seconds. + + // Set the timeout this long because some Windows Anti-Virus, such as Parity + // bit9, may lock files for up to a minute, causing npm package install + // failures. Also, take care to yield the scheduler. Windows scheduling gives + // CPU to a busy looping process, which can cause the program causing the lock + // contention to be starved of CPU by node, so the contention doesn't resolve. + if (platform === "win32") { + fs.rename = typeof fs.rename !== 'function' ? fs.rename + : (function (fs$rename) { + function rename (from, to, cb) { + var start = Date.now() + var backoff = 0; + fs$rename(from, to, function CB (er) { + if (er + && (er.code === "EACCES" || er.code === "EPERM" || er.code === "EBUSY") + && Date.now() - start < 60000) { + setTimeout(function() { + fs.stat(to, function (stater, st) { + if (stater && stater.code === "ENOENT") + fs$rename(from, to, CB); + else + cb(er) + }) + }, backoff) + if (backoff < 100) + backoff += 10; + return; + } + if (cb) cb(er) + }) + } + if (Object.setPrototypeOf) Object.setPrototypeOf(rename, fs$rename) + return rename + })(fs.rename) + } + + // if read() returns EAGAIN, then just try it again. + fs.read = typeof fs.read !== 'function' ? fs.read + : (function (fs$read) { + function read (fd, buffer, offset, length, position, callback_) { + var callback + if (callback_ && typeof callback_ === 'function') { + var eagCounter = 0 + callback = function (er, _, __) { + if (er && er.code === 'EAGAIN' && eagCounter < 10) { + eagCounter ++ + return fs$read.call(fs, fd, buffer, offset, length, position, callback) + } + callback_.apply(this, arguments) + } + } + return fs$read.call(fs, fd, buffer, offset, length, position, callback) + } + + // This ensures `util.promisify` works as it does for native `fs.read`. + if (Object.setPrototypeOf) Object.setPrototypeOf(read, fs$read) + return read + })(fs.read) + + fs.readSync = typeof fs.readSync !== 'function' ? fs.readSync + : (function (fs$readSync) { return function (fd, buffer, offset, length, position) { + var eagCounter = 0 + while (true) { + try { + return fs$readSync.call(fs, fd, buffer, offset, length, position) + } catch (er) { + if (er.code === 'EAGAIN' && eagCounter < 10) { + eagCounter ++ + continue + } + throw er + } + } + }})(fs.readSync) + + function patchLchmod (fs) { + fs.lchmod = function (path, mode, callback) { + fs.open( path + , constants.O_WRONLY | constants.O_SYMLINK + , mode + , function (err, fd) { + if (err) { + if (callback) callback(err) + return + } + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + fs.fchmod(fd, mode, function (err) { + fs.close(fd, function(err2) { + if (callback) callback(err || err2) + }) + }) + }) + } + + fs.lchmodSync = function (path, mode) { + var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode) + + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + var threw = true + var ret + try { + ret = fs.fchmodSync(fd, mode) + threw = false + } finally { + if (threw) { + try { + fs.closeSync(fd) + } catch (er) {} + } else { + fs.closeSync(fd) + } + } + return ret + } + } + + function patchLutimes (fs) { + if (constants.hasOwnProperty("O_SYMLINK") && fs.futimes) { + fs.lutimes = function (path, at, mt, cb) { + fs.open(path, constants.O_SYMLINK, function (er, fd) { + if (er) { + if (cb) cb(er) + return + } + fs.futimes(fd, at, mt, function (er) { + fs.close(fd, function (er2) { + if (cb) cb(er || er2) + }) + }) + }) + } + + fs.lutimesSync = function (path, at, mt) { + var fd = fs.openSync(path, constants.O_SYMLINK) + var ret + var threw = true + try { + ret = fs.futimesSync(fd, at, mt) + threw = false + } finally { + if (threw) { + try { + fs.closeSync(fd) + } catch (er) {} + } else { + fs.closeSync(fd) + } + } + return ret + } + + } else if (fs.futimes) { + fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) } + fs.lutimesSync = function () {} + } + } + + function chmodFix (orig) { + if (!orig) return orig + return function (target, mode, cb) { + return orig.call(fs, target, mode, function (er) { + if (chownErOk(er)) er = null + if (cb) cb.apply(this, arguments) + }) + } + } + + function chmodFixSync (orig) { + if (!orig) return orig + return function (target, mode) { + try { + return orig.call(fs, target, mode) + } catch (er) { + if (!chownErOk(er)) throw er + } + } + } + + + function chownFix (orig) { + if (!orig) return orig + return function (target, uid, gid, cb) { + return orig.call(fs, target, uid, gid, function (er) { + if (chownErOk(er)) er = null + if (cb) cb.apply(this, arguments) + }) + } + } + + function chownFixSync (orig) { + if (!orig) return orig + return function (target, uid, gid) { + try { + return orig.call(fs, target, uid, gid) + } catch (er) { + if (!chownErOk(er)) throw er + } + } + } + + function statFix (orig) { + if (!orig) return orig + // Older versions of Node erroneously returned signed integers for + // uid + gid. + return function (target, options, cb) { + if (typeof options === 'function') { + cb = options + options = null + } + function callback (er, stats) { + if (stats) { + if (stats.uid < 0) stats.uid += 0x100000000 + if (stats.gid < 0) stats.gid += 0x100000000 + } + if (cb) cb.apply(this, arguments) + } + return options ? orig.call(fs, target, options, callback) + : orig.call(fs, target, callback) + } + } + + function statFixSync (orig) { + if (!orig) return orig + // Older versions of Node erroneously returned signed integers for + // uid + gid. + return function (target, options) { + var stats = options ? orig.call(fs, target, options) + : orig.call(fs, target) + if (stats) { + if (stats.uid < 0) stats.uid += 0x100000000 + if (stats.gid < 0) stats.gid += 0x100000000 + } + return stats; + } + } + + // ENOSYS means that the fs doesn't support the op. Just ignore + // that, because it doesn't matter. + // + // if there's no getuid, or if getuid() is something other + // than 0, and the error is EINVAL or EPERM, then just ignore + // it. + // + // This specific case is a silent failure in cp, install, tar, + // and most other unix tools that manage permissions. + // + // When running as root, or if other types of errors are + // encountered, then it's strict. + function chownErOk (er) { + if (!er) + return true + + if (er.code === "ENOSYS") + return true + + var nonroot = !process.getuid || process.getuid() !== 0 + if (nonroot) { + if (er.code === "EINVAL" || er.code === "EPERM") + return true + } + + return false + } +} + + +/***/ }), +/* 13 */ +/***/ ((module) => { + +"use strict"; +module.exports = require("constants"); + +/***/ }), +/* 14 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var Stream = (__webpack_require__(15).Stream) + +module.exports = legacy + +function legacy (fs) { + return { + ReadStream: ReadStream, + WriteStream: WriteStream + } + + function ReadStream (path, options) { + if (!(this instanceof ReadStream)) return new ReadStream(path, options); + + Stream.call(this); + + var self = this; + + this.path = path; + this.fd = null; + this.readable = true; + this.paused = false; + + this.flags = 'r'; + this.mode = 438; /*=0666*/ + this.bufferSize = 64 * 1024; + + options = options || {}; + + // Mixin options into this + var keys = Object.keys(options); + for (var index = 0, length = keys.length; index < length; index++) { + var key = keys[index]; + this[key] = options[key]; + } + + if (this.encoding) this.setEncoding(this.encoding); + + if (this.start !== undefined) { + if ('number' !== typeof this.start) { + throw TypeError('start must be a Number'); + } + if (this.end === undefined) { + this.end = Infinity; + } else if ('number' !== typeof this.end) { + throw TypeError('end must be a Number'); + } + + if (this.start > this.end) { + throw new Error('start must be <= end'); + } + + this.pos = this.start; + } + + if (this.fd !== null) { + process.nextTick(function() { + self._read(); + }); + return; + } + + fs.open(this.path, this.flags, this.mode, function (err, fd) { + if (err) { + self.emit('error', err); + self.readable = false; + return; + } + + self.fd = fd; + self.emit('open', fd); + self._read(); + }) + } + + function WriteStream (path, options) { + if (!(this instanceof WriteStream)) return new WriteStream(path, options); + + Stream.call(this); + + this.path = path; + this.fd = null; + this.writable = true; + + this.flags = 'w'; + this.encoding = 'binary'; + this.mode = 438; /*=0666*/ + this.bytesWritten = 0; + + options = options || {}; + + // Mixin options into this + var keys = Object.keys(options); + for (var index = 0, length = keys.length; index < length; index++) { + var key = keys[index]; + this[key] = options[key]; + } + + if (this.start !== undefined) { + if ('number' !== typeof this.start) { + throw TypeError('start must be a Number'); + } + if (this.start < 0) { + throw new Error('start must be >= zero'); + } + + this.pos = this.start; + } + + this.busy = false; + this._queue = []; + + if (this.fd === null) { + this._open = fs.open; + this._queue.push([this._open, this.path, this.flags, this.mode, undefined]); + this.flush(); + } + } +} + + +/***/ }), +/* 15 */ +/***/ ((module) => { + +"use strict"; +module.exports = require("stream"); + +/***/ }), +/* 16 */ +/***/ ((module) => { + +"use strict"; + + +module.exports = clone + +var getPrototypeOf = Object.getPrototypeOf || function (obj) { + return obj.__proto__ +} + +function clone (obj) { + if (obj === null || typeof obj !== 'object') + return obj + + if (obj instanceof Object) + var copy = { __proto__: getPrototypeOf(obj) } + else + var copy = Object.create(null) + + Object.getOwnPropertyNames(obj).forEach(function (key) { + Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key)) + }) + + return copy +} + + +/***/ }), +/* 17 */ +/***/ ((module) => { + +"use strict"; +module.exports = require("util"); + +/***/ }), +/* 18 */ +/***/ ((module) => { + +"use strict"; +module.exports = require("assert"); + +/***/ }), +/* 19 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +const u = (__webpack_require__(9).fromPromise) +module.exports = { + copy: u(__webpack_require__(20)), + copySync: __webpack_require__(27) +} + + +/***/ }), +/* 20 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +const fs = __webpack_require__(8) +const path = __webpack_require__(3) +const { mkdirs } = __webpack_require__(21) +const { pathExists } = __webpack_require__(24) +const { utimesMillis } = __webpack_require__(25) +const stat = __webpack_require__(26) + +async function copy (src, dest, opts = {}) { + if (typeof opts === 'function') { + opts = { filter: opts } + } + + opts.clobber = 'clobber' in opts ? !!opts.clobber : true // default to true for now + opts.overwrite = 'overwrite' in opts ? !!opts.overwrite : opts.clobber // overwrite falls back to clobber + + // Warn about using preserveTimestamps on 32-bit node + if (opts.preserveTimestamps && process.arch === 'ia32') { + process.emitWarning( + 'Using the preserveTimestamps option in 32-bit node is not recommended;\n\n' + + '\tsee https://github.com/jprichardson/node-fs-extra/issues/269', + 'Warning', 'fs-extra-WARN0001' + ) + } + + const { srcStat, destStat } = await stat.checkPaths(src, dest, 'copy', opts) + + await stat.checkParentPaths(src, srcStat, dest, 'copy') + + const include = await runFilter(src, dest, opts) + + if (!include) return + + // check if the parent of dest exists, and create it if it doesn't exist + const destParent = path.dirname(dest) + const dirExists = await pathExists(destParent) + if (!dirExists) { + await mkdirs(destParent) + } + + await getStatsAndPerformCopy(destStat, src, dest, opts) +} + +async function runFilter (src, dest, opts) { + if (!opts.filter) return true + return opts.filter(src, dest) +} + +async function getStatsAndPerformCopy (destStat, src, dest, opts) { + const statFn = opts.dereference ? fs.stat : fs.lstat + const srcStat = await statFn(src) + + if (srcStat.isDirectory()) return onDir(srcStat, destStat, src, dest, opts) + + if ( + srcStat.isFile() || + srcStat.isCharacterDevice() || + srcStat.isBlockDevice() + ) return onFile(srcStat, destStat, src, dest, opts) + + if (srcStat.isSymbolicLink()) return onLink(destStat, src, dest, opts) + if (srcStat.isSocket()) throw new Error(`Cannot copy a socket file: ${src}`) + if (srcStat.isFIFO()) throw new Error(`Cannot copy a FIFO pipe: ${src}`) + throw new Error(`Unknown file: ${src}`) +} + +async function onFile (srcStat, destStat, src, dest, opts) { + if (!destStat) return copyFile(srcStat, src, dest, opts) + + if (opts.overwrite) { + await fs.unlink(dest) + return copyFile(srcStat, src, dest, opts) + } + if (opts.errorOnExist) { + throw new Error(`'${dest}' already exists`) + } +} + +async function copyFile (srcStat, src, dest, opts) { + await fs.copyFile(src, dest) + if (opts.preserveTimestamps) { + // Make sure the file is writable before setting the timestamp + // otherwise open fails with EPERM when invoked with 'r+' + // (through utimes call) + if (fileIsNotWritable(srcStat.mode)) { + await makeFileWritable(dest, srcStat.mode) + } + + // Set timestamps and mode correspondingly + + // Note that The initial srcStat.atime cannot be trusted + // because it is modified by the read(2) system call + // (See https://nodejs.org/api/fs.html#fs_stat_time_values) + const updatedSrcStat = await fs.stat(src) + await utimesMillis(dest, updatedSrcStat.atime, updatedSrcStat.mtime) + } + + return fs.chmod(dest, srcStat.mode) +} + +function fileIsNotWritable (srcMode) { + return (srcMode & 0o200) === 0 +} + +function makeFileWritable (dest, srcMode) { + return fs.chmod(dest, srcMode | 0o200) +} + +async function onDir (srcStat, destStat, src, dest, opts) { + // the dest directory might not exist, create it + if (!destStat) { + await fs.mkdir(dest) + } + + const items = await fs.readdir(src) + + // loop through the files in the current directory to copy everything + await Promise.all(items.map(async item => { + const srcItem = path.join(src, item) + const destItem = path.join(dest, item) + + // skip the item if it is matches by the filter function + const include = await runFilter(srcItem, destItem, opts) + if (!include) return + + const { destStat } = await stat.checkPaths(srcItem, destItem, 'copy', opts) + + // If the item is a copyable file, `getStatsAndPerformCopy` will copy it + // If the item is a directory, `getStatsAndPerformCopy` will call `onDir` recursively + return getStatsAndPerformCopy(destStat, srcItem, destItem, opts) + })) + + if (!destStat) { + await fs.chmod(dest, srcStat.mode) + } +} + +async function onLink (destStat, src, dest, opts) { + let resolvedSrc = await fs.readlink(src) + if (opts.dereference) { + resolvedSrc = path.resolve(process.cwd(), resolvedSrc) + } + if (!destStat) { + return fs.symlink(resolvedSrc, dest) + } + + let resolvedDest = null + try { + resolvedDest = await fs.readlink(dest) + } catch (e) { + // dest exists and is a regular file or directory, + // Windows may throw UNKNOWN error. If dest already exists, + // fs throws error anyway, so no need to guard against it here. + if (e.code === 'EINVAL' || e.code === 'UNKNOWN') return fs.symlink(resolvedSrc, dest) + throw e + } + if (opts.dereference) { + resolvedDest = path.resolve(process.cwd(), resolvedDest) + } + if (stat.isSrcSubdir(resolvedSrc, resolvedDest)) { + throw new Error(`Cannot copy '${resolvedSrc}' to a subdirectory of itself, '${resolvedDest}'.`) + } + + // do not copy if src is a subdir of dest since unlinking + // dest in this case would result in removing src contents + // and therefore a broken symlink would be created. + if (stat.isSrcSubdir(resolvedDest, resolvedSrc)) { + throw new Error(`Cannot overwrite '${resolvedDest}' with '${resolvedSrc}'.`) + } + + // copy the link + await fs.unlink(dest) + return fs.symlink(resolvedSrc, dest) +} + +module.exports = copy + + +/***/ }), +/* 21 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +const u = (__webpack_require__(9).fromPromise) +const { makeDir: _makeDir, makeDirSync } = __webpack_require__(22) +const makeDir = u(_makeDir) + +module.exports = { + mkdirs: makeDir, + mkdirsSync: makeDirSync, + // alias + mkdirp: makeDir, + mkdirpSync: makeDirSync, + ensureDir: makeDir, + ensureDirSync: makeDirSync +} + + +/***/ }), +/* 22 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +const fs = __webpack_require__(8) +const { checkPath } = __webpack_require__(23) + +const getMode = options => { + const defaults = { mode: 0o777 } + if (typeof options === 'number') return options + return ({ ...defaults, ...options }).mode +} + +module.exports.makeDir = async (dir, options) => { + checkPath(dir) + + return fs.mkdir(dir, { + mode: getMode(options), + recursive: true + }) +} + +module.exports.makeDirSync = (dir, options) => { + checkPath(dir) + + return fs.mkdirSync(dir, { + mode: getMode(options), + recursive: true + }) +} + + +/***/ }), +/* 23 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +// Adapted from https://github.com/sindresorhus/make-dir +// Copyright (c) Sindre Sorhus (sindresorhus.com) +// 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. + +const path = __webpack_require__(3) + +// https://github.com/nodejs/node/issues/8987 +// https://github.com/libuv/libuv/pull/1088 +module.exports.checkPath = function checkPath (pth) { + if (process.platform === 'win32') { + const pathHasInvalidWinCharacters = /[<>:"|?*]/.test(pth.replace(path.parse(pth).root, '')) + + if (pathHasInvalidWinCharacters) { + const error = new Error(`Path contains invalid characters: ${pth}`) + error.code = 'EINVAL' + throw error + } + } +} + + +/***/ }), +/* 24 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +const u = (__webpack_require__(9).fromPromise) +const fs = __webpack_require__(8) + +function pathExists (path) { + return fs.access(path).then(() => true).catch(() => false) +} + +module.exports = { + pathExists: u(pathExists), + pathExistsSync: fs.existsSync +} + + +/***/ }), +/* 25 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +const fs = __webpack_require__(8) +const u = (__webpack_require__(9).fromPromise) + +async function utimesMillis (path, atime, mtime) { + // if (!HAS_MILLIS_RES) return fs.utimes(path, atime, mtime, callback) + const fd = await fs.open(path, 'r+') + + let closeErr = null + + try { + await fs.futimes(fd, atime, mtime) + } finally { + try { + await fs.close(fd) + } catch (e) { + closeErr = e + } + } + + if (closeErr) { + throw closeErr + } +} + +function utimesMillisSync (path, atime, mtime) { + const fd = fs.openSync(path, 'r+') + fs.futimesSync(fd, atime, mtime) + return fs.closeSync(fd) +} + +module.exports = { + utimesMillis: u(utimesMillis), + utimesMillisSync +} + + +/***/ }), +/* 26 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +const fs = __webpack_require__(8) +const path = __webpack_require__(3) +const u = (__webpack_require__(9).fromPromise) + +function getStats (src, dest, opts) { + const statFunc = opts.dereference + ? (file) => fs.stat(file, { bigint: true }) + : (file) => fs.lstat(file, { bigint: true }) + return Promise.all([ + statFunc(src), + statFunc(dest).catch(err => { + if (err.code === 'ENOENT') return null + throw err + }) + ]).then(([srcStat, destStat]) => ({ srcStat, destStat })) +} + +function getStatsSync (src, dest, opts) { + let destStat + const statFunc = opts.dereference + ? (file) => fs.statSync(file, { bigint: true }) + : (file) => fs.lstatSync(file, { bigint: true }) + const srcStat = statFunc(src) + try { + destStat = statFunc(dest) + } catch (err) { + if (err.code === 'ENOENT') return { srcStat, destStat: null } + throw err + } + return { srcStat, destStat } +} + +async function checkPaths (src, dest, funcName, opts) { + const { srcStat, destStat } = await getStats(src, dest, opts) + if (destStat) { + if (areIdentical(srcStat, destStat)) { + const srcBaseName = path.basename(src) + const destBaseName = path.basename(dest) + if (funcName === 'move' && + srcBaseName !== destBaseName && + srcBaseName.toLowerCase() === destBaseName.toLowerCase()) { + return { srcStat, destStat, isChangingCase: true } + } + throw new Error('Source and destination must not be the same.') + } + if (srcStat.isDirectory() && !destStat.isDirectory()) { + throw new Error(`Cannot overwrite non-directory '${dest}' with directory '${src}'.`) + } + if (!srcStat.isDirectory() && destStat.isDirectory()) { + throw new Error(`Cannot overwrite directory '${dest}' with non-directory '${src}'.`) + } + } + + if (srcStat.isDirectory() && isSrcSubdir(src, dest)) { + throw new Error(errMsg(src, dest, funcName)) + } + + return { srcStat, destStat } +} + +function checkPathsSync (src, dest, funcName, opts) { + const { srcStat, destStat } = getStatsSync(src, dest, opts) + + if (destStat) { + if (areIdentical(srcStat, destStat)) { + const srcBaseName = path.basename(src) + const destBaseName = path.basename(dest) + if (funcName === 'move' && + srcBaseName !== destBaseName && + srcBaseName.toLowerCase() === destBaseName.toLowerCase()) { + return { srcStat, destStat, isChangingCase: true } + } + throw new Error('Source and destination must not be the same.') + } + if (srcStat.isDirectory() && !destStat.isDirectory()) { + throw new Error(`Cannot overwrite non-directory '${dest}' with directory '${src}'.`) + } + if (!srcStat.isDirectory() && destStat.isDirectory()) { + throw new Error(`Cannot overwrite directory '${dest}' with non-directory '${src}'.`) + } + } + + if (srcStat.isDirectory() && isSrcSubdir(src, dest)) { + throw new Error(errMsg(src, dest, funcName)) + } + return { srcStat, destStat } +} + +// recursively check if dest parent is a subdirectory of src. +// It works for all file types including symlinks since it +// checks the src and dest inodes. It starts from the deepest +// parent and stops once it reaches the src parent or the root path. +async function checkParentPaths (src, srcStat, dest, funcName) { + const srcParent = path.resolve(path.dirname(src)) + const destParent = path.resolve(path.dirname(dest)) + if (destParent === srcParent || destParent === path.parse(destParent).root) return + + let destStat + try { + destStat = await fs.stat(destParent, { bigint: true }) + } catch (err) { + if (err.code === 'ENOENT') return + throw err + } + + if (areIdentical(srcStat, destStat)) { + throw new Error(errMsg(src, dest, funcName)) + } + + return checkParentPaths(src, srcStat, destParent, funcName) +} + +function checkParentPathsSync (src, srcStat, dest, funcName) { + const srcParent = path.resolve(path.dirname(src)) + const destParent = path.resolve(path.dirname(dest)) + if (destParent === srcParent || destParent === path.parse(destParent).root) return + let destStat + try { + destStat = fs.statSync(destParent, { bigint: true }) + } catch (err) { + if (err.code === 'ENOENT') return + throw err + } + if (areIdentical(srcStat, destStat)) { + throw new Error(errMsg(src, dest, funcName)) + } + return checkParentPathsSync(src, srcStat, destParent, funcName) +} + +function areIdentical (srcStat, destStat) { + return destStat.ino && destStat.dev && destStat.ino === srcStat.ino && destStat.dev === srcStat.dev +} + +// return true if dest is a subdir of src, otherwise false. +// It only checks the path strings. +function isSrcSubdir (src, dest) { + const srcArr = path.resolve(src).split(path.sep).filter(i => i) + const destArr = path.resolve(dest).split(path.sep).filter(i => i) + return srcArr.every((cur, i) => destArr[i] === cur) +} + +function errMsg (src, dest, funcName) { + return `Cannot ${funcName} '${src}' to a subdirectory of itself, '${dest}'.` +} + +module.exports = { + // checkPaths + checkPaths: u(checkPaths), + checkPathsSync, + // checkParent + checkParentPaths: u(checkParentPaths), + checkParentPathsSync, + // Misc + isSrcSubdir, + areIdentical +} + + +/***/ }), +/* 27 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +const fs = __webpack_require__(10) +const path = __webpack_require__(3) +const mkdirsSync = (__webpack_require__(21).mkdirsSync) +const utimesMillisSync = (__webpack_require__(25).utimesMillisSync) +const stat = __webpack_require__(26) + +function copySync (src, dest, opts) { + if (typeof opts === 'function') { + opts = { filter: opts } + } + + opts = opts || {} + opts.clobber = 'clobber' in opts ? !!opts.clobber : true // default to true for now + opts.overwrite = 'overwrite' in opts ? !!opts.overwrite : opts.clobber // overwrite falls back to clobber + + // Warn about using preserveTimestamps on 32-bit node + if (opts.preserveTimestamps && process.arch === 'ia32') { + process.emitWarning( + 'Using the preserveTimestamps option in 32-bit node is not recommended;\n\n' + + '\tsee https://github.com/jprichardson/node-fs-extra/issues/269', + 'Warning', 'fs-extra-WARN0002' + ) + } + + const { srcStat, destStat } = stat.checkPathsSync(src, dest, 'copy', opts) + stat.checkParentPathsSync(src, srcStat, dest, 'copy') + if (opts.filter && !opts.filter(src, dest)) return + const destParent = path.dirname(dest) + if (!fs.existsSync(destParent)) mkdirsSync(destParent) + return getStats(destStat, src, dest, opts) +} + +function getStats (destStat, src, dest, opts) { + const statSync = opts.dereference ? fs.statSync : fs.lstatSync + const srcStat = statSync(src) + + if (srcStat.isDirectory()) return onDir(srcStat, destStat, src, dest, opts) + else if (srcStat.isFile() || + srcStat.isCharacterDevice() || + srcStat.isBlockDevice()) return onFile(srcStat, destStat, src, dest, opts) + else if (srcStat.isSymbolicLink()) return onLink(destStat, src, dest, opts) + else if (srcStat.isSocket()) throw new Error(`Cannot copy a socket file: ${src}`) + else if (srcStat.isFIFO()) throw new Error(`Cannot copy a FIFO pipe: ${src}`) + throw new Error(`Unknown file: ${src}`) +} + +function onFile (srcStat, destStat, src, dest, opts) { + if (!destStat) return copyFile(srcStat, src, dest, opts) + return mayCopyFile(srcStat, src, dest, opts) +} + +function mayCopyFile (srcStat, src, dest, opts) { + if (opts.overwrite) { + fs.unlinkSync(dest) + return copyFile(srcStat, src, dest, opts) + } else if (opts.errorOnExist) { + throw new Error(`'${dest}' already exists`) + } +} + +function copyFile (srcStat, src, dest, opts) { + fs.copyFileSync(src, dest) + if (opts.preserveTimestamps) handleTimestamps(srcStat.mode, src, dest) + return setDestMode(dest, srcStat.mode) +} + +function handleTimestamps (srcMode, src, dest) { + // Make sure the file is writable before setting the timestamp + // otherwise open fails with EPERM when invoked with 'r+' + // (through utimes call) + if (fileIsNotWritable(srcMode)) makeFileWritable(dest, srcMode) + return setDestTimestamps(src, dest) +} + +function fileIsNotWritable (srcMode) { + return (srcMode & 0o200) === 0 +} + +function makeFileWritable (dest, srcMode) { + return setDestMode(dest, srcMode | 0o200) +} + +function setDestMode (dest, srcMode) { + return fs.chmodSync(dest, srcMode) +} + +function setDestTimestamps (src, dest) { + // The initial srcStat.atime cannot be trusted + // because it is modified by the read(2) system call + // (See https://nodejs.org/api/fs.html#fs_stat_time_values) + const updatedSrcStat = fs.statSync(src) + return utimesMillisSync(dest, updatedSrcStat.atime, updatedSrcStat.mtime) +} + +function onDir (srcStat, destStat, src, dest, opts) { + if (!destStat) return mkDirAndCopy(srcStat.mode, src, dest, opts) + return copyDir(src, dest, opts) +} + +function mkDirAndCopy (srcMode, src, dest, opts) { + fs.mkdirSync(dest) + copyDir(src, dest, opts) + return setDestMode(dest, srcMode) +} + +function copyDir (src, dest, opts) { + fs.readdirSync(src).forEach(item => copyDirItem(item, src, dest, opts)) +} + +function copyDirItem (item, src, dest, opts) { + const srcItem = path.join(src, item) + const destItem = path.join(dest, item) + if (opts.filter && !opts.filter(srcItem, destItem)) return + const { destStat } = stat.checkPathsSync(srcItem, destItem, 'copy', opts) + return getStats(destStat, srcItem, destItem, opts) +} + +function onLink (destStat, src, dest, opts) { + let resolvedSrc = fs.readlinkSync(src) + if (opts.dereference) { + resolvedSrc = path.resolve(process.cwd(), resolvedSrc) + } + + if (!destStat) { + return fs.symlinkSync(resolvedSrc, dest) + } else { + let resolvedDest + try { + resolvedDest = fs.readlinkSync(dest) + } catch (err) { + // dest exists and is a regular file or directory, + // Windows may throw UNKNOWN error. If dest already exists, + // fs throws error anyway, so no need to guard against it here. + if (err.code === 'EINVAL' || err.code === 'UNKNOWN') return fs.symlinkSync(resolvedSrc, dest) + throw err + } + if (opts.dereference) { + resolvedDest = path.resolve(process.cwd(), resolvedDest) + } + if (stat.isSrcSubdir(resolvedSrc, resolvedDest)) { + throw new Error(`Cannot copy '${resolvedSrc}' to a subdirectory of itself, '${resolvedDest}'.`) + } + + // prevent copy if src is a subdir of dest since unlinking + // dest in this case would result in removing src contents + // and therefore a broken symlink would be created. + if (stat.isSrcSubdir(resolvedDest, resolvedSrc)) { + throw new Error(`Cannot overwrite '${resolvedDest}' with '${resolvedSrc}'.`) + } + return copyLink(resolvedSrc, dest) + } +} + +function copyLink (resolvedSrc, dest) { + fs.unlinkSync(dest) + return fs.symlinkSync(resolvedSrc, dest) +} + +module.exports = copySync + + +/***/ }), +/* 28 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +const u = (__webpack_require__(9).fromPromise) +const fs = __webpack_require__(8) +const path = __webpack_require__(3) +const mkdir = __webpack_require__(21) +const remove = __webpack_require__(29) + +const emptyDir = u(async function emptyDir (dir) { + let items + try { + items = await fs.readdir(dir) + } catch { + return mkdir.mkdirs(dir) + } + + return Promise.all(items.map(item => remove.remove(path.join(dir, item)))) +}) + +function emptyDirSync (dir) { + let items + try { + items = fs.readdirSync(dir) + } catch { + return mkdir.mkdirsSync(dir) + } + + items.forEach(item => { + item = path.join(dir, item) + remove.removeSync(item) + }) +} + +module.exports = { + emptyDirSync, + emptydirSync: emptyDirSync, + emptyDir, + emptydir: emptyDir +} + + +/***/ }), +/* 29 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +const fs = __webpack_require__(10) +const u = (__webpack_require__(9).fromCallback) + +function remove (path, callback) { + fs.rm(path, { recursive: true, force: true }, callback) +} + +function removeSync (path) { + fs.rmSync(path, { recursive: true, force: true }) +} + +module.exports = { + remove: u(remove), + removeSync +} + + +/***/ }), +/* 30 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +const { createFile, createFileSync } = __webpack_require__(31) +const { createLink, createLinkSync } = __webpack_require__(32) +const { createSymlink, createSymlinkSync } = __webpack_require__(33) + +module.exports = { + // file + createFile, + createFileSync, + ensureFile: createFile, + ensureFileSync: createFileSync, + // link + createLink, + createLinkSync, + ensureLink: createLink, + ensureLinkSync: createLinkSync, + // symlink + createSymlink, + createSymlinkSync, + ensureSymlink: createSymlink, + ensureSymlinkSync: createSymlinkSync +} + + +/***/ }), +/* 31 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +const u = (__webpack_require__(9).fromPromise) +const path = __webpack_require__(3) +const fs = __webpack_require__(8) +const mkdir = __webpack_require__(21) + +async function createFile (file) { + let stats + try { + stats = await fs.stat(file) + } catch { } + if (stats && stats.isFile()) return + + const dir = path.dirname(file) + + let dirStats = null + try { + dirStats = await fs.stat(dir) + } catch (err) { + // if the directory doesn't exist, make it + if (err.code === 'ENOENT') { + await mkdir.mkdirs(dir) + await fs.writeFile(file, '') + return + } else { + throw err + } + } + + if (dirStats.isDirectory()) { + await fs.writeFile(file, '') + } else { + // parent is not a directory + // This is just to cause an internal ENOTDIR error to be thrown + await fs.readdir(dir) + } +} + +function createFileSync (file) { + let stats + try { + stats = fs.statSync(file) + } catch { } + if (stats && stats.isFile()) return + + const dir = path.dirname(file) + try { + if (!fs.statSync(dir).isDirectory()) { + // parent is not a directory + // This is just to cause an internal ENOTDIR error to be thrown + fs.readdirSync(dir) + } + } catch (err) { + // If the stat call above failed because the directory doesn't exist, create it + if (err && err.code === 'ENOENT') mkdir.mkdirsSync(dir) + else throw err + } + + fs.writeFileSync(file, '') +} + +module.exports = { + createFile: u(createFile), + createFileSync +} + + +/***/ }), +/* 32 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +const u = (__webpack_require__(9).fromPromise) +const path = __webpack_require__(3) +const fs = __webpack_require__(8) +const mkdir = __webpack_require__(21) +const { pathExists } = __webpack_require__(24) +const { areIdentical } = __webpack_require__(26) + +async function createLink (srcpath, dstpath) { + let dstStat + try { + dstStat = await fs.lstat(dstpath) + } catch { + // ignore error + } + + let srcStat + try { + srcStat = await fs.lstat(srcpath) + } catch (err) { + err.message = err.message.replace('lstat', 'ensureLink') + throw err + } + + if (dstStat && areIdentical(srcStat, dstStat)) return + + const dir = path.dirname(dstpath) + + const dirExists = await pathExists(dir) + + if (!dirExists) { + await mkdir.mkdirs(dir) + } + + await fs.link(srcpath, dstpath) +} + +function createLinkSync (srcpath, dstpath) { + let dstStat + try { + dstStat = fs.lstatSync(dstpath) + } catch {} + + try { + const srcStat = fs.lstatSync(srcpath) + if (dstStat && areIdentical(srcStat, dstStat)) return + } catch (err) { + err.message = err.message.replace('lstat', 'ensureLink') + throw err + } + + const dir = path.dirname(dstpath) + const dirExists = fs.existsSync(dir) + if (dirExists) return fs.linkSync(srcpath, dstpath) + mkdir.mkdirsSync(dir) + + return fs.linkSync(srcpath, dstpath) +} + +module.exports = { + createLink: u(createLink), + createLinkSync +} + + +/***/ }), +/* 33 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +const u = (__webpack_require__(9).fromPromise) +const path = __webpack_require__(3) +const fs = __webpack_require__(8) + +const { mkdirs, mkdirsSync } = __webpack_require__(21) + +const { symlinkPaths, symlinkPathsSync } = __webpack_require__(34) +const { symlinkType, symlinkTypeSync } = __webpack_require__(35) + +const { pathExists } = __webpack_require__(24) + +const { areIdentical } = __webpack_require__(26) + +async function createSymlink (srcpath, dstpath, type) { + let stats + try { + stats = await fs.lstat(dstpath) + } catch { } + + if (stats && stats.isSymbolicLink()) { + const [srcStat, dstStat] = await Promise.all([ + fs.stat(srcpath), + fs.stat(dstpath) + ]) + + if (areIdentical(srcStat, dstStat)) return + } + + const relative = await symlinkPaths(srcpath, dstpath) + srcpath = relative.toDst + const toType = await symlinkType(relative.toCwd, type) + const dir = path.dirname(dstpath) + + if (!(await pathExists(dir))) { + await mkdirs(dir) + } + + return fs.symlink(srcpath, dstpath, toType) +} + +function createSymlinkSync (srcpath, dstpath, type) { + let stats + try { + stats = fs.lstatSync(dstpath) + } catch { } + if (stats && stats.isSymbolicLink()) { + const srcStat = fs.statSync(srcpath) + const dstStat = fs.statSync(dstpath) + if (areIdentical(srcStat, dstStat)) return + } + + const relative = symlinkPathsSync(srcpath, dstpath) + srcpath = relative.toDst + type = symlinkTypeSync(relative.toCwd, type) + const dir = path.dirname(dstpath) + const exists = fs.existsSync(dir) + if (exists) return fs.symlinkSync(srcpath, dstpath, type) + mkdirsSync(dir) + return fs.symlinkSync(srcpath, dstpath, type) +} + +module.exports = { + createSymlink: u(createSymlink), + createSymlinkSync +} + + +/***/ }), +/* 34 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +const path = __webpack_require__(3) +const fs = __webpack_require__(8) +const { pathExists } = __webpack_require__(24) + +const u = (__webpack_require__(9).fromPromise) + +/** + * Function that returns two types of paths, one relative to symlink, and one + * relative to the current working directory. Checks if path is absolute or + * relative. If the path is relative, this function checks if the path is + * relative to symlink or relative to current working directory. This is an + * initiative to find a smarter `srcpath` to supply when building symlinks. + * This allows you to determine which path to use out of one of three possible + * types of source paths. The first is an absolute path. This is detected by + * `path.isAbsolute()`. When an absolute path is provided, it is checked to + * see if it exists. If it does it's used, if not an error is returned + * (callback)/ thrown (sync). The other two options for `srcpath` are a + * relative url. By default Node's `fs.symlink` works by creating a symlink + * using `dstpath` and expects the `srcpath` to be relative to the newly + * created symlink. If you provide a `srcpath` that does not exist on the file + * system it results in a broken symlink. To minimize this, the function + * checks to see if the 'relative to symlink' source file exists, and if it + * does it will use it. If it does not, it checks if there's a file that + * exists that is relative to the current working directory, if does its used. + * This preserves the expectations of the original fs.symlink spec and adds + * the ability to pass in `relative to current working direcotry` paths. + */ + +async function symlinkPaths (srcpath, dstpath) { + if (path.isAbsolute(srcpath)) { + try { + await fs.lstat(srcpath) + } catch (err) { + err.message = err.message.replace('lstat', 'ensureSymlink') + throw err + } + + return { + toCwd: srcpath, + toDst: srcpath + } + } + + const dstdir = path.dirname(dstpath) + const relativeToDst = path.join(dstdir, srcpath) + + const exists = await pathExists(relativeToDst) + if (exists) { + return { + toCwd: relativeToDst, + toDst: srcpath + } + } + + try { + await fs.lstat(srcpath) + } catch (err) { + err.message = err.message.replace('lstat', 'ensureSymlink') + throw err + } + + return { + toCwd: srcpath, + toDst: path.relative(dstdir, srcpath) + } +} + +function symlinkPathsSync (srcpath, dstpath) { + if (path.isAbsolute(srcpath)) { + const exists = fs.existsSync(srcpath) + if (!exists) throw new Error('absolute srcpath does not exist') + return { + toCwd: srcpath, + toDst: srcpath + } + } + + const dstdir = path.dirname(dstpath) + const relativeToDst = path.join(dstdir, srcpath) + const exists = fs.existsSync(relativeToDst) + if (exists) { + return { + toCwd: relativeToDst, + toDst: srcpath + } + } + + const srcExists = fs.existsSync(srcpath) + if (!srcExists) throw new Error('relative srcpath does not exist') + return { + toCwd: srcpath, + toDst: path.relative(dstdir, srcpath) + } +} + +module.exports = { + symlinkPaths: u(symlinkPaths), + symlinkPathsSync +} + + +/***/ }), +/* 35 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +const fs = __webpack_require__(8) +const u = (__webpack_require__(9).fromPromise) + +async function symlinkType (srcpath, type) { + if (type) return type + + let stats + try { + stats = await fs.lstat(srcpath) + } catch { + return 'file' + } + + return (stats && stats.isDirectory()) ? 'dir' : 'file' +} + +function symlinkTypeSync (srcpath, type) { + if (type) return type + + let stats + try { + stats = fs.lstatSync(srcpath) + } catch { + return 'file' + } + return (stats && stats.isDirectory()) ? 'dir' : 'file' +} + +module.exports = { + symlinkType: u(symlinkType), + symlinkTypeSync +} + + +/***/ }), +/* 36 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +const u = (__webpack_require__(9).fromPromise) +const jsonFile = __webpack_require__(37) + +jsonFile.outputJson = u(__webpack_require__(40)) +jsonFile.outputJsonSync = __webpack_require__(42) +// aliases +jsonFile.outputJSON = jsonFile.outputJson +jsonFile.outputJSONSync = jsonFile.outputJsonSync +jsonFile.writeJSON = jsonFile.writeJson +jsonFile.writeJSONSync = jsonFile.writeJsonSync +jsonFile.readJSON = jsonFile.readJson +jsonFile.readJSONSync = jsonFile.readJsonSync + +module.exports = jsonFile + + +/***/ }), +/* 37 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +const jsonFile = __webpack_require__(38) + +module.exports = { + // jsonfile exports + readJson: jsonFile.readFile, + readJsonSync: jsonFile.readFileSync, + writeJson: jsonFile.writeFile, + writeJsonSync: jsonFile.writeFileSync +} + + +/***/ }), +/* 38 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +let _fs +try { + _fs = __webpack_require__(10) +} catch (_) { + _fs = __webpack_require__(11) +} +const universalify = __webpack_require__(9) +const { stringify, stripBom } = __webpack_require__(39) + +async function _readFile (file, options = {}) { + if (typeof options === 'string') { + options = { encoding: options } + } + + const fs = options.fs || _fs + + const shouldThrow = 'throws' in options ? options.throws : true + + let data = await universalify.fromCallback(fs.readFile)(file, options) + + data = stripBom(data) + + let obj + try { + obj = JSON.parse(data, options ? options.reviver : null) + } catch (err) { + if (shouldThrow) { + err.message = `${file}: ${err.message}` + throw err + } else { + return null + } + } + + return obj +} + +const readFile = universalify.fromPromise(_readFile) + +function readFileSync (file, options = {}) { + if (typeof options === 'string') { + options = { encoding: options } + } + + const fs = options.fs || _fs + + const shouldThrow = 'throws' in options ? options.throws : true + + try { + let content = fs.readFileSync(file, options) + content = stripBom(content) + return JSON.parse(content, options.reviver) + } catch (err) { + if (shouldThrow) { + err.message = `${file}: ${err.message}` + throw err + } else { + return null + } + } +} + +async function _writeFile (file, obj, options = {}) { + const fs = options.fs || _fs + + const str = stringify(obj, options) + + await universalify.fromCallback(fs.writeFile)(file, str, options) +} + +const writeFile = universalify.fromPromise(_writeFile) + +function writeFileSync (file, obj, options = {}) { + const fs = options.fs || _fs + + const str = stringify(obj, options) + // not sure if fs.writeFileSync returns anything, but just in case + return fs.writeFileSync(file, str, options) +} + +const jsonfile = { + readFile, + readFileSync, + writeFile, + writeFileSync +} + +module.exports = jsonfile + + +/***/ }), +/* 39 */ +/***/ ((module) => { + +function stringify (obj, { EOL = '\n', finalEOL = true, replacer = null, spaces } = {}) { + const EOF = finalEOL ? EOL : '' + const str = JSON.stringify(obj, replacer, spaces) + + return str.replace(/\n/g, EOL) + EOF +} + +function stripBom (content) { + // we do this because JSON.parse would convert it to a utf8 string if encoding wasn't specified + if (Buffer.isBuffer(content)) content = content.toString('utf8') + return content.replace(/^\uFEFF/, '') +} + +module.exports = { stringify, stripBom } + + +/***/ }), +/* 40 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +const { stringify } = __webpack_require__(39) +const { outputFile } = __webpack_require__(41) + +async function outputJson (file, data, options = {}) { + const str = stringify(data, options) + + await outputFile(file, str, options) +} + +module.exports = outputJson + + +/***/ }), +/* 41 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +const u = (__webpack_require__(9).fromPromise) +const fs = __webpack_require__(8) +const path = __webpack_require__(3) +const mkdir = __webpack_require__(21) +const pathExists = (__webpack_require__(24).pathExists) + +async function outputFile (file, data, encoding = 'utf-8') { + const dir = path.dirname(file) + + if (!(await pathExists(dir))) { + await mkdir.mkdirs(dir) + } + + return fs.writeFile(file, data, encoding) +} + +function outputFileSync (file, ...args) { + const dir = path.dirname(file) + if (!fs.existsSync(dir)) { + mkdir.mkdirsSync(dir) + } + + fs.writeFileSync(file, ...args) +} + +module.exports = { + outputFile: u(outputFile), + outputFileSync +} + + +/***/ }), +/* 42 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +const { stringify } = __webpack_require__(39) +const { outputFileSync } = __webpack_require__(41) + +function outputJsonSync (file, data, options) { + const str = stringify(data, options) + + outputFileSync(file, str, options) +} + +module.exports = outputJsonSync + + +/***/ }), +/* 43 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +const u = (__webpack_require__(9).fromPromise) +module.exports = { + move: u(__webpack_require__(44)), + moveSync: __webpack_require__(45) +} + + +/***/ }), +/* 44 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +const fs = __webpack_require__(8) +const path = __webpack_require__(3) +const { copy } = __webpack_require__(19) +const { remove } = __webpack_require__(29) +const { mkdirp } = __webpack_require__(21) +const { pathExists } = __webpack_require__(24) +const stat = __webpack_require__(26) + +async function move (src, dest, opts = {}) { + const overwrite = opts.overwrite || opts.clobber || false + + const { srcStat, isChangingCase = false } = await stat.checkPaths(src, dest, 'move', opts) + + await stat.checkParentPaths(src, srcStat, dest, 'move') + + // If the parent of dest is not root, make sure it exists before proceeding + const destParent = path.dirname(dest) + const parsedParentPath = path.parse(destParent) + if (parsedParentPath.root !== destParent) { + await mkdirp(destParent) + } + + return doRename(src, dest, overwrite, isChangingCase) +} + +async function doRename (src, dest, overwrite, isChangingCase) { + if (!isChangingCase) { + if (overwrite) { + await remove(dest) + } else if (await pathExists(dest)) { + throw new Error('dest already exists.') + } + } + + try { + // Try w/ rename first, and try copy + remove if EXDEV + await fs.rename(src, dest) + } catch (err) { + if (err.code !== 'EXDEV') { + throw err + } + await moveAcrossDevice(src, dest, overwrite) + } +} + +async function moveAcrossDevice (src, dest, overwrite) { + const opts = { + overwrite, + errorOnExist: true, + preserveTimestamps: true + } + + await copy(src, dest, opts) + return remove(src) +} + +module.exports = move + + +/***/ }), +/* 45 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +const fs = __webpack_require__(10) +const path = __webpack_require__(3) +const copySync = (__webpack_require__(19).copySync) +const removeSync = (__webpack_require__(29).removeSync) +const mkdirpSync = (__webpack_require__(21).mkdirpSync) +const stat = __webpack_require__(26) + +function moveSync (src, dest, opts) { + opts = opts || {} + const overwrite = opts.overwrite || opts.clobber || false + + const { srcStat, isChangingCase = false } = stat.checkPathsSync(src, dest, 'move', opts) + stat.checkParentPathsSync(src, srcStat, dest, 'move') + if (!isParentRoot(dest)) mkdirpSync(path.dirname(dest)) + return doRename(src, dest, overwrite, isChangingCase) +} + +function isParentRoot (dest) { + const parent = path.dirname(dest) + const parsedPath = path.parse(parent) + return parsedPath.root === parent +} + +function doRename (src, dest, overwrite, isChangingCase) { + if (isChangingCase) return rename(src, dest, overwrite) + if (overwrite) { + removeSync(dest) + return rename(src, dest, overwrite) + } + if (fs.existsSync(dest)) throw new Error('dest already exists.') + return rename(src, dest, overwrite) +} + +function rename (src, dest, overwrite) { + try { + fs.renameSync(src, dest) + } catch (err) { + if (err.code !== 'EXDEV') throw err + return moveAcrossDevice(src, dest, overwrite) + } +} + +function moveAcrossDevice (src, dest, overwrite) { + const opts = { + overwrite, + errorOnExist: true, + preserveTimestamps: true + } + copySync(src, dest, opts) + return removeSync(src) +} + +module.exports = moveSync + + +/***/ }), +/* 46 */ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +const vscode = __importStar(__webpack_require__(1)); +const environmentPath_1 = __webpack_require__(2); +const localize_1 = __importDefault(__webpack_require__(47)); +const customConfig_model_1 = __webpack_require__(48); +const extensionConfig_model_1 = __webpack_require__(49); +const localConfig_model_1 = __webpack_require__(50); +const autoUpload_service_1 = __webpack_require__(51); +const file_service_1 = __webpack_require__(255); +const webview_service_1 = __webpack_require__(261); +const state_1 = __webpack_require__(5); +class Commons { + static outputChannel = null; + static LogException(error, message, msgBox, callback) { + if (error) { + console.error(error); + if (error.status === 500) { + message = (0, localize_1.default)("common.error.connection"); + msgBox = false; + } + else if (error.status === 401) { + msgBox = true; + message = (0, localize_1.default)("common.error.invalidToken"); + } + else if (error.status === 4) { + message = (0, localize_1.default)("common.error.canNotSave"); + } + else if (error.message) { + try { + message = JSON.parse(error.message).message; + if (message.toLowerCase() === "not found") { + msgBox = true; + message = (0, localize_1.default)("common.error.invalidGistId"); + } + } + catch (error) { + // message = error.message; + } + } + } + if (msgBox === true) { + vscode.window.showErrorMessage(message); + vscode.window.setStatusBarMessage("").dispose(); + } + else { + vscode.window.setStatusBarMessage(message, 5000); + } + if (callback) { + callback.apply(this); + } + } + static GetInputBox(token) { + if (token) { + const options = { + placeHolder: (0, localize_1.default)("common.placeholder.enterGithubAccessToken"), + password: false, + prompt: (0, localize_1.default)("common.prompt.enterGithubAccessToken"), + ignoreFocusOut: true + }; + return options; + } + else { + const options = { + placeHolder: (0, localize_1.default)("common.placeholder.enterGistId"), + password: false, + prompt: (0, localize_1.default)("common.prompt.enterGistId"), + ignoreFocusOut: true + }; + return options; + } + } + autoUploadService; + webviewService = new webview_service_1.WebviewService(); + ERROR_MESSAGE = (0, localize_1.default)("common.error.message"); + constructor() { + this.InitializeAutoUpload(); + } + async InitializeAutoUpload() { + const ignored = autoUpload_service_1.AutoUploadService.GetIgnoredItems(await this.GetCustomSettings()); + this.autoUploadService = new autoUpload_service_1.AutoUploadService(ignored); + } + async HandleStartWatching() { + if (this.autoUploadService) { + this.autoUploadService.StartWatching(); + } + else { + await this.InitializeAutoUpload(); + this.HandleStartWatching(); + } + } + async HandleStopWatching() { + if (this.autoUploadService) { + this.autoUploadService.StopWatching(); + } + else { + await this.InitializeAutoUpload(); + this.HandleStopWatching(); + } + } + async InitalizeSettings() { + const settings = new localConfig_model_1.LocalConfig(); + const extSettings = this.GetSettings(); + const cusSettings = await this.GetCustomSettings(); + settings.customConfig = cusSettings; + settings.extConfig = extSettings; + return settings; + } + async GetCustomSettings() { + let customSettings = new customConfig_model_1.CustomConfig(); + try { + const customExist = await file_service_1.FileService.FileExists(state_1.state.environment.FILE_CUSTOMIZEDSETTINGS); + if (customExist) { + const customSettingStr = await file_service_1.FileService.ReadFile(state_1.state.environment.FILE_CUSTOMIZEDSETTINGS); + const tempObj = JSON.parse(customSettingStr); + Object.assign(customSettings, tempObj); + customSettings.token = customSettings.token.trim(); + } + } + catch (e) { + customSettings = null; + Commons.LogException(e, "Sync : Unable to read " + + state_1.state.environment.FILE_CUSTOMIZEDSETTINGS_NAME + + ". Make sure its Valid JSON.", true); + vscode.commands.executeCommand("vscode.open", vscode.Uri.parse("http://shanalikhan.github.io/2017/02/19/Option-to-ignore-settings-folders-code-settings-sync.html")); + } + return customSettings; + } + async SetCustomSettings(setting) { + try { + await file_service_1.FileService.WriteFile(state_1.state.environment.FILE_CUSTOMIZEDSETTINGS, JSON.stringify(setting, null, 4)); + return true; + } + catch (e) { + Commons.LogException(e, "Sync : Unable to write " + + state_1.state.environment.FILE_CUSTOMIZEDSETTINGS_NAME, true); + return false; + } + } + async StartMigrationProcess() { + const fileExist = await file_service_1.FileService.FileExists(state_1.state.environment.FILE_CUSTOMIZEDSETTINGS); + let customSettings = null; + const firstTime = !fileExist; + let fileChanged = firstTime; + if (fileExist) { + customSettings = await this.GetCustomSettings(); + } + else { + customSettings = new customConfig_model_1.CustomConfig(); + } + // vscode.workspace.getConfiguration().update("sync.version", undefined, true); + if (firstTime) { + const openExtensionPage = (0, localize_1.default)("common.action.openExtPage"); + vscode.window.showInformationMessage((0, localize_1.default)("common.info.installed")); + vscode.window + .showInformationMessage((0, localize_1.default)("common.info.needHelp"), openExtensionPage) + .then((val) => { + if (val === openExtensionPage) { + vscode.commands.executeCommand("vscode.open", vscode.Uri.parse("https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync")); + } + }); + } + else if (customSettings.version < environmentPath_1.Environment.CURRENT_VERSION) { + fileChanged = true; + // #TODO : Remove this in new update + const newIgnoredList = new customConfig_model_1.CustomConfig().ignoreUploadFiles; + newIgnoredList.forEach(m => { + if (customSettings.ignoreUploadFiles.indexOf(m) === -1) { + customSettings.ignoreUploadFiles.push(m); + } + }); + if (state_1.state.context.globalState.get("synctoken")) { + const token = state_1.state.context.globalState.get("synctoken"); + if (token !== "") { + customSettings.token = String(token); + state_1.state.context.globalState.update("synctoken", ""); + vscode.window.showInformationMessage((0, localize_1.default)("common.info.setToken")); + } + } + const releaseNotes = (0, localize_1.default)("common.action.releaseNotes"); + const writeReview = (0, localize_1.default)("common.action.writeReview"); + const support = (0, localize_1.default)("common.action.support"); + const joinCommunity = (0, localize_1.default)("common.action.joinCommunity"); + if (!customSettings.disableUpdateMessage) { + vscode.window + .showInformationMessage((0, localize_1.default)("common.info.updateTo", environmentPath_1.Environment.getVersion()), releaseNotes, writeReview, support, joinCommunity) + .then((val) => { + if (val === releaseNotes) { + vscode.commands.executeCommand("vscode.open", vscode.Uri.parse("http://shanalikhan.github.io/2016/05/14/Visual-studio-code-sync-settings-release-notes.html")); + } + if (val === writeReview) { + vscode.commands.executeCommand("vscode.open", vscode.Uri.parse("https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync#review-details")); + } + if (val === support) { + vscode.commands.executeCommand("vscode.open", vscode.Uri.parse("https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=4W3EWHHBSYMM8&lc=IE&item_name=Code%20Settings%20Sync&item_number=visual%20studio%20code%20settings%20sync¤cy_code=USD&bn=PP-DonationsBF:btn_donate_SM.gif:NonHosted")); + } + if (val === joinCommunity) { + vscode.commands.executeCommand("vscode.open", vscode.Uri.parse("https://join.slack.com/t/codesettingssync/shared_invite/enQtNzQyODMzMzI5MDQ3LWNmZjVkZjE2YTg0MzY1Y2EyYzVmYThmNzg2YjZkNjhhZWY3ZTEzN2I3ZTAxMjkwNWU0ZjMyZGFhMjdiZDI3ODU")); + } + }); + } + } + if (fileChanged) { + customSettings.version = environmentPath_1.Environment.CURRENT_VERSION; + await this.SetCustomSettings(customSettings); + } + return true; + } + async SaveSettings(setting) { + const config = vscode.workspace.getConfiguration("sync"); + const allKeysUpdated = new Array(); + const keys = Object.keys(setting); + keys.forEach(async (keyName) => { + if (setting[keyName] == null) { + setting[keyName] = ""; + } + if (keyName.toLowerCase() !== "token") { + if (config.get(keyName) !== setting[keyName]) { + allKeysUpdated.push(config.update(keyName, setting[keyName], true)); + } + } + }); + try { + await Promise.all(allKeysUpdated); + if (state_1.state.context.globalState.get("syncCounter")) { + const counter = state_1.state.context.globalState.get("syncCounter"); + let count = parseInt(counter + "", 10); + if (count % 450 === 0) { + this.DonateMessage(); + } + count = count + 1; + state_1.state.context.globalState.update("syncCounter", count); + } + else { + state_1.state.context.globalState.update("syncCounter", 1); + } + return true; + } + catch (err) { + Commons.LogException(err, this.ERROR_MESSAGE, true); + return false; + } + } + async DonateMessage() { + const donateNow = (0, localize_1.default)("common.action.donate"); + const writeReview = (0, localize_1.default)("common.action.writeReview"); + const res = await vscode.window.showInformationMessage((0, localize_1.default)("common.info.donate"), donateNow, writeReview); + if (res === donateNow) { + vscode.commands.executeCommand("vscode.open", vscode.Uri.parse("https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=4W3EWHHBSYMM8&lc=IE&item_name=Code%20Settings%20Sync&item_number=visual%20studio%20code%20settings%20sync¤cy_code=USD&bn=PP-DonationsBF:btn_donate_SM.gif:NonHosted")); + } + else if (res === writeReview) { + vscode.commands.executeCommand("vscode.open", vscode.Uri.parse("https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync#review-details")); + } + } + GetSettings() { + const settings = new extensionConfig_model_1.ExtensionConfig(); + for (const key of Object.keys(settings)) { + if (key !== "token") { + settings[key] = vscode.workspace.getConfiguration("sync").get(key); + } + } + settings.gist = settings.gist.trim(); + return settings; + } + async GetTokenAndSave(sett) { + const opt = Commons.GetInputBox(true); + const token = ((await vscode.window.showInputBox(opt)) || "").trim(); + if (token && token !== "esc") { + sett.token = token; + const saved = await this.SetCustomSettings(sett); + if (saved) { + vscode.window.setStatusBarMessage((0, localize_1.default)("common.info.tokenSaved"), 1000); + } + } + return token; + } + async GetGistAndSave(sett) { + const opt = Commons.GetInputBox(false); + const gist = ((await vscode.window.showInputBox(opt)) || "").trim(); + if (gist && gist !== "esc") { + sett.gist = gist; + const saved = await this.SaveSettings(sett); + if (saved) { + vscode.window.setStatusBarMessage((0, localize_1.default)("common.info.gistSaved"), 1000); + } + return gist; + } + } + /** + * IgnoreSettings + */ + async GetIgnoredSettings(settings) { + const ignoreSettings = {}; + const config = vscode.workspace.getConfiguration(); + const keysUpdated = []; + for (const key of settings) { + let keyValue = null; + keyValue = config.get(key, null); + if (keyValue !== null) { + ignoreSettings[key] = keyValue; + keysUpdated.push(config.update(key, undefined, true)); + } + } + await Promise.all(keysUpdated); + return ignoreSettings; + } + /** + * RestoreIgnoredSettings + */ + SetIgnoredSettings(ignoredSettings) { + const config = vscode.workspace.getConfiguration(); + const keysUpdated = []; + for (const key of Object.keys(ignoredSettings)) { + keysUpdated.push(config.update(key, ignoredSettings[key], true)); + } + } + /** + * AskGistDescription + */ + async AskGistDescription() { + return vscode.window.showInputBox({ + prompt: (0, localize_1.default)("common.prompt.multipleGist"), + ignoreFocusOut: true, + placeHolder: (0, localize_1.default)("common.placeholder.multipleGist") + }); + } + ShowSummaryOutput(upload, files, removedExtensions, addedExtensions, ignoredExtensions, syncSettings) { + if (Commons.outputChannel === null) { + Commons.outputChannel = vscode.window.createOutputChannel("Code Settings Sync"); + } + const outputChannel = Commons.outputChannel; + outputChannel.appendLine(`CODE SETTINGS SYNC ${upload ? "UPLOAD" : "DOWNLOAD"} SUMMARY`); + outputChannel.appendLine(`Version: ${environmentPath_1.Environment.getVersion()}`); + outputChannel.appendLine(`--------------------`); + outputChannel.appendLine(`GitHub Token: ${syncSettings.customConfig.token + ? syncSettings.customConfig.token.slice(0, 4) + "**********" + : "Anonymous"}`); + outputChannel.appendLine(`GitHub Gist: ${syncSettings.extConfig.gist}`); + outputChannel.appendLine(`GitHub Gist Type: ${syncSettings.publicGist ? "Public" : "Secret"}`); + outputChannel.appendLine(``); + if (!syncSettings.customConfig.token) { + outputChannel.appendLine(`Anonymous Gist cannot be edited, the extension will always create a new one during upload.`); + } + outputChannel.appendLine(`Restarting Visual Studio Code may be required to apply color and file icon theme.`); + outputChannel.appendLine(`--------------------`); + outputChannel.appendLine(`Files ${upload ? "Upload" : "Download"}ed:`); + files + .filter(item => item.fileName.indexOf(".") > 0) + .forEach(item => { + outputChannel.appendLine(` ${item.fileName} > ${item.gistName}`); + }); + outputChannel.appendLine(``); + outputChannel.appendLine(`Extensions Ignored:`); + if (!ignoredExtensions || ignoredExtensions.length === 0) { + outputChannel.appendLine(` No extensions ignored.`); + } + else { + ignoredExtensions.forEach(extn => { + outputChannel.appendLine(` ${extn.name} v${extn.version}`); + }); + } + outputChannel.appendLine(``); + outputChannel.appendLine(`Extensions Removed:`); + if (!syncSettings.extConfig.removeExtensions) { + outputChannel.appendLine(` Feature Disabled.`); + } + else { + if (!removedExtensions || removedExtensions.length === 0) { + outputChannel.appendLine(` No extensions removed.`); + } + else { + removedExtensions.forEach(extn => { + outputChannel.appendLine(` ${extn.name} v${extn.version}`); + }); + } + } + if (addedExtensions) { + outputChannel.appendLine(``); + outputChannel.appendLine(`Extensions Added:`); + if (addedExtensions.length === 0) { + outputChannel.appendLine(` No extensions installed.`); + } + addedExtensions.forEach(extn => { + outputChannel.appendLine(` ${extn.name} v${extn.version}`); + }); + } + outputChannel.appendLine(`--------------------`); + outputChannel.append(`Done.`); + outputChannel.show(true); + } +} +exports["default"] = Commons; + + +/***/ }), +/* 47 */ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Localize = void 0; +const fs_extra_1 = __webpack_require__(7); +const path_1 = __webpack_require__(3); +const vscode_1 = __webpack_require__(1); +class Localize { + bundle = this.resolveLanguagePack(); + options; + localize(key, ...args) { + const message = this.bundle[key] || key; + return this.format(message, args); + } + init() { + try { + this.options = { + ...this.options, + ...JSON.parse(process.env.VSCODE_NLS_CONFIG || "{}") + }; + } + catch (err) { + throw err; + } + } + format(message, args = []) { + return args.length + ? message.replace(/\{(\d+)\}/g, (match, rest) => args[rest[0]] || match) + : message; + } + resolveLanguagePack() { + this.init(); + const languageFormat = "package.nls{0}.json"; + const defaultLanguage = languageFormat.replace("{0}", ""); + const rootPath = vscode_1.extensions.getExtension("Shan.code-settings-sync") + .extensionPath; + const resolvedLanguage = this.recurseCandidates(rootPath, languageFormat, this.options.locale); + const languageFilePath = (0, path_1.resolve)(rootPath, resolvedLanguage); + try { + const defaultLanguageBundle = JSON.parse(resolvedLanguage !== defaultLanguage + ? (0, fs_extra_1.readFileSync)((0, path_1.resolve)(rootPath, defaultLanguage), "utf-8") + : "{}"); + const resolvedLanguageBundle = JSON.parse((0, fs_extra_1.readFileSync)(languageFilePath, "utf-8")); + return { ...defaultLanguageBundle, ...resolvedLanguageBundle }; + } + catch (err) { + throw err; + } + } + recurseCandidates(rootPath, format, candidate) { + const filename = format.replace("{0}", `.${candidate}`); + const filepath = (0, path_1.resolve)(rootPath, filename); + if ((0, fs_extra_1.existsSync)(filepath)) { + return filename; + } + if (candidate.split("-")[0] !== candidate) { + return this.recurseCandidates(rootPath, format, candidate.split("-")[0]); + } + return format.replace("{0}", ""); + } +} +exports.Localize = Localize; +exports["default"] = Localize.prototype.localize.bind(new Localize()); + + +/***/ }), +/* 48 */ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CustomConfig = void 0; +const environmentPath_1 = __webpack_require__(2); +class CustomConfig { + ignoreUploadFiles = [ + "state.*", + "syncLocalSettings.json", + ".DS_Store", + "sync.lock", + "projects.json", + "projects_cache_vscode.json", + "projects_cache_git.json", + "projects_cache_svn.json", + "gpm_projects.json", + "gpm-recentItems.json" + ]; + ignoreUploadFolders = ["workspaceStorage"]; + ignoreExtensions = []; + gistDescription = "Visual Studio Code Settings Sync Gist"; + version = environmentPath_1.Environment.CURRENT_VERSION; + token = ""; + downloadPublicGist = false; + supportedFileExtensions = ["json", "code-snippets"]; + openTokenLink = true; + disableUpdateMessage = false; + lastUpload = null; + lastDownload = null; + githubEnterpriseUrl = null; + askGistDescription = false; + customFiles = {}; + hostName = null; + universalKeybindings = false; + autoUploadDelay = 20; +} +exports.CustomConfig = CustomConfig; + + +/***/ }), +/* 49 */ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ExtensionConfig = void 0; +class ExtensionConfig { + gist = null; + quietSync = false; + removeExtensions = true; + syncExtensions = true; + autoDownload = false; + autoUpload = false; + forceDownload = false; + forceUpload = false; +} +exports.ExtensionConfig = ExtensionConfig; + + +/***/ }), +/* 50 */ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.LocalConfig = void 0; +const customConfig_model_1 = __webpack_require__(48); +const extensionConfig_model_1 = __webpack_require__(49); +class LocalConfig { + publicGist = false; + userName = null; + name = null; + extConfig = new extensionConfig_model_1.ExtensionConfig(); + customConfig = new customConfig_model_1.CustomConfig(); +} +exports.LocalConfig = LocalConfig; + + +/***/ }), +/* 51 */ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AutoUploadService = void 0; +const vscode = __importStar(__webpack_require__(1)); +const vscode_chokidar_1 = __webpack_require__(52); +const localize_1 = __importDefault(__webpack_require__(47)); +const lockfile_1 = __importDefault(__webpack_require__(250)); +const state_1 = __webpack_require__(5); +const util_1 = __webpack_require__(254); +const file_service_1 = __webpack_require__(255); +class AutoUploadService { + ignored; + static GetIgnoredItems(customSettings) { + return [ + ...customSettings.ignoreUploadFolders.map(folder => `**/${folder}/**`), + ...customSettings.ignoreUploadFiles.map(file => `**/${file}`) + ]; + } + watching = false; + watcher = (0, vscode_chokidar_1.watch)(state_1.state.environment.USER_FOLDER, { + depth: 2, + ignored: this.ignored + }); + constructor(ignored) { + this.ignored = ignored; + vscode.extensions.onDidChange(async () => { + if (this.watching && vscode.window.state.focused) { + console.log("Sync: Extensions changed"); + if (await lockfile_1.default.Check(state_1.state.environment.FILE_SYNC_LOCK)) { + return; + } + else { + await lockfile_1.default.Lock(state_1.state.environment.FILE_SYNC_LOCK); + } + const customConfig = await state_1.state.commons.GetCustomSettings(); + if (!customConfig.downloadPublicGist) { + await this.InitiateAutoUpload(); + } + await lockfile_1.default.Unlock(state_1.state.environment.FILE_SYNC_LOCK); + return; + } + }); + } + async StartWatching() { + this.StopWatching(); + this.watching = true; + this.watcher.addListener("change", async (path) => { + if (this.watching && vscode.window.state.focused) { + console.log(`Sync: ${file_service_1.FileService.ExtractFileName(path)} changed`); + if (await lockfile_1.default.Check(state_1.state.environment.FILE_SYNC_LOCK)) { + return; + } + else { + await lockfile_1.default.Lock(state_1.state.environment.FILE_SYNC_LOCK); + } + const customConfig = await state_1.state.commons.GetCustomSettings(); + if (customConfig) { + const fileType = path + .substring(path.lastIndexOf("."), path.length) + .slice(1); + if (customConfig.supportedFileExtensions.includes(fileType) && + !customConfig.downloadPublicGist) { + await this.InitiateAutoUpload(); + } + } + await lockfile_1.default.Unlock(state_1.state.environment.FILE_SYNC_LOCK); + return; + } + }); + } + StopWatching() { + if (this.watcher) { + this.watcher.removeAllListeners(); + } + this.watching = false; + } + async InitiateAutoUpload() { + const customSettings = await state_1.state.commons.GetCustomSettings(); + vscode.window.setStatusBarMessage("").dispose(); + vscode.window.setStatusBarMessage((0, localize_1.default)("common.info.initAutoUpload").replace("{0}", customSettings.autoUploadDelay), 5000); + await util_1.Util.Sleep(customSettings.autoUploadDelay * 1000); + vscode.commands.executeCommand("extension.updateSettings", "forceUpdate"); + } +} +exports.AutoUploadService = AutoUploadService; + + +/***/ }), +/* 52 */ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +var EventEmitter = (__webpack_require__(53).EventEmitter); +var fs = __webpack_require__(11); +var sysPath = __webpack_require__(3); +var asyncEach = __webpack_require__(54); +var anymatch = __webpack_require__(55); +var globParent = __webpack_require__(63); +var isGlob = __webpack_require__(68); +var isAbsolute = __webpack_require__(69); +var inherits = __webpack_require__(70); +var braces = __webpack_require__(72); +var normalizePath = __webpack_require__(62); +var upath = __webpack_require__(187); + +var NodeFsHandler = __webpack_require__(188); +var FsEventsHandler = __webpack_require__(249); + +var arrify = function(value) { + if (value == null) return []; + return Array.isArray(value) ? value : [value]; +}; + +var flatten = function(list, result) { + if (result == null) result = []; + list.forEach(function(item) { + if (Array.isArray(item)) { + flatten(item, result); + } else { + result.push(item); + } + }); + return result; +}; + +// Little isString util for use in Array#every. +var isString = function(thing) { + return typeof thing === 'string'; +}; + +// Public: Main class. +// Watches files & directories for changes. +// +// * _opts - object, chokidar options hash +// +// Emitted events: +// `add`, `addDir`, `change`, `unlink`, `unlinkDir`, `all`, `error` +// +// Examples +// +// var watcher = new FSWatcher() +// .add(directories) +// .on('add', path => console.log('File', path, 'was added')) +// .on('change', path => console.log('File', path, 'was changed')) +// .on('unlink', path => console.log('File', path, 'was removed')) +// .on('all', (event, path) => console.log(path, ' emitted ', event)) +// +function FSWatcher(_opts) { + EventEmitter.call(this); + var opts = {}; + // in case _opts that is passed in is a frozen object + if (_opts) for (var opt in _opts) opts[opt] = _opts[opt]; + this._watched = Object.create(null); + this._closers = Object.create(null); + this._ignoredPaths = Object.create(null); + Object.defineProperty(this, '_globIgnored', { + get: function() { return Object.keys(this._ignoredPaths); } + }); + this.closed = false; + this._throttled = Object.create(null); + this._symlinkPaths = Object.create(null); + + function undef(key) { + return opts[key] === undefined; + } + + // Set up default options. + if (undef('persistent')) opts.persistent = true; + if (undef('ignoreInitial')) opts.ignoreInitial = false; + if (undef('ignorePermissionErrors')) opts.ignorePermissionErrors = false; + if (undef('interval')) opts.interval = 100; + if (undef('binaryInterval')) opts.binaryInterval = 300; + if (undef('disableGlobbing')) opts.disableGlobbing = false; + this.enableBinaryInterval = opts.binaryInterval !== opts.interval; + + // Enable fsevents on OS X when polling isn't explicitly enabled. + if (undef('useFsEvents')) opts.useFsEvents = !opts.usePolling; + + // If we can't use fsevents, ensure the options reflect it's disabled. + if (!FsEventsHandler.canUse()) opts.useFsEvents = false; + + // Use polling on Mac if not using fsevents. + // Other platforms use non-polling fs.watch. + if (undef('usePolling') && !opts.useFsEvents) { + opts.usePolling = process.platform === 'darwin'; + } + + // Global override (useful for end-developers that need to force polling for all + // instances of chokidar, regardless of usage/dependency depth) + var envPoll = process.env.CHOKIDAR_USEPOLLING; + if (envPoll !== undefined) { + var envLower = envPoll.toLowerCase(); + + if (envLower === 'false' || envLower === '0') { + opts.usePolling = false; + } else if (envLower === 'true' || envLower === '1') { + opts.usePolling = true; + } else { + opts.usePolling = !!envLower + } + } + var envInterval = process.env.CHOKIDAR_INTERVAL; + if (envInterval) { + opts.interval = parseInt(envInterval); + } + + // Editor atomic write normalization enabled by default with fs.watch + if (undef('atomic')) opts.atomic = !opts.usePolling && !opts.useFsEvents; + if (opts.atomic) this._pendingUnlinks = Object.create(null); + + if (undef('followSymlinks')) opts.followSymlinks = true; + + if (undef('awaitWriteFinish')) opts.awaitWriteFinish = false; + if (opts.awaitWriteFinish === true) opts.awaitWriteFinish = {}; + var awf = opts.awaitWriteFinish; + if (awf) { + if (!awf.stabilityThreshold) awf.stabilityThreshold = 2000; + if (!awf.pollInterval) awf.pollInterval = 100; + + this._pendingWrites = Object.create(null); + } + if (opts.ignored) opts.ignored = arrify(opts.ignored); + + this._isntIgnored = function(path, stat) { + return !this._isIgnored(path, stat); + }.bind(this); + + var readyCalls = 0; + this._emitReady = function() { + if (++readyCalls >= this._readyCount) { + this._emitReady = Function.prototype; + this._readyEmitted = true; + // use process.nextTick to allow time for listener to be bound + process.nextTick(this.emit.bind(this, 'ready')); + } + }.bind(this); + + this.options = opts; + + // You’re frozen when your heart’s not open. + Object.freeze(opts); +} + +inherits(FSWatcher, EventEmitter); + +// Common helpers +// -------------- + +// Private method: Normalize and emit events +// +// * event - string, type of event +// * path - string, file or directory path +// * val[1..3] - arguments to be passed with event +// +// Returns the error if defined, otherwise the value of the +// FSWatcher instance's `closed` flag +FSWatcher.prototype._emit = function(event, path, val1, val2, val3) { + if (this.options.cwd) path = sysPath.relative(this.options.cwd, path); + var args = [event, path]; + if (val3 !== undefined) args.push(val1, val2, val3); + else if (val2 !== undefined) args.push(val1, val2); + else if (val1 !== undefined) args.push(val1); + + var awf = this.options.awaitWriteFinish; + if (awf && this._pendingWrites[path]) { + this._pendingWrites[path].lastChange = new Date(); + return this; + } + + if (this.options.atomic) { + if (event === 'unlink') { + this._pendingUnlinks[path] = args; + setTimeout(function() { + Object.keys(this._pendingUnlinks).forEach(function(path) { + this.emit.apply(this, this._pendingUnlinks[path]); + this.emit.apply(this, ['all'].concat(this._pendingUnlinks[path])); + delete this._pendingUnlinks[path]; + }.bind(this)); + }.bind(this), typeof this.options.atomic === "number" + ? this.options.atomic + : 100); + return this; + } else if (event === 'add' && this._pendingUnlinks[path]) { + event = args[0] = 'change'; + delete this._pendingUnlinks[path]; + } + } + + var emitEvent = function() { + this.emit.apply(this, args); + if (event !== 'error') this.emit.apply(this, ['all'].concat(args)); + }.bind(this); + + if (awf && (event === 'add' || event === 'change') && this._readyEmitted) { + var awfEmit = function(err, stats) { + if (err) { + event = args[0] = 'error'; + args[1] = err; + emitEvent(); + } else if (stats) { + // if stats doesn't exist the file must have been deleted + if (args.length > 2) { + args[2] = stats; + } else { + args.push(stats); + } + emitEvent(); + } + }; + + this._awaitWriteFinish(path, awf.stabilityThreshold, event, awfEmit); + return this; + } + + if (event === 'change') { + if (!this._throttle('change', path, 50)) return this; + } + + if ( + this.options.alwaysStat && val1 === undefined && + (event === 'add' || event === 'addDir' || event === 'change') + ) { + var fullPath = this.options.cwd ? sysPath.join(this.options.cwd, path) : path; + fs.stat(fullPath, function(error, stats) { + // Suppress event when fs.stat fails, to avoid sending undefined 'stat' + if (error || !stats) return; + + args.push(stats); + emitEvent(); + }); + } else { + emitEvent(); + } + + return this; +}; + +// Private method: Common handler for errors +// +// * error - object, Error instance +// +// Returns the error if defined, otherwise the value of the +// FSWatcher instance's `closed` flag +FSWatcher.prototype._handleError = function(error) { + var code = error && error.code; + var ipe = this.options.ignorePermissionErrors; + if (error && + code !== 'ENOENT' && + code !== 'ENOTDIR' && + (!ipe || (code !== 'EPERM' && code !== 'EACCES')) + ) this.emit('error', error); + return error || this.closed; +}; + +// Private method: Helper utility for throttling +// +// * action - string, type of action being throttled +// * path - string, path being acted upon +// * timeout - int, duration of time to suppress duplicate actions +// +// Returns throttle tracking object or false if action should be suppressed +FSWatcher.prototype._throttle = function(action, path, timeout) { + if (!(action in this._throttled)) { + this._throttled[action] = Object.create(null); + } + var throttled = this._throttled[action]; + if (path in throttled) { + throttled[path].count++; + return false; + } + function clear() { + var count = throttled[path] ? throttled[path].count : 0; + delete throttled[path]; + clearTimeout(timeoutObject); + return count; + } + var timeoutObject = setTimeout(clear, timeout); + throttled[path] = {timeoutObject: timeoutObject, clear: clear, count: 0}; + return throttled[path]; +}; + +// Private method: Awaits write operation to finish +// +// * path - string, path being acted upon +// * threshold - int, time in milliseconds a file size must be fixed before +// acknowledging write operation is finished +// * awfEmit - function, to be called when ready for event to be emitted +// Polls a newly created file for size variations. When files size does not +// change for 'threshold' milliseconds calls callback. +FSWatcher.prototype._awaitWriteFinish = function(path, threshold, event, awfEmit) { + var timeoutHandler; + + var fullPath = path; + if (this.options.cwd && !isAbsolute(path)) { + fullPath = sysPath.join(this.options.cwd, path); + } + + var now = new Date(); + + var awaitWriteFinish = (function (prevStat) { + fs.stat(fullPath, function(err, curStat) { + if (err || !(path in this._pendingWrites)) { + if (err && err.code !== 'ENOENT') awfEmit(err); + return; + } + + var now = new Date(); + + if (prevStat && curStat.size != prevStat.size) { + this._pendingWrites[path].lastChange = now; + } + + if (now - this._pendingWrites[path].lastChange >= threshold) { + delete this._pendingWrites[path]; + awfEmit(null, curStat); + } else { + timeoutHandler = setTimeout( + awaitWriteFinish.bind(this, curStat), + this.options.awaitWriteFinish.pollInterval + ); + } + }.bind(this)); + }.bind(this)); + + if (!(path in this._pendingWrites)) { + this._pendingWrites[path] = { + lastChange: now, + cancelWait: function() { + delete this._pendingWrites[path]; + clearTimeout(timeoutHandler); + return event; + }.bind(this) + }; + timeoutHandler = setTimeout( + awaitWriteFinish.bind(this), + this.options.awaitWriteFinish.pollInterval + ); + } +}; + +// Private method: Determines whether user has asked to ignore this path +// +// * path - string, path to file or directory +// * stats - object, result of fs.stat +// +// Returns boolean +var dotRe = /\..*\.(sw[px])$|\~$|\.subl.*\.tmp/; +FSWatcher.prototype._isIgnored = function(path, stats) { + if (this.options.atomic && dotRe.test(path)) return true; + + if (!this._userIgnored) { + var cwd = this.options.cwd; + var ignored = this.options.ignored; + if (cwd && ignored) { + ignored = ignored.map(function (path) { + if (typeof path !== 'string') return path; + return upath.normalize(isAbsolute(path) ? path : sysPath.join(cwd, path)); + }); + } + var paths = arrify(ignored) + .filter(function(path) { + return typeof path === 'string' && !isGlob(path); + }).map(function(path) { + return path + '/**'; + }); + this._userIgnored = anymatch( + this._globIgnored.concat(ignored).concat(paths) + ); + } + + return this._userIgnored([path, stats]); +}; + +// Private method: Provides a set of common helpers and properties relating to +// symlink and glob handling +// +// * path - string, file, directory, or glob pattern being watched +// * depth - int, at any depth > 0, this isn't a glob +// +// Returns object containing helpers for this path +var replacerRe = /^\.[\/\\]/; +FSWatcher.prototype._getWatchHelpers = function(path, depth) { + path = path.replace(replacerRe, ''); + var watchPath = depth || this.options.disableGlobbing || !isGlob(path) ? path : globParent(path); + var fullWatchPath = sysPath.resolve(watchPath); + var hasGlob = watchPath !== path; + var globFilter = hasGlob ? anymatch(path) : false; + var follow = this.options.followSymlinks; + var globSymlink = hasGlob && follow ? null : false; + + var checkGlobSymlink = function(entry) { + // only need to resolve once + // first entry should always have entry.parentDir === '' + if (globSymlink == null) { + globSymlink = entry.fullParentDir === fullWatchPath ? false : { + realPath: entry.fullParentDir, + linkPath: fullWatchPath + }; + } + + if (globSymlink) { + return entry.fullPath.replace(globSymlink.realPath, globSymlink.linkPath); + } + + return entry.fullPath; + }; + + var entryPath = function(entry) { + return sysPath.join(watchPath, + sysPath.relative(watchPath, checkGlobSymlink(entry)) + ); + }; + + var filterPath = function(entry) { + if (entry.stat && entry.stat.isSymbolicLink()) return filterDir(entry); + var resolvedPath = entryPath(entry); + return (!hasGlob || globFilter(resolvedPath)) && + this._isntIgnored(resolvedPath, entry.stat) && + (this.options.ignorePermissionErrors || + this._hasReadPermissions(entry.stat)); + }.bind(this); + + var getDirParts = function(path) { + if (!hasGlob) return false; + var parts = []; + var expandedPath = braces.expand(path); + expandedPath.forEach(function(path) { + parts.push(sysPath.relative(watchPath, path).split(/[\/\\]/)); + }); + return parts; + }; + + var dirParts = getDirParts(path); + if (dirParts) { + dirParts.forEach(function(parts) { + if (parts.length > 1) parts.pop(); + }); + } + var unmatchedGlob; + + var filterDir = function(entry) { + if (hasGlob) { + var entryParts = getDirParts(checkGlobSymlink(entry)); + var globstar = false; + unmatchedGlob = !dirParts.some(function(parts) { + return parts.every(function(part, i) { + if (part === '**') globstar = true; + return globstar || !entryParts[0][i] || anymatch(part, entryParts[0][i]); + }); + }); + } + return !unmatchedGlob && this._isntIgnored(entryPath(entry), entry.stat); + }.bind(this); + + return { + followSymlinks: follow, + statMethod: follow ? 'stat' : 'lstat', + path: path, + watchPath: watchPath, + entryPath: entryPath, + hasGlob: hasGlob, + globFilter: globFilter, + filterPath: filterPath, + filterDir: filterDir + }; +}; + +// Directory helpers +// ----------------- + +// Private method: Provides directory tracking objects +// +// * directory - string, path of the directory +// +// Returns the directory's tracking object +FSWatcher.prototype._getWatchedDir = function(directory) { + var dir = sysPath.resolve(directory); + var watcherRemove = this._remove.bind(this); + if (!(dir in this._watched)) this._watched[dir] = { + _items: Object.create(null), + add: function(item) { + if (item !== '.' && item !== '..') this._items[item] = true; + }, + remove: function(item) { + delete this._items[item]; + if (!this.children().length) { + fs.readdir(dir, function(err) { + if (err) watcherRemove(sysPath.dirname(dir), sysPath.basename(dir)); + }); + } + }, + has: function(item) {return item in this._items;}, + children: function() {return Object.keys(this._items);} + }; + return this._watched[dir]; +}; + +// File helpers +// ------------ + +// Private method: Check for read permissions +// Based on this answer on SO: http://stackoverflow.com/a/11781404/1358405 +// +// * stats - object, result of fs.stat +// +// Returns boolean +FSWatcher.prototype._hasReadPermissions = function(stats) { + return Boolean(4 & parseInt(((stats && stats.mode) & 0x1ff).toString(8)[0], 10)); +}; + +// Private method: Handles emitting unlink events for +// files and directories, and via recursion, for +// files and directories within directories that are unlinked +// +// * directory - string, directory within which the following item is located +// * item - string, base path of item/directory +// +// Returns nothing +FSWatcher.prototype._remove = function(directory, item) { + // if what is being deleted is a directory, get that directory's paths + // for recursive deleting and cleaning of watched object + // if it is not a directory, nestedDirectoryChildren will be empty array + var path = sysPath.join(directory, item); + var fullPath = sysPath.resolve(path); + var isDirectory = this._watched[path] || this._watched[fullPath]; + + // prevent duplicate handling in case of arriving here nearly simultaneously + // via multiple paths (such as _handleFile and _handleDir) + if (!this._throttle('remove', path, 100)) return; + + // if the only watched file is removed, watch for its return + var watchedDirs = Object.keys(this._watched); + if (!isDirectory && !this.options.useFsEvents && watchedDirs.length === 1) { + this.add(directory, item, true); + } + + // This will create a new entry in the watched object in either case + // so we got to do the directory check beforehand + var nestedDirectoryChildren = this._getWatchedDir(path).children(); + + // Recursively remove children directories / files. + nestedDirectoryChildren.forEach(function(nestedItem) { + this._remove(path, nestedItem); + }, this); + + // Check if item was on the watched list and remove it + var parent = this._getWatchedDir(directory); + var wasTracked = parent.has(item); + parent.remove(item); + + // If we wait for this file to be fully written, cancel the wait. + var relPath = path; + if (this.options.cwd) relPath = sysPath.relative(this.options.cwd, path); + if (this.options.awaitWriteFinish && this._pendingWrites[relPath]) { + var event = this._pendingWrites[relPath].cancelWait(); + if (event === 'add') return; + } + + // The Entry will either be a directory that just got removed + // or a bogus entry to a file, in either case we have to remove it + delete this._watched[path]; + delete this._watched[fullPath]; + var eventName = isDirectory ? 'unlinkDir' : 'unlink'; + if (wasTracked && !this._isIgnored(path)) this._emit(eventName, path); + + // Avoid conflicts if we later create another file with the same name + if (!this.options.useFsEvents) { + this._closePath(path); + } +}; + +FSWatcher.prototype._closePath = function(path) { + if (!this._closers[path]) return; + this._closers[path].forEach(function(closer) { + closer(); + }); + delete this._closers[path]; + this._getWatchedDir(sysPath.dirname(path)).remove(sysPath.basename(path)); +} + +// Public method: Adds paths to be watched on an existing FSWatcher instance + +// * paths - string or array of strings, file/directory paths and/or globs +// * _origAdd - private boolean, for handling non-existent paths to be watched +// * _internal - private boolean, indicates a non-user add + +// Returns an instance of FSWatcher for chaining. +FSWatcher.prototype.add = function(paths, _origAdd, _internal) { + var disableGlobbing = this.options.disableGlobbing; + var cwd = this.options.cwd; + this.closed = false; + paths = flatten(arrify(paths)); + + if (!paths.every(isString)) { + throw new TypeError('Non-string provided as watch path: ' + paths); + } + + if (cwd) paths = paths.map(function(path) { + var absPath; + if (isAbsolute(path)) { + absPath = path; + } else if (path[0] === '!') { + absPath = '!' + sysPath.join(cwd, path.substring(1)); + } else { + absPath = sysPath.join(cwd, path); + } + + // Check `path` instead of `absPath` because the cwd portion can't be a glob + if (disableGlobbing || !isGlob(path)) { + return absPath; + } else { + return normalizePath(absPath); + } + }); + + // set aside negated glob strings + paths = paths.filter(function(path) { + if (path[0] === '!') { + this._ignoredPaths[path.substring(1)] = true; + } else { + // if a path is being added that was previously ignored, stop ignoring it + delete this._ignoredPaths[path]; + delete this._ignoredPaths[path + '/**']; + + // reset the cached userIgnored anymatch fn + // to make ignoredPaths changes effective + this._userIgnored = null; + + return true; + } + }, this); + + if (this.options.useFsEvents && FsEventsHandler.canUse()) { + if (!this._readyCount) this._readyCount = paths.length; + if (this.options.persistent) this._readyCount *= 2; + paths.forEach(this._addToFsEvents, this); + } else { + if (!this._readyCount) this._readyCount = 0; + this._readyCount += paths.length; + asyncEach(paths, function(path, next) { + this._addToNodeFs(path, !_internal, 0, 0, _origAdd, function(err, res) { + if (res) this._emitReady(); + next(err, res); + }.bind(this)); + }.bind(this), function(error, results) { + results.forEach(function(item) { + if (!item || this.closed) return; + this.add(sysPath.dirname(item), sysPath.basename(_origAdd || item)); + }, this); + }.bind(this)); + } + + return this; +}; + +// Public method: Close watchers or start ignoring events from specified paths. + +// * paths - string or array of strings, file/directory paths and/or globs + +// Returns instance of FSWatcher for chaining. +FSWatcher.prototype.unwatch = function(paths) { + if (this.closed) return this; + paths = flatten(arrify(paths)); + + paths.forEach(function(path) { + // convert to absolute path unless relative path already matches + if (!isAbsolute(path) && !this._closers[path]) { + if (this.options.cwd) path = sysPath.join(this.options.cwd, path); + path = sysPath.resolve(path); + } + + this._closePath(path); + + this._ignoredPaths[path] = true; + if (path in this._watched) { + this._ignoredPaths[path + '/**'] = true; + } + + // reset the cached userIgnored anymatch fn + // to make ignoredPaths changes effective + this._userIgnored = null; + }, this); + + return this; +}; + +// Public method: Close watchers and remove all listeners from watched paths. + +// Returns instance of FSWatcher for chaining. +FSWatcher.prototype.close = function() { + if (this.closed) return this; + + this.closed = true; + Object.keys(this._closers).forEach(function(watchPath) { + this._closers[watchPath].forEach(function(closer) { + closer(); + }); + delete this._closers[watchPath]; + }, this); + this._watched = Object.create(null); + + this.removeAllListeners(); + return this; +}; + +// Public method: Expose list of watched paths + +// Returns object w/ dir paths as keys and arrays of contained paths as values. +FSWatcher.prototype.getWatched = function() { + var watchList = {}; + Object.keys(this._watched).forEach(function(dir) { + var key = this.options.cwd ? sysPath.relative(this.options.cwd, dir) : dir; + watchList[key || '.'] = Object.keys(this._watched[dir]._items).sort(); + }.bind(this)); + return watchList; +}; + +// Attach watch handler prototype methods +function importHandler(handler) { + Object.keys(handler.prototype).forEach(function(method) { + FSWatcher.prototype[method] = handler.prototype[method]; + }); +} +importHandler(NodeFsHandler); +if (FsEventsHandler.canUse()) importHandler(FsEventsHandler); + +// Export FSWatcher class +exports.FSWatcher = FSWatcher; + +// Public function: Instantiates watcher with paths to be tracked. + +// * paths - string or array of strings, file/directory paths and/or globs +// * options - object, chokidar options + +// Returns an instance of FSWatcher for chaining. +exports.watch = function(paths, options) { + return new FSWatcher(options).add(paths); +}; + + +/***/ }), +/* 53 */ +/***/ ((module) => { + +"use strict"; +module.exports = require("events"); + +/***/ }), +/* 54 */ +/***/ (function(module, exports) { + +var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! async-each - MIT License (c) 2016 Paul Miller (paulmillr.com) */ +(function (globals) { + 'use strict'; + var each = function (items, next, callback) { + if (!Array.isArray(items)) throw new TypeError('each() expects array as first argument'); + if (typeof next !== 'function') + throw new TypeError('each() expects function as second argument'); + if (typeof callback !== 'function') callback = Function.prototype; // no-op + + var total = items.length; + if (total === 0) return callback(undefined, items); + var transformed = new Array(total); + var transformedCount = 0; + var returned = false; + + items.forEach(function (item, index) { + next(item, function (error, transformedItem) { + if (returned) return; + if (error) { + returned = true; + return callback(error); + } + transformed[index] = transformedItem; + transformedCount += 1; // can't use index: last item could take more time + if (transformedCount === total) return callback(undefined, transformed); + }); + }); + }; + + if (true) { + !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function () { + return each; + }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), + __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); // RequireJS + } else {} +})(this); + + +/***/ }), +/* 55 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +const picomatch = __webpack_require__(56); +const normalizePath = __webpack_require__(62); + +/** + * @typedef {(testString: string) => boolean} AnymatchFn + * @typedef {string|RegExp|AnymatchFn} AnymatchPattern + * @typedef {AnymatchPattern|AnymatchPattern[]} AnymatchMatcher + */ +const BANG = '!'; +const arrify = (item) => Array.isArray(item) ? item : [item]; + +/** + * @param {AnymatchPattern} matcher + * @returns {AnymatchFn} + */ +const createPattern = (matcher) => { + if (typeof matcher === 'function') { + return matcher; + } + if (typeof matcher === 'string') { + const glob = picomatch(matcher, { dot: true }); + return (string) => matcher === string || glob(string); + } + if (matcher instanceof RegExp) { + return (string) => matcher.test(string); + } + return (string) => false; +}; + +/** + * @param {Array} patterns + * @param {Array} negatedGlobs + * @param {String|Array} path + * @param {Boolean} returnIndex + * @returns {boolean|number} + */ +const matchPatterns = (patterns, negatedGlobs, path, returnIndex) => { + const additionalArgs = Array.isArray(path); + const upath = normalizePath(additionalArgs ? path[0] : path); + for (let index = 0; index < negatedGlobs.length; index++) { + const nglob = negatedGlobs[index]; + if (nglob(upath)) { + return returnIndex ? -1 : false; + } + } + const args = additionalArgs && [upath].concat(path.slice(1)); + for (let index = 0; index < patterns.length; index++) { + const pattern = patterns[index]; + if (additionalArgs ? pattern(...args) : pattern(upath)) { + return returnIndex ? index : true; + } + } + + return returnIndex ? -1 : false; +}; + +/** + * @param {AnymatchMatcher} matchers + * @param {Array|string} testString + * @param {boolean=} returnIndex + * @returns {boolean|number|Function} + */ +const anymatch = (matchers, testString, returnIndex = false) => { + if (matchers == null) { + throw new TypeError('anymatch: specify first argument'); + } + // Early cache for matchers. + const mtchers = arrify(matchers); + const negatedGlobs = mtchers + .filter(item => typeof item === 'string' && item.charAt(0) === BANG) + .map(item => item.slice(1)) + .map(item => picomatch(item, { dot: true })); + const patterns = mtchers.map(createPattern); + + if (testString == null) { + return (testString, ri = false) => { + const returnIndex = typeof ri === 'boolean' ? ri : false; + return matchPatterns(patterns, negatedGlobs, testString, returnIndex); + } + } + if (!Array.isArray(testString) && typeof testString !== 'string') { + throw new TypeError('anymatch: second argument must be a string: got ' + + Object.prototype.toString.call(testString)) + } + + return matchPatterns(patterns, negatedGlobs, testString, returnIndex); +}; + +module.exports = anymatch; + + +/***/ }), +/* 56 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +module.exports = __webpack_require__(57); + + +/***/ }), +/* 57 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +const path = __webpack_require__(3); +const scan = __webpack_require__(58); +const parse = __webpack_require__(61); +const utils = __webpack_require__(59); +const constants = __webpack_require__(60); +const isObject = val => val && typeof val === 'object' && !Array.isArray(val); + +/** + * Creates a matcher function from one or more glob patterns. The + * returned function takes a string to match as its first argument, + * and returns true if the string is a match. The returned matcher + * function also takes a boolean as the second argument that, when true, + * returns an object with additional information. + * + * ```js + * const picomatch = require('picomatch'); + * // picomatch(glob[, options]); + * + * const isMatch = picomatch('*.!(*a)'); + * console.log(isMatch('a.a')); //=> false + * console.log(isMatch('a.b')); //=> true + * ``` + * @name picomatch + * @param {String|Array} `globs` One or more glob patterns. + * @param {Object=} `options` + * @return {Function=} Returns a matcher function. + * @api public + */ + +const picomatch = (glob, options, returnState = false) => { + if (Array.isArray(glob)) { + const fns = glob.map(input => picomatch(input, options, returnState)); + const arrayMatcher = str => { + for (const isMatch of fns) { + const state = isMatch(str); + if (state) return state; + } + return false; + }; + return arrayMatcher; + } + + const isState = isObject(glob) && glob.tokens && glob.input; + + if (glob === '' || (typeof glob !== 'string' && !isState)) { + throw new TypeError('Expected pattern to be a non-empty string'); + } + + const opts = options || {}; + const posix = utils.isWindows(options); + const regex = isState + ? picomatch.compileRe(glob, options) + : picomatch.makeRe(glob, options, false, true); + + const state = regex.state; + delete regex.state; + + let isIgnored = () => false; + if (opts.ignore) { + const ignoreOpts = { ...options, ignore: null, onMatch: null, onResult: null }; + isIgnored = picomatch(opts.ignore, ignoreOpts, returnState); + } + + const matcher = (input, returnObject = false) => { + const { isMatch, match, output } = picomatch.test(input, regex, options, { glob, posix }); + const result = { glob, state, regex, posix, input, output, match, isMatch }; + + if (typeof opts.onResult === 'function') { + opts.onResult(result); + } + + if (isMatch === false) { + result.isMatch = false; + return returnObject ? result : false; + } + + if (isIgnored(input)) { + if (typeof opts.onIgnore === 'function') { + opts.onIgnore(result); + } + result.isMatch = false; + return returnObject ? result : false; + } + + if (typeof opts.onMatch === 'function') { + opts.onMatch(result); + } + return returnObject ? result : true; + }; + + if (returnState) { + matcher.state = state; + } + + return matcher; +}; + +/** + * Test `input` with the given `regex`. This is used by the main + * `picomatch()` function to test the input string. + * + * ```js + * const picomatch = require('picomatch'); + * // picomatch.test(input, regex[, options]); + * + * console.log(picomatch.test('foo/bar', /^(?:([^/]*?)\/([^/]*?))$/)); + * // { isMatch: true, match: [ 'foo/', 'foo', 'bar' ], output: 'foo/bar' } + * ``` + * @param {String} `input` String to test. + * @param {RegExp} `regex` + * @return {Object} Returns an object with matching info. + * @api public + */ + +picomatch.test = (input, regex, options, { glob, posix } = {}) => { + if (typeof input !== 'string') { + throw new TypeError('Expected input to be a string'); + } + + if (input === '') { + return { isMatch: false, output: '' }; + } + + const opts = options || {}; + const format = opts.format || (posix ? utils.toPosixSlashes : null); + let match = input === glob; + let output = (match && format) ? format(input) : input; + + if (match === false) { + output = format ? format(input) : input; + match = output === glob; + } + + if (match === false || opts.capture === true) { + if (opts.matchBase === true || opts.basename === true) { + match = picomatch.matchBase(input, regex, options, posix); + } else { + match = regex.exec(output); + } + } + + return { isMatch: Boolean(match), match, output }; +}; + +/** + * Match the basename of a filepath. + * + * ```js + * const picomatch = require('picomatch'); + * // picomatch.matchBase(input, glob[, options]); + * console.log(picomatch.matchBase('foo/bar.js', '*.js'); // true + * ``` + * @param {String} `input` String to test. + * @param {RegExp|String} `glob` Glob pattern or regex created by [.makeRe](#makeRe). + * @return {Boolean} + * @api public + */ + +picomatch.matchBase = (input, glob, options, posix = utils.isWindows(options)) => { + const regex = glob instanceof RegExp ? glob : picomatch.makeRe(glob, options); + return regex.test(path.basename(input)); +}; + +/** + * Returns true if **any** of the given glob `patterns` match the specified `string`. + * + * ```js + * const picomatch = require('picomatch'); + * // picomatch.isMatch(string, patterns[, options]); + * + * console.log(picomatch.isMatch('a.a', ['b.*', '*.a'])); //=> true + * console.log(picomatch.isMatch('a.a', 'b.*')); //=> false + * ``` + * @param {String|Array} str The string to test. + * @param {String|Array} patterns One or more glob patterns to use for matching. + * @param {Object} [options] See available [options](#options). + * @return {Boolean} Returns true if any patterns match `str` + * @api public + */ + +picomatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str); + +/** + * Parse a glob pattern to create the source string for a regular + * expression. + * + * ```js + * const picomatch = require('picomatch'); + * const result = picomatch.parse(pattern[, options]); + * ``` + * @param {String} `pattern` + * @param {Object} `options` + * @return {Object} Returns an object with useful properties and output to be used as a regex source string. + * @api public + */ + +picomatch.parse = (pattern, options) => { + if (Array.isArray(pattern)) return pattern.map(p => picomatch.parse(p, options)); + return parse(pattern, { ...options, fastpaths: false }); +}; + +/** + * Scan a glob pattern to separate the pattern into segments. + * + * ```js + * const picomatch = require('picomatch'); + * // picomatch.scan(input[, options]); + * + * const result = picomatch.scan('!./foo/*.js'); + * console.log(result); + * { prefix: '!./', + * input: '!./foo/*.js', + * start: 3, + * base: 'foo', + * glob: '*.js', + * isBrace: false, + * isBracket: false, + * isGlob: true, + * isExtglob: false, + * isGlobstar: false, + * negated: true } + * ``` + * @param {String} `input` Glob pattern to scan. + * @param {Object} `options` + * @return {Object} Returns an object with + * @api public + */ + +picomatch.scan = (input, options) => scan(input, options); + +/** + * Compile a regular expression from the `state` object returned by the + * [parse()](#parse) method. + * + * @param {Object} `state` + * @param {Object} `options` + * @param {Boolean} `returnOutput` Intended for implementors, this argument allows you to return the raw output from the parser. + * @param {Boolean} `returnState` Adds the state to a `state` property on the returned regex. Useful for implementors and debugging. + * @return {RegExp} + * @api public + */ + +picomatch.compileRe = (state, options, returnOutput = false, returnState = false) => { + if (returnOutput === true) { + return state.output; + } + + const opts = options || {}; + const prepend = opts.contains ? '' : '^'; + const append = opts.contains ? '' : '$'; + + let source = `${prepend}(?:${state.output})${append}`; + if (state && state.negated === true) { + source = `^(?!${source}).*$`; + } + + const regex = picomatch.toRegex(source, options); + if (returnState === true) { + regex.state = state; + } + + return regex; +}; + +/** + * Create a regular expression from a parsed glob pattern. + * + * ```js + * const picomatch = require('picomatch'); + * const state = picomatch.parse('*.js'); + * // picomatch.compileRe(state[, options]); + * + * console.log(picomatch.compileRe(state)); + * //=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/ + * ``` + * @param {String} `state` The object returned from the `.parse` method. + * @param {Object} `options` + * @param {Boolean} `returnOutput` Implementors may use this argument to return the compiled output, instead of a regular expression. This is not exposed on the options to prevent end-users from mutating the result. + * @param {Boolean} `returnState` Implementors may use this argument to return the state from the parsed glob with the returned regular expression. + * @return {RegExp} Returns a regex created from the given pattern. + * @api public + */ + +picomatch.makeRe = (input, options = {}, returnOutput = false, returnState = false) => { + if (!input || typeof input !== 'string') { + throw new TypeError('Expected a non-empty string'); + } + + let parsed = { negated: false, fastpaths: true }; + + if (options.fastpaths !== false && (input[0] === '.' || input[0] === '*')) { + parsed.output = parse.fastpaths(input, options); + } + + if (!parsed.output) { + parsed = parse(input, options); + } + + return picomatch.compileRe(parsed, options, returnOutput, returnState); +}; + +/** + * Create a regular expression from the given regex source string. + * + * ```js + * const picomatch = require('picomatch'); + * // picomatch.toRegex(source[, options]); + * + * const { output } = picomatch.parse('*.js'); + * console.log(picomatch.toRegex(output)); + * //=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/ + * ``` + * @param {String} `source` Regular expression source string. + * @param {Object} `options` + * @return {RegExp} + * @api public + */ + +picomatch.toRegex = (source, options) => { + try { + const opts = options || {}; + return new RegExp(source, opts.flags || (opts.nocase ? 'i' : '')); + } catch (err) { + if (options && options.debug === true) throw err; + return /$^/; + } +}; + +/** + * Picomatch constants. + * @return {Object} + */ + +picomatch.constants = constants; + +/** + * Expose "picomatch" + */ + +module.exports = picomatch; + + +/***/ }), +/* 58 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +const utils = __webpack_require__(59); +const { + CHAR_ASTERISK, /* * */ + CHAR_AT, /* @ */ + CHAR_BACKWARD_SLASH, /* \ */ + CHAR_COMMA, /* , */ + CHAR_DOT, /* . */ + CHAR_EXCLAMATION_MARK, /* ! */ + CHAR_FORWARD_SLASH, /* / */ + CHAR_LEFT_CURLY_BRACE, /* { */ + CHAR_LEFT_PARENTHESES, /* ( */ + CHAR_LEFT_SQUARE_BRACKET, /* [ */ + CHAR_PLUS, /* + */ + CHAR_QUESTION_MARK, /* ? */ + CHAR_RIGHT_CURLY_BRACE, /* } */ + CHAR_RIGHT_PARENTHESES, /* ) */ + CHAR_RIGHT_SQUARE_BRACKET /* ] */ +} = __webpack_require__(60); + +const isPathSeparator = code => { + return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH; +}; + +const depth = token => { + if (token.isPrefix !== true) { + token.depth = token.isGlobstar ? Infinity : 1; + } +}; + +/** + * Quickly scans a glob pattern and returns an object with a handful of + * useful properties, like `isGlob`, `path` (the leading non-glob, if it exists), + * `glob` (the actual pattern), `negated` (true if the path starts with `!` but not + * with `!(`) and `negatedExtglob` (true if the path starts with `!(`). + * + * ```js + * const pm = require('picomatch'); + * console.log(pm.scan('foo/bar/*.js')); + * { isGlob: true, input: 'foo/bar/*.js', base: 'foo/bar', glob: '*.js' } + * ``` + * @param {String} `str` + * @param {Object} `options` + * @return {Object} Returns an object with tokens and regex source string. + * @api public + */ + +const scan = (input, options) => { + const opts = options || {}; + + const length = input.length - 1; + const scanToEnd = opts.parts === true || opts.scanToEnd === true; + const slashes = []; + const tokens = []; + const parts = []; + + let str = input; + let index = -1; + let start = 0; + let lastIndex = 0; + let isBrace = false; + let isBracket = false; + let isGlob = false; + let isExtglob = false; + let isGlobstar = false; + let braceEscaped = false; + let backslashes = false; + let negated = false; + let negatedExtglob = false; + let finished = false; + let braces = 0; + let prev; + let code; + let token = { value: '', depth: 0, isGlob: false }; + + const eos = () => index >= length; + const peek = () => str.charCodeAt(index + 1); + const advance = () => { + prev = code; + return str.charCodeAt(++index); + }; + + while (index < length) { + code = advance(); + let next; + + if (code === CHAR_BACKWARD_SLASH) { + backslashes = token.backslashes = true; + code = advance(); + + if (code === CHAR_LEFT_CURLY_BRACE) { + braceEscaped = true; + } + continue; + } + + if (braceEscaped === true || code === CHAR_LEFT_CURLY_BRACE) { + braces++; + + while (eos() !== true && (code = advance())) { + if (code === CHAR_BACKWARD_SLASH) { + backslashes = token.backslashes = true; + advance(); + continue; + } + + if (code === CHAR_LEFT_CURLY_BRACE) { + braces++; + continue; + } + + if (braceEscaped !== true && code === CHAR_DOT && (code = advance()) === CHAR_DOT) { + isBrace = token.isBrace = true; + isGlob = token.isGlob = true; + finished = true; + + if (scanToEnd === true) { + continue; + } + + break; + } + + if (braceEscaped !== true && code === CHAR_COMMA) { + isBrace = token.isBrace = true; + isGlob = token.isGlob = true; + finished = true; + + if (scanToEnd === true) { + continue; + } + + break; + } + + if (code === CHAR_RIGHT_CURLY_BRACE) { + braces--; + + if (braces === 0) { + braceEscaped = false; + isBrace = token.isBrace = true; + finished = true; + break; + } + } + } + + if (scanToEnd === true) { + continue; + } + + break; + } + + if (code === CHAR_FORWARD_SLASH) { + slashes.push(index); + tokens.push(token); + token = { value: '', depth: 0, isGlob: false }; + + if (finished === true) continue; + if (prev === CHAR_DOT && index === (start + 1)) { + start += 2; + continue; + } + + lastIndex = index + 1; + continue; + } + + if (opts.noext !== true) { + const isExtglobChar = code === CHAR_PLUS + || code === CHAR_AT + || code === CHAR_ASTERISK + || code === CHAR_QUESTION_MARK + || code === CHAR_EXCLAMATION_MARK; + + if (isExtglobChar === true && peek() === CHAR_LEFT_PARENTHESES) { + isGlob = token.isGlob = true; + isExtglob = token.isExtglob = true; + finished = true; + if (code === CHAR_EXCLAMATION_MARK && index === start) { + negatedExtglob = true; + } + + if (scanToEnd === true) { + while (eos() !== true && (code = advance())) { + if (code === CHAR_BACKWARD_SLASH) { + backslashes = token.backslashes = true; + code = advance(); + continue; + } + + if (code === CHAR_RIGHT_PARENTHESES) { + isGlob = token.isGlob = true; + finished = true; + break; + } + } + continue; + } + break; + } + } + + if (code === CHAR_ASTERISK) { + if (prev === CHAR_ASTERISK) isGlobstar = token.isGlobstar = true; + isGlob = token.isGlob = true; + finished = true; + + if (scanToEnd === true) { + continue; + } + break; + } + + if (code === CHAR_QUESTION_MARK) { + isGlob = token.isGlob = true; + finished = true; + + if (scanToEnd === true) { + continue; + } + break; + } + + if (code === CHAR_LEFT_SQUARE_BRACKET) { + while (eos() !== true && (next = advance())) { + if (next === CHAR_BACKWARD_SLASH) { + backslashes = token.backslashes = true; + advance(); + continue; + } + + if (next === CHAR_RIGHT_SQUARE_BRACKET) { + isBracket = token.isBracket = true; + isGlob = token.isGlob = true; + finished = true; + break; + } + } + + if (scanToEnd === true) { + continue; + } + + break; + } + + if (opts.nonegate !== true && code === CHAR_EXCLAMATION_MARK && index === start) { + negated = token.negated = true; + start++; + continue; + } + + if (opts.noparen !== true && code === CHAR_LEFT_PARENTHESES) { + isGlob = token.isGlob = true; + + if (scanToEnd === true) { + while (eos() !== true && (code = advance())) { + if (code === CHAR_LEFT_PARENTHESES) { + backslashes = token.backslashes = true; + code = advance(); + continue; + } + + if (code === CHAR_RIGHT_PARENTHESES) { + finished = true; + break; + } + } + continue; + } + break; + } + + if (isGlob === true) { + finished = true; + + if (scanToEnd === true) { + continue; + } + + break; + } + } + + if (opts.noext === true) { + isExtglob = false; + isGlob = false; + } + + let base = str; + let prefix = ''; + let glob = ''; + + if (start > 0) { + prefix = str.slice(0, start); + str = str.slice(start); + lastIndex -= start; + } + + if (base && isGlob === true && lastIndex > 0) { + base = str.slice(0, lastIndex); + glob = str.slice(lastIndex); + } else if (isGlob === true) { + base = ''; + glob = str; + } else { + base = str; + } + + if (base && base !== '' && base !== '/' && base !== str) { + if (isPathSeparator(base.charCodeAt(base.length - 1))) { + base = base.slice(0, -1); + } + } + + if (opts.unescape === true) { + if (glob) glob = utils.removeBackslashes(glob); + + if (base && backslashes === true) { + base = utils.removeBackslashes(base); + } + } + + const state = { + prefix, + input, + start, + base, + glob, + isBrace, + isBracket, + isGlob, + isExtglob, + isGlobstar, + negated, + negatedExtglob + }; + + if (opts.tokens === true) { + state.maxDepth = 0; + if (!isPathSeparator(code)) { + tokens.push(token); + } + state.tokens = tokens; + } + + if (opts.parts === true || opts.tokens === true) { + let prevIndex; + + for (let idx = 0; idx < slashes.length; idx++) { + const n = prevIndex ? prevIndex + 1 : start; + const i = slashes[idx]; + const value = input.slice(n, i); + if (opts.tokens) { + if (idx === 0 && start !== 0) { + tokens[idx].isPrefix = true; + tokens[idx].value = prefix; + } else { + tokens[idx].value = value; + } + depth(tokens[idx]); + state.maxDepth += tokens[idx].depth; + } + if (idx !== 0 || value !== '') { + parts.push(value); + } + prevIndex = i; + } + + if (prevIndex && prevIndex + 1 < input.length) { + const value = input.slice(prevIndex + 1); + parts.push(value); + + if (opts.tokens) { + tokens[tokens.length - 1].value = value; + depth(tokens[tokens.length - 1]); + state.maxDepth += tokens[tokens.length - 1].depth; + } + } + + state.slashes = slashes; + state.parts = parts; + } + + return state; +}; + +module.exports = scan; + + +/***/ }), +/* 59 */ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + + +const path = __webpack_require__(3); +const win32 = process.platform === 'win32'; +const { + REGEX_BACKSLASH, + REGEX_REMOVE_BACKSLASH, + REGEX_SPECIAL_CHARS, + REGEX_SPECIAL_CHARS_GLOBAL +} = __webpack_require__(60); + +exports.isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val); +exports.hasRegexChars = str => REGEX_SPECIAL_CHARS.test(str); +exports.isRegexChar = str => str.length === 1 && exports.hasRegexChars(str); +exports.escapeRegex = str => str.replace(REGEX_SPECIAL_CHARS_GLOBAL, '\\$1'); +exports.toPosixSlashes = str => str.replace(REGEX_BACKSLASH, '/'); + +exports.removeBackslashes = str => { + return str.replace(REGEX_REMOVE_BACKSLASH, match => { + return match === '\\' ? '' : match; + }); +}; + +exports.supportsLookbehinds = () => { + const segs = process.version.slice(1).split('.').map(Number); + if (segs.length === 3 && segs[0] >= 9 || (segs[0] === 8 && segs[1] >= 10)) { + return true; + } + return false; +}; + +exports.isWindows = options => { + if (options && typeof options.windows === 'boolean') { + return options.windows; + } + return win32 === true || path.sep === '\\'; +}; + +exports.escapeLast = (input, char, lastIdx) => { + const idx = input.lastIndexOf(char, lastIdx); + if (idx === -1) return input; + if (input[idx - 1] === '\\') return exports.escapeLast(input, char, idx - 1); + return `${input.slice(0, idx)}\\${input.slice(idx)}`; +}; + +exports.removePrefix = (input, state = {}) => { + let output = input; + if (output.startsWith('./')) { + output = output.slice(2); + state.prefix = './'; + } + return output; +}; + +exports.wrapOutput = (input, state = {}, options = {}) => { + const prepend = options.contains ? '' : '^'; + const append = options.contains ? '' : '$'; + + let output = `${prepend}(?:${input})${append}`; + if (state.negated === true) { + output = `(?:^(?!${output}).*$)`; + } + return output; +}; + + +/***/ }), +/* 60 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +const path = __webpack_require__(3); +const WIN_SLASH = '\\\\/'; +const WIN_NO_SLASH = `[^${WIN_SLASH}]`; + +/** + * Posix glob regex + */ + +const DOT_LITERAL = '\\.'; +const PLUS_LITERAL = '\\+'; +const QMARK_LITERAL = '\\?'; +const SLASH_LITERAL = '\\/'; +const ONE_CHAR = '(?=.)'; +const QMARK = '[^/]'; +const END_ANCHOR = `(?:${SLASH_LITERAL}|$)`; +const START_ANCHOR = `(?:^|${SLASH_LITERAL})`; +const DOTS_SLASH = `${DOT_LITERAL}{1,2}${END_ANCHOR}`; +const NO_DOT = `(?!${DOT_LITERAL})`; +const NO_DOTS = `(?!${START_ANCHOR}${DOTS_SLASH})`; +const NO_DOT_SLASH = `(?!${DOT_LITERAL}{0,1}${END_ANCHOR})`; +const NO_DOTS_SLASH = `(?!${DOTS_SLASH})`; +const QMARK_NO_DOT = `[^.${SLASH_LITERAL}]`; +const STAR = `${QMARK}*?`; + +const POSIX_CHARS = { + DOT_LITERAL, + PLUS_LITERAL, + QMARK_LITERAL, + SLASH_LITERAL, + ONE_CHAR, + QMARK, + END_ANCHOR, + DOTS_SLASH, + NO_DOT, + NO_DOTS, + NO_DOT_SLASH, + NO_DOTS_SLASH, + QMARK_NO_DOT, + STAR, + START_ANCHOR +}; + +/** + * Windows glob regex + */ + +const WINDOWS_CHARS = { + ...POSIX_CHARS, + + SLASH_LITERAL: `[${WIN_SLASH}]`, + QMARK: WIN_NO_SLASH, + STAR: `${WIN_NO_SLASH}*?`, + DOTS_SLASH: `${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$)`, + NO_DOT: `(?!${DOT_LITERAL})`, + NO_DOTS: `(?!(?:^|[${WIN_SLASH}])${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`, + NO_DOT_SLASH: `(?!${DOT_LITERAL}{0,1}(?:[${WIN_SLASH}]|$))`, + NO_DOTS_SLASH: `(?!${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`, + QMARK_NO_DOT: `[^.${WIN_SLASH}]`, + START_ANCHOR: `(?:^|[${WIN_SLASH}])`, + END_ANCHOR: `(?:[${WIN_SLASH}]|$)` +}; + +/** + * POSIX Bracket Regex + */ + +const POSIX_REGEX_SOURCE = { + alnum: 'a-zA-Z0-9', + alpha: 'a-zA-Z', + ascii: '\\x00-\\x7F', + blank: ' \\t', + cntrl: '\\x00-\\x1F\\x7F', + digit: '0-9', + graph: '\\x21-\\x7E', + lower: 'a-z', + print: '\\x20-\\x7E ', + punct: '\\-!"#$%&\'()\\*+,./:;<=>?@[\\]^_`{|}~', + space: ' \\t\\r\\n\\v\\f', + upper: 'A-Z', + word: 'A-Za-z0-9_', + xdigit: 'A-Fa-f0-9' +}; + +module.exports = { + MAX_LENGTH: 1024 * 64, + POSIX_REGEX_SOURCE, + + // regular expressions + REGEX_BACKSLASH: /\\(?![*+?^${}(|)[\]])/g, + REGEX_NON_SPECIAL_CHARS: /^[^@![\].,$*+?^{}()|\\/]+/, + REGEX_SPECIAL_CHARS: /[-*+?.^${}(|)[\]]/, + REGEX_SPECIAL_CHARS_BACKREF: /(\\?)((\W)(\3*))/g, + REGEX_SPECIAL_CHARS_GLOBAL: /([-*+?.^${}(|)[\]])/g, + REGEX_REMOVE_BACKSLASH: /(?:\[.*?[^\\]\]|\\(?=.))/g, + + // Replace globs with equivalent patterns to reduce parsing time. + REPLACEMENTS: { + '***': '*', + '**/**': '**', + '**/**/**': '**' + }, + + // Digits + CHAR_0: 48, /* 0 */ + CHAR_9: 57, /* 9 */ + + // Alphabet chars. + CHAR_UPPERCASE_A: 65, /* A */ + CHAR_LOWERCASE_A: 97, /* a */ + CHAR_UPPERCASE_Z: 90, /* Z */ + CHAR_LOWERCASE_Z: 122, /* z */ + + CHAR_LEFT_PARENTHESES: 40, /* ( */ + CHAR_RIGHT_PARENTHESES: 41, /* ) */ + + CHAR_ASTERISK: 42, /* * */ + + // Non-alphabetic chars. + CHAR_AMPERSAND: 38, /* & */ + CHAR_AT: 64, /* @ */ + CHAR_BACKWARD_SLASH: 92, /* \ */ + CHAR_CARRIAGE_RETURN: 13, /* \r */ + CHAR_CIRCUMFLEX_ACCENT: 94, /* ^ */ + CHAR_COLON: 58, /* : */ + CHAR_COMMA: 44, /* , */ + CHAR_DOT: 46, /* . */ + CHAR_DOUBLE_QUOTE: 34, /* " */ + CHAR_EQUAL: 61, /* = */ + CHAR_EXCLAMATION_MARK: 33, /* ! */ + CHAR_FORM_FEED: 12, /* \f */ + CHAR_FORWARD_SLASH: 47, /* / */ + CHAR_GRAVE_ACCENT: 96, /* ` */ + CHAR_HASH: 35, /* # */ + CHAR_HYPHEN_MINUS: 45, /* - */ + CHAR_LEFT_ANGLE_BRACKET: 60, /* < */ + CHAR_LEFT_CURLY_BRACE: 123, /* { */ + CHAR_LEFT_SQUARE_BRACKET: 91, /* [ */ + CHAR_LINE_FEED: 10, /* \n */ + CHAR_NO_BREAK_SPACE: 160, /* \u00A0 */ + CHAR_PERCENT: 37, /* % */ + CHAR_PLUS: 43, /* + */ + CHAR_QUESTION_MARK: 63, /* ? */ + CHAR_RIGHT_ANGLE_BRACKET: 62, /* > */ + CHAR_RIGHT_CURLY_BRACE: 125, /* } */ + CHAR_RIGHT_SQUARE_BRACKET: 93, /* ] */ + CHAR_SEMICOLON: 59, /* ; */ + CHAR_SINGLE_QUOTE: 39, /* ' */ + CHAR_SPACE: 32, /* */ + CHAR_TAB: 9, /* \t */ + CHAR_UNDERSCORE: 95, /* _ */ + CHAR_VERTICAL_LINE: 124, /* | */ + CHAR_ZERO_WIDTH_NOBREAK_SPACE: 65279, /* \uFEFF */ + + SEP: path.sep, + + /** + * Create EXTGLOB_CHARS + */ + + extglobChars(chars) { + return { + '!': { type: 'negate', open: '(?:(?!(?:', close: `))${chars.STAR})` }, + '?': { type: 'qmark', open: '(?:', close: ')?' }, + '+': { type: 'plus', open: '(?:', close: ')+' }, + '*': { type: 'star', open: '(?:', close: ')*' }, + '@': { type: 'at', open: '(?:', close: ')' } + }; + }, + + /** + * Create GLOB_CHARS + */ + + globChars(win32) { + return win32 === true ? WINDOWS_CHARS : POSIX_CHARS; + } +}; + + +/***/ }), +/* 61 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +const constants = __webpack_require__(60); +const utils = __webpack_require__(59); + +/** + * Constants + */ + +const { + MAX_LENGTH, + POSIX_REGEX_SOURCE, + REGEX_NON_SPECIAL_CHARS, + REGEX_SPECIAL_CHARS_BACKREF, + REPLACEMENTS +} = constants; + +/** + * Helpers + */ + +const expandRange = (args, options) => { + if (typeof options.expandRange === 'function') { + return options.expandRange(...args, options); + } + + args.sort(); + const value = `[${args.join('-')}]`; + + try { + /* eslint-disable-next-line no-new */ + new RegExp(value); + } catch (ex) { + return args.map(v => utils.escapeRegex(v)).join('..'); + } + + return value; +}; + +/** + * Create the message for a syntax error + */ + +const syntaxError = (type, char) => { + return `Missing ${type}: "${char}" - use "\\\\${char}" to match literal characters`; +}; + +/** + * Parse the given input string. + * @param {String} input + * @param {Object} options + * @return {Object} + */ + +const parse = (input, options) => { + if (typeof input !== 'string') { + throw new TypeError('Expected a string'); + } + + input = REPLACEMENTS[input] || input; + + const opts = { ...options }; + const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; + + let len = input.length; + if (len > max) { + throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`); + } + + const bos = { type: 'bos', value: '', output: opts.prepend || '' }; + const tokens = [bos]; + + const capture = opts.capture ? '' : '?:'; + const win32 = utils.isWindows(options); + + // create constants based on platform, for windows or posix + const PLATFORM_CHARS = constants.globChars(win32); + const EXTGLOB_CHARS = constants.extglobChars(PLATFORM_CHARS); + + const { + DOT_LITERAL, + PLUS_LITERAL, + SLASH_LITERAL, + ONE_CHAR, + DOTS_SLASH, + NO_DOT, + NO_DOT_SLASH, + NO_DOTS_SLASH, + QMARK, + QMARK_NO_DOT, + STAR, + START_ANCHOR + } = PLATFORM_CHARS; + + const globstar = opts => { + return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`; + }; + + const nodot = opts.dot ? '' : NO_DOT; + const qmarkNoDot = opts.dot ? QMARK : QMARK_NO_DOT; + let star = opts.bash === true ? globstar(opts) : STAR; + + if (opts.capture) { + star = `(${star})`; + } + + // minimatch options support + if (typeof opts.noext === 'boolean') { + opts.noextglob = opts.noext; + } + + const state = { + input, + index: -1, + start: 0, + dot: opts.dot === true, + consumed: '', + output: '', + prefix: '', + backtrack: false, + negated: false, + brackets: 0, + braces: 0, + parens: 0, + quotes: 0, + globstar: false, + tokens + }; + + input = utils.removePrefix(input, state); + len = input.length; + + const extglobs = []; + const braces = []; + const stack = []; + let prev = bos; + let value; + + /** + * Tokenizing helpers + */ + + const eos = () => state.index === len - 1; + const peek = state.peek = (n = 1) => input[state.index + n]; + const advance = state.advance = () => input[++state.index] || ''; + const remaining = () => input.slice(state.index + 1); + const consume = (value = '', num = 0) => { + state.consumed += value; + state.index += num; + }; + + const append = token => { + state.output += token.output != null ? token.output : token.value; + consume(token.value); + }; + + const negate = () => { + let count = 1; + + while (peek() === '!' && (peek(2) !== '(' || peek(3) === '?')) { + advance(); + state.start++; + count++; + } + + if (count % 2 === 0) { + return false; + } + + state.negated = true; + state.start++; + return true; + }; + + const increment = type => { + state[type]++; + stack.push(type); + }; + + const decrement = type => { + state[type]--; + stack.pop(); + }; + + /** + * Push tokens onto the tokens array. This helper speeds up + * tokenizing by 1) helping us avoid backtracking as much as possible, + * and 2) helping us avoid creating extra tokens when consecutive + * characters are plain text. This improves performance and simplifies + * lookbehinds. + */ + + const push = tok => { + if (prev.type === 'globstar') { + const isBrace = state.braces > 0 && (tok.type === 'comma' || tok.type === 'brace'); + const isExtglob = tok.extglob === true || (extglobs.length && (tok.type === 'pipe' || tok.type === 'paren')); + + if (tok.type !== 'slash' && tok.type !== 'paren' && !isBrace && !isExtglob) { + state.output = state.output.slice(0, -prev.output.length); + prev.type = 'star'; + prev.value = '*'; + prev.output = star; + state.output += prev.output; + } + } + + if (extglobs.length && tok.type !== 'paren') { + extglobs[extglobs.length - 1].inner += tok.value; + } + + if (tok.value || tok.output) append(tok); + if (prev && prev.type === 'text' && tok.type === 'text') { + prev.value += tok.value; + prev.output = (prev.output || '') + tok.value; + return; + } + + tok.prev = prev; + tokens.push(tok); + prev = tok; + }; + + const extglobOpen = (type, value) => { + const token = { ...EXTGLOB_CHARS[value], conditions: 1, inner: '' }; + + token.prev = prev; + token.parens = state.parens; + token.output = state.output; + const output = (opts.capture ? '(' : '') + token.open; + + increment('parens'); + push({ type, value, output: state.output ? '' : ONE_CHAR }); + push({ type: 'paren', extglob: true, value: advance(), output }); + extglobs.push(token); + }; + + const extglobClose = token => { + let output = token.close + (opts.capture ? ')' : ''); + let rest; + + if (token.type === 'negate') { + let extglobStar = star; + + if (token.inner && token.inner.length > 1 && token.inner.includes('/')) { + extglobStar = globstar(opts); + } + + if (extglobStar !== star || eos() || /^\)+$/.test(remaining())) { + output = token.close = `)$))${extglobStar}`; + } + + if (token.inner.includes('*') && (rest = remaining()) && /^\.[^\\/.]+$/.test(rest)) { + // Any non-magical string (`.ts`) or even nested expression (`.{ts,tsx}`) can follow after the closing parenthesis. + // In this case, we need to parse the string and use it in the output of the original pattern. + // Suitable patterns: `/!(*.d).ts`, `/!(*.d).{ts,tsx}`, `**/!(*-dbg).@(js)`. + // + // Disabling the `fastpaths` option due to a problem with parsing strings as `.ts` in the pattern like `**/!(*.d).ts`. + const expression = parse(rest, { ...options, fastpaths: false }).output; + + output = token.close = `)${expression})${extglobStar})`; + } + + if (token.prev.type === 'bos') { + state.negatedExtglob = true; + } + } + + push({ type: 'paren', extglob: true, value, output }); + decrement('parens'); + }; + + /** + * Fast paths + */ + + if (opts.fastpaths !== false && !/(^[*!]|[/()[\]{}"])/.test(input)) { + let backslashes = false; + + let output = input.replace(REGEX_SPECIAL_CHARS_BACKREF, (m, esc, chars, first, rest, index) => { + if (first === '\\') { + backslashes = true; + return m; + } + + if (first === '?') { + if (esc) { + return esc + first + (rest ? QMARK.repeat(rest.length) : ''); + } + if (index === 0) { + return qmarkNoDot + (rest ? QMARK.repeat(rest.length) : ''); + } + return QMARK.repeat(chars.length); + } + + if (first === '.') { + return DOT_LITERAL.repeat(chars.length); + } + + if (first === '*') { + if (esc) { + return esc + first + (rest ? star : ''); + } + return star; + } + return esc ? m : `\\${m}`; + }); + + if (backslashes === true) { + if (opts.unescape === true) { + output = output.replace(/\\/g, ''); + } else { + output = output.replace(/\\+/g, m => { + return m.length % 2 === 0 ? '\\\\' : (m ? '\\' : ''); + }); + } + } + + if (output === input && opts.contains === true) { + state.output = input; + return state; + } + + state.output = utils.wrapOutput(output, state, options); + return state; + } + + /** + * Tokenize input until we reach end-of-string + */ + + while (!eos()) { + value = advance(); + + if (value === '\u0000') { + continue; + } + + /** + * Escaped characters + */ + + if (value === '\\') { + const next = peek(); + + if (next === '/' && opts.bash !== true) { + continue; + } + + if (next === '.' || next === ';') { + continue; + } + + if (!next) { + value += '\\'; + push({ type: 'text', value }); + continue; + } + + // collapse slashes to reduce potential for exploits + const match = /^\\+/.exec(remaining()); + let slashes = 0; + + if (match && match[0].length > 2) { + slashes = match[0].length; + state.index += slashes; + if (slashes % 2 !== 0) { + value += '\\'; + } + } + + if (opts.unescape === true) { + value = advance(); + } else { + value += advance(); + } + + if (state.brackets === 0) { + push({ type: 'text', value }); + continue; + } + } + + /** + * If we're inside a regex character class, continue + * until we reach the closing bracket. + */ + + if (state.brackets > 0 && (value !== ']' || prev.value === '[' || prev.value === '[^')) { + if (opts.posix !== false && value === ':') { + const inner = prev.value.slice(1); + if (inner.includes('[')) { + prev.posix = true; + + if (inner.includes(':')) { + const idx = prev.value.lastIndexOf('['); + const pre = prev.value.slice(0, idx); + const rest = prev.value.slice(idx + 2); + const posix = POSIX_REGEX_SOURCE[rest]; + if (posix) { + prev.value = pre + posix; + state.backtrack = true; + advance(); + + if (!bos.output && tokens.indexOf(prev) === 1) { + bos.output = ONE_CHAR; + } + continue; + } + } + } + } + + if ((value === '[' && peek() !== ':') || (value === '-' && peek() === ']')) { + value = `\\${value}`; + } + + if (value === ']' && (prev.value === '[' || prev.value === '[^')) { + value = `\\${value}`; + } + + if (opts.posix === true && value === '!' && prev.value === '[') { + value = '^'; + } + + prev.value += value; + append({ value }); + continue; + } + + /** + * If we're inside a quoted string, continue + * until we reach the closing double quote. + */ + + if (state.quotes === 1 && value !== '"') { + value = utils.escapeRegex(value); + prev.value += value; + append({ value }); + continue; + } + + /** + * Double quotes + */ + + if (value === '"') { + state.quotes = state.quotes === 1 ? 0 : 1; + if (opts.keepQuotes === true) { + push({ type: 'text', value }); + } + continue; + } + + /** + * Parentheses + */ + + if (value === '(') { + increment('parens'); + push({ type: 'paren', value }); + continue; + } + + if (value === ')') { + if (state.parens === 0 && opts.strictBrackets === true) { + throw new SyntaxError(syntaxError('opening', '(')); + } + + const extglob = extglobs[extglobs.length - 1]; + if (extglob && state.parens === extglob.parens + 1) { + extglobClose(extglobs.pop()); + continue; + } + + push({ type: 'paren', value, output: state.parens ? ')' : '\\)' }); + decrement('parens'); + continue; + } + + /** + * Square brackets + */ + + if (value === '[') { + if (opts.nobracket === true || !remaining().includes(']')) { + if (opts.nobracket !== true && opts.strictBrackets === true) { + throw new SyntaxError(syntaxError('closing', ']')); + } + + value = `\\${value}`; + } else { + increment('brackets'); + } + + push({ type: 'bracket', value }); + continue; + } + + if (value === ']') { + if (opts.nobracket === true || (prev && prev.type === 'bracket' && prev.value.length === 1)) { + push({ type: 'text', value, output: `\\${value}` }); + continue; + } + + if (state.brackets === 0) { + if (opts.strictBrackets === true) { + throw new SyntaxError(syntaxError('opening', '[')); + } + + push({ type: 'text', value, output: `\\${value}` }); + continue; + } + + decrement('brackets'); + + const prevValue = prev.value.slice(1); + if (prev.posix !== true && prevValue[0] === '^' && !prevValue.includes('/')) { + value = `/${value}`; + } + + prev.value += value; + append({ value }); + + // when literal brackets are explicitly disabled + // assume we should match with a regex character class + if (opts.literalBrackets === false || utils.hasRegexChars(prevValue)) { + continue; + } + + const escaped = utils.escapeRegex(prev.value); + state.output = state.output.slice(0, -prev.value.length); + + // when literal brackets are explicitly enabled + // assume we should escape the brackets to match literal characters + if (opts.literalBrackets === true) { + state.output += escaped; + prev.value = escaped; + continue; + } + + // when the user specifies nothing, try to match both + prev.value = `(${capture}${escaped}|${prev.value})`; + state.output += prev.value; + continue; + } + + /** + * Braces + */ + + if (value === '{' && opts.nobrace !== true) { + increment('braces'); + + const open = { + type: 'brace', + value, + output: '(', + outputIndex: state.output.length, + tokensIndex: state.tokens.length + }; + + braces.push(open); + push(open); + continue; + } + + if (value === '}') { + const brace = braces[braces.length - 1]; + + if (opts.nobrace === true || !brace) { + push({ type: 'text', value, output: value }); + continue; + } + + let output = ')'; + + if (brace.dots === true) { + const arr = tokens.slice(); + const range = []; + + for (let i = arr.length - 1; i >= 0; i--) { + tokens.pop(); + if (arr[i].type === 'brace') { + break; + } + if (arr[i].type !== 'dots') { + range.unshift(arr[i].value); + } + } + + output = expandRange(range, opts); + state.backtrack = true; + } + + if (brace.comma !== true && brace.dots !== true) { + const out = state.output.slice(0, brace.outputIndex); + const toks = state.tokens.slice(brace.tokensIndex); + brace.value = brace.output = '\\{'; + value = output = '\\}'; + state.output = out; + for (const t of toks) { + state.output += (t.output || t.value); + } + } + + push({ type: 'brace', value, output }); + decrement('braces'); + braces.pop(); + continue; + } + + /** + * Pipes + */ + + if (value === '|') { + if (extglobs.length > 0) { + extglobs[extglobs.length - 1].conditions++; + } + push({ type: 'text', value }); + continue; + } + + /** + * Commas + */ + + if (value === ',') { + let output = value; + + const brace = braces[braces.length - 1]; + if (brace && stack[stack.length - 1] === 'braces') { + brace.comma = true; + output = '|'; + } + + push({ type: 'comma', value, output }); + continue; + } + + /** + * Slashes + */ + + if (value === '/') { + // if the beginning of the glob is "./", advance the start + // to the current index, and don't add the "./" characters + // to the state. This greatly simplifies lookbehinds when + // checking for BOS characters like "!" and "." (not "./") + if (prev.type === 'dot' && state.index === state.start + 1) { + state.start = state.index + 1; + state.consumed = ''; + state.output = ''; + tokens.pop(); + prev = bos; // reset "prev" to the first token + continue; + } + + push({ type: 'slash', value, output: SLASH_LITERAL }); + continue; + } + + /** + * Dots + */ + + if (value === '.') { + if (state.braces > 0 && prev.type === 'dot') { + if (prev.value === '.') prev.output = DOT_LITERAL; + const brace = braces[braces.length - 1]; + prev.type = 'dots'; + prev.output += value; + prev.value += value; + brace.dots = true; + continue; + } + + if ((state.braces + state.parens) === 0 && prev.type !== 'bos' && prev.type !== 'slash') { + push({ type: 'text', value, output: DOT_LITERAL }); + continue; + } + + push({ type: 'dot', value, output: DOT_LITERAL }); + continue; + } + + /** + * Question marks + */ + + if (value === '?') { + const isGroup = prev && prev.value === '('; + if (!isGroup && opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { + extglobOpen('qmark', value); + continue; + } + + if (prev && prev.type === 'paren') { + const next = peek(); + let output = value; + + if (next === '<' && !utils.supportsLookbehinds()) { + throw new Error('Node.js v10 or higher is required for regex lookbehinds'); + } + + if ((prev.value === '(' && !/[!=<:]/.test(next)) || (next === '<' && !/<([!=]|\w+>)/.test(remaining()))) { + output = `\\${value}`; + } + + push({ type: 'text', value, output }); + continue; + } + + if (opts.dot !== true && (prev.type === 'slash' || prev.type === 'bos')) { + push({ type: 'qmark', value, output: QMARK_NO_DOT }); + continue; + } + + push({ type: 'qmark', value, output: QMARK }); + continue; + } + + /** + * Exclamation + */ + + if (value === '!') { + if (opts.noextglob !== true && peek() === '(') { + if (peek(2) !== '?' || !/[!=<:]/.test(peek(3))) { + extglobOpen('negate', value); + continue; + } + } + + if (opts.nonegate !== true && state.index === 0) { + negate(); + continue; + } + } + + /** + * Plus + */ + + if (value === '+') { + if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { + extglobOpen('plus', value); + continue; + } + + if ((prev && prev.value === '(') || opts.regex === false) { + push({ type: 'plus', value, output: PLUS_LITERAL }); + continue; + } + + if ((prev && (prev.type === 'bracket' || prev.type === 'paren' || prev.type === 'brace')) || state.parens > 0) { + push({ type: 'plus', value }); + continue; + } + + push({ type: 'plus', value: PLUS_LITERAL }); + continue; + } + + /** + * Plain text + */ + + if (value === '@') { + if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { + push({ type: 'at', extglob: true, value, output: '' }); + continue; + } + + push({ type: 'text', value }); + continue; + } + + /** + * Plain text + */ + + if (value !== '*') { + if (value === '$' || value === '^') { + value = `\\${value}`; + } + + const match = REGEX_NON_SPECIAL_CHARS.exec(remaining()); + if (match) { + value += match[0]; + state.index += match[0].length; + } + + push({ type: 'text', value }); + continue; + } + + /** + * Stars + */ + + if (prev && (prev.type === 'globstar' || prev.star === true)) { + prev.type = 'star'; + prev.star = true; + prev.value += value; + prev.output = star; + state.backtrack = true; + state.globstar = true; + consume(value); + continue; + } + + let rest = remaining(); + if (opts.noextglob !== true && /^\([^?]/.test(rest)) { + extglobOpen('star', value); + continue; + } + + if (prev.type === 'star') { + if (opts.noglobstar === true) { + consume(value); + continue; + } + + const prior = prev.prev; + const before = prior.prev; + const isStart = prior.type === 'slash' || prior.type === 'bos'; + const afterStar = before && (before.type === 'star' || before.type === 'globstar'); + + if (opts.bash === true && (!isStart || (rest[0] && rest[0] !== '/'))) { + push({ type: 'star', value, output: '' }); + continue; + } + + const isBrace = state.braces > 0 && (prior.type === 'comma' || prior.type === 'brace'); + const isExtglob = extglobs.length && (prior.type === 'pipe' || prior.type === 'paren'); + if (!isStart && prior.type !== 'paren' && !isBrace && !isExtglob) { + push({ type: 'star', value, output: '' }); + continue; + } + + // strip consecutive `/**/` + while (rest.slice(0, 3) === '/**') { + const after = input[state.index + 4]; + if (after && after !== '/') { + break; + } + rest = rest.slice(3); + consume('/**', 3); + } + + if (prior.type === 'bos' && eos()) { + prev.type = 'globstar'; + prev.value += value; + prev.output = globstar(opts); + state.output = prev.output; + state.globstar = true; + consume(value); + continue; + } + + if (prior.type === 'slash' && prior.prev.type !== 'bos' && !afterStar && eos()) { + state.output = state.output.slice(0, -(prior.output + prev.output).length); + prior.output = `(?:${prior.output}`; + + prev.type = 'globstar'; + prev.output = globstar(opts) + (opts.strictSlashes ? ')' : '|$)'); + prev.value += value; + state.globstar = true; + state.output += prior.output + prev.output; + consume(value); + continue; + } + + if (prior.type === 'slash' && prior.prev.type !== 'bos' && rest[0] === '/') { + const end = rest[1] !== void 0 ? '|$' : ''; + + state.output = state.output.slice(0, -(prior.output + prev.output).length); + prior.output = `(?:${prior.output}`; + + prev.type = 'globstar'; + prev.output = `${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`; + prev.value += value; + + state.output += prior.output + prev.output; + state.globstar = true; + + consume(value + advance()); + + push({ type: 'slash', value: '/', output: '' }); + continue; + } + + if (prior.type === 'bos' && rest[0] === '/') { + prev.type = 'globstar'; + prev.value += value; + prev.output = `(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`; + state.output = prev.output; + state.globstar = true; + consume(value + advance()); + push({ type: 'slash', value: '/', output: '' }); + continue; + } + + // remove single star from output + state.output = state.output.slice(0, -prev.output.length); + + // reset previous token to globstar + prev.type = 'globstar'; + prev.output = globstar(opts); + prev.value += value; + + // reset output with globstar + state.output += prev.output; + state.globstar = true; + consume(value); + continue; + } + + const token = { type: 'star', value, output: star }; + + if (opts.bash === true) { + token.output = '.*?'; + if (prev.type === 'bos' || prev.type === 'slash') { + token.output = nodot + token.output; + } + push(token); + continue; + } + + if (prev && (prev.type === 'bracket' || prev.type === 'paren') && opts.regex === true) { + token.output = value; + push(token); + continue; + } + + if (state.index === state.start || prev.type === 'slash' || prev.type === 'dot') { + if (prev.type === 'dot') { + state.output += NO_DOT_SLASH; + prev.output += NO_DOT_SLASH; + + } else if (opts.dot === true) { + state.output += NO_DOTS_SLASH; + prev.output += NO_DOTS_SLASH; + + } else { + state.output += nodot; + prev.output += nodot; + } + + if (peek() !== '*') { + state.output += ONE_CHAR; + prev.output += ONE_CHAR; + } + } + + push(token); + } + + while (state.brackets > 0) { + if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ']')); + state.output = utils.escapeLast(state.output, '['); + decrement('brackets'); + } + + while (state.parens > 0) { + if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ')')); + state.output = utils.escapeLast(state.output, '('); + decrement('parens'); + } + + while (state.braces > 0) { + if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', '}')); + state.output = utils.escapeLast(state.output, '{'); + decrement('braces'); + } + + if (opts.strictSlashes !== true && (prev.type === 'star' || prev.type === 'bracket')) { + push({ type: 'maybe_slash', value: '', output: `${SLASH_LITERAL}?` }); + } + + // rebuild the output if we had to backtrack at any point + if (state.backtrack === true) { + state.output = ''; + + for (const token of state.tokens) { + state.output += token.output != null ? token.output : token.value; + + if (token.suffix) { + state.output += token.suffix; + } + } + } + + return state; +}; + +/** + * Fast paths for creating regular expressions for common glob patterns. + * This can significantly speed up processing and has very little downside + * impact when none of the fast paths match. + */ + +parse.fastpaths = (input, options) => { + const opts = { ...options }; + const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; + const len = input.length; + if (len > max) { + throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`); + } + + input = REPLACEMENTS[input] || input; + const win32 = utils.isWindows(options); + + // create constants based on platform, for windows or posix + const { + DOT_LITERAL, + SLASH_LITERAL, + ONE_CHAR, + DOTS_SLASH, + NO_DOT, + NO_DOTS, + NO_DOTS_SLASH, + STAR, + START_ANCHOR + } = constants.globChars(win32); + + const nodot = opts.dot ? NO_DOTS : NO_DOT; + const slashDot = opts.dot ? NO_DOTS_SLASH : NO_DOT; + const capture = opts.capture ? '' : '?:'; + const state = { negated: false, prefix: '' }; + let star = opts.bash === true ? '.*?' : STAR; + + if (opts.capture) { + star = `(${star})`; + } + + const globstar = opts => { + if (opts.noglobstar === true) return star; + return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`; + }; + + const create = str => { + switch (str) { + case '*': + return `${nodot}${ONE_CHAR}${star}`; + + case '.*': + return `${DOT_LITERAL}${ONE_CHAR}${star}`; + + case '*.*': + return `${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`; + + case '*/*': + return `${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`; + + case '**': + return nodot + globstar(opts); + + case '**/*': + return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`; + + case '**/*.*': + return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`; + + case '**/.*': + return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`; + + default: { + const match = /^(.*?)\.(\w+)$/.exec(str); + if (!match) return; + + const source = create(match[1]); + if (!source) return; + + return source + DOT_LITERAL + match[2]; + } + } + }; + + const output = utils.removePrefix(input, state); + let source = create(output); + + if (source && opts.strictSlashes !== true) { + source += `${SLASH_LITERAL}?`; + } + + return source; +}; + +module.exports = parse; + + +/***/ }), +/* 62 */ +/***/ ((module) => { + +/*! + * normalize-path + * + * Copyright (c) 2014-2018, Jon Schlinkert. + * Released under the MIT License. + */ + +module.exports = function(path, stripTrailing) { + if (typeof path !== 'string') { + throw new TypeError('expected path to be a string'); + } + + if (path === '\\' || path === '/') return '/'; + + var len = path.length; + if (len <= 1) return path; + + // ensure that win32 namespaces has two leading slashes, so that the path is + // handled properly by the win32 version of path.parse() after being normalized + // https://msdn.microsoft.com/library/windows/desktop/aa365247(v=vs.85).aspx#namespaces + var prefix = ''; + if (len > 4 && path[3] === '\\') { + var ch = path[2]; + if ((ch === '?' || ch === '.') && path.slice(0, 2) === '\\\\') { + path = path.slice(2); + prefix = '//'; + } + } + + var segs = path.split(/[/\\]+/); + if (stripTrailing !== false && segs[segs.length - 1] === '') { + segs.pop(); + } + return prefix + segs.join('/'); +}; + + +/***/ }), +/* 63 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var path = __webpack_require__(3); +var isglob = __webpack_require__(64); +var pathDirname = __webpack_require__(66); +var isWin32 = (__webpack_require__(67).platform)() === 'win32'; + +module.exports = function globParent(str) { + // flip windows path separators + if (isWin32 && str.indexOf('/') < 0) str = str.split('\\').join('/'); + + // special case for strings ending in enclosure containing path separator + if (/[\{\[].*[\/]*.*[\}\]]$/.test(str)) str += '/'; + + // preserves full path in case of trailing path separator + str += 'a'; + + // remove path parts that are globby + do {str = pathDirname.posix(str)} + while (isglob(str) || /(^|[^\\])([\{\[]|\([^\)]+$)/.test(str)); + + // remove escape chars and return result + return str.replace(/\\([\*\?\|\[\]\(\)\{\}])/g, '$1'); +}; + + +/***/ }), +/* 64 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +/*! + * is-glob + * + * Copyright (c) 2014-2016, Jon Schlinkert. + * Licensed under the MIT License. + */ + +var isExtglob = __webpack_require__(65); + +module.exports = function isGlob(str) { + if (typeof str !== 'string' || str === '') { + return false; + } + + if (isExtglob(str)) return true; + + var regex = /(\\).|([*?]|\[.*\]|\{.*\}|\(.*\|.*\)|^!)/; + var match; + + while ((match = regex.exec(str))) { + if (match[2]) return true; + str = str.slice(match.index + match[0].length); + } + return false; +}; + + +/***/ }), +/* 65 */ +/***/ ((module) => { + +/*! + * is-extglob + * + * Copyright (c) 2014-2016, Jon Schlinkert. + * Licensed under the MIT License. + */ + +module.exports = function isExtglob(str) { + if (typeof str !== 'string' || str === '') { + return false; + } + + var match; + while ((match = /(\\).|([@?!+*]\(.*\))/g.exec(str))) { + if (match[2]) return true; + str = str.slice(match.index + match[0].length); + } + + return false; +}; + + +/***/ }), +/* 66 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var path = __webpack_require__(3); +var inspect = (__webpack_require__(17).inspect); + +function assertPath(path) { + if (typeof path !== 'string') { + throw new TypeError('Path must be a string. Received ' + inspect(path)); + } +} + +function posix(path) { + assertPath(path); + if (path.length === 0) + return '.'; + var code = path.charCodeAt(0); + var hasRoot = (code === 47/*/*/); + var end = -1; + var matchedSlash = true; + for (var i = path.length - 1; i >= 1; --i) { + code = path.charCodeAt(i); + if (code === 47/*/*/) { + if (!matchedSlash) { + end = i; + break; + } + } else { + // We saw the first non-path separator + matchedSlash = false; + } + } + + if (end === -1) + return hasRoot ? '/' : '.'; + if (hasRoot && end === 1) + return '//'; + return path.slice(0, end); +} + +function win32(path) { + assertPath(path); + var len = path.length; + if (len === 0) + return '.'; + var rootEnd = -1; + var end = -1; + var matchedSlash = true; + var offset = 0; + var code = path.charCodeAt(0); + + // Try to match a root + if (len > 1) { + if (code === 47/*/*/ || code === 92/*\*/) { + // Possible UNC root + + rootEnd = offset = 1; + + code = path.charCodeAt(1); + if (code === 47/*/*/ || code === 92/*\*/) { + // Matched double path separator at beginning + var j = 2; + var last = j; + // Match 1 or more non-path separators + for (; j < len; ++j) { + code = path.charCodeAt(j); + if (code === 47/*/*/ || code === 92/*\*/) + break; + } + if (j < len && j !== last) { + // Matched! + last = j; + // Match 1 or more path separators + for (; j < len; ++j) { + code = path.charCodeAt(j); + if (code !== 47/*/*/ && code !== 92/*\*/) + break; + } + if (j < len && j !== last) { + // Matched! + last = j; + // Match 1 or more non-path separators + for (; j < len; ++j) { + code = path.charCodeAt(j); + if (code === 47/*/*/ || code === 92/*\*/) + break; + } + if (j === len) { + // We matched a UNC root only + return path; + } + if (j !== last) { + // We matched a UNC root with leftovers + + // Offset by 1 to include the separator after the UNC root to + // treat it as a "normal root" on top of a (UNC) root + rootEnd = offset = j + 1; + } + } + } + } + } else if ((code >= 65/*A*/ && code <= 90/*Z*/) || + (code >= 97/*a*/ && code <= 122/*z*/)) { + // Possible device root + + code = path.charCodeAt(1); + if (path.charCodeAt(1) === 58/*:*/) { + rootEnd = offset = 2; + if (len > 2) { + code = path.charCodeAt(2); + if (code === 47/*/*/ || code === 92/*\*/) + rootEnd = offset = 3; + } + } + } + } else if (code === 47/*/*/ || code === 92/*\*/) { + return path[0]; + } + + for (var i = len - 1; i >= offset; --i) { + code = path.charCodeAt(i); + if (code === 47/*/*/ || code === 92/*\*/) { + if (!matchedSlash) { + end = i; + break; + } + } else { + // We saw the first non-path separator + matchedSlash = false; + } + } + + if (end === -1) { + if (rootEnd === -1) + return '.'; + else + end = rootEnd; + } + return path.slice(0, end); +} + +module.exports = process.platform === 'win32' ? win32 : posix; +module.exports.posix = posix; +module.exports.win32 = win32; + + +/***/ }), +/* 67 */ +/***/ ((module) => { + +"use strict"; +module.exports = require("os"); + +/***/ }), +/* 68 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +/*! + * is-glob + * + * Copyright (c) 2014-2017, Jon Schlinkert. + * Released under the MIT License. + */ + +var isExtglob = __webpack_require__(65); +var chars = { '{': '}', '(': ')', '[': ']'}; +var strictCheck = function(str) { + if (str[0] === '!') { + return true; + } + var index = 0; + var pipeIndex = -2; + var closeSquareIndex = -2; + var closeCurlyIndex = -2; + var closeParenIndex = -2; + var backSlashIndex = -2; + while (index < str.length) { + if (str[index] === '*') { + return true; + } + + if (str[index + 1] === '?' && /[\].+)]/.test(str[index])) { + return true; + } + + if (closeSquareIndex !== -1 && str[index] === '[' && str[index + 1] !== ']') { + if (closeSquareIndex < index) { + closeSquareIndex = str.indexOf(']', index); + } + if (closeSquareIndex > index) { + if (backSlashIndex === -1 || backSlashIndex > closeSquareIndex) { + return true; + } + backSlashIndex = str.indexOf('\\', index); + if (backSlashIndex === -1 || backSlashIndex > closeSquareIndex) { + return true; + } + } + } + + if (closeCurlyIndex !== -1 && str[index] === '{' && str[index + 1] !== '}') { + closeCurlyIndex = str.indexOf('}', index); + if (closeCurlyIndex > index) { + backSlashIndex = str.indexOf('\\', index); + if (backSlashIndex === -1 || backSlashIndex > closeCurlyIndex) { + return true; + } + } + } + + if (closeParenIndex !== -1 && str[index] === '(' && str[index + 1] === '?' && /[:!=]/.test(str[index + 2]) && str[index + 3] !== ')') { + closeParenIndex = str.indexOf(')', index); + if (closeParenIndex > index) { + backSlashIndex = str.indexOf('\\', index); + if (backSlashIndex === -1 || backSlashIndex > closeParenIndex) { + return true; + } + } + } + + if (pipeIndex !== -1 && str[index] === '(' && str[index + 1] !== '|') { + if (pipeIndex < index) { + pipeIndex = str.indexOf('|', index); + } + if (pipeIndex !== -1 && str[pipeIndex + 1] !== ')') { + closeParenIndex = str.indexOf(')', pipeIndex); + if (closeParenIndex > pipeIndex) { + backSlashIndex = str.indexOf('\\', pipeIndex); + if (backSlashIndex === -1 || backSlashIndex > closeParenIndex) { + return true; + } + } + } + } + + if (str[index] === '\\') { + var open = str[index + 1]; + index += 2; + var close = chars[open]; + + if (close) { + var n = str.indexOf(close, index); + if (n !== -1) { + index = n + 1; + } + } + + if (str[index] === '!') { + return true; + } + } else { + index++; + } + } + return false; +}; + +var relaxedCheck = function(str) { + if (str[0] === '!') { + return true; + } + var index = 0; + while (index < str.length) { + if (/[*?{}()[\]]/.test(str[index])) { + return true; + } + + if (str[index] === '\\') { + var open = str[index + 1]; + index += 2; + var close = chars[open]; + + if (close) { + var n = str.indexOf(close, index); + if (n !== -1) { + index = n + 1; + } + } + + if (str[index] === '!') { + return true; + } + } else { + index++; + } + } + return false; +}; + +module.exports = function isGlob(str, options) { + if (typeof str !== 'string' || str === '') { + return false; + } + + if (isExtglob(str)) { + return true; + } + + var check = strictCheck; + + // optionally relax check + if (options && options.strict === false) { + check = relaxedCheck; + } + + return check(str); +}; + + +/***/ }), +/* 69 */ +/***/ ((module) => { + +"use strict"; + + +function posix(path) { + return path.charAt(0) === '/'; +} + +function win32(path) { + // https://github.com/nodejs/node/blob/b3fcc245fb25539909ef1d5eaa01dbf92e168633/lib/path.js#L56 + var splitDeviceRe = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/; + var result = splitDeviceRe.exec(path); + var device = result[1] || ''; + var isUnc = Boolean(device && device.charAt(1) !== ':'); + + // UNC paths are always absolute + return Boolean(result[2] || isUnc); +} + +module.exports = process.platform === 'win32' ? win32 : posix; +module.exports.posix = posix; +module.exports.win32 = win32; + + +/***/ }), +/* 70 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +try { + var util = __webpack_require__(17); + /* istanbul ignore next */ + if (typeof util.inherits !== 'function') throw ''; + module.exports = util.inherits; +} catch (e) { + /* istanbul ignore next */ + module.exports = __webpack_require__(71); +} + + +/***/ }), +/* 71 */ +/***/ ((module) => { + +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + if (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) { + if (superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } + } +} + + +/***/ }), +/* 72 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +/** + * Module dependencies + */ + +var toRegex = __webpack_require__(73); +var unique = __webpack_require__(95); +var extend = __webpack_require__(96); + +/** + * Local dependencies + */ + +var compilers = __webpack_require__(98); +var parsers = __webpack_require__(111); +var Braces = __webpack_require__(117); +var utils = __webpack_require__(99); +var MAX_LENGTH = 1024 * 64; +var cache = {}; + +/** + * Convert the given `braces` pattern into a regex-compatible string. By default, only one string is generated for every input string. Set `options.expand` to true to return an array of patterns (similar to Bash or minimatch. Before using `options.expand`, it's recommended that you read the [performance notes](#performance)). + * + * ```js + * var braces = require('braces'); + * console.log(braces('{a,b,c}')); + * //=> ['(a|b|c)'] + * + * console.log(braces('{a,b,c}', {expand: true})); + * //=> ['a', 'b', 'c'] + * ``` + * @param {String} `str` + * @param {Object} `options` + * @return {String} + * @api public + */ + +function braces(pattern, options) { + var key = utils.createKey(String(pattern), options); + var arr = []; + + var disabled = options && options.cache === false; + if (!disabled && cache.hasOwnProperty(key)) { + return cache[key]; + } + + if (Array.isArray(pattern)) { + for (var i = 0; i < pattern.length; i++) { + arr.push.apply(arr, braces.create(pattern[i], options)); + } + } else { + arr = braces.create(pattern, options); + } + + if (options && options.nodupes === true) { + arr = unique(arr); + } + + if (!disabled) { + cache[key] = arr; + } + return arr; +} + +/** + * Expands a brace pattern into an array. This method is called by the main [braces](#braces) function when `options.expand` is true. Before using this method it's recommended that you read the [performance notes](#performance)) and advantages of using [.optimize](#optimize) instead. + * + * ```js + * var braces = require('braces'); + * console.log(braces.expand('a/{b,c}/d')); + * //=> ['a/b/d', 'a/c/d']; + * ``` + * @param {String} `pattern` Brace pattern + * @param {Object} `options` + * @return {Array} Returns an array of expanded values. + * @api public + */ + +braces.expand = function(pattern, options) { + return braces.create(pattern, extend({}, options, {expand: true})); +}; + +/** + * Expands a brace pattern into a regex-compatible, optimized string. This method is called by the main [braces](#braces) function by default. + * + * ```js + * var braces = require('braces'); + * console.log(braces.expand('a/{b,c}/d')); + * //=> ['a/(b|c)/d'] + * ``` + * @param {String} `pattern` Brace pattern + * @param {Object} `options` + * @return {Array} Returns an array of expanded values. + * @api public + */ + +braces.optimize = function(pattern, options) { + return braces.create(pattern, options); +}; + +/** + * Processes a brace pattern and returns either an expanded array (if `options.expand` is true), a highly optimized regex-compatible string. This method is called by the main [braces](#braces) function. + * + * ```js + * var braces = require('braces'); + * console.log(braces.create('user-{200..300}/project-{a,b,c}-{1..10}')) + * //=> 'user-(20[0-9]|2[1-9][0-9]|300)/project-(a|b|c)-([1-9]|10)' + * ``` + * @param {String} `pattern` Brace pattern + * @param {Object} `options` + * @return {Array} Returns an array of expanded values. + * @api public + */ + +braces.create = function(pattern, options) { + if (typeof pattern !== 'string') { + throw new TypeError('expected a string'); + } + + var maxLength = (options && options.maxLength) || MAX_LENGTH; + if (pattern.length >= maxLength) { + throw new Error('expected pattern to be less than ' + maxLength + ' characters'); + } + + function create() { + if (pattern === '' || pattern.length < 3) { + return [pattern]; + } + + if (utils.isEmptySets(pattern)) { + return []; + } + + if (utils.isQuotedString(pattern)) { + return [pattern.slice(1, -1)]; + } + + var proto = new Braces(options); + var result = !options || options.expand !== true + ? proto.optimize(pattern, options) + : proto.expand(pattern, options); + + // get the generated pattern(s) + var arr = result.output; + + // filter out empty strings if specified + if (options && options.noempty === true) { + arr = arr.filter(Boolean); + } + + // filter out duplicates if specified + if (options && options.nodupes === true) { + arr = unique(arr); + } + + Object.defineProperty(arr, 'result', { + enumerable: false, + value: result + }); + + return arr; + } + + return memoize('create', pattern, options, create); +}; + +/** + * Create a regular expression from the given string `pattern`. + * + * ```js + * var braces = require('braces'); + * + * console.log(braces.makeRe('id-{200..300}')); + * //=> /^(?:id-(20[0-9]|2[1-9][0-9]|300))$/ + * ``` + * @param {String} `pattern` The pattern to convert to regex. + * @param {Object} `options` + * @return {RegExp} + * @api public + */ + +braces.makeRe = function(pattern, options) { + if (typeof pattern !== 'string') { + throw new TypeError('expected a string'); + } + + var maxLength = (options && options.maxLength) || MAX_LENGTH; + if (pattern.length >= maxLength) { + throw new Error('expected pattern to be less than ' + maxLength + ' characters'); + } + + function makeRe() { + var arr = braces(pattern, options); + var opts = extend({strictErrors: false}, options); + return toRegex(arr, opts); + } + + return memoize('makeRe', pattern, options, makeRe); +}; + +/** + * Parse the given `str` with the given `options`. + * + * ```js + * var braces = require('braces'); + * var ast = braces.parse('a/{b,c}/d'); + * console.log(ast); + * // { type: 'root', + * // errors: [], + * // input: 'a/{b,c}/d', + * // nodes: + * // [ { type: 'bos', val: '' }, + * // { type: 'text', val: 'a/' }, + * // { type: 'brace', + * // nodes: + * // [ { type: 'brace.open', val: '{' }, + * // { type: 'text', val: 'b,c' }, + * // { type: 'brace.close', val: '}' } ] }, + * // { type: 'text', val: '/d' }, + * // { type: 'eos', val: '' } ] } + * ``` + * @param {String} `pattern` Brace pattern to parse + * @param {Object} `options` + * @return {Object} Returns an AST + * @api public + */ + +braces.parse = function(pattern, options) { + var proto = new Braces(options); + return proto.parse(pattern, options); +}; + +/** + * Compile the given `ast` or string with the given `options`. + * + * ```js + * var braces = require('braces'); + * var ast = braces.parse('a/{b,c}/d'); + * console.log(braces.compile(ast)); + * // { options: { source: 'string' }, + * // state: {}, + * // compilers: + * // { eos: [Function], + * // noop: [Function], + * // bos: [Function], + * // brace: [Function], + * // 'brace.open': [Function], + * // text: [Function], + * // 'brace.close': [Function] }, + * // output: [ 'a/(b|c)/d' ], + * // ast: + * // { ... }, + * // parsingErrors: [] } + * ``` + * @param {Object|String} `ast` AST from [.parse](#parse). If a string is passed it will be parsed first. + * @param {Object} `options` + * @return {Object} Returns an object that has an `output` property with the compiled string. + * @api public + */ + +braces.compile = function(ast, options) { + var proto = new Braces(options); + return proto.compile(ast, options); +}; + +/** + * Clear the regex cache. + * + * ```js + * braces.clearCache(); + * ``` + * @api public + */ + +braces.clearCache = function() { + cache = braces.cache = {}; +}; + +/** + * Memoize a generated regex or function. A unique key is generated + * from the method name, pattern, and user-defined options. Set + * options.memoize to false to disable. + */ + +function memoize(type, pattern, options, fn) { + var key = utils.createKey(type + ':' + pattern, options); + var disabled = options && options.cache === false; + if (disabled) { + braces.clearCache(); + return fn(pattern, options); + } + + if (cache.hasOwnProperty(key)) { + return cache[key]; + } + + var res = fn(pattern, options); + cache[key] = res; + return res; +} + +/** + * Expose `Braces` constructor and methods + * @type {Function} + */ + +braces.Braces = Braces; +braces.compilers = compilers; +braces.parsers = parsers; +braces.cache = cache; + +/** + * Expose `braces` + * @type {Function} + */ + +module.exports = braces; + + +/***/ }), +/* 73 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var safe = __webpack_require__(74); +var define = __webpack_require__(80); +var extend = __webpack_require__(88); +var not = __webpack_require__(92); +var MAX_LENGTH = 1024 * 64; + +/** + * Session cache + */ + +var cache = {}; + +/** + * Create a regular expression from the given `pattern` string. + * + * @param {String|RegExp} `pattern` Pattern can be a string or regular expression. + * @param {Object} `options` + * @return {RegExp} + * @api public + */ + +module.exports = function(patterns, options) { + if (!Array.isArray(patterns)) { + return makeRe(patterns, options); + } + return makeRe(patterns.join('|'), options); +}; + +/** + * Create a regular expression from the given `pattern` string. + * + * @param {String|RegExp} `pattern` Pattern can be a string or regular expression. + * @param {Object} `options` + * @return {RegExp} + * @api public + */ + +function makeRe(pattern, options) { + if (pattern instanceof RegExp) { + return pattern; + } + + if (typeof pattern !== 'string') { + throw new TypeError('expected a string'); + } + + if (pattern.length > MAX_LENGTH) { + throw new Error('expected pattern to be less than ' + MAX_LENGTH + ' characters'); + } + + var key = pattern; + // do this before shallow cloning options, it's a lot faster + if (!options || (options && options.cache !== false)) { + key = createKey(pattern, options); + + if (cache.hasOwnProperty(key)) { + return cache[key]; + } + } + + var opts = extend({}, options); + if (opts.contains === true) { + if (opts.negate === true) { + opts.strictNegate = false; + } else { + opts.strict = false; + } + } + + if (opts.strict === false) { + opts.strictOpen = false; + opts.strictClose = false; + } + + var open = opts.strictOpen !== false ? '^' : ''; + var close = opts.strictClose !== false ? '$' : ''; + var flags = opts.flags || ''; + var regex; + + if (opts.nocase === true && !/i/.test(flags)) { + flags += 'i'; + } + + try { + if (opts.negate || typeof opts.strictNegate === 'boolean') { + pattern = not.create(pattern, opts); + } + + var str = open + '(?:' + pattern + ')' + close; + regex = new RegExp(str, flags); + + if (opts.safe === true && safe(regex) === false) { + throw new Error('potentially unsafe regular expression: ' + regex.source); + } + + } catch (err) { + if (opts.strictErrors === true || opts.safe === true) { + err.key = key; + err.pattern = pattern; + err.originalOptions = options; + err.createdOptions = opts; + throw err; + } + + try { + regex = new RegExp('^' + pattern.replace(/(\W)/g, '\\$1') + '$'); + } catch (err) { + regex = /.^/; //<= match nothing + } + } + + if (opts.cache !== false) { + memoize(regex, key, pattern, opts); + } + return regex; +} + +/** + * Memoize generated regex. This can result in dramatic speed improvements + * and simplify debugging by adding options and pattern to the regex. It can be + * disabled by passing setting `options.cache` to false. + */ + +function memoize(regex, key, pattern, options) { + define(regex, 'cached', true); + define(regex, 'pattern', pattern); + define(regex, 'options', options); + define(regex, 'key', key); + cache[key] = regex; +} + +/** + * Create the key to use for memoization. The key is generated + * by iterating over the options and concatenating key-value pairs + * to the pattern string. + */ + +function createKey(pattern, options) { + if (!options) return pattern; + var key = pattern; + for (var prop in options) { + if (options.hasOwnProperty(prop)) { + key += ';' + prop + '=' + String(options[prop]); + } + } + return key; +} + +/** + * Expose `makeRe` + */ + +module.exports.makeRe = makeRe; + + +/***/ }), +/* 74 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var parse = __webpack_require__(75); +var types = parse.types; + +module.exports = function (re, opts) { + if (!opts) opts = {}; + var replimit = opts.limit === undefined ? 25 : opts.limit; + + if (isRegExp(re)) re = re.source; + else if (typeof re !== 'string') re = String(re); + + try { re = parse(re) } + catch (err) { return false } + + var reps = 0; + return (function walk (node, starHeight) { + if (node.type === types.REPETITION) { + starHeight ++; + reps ++; + if (starHeight > 1) return false; + if (reps > replimit) return false; + } + + if (node.options) { + for (var i = 0, len = node.options.length; i < len; i++) { + var ok = walk({ stack: node.options[i] }, starHeight); + if (!ok) return false; + } + } + var stack = node.stack || (node.value && node.value.stack); + if (!stack) return true; + + for (var i = 0; i < stack.length; i++) { + var ok = walk(stack[i], starHeight); + if (!ok) return false; + } + + return true; + })(re, 0); +}; + +function isRegExp (x) { + return {}.toString.call(x) === '[object RegExp]'; +} + + +/***/ }), +/* 75 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var util = __webpack_require__(76); +var types = __webpack_require__(77); +var sets = __webpack_require__(78); +var positions = __webpack_require__(79); + + +module.exports = function(regexpStr) { + var i = 0, l, c, + start = { type: types.ROOT, stack: []}, + + // Keep track of last clause/group and stack. + lastGroup = start, + last = start.stack, + groupStack = []; + + + var repeatErr = function(i) { + util.error(regexpStr, 'Nothing to repeat at column ' + (i - 1)); + }; + + // Decode a few escaped characters. + var str = util.strToChars(regexpStr); + l = str.length; + + // Iterate through each character in string. + while (i < l) { + c = str[i++]; + + switch (c) { + // Handle escaped characters, inclues a few sets. + case '\\': + c = str[i++]; + + switch (c) { + case 'b': + last.push(positions.wordBoundary()); + break; + + case 'B': + last.push(positions.nonWordBoundary()); + break; + + case 'w': + last.push(sets.words()); + break; + + case 'W': + last.push(sets.notWords()); + break; + + case 'd': + last.push(sets.ints()); + break; + + case 'D': + last.push(sets.notInts()); + break; + + case 's': + last.push(sets.whitespace()); + break; + + case 'S': + last.push(sets.notWhitespace()); + break; + + default: + // Check if c is integer. + // In which case it's a reference. + if (/\d/.test(c)) { + last.push({ type: types.REFERENCE, value: parseInt(c, 10) }); + + // Escaped character. + } else { + last.push({ type: types.CHAR, value: c.charCodeAt(0) }); + } + } + + break; + + + // Positionals. + case '^': + last.push(positions.begin()); + break; + + case '$': + last.push(positions.end()); + break; + + + // Handle custom sets. + case '[': + // Check if this class is 'anti' i.e. [^abc]. + var not; + if (str[i] === '^') { + not = true; + i++; + } else { + not = false; + } + + // Get all the characters in class. + var classTokens = util.tokenizeClass(str.slice(i), regexpStr); + + // Increase index by length of class. + i += classTokens[1]; + last.push({ + type: types.SET, + set: classTokens[0], + not: not, + }); + + break; + + + // Class of any character except \n. + case '.': + last.push(sets.anyChar()); + break; + + + // Push group onto stack. + case '(': + // Create group. + var group = { + type: types.GROUP, + stack: [], + remember: true, + }; + + c = str[i]; + + // If if this is a special kind of group. + if (c === '?') { + c = str[i + 1]; + i += 2; + + // Match if followed by. + if (c === '=') { + group.followedBy = true; + + // Match if not followed by. + } else if (c === '!') { + group.notFollowedBy = true; + + } else if (c !== ':') { + util.error(regexpStr, + 'Invalid group, character \'' + c + + '\' after \'?\' at column ' + (i - 1)); + } + + group.remember = false; + } + + // Insert subgroup into current group stack. + last.push(group); + + // Remember the current group for when the group closes. + groupStack.push(lastGroup); + + // Make this new group the current group. + lastGroup = group; + last = group.stack; + break; + + + // Pop group out of stack. + case ')': + if (groupStack.length === 0) { + util.error(regexpStr, 'Unmatched ) at column ' + (i - 1)); + } + lastGroup = groupStack.pop(); + + // Check if this group has a PIPE. + // To get back the correct last stack. + last = lastGroup.options ? + lastGroup.options[lastGroup.options.length - 1] : lastGroup.stack; + break; + + + // Use pipe character to give more choices. + case '|': + // Create array where options are if this is the first PIPE + // in this clause. + if (!lastGroup.options) { + lastGroup.options = [lastGroup.stack]; + delete lastGroup.stack; + } + + // Create a new stack and add to options for rest of clause. + var stack = []; + lastGroup.options.push(stack); + last = stack; + break; + + + // Repetition. + // For every repetition, remove last element from last stack + // then insert back a RANGE object. + // This design is chosen because there could be more than + // one repetition symbols in a regex i.e. `a?+{2,3}`. + case '{': + var rs = /^(\d+)(,(\d+)?)?\}/.exec(str.slice(i)), min, max; + if (rs !== null) { + if (last.length === 0) { + repeatErr(i); + } + min = parseInt(rs[1], 10); + max = rs[2] ? rs[3] ? parseInt(rs[3], 10) : Infinity : min; + i += rs[0].length; + + last.push({ + type: types.REPETITION, + min: min, + max: max, + value: last.pop(), + }); + } else { + last.push({ + type: types.CHAR, + value: 123, + }); + } + break; + + case '?': + if (last.length === 0) { + repeatErr(i); + } + last.push({ + type: types.REPETITION, + min: 0, + max: 1, + value: last.pop(), + }); + break; + + case '+': + if (last.length === 0) { + repeatErr(i); + } + last.push({ + type: types.REPETITION, + min: 1, + max: Infinity, + value: last.pop(), + }); + break; + + case '*': + if (last.length === 0) { + repeatErr(i); + } + last.push({ + type: types.REPETITION, + min: 0, + max: Infinity, + value: last.pop(), + }); + break; + + + // Default is a character that is not `\[](){}?+*^$`. + default: + last.push({ + type: types.CHAR, + value: c.charCodeAt(0), + }); + } + + } + + // Check if any groups have not been closed. + if (groupStack.length !== 0) { + util.error(regexpStr, 'Unterminated group'); + } + + return start; +}; + +module.exports.types = types; + + +/***/ }), +/* 76 */ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +var types = __webpack_require__(77); +var sets = __webpack_require__(78); + + +// All of these are private and only used by randexp. +// It's assumed that they will always be called with the correct input. + +var CTRL = '@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^ ?'; +var SLSH = { '0': 0, 't': 9, 'n': 10, 'v': 11, 'f': 12, 'r': 13 }; + +/** + * Finds character representations in str and convert all to + * their respective characters + * + * @param {String} str + * @return {String} + */ +exports.strToChars = function(str) { + /* jshint maxlen: false */ + var chars_regex = /(\[\\b\])|(\\)?\\(?:u([A-F0-9]{4})|x([A-F0-9]{2})|(0?[0-7]{2})|c([@A-Z\[\\\]\^?])|([0tnvfr]))/g; + str = str.replace(chars_regex, function(s, b, lbs, a16, b16, c8, dctrl, eslsh) { + if (lbs) { + return s; + } + + var code = b ? 8 : + a16 ? parseInt(a16, 16) : + b16 ? parseInt(b16, 16) : + c8 ? parseInt(c8, 8) : + dctrl ? CTRL.indexOf(dctrl) : + SLSH[eslsh]; + + var c = String.fromCharCode(code); + + // Escape special regex characters. + if (/[\[\]{}\^$.|?*+()]/.test(c)) { + c = '\\' + c; + } + + return c; + }); + + return str; +}; + + +/** + * turns class into tokens + * reads str until it encounters a ] not preceeded by a \ + * + * @param {String} str + * @param {String} regexpStr + * @return {Array., Number>} + */ +exports.tokenizeClass = function(str, regexpStr) { + /* jshint maxlen: false */ + var tokens = []; + var regexp = /\\(?:(w)|(d)|(s)|(W)|(D)|(S))|((?:(?:\\)(.)|([^\]\\]))-(?:\\)?([^\]]))|(\])|(?:\\)?(.)/g; + var rs, c; + + + while ((rs = regexp.exec(str)) != null) { + if (rs[1]) { + tokens.push(sets.words()); + + } else if (rs[2]) { + tokens.push(sets.ints()); + + } else if (rs[3]) { + tokens.push(sets.whitespace()); + + } else if (rs[4]) { + tokens.push(sets.notWords()); + + } else if (rs[5]) { + tokens.push(sets.notInts()); + + } else if (rs[6]) { + tokens.push(sets.notWhitespace()); + + } else if (rs[7]) { + tokens.push({ + type: types.RANGE, + from: (rs[8] || rs[9]).charCodeAt(0), + to: rs[10].charCodeAt(0), + }); + + } else if (c = rs[12]) { + tokens.push({ + type: types.CHAR, + value: c.charCodeAt(0), + }); + + } else { + return [tokens, regexp.lastIndex]; + } + } + + exports.error(regexpStr, 'Unterminated character class'); +}; + + +/** + * Shortcut to throw errors. + * + * @param {String} regexp + * @param {String} msg + */ +exports.error = function(regexp, msg) { + throw new SyntaxError('Invalid regular expression: /' + regexp + '/: ' + msg); +}; + + +/***/ }), +/* 77 */ +/***/ ((module) => { + +module.exports = { + ROOT : 0, + GROUP : 1, + POSITION : 2, + SET : 3, + RANGE : 4, + REPETITION : 5, + REFERENCE : 6, + CHAR : 7, +}; + + +/***/ }), +/* 78 */ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +var types = __webpack_require__(77); + +var INTS = function() { + return [{ type: types.RANGE , from: 48, to: 57 }]; +}; + +var WORDS = function() { + return [ + { type: types.CHAR, value: 95 }, + { type: types.RANGE, from: 97, to: 122 }, + { type: types.RANGE, from: 65, to: 90 } + ].concat(INTS()); +}; + +var WHITESPACE = function() { + return [ + { type: types.CHAR, value: 9 }, + { type: types.CHAR, value: 10 }, + { type: types.CHAR, value: 11 }, + { type: types.CHAR, value: 12 }, + { type: types.CHAR, value: 13 }, + { type: types.CHAR, value: 32 }, + { type: types.CHAR, value: 160 }, + { type: types.CHAR, value: 5760 }, + { type: types.CHAR, value: 6158 }, + { type: types.CHAR, value: 8192 }, + { type: types.CHAR, value: 8193 }, + { type: types.CHAR, value: 8194 }, + { type: types.CHAR, value: 8195 }, + { type: types.CHAR, value: 8196 }, + { type: types.CHAR, value: 8197 }, + { type: types.CHAR, value: 8198 }, + { type: types.CHAR, value: 8199 }, + { type: types.CHAR, value: 8200 }, + { type: types.CHAR, value: 8201 }, + { type: types.CHAR, value: 8202 }, + { type: types.CHAR, value: 8232 }, + { type: types.CHAR, value: 8233 }, + { type: types.CHAR, value: 8239 }, + { type: types.CHAR, value: 8287 }, + { type: types.CHAR, value: 12288 }, + { type: types.CHAR, value: 65279 } + ]; +}; + +var NOTANYCHAR = function() { + return [ + { type: types.CHAR, value: 10 }, + { type: types.CHAR, value: 13 }, + { type: types.CHAR, value: 8232 }, + { type: types.CHAR, value: 8233 }, + ]; +}; + +// Predefined class objects. +exports.words = function() { + return { type: types.SET, set: WORDS(), not: false }; +}; + +exports.notWords = function() { + return { type: types.SET, set: WORDS(), not: true }; +}; + +exports.ints = function() { + return { type: types.SET, set: INTS(), not: false }; +}; + +exports.notInts = function() { + return { type: types.SET, set: INTS(), not: true }; +}; + +exports.whitespace = function() { + return { type: types.SET, set: WHITESPACE(), not: false }; +}; + +exports.notWhitespace = function() { + return { type: types.SET, set: WHITESPACE(), not: true }; +}; + +exports.anyChar = function() { + return { type: types.SET, set: NOTANYCHAR(), not: true }; +}; + + +/***/ }), +/* 79 */ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +var types = __webpack_require__(77); + +exports.wordBoundary = function() { + return { type: types.POSITION, value: 'b' }; +}; + +exports.nonWordBoundary = function() { + return { type: types.POSITION, value: 'B' }; +}; + +exports.begin = function() { + return { type: types.POSITION, value: '^' }; +}; + +exports.end = function() { + return { type: types.POSITION, value: '$' }; +}; + + +/***/ }), +/* 80 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +/*! + * define-property + * + * Copyright (c) 2015-2018, Jon Schlinkert. + * Released under the MIT License. + */ + + + +var isobject = __webpack_require__(81); +var isDescriptor = __webpack_require__(82); +var define = (typeof Reflect !== 'undefined' && Reflect.defineProperty) + ? Reflect.defineProperty + : Object.defineProperty; + +module.exports = function defineProperty(obj, key, val) { + if (!isobject(obj) && typeof obj !== 'function' && !Array.isArray(obj)) { + throw new TypeError('expected an object, function, or array'); + } + + if (typeof key !== 'string') { + throw new TypeError('expected "key" to be a string'); + } + + if (isDescriptor(val)) { + define(obj, key, val); + return obj; + } + + define(obj, key, { + configurable: true, + enumerable: false, + writable: true, + value: val + }); + + return obj; +}; + + +/***/ }), +/* 81 */ +/***/ ((module) => { + +"use strict"; +/*! + * isobject + * + * Copyright (c) 2014-2017, Jon Schlinkert. + * Released under the MIT License. + */ + + + +module.exports = function isObject(val) { + return val != null && typeof val === 'object' && Array.isArray(val) === false; +}; + + +/***/ }), +/* 82 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var isAccessor = __webpack_require__(83); +var isData = __webpack_require__(87); + +module.exports = function isDescriptor(obj, key) { + if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) { + return false; + } + + if ('get' in obj || 'set' in obj) { + return isAccessor(obj, key); + } + + return isData(obj, key); +}; + + +/***/ }), +/* 83 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var hasOwn = __webpack_require__(84); + +// accessor descriptor properties +var accessor = { + __proto__: null, + configurable: 'boolean', + enumerable: 'boolean', + get: 'function', + set: 'function' +}; + +module.exports = function isAccessorDescriptor(obj, prop) { + if (typeof prop === 'string') { + var val = Object.getOwnPropertyDescriptor(obj, prop); + return typeof val !== 'undefined'; + } + + if (!obj || typeof obj !== 'object') { + return false; + } + + if (hasOwn(obj, 'value') || hasOwn(obj, 'writable')) { + return false; + } + + // one of them must be a function + if ( + (!hasOwn(obj, 'get') || typeof obj.get !== 'function') + && (!hasOwn(obj, 'set') || typeof obj.set !== 'function') + ) { + return false; + } + + // both of them must be a function or undefined + if ( + (hasOwn(obj, 'get') && typeof obj.get !== 'function' && typeof obj.get !== 'undefined') + || (hasOwn(obj, 'set') && typeof obj.set !== 'function' && typeof obj.set !== 'undefined') + ) { + return false; + } + + for (var key in obj) { // eslint-disable-line no-restricted-syntax + if (hasOwn(obj, key) && hasOwn(accessor, key) && typeof obj[key] !== accessor[key] && typeof obj[key] !== 'undefined') { + return false; + } + } + return true; +}; + + +/***/ }), +/* 84 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var call = Function.prototype.call; +var $hasOwn = Object.prototype.hasOwnProperty; +var bind = __webpack_require__(85); + +/** @type {import('.')} */ +module.exports = bind.call(call, $hasOwn); + + +/***/ }), +/* 85 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var implementation = __webpack_require__(86); + +module.exports = Function.prototype.bind || implementation; + + +/***/ }), +/* 86 */ +/***/ ((module) => { + +"use strict"; + + +/* eslint no-invalid-this: 1 */ + +var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible '; +var toStr = Object.prototype.toString; +var max = Math.max; +var funcType = '[object Function]'; + +var concatty = function concatty(a, b) { + var arr = []; + + for (var i = 0; i < a.length; i += 1) { + arr[i] = a[i]; + } + for (var j = 0; j < b.length; j += 1) { + arr[j + a.length] = b[j]; + } + + return arr; +}; + +var slicy = function slicy(arrLike, offset) { + var arr = []; + for (var i = offset || 0, j = 0; i < arrLike.length; i += 1, j += 1) { + arr[j] = arrLike[i]; + } + return arr; +}; + +var joiny = function (arr, joiner) { + var str = ''; + for (var i = 0; i < arr.length; i += 1) { + str += arr[i]; + if (i + 1 < arr.length) { + str += joiner; + } + } + return str; +}; + +module.exports = function bind(that) { + var target = this; + if (typeof target !== 'function' || toStr.apply(target) !== funcType) { + throw new TypeError(ERROR_MESSAGE + target); + } + var args = slicy(arguments, 1); + + var bound; + var binder = function () { + if (this instanceof bound) { + var result = target.apply( + this, + concatty(args, arguments) + ); + if (Object(result) === result) { + return result; + } + return this; + } + return target.apply( + that, + concatty(args, arguments) + ); + + }; + + var boundLength = max(0, target.length - args.length); + var boundArgs = []; + for (var i = 0; i < boundLength; i++) { + boundArgs[i] = '$' + i; + } + + bound = Function('binder', 'return function (' + joiny(boundArgs, ',') + '){ return binder.apply(this,arguments); }')(binder); + + if (target.prototype) { + var Empty = function Empty() {}; + Empty.prototype = target.prototype; + bound.prototype = new Empty(); + Empty.prototype = null; + } + + return bound; +}; + + +/***/ }), +/* 87 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var hasOwn = __webpack_require__(84); + +// data descriptor properties +var data = { + __proto__: null, + configurable: 'boolean', + enumerable: 'boolean', + writable: 'boolean', +}; + +module.exports = function isDataDescriptor(obj, prop) { + if (!obj || typeof obj !== 'object') { + return false; + } + + if (typeof prop === 'string') { + var val = Object.getOwnPropertyDescriptor(obj, prop); + return typeof val !== 'undefined'; + } + + if ( + (!('value' in obj) && !('writable' in obj)) + || 'get' in obj + || 'set' in obj + ) { + return false; + } + + for (var key in obj) { // eslint-disable-line no-restricted-syntax + if ( + key !== 'value' + && hasOwn(obj, key) + && hasOwn(data, key) + && typeof obj[key] !== data[key] + && typeof obj[key] !== 'undefined' + ) { + return false; + } + } + return true; +}; + + +/***/ }), +/* 88 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var isExtendable = __webpack_require__(89); +var assignSymbols = __webpack_require__(91); + +module.exports = Object.assign || function(obj/*, objects*/) { + if (obj === null || typeof obj === 'undefined') { + throw new TypeError('Cannot convert undefined or null to object'); + } + if (!isObject(obj)) { + obj = {}; + } + for (var i = 1; i < arguments.length; i++) { + var val = arguments[i]; + if (isString(val)) { + val = toObject(val); + } + if (isObject(val)) { + assign(obj, val); + assignSymbols(obj, val); + } + } + return obj; +}; + +function assign(a, b) { + for (var key in b) { + if (hasOwn(b, key)) { + a[key] = b[key]; + } + } +} + +function isString(val) { + return (val && typeof val === 'string'); +} + +function toObject(str) { + var obj = {}; + for (var i in str) { + obj[i] = str[i]; + } + return obj; +} + +function isObject(val) { + return (val && typeof val === 'object') || isExtendable(val); +} + +/** + * Returns true if the given `key` is an own property of `obj`. + */ + +function hasOwn(obj, key) { + return Object.prototype.hasOwnProperty.call(obj, key); +} + +function isEnum(obj, key) { + return Object.prototype.propertyIsEnumerable.call(obj, key); +} + + +/***/ }), +/* 89 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +/*! + * is-extendable + * + * Copyright (c) 2015-2017, Jon Schlinkert. + * Released under the MIT License. + */ + + + +var isPlainObject = __webpack_require__(90); + +module.exports = function isExtendable(val) { + return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); +}; + + +/***/ }), +/* 90 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +/*! + * is-plain-object + * + * Copyright (c) 2014-2017, Jon Schlinkert. + * Released under the MIT License. + */ + + + +var isObject = __webpack_require__(81); + +function isObjectObject(o) { + return isObject(o) === true + && Object.prototype.toString.call(o) === '[object Object]'; +} + +module.exports = function isPlainObject(o) { + var ctor,prot; + + if (isObjectObject(o) === false) return false; + + // If has modified constructor + ctor = o.constructor; + if (typeof ctor !== 'function') return false; + + // If has modified prototype + prot = ctor.prototype; + if (isObjectObject(prot) === false) return false; + + // If constructor does not have an Object-specific method + if (prot.hasOwnProperty('isPrototypeOf') === false) { + return false; + } + + // Most likely a plain Object + return true; +}; + + +/***/ }), +/* 91 */ +/***/ ((module) => { + +"use strict"; +/*! + * assign-symbols + * + * Copyright (c) 2015, Jon Schlinkert. + * Licensed under the MIT License. + */ + + + +module.exports = function(receiver, objects) { + if (receiver === null || typeof receiver === 'undefined') { + throw new TypeError('expected first argument to be an object.'); + } + + if (typeof objects === 'undefined' || typeof Symbol === 'undefined') { + return receiver; + } + + if (typeof Object.getOwnPropertySymbols !== 'function') { + return receiver; + } + + var isEnumerable = Object.prototype.propertyIsEnumerable; + var target = Object(receiver); + var len = arguments.length, i = 0; + + while (++i < len) { + var provider = Object(arguments[i]); + var names = Object.getOwnPropertySymbols(provider); + + for (var j = 0; j < names.length; j++) { + var key = names[j]; + + if (isEnumerable.call(provider, key)) { + target[key] = provider[key]; + } + } + } + return target; +}; + + +/***/ }), +/* 92 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var extend = __webpack_require__(93); +var safe = __webpack_require__(74); + +/** + * The main export is a function that takes a `pattern` string and an `options` object. + * + * ```js + & var not = require('regex-not'); + & console.log(not('foo')); + & //=> /^(?:(?!^(?:foo)$).)*$/ + * ``` + * + * @param {String} `pattern` + * @param {Object} `options` + * @return {RegExp} Converts the given `pattern` to a regex using the specified `options`. + * @api public + */ + +function toRegex(pattern, options) { + return new RegExp(toRegex.create(pattern, options)); +} + +/** + * Create a regex-compatible string from the given `pattern` and `options`. + * + * ```js + & var not = require('regex-not'); + & console.log(not.create('foo')); + & //=> '^(?:(?!^(?:foo)$).)*$' + * ``` + * @param {String} `pattern` + * @param {Object} `options` + * @return {String} + * @api public + */ + +toRegex.create = function(pattern, options) { + if (typeof pattern !== 'string') { + throw new TypeError('expected a string'); + } + + var opts = extend({}, options); + if (opts.contains === true) { + opts.strictNegate = false; + } + + var open = opts.strictOpen !== false ? '^' : ''; + var close = opts.strictClose !== false ? '$' : ''; + var endChar = opts.endChar ? opts.endChar : '+'; + var str = pattern; + + if (opts.strictNegate === false) { + str = '(?:(?!(?:' + pattern + ')).)' + endChar; + } else { + str = '(?:(?!^(?:' + pattern + ')$).)' + endChar; + } + + var res = open + str + close; + if (opts.safe === true && safe(res) === false) { + throw new Error('potentially unsafe regular expression: ' + res); + } + + return res; +}; + +/** + * Expose `toRegex` + */ + +module.exports = toRegex; + + +/***/ }), +/* 93 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var isExtendable = __webpack_require__(94); +var assignSymbols = __webpack_require__(91); + +module.exports = Object.assign || function(obj/*, objects*/) { + if (obj === null || typeof obj === 'undefined') { + throw new TypeError('Cannot convert undefined or null to object'); + } + if (!isObject(obj)) { + obj = {}; + } + for (var i = 1; i < arguments.length; i++) { + var val = arguments[i]; + if (isString(val)) { + val = toObject(val); + } + if (isObject(val)) { + assign(obj, val); + assignSymbols(obj, val); + } + } + return obj; +}; + +function assign(a, b) { + for (var key in b) { + if (hasOwn(b, key)) { + a[key] = b[key]; + } + } +} + +function isString(val) { + return (val && typeof val === 'string'); +} + +function toObject(str) { + var obj = {}; + for (var i in str) { + obj[i] = str[i]; + } + return obj; +} + +function isObject(val) { + return (val && typeof val === 'object') || isExtendable(val); +} + +/** + * Returns true if the given `key` is an own property of `obj`. + */ + +function hasOwn(obj, key) { + return Object.prototype.hasOwnProperty.call(obj, key); +} + +function isEnum(obj, key) { + return Object.prototype.propertyIsEnumerable.call(obj, key); +} + + +/***/ }), +/* 94 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +/*! + * is-extendable + * + * Copyright (c) 2015-2017, Jon Schlinkert. + * Released under the MIT License. + */ + + + +var isPlainObject = __webpack_require__(90); + +module.exports = function isExtendable(val) { + return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); +}; + + +/***/ }), +/* 95 */ +/***/ ((module) => { + +"use strict"; +/*! + * array-unique + * + * Copyright (c) 2014-2015, Jon Schlinkert. + * Licensed under the MIT License. + */ + + + +module.exports = function unique(arr) { + if (!Array.isArray(arr)) { + throw new TypeError('array-unique expects an array.'); + } + + var len = arr.length; + var i = -1; + + while (i++ < len) { + var j = i + 1; + + for (; j < arr.length; ++j) { + if (arr[i] === arr[j]) { + arr.splice(j--, 1); + } + } + } + return arr; +}; + +module.exports.immutable = function uniqueImmutable(arr) { + if (!Array.isArray(arr)) { + throw new TypeError('array-unique expects an array.'); + } + + var arrLen = arr.length; + var newArr = new Array(arrLen); + + for (var i = 0; i < arrLen; i++) { + newArr[i] = arr[i]; + } + + return module.exports(newArr); +}; + + +/***/ }), +/* 96 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var isObject = __webpack_require__(97); + +module.exports = function extend(o/*, objects*/) { + if (!isObject(o)) { o = {}; } + + var len = arguments.length; + for (var i = 1; i < len; i++) { + var obj = arguments[i]; + + if (isObject(obj)) { + assign(o, obj); + } + } + return o; +}; + +function assign(a, b) { + for (var key in b) { + if (hasOwn(b, key)) { + a[key] = b[key]; + } + } +} + +/** + * Returns true if the given `key` is an own property of `obj`. + */ + +function hasOwn(obj, key) { + return Object.prototype.hasOwnProperty.call(obj, key); +} + + +/***/ }), +/* 97 */ +/***/ ((module) => { + +"use strict"; +/*! + * is-extendable + * + * Copyright (c) 2015, Jon Schlinkert. + * Licensed under the MIT License. + */ + + + +module.exports = function isExtendable(val) { + return typeof val !== 'undefined' && val !== null + && (typeof val === 'object' || typeof val === 'function'); +}; + + +/***/ }), +/* 98 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var utils = __webpack_require__(99); + +module.exports = function(braces, options) { + braces.compiler + + /** + * bos + */ + + .set('bos', function() { + if (this.output) return; + this.ast.queue = isEscaped(this.ast) ? [this.ast.val] : []; + this.ast.count = 1; + }) + + /** + * Square brackets + */ + + .set('bracket', function(node) { + var close = node.close; + var open = !node.escaped ? '[' : '\\['; + var negated = node.negated; + var inner = node.inner; + + inner = inner.replace(/\\(?=[\\\w]|$)/g, '\\\\'); + if (inner === ']-') { + inner = '\\]\\-'; + } + + if (negated && inner.indexOf('.') === -1) { + inner += '.'; + } + if (negated && inner.indexOf('/') === -1) { + inner += '/'; + } + + var val = open + negated + inner + close; + var queue = node.parent.queue; + var last = utils.arrayify(queue.pop()); + + queue.push(utils.join(last, val)); + queue.push.apply(queue, []); + }) + + /** + * Brace + */ + + .set('brace', function(node) { + node.queue = isEscaped(node) ? [node.val] : []; + node.count = 1; + return this.mapVisit(node.nodes); + }) + + /** + * Open + */ + + .set('brace.open', function(node) { + node.parent.open = node.val; + }) + + /** + * Inner + */ + + .set('text', function(node) { + var queue = node.parent.queue; + var escaped = node.escaped; + var segs = [node.val]; + + if (node.optimize === false) { + options = utils.extend({}, options, {optimize: false}); + } + + if (node.multiplier > 1) { + node.parent.count *= node.multiplier; + } + + if (options.quantifiers === true && utils.isQuantifier(node.val)) { + escaped = true; + + } else if (node.val.length > 1) { + if (isType(node.parent, 'brace') && !isEscaped(node)) { + var expanded = utils.expand(node.val, options); + segs = expanded.segs; + + if (expanded.isOptimized) { + node.parent.isOptimized = true; + } + + // if nothing was expanded, we probably have a literal brace + if (!segs.length) { + var val = (expanded.val || node.val); + if (options.unescape !== false) { + // unescape unexpanded brace sequence/set separators + val = val.replace(/\\([,.])/g, '$1'); + // strip quotes + val = val.replace(/["'`]/g, ''); + } + + segs = [val]; + escaped = true; + } + } + + } else if (node.val === ',') { + if (options.expand) { + node.parent.queue.push(['']); + segs = ['']; + } else { + segs = ['|']; + } + } else { + escaped = true; + } + + if (escaped && isType(node.parent, 'brace')) { + if (node.parent.nodes.length <= 4 && node.parent.count === 1) { + node.parent.escaped = true; + } else if (node.parent.length <= 3) { + node.parent.escaped = true; + } + } + + if (!hasQueue(node.parent)) { + node.parent.queue = segs; + return; + } + + var last = utils.arrayify(queue.pop()); + if (node.parent.count > 1 && options.expand) { + last = multiply(last, node.parent.count); + node.parent.count = 1; + } + + queue.push(utils.join(utils.flatten(last), segs.shift())); + queue.push.apply(queue, segs); + }) + + /** + * Close + */ + + .set('brace.close', function(node) { + var queue = node.parent.queue; + var prev = node.parent.parent; + var last = prev.queue.pop(); + var open = node.parent.open; + var close = node.val; + + if (open && close && isOptimized(node, options)) { + open = '('; + close = ')'; + } + + // if a close brace exists, and the previous segment is one character + // don't wrap the result in braces or parens + var ele = utils.last(queue); + if (node.parent.count > 1 && options.expand) { + ele = multiply(queue.pop(), node.parent.count); + node.parent.count = 1; + queue.push(ele); + } + + if (close && typeof ele === 'string' && ele.length === 1) { + open = ''; + close = ''; + } + + if ((isLiteralBrace(node, options) || noInner(node)) && !node.parent.hasEmpty) { + queue.push(utils.join(open, queue.pop() || '')); + queue = utils.flatten(utils.join(queue, close)); + } + + if (typeof last === 'undefined') { + prev.queue = [queue]; + } else { + prev.queue.push(utils.flatten(utils.join(last, queue))); + } + }) + + /** + * eos + */ + + .set('eos', function(node) { + if (this.input) return; + + if (options.optimize !== false) { + this.output = utils.last(utils.flatten(this.ast.queue)); + } else if (Array.isArray(utils.last(this.ast.queue))) { + this.output = utils.flatten(this.ast.queue.pop()); + } else { + this.output = utils.flatten(this.ast.queue); + } + + if (node.parent.count > 1 && options.expand) { + this.output = multiply(this.output, node.parent.count); + } + + this.output = utils.arrayify(this.output); + this.ast.queue = []; + }); + +}; + +/** + * Multiply the segments in the current brace level + */ + +function multiply(queue, n, options) { + return utils.flatten(utils.repeat(utils.arrayify(queue), n)); +} + +/** + * Return true if `node` is escaped + */ + +function isEscaped(node) { + return node.escaped === true; +} + +/** + * Returns true if regex parens should be used for sets. If the parent `type` + * is not `brace`, then we're on a root node, which means we should never + * expand segments and open/close braces should be `{}` (since this indicates + * a brace is missing from the set) + */ + +function isOptimized(node, options) { + if (node.parent.isOptimized) return true; + return isType(node.parent, 'brace') + && !isEscaped(node.parent) + && options.expand !== true; +} + +/** + * Returns true if the value in `node` should be wrapped in a literal brace. + * @return {Boolean} + */ + +function isLiteralBrace(node, options) { + return isEscaped(node.parent) || options.optimize !== false; +} + +/** + * Returns true if the given `node` does not have an inner value. + * @return {Boolean} + */ + +function noInner(node, type) { + if (node.parent.queue.length === 1) { + return true; + } + var nodes = node.parent.nodes; + return nodes.length === 3 + && isType(nodes[0], 'brace.open') + && !isType(nodes[1], 'text') + && isType(nodes[2], 'brace.close'); +} + +/** + * Returns true if the given `node` is the given `type` + * @return {Boolean} + */ + +function isType(node, type) { + return typeof node !== 'undefined' && node.type === type; +} + +/** + * Returns true if the given `node` has a non-empty queue. + * @return {Boolean} + */ + +function hasQueue(node) { + return Array.isArray(node.queue) && node.queue.length; +} + + +/***/ }), +/* 99 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var splitString = __webpack_require__(100); +var utils = module.exports; + +/** + * Module dependencies + */ + +utils.extend = __webpack_require__(96); +utils.flatten = __webpack_require__(103); +utils.isObject = __webpack_require__(81); +utils.fillRange = __webpack_require__(104); +utils.repeat = __webpack_require__(110); +utils.unique = __webpack_require__(95); + +utils.define = function(obj, key, val) { + Object.defineProperty(obj, key, { + writable: true, + configurable: true, + enumerable: false, + value: val + }); +}; + +/** + * Returns true if the given string contains only empty brace sets. + */ + +utils.isEmptySets = function(str) { + return /^(?:\{,\})+$/.test(str); +}; + +/** + * Returns true if the given string contains only empty brace sets. + */ + +utils.isQuotedString = function(str) { + var open = str.charAt(0); + if (open === '\'' || open === '"' || open === '`') { + return str.slice(-1) === open; + } + return false; +}; + +/** + * Create the key to use for memoization. The unique key is generated + * by iterating over the options and concatenating key-value pairs + * to the pattern string. + */ + +utils.createKey = function(pattern, options) { + var id = pattern; + if (typeof options === 'undefined') { + return id; + } + var keys = Object.keys(options); + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + id += ';' + key + '=' + String(options[key]); + } + return id; +}; + +/** + * Normalize options + */ + +utils.createOptions = function(options) { + var opts = utils.extend.apply(null, arguments); + if (typeof opts.expand === 'boolean') { + opts.optimize = !opts.expand; + } + if (typeof opts.optimize === 'boolean') { + opts.expand = !opts.optimize; + } + if (opts.optimize === true) { + opts.makeRe = true; + } + return opts; +}; + +/** + * Join patterns in `a` to patterns in `b` + */ + +utils.join = function(a, b, options) { + options = options || {}; + a = utils.arrayify(a); + b = utils.arrayify(b); + + if (!a.length) return b; + if (!b.length) return a; + + var len = a.length; + var idx = -1; + var arr = []; + + while (++idx < len) { + var val = a[idx]; + if (Array.isArray(val)) { + for (var i = 0; i < val.length; i++) { + val[i] = utils.join(val[i], b, options); + } + arr.push(val); + continue; + } + + for (var j = 0; j < b.length; j++) { + var bval = b[j]; + + if (Array.isArray(bval)) { + arr.push(utils.join(val, bval, options)); + } else { + arr.push(val + bval); + } + } + } + return arr; +}; + +/** + * Split the given string on `,` if not escaped. + */ + +utils.split = function(str, options) { + var opts = utils.extend({sep: ','}, options); + if (typeof opts.keepQuotes !== 'boolean') { + opts.keepQuotes = true; + } + if (opts.unescape === false) { + opts.keepEscaping = true; + } + return splitString(str, opts, utils.escapeBrackets(opts)); +}; + +/** + * Expand ranges or sets in the given `pattern`. + * + * @param {String} `str` + * @param {Object} `options` + * @return {Object} + */ + +utils.expand = function(str, options) { + var opts = utils.extend({rangeLimit: 10000}, options); + var segs = utils.split(str, opts); + var tok = { segs: segs }; + + if (utils.isQuotedString(str)) { + return tok; + } + + if (opts.rangeLimit === true) { + opts.rangeLimit = 10000; + } + + if (segs.length > 1) { + if (opts.optimize === false) { + tok.val = segs[0]; + return tok; + } + + tok.segs = utils.stringifyArray(tok.segs); + } else if (segs.length === 1) { + var arr = str.split('..'); + + if (arr.length === 1) { + tok.val = tok.segs[tok.segs.length - 1] || tok.val || str; + tok.segs = []; + return tok; + } + + if (arr.length === 2 && arr[0] === arr[1]) { + tok.escaped = true; + tok.val = arr[0]; + tok.segs = []; + return tok; + } + + if (arr.length > 1) { + if (opts.optimize !== false) { + opts.optimize = true; + delete opts.expand; + } + + if (opts.optimize !== true) { + var min = Math.min(arr[0], arr[1]); + var max = Math.max(arr[0], arr[1]); + var step = arr[2] || 1; + + if (opts.rangeLimit !== false && ((max - min) / step >= opts.rangeLimit)) { + throw new RangeError('expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.'); + } + } + + arr.push(opts); + tok.segs = utils.fillRange.apply(null, arr); + + if (!tok.segs.length) { + tok.escaped = true; + tok.val = str; + return tok; + } + + if (opts.optimize === true) { + tok.segs = utils.stringifyArray(tok.segs); + } + + if (tok.segs === '') { + tok.val = str; + } else { + tok.val = tok.segs[0]; + } + return tok; + } + } else { + tok.val = str; + } + return tok; +}; + +/** + * Ensure commas inside brackets and parens are not split. + * @param {Object} `tok` Token from the `split-string` module + * @return {undefined} + */ + +utils.escapeBrackets = function(options) { + return function(tok) { + if (tok.escaped && tok.val === 'b') { + tok.val = '\\b'; + return; + } + + if (tok.val !== '(' && tok.val !== '[') return; + var opts = utils.extend({}, options); + var brackets = []; + var parens = []; + var stack = []; + var val = tok.val; + var str = tok.str; + var i = tok.idx - 1; + + while (++i < str.length) { + var ch = str[i]; + + if (ch === '\\') { + val += (opts.keepEscaping === false ? '' : ch) + str[++i]; + continue; + } + + if (ch === '(') { + parens.push(ch); + stack.push(ch); + } + + if (ch === '[') { + brackets.push(ch); + stack.push(ch); + } + + if (ch === ')') { + parens.pop(); + stack.pop(); + if (!stack.length) { + val += ch; + break; + } + } + + if (ch === ']') { + brackets.pop(); + stack.pop(); + if (!stack.length) { + val += ch; + break; + } + } + val += ch; + } + + tok.split = false; + tok.val = val.slice(1); + tok.idx = i; + }; +}; + +/** + * Returns true if the given string looks like a regex quantifier + * @return {Boolean} + */ + +utils.isQuantifier = function(str) { + return /^(?:[0-9]?,[0-9]|[0-9],)$/.test(str); +}; + +/** + * Cast `val` to an array. + * @param {*} `val` + */ + +utils.stringifyArray = function(arr) { + return [utils.arrayify(arr).join('|')]; +}; + +/** + * Cast `val` to an array. + * @param {*} `val` + */ + +utils.arrayify = function(arr) { + if (typeof arr === 'undefined') { + return []; + } + if (typeof arr === 'string') { + return [arr]; + } + return arr; +}; + +/** + * Returns true if the given `str` is a non-empty string + * @return {Boolean} + */ + +utils.isString = function(str) { + return str != null && typeof str === 'string'; +}; + +/** + * Get the last element from `array` + * @param {Array} `array` + * @return {*} + */ + +utils.last = function(arr, n) { + return arr[arr.length - (n || 1)]; +}; + +utils.escapeRegex = function(str) { + return str.replace(/\\?([!^*?()[\]{}+?/])/g, '\\$1'); +}; + + +/***/ }), +/* 100 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +/*! + * split-string + * + * Copyright (c) 2015-2017, Jon Schlinkert. + * Released under the MIT License. + */ + + + +var extend = __webpack_require__(101); + +module.exports = function(str, options, fn) { + if (typeof str !== 'string') { + throw new TypeError('expected a string'); + } + + if (typeof options === 'function') { + fn = options; + options = null; + } + + // allow separator to be defined as a string + if (typeof options === 'string') { + options = { sep: options }; + } + + var opts = extend({sep: '.'}, options); + var quotes = opts.quotes || ['"', "'", '`']; + var brackets; + + if (opts.brackets === true) { + brackets = { + '<': '>', + '(': ')', + '[': ']', + '{': '}' + }; + } else if (opts.brackets) { + brackets = opts.brackets; + } + + var tokens = []; + var stack = []; + var arr = ['']; + var sep = opts.sep; + var len = str.length; + var idx = -1; + var closeIdx; + + function expected() { + if (brackets && stack.length) { + return brackets[stack[stack.length - 1]]; + } + } + + while (++idx < len) { + var ch = str[idx]; + var next = str[idx + 1]; + var tok = { val: ch, idx: idx, arr: arr, str: str }; + tokens.push(tok); + + if (ch === '\\') { + tok.val = keepEscaping(opts, str, idx) === true ? (ch + next) : next; + tok.escaped = true; + if (typeof fn === 'function') { + fn(tok); + } + arr[arr.length - 1] += tok.val; + idx++; + continue; + } + + if (brackets && brackets[ch]) { + stack.push(ch); + var e = expected(); + var i = idx + 1; + + if (str.indexOf(e, i + 1) !== -1) { + while (stack.length && i < len) { + var s = str[++i]; + if (s === '\\') { + s++; + continue; + } + + if (quotes.indexOf(s) !== -1) { + i = getClosingQuote(str, s, i + 1); + continue; + } + + e = expected(); + if (stack.length && str.indexOf(e, i + 1) === -1) { + break; + } + + if (brackets[s]) { + stack.push(s); + continue; + } + + if (e === s) { + stack.pop(); + } + } + } + + closeIdx = i; + if (closeIdx === -1) { + arr[arr.length - 1] += ch; + continue; + } + + ch = str.slice(idx, closeIdx + 1); + tok.val = ch; + tok.idx = idx = closeIdx; + } + + if (quotes.indexOf(ch) !== -1) { + closeIdx = getClosingQuote(str, ch, idx + 1); + if (closeIdx === -1) { + arr[arr.length - 1] += ch; + continue; + } + + if (keepQuotes(ch, opts) === true) { + ch = str.slice(idx, closeIdx + 1); + } else { + ch = str.slice(idx + 1, closeIdx); + } + + tok.val = ch; + tok.idx = idx = closeIdx; + } + + if (typeof fn === 'function') { + fn(tok, tokens); + ch = tok.val; + idx = tok.idx; + } + + if (tok.val === sep && tok.split !== false) { + arr.push(''); + continue; + } + + arr[arr.length - 1] += tok.val; + } + + return arr; +}; + +function getClosingQuote(str, ch, i, brackets) { + var idx = str.indexOf(ch, i); + if (str.charAt(idx - 1) === '\\') { + return getClosingQuote(str, ch, idx + 1); + } + return idx; +} + +function keepQuotes(ch, opts) { + if (opts.keepDoubleQuotes === true && ch === '"') return true; + if (opts.keepSingleQuotes === true && ch === "'") return true; + return opts.keepQuotes; +} + +function keepEscaping(opts, str, idx) { + if (typeof opts.keepEscaping === 'function') { + return opts.keepEscaping(str, idx); + } + return opts.keepEscaping === true || str[idx + 1] === '\\'; +} + + +/***/ }), +/* 101 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var isExtendable = __webpack_require__(102); +var assignSymbols = __webpack_require__(91); + +module.exports = Object.assign || function(obj/*, objects*/) { + if (obj === null || typeof obj === 'undefined') { + throw new TypeError('Cannot convert undefined or null to object'); + } + if (!isObject(obj)) { + obj = {}; + } + for (var i = 1; i < arguments.length; i++) { + var val = arguments[i]; + if (isString(val)) { + val = toObject(val); + } + if (isObject(val)) { + assign(obj, val); + assignSymbols(obj, val); + } + } + return obj; +}; + +function assign(a, b) { + for (var key in b) { + if (hasOwn(b, key)) { + a[key] = b[key]; + } + } +} + +function isString(val) { + return (val && typeof val === 'string'); +} + +function toObject(str) { + var obj = {}; + for (var i in str) { + obj[i] = str[i]; + } + return obj; +} + +function isObject(val) { + return (val && typeof val === 'object') || isExtendable(val); +} + +/** + * Returns true if the given `key` is an own property of `obj`. + */ + +function hasOwn(obj, key) { + return Object.prototype.hasOwnProperty.call(obj, key); +} + +function isEnum(obj, key) { + return Object.prototype.propertyIsEnumerable.call(obj, key); +} + + +/***/ }), +/* 102 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +/*! + * is-extendable + * + * Copyright (c) 2015-2017, Jon Schlinkert. + * Released under the MIT License. + */ + + + +var isPlainObject = __webpack_require__(90); + +module.exports = function isExtendable(val) { + return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); +}; + + +/***/ }), +/* 103 */ +/***/ ((module) => { + +"use strict"; +/*! + * arr-flatten + * + * Copyright (c) 2014-2017, Jon Schlinkert. + * Released under the MIT License. + */ + + + +module.exports = function (arr) { + return flat(arr, []); +}; + +function flat(arr, res) { + var i = 0, cur; + var len = arr.length; + for (; i < len; i++) { + cur = arr[i]; + Array.isArray(cur) ? flat(cur, res) : res.push(cur); + } + return res; +} + + +/***/ }), +/* 104 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +/*! + * fill-range + * + * Copyright (c) 2014-2015, 2017, Jon Schlinkert. + * Released under the MIT License. + */ + + + +var util = __webpack_require__(17); +var isNumber = __webpack_require__(105); +var extend = __webpack_require__(96); +var repeat = __webpack_require__(108); +var toRegex = __webpack_require__(109); + +/** + * Return a range of numbers or letters. + * + * @param {String} `start` Start of the range + * @param {String} `stop` End of the range + * @param {String} `step` Increment or decrement to use. + * @param {Function} `fn` Custom function to modify each element in the range. + * @return {Array} + */ + +function fillRange(start, stop, step, options) { + if (typeof start === 'undefined') { + return []; + } + + if (typeof stop === 'undefined' || start === stop) { + // special case, for handling negative zero + var isString = typeof start === 'string'; + if (isNumber(start) && !toNumber(start)) { + return [isString ? '0' : 0]; + } + return [start]; + } + + if (typeof step !== 'number' && typeof step !== 'string') { + options = step; + step = undefined; + } + + if (typeof options === 'function') { + options = { transform: options }; + } + + var opts = extend({step: step}, options); + if (opts.step && !isValidNumber(opts.step)) { + if (opts.strictRanges === true) { + throw new TypeError('expected options.step to be a number'); + } + return []; + } + + opts.isNumber = isValidNumber(start) && isValidNumber(stop); + if (!opts.isNumber && !isValid(start, stop)) { + if (opts.strictRanges === true) { + throw new RangeError('invalid range arguments: ' + util.inspect([start, stop])); + } + return []; + } + + opts.isPadded = isPadded(start) || isPadded(stop); + opts.toString = opts.stringify + || typeof opts.step === 'string' + || typeof start === 'string' + || typeof stop === 'string' + || !opts.isNumber; + + if (opts.isPadded) { + opts.maxLength = Math.max(String(start).length, String(stop).length); + } + + // support legacy minimatch/fill-range options + if (typeof opts.optimize === 'boolean') opts.toRegex = opts.optimize; + if (typeof opts.makeRe === 'boolean') opts.toRegex = opts.makeRe; + return expand(start, stop, opts); +} + +function expand(start, stop, options) { + var a = options.isNumber ? toNumber(start) : start.charCodeAt(0); + var b = options.isNumber ? toNumber(stop) : stop.charCodeAt(0); + + var step = Math.abs(toNumber(options.step)) || 1; + if (options.toRegex && step === 1) { + return toRange(a, b, start, stop, options); + } + + var zero = {greater: [], lesser: []}; + var asc = a < b; + var arr = new Array(Math.round((asc ? b - a : a - b) / step)); + var idx = 0; + + while (asc ? a <= b : a >= b) { + var val = options.isNumber ? a : String.fromCharCode(a); + if (options.toRegex && (val >= 0 || !options.isNumber)) { + zero.greater.push(val); + } else { + zero.lesser.push(Math.abs(val)); + } + + if (options.isPadded) { + val = zeros(val, options); + } + + if (options.toString) { + val = String(val); + } + + if (typeof options.transform === 'function') { + arr[idx++] = options.transform(val, a, b, step, idx, arr, options); + } else { + arr[idx++] = val; + } + + if (asc) { + a += step; + } else { + a -= step; + } + } + + if (options.toRegex === true) { + return toSequence(arr, zero, options); + } + return arr; +} + +function toRange(a, b, start, stop, options) { + if (options.isPadded) { + return toRegex(start, stop, options); + } + + if (options.isNumber) { + return toRegex(Math.min(a, b), Math.max(a, b), options); + } + + var start = String.fromCharCode(Math.min(a, b)); + var stop = String.fromCharCode(Math.max(a, b)); + return '[' + start + '-' + stop + ']'; +} + +function toSequence(arr, zeros, options) { + var greater = '', lesser = ''; + if (zeros.greater.length) { + greater = zeros.greater.join('|'); + } + if (zeros.lesser.length) { + lesser = '-(' + zeros.lesser.join('|') + ')'; + } + var res = greater && lesser + ? greater + '|' + lesser + : greater || lesser; + + if (options.capture) { + return '(' + res + ')'; + } + return res; +} + +function zeros(val, options) { + if (options.isPadded) { + var str = String(val); + var len = str.length; + var dash = ''; + if (str.charAt(0) === '-') { + dash = '-'; + str = str.slice(1); + } + var diff = options.maxLength - len; + var pad = repeat('0', diff); + val = (dash + pad + str); + } + if (options.stringify) { + return String(val); + } + return val; +} + +function toNumber(val) { + return Number(val) || 0; +} + +function isPadded(str) { + return /^-?0\d/.test(str); +} + +function isValid(min, max) { + return (isValidNumber(min) || isValidLetter(min)) + && (isValidNumber(max) || isValidLetter(max)); +} + +function isValidLetter(ch) { + return typeof ch === 'string' && ch.length === 1 && /^\w+$/.test(ch); +} + +function isValidNumber(n) { + return isNumber(n) && !/\./.test(n); +} + +/** + * Expose `fillRange` + * @type {Function} + */ + +module.exports = fillRange; + + +/***/ }), +/* 105 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +/*! + * is-number + * + * Copyright (c) 2014-2015, Jon Schlinkert. + * Licensed under the MIT License. + */ + + + +var typeOf = __webpack_require__(106); + +module.exports = function isNumber(num) { + var type = typeOf(num); + + if (type === 'string') { + if (!num.trim()) return false; + } else if (type !== 'number') { + return false; + } + + return (num - num + 1) >= 0; +}; + + +/***/ }), +/* 106 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var isBuffer = __webpack_require__(107); +var toString = Object.prototype.toString; + +/** + * Get the native `typeof` a value. + * + * @param {*} `val` + * @return {*} Native javascript type + */ + +module.exports = function kindOf(val) { + // primitivies + if (typeof val === 'undefined') { + return 'undefined'; + } + if (val === null) { + return 'null'; + } + if (val === true || val === false || val instanceof Boolean) { + return 'boolean'; + } + if (typeof val === 'string' || val instanceof String) { + return 'string'; + } + if (typeof val === 'number' || val instanceof Number) { + return 'number'; + } + + // functions + if (typeof val === 'function' || val instanceof Function) { + return 'function'; + } + + // array + if (typeof Array.isArray !== 'undefined' && Array.isArray(val)) { + return 'array'; + } + + // check for instances of RegExp and Date before calling `toString` + if (val instanceof RegExp) { + return 'regexp'; + } + if (val instanceof Date) { + return 'date'; + } + + // other objects + var type = toString.call(val); + + if (type === '[object RegExp]') { + return 'regexp'; + } + if (type === '[object Date]') { + return 'date'; + } + if (type === '[object Arguments]') { + return 'arguments'; + } + if (type === '[object Error]') { + return 'error'; + } + + // buffer + if (isBuffer(val)) { + return 'buffer'; + } + + // es6: Map, WeakMap, Set, WeakSet + if (type === '[object Set]') { + return 'set'; + } + if (type === '[object WeakSet]') { + return 'weakset'; + } + if (type === '[object Map]') { + return 'map'; + } + if (type === '[object WeakMap]') { + return 'weakmap'; + } + if (type === '[object Symbol]') { + return 'symbol'; + } + + // typed arrays + if (type === '[object Int8Array]') { + return 'int8array'; + } + if (type === '[object Uint8Array]') { + return 'uint8array'; + } + if (type === '[object Uint8ClampedArray]') { + return 'uint8clampedarray'; + } + if (type === '[object Int16Array]') { + return 'int16array'; + } + if (type === '[object Uint16Array]') { + return 'uint16array'; + } + if (type === '[object Int32Array]') { + return 'int32array'; + } + if (type === '[object Uint32Array]') { + return 'uint32array'; + } + if (type === '[object Float32Array]') { + return 'float32array'; + } + if (type === '[object Float64Array]') { + return 'float64array'; + } + + // must be a plain object + return 'object'; +}; + + +/***/ }), +/* 107 */ +/***/ ((module) => { + +/*! + * Determine if an object is a Buffer + * + * @author Feross Aboukhadijeh + * @license MIT + */ + +// The _isBuffer check is for Safari 5-7 support, because it's missing +// Object.prototype.constructor. Remove this eventually +module.exports = function (obj) { + return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer) +} + +function isBuffer (obj) { + return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) +} + +// For Node v0.10 support. Remove this eventually. +function isSlowBuffer (obj) { + return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0)) +} + + +/***/ }), +/* 108 */ +/***/ ((module) => { + +"use strict"; +/*! + * repeat-string + * + * Copyright (c) 2014-2015, Jon Schlinkert. + * Licensed under the MIT License. + */ + + + +/** + * Results cache + */ + +var res = ''; +var cache; + +/** + * Expose `repeat` + */ + +module.exports = repeat; + +/** + * Repeat the given `string` the specified `number` + * of times. + * + * **Example:** + * + * ```js + * var repeat = require('repeat-string'); + * repeat('A', 5); + * //=> AAAAA + * ``` + * + * @param {String} `string` The string to repeat + * @param {Number} `number` The number of times to repeat the string + * @return {String} Repeated string + * @api public + */ + +function repeat(str, num) { + if (typeof str !== 'string') { + throw new TypeError('expected a string'); + } + + // cover common, quick use cases + if (num === 1) return str; + if (num === 2) return str + str; + + var max = str.length * num; + if (cache !== str || typeof cache === 'undefined') { + cache = str; + res = ''; + } else if (res.length >= max) { + return res.substr(0, max); + } + + while (max > res.length && num > 1) { + if (num & 1) { + res += str; + } + + num >>= 1; + str += str; + } + + res += str; + res = res.substr(0, max); + return res; +} + + +/***/ }), +/* 109 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +/*! + * to-regex-range + * + * Copyright (c) 2015, 2017, Jon Schlinkert. + * Released under the MIT License. + */ + + + +var repeat = __webpack_require__(108); +var isNumber = __webpack_require__(105); +var cache = {}; + +function toRegexRange(min, max, options) { + if (isNumber(min) === false) { + throw new RangeError('toRegexRange: first argument is invalid.'); + } + + if (typeof max === 'undefined' || min === max) { + return String(min); + } + + if (isNumber(max) === false) { + throw new RangeError('toRegexRange: second argument is invalid.'); + } + + options = options || {}; + var relax = String(options.relaxZeros); + var shorthand = String(options.shorthand); + var capture = String(options.capture); + var key = min + ':' + max + '=' + relax + shorthand + capture; + if (cache.hasOwnProperty(key)) { + return cache[key].result; + } + + var a = Math.min(min, max); + var b = Math.max(min, max); + + if (Math.abs(a - b) === 1) { + var result = min + '|' + max; + if (options.capture) { + return '(' + result + ')'; + } + return result; + } + + var isPadded = padding(min) || padding(max); + var positives = []; + var negatives = []; + + var tok = {min: min, max: max, a: a, b: b}; + if (isPadded) { + tok.isPadded = isPadded; + tok.maxLen = String(tok.max).length; + } + + if (a < 0) { + var newMin = b < 0 ? Math.abs(b) : 1; + var newMax = Math.abs(a); + negatives = splitToPatterns(newMin, newMax, tok, options); + a = tok.a = 0; + } + + if (b >= 0) { + positives = splitToPatterns(a, b, tok, options); + } + + tok.negatives = negatives; + tok.positives = positives; + tok.result = siftPatterns(negatives, positives, options); + + if (options.capture && (positives.length + negatives.length) > 1) { + tok.result = '(' + tok.result + ')'; + } + + cache[key] = tok; + return tok.result; +} + +function siftPatterns(neg, pos, options) { + var onlyNegative = filterPatterns(neg, pos, '-', false, options) || []; + var onlyPositive = filterPatterns(pos, neg, '', false, options) || []; + var intersected = filterPatterns(neg, pos, '-?', true, options) || []; + var subpatterns = onlyNegative.concat(intersected).concat(onlyPositive); + return subpatterns.join('|'); +} + +function splitToRanges(min, max) { + min = Number(min); + max = Number(max); + + var nines = 1; + var stops = [max]; + var stop = +countNines(min, nines); + + while (min <= stop && stop <= max) { + stops = push(stops, stop); + nines += 1; + stop = +countNines(min, nines); + } + + var zeros = 1; + stop = countZeros(max + 1, zeros) - 1; + + while (min < stop && stop <= max) { + stops = push(stops, stop); + zeros += 1; + stop = countZeros(max + 1, zeros) - 1; + } + + stops.sort(compare); + return stops; +} + +/** + * Convert a range to a regex pattern + * @param {Number} `start` + * @param {Number} `stop` + * @return {String} + */ + +function rangeToPattern(start, stop, options) { + if (start === stop) { + return {pattern: String(start), digits: []}; + } + + var zipped = zip(String(start), String(stop)); + var len = zipped.length, i = -1; + + var pattern = ''; + var digits = 0; + + while (++i < len) { + var numbers = zipped[i]; + var startDigit = numbers[0]; + var stopDigit = numbers[1]; + + if (startDigit === stopDigit) { + pattern += startDigit; + + } else if (startDigit !== '0' || stopDigit !== '9') { + pattern += toCharacterClass(startDigit, stopDigit); + + } else { + digits += 1; + } + } + + if (digits) { + pattern += options.shorthand ? '\\d' : '[0-9]'; + } + + return { pattern: pattern, digits: [digits] }; +} + +function splitToPatterns(min, max, tok, options) { + var ranges = splitToRanges(min, max); + var len = ranges.length; + var idx = -1; + + var tokens = []; + var start = min; + var prev; + + while (++idx < len) { + var range = ranges[idx]; + var obj = rangeToPattern(start, range, options); + var zeros = ''; + + if (!tok.isPadded && prev && prev.pattern === obj.pattern) { + if (prev.digits.length > 1) { + prev.digits.pop(); + } + prev.digits.push(obj.digits[0]); + prev.string = prev.pattern + toQuantifier(prev.digits); + start = range + 1; + continue; + } + + if (tok.isPadded) { + zeros = padZeros(range, tok); + } + + obj.string = zeros + obj.pattern + toQuantifier(obj.digits); + tokens.push(obj); + start = range + 1; + prev = obj; + } + + return tokens; +} + +function filterPatterns(arr, comparison, prefix, intersection, options) { + var res = []; + + for (var i = 0; i < arr.length; i++) { + var tok = arr[i]; + var ele = tok.string; + + if (options.relaxZeros !== false) { + if (prefix === '-' && ele.charAt(0) === '0') { + if (ele.charAt(1) === '{') { + ele = '0*' + ele.replace(/^0\{\d+\}/, ''); + } else { + ele = '0*' + ele.slice(1); + } + } + } + + if (!intersection && !contains(comparison, 'string', ele)) { + res.push(prefix + ele); + } + + if (intersection && contains(comparison, 'string', ele)) { + res.push(prefix + ele); + } + } + return res; +} + +/** + * Zip strings (`for in` can be used on string characters) + */ + +function zip(a, b) { + var arr = []; + for (var ch in a) arr.push([a[ch], b[ch]]); + return arr; +} + +function compare(a, b) { + return a > b ? 1 : b > a ? -1 : 0; +} + +function push(arr, ele) { + if (arr.indexOf(ele) === -1) arr.push(ele); + return arr; +} + +function contains(arr, key, val) { + for (var i = 0; i < arr.length; i++) { + if (arr[i][key] === val) { + return true; + } + } + return false; +} + +function countNines(min, len) { + return String(min).slice(0, -len) + repeat('9', len); +} + +function countZeros(integer, zeros) { + return integer - (integer % Math.pow(10, zeros)); +} + +function toQuantifier(digits) { + var start = digits[0]; + var stop = digits[1] ? (',' + digits[1]) : ''; + if (!stop && (!start || start === 1)) { + return ''; + } + return '{' + start + stop + '}'; +} + +function toCharacterClass(a, b) { + return '[' + a + ((b - a === 1) ? '' : '-') + b + ']'; +} + +function padding(str) { + return /^-?(0+)\d/.exec(str); +} + +function padZeros(val, tok) { + if (tok.isPadded) { + var diff = Math.abs(tok.maxLen - String(val).length); + switch (diff) { + case 0: + return ''; + case 1: + return '0'; + default: { + return '0{' + diff + '}'; + } + } + } + return val; +} + +/** + * Expose `toRegexRange` + */ + +module.exports = toRegexRange; + + +/***/ }), +/* 110 */ +/***/ ((module) => { + +"use strict"; +/*! + * repeat-element + * + * Copyright (c) 2015-present, Jon Schlinkert. + * Licensed under the MIT license. + */ + + + +module.exports = function repeat(ele, num) { + if (Array.prototype.fill) { + return new Array(num).fill(ele); + } + + var arr = new Array(num); + + for (var i = 0; i < num; i++) { + arr[i] = ele; + } + + return arr; +}; + + +/***/ }), +/* 111 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var Node = __webpack_require__(112); +var utils = __webpack_require__(99); + +/** + * Braces parsers + */ + +module.exports = function(braces, options) { + braces.parser + .set('bos', function() { + if (!this.parsed) { + this.ast = this.nodes[0] = new Node(this.ast); + } + }) + + /** + * Character parsers + */ + + .set('escape', function() { + var pos = this.position(); + var m = this.match(/^(?:\\(.)|\$\{)/); + if (!m) return; + + var prev = this.prev(); + var last = utils.last(prev.nodes); + + var node = pos(new Node({ + type: 'text', + multiplier: 1, + val: m[0] + })); + + if (node.val === '\\\\') { + return node; + } + + if (node.val === '${') { + var str = this.input; + var idx = -1; + var ch; + + while ((ch = str[++idx])) { + this.consume(1); + node.val += ch; + if (ch === '\\') { + node.val += str[++idx]; + continue; + } + if (ch === '}') { + break; + } + } + } + + if (this.options.unescape !== false) { + node.val = node.val.replace(/\\([{}])/g, '$1'); + } + + if (last.val === '"' && this.input.charAt(0) === '"') { + last.val = node.val; + this.consume(1); + return; + } + + return concatNodes.call(this, pos, node, prev, options); + }) + + /** + * Brackets: "[...]" (basic, this is overridden by + * other parsers in more advanced implementations) + */ + + .set('bracket', function() { + var isInside = this.isInside('brace'); + var pos = this.position(); + var m = this.match(/^(?:\[([!^]?)([^\]]{2,}|\]-)(\]|[^*+?]+)|\[)/); + if (!m) return; + + var prev = this.prev(); + var val = m[0]; + var negated = m[1] ? '^' : ''; + var inner = m[2] || ''; + var close = m[3] || ''; + + if (isInside && prev.type === 'brace') { + prev.text = prev.text || ''; + prev.text += val; + } + + var esc = this.input.slice(0, 2); + if (inner === '' && esc === '\\]') { + inner += esc; + this.consume(2); + + var str = this.input; + var idx = -1; + var ch; + + while ((ch = str[++idx])) { + this.consume(1); + if (ch === ']') { + close = ch; + break; + } + inner += ch; + } + } + + return pos(new Node({ + type: 'bracket', + val: val, + escaped: close !== ']', + negated: negated, + inner: inner, + close: close + })); + }) + + /** + * Empty braces (we capture these early to + * speed up processing in the compiler) + */ + + .set('multiplier', function() { + var isInside = this.isInside('brace'); + var pos = this.position(); + var m = this.match(/^\{((?:,|\{,+\})+)\}/); + if (!m) return; + + this.multiplier = true; + var prev = this.prev(); + var val = m[0]; + + if (isInside && prev.type === 'brace') { + prev.text = prev.text || ''; + prev.text += val; + } + + var node = pos(new Node({ + type: 'text', + multiplier: 1, + match: m, + val: val + })); + + return concatNodes.call(this, pos, node, prev, options); + }) + + /** + * Open + */ + + .set('brace.open', function() { + var pos = this.position(); + var m = this.match(/^\{(?!(?:[^\\}]?|,+)\})/); + if (!m) return; + + var prev = this.prev(); + var last = utils.last(prev.nodes); + + // if the last parsed character was an extglob character + // we need to _not optimize_ the brace pattern because + // it might be mistaken for an extglob by a downstream parser + if (last && last.val && isExtglobChar(last.val.slice(-1))) { + last.optimize = false; + } + + var open = pos(new Node({ + type: 'brace.open', + val: m[0] + })); + + var node = pos(new Node({ + type: 'brace', + nodes: [] + })); + + node.push(open); + prev.push(node); + this.push('brace', node); + }) + + /** + * Close + */ + + .set('brace.close', function() { + var pos = this.position(); + var m = this.match(/^\}/); + if (!m || !m[0]) return; + + var brace = this.pop('brace'); + var node = pos(new Node({ + type: 'brace.close', + val: m[0] + })); + + if (!this.isType(brace, 'brace')) { + if (this.options.strict) { + throw new Error('missing opening "{"'); + } + node.type = 'text'; + node.multiplier = 0; + node.escaped = true; + return node; + } + + var prev = this.prev(); + var last = utils.last(prev.nodes); + if (last.text) { + var lastNode = utils.last(last.nodes); + if (lastNode.val === ')' && /[!@*?+]\(/.test(last.text)) { + var open = last.nodes[0]; + var text = last.nodes[1]; + if (open.type === 'brace.open' && text && text.type === 'text') { + text.optimize = false; + } + } + } + + if (brace.nodes.length > 2) { + var first = brace.nodes[1]; + if (first.type === 'text' && first.val === ',') { + brace.nodes.splice(1, 1); + brace.nodes.push(first); + } + } + + brace.push(node); + }) + + /** + * Capture boundary characters + */ + + .set('boundary', function() { + var pos = this.position(); + var m = this.match(/^[$^](?!\{)/); + if (!m) return; + return pos(new Node({ + type: 'text', + val: m[0] + })); + }) + + /** + * One or zero, non-comma characters wrapped in braces + */ + + .set('nobrace', function() { + var isInside = this.isInside('brace'); + var pos = this.position(); + var m = this.match(/^\{[^,]?\}/); + if (!m) return; + + var prev = this.prev(); + var val = m[0]; + + if (isInside && prev.type === 'brace') { + prev.text = prev.text || ''; + prev.text += val; + } + + return pos(new Node({ + type: 'text', + multiplier: 0, + val: val + })); + }) + + /** + * Text + */ + + .set('text', function() { + var isInside = this.isInside('brace'); + var pos = this.position(); + var m = this.match(/^((?!\\)[^${}[\]])+/); + if (!m) return; + + var prev = this.prev(); + var val = m[0]; + + if (isInside && prev.type === 'brace') { + prev.text = prev.text || ''; + prev.text += val; + } + + var node = pos(new Node({ + type: 'text', + multiplier: 1, + val: val + })); + + return concatNodes.call(this, pos, node, prev, options); + }); +}; + +/** + * Returns true if the character is an extglob character. + */ + +function isExtglobChar(ch) { + return ch === '!' || ch === '@' || ch === '*' || ch === '?' || ch === '+'; +} + +/** + * Combine text nodes, and calculate empty sets (`{,,}`) + * @param {Function} `pos` Function to calculate node position + * @param {Object} `node` AST node + * @return {Object} + */ + +function concatNodes(pos, node, parent, options) { + node.orig = node.val; + var prev = this.prev(); + var last = utils.last(prev.nodes); + var isEscaped = false; + + if (node.val.length > 1) { + var a = node.val.charAt(0); + var b = node.val.slice(-1); + + isEscaped = (a === '"' && b === '"') + || (a === "'" && b === "'") + || (a === '`' && b === '`'); + } + + if (isEscaped && options.unescape !== false) { + node.val = node.val.slice(1, node.val.length - 1); + node.escaped = true; + } + + if (node.match) { + var match = node.match[1]; + if (!match || match.indexOf('}') === -1) { + match = node.match[0]; + } + + // replace each set with a single "," + var val = match.replace(/\{/g, ',').replace(/\}/g, ''); + node.multiplier *= val.length; + node.val = ''; + } + + var simpleText = last.type === 'text' + && last.multiplier === 1 + && node.multiplier === 1 + && node.val; + + if (simpleText) { + last.val += node.val; + return; + } + + prev.push(node); +} + + +/***/ }), +/* 112 */ +/***/ ((module, exports, __webpack_require__) => { + +"use strict"; + + +var isObject = __webpack_require__(81); +var define = __webpack_require__(113); +var utils = __webpack_require__(115); +var ownNames; + +/** + * Create a new AST `Node` with the given `val` and `type`. + * + * ```js + * var node = new Node('*', 'Star'); + * var node = new Node({type: 'star', val: '*'}); + * ``` + * @name Node + * @param {String|Object} `val` Pass a matched substring, or an object to merge onto the node. + * @param {String} `type` The node type to use when `val` is a string. + * @return {Object} node instance + * @api public + */ + +function Node(val, type, parent) { + if (typeof type !== 'string') { + parent = type; + type = null; + } + + define(this, 'parent', parent); + define(this, 'isNode', true); + define(this, 'expect', null); + + if (typeof type !== 'string' && isObject(val)) { + lazyKeys(); + var keys = Object.keys(val); + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (ownNames.indexOf(key) === -1) { + this[key] = val[key]; + } + } + } else { + this.type = type; + this.val = val; + } +} + +/** + * Returns true if the given value is a node. + * + * ```js + * var Node = require('snapdragon-node'); + * var node = new Node({type: 'foo'}); + * console.log(Node.isNode(node)); //=> true + * console.log(Node.isNode({})); //=> false + * ``` + * @param {Object} `node` + * @returns {Boolean} + * @api public + */ + +Node.isNode = function(node) { + return utils.isNode(node); +}; + +/** + * Define a non-enumberable property on the node instance. + * Useful for adding properties that shouldn't be extended + * or visible during debugging. + * + * ```js + * var node = new Node(); + * node.define('foo', 'something non-enumerable'); + * ``` + * @param {String} `name` + * @param {any} `val` + * @return {Object} returns the node instance + * @api public + */ + +Node.prototype.define = function(name, val) { + define(this, name, val); + return this; +}; + +/** + * Returns true if `node.val` is an empty string, or `node.nodes` does + * not contain any non-empty text nodes. + * + * ```js + * var node = new Node({type: 'text'}); + * node.isEmpty(); //=> true + * node.val = 'foo'; + * node.isEmpty(); //=> false + * ``` + * @param {Function} `fn` (optional) Filter function that is called on `node` and/or child nodes. `isEmpty` will return false immediately when the filter function returns false on any nodes. + * @return {Boolean} + * @api public + */ + +Node.prototype.isEmpty = function(fn) { + return utils.isEmpty(this, fn); +}; + +/** + * Given node `foo` and node `bar`, push node `bar` onto `foo.nodes`, and + * set `foo` as `bar.parent`. + * + * ```js + * var foo = new Node({type: 'foo'}); + * var bar = new Node({type: 'bar'}); + * foo.push(bar); + * ``` + * @param {Object} `node` + * @return {Number} Returns the length of `node.nodes` + * @api public + */ + +Node.prototype.push = function(node) { + assert(Node.isNode(node), 'expected node to be an instance of Node'); + define(node, 'parent', this); + + this.nodes = this.nodes || []; + return this.nodes.push(node); +}; + +/** + * Given node `foo` and node `bar`, unshift node `bar` onto `foo.nodes`, and + * set `foo` as `bar.parent`. + * + * ```js + * var foo = new Node({type: 'foo'}); + * var bar = new Node({type: 'bar'}); + * foo.unshift(bar); + * ``` + * @param {Object} `node` + * @return {Number} Returns the length of `node.nodes` + * @api public + */ + +Node.prototype.unshift = function(node) { + assert(Node.isNode(node), 'expected node to be an instance of Node'); + define(node, 'parent', this); + + this.nodes = this.nodes || []; + return this.nodes.unshift(node); +}; + +/** + * Pop a node from `node.nodes`. + * + * ```js + * var node = new Node({type: 'foo'}); + * node.push(new Node({type: 'a'})); + * node.push(new Node({type: 'b'})); + * node.push(new Node({type: 'c'})); + * node.push(new Node({type: 'd'})); + * console.log(node.nodes.length); + * //=> 4 + * node.pop(); + * console.log(node.nodes.length); + * //=> 3 + * ``` + * @return {Number} Returns the popped `node` + * @api public + */ + +Node.prototype.pop = function() { + return this.nodes && this.nodes.pop(); +}; + +/** + * Shift a node from `node.nodes`. + * + * ```js + * var node = new Node({type: 'foo'}); + * node.push(new Node({type: 'a'})); + * node.push(new Node({type: 'b'})); + * node.push(new Node({type: 'c'})); + * node.push(new Node({type: 'd'})); + * console.log(node.nodes.length); + * //=> 4 + * node.shift(); + * console.log(node.nodes.length); + * //=> 3 + * ``` + * @return {Object} Returns the shifted `node` + * @api public + */ + +Node.prototype.shift = function() { + return this.nodes && this.nodes.shift(); +}; + +/** + * Remove `node` from `node.nodes`. + * + * ```js + * node.remove(childNode); + * ``` + * @param {Object} `node` + * @return {Object} Returns the removed node. + * @api public + */ + +Node.prototype.remove = function(node) { + assert(Node.isNode(node), 'expected node to be an instance of Node'); + this.nodes = this.nodes || []; + var idx = node.index; + if (idx !== -1) { + node.index = -1; + return this.nodes.splice(idx, 1); + } + return null; +}; + +/** + * Get the first child node from `node.nodes` that matches the given `type`. + * If `type` is a number, the child node at that index is returned. + * + * ```js + * var child = node.find(1); //<= index of the node to get + * var child = node.find('foo'); //<= node.type of a child node + * var child = node.find(/^(foo|bar)$/); //<= regex to match node.type + * var child = node.find(['foo', 'bar']); //<= array of node.type(s) + * ``` + * @param {String} `type` + * @return {Object} Returns a child node or undefined. + * @api public + */ + +Node.prototype.find = function(type) { + return utils.findNode(this.nodes, type); +}; + +/** + * Return true if the node is the given `type`. + * + * ```js + * var node = new Node({type: 'bar'}); + * cosole.log(node.isType('foo')); // false + * cosole.log(node.isType(/^(foo|bar)$/)); // true + * cosole.log(node.isType(['foo', 'bar'])); // true + * ``` + * @param {String} `type` + * @return {Boolean} + * @api public + */ + +Node.prototype.isType = function(type) { + return utils.isType(this, type); +}; + +/** + * Return true if the `node.nodes` has the given `type`. + * + * ```js + * var foo = new Node({type: 'foo'}); + * var bar = new Node({type: 'bar'}); + * foo.push(bar); + * + * cosole.log(foo.hasType('qux')); // false + * cosole.log(foo.hasType(/^(qux|bar)$/)); // true + * cosole.log(foo.hasType(['qux', 'bar'])); // true + * ``` + * @param {String} `type` + * @return {Boolean} + * @api public + */ + +Node.prototype.hasType = function(type) { + return utils.hasType(this, type); +}; + +/** + * Get the siblings array, or `null` if it doesn't exist. + * + * ```js + * var foo = new Node({type: 'foo'}); + * var bar = new Node({type: 'bar'}); + * var baz = new Node({type: 'baz'}); + * foo.push(bar); + * foo.push(baz); + * + * console.log(bar.siblings.length) // 2 + * console.log(baz.siblings.length) // 2 + * ``` + * @return {Array} + * @api public + */ + +Object.defineProperty(Node.prototype, 'siblings', { + set: function() { + throw new Error('node.siblings is a getter and cannot be defined'); + }, + get: function() { + return this.parent ? this.parent.nodes : null; + } +}); + +/** + * Get the node's current index from `node.parent.nodes`. + * This should always be correct, even when the parent adds nodes. + * + * ```js + * var foo = new Node({type: 'foo'}); + * var bar = new Node({type: 'bar'}); + * var baz = new Node({type: 'baz'}); + * var qux = new Node({type: 'qux'}); + * foo.push(bar); + * foo.push(baz); + * foo.unshift(qux); + * + * console.log(bar.index) // 1 + * console.log(baz.index) // 2 + * console.log(qux.index) // 0 + * ``` + * @return {Number} + * @api public + */ + +Object.defineProperty(Node.prototype, 'index', { + set: function(index) { + define(this, 'idx', index); + }, + get: function() { + if (!Array.isArray(this.siblings)) { + return -1; + } + var tok = this.idx !== -1 ? this.siblings[this.idx] : null; + if (tok !== this) { + this.idx = this.siblings.indexOf(this); + } + return this.idx; + } +}); + +/** + * Get the previous node from the siblings array or `null`. + * + * ```js + * var foo = new Node({type: 'foo'}); + * var bar = new Node({type: 'bar'}); + * var baz = new Node({type: 'baz'}); + * foo.push(bar); + * foo.push(baz); + * + * console.log(baz.prev.type) // 'bar' + * ``` + * @return {Object} + * @api public + */ + +Object.defineProperty(Node.prototype, 'prev', { + set: function() { + throw new Error('node.prev is a getter and cannot be defined'); + }, + get: function() { + if (Array.isArray(this.siblings)) { + return this.siblings[this.index - 1] || this.parent.prev; + } + return null; + } +}); + +/** + * Get the siblings array, or `null` if it doesn't exist. + * + * ```js + * var foo = new Node({type: 'foo'}); + * var bar = new Node({type: 'bar'}); + * var baz = new Node({type: 'baz'}); + * foo.push(bar); + * foo.push(baz); + * + * console.log(bar.siblings.length) // 2 + * console.log(baz.siblings.length) // 2 + * ``` + * @return {Object} + * @api public + */ + +Object.defineProperty(Node.prototype, 'next', { + set: function() { + throw new Error('node.next is a getter and cannot be defined'); + }, + get: function() { + if (Array.isArray(this.siblings)) { + return this.siblings[this.index + 1] || this.parent.next; + } + return null; + } +}); + +/** + * Get the first node from `node.nodes`. + * + * ```js + * var foo = new Node({type: 'foo'}); + * var bar = new Node({type: 'bar'}); + * var baz = new Node({type: 'baz'}); + * var qux = new Node({type: 'qux'}); + * foo.push(bar); + * foo.push(baz); + * foo.push(qux); + * + * console.log(foo.first.type) // 'bar' + * ``` + * @return {Object} The first node, or undefiend + * @api public + */ + +Object.defineProperty(Node.prototype, 'first', { + get: function() { + return this.nodes ? this.nodes[0] : null; + } +}); + +/** + * Get the last node from `node.nodes`. + * + * ```js + * var foo = new Node({type: 'foo'}); + * var bar = new Node({type: 'bar'}); + * var baz = new Node({type: 'baz'}); + * var qux = new Node({type: 'qux'}); + * foo.push(bar); + * foo.push(baz); + * foo.push(qux); + * + * console.log(foo.last.type) // 'qux' + * ``` + * @return {Object} The last node, or undefiend + * @api public + */ + +Object.defineProperty(Node.prototype, 'last', { + get: function() { + return this.nodes ? utils.last(this.nodes) : null; + } +}); + +/** + * Get the last node from `node.nodes`. + * + * ```js + * var foo = new Node({type: 'foo'}); + * var bar = new Node({type: 'bar'}); + * var baz = new Node({type: 'baz'}); + * var qux = new Node({type: 'qux'}); + * foo.push(bar); + * foo.push(baz); + * foo.push(qux); + * + * console.log(foo.last.type) // 'qux' + * ``` + * @return {Object} The last node, or undefiend + * @api public + */ + +Object.defineProperty(Node.prototype, 'scope', { + get: function() { + if (this.isScope !== true) { + return this.parent ? this.parent.scope : this; + } + return this; + } +}); + +/** + * Get own property names from Node prototype, but only the + * first time `Node` is instantiated + */ + +function lazyKeys() { + if (!ownNames) { + ownNames = Object.getOwnPropertyNames(Node.prototype); + } +} + +/** + * Simplified assertion. Throws an error is `val` is falsey. + */ + +function assert(val, message) { + if (!val) throw new Error(message); +} + +/** + * Expose `Node` + */ + +exports = module.exports = Node; + + +/***/ }), +/* 113 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +/*! + * define-property + * + * Copyright (c) 2015, 2017, Jon Schlinkert. + * Released under the MIT License. + */ + + + +var isDescriptor = __webpack_require__(114); + +module.exports = function defineProperty(obj, prop, val) { + if (typeof obj !== 'object' && typeof obj !== 'function') { + throw new TypeError('expected an object or function.'); + } + + if (typeof prop !== 'string') { + throw new TypeError('expected `prop` to be a string.'); + } + + if (isDescriptor(val) && ('set' in val || 'get' in val)) { + return Object.defineProperty(obj, prop, val); + } + + return Object.defineProperty(obj, prop, { + configurable: true, + enumerable: false, + writable: true, + value: val + }); +}; + + +/***/ }), +/* 114 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var isAccessor = __webpack_require__(83); +var isData = __webpack_require__(87); + +module.exports = function isDescriptor(obj, key) { + if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) { + return false; + } + + if ('get' in obj || 'set' in obj) { + return isAccessor(obj, key); + } + + return isData(obj, key); +}; + + +/***/ }), +/* 115 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var typeOf = __webpack_require__(116); +var utils = module.exports; + +/** + * Returns true if the given value is a node. + * + * ```js + * var Node = require('snapdragon-node'); + * var node = new Node({type: 'foo'}); + * console.log(utils.isNode(node)); //=> true + * console.log(utils.isNode({})); //=> false + * ``` + * @param {Object} `node` Instance of [snapdragon-node][] + * @returns {Boolean} + * @api public + */ + +utils.isNode = function(node) { + return typeOf(node) === 'object' && node.isNode === true; +}; + +/** + * Emit an empty string for the given `node`. + * + * ```js + * // do nothing for beginning-of-string + * snapdragon.compiler.set('bos', utils.noop); + * ``` + * @param {Object} `node` Instance of [snapdragon-node][] + * @returns {undefined} + * @api public + */ + +utils.noop = function(node) { + append(this, '', node); +}; + +/** + * Appdend `node.val` to `compiler.output`, exactly as it was created + * by the parser. + * + * ```js + * snapdragon.compiler.set('text', utils.identity); + * ``` + * @param {Object} `node` Instance of [snapdragon-node][] + * @returns {undefined} + * @api public + */ + +utils.identity = function(node) { + append(this, node.val, node); +}; + +/** + * Previously named `.emit`, this method appends the given `val` + * to `compiler.output` for the given node. Useful when you know + * what value should be appended advance, regardless of the actual + * value of `node.val`. + * + * ```js + * snapdragon.compiler + * .set('i', function(node) { + * this.mapVisit(node); + * }) + * .set('i.open', utils.append('')) + * .set('i.close', utils.append('')) + * ``` + * @param {Object} `node` Instance of [snapdragon-node][] + * @returns {Function} Returns a compiler middleware function. + * @api public + */ + +utils.append = function(val) { + return function(node) { + append(this, val, node); + }; +}; + +/** + * Used in compiler middleware, this onverts an AST node into + * an empty `text` node and deletes `node.nodes` if it exists. + * The advantage of this method is that, as opposed to completely + * removing the node, indices will not need to be re-calculated + * in sibling nodes, and nothing is appended to the output. + * + * ```js + * utils.toNoop(node); + * // convert `node.nodes` to the given value instead of deleting it + * utils.toNoop(node, []); + * ``` + * @param {Object} `node` Instance of [snapdragon-node][] + * @param {Array} `nodes` Optionally pass a new `nodes` value, to replace the existing `node.nodes` array. + * @api public + */ + +utils.toNoop = function(node, nodes) { + if (nodes) { + node.nodes = nodes; + } else { + delete node.nodes; + node.type = 'text'; + node.val = ''; + } +}; + +/** + * Visit `node` with the given `fn`. The built-in `.visit` method in snapdragon + * automatically calls registered compilers, this allows you to pass a visitor + * function. + * + * ```js + * snapdragon.compiler.set('i', function(node) { + * utils.visit(node, function(childNode) { + * // do stuff with "childNode" + * return childNode; + * }); + * }); + * ``` + * @param {Object} `node` Instance of [snapdragon-node][] + * @param {Function} `fn` + * @return {Object} returns the node after recursively visiting all child nodes. + * @api public + */ + +utils.visit = function(node, fn) { + assert(utils.isNode(node), 'expected node to be an instance of Node'); + assert(isFunction(fn), 'expected a visitor function'); + fn(node); + return node.nodes ? utils.mapVisit(node, fn) : node; +}; + +/** + * Map [visit](#visit) the given `fn` over `node.nodes`. This is called by + * [visit](#visit), use this method if you do not want `fn` to be called on + * the first node. + * + * ```js + * snapdragon.compiler.set('i', function(node) { + * utils.mapVisit(node, function(childNode) { + * // do stuff with "childNode" + * return childNode; + * }); + * }); + * ``` + * @param {Object} `node` Instance of [snapdragon-node][] + * @param {Object} `options` + * @param {Function} `fn` + * @return {Object} returns the node + * @api public + */ + +utils.mapVisit = function(node, fn) { + assert(utils.isNode(node), 'expected node to be an instance of Node'); + assert(isArray(node.nodes), 'expected node.nodes to be an array'); + assert(isFunction(fn), 'expected a visitor function'); + + for (var i = 0; i < node.nodes.length; i++) { + utils.visit(node.nodes[i], fn); + } + return node; +}; + +/** + * Unshift an `*.open` node onto `node.nodes`. + * + * ```js + * var Node = require('snapdragon-node'); + * snapdragon.parser.set('brace', function(node) { + * var match = this.match(/^{/); + * if (match) { + * var parent = new Node({type: 'brace'}); + * utils.addOpen(parent, Node); + * console.log(parent.nodes[0]): + * // { type: 'brace.open', val: '' }; + * + * // push the parent "brace" node onto the stack + * this.push(parent); + * + * // return the parent node, so it's also added to the AST + * return brace; + * } + * }); + * ``` + * @param {Object} `node` Instance of [snapdragon-node][] + * @param {Function} `Node` (required) Node constructor function from [snapdragon-node][]. + * @param {Function} `filter` Optionaly specify a filter function to exclude the node. + * @return {Object} Returns the created opening node. + * @api public + */ + +utils.addOpen = function(node, Node, val, filter) { + assert(utils.isNode(node), 'expected node to be an instance of Node'); + assert(isFunction(Node), 'expected Node to be a constructor function'); + + if (typeof val === 'function') { + filter = val; + val = ''; + } + + if (typeof filter === 'function' && !filter(node)) return; + var open = new Node({ type: node.type + '.open', val: val}); + var unshift = node.unshift || node.unshiftNode; + if (typeof unshift === 'function') { + unshift.call(node, open); + } else { + utils.unshiftNode(node, open); + } + return open; +}; + +/** + * Push a `*.close` node onto `node.nodes`. + * + * ```js + * var Node = require('snapdragon-node'); + * snapdragon.parser.set('brace', function(node) { + * var match = this.match(/^}/); + * if (match) { + * var parent = this.parent(); + * if (parent.type !== 'brace') { + * throw new Error('missing opening: ' + '}'); + * } + * + * utils.addClose(parent, Node); + * console.log(parent.nodes[parent.nodes.length - 1]): + * // { type: 'brace.close', val: '' }; + * + * // no need to return a node, since the parent + * // was already added to the AST + * return; + * } + * }); + * ``` + * @param {Object} `node` Instance of [snapdragon-node][] + * @param {Function} `Node` (required) Node constructor function from [snapdragon-node][]. + * @param {Function} `filter` Optionaly specify a filter function to exclude the node. + * @return {Object} Returns the created closing node. + * @api public + */ + +utils.addClose = function(node, Node, val, filter) { + assert(utils.isNode(node), 'expected node to be an instance of Node'); + assert(isFunction(Node), 'expected Node to be a constructor function'); + + if (typeof val === 'function') { + filter = val; + val = ''; + } + + if (typeof filter === 'function' && !filter(node)) return; + var close = new Node({ type: node.type + '.close', val: val}); + var push = node.push || node.pushNode; + if (typeof push === 'function') { + push.call(node, close); + } else { + utils.pushNode(node, close); + } + return close; +}; + +/** + * Wraps the given `node` with `*.open` and `*.close` nodes. + * + * @param {Object} `node` Instance of [snapdragon-node][] + * @param {Function} `Node` (required) Node constructor function from [snapdragon-node][]. + * @param {Function} `filter` Optionaly specify a filter function to exclude the node. + * @return {Object} Returns the node + * @api public + */ + +utils.wrapNodes = function(node, Node, filter) { + assert(utils.isNode(node), 'expected node to be an instance of Node'); + assert(isFunction(Node), 'expected Node to be a constructor function'); + + utils.addOpen(node, Node, filter); + utils.addClose(node, Node, filter); + return node; +}; + +/** + * Push the given `node` onto `parent.nodes`, and set `parent` as `node.parent. + * + * ```js + * var parent = new Node({type: 'foo'}); + * var node = new Node({type: 'bar'}); + * utils.pushNode(parent, node); + * console.log(parent.nodes[0].type) // 'bar' + * console.log(node.parent.type) // 'foo' + * ``` + * @param {Object} `parent` + * @param {Object} `node` Instance of [snapdragon-node][] + * @return {Object} Returns the child node + * @api public + */ + +utils.pushNode = function(parent, node) { + assert(utils.isNode(parent), 'expected parent node to be an instance of Node'); + assert(utils.isNode(node), 'expected node to be an instance of Node'); + + node.define('parent', parent); + parent.nodes = parent.nodes || []; + parent.nodes.push(node); + return node; +}; + +/** + * Unshift `node` onto `parent.nodes`, and set `parent` as `node.parent. + * + * ```js + * var parent = new Node({type: 'foo'}); + * var node = new Node({type: 'bar'}); + * utils.unshiftNode(parent, node); + * console.log(parent.nodes[0].type) // 'bar' + * console.log(node.parent.type) // 'foo' + * ``` + * @param {Object} `parent` + * @param {Object} `node` Instance of [snapdragon-node][] + * @return {undefined} + * @api public + */ + +utils.unshiftNode = function(parent, node) { + assert(utils.isNode(parent), 'expected parent node to be an instance of Node'); + assert(utils.isNode(node), 'expected node to be an instance of Node'); + + node.define('parent', parent); + parent.nodes = parent.nodes || []; + parent.nodes.unshift(node); +}; + +/** + * Pop the last `node` off of `parent.nodes`. The advantage of + * using this method is that it checks for `node.nodes` and works + * with any version of `snapdragon-node`. + * + * ```js + * var parent = new Node({type: 'foo'}); + * utils.pushNode(parent, new Node({type: 'foo'})); + * utils.pushNode(parent, new Node({type: 'bar'})); + * utils.pushNode(parent, new Node({type: 'baz'})); + * console.log(parent.nodes.length); //=> 3 + * utils.popNode(parent); + * console.log(parent.nodes.length); //=> 2 + * ``` + * @param {Object} `parent` + * @param {Object} `node` Instance of [snapdragon-node][] + * @return {Number|Undefined} Returns the length of `node.nodes` or undefined. + * @api public + */ + +utils.popNode = function(node) { + assert(utils.isNode(node), 'expected node to be an instance of Node'); + if (typeof node.pop === 'function') { + return node.pop(); + } + return node.nodes && node.nodes.pop(); +}; + +/** + * Shift the first `node` off of `parent.nodes`. The advantage of + * using this method is that it checks for `node.nodes` and works + * with any version of `snapdragon-node`. + * + * ```js + * var parent = new Node({type: 'foo'}); + * utils.pushNode(parent, new Node({type: 'foo'})); + * utils.pushNode(parent, new Node({type: 'bar'})); + * utils.pushNode(parent, new Node({type: 'baz'})); + * console.log(parent.nodes.length); //=> 3 + * utils.shiftNode(parent); + * console.log(parent.nodes.length); //=> 2 + * ``` + * @param {Object} `parent` + * @param {Object} `node` Instance of [snapdragon-node][] + * @return {Number|Undefined} Returns the length of `node.nodes` or undefined. + * @api public + */ + +utils.shiftNode = function(node) { + assert(utils.isNode(node), 'expected node to be an instance of Node'); + if (typeof node.shift === 'function') { + return node.shift(); + } + return node.nodes && node.nodes.shift(); +}; + +/** + * Remove the specified `node` from `parent.nodes`. + * + * ```js + * var parent = new Node({type: 'abc'}); + * var foo = new Node({type: 'foo'}); + * utils.pushNode(parent, foo); + * utils.pushNode(parent, new Node({type: 'bar'})); + * utils.pushNode(parent, new Node({type: 'baz'})); + * console.log(parent.nodes.length); //=> 3 + * utils.removeNode(parent, foo); + * console.log(parent.nodes.length); //=> 2 + * ``` + * @param {Object} `parent` + * @param {Object} `node` Instance of [snapdragon-node][] + * @return {Object|undefined} Returns the removed node, if successful, or undefined if it does not exist on `parent.nodes`. + * @api public + */ + +utils.removeNode = function(parent, node) { + assert(utils.isNode(parent), 'expected parent.node to be an instance of Node'); + assert(utils.isNode(node), 'expected node to be an instance of Node'); + + if (!parent.nodes) { + return null; + } + + if (typeof parent.remove === 'function') { + return parent.remove(node); + } + + var idx = parent.nodes.indexOf(node); + if (idx !== -1) { + return parent.nodes.splice(idx, 1); + } +}; + +/** + * Returns true if `node.type` matches the given `type`. Throws a + * `TypeError` if `node` is not an instance of `Node`. + * + * ```js + * var Node = require('snapdragon-node'); + * var node = new Node({type: 'foo'}); + * console.log(utils.isType(node, 'foo')); // false + * console.log(utils.isType(node, 'bar')); // true + * ``` + * @param {Object} `node` Instance of [snapdragon-node][] + * @param {String} `type` + * @return {Boolean} + * @api public + */ + +utils.isType = function(node, type) { + assert(utils.isNode(node), 'expected node to be an instance of Node'); + switch (typeOf(type)) { + case 'array': + var types = type.slice(); + for (var i = 0; i < types.length; i++) { + if (utils.isType(node, types[i])) { + return true; + } + } + return false; + case 'string': + return node.type === type; + case 'regexp': + return type.test(node.type); + default: { + throw new TypeError('expected "type" to be an array, string or regexp'); + } + } +}; + +/** + * Returns true if the given `node` has the given `type` in `node.nodes`. + * Throws a `TypeError` if `node` is not an instance of `Node`. + * + * ```js + * var Node = require('snapdragon-node'); + * var node = new Node({ + * type: 'foo', + * nodes: [ + * new Node({type: 'bar'}), + * new Node({type: 'baz'}) + * ] + * }); + * console.log(utils.hasType(node, 'xyz')); // false + * console.log(utils.hasType(node, 'baz')); // true + * ``` + * @param {Object} `node` Instance of [snapdragon-node][] + * @param {String} `type` + * @return {Boolean} + * @api public + */ + +utils.hasType = function(node, type) { + assert(utils.isNode(node), 'expected node to be an instance of Node'); + if (!Array.isArray(node.nodes)) return false; + for (var i = 0; i < node.nodes.length; i++) { + if (utils.isType(node.nodes[i], type)) { + return true; + } + } + return false; +}; + +/** + * Returns the first node from `node.nodes` of the given `type` + * + * ```js + * var node = new Node({ + * type: 'foo', + * nodes: [ + * new Node({type: 'text', val: 'abc'}), + * new Node({type: 'text', val: 'xyz'}) + * ] + * }); + * + * var textNode = utils.firstOfType(node.nodes, 'text'); + * console.log(textNode.val); + * //=> 'abc' + * ``` + * @param {Array} `nodes` + * @param {String} `type` + * @return {Object|undefined} Returns the first matching node or undefined. + * @api public + */ + +utils.firstOfType = function(nodes, type) { + for (var i = 0; i < nodes.length; i++) { + var node = nodes[i]; + if (utils.isType(node, type)) { + return node; + } + } +}; + +/** + * Returns the node at the specified index, or the first node of the + * given `type` from `node.nodes`. + * + * ```js + * var node = new Node({ + * type: 'foo', + * nodes: [ + * new Node({type: 'text', val: 'abc'}), + * new Node({type: 'text', val: 'xyz'}) + * ] + * }); + * + * var nodeOne = utils.findNode(node.nodes, 'text'); + * console.log(nodeOne.val); + * //=> 'abc' + * + * var nodeTwo = utils.findNode(node.nodes, 1); + * console.log(nodeTwo.val); + * //=> 'xyz' + * ``` + * + * @param {Array} `nodes` + * @param {String|Number} `type` Node type or index. + * @return {Object} Returns a node or undefined. + * @api public + */ + +utils.findNode = function(nodes, type) { + if (!Array.isArray(nodes)) { + return null; + } + if (typeof type === 'number') { + return nodes[type]; + } + return utils.firstOfType(nodes, type); +}; + +/** + * Returns true if the given node is an "*.open" node. + * + * ```js + * var Node = require('snapdragon-node'); + * var brace = new Node({type: 'brace'}); + * var open = new Node({type: 'brace.open'}); + * var close = new Node({type: 'brace.close'}); + * + * console.log(utils.isOpen(brace)); // false + * console.log(utils.isOpen(open)); // true + * console.log(utils.isOpen(close)); // false + * ``` + * @param {Object} `node` Instance of [snapdragon-node][] + * @return {Boolean} + * @api public + */ + +utils.isOpen = function(node) { + assert(utils.isNode(node), 'expected node to be an instance of Node'); + return node.type.slice(-5) === '.open'; +}; + +/** + * Returns true if the given node is a "*.close" node. + * + * ```js + * var Node = require('snapdragon-node'); + * var brace = new Node({type: 'brace'}); + * var open = new Node({type: 'brace.open'}); + * var close = new Node({type: 'brace.close'}); + * + * console.log(utils.isClose(brace)); // false + * console.log(utils.isClose(open)); // false + * console.log(utils.isClose(close)); // true + * ``` + * @param {Object} `node` Instance of [snapdragon-node][] + * @return {Boolean} + * @api public + */ + +utils.isClose = function(node) { + assert(utils.isNode(node), 'expected node to be an instance of Node'); + return node.type.slice(-6) === '.close'; +}; + +/** + * Returns true if `node.nodes` **has** an `.open` node + * + * ```js + * var Node = require('snapdragon-node'); + * var brace = new Node({ + * type: 'brace', + * nodes: [] + * }); + * + * var open = new Node({type: 'brace.open'}); + * console.log(utils.hasOpen(brace)); // false + * + * brace.pushNode(open); + * console.log(utils.hasOpen(brace)); // true + * ``` + * @param {Object} `node` Instance of [snapdragon-node][] + * @return {Boolean} + * @api public + */ + +utils.hasOpen = function(node) { + assert(utils.isNode(node), 'expected node to be an instance of Node'); + var first = node.first || node.nodes ? node.nodes[0] : null; + if (utils.isNode(first)) { + return first.type === node.type + '.open'; + } + return false; +}; + +/** + * Returns true if `node.nodes` **has** a `.close` node + * + * ```js + * var Node = require('snapdragon-node'); + * var brace = new Node({ + * type: 'brace', + * nodes: [] + * }); + * + * var close = new Node({type: 'brace.close'}); + * console.log(utils.hasClose(brace)); // false + * + * brace.pushNode(close); + * console.log(utils.hasClose(brace)); // true + * ``` + * @param {Object} `node` Instance of [snapdragon-node][] + * @return {Boolean} + * @api public + */ + +utils.hasClose = function(node) { + assert(utils.isNode(node), 'expected node to be an instance of Node'); + var last = node.last || node.nodes ? node.nodes[node.nodes.length - 1] : null; + if (utils.isNode(last)) { + return last.type === node.type + '.close'; + } + return false; +}; + +/** + * Returns true if `node.nodes` has both `.open` and `.close` nodes + * + * ```js + * var Node = require('snapdragon-node'); + * var brace = new Node({ + * type: 'brace', + * nodes: [] + * }); + * + * var open = new Node({type: 'brace.open'}); + * var close = new Node({type: 'brace.close'}); + * console.log(utils.hasOpen(brace)); // false + * console.log(utils.hasClose(brace)); // false + * + * brace.pushNode(open); + * brace.pushNode(close); + * console.log(utils.hasOpen(brace)); // true + * console.log(utils.hasClose(brace)); // true + * ``` + * @param {Object} `node` Instance of [snapdragon-node][] + * @return {Boolean} + * @api public + */ + +utils.hasOpenAndClose = function(node) { + return utils.hasOpen(node) && utils.hasClose(node); +}; + +/** + * Push the given `node` onto the `state.inside` array for the + * given type. This array is used as a specialized "stack" for + * only the given `node.type`. + * + * ```js + * var state = { inside: {}}; + * var node = new Node({type: 'brace'}); + * utils.addType(state, node); + * console.log(state.inside); + * //=> { brace: [{type: 'brace'}] } + * ``` + * @param {Object} `state` The `compiler.state` object or custom state object. + * @param {Object} `node` Instance of [snapdragon-node][] + * @return {Array} Returns the `state.inside` stack for the given type. + * @api public + */ + +utils.addType = function(state, node) { + assert(utils.isNode(node), 'expected node to be an instance of Node'); + assert(isObject(state), 'expected state to be an object'); + + var type = node.parent + ? node.parent.type + : node.type.replace(/\.open$/, ''); + + if (!state.hasOwnProperty('inside')) { + state.inside = {}; + } + if (!state.inside.hasOwnProperty(type)) { + state.inside[type] = []; + } + + var arr = state.inside[type]; + arr.push(node); + return arr; +}; + +/** + * Remove the given `node` from the `state.inside` array for the + * given type. This array is used as a specialized "stack" for + * only the given `node.type`. + * + * ```js + * var state = { inside: {}}; + * var node = new Node({type: 'brace'}); + * utils.addType(state, node); + * console.log(state.inside); + * //=> { brace: [{type: 'brace'}] } + * utils.removeType(state, node); + * //=> { brace: [] } + * ``` + * @param {Object} `state` The `compiler.state` object or custom state object. + * @param {Object} `node` Instance of [snapdragon-node][] + * @return {Array} Returns the `state.inside` stack for the given type. + * @api public + */ + +utils.removeType = function(state, node) { + assert(utils.isNode(node), 'expected node to be an instance of Node'); + assert(isObject(state), 'expected state to be an object'); + + var type = node.parent + ? node.parent.type + : node.type.replace(/\.close$/, ''); + + if (state.inside.hasOwnProperty(type)) { + return state.inside[type].pop(); + } +}; + +/** + * Returns true if `node.val` is an empty string, or `node.nodes` does + * not contain any non-empty text nodes. + * + * ```js + * var node = new Node({type: 'text'}); + * utils.isEmpty(node); //=> true + * node.val = 'foo'; + * utils.isEmpty(node); //=> false + * ``` + * @param {Object} `node` Instance of [snapdragon-node][] + * @param {Function} `fn` + * @return {Boolean} + * @api public + */ + +utils.isEmpty = function(node, fn) { + assert(utils.isNode(node), 'expected node to be an instance of Node'); + + if (!Array.isArray(node.nodes)) { + if (node.type !== 'text') { + return true; + } + if (typeof fn === 'function') { + return fn(node, node.parent); + } + return !utils.trim(node.val); + } + + for (var i = 0; i < node.nodes.length; i++) { + var child = node.nodes[i]; + if (utils.isOpen(child) || utils.isClose(child)) { + continue; + } + if (!utils.isEmpty(child, fn)) { + return false; + } + } + + return true; +}; + +/** + * Returns true if the `state.inside` stack for the given type exists + * and has one or more nodes on it. + * + * ```js + * var state = { inside: {}}; + * var node = new Node({type: 'brace'}); + * console.log(utils.isInsideType(state, 'brace')); //=> false + * utils.addType(state, node); + * console.log(utils.isInsideType(state, 'brace')); //=> true + * utils.removeType(state, node); + * console.log(utils.isInsideType(state, 'brace')); //=> false + * ``` + * @param {Object} `state` + * @param {String} `type` + * @return {Boolean} + * @api public + */ + +utils.isInsideType = function(state, type) { + assert(isObject(state), 'expected state to be an object'); + assert(isString(type), 'expected type to be a string'); + + if (!state.hasOwnProperty('inside')) { + return false; + } + + if (!state.inside.hasOwnProperty(type)) { + return false; + } + + return state.inside[type].length > 0; +}; + +/** + * Returns true if `node` is either a child or grand-child of the given `type`, + * or `state.inside[type]` is a non-empty array. + * + * ```js + * var state = { inside: {}}; + * var node = new Node({type: 'brace'}); + * var open = new Node({type: 'brace.open'}); + * console.log(utils.isInside(state, open, 'brace')); //=> false + * utils.pushNode(node, open); + * console.log(utils.isInside(state, open, 'brace')); //=> true + * ``` + * @param {Object} `state` Either the `compiler.state` object, if it exists, or a user-supplied state object. + * @param {Object} `node` Instance of [snapdragon-node][] + * @param {String} `type` The `node.type` to check for. + * @return {Boolean} + * @api public + */ + +utils.isInside = function(state, node, type) { + assert(utils.isNode(node), 'expected node to be an instance of Node'); + assert(isObject(state), 'expected state to be an object'); + + if (Array.isArray(type)) { + for (var i = 0; i < type.length; i++) { + if (utils.isInside(state, node, type[i])) { + return true; + } + } + return false; + } + + var parent = node.parent; + if (typeof type === 'string') { + return (parent && parent.type === type) || utils.isInsideType(state, type); + } + + if (typeOf(type) === 'regexp') { + if (parent && parent.type && type.test(parent.type)) { + return true; + } + + var keys = Object.keys(state.inside); + var len = keys.length; + var idx = -1; + while (++idx < len) { + var key = keys[idx]; + var val = state.inside[key]; + + if (Array.isArray(val) && val.length !== 0 && type.test(key)) { + return true; + } + } + } + return false; +}; + +/** + * Get the last `n` element from the given `array`. Used for getting + * a node from `node.nodes.` + * + * @param {Array} `array` + * @param {Number} `n` + * @return {undefined} + * @api public + */ + +utils.last = function(arr, n) { + return arr[arr.length - (n || 1)]; +}; + +/** + * Cast the given `val` to an array. + * + * ```js + * console.log(utils.arrayify('')); + * //=> [] + * console.log(utils.arrayify('foo')); + * //=> ['foo'] + * console.log(utils.arrayify(['foo'])); + * //=> ['foo'] + * ``` + * @param {any} `val` + * @return {Array} + * @api public + */ + +utils.arrayify = function(val) { + if (typeof val === 'string' && val !== '') { + return [val]; + } + if (!Array.isArray(val)) { + return []; + } + return val; +}; + +/** + * Convert the given `val` to a string by joining with `,`. Useful + * for creating a cheerio/CSS/DOM-style selector from a list of strings. + * + * @param {any} `val` + * @return {Array} + * @api public + */ + +utils.stringify = function(val) { + return utils.arrayify(val).join(','); +}; + +/** + * Ensure that the given value is a string and call `.trim()` on it, + * or return an empty string. + * + * @param {String} `str` + * @return {String} + * @api public + */ + +utils.trim = function(str) { + return typeof str === 'string' ? str.trim() : ''; +}; + +/** + * Return true if val is an object + */ + +function isObject(val) { + return typeOf(val) === 'object'; +} + +/** + * Return true if val is a string + */ + +function isString(val) { + return typeof val === 'string'; +} + +/** + * Return true if val is a function + */ + +function isFunction(val) { + return typeof val === 'function'; +} + +/** + * Return true if val is an array + */ + +function isArray(val) { + return Array.isArray(val); +} + +/** + * Shim to ensure the `.append` methods work with any version of snapdragon + */ + +function append(compiler, val, node) { + if (typeof compiler.append !== 'function') { + return compiler.emit(val, node); + } + return compiler.append(val, node); +} + +/** + * Simplified assertion. Throws an error is `val` is falsey. + */ + +function assert(val, message) { + if (!val) throw new Error(message); +} + + +/***/ }), +/* 116 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var isBuffer = __webpack_require__(107); +var toString = Object.prototype.toString; + +/** + * Get the native `typeof` a value. + * + * @param {*} `val` + * @return {*} Native javascript type + */ + +module.exports = function kindOf(val) { + // primitivies + if (typeof val === 'undefined') { + return 'undefined'; + } + if (val === null) { + return 'null'; + } + if (val === true || val === false || val instanceof Boolean) { + return 'boolean'; + } + if (typeof val === 'string' || val instanceof String) { + return 'string'; + } + if (typeof val === 'number' || val instanceof Number) { + return 'number'; + } + + // functions + if (typeof val === 'function' || val instanceof Function) { + return 'function'; + } + + // array + if (typeof Array.isArray !== 'undefined' && Array.isArray(val)) { + return 'array'; + } + + // check for instances of RegExp and Date before calling `toString` + if (val instanceof RegExp) { + return 'regexp'; + } + if (val instanceof Date) { + return 'date'; + } + + // other objects + var type = toString.call(val); + + if (type === '[object RegExp]') { + return 'regexp'; + } + if (type === '[object Date]') { + return 'date'; + } + if (type === '[object Arguments]') { + return 'arguments'; + } + if (type === '[object Error]') { + return 'error'; + } + + // buffer + if (isBuffer(val)) { + return 'buffer'; + } + + // es6: Map, WeakMap, Set, WeakSet + if (type === '[object Set]') { + return 'set'; + } + if (type === '[object WeakSet]') { + return 'weakset'; + } + if (type === '[object Map]') { + return 'map'; + } + if (type === '[object WeakMap]') { + return 'weakmap'; + } + if (type === '[object Symbol]') { + return 'symbol'; + } + + // typed arrays + if (type === '[object Int8Array]') { + return 'int8array'; + } + if (type === '[object Uint8Array]') { + return 'uint8array'; + } + if (type === '[object Uint8ClampedArray]') { + return 'uint8clampedarray'; + } + if (type === '[object Int16Array]') { + return 'int16array'; + } + if (type === '[object Uint16Array]') { + return 'uint16array'; + } + if (type === '[object Int32Array]') { + return 'int32array'; + } + if (type === '[object Uint32Array]') { + return 'uint32array'; + } + if (type === '[object Float32Array]') { + return 'float32array'; + } + if (type === '[object Float64Array]') { + return 'float64array'; + } + + // must be a plain object + return 'object'; +}; + + +/***/ }), +/* 117 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var extend = __webpack_require__(96); +var Snapdragon = __webpack_require__(118); +var compilers = __webpack_require__(98); +var parsers = __webpack_require__(111); +var utils = __webpack_require__(99); + +/** + * Customize Snapdragon parser and renderer + */ + +function Braces(options) { + this.options = extend({}, options); +} + +/** + * Initialize braces + */ + +Braces.prototype.init = function(options) { + if (this.isInitialized) return; + this.isInitialized = true; + var opts = utils.createOptions({}, this.options, options); + this.snapdragon = this.options.snapdragon || new Snapdragon(opts); + this.compiler = this.snapdragon.compiler; + this.parser = this.snapdragon.parser; + + compilers(this.snapdragon, opts); + parsers(this.snapdragon, opts); + + /** + * Call Snapdragon `.parse` method. When AST is returned, we check to + * see if any unclosed braces are left on the stack and, if so, we iterate + * over the stack and correct the AST so that compilers are called in the correct + * order and unbalance braces are properly escaped. + */ + + utils.define(this.snapdragon, 'parse', function(pattern, options) { + var parsed = Snapdragon.prototype.parse.apply(this, arguments); + this.parser.ast.input = pattern; + + var stack = this.parser.stack; + while (stack.length) { + addParent({type: 'brace.close', val: ''}, stack.pop()); + } + + function addParent(node, parent) { + utils.define(node, 'parent', parent); + parent.nodes.push(node); + } + + // add non-enumerable parser reference + utils.define(parsed, 'parser', this.parser); + return parsed; + }); +}; + +/** + * Decorate `.parse` method + */ + +Braces.prototype.parse = function(ast, options) { + if (ast && typeof ast === 'object' && ast.nodes) return ast; + this.init(options); + return this.snapdragon.parse(ast, options); +}; + +/** + * Decorate `.compile` method + */ + +Braces.prototype.compile = function(ast, options) { + if (typeof ast === 'string') { + ast = this.parse(ast, options); + } else { + this.init(options); + } + return this.snapdragon.compile(ast, options); +}; + +/** + * Expand + */ + +Braces.prototype.expand = function(pattern) { + var ast = this.parse(pattern, {expand: true}); + return this.compile(ast, {expand: true}); +}; + +/** + * Optimize + */ + +Braces.prototype.optimize = function(pattern) { + var ast = this.parse(pattern, {optimize: true}); + return this.compile(ast, {optimize: true}); +}; + +/** + * Expose `Braces` + */ + +module.exports = Braces; + + +/***/ }), +/* 118 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var Base = __webpack_require__(119); +var define = __webpack_require__(148); +var Compiler = __webpack_require__(154); +var Parser = __webpack_require__(184); +var utils = __webpack_require__(163); +var regexCache = {}; +var cache = {}; + +/** + * Create a new instance of `Snapdragon` with the given `options`. + * + * ```js + * var snapdragon = new Snapdragon(); + * ``` + * + * @param {Object} `options` + * @api public + */ + +function Snapdragon(options) { + Base.call(this, null, options); + this.options = utils.extend({source: 'string'}, this.options); + this.compiler = new Compiler(this.options); + this.parser = new Parser(this.options); + + Object.defineProperty(this, 'compilers', { + get: function() { + return this.compiler.compilers; + } + }); + + Object.defineProperty(this, 'parsers', { + get: function() { + return this.parser.parsers; + } + }); + + Object.defineProperty(this, 'regex', { + get: function() { + return this.parser.regex; + } + }); +} + +/** + * Inherit Base + */ + +Base.extend(Snapdragon); + +/** + * Add a parser to `snapdragon.parsers` for capturing the given `type` using + * the specified regex or parser function. A function is useful if you need + * to customize how the token is created and/or have access to the parser + * instance to check options, etc. + * + * ```js + * snapdragon + * .capture('slash', /^\//) + * .capture('dot', function() { + * var pos = this.position(); + * var m = this.match(/^\./); + * if (!m) return; + * return pos({ + * type: 'dot', + * val: m[0] + * }); + * }); + * ``` + * @param {String} `type` + * @param {RegExp|Function} `regex` + * @return {Object} Returns the parser instance for chaining + * @api public + */ + +Snapdragon.prototype.capture = function() { + return this.parser.capture.apply(this.parser, arguments); +}; + +/** + * Register a plugin `fn`. + * + * ```js + * var snapdragon = new Snapdgragon([options]); + * snapdragon.use(function() { + * console.log(this); //<= snapdragon instance + * console.log(this.parser); //<= parser instance + * console.log(this.compiler); //<= compiler instance + * }); + * ``` + * @param {Object} `fn` + * @api public + */ + +Snapdragon.prototype.use = function(fn) { + fn.call(this, this); + return this; +}; + +/** + * Parse the given `str`. + * + * ```js + * var snapdragon = new Snapdgragon([options]); + * // register parsers + * snapdragon.parser.use(function() {}); + * + * // parse + * var ast = snapdragon.parse('foo/bar'); + * console.log(ast); + * ``` + * @param {String} `str` + * @param {Object} `options` Set `options.sourcemap` to true to enable source maps. + * @return {Object} Returns an AST. + * @api public + */ + +Snapdragon.prototype.parse = function(str, options) { + this.options = utils.extend({}, this.options, options); + var parsed = this.parser.parse(str, this.options); + + // add non-enumerable parser reference + define(parsed, 'parser', this.parser); + return parsed; +}; + +/** + * Compile the given `AST`. + * + * ```js + * var snapdragon = new Snapdgragon([options]); + * // register plugins + * snapdragon.use(function() {}); + * // register parser plugins + * snapdragon.parser.use(function() {}); + * // register compiler plugins + * snapdragon.compiler.use(function() {}); + * + * // parse + * var ast = snapdragon.parse('foo/bar'); + * + * // compile + * var res = snapdragon.compile(ast); + * console.log(res.output); + * ``` + * @param {Object} `ast` + * @param {Object} `options` + * @return {Object} Returns an object with an `output` property with the rendered string. + * @api public + */ + +Snapdragon.prototype.compile = function(ast, options) { + this.options = utils.extend({}, this.options, options); + var compiled = this.compiler.compile(ast, this.options); + + // add non-enumerable compiler reference + define(compiled, 'compiler', this.compiler); + return compiled; +}; + +/** + * Expose `Snapdragon` + */ + +module.exports = Snapdragon; + +/** + * Expose `Parser` and `Compiler` + */ + +module.exports.Compiler = Compiler; +module.exports.Parser = Parser; + + +/***/ }), +/* 119 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var util = __webpack_require__(17); +var define = __webpack_require__(120); +var CacheBase = __webpack_require__(122); +var Emitter = __webpack_require__(123); +var isObject = __webpack_require__(81); +var merge = __webpack_require__(143); +var pascal = __webpack_require__(146); +var cu = __webpack_require__(147); + +/** + * Optionally define a custom `cache` namespace to use. + */ + +function namespace(name) { + var Cache = name ? CacheBase.namespace(name) : CacheBase; + var fns = []; + + /** + * Create an instance of `Base` with the given `config` and `options`. + * + * ```js + * // initialize with `config` and `options` + * var app = new Base({isApp: true}, {abc: true}); + * app.set('foo', 'bar'); + * + * // values defined with the given `config` object will be on the root of the instance + * console.log(app.baz); //=> undefined + * console.log(app.foo); //=> 'bar' + * // or use `.get` + * console.log(app.get('isApp')); //=> true + * console.log(app.get('foo')); //=> 'bar' + * + * // values defined with the given `options` object will be on `app.options + * console.log(app.options.abc); //=> true + * ``` + * + * @param {Object} `config` If supplied, this object is passed to [cache-base][] to merge onto the the instance upon instantiation. + * @param {Object} `options` If supplied, this object is used to initialize the `base.options` object. + * @api public + */ + + function Base(config, options) { + if (!(this instanceof Base)) { + return new Base(config, options); + } + Cache.call(this, config); + this.is('base'); + this.initBase(config, options); + } + + /** + * Inherit cache-base + */ + + util.inherits(Base, Cache); + + /** + * Add static emitter methods + */ + + Emitter(Base); + + /** + * Initialize `Base` defaults with the given `config` object + */ + + Base.prototype.initBase = function(config, options) { + this.options = merge({}, this.options, options); + this.cache = this.cache || {}; + this.define('registered', {}); + if (name) this[name] = {}; + + // make `app._callbacks` non-enumerable + this.define('_callbacks', this._callbacks); + if (isObject(config)) { + this.visit('set', config); + } + Base.run(this, 'use', fns); + }; + + /** + * Set the given `name` on `app._name` and `app.is*` properties. Used for doing + * lookups in plugins. + * + * ```js + * app.is('foo'); + * console.log(app._name); + * //=> 'foo' + * console.log(app.isFoo); + * //=> true + * app.is('bar'); + * console.log(app.isFoo); + * //=> true + * console.log(app.isBar); + * //=> true + * console.log(app._name); + * //=> 'bar' + * ``` + * @name .is + * @param {String} `name` + * @return {Boolean} + * @api public + */ + + Base.prototype.is = function(name) { + if (typeof name !== 'string') { + throw new TypeError('expected name to be a string'); + } + this.define('is' + pascal(name), true); + this.define('_name', name); + this.define('_appname', name); + return this; + }; + + /** + * Returns true if a plugin has already been registered on an instance. + * + * Plugin implementors are encouraged to use this first thing in a plugin + * to prevent the plugin from being called more than once on the same + * instance. + * + * ```js + * var base = new Base(); + * base.use(function(app) { + * if (app.isRegistered('myPlugin')) return; + * // do stuff to `app` + * }); + * + * // to also record the plugin as being registered + * base.use(function(app) { + * if (app.isRegistered('myPlugin', true)) return; + * // do stuff to `app` + * }); + * ``` + * @name .isRegistered + * @emits `plugin` Emits the name of the plugin being registered. Useful for unit tests, to ensure plugins are only registered once. + * @param {String} `name` The plugin name. + * @param {Boolean} `register` If the plugin if not already registered, to record it as being registered pass `true` as the second argument. + * @return {Boolean} Returns true if a plugin is already registered. + * @api public + */ + + Base.prototype.isRegistered = function(name, register) { + if (this.registered.hasOwnProperty(name)) { + return true; + } + if (register !== false) { + this.registered[name] = true; + this.emit('plugin', name); + } + return false; + }; + + /** + * Define a plugin function to be called immediately upon init. Plugins are chainable + * and expose the following arguments to the plugin function: + * + * - `app`: the current instance of `Base` + * - `base`: the [first ancestor instance](#base) of `Base` + * + * ```js + * var app = new Base() + * .use(foo) + * .use(bar) + * .use(baz) + * ``` + * @name .use + * @param {Function} `fn` plugin function to call + * @return {Object} Returns the item instance for chaining. + * @api public + */ + + Base.prototype.use = function(fn) { + fn.call(this, this); + return this; + }; + + /** + * The `.define` method is used for adding non-enumerable property on the instance. + * Dot-notation is **not supported** with `define`. + * + * ```js + * // arbitrary `render` function using lodash `template` + * app.define('render', function(str, locals) { + * return _.template(str)(locals); + * }); + * ``` + * @name .define + * @param {String} `key` The name of the property to define. + * @param {any} `value` + * @return {Object} Returns the instance for chaining. + * @api public + */ + + Base.prototype.define = function(key, val) { + if (isObject(key)) { + return this.visit('define', key); + } + define(this, key, val); + return this; + }; + + /** + * Mix property `key` onto the Base prototype. If base is inherited using + * `Base.extend` this method will be overridden by a new `mixin` method that will + * only add properties to the prototype of the inheriting application. + * + * ```js + * app.mixin('foo', function() { + * // do stuff + * }); + * ``` + * @name .mixin + * @param {String} `key` + * @param {Object|Array} `val` + * @return {Object} Returns the `base` instance for chaining. + * @api public + */ + + Base.prototype.mixin = function(key, val) { + Base.prototype[key] = val; + return this; + }; + + /** + * Non-enumberable mixin array, used by the static [Base.mixin]() method. + */ + + Base.prototype.mixins = Base.prototype.mixins || []; + + /** + * Getter/setter used when creating nested instances of `Base`, for storing a reference + * to the first ancestor instance. This works by setting an instance of `Base` on the `parent` + * property of a "child" instance. The `base` property defaults to the current instance if + * no `parent` property is defined. + * + * ```js + * // create an instance of `Base`, this is our first ("base") instance + * var first = new Base(); + * first.foo = 'bar'; // arbitrary property, to make it easier to see what's happening later + * + * // create another instance + * var second = new Base(); + * // create a reference to the first instance (`first`) + * second.parent = first; + * + * // create another instance + * var third = new Base(); + * // create a reference to the previous instance (`second`) + * // repeat this pattern every time a "child" instance is created + * third.parent = second; + * + * // we can always access the first instance using the `base` property + * console.log(first.base.foo); + * //=> 'bar' + * console.log(second.base.foo); + * //=> 'bar' + * console.log(third.base.foo); + * //=> 'bar' + * // and now you know how to get to third base ;) + * ``` + * @name .base + * @api public + */ + + Object.defineProperty(Base.prototype, 'base', { + configurable: true, + get: function() { + return this.parent ? this.parent.base : this; + } + }); + + /** + * Static method for adding global plugin functions that will + * be added to an instance when created. + * + * ```js + * Base.use(function(app) { + * app.foo = 'bar'; + * }); + * var app = new Base(); + * console.log(app.foo); + * //=> 'bar' + * ``` + * @name #use + * @param {Function} `fn` Plugin function to use on each instance. + * @return {Object} Returns the `Base` constructor for chaining + * @api public + */ + + define(Base, 'use', function(fn) { + fns.push(fn); + return Base; + }); + + /** + * Run an array of functions by passing each function + * to a method on the given object specified by the given property. + * + * @param {Object} `obj` Object containing method to use. + * @param {String} `prop` Name of the method on the object to use. + * @param {Array} `arr` Array of functions to pass to the method. + */ + + define(Base, 'run', function(obj, prop, arr) { + var len = arr.length, i = 0; + while (len--) { + obj[prop](arr[i++]); + } + return Base; + }); + + /** + * Static method for inheriting the prototype and static methods of the `Base` class. + * This method greatly simplifies the process of creating inheritance-based applications. + * See [static-extend][] for more details. + * + * ```js + * var extend = cu.extend(Parent); + * Parent.extend(Child); + * + * // optional methods + * Parent.extend(Child, { + * foo: function() {}, + * bar: function() {} + * }); + * ``` + * @name #extend + * @param {Function} `Ctor` constructor to extend + * @param {Object} `methods` Optional prototype properties to mix in. + * @return {Object} Returns the `Base` constructor for chaining + * @api public + */ + + define(Base, 'extend', cu.extend(Base, function(Ctor, Parent) { + Ctor.prototype.mixins = Ctor.prototype.mixins || []; + + define(Ctor, 'mixin', function(fn) { + var mixin = fn(Ctor.prototype, Ctor); + if (typeof mixin === 'function') { + Ctor.prototype.mixins.push(mixin); + } + return Ctor; + }); + + define(Ctor, 'mixins', function(Child) { + Base.run(Child, 'mixin', Ctor.prototype.mixins); + return Ctor; + }); + + Ctor.prototype.mixin = function(key, value) { + Ctor.prototype[key] = value; + return this; + }; + return Base; + })); + + /** + * Used for adding methods to the `Base` prototype, and/or to the prototype of child instances. + * When a mixin function returns a function, the returned function is pushed onto the `.mixins` + * array, making it available to be used on inheriting classes whenever `Base.mixins()` is + * called (e.g. `Base.mixins(Child)`). + * + * ```js + * Base.mixin(function(proto) { + * proto.foo = function(msg) { + * return 'foo ' + msg; + * }; + * }); + * ``` + * @name #mixin + * @param {Function} `fn` Function to call + * @return {Object} Returns the `Base` constructor for chaining + * @api public + */ + + define(Base, 'mixin', function(fn) { + var mixin = fn(Base.prototype, Base); + if (typeof mixin === 'function') { + Base.prototype.mixins.push(mixin); + } + return Base; + }); + + /** + * Static method for running global mixin functions against a child constructor. + * Mixins must be registered before calling this method. + * + * ```js + * Base.extend(Child); + * Base.mixins(Child); + * ``` + * @name #mixins + * @param {Function} `Child` Constructor function of a child class + * @return {Object} Returns the `Base` constructor for chaining + * @api public + */ + + define(Base, 'mixins', function(Child) { + Base.run(Child, 'mixin', Base.prototype.mixins); + return Base; + }); + + /** + * Similar to `util.inherit`, but copies all static properties, prototype properties, and + * getters/setters from `Provider` to `Receiver`. See [class-utils][]{#inherit} for more details. + * + * ```js + * Base.inherit(Foo, Bar); + * ``` + * @name #inherit + * @param {Function} `Receiver` Receiving (child) constructor + * @param {Function} `Provider` Providing (parent) constructor + * @return {Object} Returns the `Base` constructor for chaining + * @api public + */ + + define(Base, 'inherit', cu.inherit); + define(Base, 'bubble', cu.bubble); + return Base; +} + +/** + * Expose `Base` with default settings + */ + +module.exports = namespace(); + +/** + * Allow users to define a namespace + */ + +module.exports.namespace = namespace; + + +/***/ }), +/* 120 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +/*! + * define-property + * + * Copyright (c) 2015, 2017, Jon Schlinkert. + * Released under the MIT License. + */ + + + +var isDescriptor = __webpack_require__(121); + +module.exports = function defineProperty(obj, prop, val) { + if (typeof obj !== 'object' && typeof obj !== 'function') { + throw new TypeError('expected an object or function.'); + } + + if (typeof prop !== 'string') { + throw new TypeError('expected `prop` to be a string.'); + } + + if (isDescriptor(val) && ('set' in val || 'get' in val)) { + return Object.defineProperty(obj, prop, val); + } + + return Object.defineProperty(obj, prop, { + configurable: true, + enumerable: false, + writable: true, + value: val + }); +}; + + +/***/ }), +/* 121 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var isAccessor = __webpack_require__(83); +var isData = __webpack_require__(87); + +module.exports = function isDescriptor(obj, key) { + if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) { + return false; + } + + if ('get' in obj || 'set' in obj) { + return isAccessor(obj, key); + } + + return isData(obj, key); +}; + + +/***/ }), +/* 122 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var isObject = __webpack_require__(81); +var Emitter = __webpack_require__(123); +var visit = __webpack_require__(124); +var toPath = __webpack_require__(127); +var union = __webpack_require__(129); +var del = __webpack_require__(133); +var get = __webpack_require__(131); +var has = __webpack_require__(138); +var set = __webpack_require__(132); + +/** + * Create a `Cache` constructor that when instantiated will + * store values on the given `prop`. + * + * ```js + * var Cache = require('cache-base').namespace('data'); + * var cache = new Cache(); + * + * cache.set('foo', 'bar'); + * //=> {data: {foo: 'bar'}} + * ``` + * @param {String} `prop` The property name to use for storing values. + * @return {Function} Returns a custom `Cache` constructor + * @api public + */ + +function namespace(prop) { + + /** + * Create a new `Cache`. Internally the `Cache` constructor is created using + * the `namespace` function, with `cache` defined as the storage object. + * + * ```js + * var app = new Cache(); + * ``` + * @param {Object} `cache` Optionally pass an object to initialize with. + * @constructor + * @api public + */ + + function Cache(cache) { + if (prop) { + this[prop] = {}; + } + if (cache) { + this.set(cache); + } + } + + /** + * Inherit Emitter + */ + + Emitter(Cache.prototype); + + /** + * Assign `value` to `key`. Also emits `set` with + * the key and value. + * + * ```js + * app.on('set', function(key, val) { + * // do something when `set` is emitted + * }); + * + * app.set(key, value); + * + * // also takes an object or array + * app.set({name: 'Halle'}); + * app.set([{foo: 'bar'}, {baz: 'quux'}]); + * console.log(app); + * //=> {name: 'Halle', foo: 'bar', baz: 'quux'} + * ``` + * + * @name .set + * @emits `set` with `key` and `value` as arguments. + * @param {String} `key` + * @param {any} `value` + * @return {Object} Returns the instance for chaining. + * @api public + */ + + Cache.prototype.set = function(key, val) { + if (Array.isArray(key) && arguments.length === 2) { + key = toPath(key); + } + if (isObject(key) || Array.isArray(key)) { + this.visit('set', key); + } else { + set(prop ? this[prop] : this, key, val); + this.emit('set', key, val); + } + return this; + }; + + /** + * Union `array` to `key`. Also emits `set` with + * the key and value. + * + * ```js + * app.union('a.b', ['foo']); + * app.union('a.b', ['bar']); + * console.log(app.get('a')); + * //=> {b: ['foo', 'bar']} + * ``` + * @name .union + * @param {String} `key` + * @param {any} `value` + * @return {Object} Returns the instance for chaining. + * @api public + */ + + Cache.prototype.union = function(key, val) { + if (Array.isArray(key) && arguments.length === 2) { + key = toPath(key); + } + var ctx = prop ? this[prop] : this; + union(ctx, key, arrayify(val)); + this.emit('union', val); + return this; + }; + + /** + * Return the value of `key`. Dot notation may be used + * to get [nested property values][get-value]. + * + * ```js + * app.set('a.b.c', 'd'); + * app.get('a.b'); + * //=> {c: 'd'} + * + * app.get(['a', 'b']); + * //=> {c: 'd'} + * ``` + * + * @name .get + * @emits `get` with `key` and `value` as arguments. + * @param {String} `key` The name of the property to get. Dot-notation may be used. + * @return {any} Returns the value of `key` + * @api public + */ + + Cache.prototype.get = function(key) { + key = toPath(arguments); + + var ctx = prop ? this[prop] : this; + var val = get(ctx, key); + + this.emit('get', key, val); + return val; + }; + + /** + * Return true if app has a stored value for `key`, + * false only if value is `undefined`. + * + * ```js + * app.set('foo', 'bar'); + * app.has('foo'); + * //=> true + * ``` + * + * @name .has + * @emits `has` with `key` and true or false as arguments. + * @param {String} `key` + * @return {Boolean} + * @api public + */ + + Cache.prototype.has = function(key) { + key = toPath(arguments); + + var ctx = prop ? this[prop] : this; + var val = get(ctx, key); + + var has = typeof val !== 'undefined'; + this.emit('has', key, has); + return has; + }; + + /** + * Delete one or more properties from the instance. + * + * ```js + * app.del(); // delete all + * // or + * app.del('foo'); + * // or + * app.del(['foo', 'bar']); + * ``` + * @name .del + * @emits `del` with the `key` as the only argument. + * @param {String|Array} `key` Property name or array of property names. + * @return {Object} Returns the instance for chaining. + * @api public + */ + + Cache.prototype.del = function(key) { + if (Array.isArray(key)) { + this.visit('del', key); + } else { + del(prop ? this[prop] : this, key); + this.emit('del', key); + } + return this; + }; + + /** + * Reset the entire cache to an empty object. + * + * ```js + * app.clear(); + * ``` + * @api public + */ + + Cache.prototype.clear = function() { + if (prop) { + this[prop] = {}; + } + }; + + /** + * Visit `method` over the properties in the given object, or map + * visit over the object-elements in an array. + * + * @name .visit + * @param {String} `method` The name of the `base` method to call. + * @param {Object|Array} `val` The object or array to iterate over. + * @return {Object} Returns the instance for chaining. + * @api public + */ + + Cache.prototype.visit = function(method, val) { + visit(this, method, val); + return this; + }; + + return Cache; +} + +/** + * Cast val to an array + */ + +function arrayify(val) { + return val ? (Array.isArray(val) ? val : [val]) : []; +} + +/** + * Expose `Cache` + */ + +module.exports = namespace(); + +/** + * Expose `Cache.namespace` + */ + +module.exports.namespace = namespace; + + +/***/ }), +/* 123 */ +/***/ ((module) => { + + +/** + * Expose `Emitter`. + */ + +if (true) { + module.exports = Emitter; +} + +/** + * Initialize a new `Emitter`. + * + * @api public + */ + +function Emitter(obj) { + if (obj) return mixin(obj); +}; + +/** + * Mixin the emitter properties. + * + * @param {Object} obj + * @return {Object} + * @api private + */ + +function mixin(obj) { + for (var key in Emitter.prototype) { + obj[key] = Emitter.prototype[key]; + } + return obj; +} + +/** + * Listen on the given `event` with `fn`. + * + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public + */ + +Emitter.prototype.on = +Emitter.prototype.addEventListener = function(event, fn){ + this._callbacks = this._callbacks || {}; + (this._callbacks['$' + event] = this._callbacks['$' + event] || []) + .push(fn); + return this; +}; + +/** + * Adds an `event` listener that will be invoked a single + * time then automatically removed. + * + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public + */ + +Emitter.prototype.once = function(event, fn){ + function on() { + this.off(event, on); + fn.apply(this, arguments); + } + + on.fn = fn; + this.on(event, on); + return this; +}; + +/** + * Remove the given callback for `event` or all + * registered callbacks. + * + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public + */ + +Emitter.prototype.off = +Emitter.prototype.removeListener = +Emitter.prototype.removeAllListeners = +Emitter.prototype.removeEventListener = function(event, fn){ + this._callbacks = this._callbacks || {}; + + // all + if (0 == arguments.length) { + this._callbacks = {}; + return this; + } + + // specific event + var callbacks = this._callbacks['$' + event]; + if (!callbacks) return this; + + // remove all handlers + if (1 == arguments.length) { + delete this._callbacks['$' + event]; + return this; + } + + // remove specific handler + var cb; + for (var i = 0; i < callbacks.length; i++) { + cb = callbacks[i]; + if (cb === fn || cb.fn === fn) { + callbacks.splice(i, 1); + break; + } + } + + // Remove event specific arrays for event types that no + // one is subscribed for to avoid memory leak. + if (callbacks.length === 0) { + delete this._callbacks['$' + event]; + } + + return this; +}; + +/** + * Emit `event` with the given args. + * + * @param {String} event + * @param {Mixed} ... + * @return {Emitter} + */ + +Emitter.prototype.emit = function(event){ + this._callbacks = this._callbacks || {}; + + var args = new Array(arguments.length - 1) + , callbacks = this._callbacks['$' + event]; + + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + + if (callbacks) { + callbacks = callbacks.slice(0); + for (var i = 0, len = callbacks.length; i < len; ++i) { + callbacks[i].apply(this, args); + } + } + + return this; +}; + +/** + * Return array of callbacks for `event`. + * + * @param {String} event + * @return {Array} + * @api public + */ + +Emitter.prototype.listeners = function(event){ + this._callbacks = this._callbacks || {}; + return this._callbacks['$' + event] || []; +}; + +/** + * Check if this emitter has `event` handlers. + * + * @param {String} event + * @return {Boolean} + * @api public + */ + +Emitter.prototype.hasListeners = function(event){ + return !! this.listeners(event).length; +}; + + +/***/ }), +/* 124 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +/*! + * collection-visit + * + * Copyright (c) 2015, 2017, Jon Schlinkert. + * Released under the MIT License. + */ + + + +var visit = __webpack_require__(125); +var mapVisit = __webpack_require__(126); + +module.exports = function(collection, method, val) { + var result; + + if (typeof val === 'string' && (method in collection)) { + var args = [].slice.call(arguments, 2); + result = collection[method].apply(collection, args); + } else if (Array.isArray(val)) { + result = mapVisit.apply(null, arguments); + } else { + result = visit.apply(null, arguments); + } + + if (typeof result !== 'undefined') { + return result; + } + + return collection; +}; + + +/***/ }), +/* 125 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +/*! + * object-visit + * + * Copyright (c) 2015, 2017, Jon Schlinkert. + * Released under the MIT License. + */ + + + +var isObject = __webpack_require__(81); + +module.exports = function visit(thisArg, method, target, val) { + if (!isObject(thisArg) && typeof thisArg !== 'function') { + throw new Error('object-visit expects `thisArg` to be an object.'); + } + + if (typeof method !== 'string') { + throw new Error('object-visit expects `method` name to be a string'); + } + + if (typeof thisArg[method] !== 'function') { + return thisArg; + } + + var args = [].slice.call(arguments, 3); + target = target || {}; + + for (var key in target) { + var arr = [key, target[key]].concat(args); + thisArg[method].apply(thisArg, arr); + } + return thisArg; +}; + + +/***/ }), +/* 126 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var util = __webpack_require__(17); +var visit = __webpack_require__(125); + +/** + * Map `visit` over an array of objects. + * + * @param {Object} `collection` The context in which to invoke `method` + * @param {String} `method` Name of the method to call on `collection` + * @param {Object} `arr` Array of objects. + */ + +module.exports = function mapVisit(collection, method, val) { + if (isObject(val)) { + return visit.apply(null, arguments); + } + + if (!Array.isArray(val)) { + throw new TypeError('expected an array: ' + util.inspect(val)); + } + + var args = [].slice.call(arguments, 3); + + for (var i = 0; i < val.length; i++) { + var ele = val[i]; + if (isObject(ele)) { + visit.apply(null, [collection, method, ele].concat(args)); + } else { + collection[method].apply(collection, [ele].concat(args)); + } + } +}; + +function isObject(val) { + return val && (typeof val === 'function' || (!Array.isArray(val) && typeof val === 'object')); +} + + +/***/ }), +/* 127 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +/*! + * to-object-path + * + * Copyright (c) 2015, Jon Schlinkert. + * Licensed under the MIT License. + */ + + + +var typeOf = __webpack_require__(128); + +module.exports = function toPath(args) { + if (typeOf(args) !== 'arguments') { + args = arguments; + } + return filter(args).join('.'); +}; + +function filter(arr) { + var len = arr.length; + var idx = -1; + var res = []; + + while (++idx < len) { + var ele = arr[idx]; + if (typeOf(ele) === 'arguments' || Array.isArray(ele)) { + res.push.apply(res, filter(ele)); + } else if (typeof ele === 'string') { + res.push(ele); + } + } + return res; +} + + +/***/ }), +/* 128 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var isBuffer = __webpack_require__(107); +var toString = Object.prototype.toString; + +/** + * Get the native `typeof` a value. + * + * @param {*} `val` + * @return {*} Native javascript type + */ + +module.exports = function kindOf(val) { + // primitivies + if (typeof val === 'undefined') { + return 'undefined'; + } + if (val === null) { + return 'null'; + } + if (val === true || val === false || val instanceof Boolean) { + return 'boolean'; + } + if (typeof val === 'string' || val instanceof String) { + return 'string'; + } + if (typeof val === 'number' || val instanceof Number) { + return 'number'; + } + + // functions + if (typeof val === 'function' || val instanceof Function) { + return 'function'; + } + + // array + if (typeof Array.isArray !== 'undefined' && Array.isArray(val)) { + return 'array'; + } + + // check for instances of RegExp and Date before calling `toString` + if (val instanceof RegExp) { + return 'regexp'; + } + if (val instanceof Date) { + return 'date'; + } + + // other objects + var type = toString.call(val); + + if (type === '[object RegExp]') { + return 'regexp'; + } + if (type === '[object Date]') { + return 'date'; + } + if (type === '[object Arguments]') { + return 'arguments'; + } + if (type === '[object Error]') { + return 'error'; + } + + // buffer + if (isBuffer(val)) { + return 'buffer'; + } + + // es6: Map, WeakMap, Set, WeakSet + if (type === '[object Set]') { + return 'set'; + } + if (type === '[object WeakSet]') { + return 'weakset'; + } + if (type === '[object Map]') { + return 'map'; + } + if (type === '[object WeakMap]') { + return 'weakmap'; + } + if (type === '[object Symbol]') { + return 'symbol'; + } + + // typed arrays + if (type === '[object Int8Array]') { + return 'int8array'; + } + if (type === '[object Uint8Array]') { + return 'uint8array'; + } + if (type === '[object Uint8ClampedArray]') { + return 'uint8clampedarray'; + } + if (type === '[object Int16Array]') { + return 'int16array'; + } + if (type === '[object Uint16Array]') { + return 'uint16array'; + } + if (type === '[object Int32Array]') { + return 'int32array'; + } + if (type === '[object Uint32Array]') { + return 'uint32array'; + } + if (type === '[object Float32Array]') { + return 'float32array'; + } + if (type === '[object Float64Array]') { + return 'float64array'; + } + + // must be a plain object + return 'object'; +}; + + +/***/ }), +/* 129 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var isObject = __webpack_require__(97); +var union = __webpack_require__(130); +var get = __webpack_require__(131); +var set = __webpack_require__(132); + +module.exports = function unionValue(obj, prop, value) { + if (!isObject(obj)) { + throw new TypeError('union-value expects the first argument to be an object.'); + } + + if (typeof prop !== 'string') { + throw new TypeError('union-value expects `prop` to be a string.'); + } + + var arr = arrayify(get(obj, prop)); + set(obj, prop, union(arr, arrayify(value))); + return obj; +}; + +function arrayify(val) { + if (val === null || typeof val === 'undefined') { + return []; + } + if (Array.isArray(val)) { + return val; + } + return [val]; +} + + +/***/ }), +/* 130 */ +/***/ ((module) => { + +"use strict"; + + +module.exports = function union(init) { + if (!Array.isArray(init)) { + throw new TypeError('arr-union expects the first argument to be an array.'); + } + + var len = arguments.length; + var i = 0; + + while (++i < len) { + var arg = arguments[i]; + if (!arg) continue; + + if (!Array.isArray(arg)) { + arg = [arg]; + } + + for (var j = 0; j < arg.length; j++) { + var ele = arg[j]; + + if (init.indexOf(ele) >= 0) { + continue; + } + init.push(ele); + } + } + return init; +}; + + +/***/ }), +/* 131 */ +/***/ ((module) => { + +/*! + * get-value + * + * Copyright (c) 2014-2015, Jon Schlinkert. + * Licensed under the MIT License. + */ + +module.exports = function(obj, prop, a, b, c) { + if (!isObject(obj) || !prop) { + return obj; + } + + prop = toString(prop); + + // allowing for multiple properties to be passed as + // a string or array, but much faster (3-4x) than doing + // `[].slice.call(arguments)` + if (a) prop += '.' + toString(a); + if (b) prop += '.' + toString(b); + if (c) prop += '.' + toString(c); + + if (prop in obj) { + return obj[prop]; + } + + var segs = prop.split('.'); + var len = segs.length; + var i = -1; + + while (obj && (++i < len)) { + var key = segs[i]; + while (key[key.length - 1] === '\\') { + key = key.slice(0, -1) + '.' + segs[++i]; + } + obj = obj[key]; + } + return obj; +}; + +function isObject(val) { + return val !== null && (typeof val === 'object' || typeof val === 'function'); +} + +function toString(val) { + if (!val) return ''; + if (Array.isArray(val)) { + return val.join('.'); + } + return val; +} + + +/***/ }), +/* 132 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +/*! + * set-value + * + * Copyright (c) 2014-2015, 2017, Jon Schlinkert. + * Released under the MIT License. + */ + + + +var split = __webpack_require__(100); +var extend = __webpack_require__(96); +var isPlainObject = __webpack_require__(90); +var isObject = __webpack_require__(97); + +module.exports = function(obj, prop, val) { + if (!isObject(obj)) { + return obj; + } + + if (Array.isArray(prop)) { + prop = [].concat.apply([], prop).join('.'); + } + + if (typeof prop !== 'string') { + return obj; + } + + var keys = split(prop, {sep: '.', brackets: true}).filter(isValidKey); + var len = keys.length; + var idx = -1; + var current = obj; + + while (++idx < len) { + var key = keys[idx]; + if (idx !== len - 1) { + if (!isObject(current[key])) { + current[key] = {}; + } + current = current[key]; + continue; + } + + if (isPlainObject(current[key]) && isPlainObject(val)) { + current[key] = extend({}, current[key], val); + } else { + current[key] = val; + } + } + + return obj; +}; + +function isValidKey(key) { + return key !== '__proto__' && key !== 'constructor' && key !== 'prototype'; +} + + +/***/ }), +/* 133 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +/*! + * unset-value + * + * Copyright (c) 2015, 2017, Jon Schlinkert. + * Released under the MIT License. + */ + + + +var isObject = __webpack_require__(81); +var has = __webpack_require__(134); + +module.exports = function unset(obj, prop) { + if (!isObject(obj)) { + throw new TypeError('expected an object.'); + } + if (obj.hasOwnProperty(prop)) { + delete obj[prop]; + return true; + } + + if (has(obj, prop)) { + var segs = prop.split('.'); + var last = segs.pop(); + while (segs.length && segs[segs.length - 1].slice(-1) === '\\') { + last = segs.pop().slice(0, -1) + '.' + last; + } + while (segs.length) obj = obj[prop = segs.shift()]; + return (delete obj[last]); + } + return true; +}; + + +/***/ }), +/* 134 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +/*! + * has-value + * + * Copyright (c) 2014-2016, Jon Schlinkert. + * Licensed under the MIT License. + */ + + + +var isObject = __webpack_require__(135); +var hasValues = __webpack_require__(137); +var get = __webpack_require__(131); + +module.exports = function(obj, prop, noZero) { + if (isObject(obj)) { + return hasValues(get(obj, prop), noZero); + } + return hasValues(obj, prop); +}; + + +/***/ }), +/* 135 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +/*! + * isobject + * + * Copyright (c) 2014-2015, Jon Schlinkert. + * Licensed under the MIT License. + */ + + + +var isArray = __webpack_require__(136); + +module.exports = function isObject(val) { + return val != null && typeof val === 'object' && isArray(val) === false; +}; + + +/***/ }), +/* 136 */ +/***/ ((module) => { + +var toString = {}.toString; + +module.exports = Array.isArray || function (arr) { + return toString.call(arr) == '[object Array]'; +}; + + +/***/ }), +/* 137 */ +/***/ ((module) => { + +"use strict"; +/*! + * has-values + * + * Copyright (c) 2014-2015, Jon Schlinkert. + * Licensed under the MIT License. + */ + + + +module.exports = function hasValue(o, noZero) { + if (o === null || o === undefined) { + return false; + } + + if (typeof o === 'boolean') { + return true; + } + + if (typeof o === 'number') { + if (o === 0 && noZero === true) { + return false; + } + return true; + } + + if (o.length !== undefined) { + return o.length !== 0; + } + + for (var key in o) { + if (o.hasOwnProperty(key)) { + return true; + } + } + return false; +}; + + +/***/ }), +/* 138 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +/*! + * has-value + * + * Copyright (c) 2014-2017, Jon Schlinkert. + * Licensed under the MIT License. + */ + + + +var isObject = __webpack_require__(81); +var hasValues = __webpack_require__(139); +var get = __webpack_require__(131); + +module.exports = function(val, prop) { + return hasValues(isObject(val) && prop ? get(val, prop) : val); +}; + + +/***/ }), +/* 139 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +/*! + * has-values + * + * Copyright (c) 2014-2015, 2017, Jon Schlinkert. + * Released under the MIT License. + */ + + + +var typeOf = __webpack_require__(140); +var isNumber = __webpack_require__(141); + +module.exports = function hasValue(val) { + // is-number checks for NaN and other edge cases + if (isNumber(val)) { + return true; + } + + switch (typeOf(val)) { + case 'null': + case 'boolean': + case 'function': + return true; + case 'string': + case 'arguments': + return val.length !== 0; + case 'error': + return val.message !== ''; + case 'array': + var len = val.length; + if (len === 0) { + return false; + } + for (var i = 0; i < len; i++) { + if (hasValue(val[i])) { + return true; + } + } + return false; + case 'file': + case 'map': + case 'set': + return val.size !== 0; + case 'object': + var keys = Object.keys(val); + if (keys.length === 0) { + return false; + } + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (hasValue(val[key])) { + return true; + } + } + return false; + default: { + return false; + } + } +}; + + +/***/ }), +/* 140 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var isBuffer = __webpack_require__(107); +var toString = Object.prototype.toString; + +/** + * Get the native `typeof` a value. + * + * @param {*} `val` + * @return {*} Native javascript type + */ + +module.exports = function kindOf(val) { + // primitivies + if (typeof val === 'undefined') { + return 'undefined'; + } + if (val === null) { + return 'null'; + } + if (val === true || val === false || val instanceof Boolean) { + return 'boolean'; + } + if (typeof val === 'string' || val instanceof String) { + return 'string'; + } + if (typeof val === 'number' || val instanceof Number) { + return 'number'; + } + + // functions + if (typeof val === 'function' || val instanceof Function) { + return 'function'; + } + + // array + if (typeof Array.isArray !== 'undefined' && Array.isArray(val)) { + return 'array'; + } + + // check for instances of RegExp and Date before calling `toString` + if (val instanceof RegExp) { + return 'regexp'; + } + if (val instanceof Date) { + return 'date'; + } + + // other objects + var type = toString.call(val); + + if (type === '[object RegExp]') { + return 'regexp'; + } + if (type === '[object Date]') { + return 'date'; + } + if (type === '[object Arguments]') { + return 'arguments'; + } + if (type === '[object Error]') { + return 'error'; + } + if (type === '[object Promise]') { + return 'promise'; + } + + // buffer + if (isBuffer(val)) { + return 'buffer'; + } + + // es6: Map, WeakMap, Set, WeakSet + if (type === '[object Set]') { + return 'set'; + } + if (type === '[object WeakSet]') { + return 'weakset'; + } + if (type === '[object Map]') { + return 'map'; + } + if (type === '[object WeakMap]') { + return 'weakmap'; + } + if (type === '[object Symbol]') { + return 'symbol'; + } + + // typed arrays + if (type === '[object Int8Array]') { + return 'int8array'; + } + if (type === '[object Uint8Array]') { + return 'uint8array'; + } + if (type === '[object Uint8ClampedArray]') { + return 'uint8clampedarray'; + } + if (type === '[object Int16Array]') { + return 'int16array'; + } + if (type === '[object Uint16Array]') { + return 'uint16array'; + } + if (type === '[object Int32Array]') { + return 'int32array'; + } + if (type === '[object Uint32Array]') { + return 'uint32array'; + } + if (type === '[object Float32Array]') { + return 'float32array'; + } + if (type === '[object Float64Array]') { + return 'float64array'; + } + + // must be a plain object + return 'object'; +}; + + +/***/ }), +/* 141 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +/*! + * is-number + * + * Copyright (c) 2014-2015, Jon Schlinkert. + * Licensed under the MIT License. + */ + + + +var typeOf = __webpack_require__(142); + +module.exports = function isNumber(num) { + var type = typeOf(num); + + if (type === 'string') { + if (!num.trim()) return false; + } else if (type !== 'number') { + return false; + } + + return (num - num + 1) >= 0; +}; + + +/***/ }), +/* 142 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var isBuffer = __webpack_require__(107); +var toString = Object.prototype.toString; + +/** + * Get the native `typeof` a value. + * + * @param {*} `val` + * @return {*} Native javascript type + */ + +module.exports = function kindOf(val) { + // primitivies + if (typeof val === 'undefined') { + return 'undefined'; + } + if (val === null) { + return 'null'; + } + if (val === true || val === false || val instanceof Boolean) { + return 'boolean'; + } + if (typeof val === 'string' || val instanceof String) { + return 'string'; + } + if (typeof val === 'number' || val instanceof Number) { + return 'number'; + } + + // functions + if (typeof val === 'function' || val instanceof Function) { + return 'function'; + } + + // array + if (typeof Array.isArray !== 'undefined' && Array.isArray(val)) { + return 'array'; + } + + // check for instances of RegExp and Date before calling `toString` + if (val instanceof RegExp) { + return 'regexp'; + } + if (val instanceof Date) { + return 'date'; + } + + // other objects + var type = toString.call(val); + + if (type === '[object RegExp]') { + return 'regexp'; + } + if (type === '[object Date]') { + return 'date'; + } + if (type === '[object Arguments]') { + return 'arguments'; + } + if (type === '[object Error]') { + return 'error'; + } + + // buffer + if (isBuffer(val)) { + return 'buffer'; + } + + // es6: Map, WeakMap, Set, WeakSet + if (type === '[object Set]') { + return 'set'; + } + if (type === '[object WeakSet]') { + return 'weakset'; + } + if (type === '[object Map]') { + return 'map'; + } + if (type === '[object WeakMap]') { + return 'weakmap'; + } + if (type === '[object Symbol]') { + return 'symbol'; + } + + // typed arrays + if (type === '[object Int8Array]') { + return 'int8array'; + } + if (type === '[object Uint8Array]') { + return 'uint8array'; + } + if (type === '[object Uint8ClampedArray]') { + return 'uint8clampedarray'; + } + if (type === '[object Int16Array]') { + return 'int16array'; + } + if (type === '[object Uint16Array]') { + return 'uint16array'; + } + if (type === '[object Int32Array]') { + return 'int32array'; + } + if (type === '[object Uint32Array]') { + return 'uint32array'; + } + if (type === '[object Float32Array]') { + return 'float32array'; + } + if (type === '[object Float64Array]') { + return 'float64array'; + } + + // must be a plain object + return 'object'; +}; + + +/***/ }), +/* 143 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var isExtendable = __webpack_require__(144); +var forIn = __webpack_require__(145); + +function mixinDeep(target, objects) { + var len = arguments.length, i = 0; + while (++i < len) { + var obj = arguments[i]; + if (isObject(obj)) { + forIn(obj, copy, target); + } + } + return target; +} + +/** + * Copy properties from the source object to the + * target object. + * + * @param {*} `val` + * @param {String} `key` + */ + +function copy(val, key) { + if (!isValidKey(key)) { + return; + } + + var obj = this[key]; + if (isObject(val) && isObject(obj)) { + mixinDeep(obj, val); + } else { + this[key] = val; + } +} + +/** + * Returns true if `val` is an object or function. + * + * @param {any} val + * @return {Boolean} + */ + +function isObject(val) { + return isExtendable(val) && !Array.isArray(val); +} + +/** + * Returns true if `key` is a valid key to use when extending objects. + * + * @param {String} `key` + * @return {Boolean} + */ + +function isValidKey(key) { + return key !== '__proto__' && key !== 'constructor' && key !== 'prototype'; +}; + +/** + * Expose `mixinDeep` + */ + +module.exports = mixinDeep; + + +/***/ }), +/* 144 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +/*! + * is-extendable + * + * Copyright (c) 2015-2017, Jon Schlinkert. + * Released under the MIT License. + */ + + + +var isPlainObject = __webpack_require__(90); + +module.exports = function isExtendable(val) { + return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); +}; + + +/***/ }), +/* 145 */ +/***/ ((module) => { + +"use strict"; +/*! + * for-in + * + * Copyright (c) 2014-2017, Jon Schlinkert. + * Released under the MIT License. + */ + + + +module.exports = function forIn(obj, fn, thisArg) { + for (var key in obj) { + if (fn.call(thisArg, obj[key], key, obj) === false) { + break; + } + } +}; + + +/***/ }), +/* 146 */ +/***/ ((module) => { + +/*! + * pascalcase + * + * Copyright (c) 2015, Jon Schlinkert. + * Licensed under the MIT License. + */ + +function pascalcase(str) { + if (typeof str !== 'string') { + throw new TypeError('expected a string.'); + } + str = str.replace(/([A-Z])/g, ' $1'); + if (str.length === 1) { return str.toUpperCase(); } + str = str.replace(/^[\W_]+|[\W_]+$/g, '').toLowerCase(); + str = str.charAt(0).toUpperCase() + str.slice(1); + return str.replace(/[\W_]+(\w|$)/g, function (_, ch) { + return ch.toUpperCase(); + }); +} + +module.exports = pascalcase; + + +/***/ }), +/* 147 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var util = __webpack_require__(17); +var union = __webpack_require__(130); +var define = __webpack_require__(148); +var staticExtend = __webpack_require__(150); +var isObj = __webpack_require__(81); + +/** + * Expose class utils + */ + +var cu = module.exports; + +/** + * Expose class utils: `cu` + */ + +cu.isObject = function isObject(val) { + return isObj(val) || typeof val === 'function'; +}; + +/** + * Returns true if an array has any of the given elements, or an + * object has any of the give keys. + * + * ```js + * cu.has(['a', 'b', 'c'], 'c'); + * //=> true + * + * cu.has(['a', 'b', 'c'], ['c', 'z']); + * //=> true + * + * cu.has({a: 'b', c: 'd'}, ['c', 'z']); + * //=> true + * ``` + * @param {Object} `obj` + * @param {String|Array} `val` + * @return {Boolean} + * @api public + */ + +cu.has = function has(obj, val) { + val = cu.arrayify(val); + var len = val.length; + + if (cu.isObject(obj)) { + for (var key in obj) { + if (val.indexOf(key) > -1) { + return true; + } + } + + var keys = cu.nativeKeys(obj); + return cu.has(keys, val); + } + + if (Array.isArray(obj)) { + var arr = obj; + while (len--) { + if (arr.indexOf(val[len]) > -1) { + return true; + } + } + return false; + } + + throw new TypeError('expected an array or object.'); +}; + +/** + * Returns true if an array or object has all of the given values. + * + * ```js + * cu.hasAll(['a', 'b', 'c'], 'c'); + * //=> true + * + * cu.hasAll(['a', 'b', 'c'], ['c', 'z']); + * //=> false + * + * cu.hasAll({a: 'b', c: 'd'}, ['c', 'z']); + * //=> false + * ``` + * @param {Object|Array} `val` + * @param {String|Array} `values` + * @return {Boolean} + * @api public + */ + +cu.hasAll = function hasAll(val, values) { + values = cu.arrayify(values); + var len = values.length; + while (len--) { + if (!cu.has(val, values[len])) { + return false; + } + } + return true; +}; + +/** + * Cast the given value to an array. + * + * ```js + * cu.arrayify('foo'); + * //=> ['foo'] + * + * cu.arrayify(['foo']); + * //=> ['foo'] + * ``` + * + * @param {String|Array} `val` + * @return {Array} + * @api public + */ + +cu.arrayify = function arrayify(val) { + return val ? (Array.isArray(val) ? val : [val]) : []; +}; + +/** + * Noop + */ + +cu.noop = function noop() { + return; +}; + +/** + * Returns the first argument passed to the function. + */ + +cu.identity = function identity(val) { + return val; +}; + +/** + * Returns true if a value has a `contructor` + * + * ```js + * cu.hasConstructor({}); + * //=> true + * + * cu.hasConstructor(Object.create(null)); + * //=> false + * ``` + * @param {Object} `value` + * @return {Boolean} + * @api public + */ + +cu.hasConstructor = function hasConstructor(val) { + return cu.isObject(val) && typeof val.constructor !== 'undefined'; +}; + +/** + * Get the native `ownPropertyNames` from the constructor of the + * given `object`. An empty array is returned if the object does + * not have a constructor. + * + * ```js + * cu.nativeKeys({a: 'b', b: 'c', c: 'd'}) + * //=> ['a', 'b', 'c'] + * + * cu.nativeKeys(function(){}) + * //=> ['length', 'caller'] + * ``` + * + * @param {Object} `obj` Object that has a `constructor`. + * @return {Array} Array of keys. + * @api public + */ + +cu.nativeKeys = function nativeKeys(val) { + if (!cu.hasConstructor(val)) return []; + var keys = Object.getOwnPropertyNames(val); + if ('caller' in val) keys.push('caller'); + return keys; +}; + +/** + * Returns property descriptor `key` if it's an "own" property + * of the given object. + * + * ```js + * function App() {} + * Object.defineProperty(App.prototype, 'count', { + * get: function() { + * return Object.keys(this).length; + * } + * }); + * cu.getDescriptor(App.prototype, 'count'); + * // returns: + * // { + * // get: [Function], + * // set: undefined, + * // enumerable: false, + * // configurable: false + * // } + * ``` + * + * @param {Object} `obj` + * @param {String} `key` + * @return {Object} Returns descriptor `key` + * @api public + */ + +cu.getDescriptor = function getDescriptor(obj, key) { + if (!cu.isObject(obj)) { + throw new TypeError('expected an object.'); + } + if (typeof key !== 'string') { + throw new TypeError('expected key to be a string.'); + } + return Object.getOwnPropertyDescriptor(obj, key); +}; + +/** + * Copy a descriptor from one object to another. + * + * ```js + * function App() {} + * Object.defineProperty(App.prototype, 'count', { + * get: function() { + * return Object.keys(this).length; + * } + * }); + * var obj = {}; + * cu.copyDescriptor(obj, App.prototype, 'count'); + * ``` + * @param {Object} `receiver` + * @param {Object} `provider` + * @param {String} `name` + * @return {Object} + * @api public + */ + +cu.copyDescriptor = function copyDescriptor(receiver, provider, name) { + if (!cu.isObject(receiver)) { + throw new TypeError('expected receiving object to be an object.'); + } + if (!cu.isObject(provider)) { + throw new TypeError('expected providing object to be an object.'); + } + if (typeof name !== 'string') { + throw new TypeError('expected name to be a string.'); + } + + var val = cu.getDescriptor(provider, name); + if (val) Object.defineProperty(receiver, name, val); +}; + +/** + * Copy static properties, prototype properties, and descriptors + * from one object to another. + * + * @param {Object} `receiver` + * @param {Object} `provider` + * @param {String|Array} `omit` One or more properties to omit + * @return {Object} + * @api public + */ + +cu.copy = function copy(receiver, provider, omit) { + if (!cu.isObject(receiver)) { + throw new TypeError('expected receiving object to be an object.'); + } + if (!cu.isObject(provider)) { + throw new TypeError('expected providing object to be an object.'); + } + var props = Object.getOwnPropertyNames(provider); + var keys = Object.keys(provider); + var len = props.length, + key; + omit = cu.arrayify(omit); + + while (len--) { + key = props[len]; + + if (cu.has(keys, key)) { + define(receiver, key, provider[key]); + } else if (!(key in receiver) && !cu.has(omit, key)) { + cu.copyDescriptor(receiver, provider, key); + } + } +}; + +/** + * Inherit the static properties, prototype properties, and descriptors + * from of an object. + * + * @param {Object} `receiver` + * @param {Object} `provider` + * @param {String|Array} `omit` One or more properties to omit + * @return {Object} + * @api public + */ + +cu.inherit = function inherit(receiver, provider, omit) { + if (!cu.isObject(receiver)) { + throw new TypeError('expected receiving object to be an object.'); + } + if (!cu.isObject(provider)) { + throw new TypeError('expected providing object to be an object.'); + } + + var keys = []; + for (var key in provider) { + keys.push(key); + receiver[key] = provider[key]; + } + + keys = keys.concat(cu.arrayify(omit)); + + var a = provider.prototype || provider; + var b = receiver.prototype || receiver; + cu.copy(b, a, keys); +}; + +/** + * Returns a function for extending the static properties, + * prototype properties, and descriptors from the `Parent` + * constructor onto `Child` constructors. + * + * ```js + * var extend = cu.extend(Parent); + * Parent.extend(Child); + * + * // optional methods + * Parent.extend(Child, { + * foo: function() {}, + * bar: function() {} + * }); + * ``` + * @param {Function} `Parent` Parent ctor + * @param {Function} `extend` Optional extend function to handle custom extensions. Useful when updating methods that require a specific prototype. + * @param {Function} `Child` Child ctor + * @param {Object} `proto` Optionally pass additional prototype properties to inherit. + * @return {Object} + * @api public + */ + +cu.extend = function() { + // keep it lazy, instead of assigning to `cu.extend` + return staticExtend.apply(null, arguments); +}; + +/** + * Bubble up events emitted from static methods on the Parent ctor. + * + * @param {Object} `Parent` + * @param {Array} `events` Event names to bubble up + * @api public + */ + +cu.bubble = function(Parent, events) { + events = events || []; + Parent.bubble = function(Child, arr) { + if (Array.isArray(arr)) { + events = union([], events, arr); + } + var len = events.length; + var idx = -1; + while (++idx < len) { + var name = events[idx]; + Parent.on(name, Child.emit.bind(Child, name)); + } + cu.bubble(Child, events); + }; +}; + + +/***/ }), +/* 148 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +/*! + * define-property + * + * Copyright (c) 2015, Jon Schlinkert. + * Licensed under the MIT License. + */ + + + +var isDescriptor = __webpack_require__(149); + +module.exports = function defineProperty(obj, prop, val) { + if (typeof obj !== 'object' && typeof obj !== 'function') { + throw new TypeError('expected an object or function.'); + } + + if (typeof prop !== 'string') { + throw new TypeError('expected `prop` to be a string.'); + } + + if (isDescriptor(val) && ('set' in val || 'get' in val)) { + return Object.defineProperty(obj, prop, val); + } + + return Object.defineProperty(obj, prop, { + configurable: true, + enumerable: false, + writable: true, + value: val + }); +}; + + +/***/ }), +/* 149 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var isAccessor = __webpack_require__(83); +var isData = __webpack_require__(87); + +module.exports = function isDescriptor(obj, key) { + if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) { + return false; + } + + if ('get' in obj || 'set' in obj) { + return isAccessor(obj, key); + } + + return isData(obj, key); +}; + + +/***/ }), +/* 150 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +/*! + * static-extend + * + * Copyright (c) 2016, Jon Schlinkert. + * Licensed under the MIT License. + */ + + + +var copy = __webpack_require__(151); +var define = __webpack_require__(148); +var util = __webpack_require__(17); + +/** + * Returns a function for extending the static properties, + * prototype properties, and descriptors from the `Parent` + * constructor onto `Child` constructors. + * + * ```js + * var extend = require('static-extend'); + * Parent.extend = extend(Parent); + * + * // optionally pass a custom merge function as the second arg + * Parent.extend = extend(Parent, function(Child) { + * Child.prototype.mixin = function(key, val) { + * Child.prototype[key] = val; + * }; + * }); + * + * // extend "child" constructors + * Parent.extend(Child); + * + * // optionally define prototype methods as the second arg + * Parent.extend(Child, { + * foo: function() {}, + * bar: function() {} + * }); + * ``` + * @param {Function} `Parent` Parent ctor + * @param {Function} `extendFn` Optional extend function for handling any necessary custom merging. Useful when updating methods that require a specific prototype. + * @param {Function} `Child` Child ctor + * @param {Object} `proto` Optionally pass additional prototype properties to inherit. + * @return {Object} + * @api public + */ + +function extend(Parent, extendFn) { + if (typeof Parent !== 'function') { + throw new TypeError('expected Parent to be a function.'); + } + + return function(Ctor, proto) { + if (typeof Ctor !== 'function') { + throw new TypeError('expected Ctor to be a function.'); + } + + util.inherits(Ctor, Parent); + copy(Ctor, Parent); + + // proto can be null or a plain object + if (typeof proto === 'object') { + var obj = Object.create(proto); + + for (var k in obj) { + Ctor.prototype[k] = obj[k]; + } + } + + // keep a reference to the parent prototype + define(Ctor.prototype, '_parent_', { + configurable: true, + set: function() {}, + get: function() { + return Parent.prototype; + } + }); + + if (typeof extendFn === 'function') { + extendFn(Ctor, Parent); + } + + Ctor.extend = extend(Ctor, extendFn); + }; +}; + +/** + * Expose `extend` + */ + +module.exports = extend; + + +/***/ }), +/* 151 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var typeOf = __webpack_require__(152); +var copyDescriptor = __webpack_require__(153); +var define = __webpack_require__(148); + +/** + * Copy static properties, prototype properties, and descriptors from one object to another. + * + * ```js + * function App() {} + * var proto = App.prototype; + * App.prototype.set = function() {}; + * App.prototype.get = function() {}; + * + * var obj = {}; + * copy(obj, proto); + * ``` + * @param {Object} `receiver` + * @param {Object} `provider` + * @param {String|Array} `omit` One or more properties to omit + * @return {Object} + * @api public + */ + +function copy(receiver, provider, omit) { + if (!isObject(receiver)) { + throw new TypeError('expected receiving object to be an object.'); + } + if (!isObject(provider)) { + throw new TypeError('expected providing object to be an object.'); + } + + var props = nativeKeys(provider); + var keys = Object.keys(provider); + var len = props.length; + omit = arrayify(omit); + + while (len--) { + var key = props[len]; + + if (has(keys, key)) { + define(receiver, key, provider[key]); + } else if (!(key in receiver) && !has(omit, key)) { + copyDescriptor(receiver, provider, key); + } + } +}; + +/** + * Return true if the given value is an object or function + */ + +function isObject(val) { + return typeOf(val) === 'object' || typeof val === 'function'; +} + +/** + * Returns true if an array has any of the given elements, or an + * object has any of the give keys. + * + * ```js + * has(['a', 'b', 'c'], 'c'); + * //=> true + * + * has(['a', 'b', 'c'], ['c', 'z']); + * //=> true + * + * has({a: 'b', c: 'd'}, ['c', 'z']); + * //=> true + * ``` + * @param {Object} `obj` + * @param {String|Array} `val` + * @return {Boolean} + */ + +function has(obj, val) { + val = arrayify(val); + var len = val.length; + + if (isObject(obj)) { + for (var key in obj) { + if (val.indexOf(key) > -1) { + return true; + } + } + + var keys = nativeKeys(obj); + return has(keys, val); + } + + if (Array.isArray(obj)) { + var arr = obj; + while (len--) { + if (arr.indexOf(val[len]) > -1) { + return true; + } + } + return false; + } + + throw new TypeError('expected an array or object.'); +} + +/** + * Cast the given value to an array. + * + * ```js + * arrayify('foo'); + * //=> ['foo'] + * + * arrayify(['foo']); + * //=> ['foo'] + * ``` + * + * @param {String|Array} `val` + * @return {Array} + */ + +function arrayify(val) { + return val ? (Array.isArray(val) ? val : [val]) : []; +} + +/** + * Returns true if a value has a `contructor` + * + * ```js + * hasConstructor({}); + * //=> true + * + * hasConstructor(Object.create(null)); + * //=> false + * ``` + * @param {Object} `value` + * @return {Boolean} + */ + +function hasConstructor(val) { + return isObject(val) && typeof val.constructor !== 'undefined'; +} + +/** + * Get the native `ownPropertyNames` from the constructor of the + * given `object`. An empty array is returned if the object does + * not have a constructor. + * + * ```js + * nativeKeys({a: 'b', b: 'c', c: 'd'}) + * //=> ['a', 'b', 'c'] + * + * nativeKeys(function(){}) + * //=> ['length', 'caller'] + * ``` + * + * @param {Object} `obj` Object that has a `constructor`. + * @return {Array} Array of keys. + */ + +function nativeKeys(val) { + if (!hasConstructor(val)) return []; + return Object.getOwnPropertyNames(val); +} + +/** + * Expose `copy` + */ + +module.exports = copy; + +/** + * Expose `copy.has` for tests + */ + +module.exports.has = has; + + +/***/ }), +/* 152 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var isBuffer = __webpack_require__(107); +var toString = Object.prototype.toString; + +/** + * Get the native `typeof` a value. + * + * @param {*} `val` + * @return {*} Native javascript type + */ + +module.exports = function kindOf(val) { + // primitivies + if (typeof val === 'undefined') { + return 'undefined'; + } + if (val === null) { + return 'null'; + } + if (val === true || val === false || val instanceof Boolean) { + return 'boolean'; + } + if (typeof val === 'string' || val instanceof String) { + return 'string'; + } + if (typeof val === 'number' || val instanceof Number) { + return 'number'; + } + + // functions + if (typeof val === 'function' || val instanceof Function) { + return 'function'; + } + + // array + if (typeof Array.isArray !== 'undefined' && Array.isArray(val)) { + return 'array'; + } + + // check for instances of RegExp and Date before calling `toString` + if (val instanceof RegExp) { + return 'regexp'; + } + if (val instanceof Date) { + return 'date'; + } + + // other objects + var type = toString.call(val); + + if (type === '[object RegExp]') { + return 'regexp'; + } + if (type === '[object Date]') { + return 'date'; + } + if (type === '[object Arguments]') { + return 'arguments'; + } + if (type === '[object Error]') { + return 'error'; + } + + // buffer + if (isBuffer(val)) { + return 'buffer'; + } + + // es6: Map, WeakMap, Set, WeakSet + if (type === '[object Set]') { + return 'set'; + } + if (type === '[object WeakSet]') { + return 'weakset'; + } + if (type === '[object Map]') { + return 'map'; + } + if (type === '[object WeakMap]') { + return 'weakmap'; + } + if (type === '[object Symbol]') { + return 'symbol'; + } + + // typed arrays + if (type === '[object Int8Array]') { + return 'int8array'; + } + if (type === '[object Uint8Array]') { + return 'uint8array'; + } + if (type === '[object Uint8ClampedArray]') { + return 'uint8clampedarray'; + } + if (type === '[object Int16Array]') { + return 'int16array'; + } + if (type === '[object Uint16Array]') { + return 'uint16array'; + } + if (type === '[object Int32Array]') { + return 'int32array'; + } + if (type === '[object Uint32Array]') { + return 'uint32array'; + } + if (type === '[object Float32Array]') { + return 'float32array'; + } + if (type === '[object Float64Array]') { + return 'float64array'; + } + + // must be a plain object + return 'object'; +}; + + +/***/ }), +/* 153 */ +/***/ ((module) => { + +"use strict"; +/*! + * copy-descriptor + * + * Copyright (c) 2015, Jon Schlinkert. + * Licensed under the MIT License. + */ + + + +/** + * Copy a descriptor from one object to another. + * + * ```js + * function App() { + * this.cache = {}; + * } + * App.prototype.set = function(key, val) { + * this.cache[key] = val; + * return this; + * }; + * Object.defineProperty(App.prototype, 'count', { + * get: function() { + * return Object.keys(this.cache).length; + * } + * }); + * + * copy(App.prototype, 'count', 'len'); + * + * // create an instance + * var app = new App(); + * + * app.set('a', true); + * app.set('b', true); + * app.set('c', true); + * + * console.log(app.count); + * //=> 3 + * console.log(app.len); + * //=> 3 + * ``` + * @name copy + * @param {Object} `receiver` The target object + * @param {Object} `provider` The provider object + * @param {String} `from` The key to copy on provider. + * @param {String} `to` Optionally specify a new key name to use. + * @return {Object} + * @api public + */ + +module.exports = function copyDescriptor(receiver, provider, from, to) { + if (!isObject(provider) && typeof provider !== 'function') { + to = from; + from = provider; + provider = receiver; + } + if (!isObject(receiver) && typeof receiver !== 'function') { + throw new TypeError('expected the first argument to be an object'); + } + if (!isObject(provider) && typeof provider !== 'function') { + throw new TypeError('expected provider to be an object'); + } + + if (typeof to !== 'string') { + to = from; + } + if (typeof from !== 'string') { + throw new TypeError('expected key to be a string'); + } + + if (!(from in provider)) { + throw new Error('property "' + from + '" does not exist'); + } + + var val = Object.getOwnPropertyDescriptor(provider, from); + if (val) Object.defineProperty(receiver, to, val); +}; + +function isObject(val) { + return {}.toString.call(val) === '[object Object]'; +} + + + +/***/ }), +/* 154 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var use = __webpack_require__(155); +var define = __webpack_require__(148); +var debug = __webpack_require__(156)('snapdragon:compiler'); +var utils = __webpack_require__(163); + +/** + * Create a new `Compiler` with the given `options`. + * @param {Object} `options` + */ + +function Compiler(options, state) { + debug('initializing', __filename); + this.options = utils.extend({source: 'string'}, options); + this.state = state || {}; + this.compilers = {}; + this.output = ''; + this.set('eos', function(node) { + return this.emit(node.val, node); + }); + this.set('noop', function(node) { + return this.emit(node.val, node); + }); + this.set('bos', function(node) { + return this.emit(node.val, node); + }); + use(this); +} + +/** + * Prototype methods + */ + +Compiler.prototype = { + + /** + * Throw an error message with details including the cursor position. + * @param {String} `msg` Message to use in the Error. + */ + + error: function(msg, node) { + var pos = node.position || {start: {column: 0}}; + var message = this.options.source + ' column:' + pos.start.column + ': ' + msg; + + var err = new Error(message); + err.reason = msg; + err.column = pos.start.column; + err.source = this.pattern; + + if (this.options.silent) { + this.errors.push(err); + } else { + throw err; + } + }, + + /** + * Define a non-enumberable property on the `Compiler` instance. + * + * ```js + * compiler.define('foo', 'bar'); + * ``` + * @name .define + * @param {String} `key` propery name + * @param {any} `val` property value + * @return {Object} Returns the Compiler instance for chaining. + * @api public + */ + + define: function(key, val) { + define(this, key, val); + return this; + }, + + /** + * Emit `node.val` + */ + + emit: function(str, node) { + this.output += str; + return str; + }, + + /** + * Add a compiler `fn` with the given `name` + */ + + set: function(name, fn) { + this.compilers[name] = fn; + return this; + }, + + /** + * Get compiler `name`. + */ + + get: function(name) { + return this.compilers[name]; + }, + + /** + * Get the previous AST node. + */ + + prev: function(n) { + return this.ast.nodes[this.idx - (n || 1)] || { type: 'bos', val: '' }; + }, + + /** + * Get the next AST node. + */ + + next: function(n) { + return this.ast.nodes[this.idx + (n || 1)] || { type: 'eos', val: '' }; + }, + + /** + * Visit `node`. + */ + + visit: function(node, nodes, i) { + var fn = this.compilers[node.type]; + this.idx = i; + + if (typeof fn !== 'function') { + throw this.error('compiler "' + node.type + '" is not registered', node); + } + return fn.call(this, node, nodes, i); + }, + + /** + * Map visit over array of `nodes`. + */ + + mapVisit: function(nodes) { + if (!Array.isArray(nodes)) { + throw new TypeError('expected an array'); + } + var len = nodes.length; + var idx = -1; + while (++idx < len) { + this.visit(nodes[idx], nodes, idx); + } + return this; + }, + + /** + * Compile `ast`. + */ + + compile: function(ast, options) { + var opts = utils.extend({}, this.options, options); + this.ast = ast; + this.parsingErrors = this.ast.errors; + this.output = ''; + + // source map support + if (opts.sourcemap) { + var sourcemaps = __webpack_require__(183); + sourcemaps(this); + this.mapVisit(this.ast.nodes); + this.applySourceMaps(); + this.map = opts.sourcemap === 'generator' ? this.map : this.map.toJSON(); + return this; + } + + this.mapVisit(this.ast.nodes); + return this; + } +}; + +/** + * Expose `Compiler` + */ + +module.exports = Compiler; + + +/***/ }), +/* 155 */ +/***/ ((module) => { + +"use strict"; +/*! + * use + * + * Copyright (c) 2015-2017, Jon Schlinkert. + * Released under the MIT License. + */ + + + +module.exports = function base(app, options) { + if (!isObject(app) && typeof app !== 'function') { + throw new TypeError('expected an object or function'); + } + + var opts = isObject(options) ? options : {}; + var prop = typeof opts.prop === 'string' ? opts.prop : 'fns'; + if (!Array.isArray(app[prop])) { + define(app, prop, []); + } + + /** + * Define a plugin function to be passed to use. The only + * parameter exposed to the plugin is `app`, the object or function. + * passed to `use(app)`. `app` is also exposed as `this` in plugins. + * + * Additionally, **if a plugin returns a function, the function will + * be pushed onto the `fns` array**, allowing the plugin to be + * called at a later point by the `run` method. + * + * ```js + * var use = require('use'); + * + * // define a plugin + * function foo(app) { + * // do stuff + * } + * + * var app = function(){}; + * use(app); + * + * // register plugins + * app.use(foo); + * app.use(bar); + * app.use(baz); + * ``` + * @name .use + * @param {Function} `fn` plugin function to call + * @api public + */ + + define(app, 'use', use); + + /** + * Run all plugins on `fns`. Any plugin that returns a function + * when called by `use` is pushed onto the `fns` array. + * + * ```js + * var config = {}; + * app.run(config); + * ``` + * @name .run + * @param {Object} `value` Object to be modified by plugins. + * @return {Object} Returns the object passed to `run` + * @api public + */ + + define(app, 'run', function(val) { + if (!isObject(val)) return; + + if (!val.use || !val.run) { + define(val, prop, val[prop] || []); + define(val, 'use', use); + } + + if (!val[prop] || val[prop].indexOf(base) === -1) { + val.use(base); + } + + var self = this || app; + var fns = self[prop]; + var len = fns.length; + var idx = -1; + + while (++idx < len) { + val.use(fns[idx]); + } + return val; + }); + + /** + * Call plugin `fn`. If a function is returned push it into the + * `fns` array to be called by the `run` method. + */ + + function use(type, fn, options) { + var offset = 1; + + if (typeof type === 'string' || Array.isArray(type)) { + fn = wrap(type, fn); + offset++; + } else { + options = fn; + fn = type; + } + + if (typeof fn !== 'function') { + throw new TypeError('expected a function'); + } + + var self = this || app; + var fns = self[prop]; + + var args = [].slice.call(arguments, offset); + args.unshift(self); + + if (typeof opts.hook === 'function') { + opts.hook.apply(self, args); + } + + var val = fn.apply(self, args); + if (typeof val === 'function' && fns.indexOf(val) === -1) { + fns.push(val); + } + return self; + } + + /** + * Wrap a named plugin function so that it's only called on objects of the + * given `type` + * + * @param {String} `type` + * @param {Function} `fn` Plugin function + * @return {Function} + */ + + function wrap(type, fn) { + return function plugin() { + return this.type === type ? fn.apply(this, arguments) : plugin; + }; + } + + return app; +}; + +function isObject(val) { + return val && typeof val === 'object' && !Array.isArray(val); +} + +function define(obj, key, val) { + Object.defineProperty(obj, key, { + configurable: true, + writable: true, + value: val + }); +} + + +/***/ }), +/* 156 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +/** + * Detect Electron renderer process, which is node, but we should + * treat as a browser. + */ + +if (typeof process !== 'undefined' && process.type === 'renderer') { + module.exports = __webpack_require__(157); +} else { + module.exports = __webpack_require__(160); +} + + +/***/ }), +/* 157 */ +/***/ ((module, exports, __webpack_require__) => { + +/** + * This is the web browser implementation of `debug()`. + * + * Expose `debug()` as the module. + */ + +exports = module.exports = __webpack_require__(158); +exports.log = log; +exports.formatArgs = formatArgs; +exports.save = save; +exports.load = load; +exports.useColors = useColors; +exports.storage = 'undefined' != typeof chrome + && 'undefined' != typeof chrome.storage + ? chrome.storage.local + : localstorage(); + +/** + * Colors. + */ + +exports.colors = [ + 'lightseagreen', + 'forestgreen', + 'goldenrod', + 'dodgerblue', + 'darkorchid', + 'crimson' +]; + +/** + * Currently only WebKit-based Web Inspectors, Firefox >= v31, + * and the Firebug extension (any Firefox version) are known + * to support "%c" CSS customizations. + * + * TODO: add a `localStorage` variable to explicitly enable/disable colors + */ + +function useColors() { + // NB: In an Electron preload script, document will be defined but not fully + // initialized. Since we know we're in Chrome, we'll just detect this case + // explicitly + if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') { + return true; + } + + // is webkit? http://stackoverflow.com/a/16459606/376773 + // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 + return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || + // is firebug? http://stackoverflow.com/a/398120/376773 + (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) || + // is firefox >= v31? + // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages + (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) || + // double check webkit in userAgent just in case we are in a worker + (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)); +} + +/** + * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. + */ + +exports.formatters.j = function(v) { + try { + return JSON.stringify(v); + } catch (err) { + return '[UnexpectedJSONParseError]: ' + err.message; + } +}; + + +/** + * Colorize log arguments if enabled. + * + * @api public + */ + +function formatArgs(args) { + var useColors = this.useColors; + + args[0] = (useColors ? '%c' : '') + + this.namespace + + (useColors ? ' %c' : ' ') + + args[0] + + (useColors ? '%c ' : ' ') + + '+' + exports.humanize(this.diff); + + if (!useColors) return; + + var c = 'color: ' + this.color; + args.splice(1, 0, c, 'color: inherit') + + // the final "%c" is somewhat tricky, because there could be other + // arguments passed either before or after the %c, so we need to + // figure out the correct index to insert the CSS into + var index = 0; + var lastC = 0; + args[0].replace(/%[a-zA-Z%]/g, function(match) { + if ('%%' === match) return; + index++; + if ('%c' === match) { + // we only are interested in the *last* %c + // (the user may have provided their own) + lastC = index; + } + }); + + args.splice(lastC, 0, c); +} + +/** + * Invokes `console.log()` when available. + * No-op when `console.log` is not a "function". + * + * @api public + */ + +function log() { + // this hackery is required for IE8/9, where + // the `console.log` function doesn't have 'apply' + return 'object' === typeof console + && console.log + && Function.prototype.apply.call(console.log, console, arguments); +} + +/** + * Save `namespaces`. + * + * @param {String} namespaces + * @api private + */ + +function save(namespaces) { + try { + if (null == namespaces) { + exports.storage.removeItem('debug'); + } else { + exports.storage.debug = namespaces; + } + } catch(e) {} +} + +/** + * Load `namespaces`. + * + * @return {String} returns the previously persisted debug modes + * @api private + */ + +function load() { + var r; + try { + r = exports.storage.debug; + } catch(e) {} + + // If debug isn't set in LS, and we're in Electron, try to load $DEBUG + if (!r && typeof process !== 'undefined' && 'env' in process) { + r = process.env.DEBUG; + } + + return r; +} + +/** + * Enable namespaces listed in `localStorage.debug` initially. + */ + +exports.enable(load()); + +/** + * Localstorage attempts to return the localstorage. + * + * This is necessary because safari throws + * when a user disables cookies/localstorage + * and you attempt to access it. + * + * @return {LocalStorage} + * @api private + */ + +function localstorage() { + try { + return window.localStorage; + } catch (e) {} +} + + +/***/ }), +/* 158 */ +/***/ ((module, exports, __webpack_require__) => { + + +/** + * This is the common logic for both the Node.js and web browser + * implementations of `debug()`. + * + * Expose `debug()` as the module. + */ + +exports = module.exports = createDebug.debug = createDebug['default'] = createDebug; +exports.coerce = coerce; +exports.disable = disable; +exports.enable = enable; +exports.enabled = enabled; +exports.humanize = __webpack_require__(159); + +/** + * The currently active debug mode names, and names to skip. + */ + +exports.names = []; +exports.skips = []; + +/** + * Map of special "%n" handling functions, for the debug "format" argument. + * + * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". + */ + +exports.formatters = {}; + +/** + * Previous log timestamp. + */ + +var prevTime; + +/** + * Select a color. + * @param {String} namespace + * @return {Number} + * @api private + */ + +function selectColor(namespace) { + var hash = 0, i; + + for (i in namespace) { + hash = ((hash << 5) - hash) + namespace.charCodeAt(i); + hash |= 0; // Convert to 32bit integer + } + + return exports.colors[Math.abs(hash) % exports.colors.length]; +} + +/** + * Create a debugger with the given `namespace`. + * + * @param {String} namespace + * @return {Function} + * @api public + */ + +function createDebug(namespace) { + + function debug() { + // disabled? + if (!debug.enabled) return; + + var self = debug; + + // set `diff` timestamp + var curr = +new Date(); + var ms = curr - (prevTime || curr); + self.diff = ms; + self.prev = prevTime; + self.curr = curr; + prevTime = curr; + + // turn the `arguments` into a proper Array + var args = new Array(arguments.length); + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i]; + } + + args[0] = exports.coerce(args[0]); + + if ('string' !== typeof args[0]) { + // anything else let's inspect with %O + args.unshift('%O'); + } + + // apply any `formatters` transformations + var index = 0; + args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) { + // if we encounter an escaped % then don't increase the array index + if (match === '%%') return match; + index++; + var formatter = exports.formatters[format]; + if ('function' === typeof formatter) { + var val = args[index]; + match = formatter.call(self, val); + + // now we need to remove `args[index]` since it's inlined in the `format` + args.splice(index, 1); + index--; + } + return match; + }); + + // apply env-specific formatting (colors, etc.) + exports.formatArgs.call(self, args); + + var logFn = debug.log || exports.log || console.log.bind(console); + logFn.apply(self, args); + } + + debug.namespace = namespace; + debug.enabled = exports.enabled(namespace); + debug.useColors = exports.useColors(); + debug.color = selectColor(namespace); + + // env-specific initialization logic for debug instances + if ('function' === typeof exports.init) { + exports.init(debug); + } + + return debug; +} + +/** + * Enables a debug mode by namespaces. This can include modes + * separated by a colon and wildcards. + * + * @param {String} namespaces + * @api public + */ + +function enable(namespaces) { + exports.save(namespaces); + + exports.names = []; + exports.skips = []; + + var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); + var len = split.length; + + for (var i = 0; i < len; i++) { + if (!split[i]) continue; // ignore empty strings + namespaces = split[i].replace(/\*/g, '.*?'); + if (namespaces[0] === '-') { + exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); + } else { + exports.names.push(new RegExp('^' + namespaces + '$')); + } + } +} + +/** + * Disable debug output. + * + * @api public + */ + +function disable() { + exports.enable(''); +} + +/** + * Returns true if the given mode name is enabled, false otherwise. + * + * @param {String} name + * @return {Boolean} + * @api public + */ + +function enabled(name) { + var i, len; + for (i = 0, len = exports.skips.length; i < len; i++) { + if (exports.skips[i].test(name)) { + return false; + } + } + for (i = 0, len = exports.names.length; i < len; i++) { + if (exports.names[i].test(name)) { + return true; + } + } + return false; +} + +/** + * Coerce `val`. + * + * @param {Mixed} val + * @return {Mixed} + * @api private + */ + +function coerce(val) { + if (val instanceof Error) return val.stack || val.message; + return val; +} + + +/***/ }), +/* 159 */ +/***/ ((module) => { + +/** + * Helpers. + */ + +var s = 1000; +var m = s * 60; +var h = m * 60; +var d = h * 24; +var y = d * 365.25; + +/** + * Parse or format the given `val`. + * + * Options: + * + * - `long` verbose formatting [false] + * + * @param {String|Number} val + * @param {Object} [options] + * @throws {Error} throw an error if val is not a non-empty string or a number + * @return {String|Number} + * @api public + */ + +module.exports = function(val, options) { + options = options || {}; + var type = typeof val; + if (type === 'string' && val.length > 0) { + return parse(val); + } else if (type === 'number' && isNaN(val) === false) { + return options.long ? fmtLong(val) : fmtShort(val); + } + throw new Error( + 'val is not a non-empty string or a valid number. val=' + + JSON.stringify(val) + ); +}; + +/** + * Parse the given `str` and return milliseconds. + * + * @param {String} str + * @return {Number} + * @api private + */ + +function parse(str) { + str = String(str); + if (str.length > 100) { + return; + } + var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec( + str + ); + if (!match) { + return; + } + var n = parseFloat(match[1]); + var type = (match[2] || 'ms').toLowerCase(); + switch (type) { + case 'years': + case 'year': + case 'yrs': + case 'yr': + case 'y': + return n * y; + case 'days': + case 'day': + case 'd': + return n * d; + case 'hours': + case 'hour': + case 'hrs': + case 'hr': + case 'h': + return n * h; + case 'minutes': + case 'minute': + case 'mins': + case 'min': + case 'm': + return n * m; + case 'seconds': + case 'second': + case 'secs': + case 'sec': + case 's': + return n * s; + case 'milliseconds': + case 'millisecond': + case 'msecs': + case 'msec': + case 'ms': + return n; + default: + return undefined; + } +} + +/** + * Short format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtShort(ms) { + if (ms >= d) { + return Math.round(ms / d) + 'd'; + } + if (ms >= h) { + return Math.round(ms / h) + 'h'; + } + if (ms >= m) { + return Math.round(ms / m) + 'm'; + } + if (ms >= s) { + return Math.round(ms / s) + 's'; + } + return ms + 'ms'; +} + +/** + * Long format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtLong(ms) { + return plural(ms, d, 'day') || + plural(ms, h, 'hour') || + plural(ms, m, 'minute') || + plural(ms, s, 'second') || + ms + ' ms'; +} + +/** + * Pluralization helper. + */ + +function plural(ms, n, name) { + if (ms < n) { + return; + } + if (ms < n * 1.5) { + return Math.floor(ms / n) + ' ' + name; + } + return Math.ceil(ms / n) + ' ' + name + 's'; +} + + +/***/ }), +/* 160 */ +/***/ ((module, exports, __webpack_require__) => { + +/** + * Module dependencies. + */ + +var tty = __webpack_require__(161); +var util = __webpack_require__(17); + +/** + * This is the Node.js implementation of `debug()`. + * + * Expose `debug()` as the module. + */ + +exports = module.exports = __webpack_require__(158); +exports.init = init; +exports.log = log; +exports.formatArgs = formatArgs; +exports.save = save; +exports.load = load; +exports.useColors = useColors; + +/** + * Colors. + */ + +exports.colors = [6, 2, 3, 4, 5, 1]; + +/** + * Build up the default `inspectOpts` object from the environment variables. + * + * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js + */ + +exports.inspectOpts = Object.keys(process.env).filter(function (key) { + return /^debug_/i.test(key); +}).reduce(function (obj, key) { + // camel-case + var prop = key + .substring(6) + .toLowerCase() + .replace(/_([a-z])/g, function (_, k) { return k.toUpperCase() }); + + // coerce string value into JS value + var val = process.env[key]; + if (/^(yes|on|true|enabled)$/i.test(val)) val = true; + else if (/^(no|off|false|disabled)$/i.test(val)) val = false; + else if (val === 'null') val = null; + else val = Number(val); + + obj[prop] = val; + return obj; +}, {}); + +/** + * The file descriptor to write the `debug()` calls to. + * Set the `DEBUG_FD` env variable to override with another value. i.e.: + * + * $ DEBUG_FD=3 node script.js 3>debug.log + */ + +var fd = parseInt(process.env.DEBUG_FD, 10) || 2; + +if (1 !== fd && 2 !== fd) { + util.deprecate(function(){}, 'except for stderr(2) and stdout(1), any other usage of DEBUG_FD is deprecated. Override debug.log if you want to use a different log function (https://git.io/debug_fd)')() +} + +var stream = 1 === fd ? process.stdout : + 2 === fd ? process.stderr : + createWritableStdioStream(fd); + +/** + * Is stdout a TTY? Colored output is enabled when `true`. + */ + +function useColors() { + return 'colors' in exports.inspectOpts + ? Boolean(exports.inspectOpts.colors) + : tty.isatty(fd); +} + +/** + * Map %o to `util.inspect()`, all on a single line. + */ + +exports.formatters.o = function(v) { + this.inspectOpts.colors = this.useColors; + return util.inspect(v, this.inspectOpts) + .split('\n').map(function(str) { + return str.trim() + }).join(' '); +}; + +/** + * Map %o to `util.inspect()`, allowing multiple lines if needed. + */ + +exports.formatters.O = function(v) { + this.inspectOpts.colors = this.useColors; + return util.inspect(v, this.inspectOpts); +}; + +/** + * Adds ANSI color escape codes if enabled. + * + * @api public + */ + +function formatArgs(args) { + var name = this.namespace; + var useColors = this.useColors; + + if (useColors) { + var c = this.color; + var prefix = ' \u001b[3' + c + ';1m' + name + ' ' + '\u001b[0m'; + + args[0] = prefix + args[0].split('\n').join('\n' + prefix); + args.push('\u001b[3' + c + 'm+' + exports.humanize(this.diff) + '\u001b[0m'); + } else { + args[0] = new Date().toUTCString() + + ' ' + name + ' ' + args[0]; + } +} + +/** + * Invokes `util.format()` with the specified arguments and writes to `stream`. + */ + +function log() { + return stream.write(util.format.apply(util, arguments) + '\n'); +} + +/** + * Save `namespaces`. + * + * @param {String} namespaces + * @api private + */ + +function save(namespaces) { + if (null == namespaces) { + // If you set a process.env field to null or undefined, it gets cast to the + // string 'null' or 'undefined'. Just delete instead. + delete process.env.DEBUG; + } else { + process.env.DEBUG = namespaces; + } +} + +/** + * Load `namespaces`. + * + * @return {String} returns the previously persisted debug modes + * @api private + */ + +function load() { + return process.env.DEBUG; +} + +/** + * Copied from `node/src/node.js`. + * + * XXX: It's lame that node doesn't expose this API out-of-the-box. It also + * relies on the undocumented `tty_wrap.guessHandleType()` which is also lame. + */ + +function createWritableStdioStream (fd) { + var stream; + var tty_wrap = process.binding('tty_wrap'); + + // Note stream._type is used for test-module-load-list.js + + switch (tty_wrap.guessHandleType(fd)) { + case 'TTY': + stream = new tty.WriteStream(fd); + stream._type = 'tty'; + + // Hack to have stream not keep the event loop alive. + // See https://github.com/joyent/node/issues/1726 + if (stream._handle && stream._handle.unref) { + stream._handle.unref(); + } + break; + + case 'FILE': + var fs = __webpack_require__(11); + stream = new fs.SyncWriteStream(fd, { autoClose: false }); + stream._type = 'fs'; + break; + + case 'PIPE': + case 'TCP': + var net = __webpack_require__(162); + stream = new net.Socket({ + fd: fd, + readable: false, + writable: true + }); + + // FIXME Should probably have an option in net.Socket to create a + // stream from an existing fd which is writable only. But for now + // we'll just add this hack and set the `readable` member to false. + // Test: ./node test/fixtures/echo.js < /etc/passwd + stream.readable = false; + stream.read = null; + stream._type = 'pipe'; + + // FIXME Hack to have stream not keep the event loop alive. + // See https://github.com/joyent/node/issues/1726 + if (stream._handle && stream._handle.unref) { + stream._handle.unref(); + } + break; + + default: + // Probably an error on in uv_guess_handle() + throw new Error('Implement me. Unknown stream file type!'); + } + + // For supporting legacy API we put the FD here. + stream.fd = fd; + + stream._isStdio = true; + + return stream; +} + +/** + * Init logic for `debug` instances. + * + * Create a new `inspectOpts` object in case `useColors` is set + * differently for a particular `debug` instance. + */ + +function init (debug) { + debug.inspectOpts = {}; + + var keys = Object.keys(exports.inspectOpts); + for (var i = 0; i < keys.length; i++) { + debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]]; + } +} + +/** + * Enable namespaces listed in `process.env.DEBUG` initially. + */ + +exports.enable(load()); + + +/***/ }), +/* 161 */ +/***/ ((module) => { + +"use strict"; +module.exports = require("tty"); + +/***/ }), +/* 162 */ +/***/ ((module) => { + +"use strict"; +module.exports = require("net"); + +/***/ }), +/* 163 */ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + + +/** + * Module dependencies + */ + +exports.extend = __webpack_require__(96); +exports.SourceMap = __webpack_require__(164); +exports.sourceMapResolve = __webpack_require__(175); + +/** + * Convert backslash in the given string to forward slashes + */ + +exports.unixify = function(fp) { + return fp.split(/\\+/).join('/'); +}; + +/** + * Return true if `val` is a non-empty string + * + * @param {String} `str` + * @return {Boolean} + */ + +exports.isString = function(str) { + return str && typeof str === 'string'; +}; + +/** + * Cast `val` to an array + * @return {Array} + */ + +exports.arrayify = function(val) { + if (typeof val === 'string') return [val]; + return val ? (Array.isArray(val) ? val : [val]) : []; +}; + +/** + * Get the last `n` element from the given `array` + * @param {Array} `array` + * @return {*} + */ + +exports.last = function(arr, n) { + return arr[arr.length - (n || 1)]; +}; + + +/***/ }), +/* 164 */ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +/* + * Copyright 2009-2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE.txt or: + * http://opensource.org/licenses/BSD-3-Clause + */ +exports.SourceMapGenerator = __webpack_require__(165).SourceMapGenerator; +exports.SourceMapConsumer = __webpack_require__(171).SourceMapConsumer; +exports.SourceNode = __webpack_require__(174).SourceNode; + + +/***/ }), +/* 165 */ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +var base64VLQ = __webpack_require__(166); +var util = __webpack_require__(168); +var ArraySet = (__webpack_require__(169).ArraySet); +var MappingList = (__webpack_require__(170).MappingList); + +/** + * An instance of the SourceMapGenerator represents a source map which is + * being built incrementally. You may pass an object with the following + * properties: + * + * - file: The filename of the generated source. + * - sourceRoot: A root for all relative URLs in this source map. + */ +function SourceMapGenerator(aArgs) { + if (!aArgs) { + aArgs = {}; + } + this._file = util.getArg(aArgs, 'file', null); + this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null); + this._skipValidation = util.getArg(aArgs, 'skipValidation', false); + this._sources = new ArraySet(); + this._names = new ArraySet(); + this._mappings = new MappingList(); + this._sourcesContents = null; +} + +SourceMapGenerator.prototype._version = 3; + +/** + * Creates a new SourceMapGenerator based on a SourceMapConsumer + * + * @param aSourceMapConsumer The SourceMap. + */ +SourceMapGenerator.fromSourceMap = + function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) { + var sourceRoot = aSourceMapConsumer.sourceRoot; + var generator = new SourceMapGenerator({ + file: aSourceMapConsumer.file, + sourceRoot: sourceRoot + }); + aSourceMapConsumer.eachMapping(function (mapping) { + var newMapping = { + generated: { + line: mapping.generatedLine, + column: mapping.generatedColumn + } + }; + + if (mapping.source != null) { + newMapping.source = mapping.source; + if (sourceRoot != null) { + newMapping.source = util.relative(sourceRoot, newMapping.source); + } + + newMapping.original = { + line: mapping.originalLine, + column: mapping.originalColumn + }; + + if (mapping.name != null) { + newMapping.name = mapping.name; + } + } + + generator.addMapping(newMapping); + }); + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + generator.setSourceContent(sourceFile, content); + } + }); + return generator; + }; + +/** + * Add a single mapping from original source line and column to the generated + * source's line and column for this source map being created. The mapping + * object should have the following properties: + * + * - generated: An object with the generated line and column positions. + * - original: An object with the original line and column positions. + * - source: The original source file (relative to the sourceRoot). + * - name: An optional original token name for this mapping. + */ +SourceMapGenerator.prototype.addMapping = + function SourceMapGenerator_addMapping(aArgs) { + var generated = util.getArg(aArgs, 'generated'); + var original = util.getArg(aArgs, 'original', null); + var source = util.getArg(aArgs, 'source', null); + var name = util.getArg(aArgs, 'name', null); + + if (!this._skipValidation) { + this._validateMapping(generated, original, source, name); + } + + if (source != null) { + source = String(source); + if (!this._sources.has(source)) { + this._sources.add(source); + } + } + + if (name != null) { + name = String(name); + if (!this._names.has(name)) { + this._names.add(name); + } + } + + this._mappings.add({ + generatedLine: generated.line, + generatedColumn: generated.column, + originalLine: original != null && original.line, + originalColumn: original != null && original.column, + source: source, + name: name + }); + }; + +/** + * Set the source content for a source file. + */ +SourceMapGenerator.prototype.setSourceContent = + function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) { + var source = aSourceFile; + if (this._sourceRoot != null) { + source = util.relative(this._sourceRoot, source); + } + + if (aSourceContent != null) { + // Add the source content to the _sourcesContents map. + // Create a new _sourcesContents map if the property is null. + if (!this._sourcesContents) { + this._sourcesContents = Object.create(null); + } + this._sourcesContents[util.toSetString(source)] = aSourceContent; + } else if (this._sourcesContents) { + // Remove the source file from the _sourcesContents map. + // If the _sourcesContents map is empty, set the property to null. + delete this._sourcesContents[util.toSetString(source)]; + if (Object.keys(this._sourcesContents).length === 0) { + this._sourcesContents = null; + } + } + }; + +/** + * Applies the mappings of a sub-source-map for a specific source file to the + * source map being generated. Each mapping to the supplied source file is + * rewritten using the supplied source map. Note: The resolution for the + * resulting mappings is the minimium of this map and the supplied map. + * + * @param aSourceMapConsumer The source map to be applied. + * @param aSourceFile Optional. The filename of the source file. + * If omitted, SourceMapConsumer's file property will be used. + * @param aSourceMapPath Optional. The dirname of the path to the source map + * to be applied. If relative, it is relative to the SourceMapConsumer. + * This parameter is needed when the two source maps aren't in the same + * directory, and the source map to be applied contains relative source + * paths. If so, those relative source paths need to be rewritten + * relative to the SourceMapGenerator. + */ +SourceMapGenerator.prototype.applySourceMap = + function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) { + var sourceFile = aSourceFile; + // If aSourceFile is omitted, we will use the file property of the SourceMap + if (aSourceFile == null) { + if (aSourceMapConsumer.file == null) { + throw new Error( + 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' + + 'or the source map\'s "file" property. Both were omitted.' + ); + } + sourceFile = aSourceMapConsumer.file; + } + var sourceRoot = this._sourceRoot; + // Make "sourceFile" relative if an absolute Url is passed. + if (sourceRoot != null) { + sourceFile = util.relative(sourceRoot, sourceFile); + } + // Applying the SourceMap can add and remove items from the sources and + // the names array. + var newSources = new ArraySet(); + var newNames = new ArraySet(); + + // Find mappings for the "sourceFile" + this._mappings.unsortedForEach(function (mapping) { + if (mapping.source === sourceFile && mapping.originalLine != null) { + // Check if it can be mapped by the source map, then update the mapping. + var original = aSourceMapConsumer.originalPositionFor({ + line: mapping.originalLine, + column: mapping.originalColumn + }); + if (original.source != null) { + // Copy mapping + mapping.source = original.source; + if (aSourceMapPath != null) { + mapping.source = util.join(aSourceMapPath, mapping.source) + } + if (sourceRoot != null) { + mapping.source = util.relative(sourceRoot, mapping.source); + } + mapping.originalLine = original.line; + mapping.originalColumn = original.column; + if (original.name != null) { + mapping.name = original.name; + } + } + } + + var source = mapping.source; + if (source != null && !newSources.has(source)) { + newSources.add(source); + } + + var name = mapping.name; + if (name != null && !newNames.has(name)) { + newNames.add(name); + } + + }, this); + this._sources = newSources; + this._names = newNames; + + // Copy sourcesContents of applied map. + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + if (aSourceMapPath != null) { + sourceFile = util.join(aSourceMapPath, sourceFile); + } + if (sourceRoot != null) { + sourceFile = util.relative(sourceRoot, sourceFile); + } + this.setSourceContent(sourceFile, content); + } + }, this); + }; + +/** + * A mapping can have one of the three levels of data: + * + * 1. Just the generated position. + * 2. The Generated position, original position, and original source. + * 3. Generated and original position, original source, as well as a name + * token. + * + * To maintain consistency, we validate that any new mapping being added falls + * in to one of these categories. + */ +SourceMapGenerator.prototype._validateMapping = + function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource, + aName) { + // When aOriginal is truthy but has empty values for .line and .column, + // it is most likely a programmer error. In this case we throw a very + // specific error message to try to guide them the right way. + // For example: https://github.com/Polymer/polymer-bundler/pull/519 + if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') { + throw new Error( + 'original.line and original.column are not numbers -- you probably meant to omit ' + + 'the original mapping entirely and only map the generated position. If so, pass ' + + 'null for the original mapping instead of an object with empty or null values.' + ); + } + + if (aGenerated && 'line' in aGenerated && 'column' in aGenerated + && aGenerated.line > 0 && aGenerated.column >= 0 + && !aOriginal && !aSource && !aName) { + // Case 1. + return; + } + else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated + && aOriginal && 'line' in aOriginal && 'column' in aOriginal + && aGenerated.line > 0 && aGenerated.column >= 0 + && aOriginal.line > 0 && aOriginal.column >= 0 + && aSource) { + // Cases 2 and 3. + return; + } + else { + throw new Error('Invalid mapping: ' + JSON.stringify({ + generated: aGenerated, + source: aSource, + original: aOriginal, + name: aName + })); + } + }; + +/** + * Serialize the accumulated mappings in to the stream of base 64 VLQs + * specified by the source map format. + */ +SourceMapGenerator.prototype._serializeMappings = + function SourceMapGenerator_serializeMappings() { + var previousGeneratedColumn = 0; + var previousGeneratedLine = 1; + var previousOriginalColumn = 0; + var previousOriginalLine = 0; + var previousName = 0; + var previousSource = 0; + var result = ''; + var next; + var mapping; + var nameIdx; + var sourceIdx; + + var mappings = this._mappings.toArray(); + for (var i = 0, len = mappings.length; i < len; i++) { + mapping = mappings[i]; + next = '' + + if (mapping.generatedLine !== previousGeneratedLine) { + previousGeneratedColumn = 0; + while (mapping.generatedLine !== previousGeneratedLine) { + next += ';'; + previousGeneratedLine++; + } + } + else { + if (i > 0) { + if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) { + continue; + } + next += ','; + } + } + + next += base64VLQ.encode(mapping.generatedColumn + - previousGeneratedColumn); + previousGeneratedColumn = mapping.generatedColumn; + + if (mapping.source != null) { + sourceIdx = this._sources.indexOf(mapping.source); + next += base64VLQ.encode(sourceIdx - previousSource); + previousSource = sourceIdx; + + // lines are stored 0-based in SourceMap spec version 3 + next += base64VLQ.encode(mapping.originalLine - 1 + - previousOriginalLine); + previousOriginalLine = mapping.originalLine - 1; + + next += base64VLQ.encode(mapping.originalColumn + - previousOriginalColumn); + previousOriginalColumn = mapping.originalColumn; + + if (mapping.name != null) { + nameIdx = this._names.indexOf(mapping.name); + next += base64VLQ.encode(nameIdx - previousName); + previousName = nameIdx; + } + } + + result += next; + } + + return result; + }; + +SourceMapGenerator.prototype._generateSourcesContent = + function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) { + return aSources.map(function (source) { + if (!this._sourcesContents) { + return null; + } + if (aSourceRoot != null) { + source = util.relative(aSourceRoot, source); + } + var key = util.toSetString(source); + return Object.prototype.hasOwnProperty.call(this._sourcesContents, key) + ? this._sourcesContents[key] + : null; + }, this); + }; + +/** + * Externalize the source map. + */ +SourceMapGenerator.prototype.toJSON = + function SourceMapGenerator_toJSON() { + var map = { + version: this._version, + sources: this._sources.toArray(), + names: this._names.toArray(), + mappings: this._serializeMappings() + }; + if (this._file != null) { + map.file = this._file; + } + if (this._sourceRoot != null) { + map.sourceRoot = this._sourceRoot; + } + if (this._sourcesContents) { + map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot); + } + + return map; + }; + +/** + * Render the source map being generated to a string. + */ +SourceMapGenerator.prototype.toString = + function SourceMapGenerator_toString() { + return JSON.stringify(this.toJSON()); + }; + +exports.SourceMapGenerator = SourceMapGenerator; + + +/***/ }), +/* 166 */ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + * + * Based on the Base 64 VLQ implementation in Closure Compiler: + * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java + * + * Copyright 2011 The Closure Compiler Authors. All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +var base64 = __webpack_require__(167); + +// A single base 64 digit can contain 6 bits of data. For the base 64 variable +// length quantities we use in the source map spec, the first bit is the sign, +// the next four bits are the actual value, and the 6th bit is the +// continuation bit. The continuation bit tells us whether there are more +// digits in this value following this digit. +// +// Continuation +// | Sign +// | | +// V V +// 101011 + +var VLQ_BASE_SHIFT = 5; + +// binary: 100000 +var VLQ_BASE = 1 << VLQ_BASE_SHIFT; + +// binary: 011111 +var VLQ_BASE_MASK = VLQ_BASE - 1; + +// binary: 100000 +var VLQ_CONTINUATION_BIT = VLQ_BASE; + +/** + * Converts from a two-complement value to a value where the sign bit is + * placed in the least significant bit. For example, as decimals: + * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary) + * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary) + */ +function toVLQSigned(aValue) { + return aValue < 0 + ? ((-aValue) << 1) + 1 + : (aValue << 1) + 0; +} + +/** + * Converts to a two-complement value from a value where the sign bit is + * placed in the least significant bit. For example, as decimals: + * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1 + * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2 + */ +function fromVLQSigned(aValue) { + var isNegative = (aValue & 1) === 1; + var shifted = aValue >> 1; + return isNegative + ? -shifted + : shifted; +} + +/** + * Returns the base 64 VLQ encoded value. + */ +exports.encode = function base64VLQ_encode(aValue) { + var encoded = ""; + var digit; + + var vlq = toVLQSigned(aValue); + + do { + digit = vlq & VLQ_BASE_MASK; + vlq >>>= VLQ_BASE_SHIFT; + if (vlq > 0) { + // There are still more digits in this value, so we must make sure the + // continuation bit is marked. + digit |= VLQ_CONTINUATION_BIT; + } + encoded += base64.encode(digit); + } while (vlq > 0); + + return encoded; +}; + +/** + * Decodes the next base 64 VLQ value from the given string and returns the + * value and the rest of the string via the out parameter. + */ +exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) { + var strLen = aStr.length; + var result = 0; + var shift = 0; + var continuation, digit; + + do { + if (aIndex >= strLen) { + throw new Error("Expected more digits in base 64 VLQ value."); + } + + digit = base64.decode(aStr.charCodeAt(aIndex++)); + if (digit === -1) { + throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1)); + } + + continuation = !!(digit & VLQ_CONTINUATION_BIT); + digit &= VLQ_BASE_MASK; + result = result + (digit << shift); + shift += VLQ_BASE_SHIFT; + } while (continuation); + + aOutParam.value = fromVLQSigned(result); + aOutParam.rest = aIndex; +}; + + +/***/ }), +/* 167 */ +/***/ ((__unused_webpack_module, exports) => { + +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split(''); + +/** + * Encode an integer in the range of 0 to 63 to a single base 64 digit. + */ +exports.encode = function (number) { + if (0 <= number && number < intToCharMap.length) { + return intToCharMap[number]; + } + throw new TypeError("Must be between 0 and 63: " + number); +}; + +/** + * Decode a single base 64 character code digit to an integer. Returns -1 on + * failure. + */ +exports.decode = function (charCode) { + var bigA = 65; // 'A' + var bigZ = 90; // 'Z' + + var littleA = 97; // 'a' + var littleZ = 122; // 'z' + + var zero = 48; // '0' + var nine = 57; // '9' + + var plus = 43; // '+' + var slash = 47; // '/' + + var littleOffset = 26; + var numberOffset = 52; + + // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ + if (bigA <= charCode && charCode <= bigZ) { + return (charCode - bigA); + } + + // 26 - 51: abcdefghijklmnopqrstuvwxyz + if (littleA <= charCode && charCode <= littleZ) { + return (charCode - littleA + littleOffset); + } + + // 52 - 61: 0123456789 + if (zero <= charCode && charCode <= nine) { + return (charCode - zero + numberOffset); + } + + // 62: + + if (charCode == plus) { + return 62; + } + + // 63: / + if (charCode == slash) { + return 63; + } + + // Invalid base64 digit. + return -1; +}; + + +/***/ }), +/* 168 */ +/***/ ((__unused_webpack_module, exports) => { + +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +/** + * This is a helper function for getting values from parameter/options + * objects. + * + * @param args The object we are extracting values from + * @param name The name of the property we are getting. + * @param defaultValue An optional value to return if the property is missing + * from the object. If this is not specified and the property is missing, an + * error will be thrown. + */ +function getArg(aArgs, aName, aDefaultValue) { + if (aName in aArgs) { + return aArgs[aName]; + } else if (arguments.length === 3) { + return aDefaultValue; + } else { + throw new Error('"' + aName + '" is a required argument.'); + } +} +exports.getArg = getArg; + +var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.]*)(?::(\d+))?(\S*)$/; +var dataUrlRegexp = /^data:.+\,.+$/; + +function urlParse(aUrl) { + var match = aUrl.match(urlRegexp); + if (!match) { + return null; + } + return { + scheme: match[1], + auth: match[2], + host: match[3], + port: match[4], + path: match[5] + }; +} +exports.urlParse = urlParse; + +function urlGenerate(aParsedUrl) { + var url = ''; + if (aParsedUrl.scheme) { + url += aParsedUrl.scheme + ':'; + } + url += '//'; + if (aParsedUrl.auth) { + url += aParsedUrl.auth + '@'; + } + if (aParsedUrl.host) { + url += aParsedUrl.host; + } + if (aParsedUrl.port) { + url += ":" + aParsedUrl.port + } + if (aParsedUrl.path) { + url += aParsedUrl.path; + } + return url; +} +exports.urlGenerate = urlGenerate; + +/** + * Normalizes a path, or the path portion of a URL: + * + * - Replaces consecutive slashes with one slash. + * - Removes unnecessary '.' parts. + * - Removes unnecessary '/..' parts. + * + * Based on code in the Node.js 'path' core module. + * + * @param aPath The path or url to normalize. + */ +function normalize(aPath) { + var path = aPath; + var url = urlParse(aPath); + if (url) { + if (!url.path) { + return aPath; + } + path = url.path; + } + var isAbsolute = exports.isAbsolute(path); + + var parts = path.split(/\/+/); + for (var part, up = 0, i = parts.length - 1; i >= 0; i--) { + part = parts[i]; + if (part === '.') { + parts.splice(i, 1); + } else if (part === '..') { + up++; + } else if (up > 0) { + if (part === '') { + // The first part is blank if the path is absolute. Trying to go + // above the root is a no-op. Therefore we can remove all '..' parts + // directly after the root. + parts.splice(i + 1, up); + up = 0; + } else { + parts.splice(i, 2); + up--; + } + } + } + path = parts.join('/'); + + if (path === '') { + path = isAbsolute ? '/' : '.'; + } + + if (url) { + url.path = path; + return urlGenerate(url); + } + return path; +} +exports.normalize = normalize; + +/** + * Joins two paths/URLs. + * + * @param aRoot The root path or URL. + * @param aPath The path or URL to be joined with the root. + * + * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a + * scheme-relative URL: Then the scheme of aRoot, if any, is prepended + * first. + * - Otherwise aPath is a path. If aRoot is a URL, then its path portion + * is updated with the result and aRoot is returned. Otherwise the result + * is returned. + * - If aPath is absolute, the result is aPath. + * - Otherwise the two paths are joined with a slash. + * - Joining for example 'http://' and 'www.example.com' is also supported. + */ +function join(aRoot, aPath) { + if (aRoot === "") { + aRoot = "."; + } + if (aPath === "") { + aPath = "."; + } + var aPathUrl = urlParse(aPath); + var aRootUrl = urlParse(aRoot); + if (aRootUrl) { + aRoot = aRootUrl.path || '/'; + } + + // `join(foo, '//www.example.org')` + if (aPathUrl && !aPathUrl.scheme) { + if (aRootUrl) { + aPathUrl.scheme = aRootUrl.scheme; + } + return urlGenerate(aPathUrl); + } + + if (aPathUrl || aPath.match(dataUrlRegexp)) { + return aPath; + } + + // `join('http://', 'www.example.com')` + if (aRootUrl && !aRootUrl.host && !aRootUrl.path) { + aRootUrl.host = aPath; + return urlGenerate(aRootUrl); + } + + var joined = aPath.charAt(0) === '/' + ? aPath + : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath); + + if (aRootUrl) { + aRootUrl.path = joined; + return urlGenerate(aRootUrl); + } + return joined; +} +exports.join = join; + +exports.isAbsolute = function (aPath) { + return aPath.charAt(0) === '/' || !!aPath.match(urlRegexp); +}; + +/** + * Make a path relative to a URL or another path. + * + * @param aRoot The root path or URL. + * @param aPath The path or URL to be made relative to aRoot. + */ +function relative(aRoot, aPath) { + if (aRoot === "") { + aRoot = "."; + } + + aRoot = aRoot.replace(/\/$/, ''); + + // It is possible for the path to be above the root. In this case, simply + // checking whether the root is a prefix of the path won't work. Instead, we + // need to remove components from the root one by one, until either we find + // a prefix that fits, or we run out of components to remove. + var level = 0; + while (aPath.indexOf(aRoot + '/') !== 0) { + var index = aRoot.lastIndexOf("/"); + if (index < 0) { + return aPath; + } + + // If the only part of the root that is left is the scheme (i.e. http://, + // file:///, etc.), one or more slashes (/), or simply nothing at all, we + // have exhausted all components, so the path is not relative to the root. + aRoot = aRoot.slice(0, index); + if (aRoot.match(/^([^\/]+:\/)?\/*$/)) { + return aPath; + } + + ++level; + } + + // Make sure we add a "../" for each component we removed from the root. + return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1); +} +exports.relative = relative; + +var supportsNullProto = (function () { + var obj = Object.create(null); + return !('__proto__' in obj); +}()); + +function identity (s) { + return s; +} + +/** + * Because behavior goes wacky when you set `__proto__` on objects, we + * have to prefix all the strings in our set with an arbitrary character. + * + * See https://github.com/mozilla/source-map/pull/31 and + * https://github.com/mozilla/source-map/issues/30 + * + * @param String aStr + */ +function toSetString(aStr) { + if (isProtoString(aStr)) { + return '$' + aStr; + } + + return aStr; +} +exports.toSetString = supportsNullProto ? identity : toSetString; + +function fromSetString(aStr) { + if (isProtoString(aStr)) { + return aStr.slice(1); + } + + return aStr; +} +exports.fromSetString = supportsNullProto ? identity : fromSetString; + +function isProtoString(s) { + if (!s) { + return false; + } + + var length = s.length; + + if (length < 9 /* "__proto__".length */) { + return false; + } + + if (s.charCodeAt(length - 1) !== 95 /* '_' */ || + s.charCodeAt(length - 2) !== 95 /* '_' */ || + s.charCodeAt(length - 3) !== 111 /* 'o' */ || + s.charCodeAt(length - 4) !== 116 /* 't' */ || + s.charCodeAt(length - 5) !== 111 /* 'o' */ || + s.charCodeAt(length - 6) !== 114 /* 'r' */ || + s.charCodeAt(length - 7) !== 112 /* 'p' */ || + s.charCodeAt(length - 8) !== 95 /* '_' */ || + s.charCodeAt(length - 9) !== 95 /* '_' */) { + return false; + } + + for (var i = length - 10; i >= 0; i--) { + if (s.charCodeAt(i) !== 36 /* '$' */) { + return false; + } + } + + return true; +} + +/** + * Comparator between two mappings where the original positions are compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same original source/line/column, but different generated + * line and column the same. Useful when searching for a mapping with a + * stubbed out mapping. + */ +function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) { + var cmp = mappingA.source - mappingB.source; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0 || onlyCompareOriginal) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + return mappingA.name - mappingB.name; +} +exports.compareByOriginalPositions = compareByOriginalPositions; + +/** + * Comparator between two mappings with deflated source and name indices where + * the generated positions are compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same generated line and column, but different + * source/name/original line and column the same. Useful when searching for a + * mapping with a stubbed out mapping. + */ +function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) { + var cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0 || onlyCompareGenerated) { + return cmp; + } + + cmp = mappingA.source - mappingB.source; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0) { + return cmp; + } + + return mappingA.name - mappingB.name; +} +exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated; + +function strcmp(aStr1, aStr2) { + if (aStr1 === aStr2) { + return 0; + } + + if (aStr1 > aStr2) { + return 1; + } + + return -1; +} + +/** + * Comparator between two mappings with inflated source and name strings where + * the generated positions are compared. + */ +function compareByGeneratedPositionsInflated(mappingA, mappingB) { + var cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0) { + return cmp; + } + + cmp = strcmp(mappingA.source, mappingB.source); + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0) { + return cmp; + } + + return strcmp(mappingA.name, mappingB.name); +} +exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated; + + +/***/ }), +/* 169 */ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +var util = __webpack_require__(168); +var has = Object.prototype.hasOwnProperty; +var hasNativeMap = typeof Map !== "undefined"; + +/** + * A data structure which is a combination of an array and a set. Adding a new + * member is O(1), testing for membership is O(1), and finding the index of an + * element is O(1). Removing elements from the set is not supported. Only + * strings are supported for membership. + */ +function ArraySet() { + this._array = []; + this._set = hasNativeMap ? new Map() : Object.create(null); +} + +/** + * Static method for creating ArraySet instances from an existing array. + */ +ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) { + var set = new ArraySet(); + for (var i = 0, len = aArray.length; i < len; i++) { + set.add(aArray[i], aAllowDuplicates); + } + return set; +}; + +/** + * Return how many unique items are in this ArraySet. If duplicates have been + * added, than those do not count towards the size. + * + * @returns Number + */ +ArraySet.prototype.size = function ArraySet_size() { + return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length; +}; + +/** + * Add the given string to this set. + * + * @param String aStr + */ +ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) { + var sStr = hasNativeMap ? aStr : util.toSetString(aStr); + var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr); + var idx = this._array.length; + if (!isDuplicate || aAllowDuplicates) { + this._array.push(aStr); + } + if (!isDuplicate) { + if (hasNativeMap) { + this._set.set(aStr, idx); + } else { + this._set[sStr] = idx; + } + } +}; + +/** + * Is the given string a member of this set? + * + * @param String aStr + */ +ArraySet.prototype.has = function ArraySet_has(aStr) { + if (hasNativeMap) { + return this._set.has(aStr); + } else { + var sStr = util.toSetString(aStr); + return has.call(this._set, sStr); + } +}; + +/** + * What is the index of the given string in the array? + * + * @param String aStr + */ +ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) { + if (hasNativeMap) { + var idx = this._set.get(aStr); + if (idx >= 0) { + return idx; + } + } else { + var sStr = util.toSetString(aStr); + if (has.call(this._set, sStr)) { + return this._set[sStr]; + } + } + + throw new Error('"' + aStr + '" is not in the set.'); +}; + +/** + * What is the element at the given index? + * + * @param Number aIdx + */ +ArraySet.prototype.at = function ArraySet_at(aIdx) { + if (aIdx >= 0 && aIdx < this._array.length) { + return this._array[aIdx]; + } + throw new Error('No element indexed by ' + aIdx); +}; + +/** + * Returns the array representation of this set (which has the proper indices + * indicated by indexOf). Note that this is a copy of the internal array used + * for storing the members so that no one can mess with internal state. + */ +ArraySet.prototype.toArray = function ArraySet_toArray() { + return this._array.slice(); +}; + +exports.ArraySet = ArraySet; + + +/***/ }), +/* 170 */ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2014 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +var util = __webpack_require__(168); + +/** + * Determine whether mappingB is after mappingA with respect to generated + * position. + */ +function generatedPositionAfter(mappingA, mappingB) { + // Optimized for most common case + var lineA = mappingA.generatedLine; + var lineB = mappingB.generatedLine; + var columnA = mappingA.generatedColumn; + var columnB = mappingB.generatedColumn; + return lineB > lineA || lineB == lineA && columnB >= columnA || + util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0; +} + +/** + * A data structure to provide a sorted view of accumulated mappings in a + * performance conscious manner. It trades a neglibable overhead in general + * case for a large speedup in case of mappings being added in order. + */ +function MappingList() { + this._array = []; + this._sorted = true; + // Serves as infimum + this._last = {generatedLine: -1, generatedColumn: 0}; +} + +/** + * Iterate through internal items. This method takes the same arguments that + * `Array.prototype.forEach` takes. + * + * NOTE: The order of the mappings is NOT guaranteed. + */ +MappingList.prototype.unsortedForEach = + function MappingList_forEach(aCallback, aThisArg) { + this._array.forEach(aCallback, aThisArg); + }; + +/** + * Add the given source mapping. + * + * @param Object aMapping + */ +MappingList.prototype.add = function MappingList_add(aMapping) { + if (generatedPositionAfter(this._last, aMapping)) { + this._last = aMapping; + this._array.push(aMapping); + } else { + this._sorted = false; + this._array.push(aMapping); + } +}; + +/** + * Returns the flat, sorted array of mappings. The mappings are sorted by + * generated position. + * + * WARNING: This method returns internal data without copying, for + * performance. The return value must NOT be mutated, and should be treated as + * an immutable borrow. If you want to take ownership, you must make your own + * copy. + */ +MappingList.prototype.toArray = function MappingList_toArray() { + if (!this._sorted) { + this._array.sort(util.compareByGeneratedPositionsInflated); + this._sorted = true; + } + return this._array; +}; + +exports.MappingList = MappingList; + + +/***/ }), +/* 171 */ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +var util = __webpack_require__(168); +var binarySearch = __webpack_require__(172); +var ArraySet = (__webpack_require__(169).ArraySet); +var base64VLQ = __webpack_require__(166); +var quickSort = (__webpack_require__(173).quickSort); + +function SourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + return sourceMap.sections != null + ? new IndexedSourceMapConsumer(sourceMap) + : new BasicSourceMapConsumer(sourceMap); +} + +SourceMapConsumer.fromSourceMap = function(aSourceMap) { + return BasicSourceMapConsumer.fromSourceMap(aSourceMap); +} + +/** + * The version of the source mapping spec that we are consuming. + */ +SourceMapConsumer.prototype._version = 3; + +// `__generatedMappings` and `__originalMappings` are arrays that hold the +// parsed mapping coordinates from the source map's "mappings" attribute. They +// are lazily instantiated, accessed via the `_generatedMappings` and +// `_originalMappings` getters respectively, and we only parse the mappings +// and create these arrays once queried for a source location. We jump through +// these hoops because there can be many thousands of mappings, and parsing +// them is expensive, so we only want to do it if we must. +// +// Each object in the arrays is of the form: +// +// { +// generatedLine: The line number in the generated code, +// generatedColumn: The column number in the generated code, +// source: The path to the original source file that generated this +// chunk of code, +// originalLine: The line number in the original source that +// corresponds to this chunk of generated code, +// originalColumn: The column number in the original source that +// corresponds to this chunk of generated code, +// name: The name of the original symbol which generated this chunk of +// code. +// } +// +// All properties except for `generatedLine` and `generatedColumn` can be +// `null`. +// +// `_generatedMappings` is ordered by the generated positions. +// +// `_originalMappings` is ordered by the original positions. + +SourceMapConsumer.prototype.__generatedMappings = null; +Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', { + get: function () { + if (!this.__generatedMappings) { + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__generatedMappings; + } +}); + +SourceMapConsumer.prototype.__originalMappings = null; +Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', { + get: function () { + if (!this.__originalMappings) { + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__originalMappings; + } +}); + +SourceMapConsumer.prototype._charIsMappingSeparator = + function SourceMapConsumer_charIsMappingSeparator(aStr, index) { + var c = aStr.charAt(index); + return c === ";" || c === ","; + }; + +/** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ +SourceMapConsumer.prototype._parseMappings = + function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { + throw new Error("Subclasses must implement _parseMappings"); + }; + +SourceMapConsumer.GENERATED_ORDER = 1; +SourceMapConsumer.ORIGINAL_ORDER = 2; + +SourceMapConsumer.GREATEST_LOWER_BOUND = 1; +SourceMapConsumer.LEAST_UPPER_BOUND = 2; + +/** + * Iterate over each mapping between an original source/line/column and a + * generated line/column in this source map. + * + * @param Function aCallback + * The function that is called with each mapping. + * @param Object aContext + * Optional. If specified, this object will be the value of `this` every + * time that `aCallback` is called. + * @param aOrder + * Either `SourceMapConsumer.GENERATED_ORDER` or + * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to + * iterate over the mappings sorted by the generated file's line/column + * order or the original's source/line/column order, respectively. Defaults to + * `SourceMapConsumer.GENERATED_ORDER`. + */ +SourceMapConsumer.prototype.eachMapping = + function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) { + var context = aContext || null; + var order = aOrder || SourceMapConsumer.GENERATED_ORDER; + + var mappings; + switch (order) { + case SourceMapConsumer.GENERATED_ORDER: + mappings = this._generatedMappings; + break; + case SourceMapConsumer.ORIGINAL_ORDER: + mappings = this._originalMappings; + break; + default: + throw new Error("Unknown order of iteration."); + } + + var sourceRoot = this.sourceRoot; + mappings.map(function (mapping) { + var source = mapping.source === null ? null : this._sources.at(mapping.source); + if (source != null && sourceRoot != null) { + source = util.join(sourceRoot, source); + } + return { + source: source, + generatedLine: mapping.generatedLine, + generatedColumn: mapping.generatedColumn, + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + name: mapping.name === null ? null : this._names.at(mapping.name) + }; + }, this).forEach(aCallback, context); + }; + +/** + * Returns all generated line and column information for the original source, + * line, and column provided. If no column is provided, returns all mappings + * corresponding to a either the line we are searching for or the next + * closest line that has any mappings. Otherwise, returns all mappings + * corresponding to the given line and either the column we are searching for + * or the next closest column that has any offsets. + * + * The only argument is an object with the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: Optional. the column number in the original source. + * + * and an array of objects is returned, each with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ +SourceMapConsumer.prototype.allGeneratedPositionsFor = + function SourceMapConsumer_allGeneratedPositionsFor(aArgs) { + var line = util.getArg(aArgs, 'line'); + + // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping + // returns the index of the closest mapping less than the needle. By + // setting needle.originalColumn to 0, we thus find the last mapping for + // the given line, provided such a mapping exists. + var needle = { + source: util.getArg(aArgs, 'source'), + originalLine: line, + originalColumn: util.getArg(aArgs, 'column', 0) + }; + + if (this.sourceRoot != null) { + needle.source = util.relative(this.sourceRoot, needle.source); + } + if (!this._sources.has(needle.source)) { + return []; + } + needle.source = this._sources.indexOf(needle.source); + + var mappings = []; + + var index = this._findMapping(needle, + this._originalMappings, + "originalLine", + "originalColumn", + util.compareByOriginalPositions, + binarySearch.LEAST_UPPER_BOUND); + if (index >= 0) { + var mapping = this._originalMappings[index]; + + if (aArgs.column === undefined) { + var originalLine = mapping.originalLine; + + // Iterate until either we run out of mappings, or we run into + // a mapping for a different line than the one we found. Since + // mappings are sorted, this is guaranteed to find all mappings for + // the line we found. + while (mapping && mapping.originalLine === originalLine) { + mappings.push({ + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }); + + mapping = this._originalMappings[++index]; + } + } else { + var originalColumn = mapping.originalColumn; + + // Iterate until either we run out of mappings, or we run into + // a mapping for a different line than the one we were searching for. + // Since mappings are sorted, this is guaranteed to find all mappings for + // the line we are searching for. + while (mapping && + mapping.originalLine === line && + mapping.originalColumn == originalColumn) { + mappings.push({ + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }); + + mapping = this._originalMappings[++index]; + } + } + } + + return mappings; + }; + +exports.SourceMapConsumer = SourceMapConsumer; + +/** + * A BasicSourceMapConsumer instance represents a parsed source map which we can + * query for information about the original file positions by giving it a file + * position in the generated source. + * + * The only parameter is the raw source map (either as a JSON string, or + * already parsed to an object). According to the spec, source maps have the + * following attributes: + * + * - version: Which version of the source map spec this map is following. + * - sources: An array of URLs to the original source files. + * - names: An array of identifiers which can be referrenced by individual mappings. + * - sourceRoot: Optional. The URL root from which all sources are relative. + * - sourcesContent: Optional. An array of contents of the original source files. + * - mappings: A string of base64 VLQs which contain the actual mappings. + * - file: Optional. The generated file this source map is associated with. + * + * Here is an example source map, taken from the source map spec[0]: + * + * { + * version : 3, + * file: "out.js", + * sourceRoot : "", + * sources: ["foo.js", "bar.js"], + * names: ["src", "maps", "are", "fun"], + * mappings: "AA,AB;;ABCDE;" + * } + * + * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1# + */ +function BasicSourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + var version = util.getArg(sourceMap, 'version'); + var sources = util.getArg(sourceMap, 'sources'); + // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which + // requires the array) to play nice here. + var names = util.getArg(sourceMap, 'names', []); + var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null); + var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null); + var mappings = util.getArg(sourceMap, 'mappings'); + var file = util.getArg(sourceMap, 'file', null); + + // Once again, Sass deviates from the spec and supplies the version as a + // string rather than a number, so we use loose equality checking here. + if (version != this._version) { + throw new Error('Unsupported version: ' + version); + } + + sources = sources + .map(String) + // Some source maps produce relative source paths like "./foo.js" instead of + // "foo.js". Normalize these first so that future comparisons will succeed. + // See bugzil.la/1090768. + .map(util.normalize) + // Always ensure that absolute sources are internally stored relative to + // the source root, if the source root is absolute. Not doing this would + // be particularly problematic when the source root is a prefix of the + // source (valid, but why??). See github issue #199 and bugzil.la/1188982. + .map(function (source) { + return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source) + ? util.relative(sourceRoot, source) + : source; + }); + + // Pass `true` below to allow duplicate names and sources. While source maps + // are intended to be compressed and deduplicated, the TypeScript compiler + // sometimes generates source maps with duplicates in them. See Github issue + // #72 and bugzil.la/889492. + this._names = ArraySet.fromArray(names.map(String), true); + this._sources = ArraySet.fromArray(sources, true); + + this.sourceRoot = sourceRoot; + this.sourcesContent = sourcesContent; + this._mappings = mappings; + this.file = file; +} + +BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); +BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer; + +/** + * Create a BasicSourceMapConsumer from a SourceMapGenerator. + * + * @param SourceMapGenerator aSourceMap + * The source map that will be consumed. + * @returns BasicSourceMapConsumer + */ +BasicSourceMapConsumer.fromSourceMap = + function SourceMapConsumer_fromSourceMap(aSourceMap) { + var smc = Object.create(BasicSourceMapConsumer.prototype); + + var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true); + var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true); + smc.sourceRoot = aSourceMap._sourceRoot; + smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(), + smc.sourceRoot); + smc.file = aSourceMap._file; + + // Because we are modifying the entries (by converting string sources and + // names to indices into the sources and names ArraySets), we have to make + // a copy of the entry or else bad things happen. Shared mutable state + // strikes again! See github issue #191. + + var generatedMappings = aSourceMap._mappings.toArray().slice(); + var destGeneratedMappings = smc.__generatedMappings = []; + var destOriginalMappings = smc.__originalMappings = []; + + for (var i = 0, length = generatedMappings.length; i < length; i++) { + var srcMapping = generatedMappings[i]; + var destMapping = new Mapping; + destMapping.generatedLine = srcMapping.generatedLine; + destMapping.generatedColumn = srcMapping.generatedColumn; + + if (srcMapping.source) { + destMapping.source = sources.indexOf(srcMapping.source); + destMapping.originalLine = srcMapping.originalLine; + destMapping.originalColumn = srcMapping.originalColumn; + + if (srcMapping.name) { + destMapping.name = names.indexOf(srcMapping.name); + } + + destOriginalMappings.push(destMapping); + } + + destGeneratedMappings.push(destMapping); + } + + quickSort(smc.__originalMappings, util.compareByOriginalPositions); + + return smc; + }; + +/** + * The version of the source mapping spec that we are consuming. + */ +BasicSourceMapConsumer.prototype._version = 3; + +/** + * The list of original sources. + */ +Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', { + get: function () { + return this._sources.toArray().map(function (s) { + return this.sourceRoot != null ? util.join(this.sourceRoot, s) : s; + }, this); + } +}); + +/** + * Provide the JIT with a nice shape / hidden class. + */ +function Mapping() { + this.generatedLine = 0; + this.generatedColumn = 0; + this.source = null; + this.originalLine = null; + this.originalColumn = null; + this.name = null; +} + +/** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ +BasicSourceMapConsumer.prototype._parseMappings = + function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { + var generatedLine = 1; + var previousGeneratedColumn = 0; + var previousOriginalLine = 0; + var previousOriginalColumn = 0; + var previousSource = 0; + var previousName = 0; + var length = aStr.length; + var index = 0; + var cachedSegments = {}; + var temp = {}; + var originalMappings = []; + var generatedMappings = []; + var mapping, str, segment, end, value; + + while (index < length) { + if (aStr.charAt(index) === ';') { + generatedLine++; + index++; + previousGeneratedColumn = 0; + } + else if (aStr.charAt(index) === ',') { + index++; + } + else { + mapping = new Mapping(); + mapping.generatedLine = generatedLine; + + // Because each offset is encoded relative to the previous one, + // many segments often have the same encoding. We can exploit this + // fact by caching the parsed variable length fields of each segment, + // allowing us to avoid a second parse if we encounter the same + // segment again. + for (end = index; end < length; end++) { + if (this._charIsMappingSeparator(aStr, end)) { + break; + } + } + str = aStr.slice(index, end); + + segment = cachedSegments[str]; + if (segment) { + index += str.length; + } else { + segment = []; + while (index < end) { + base64VLQ.decode(aStr, index, temp); + value = temp.value; + index = temp.rest; + segment.push(value); + } + + if (segment.length === 2) { + throw new Error('Found a source, but no line and column'); + } + + if (segment.length === 3) { + throw new Error('Found a source and line, but no column'); + } + + cachedSegments[str] = segment; + } + + // Generated column. + mapping.generatedColumn = previousGeneratedColumn + segment[0]; + previousGeneratedColumn = mapping.generatedColumn; + + if (segment.length > 1) { + // Original source. + mapping.source = previousSource + segment[1]; + previousSource += segment[1]; + + // Original line. + mapping.originalLine = previousOriginalLine + segment[2]; + previousOriginalLine = mapping.originalLine; + // Lines are stored 0-based + mapping.originalLine += 1; + + // Original column. + mapping.originalColumn = previousOriginalColumn + segment[3]; + previousOriginalColumn = mapping.originalColumn; + + if (segment.length > 4) { + // Original name. + mapping.name = previousName + segment[4]; + previousName += segment[4]; + } + } + + generatedMappings.push(mapping); + if (typeof mapping.originalLine === 'number') { + originalMappings.push(mapping); + } + } + } + + quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated); + this.__generatedMappings = generatedMappings; + + quickSort(originalMappings, util.compareByOriginalPositions); + this.__originalMappings = originalMappings; + }; + +/** + * Find the mapping that best matches the hypothetical "needle" mapping that + * we are searching for in the given "haystack" of mappings. + */ +BasicSourceMapConsumer.prototype._findMapping = + function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName, + aColumnName, aComparator, aBias) { + // To return the position we are searching for, we must first find the + // mapping for the given position and then return the opposite position it + // points to. Because the mappings are sorted, we can use binary search to + // find the best mapping. + + if (aNeedle[aLineName] <= 0) { + throw new TypeError('Line must be greater than or equal to 1, got ' + + aNeedle[aLineName]); + } + if (aNeedle[aColumnName] < 0) { + throw new TypeError('Column must be greater than or equal to 0, got ' + + aNeedle[aColumnName]); + } + + return binarySearch.search(aNeedle, aMappings, aComparator, aBias); + }; + +/** + * Compute the last column for each generated mapping. The last column is + * inclusive. + */ +BasicSourceMapConsumer.prototype.computeColumnSpans = + function SourceMapConsumer_computeColumnSpans() { + for (var index = 0; index < this._generatedMappings.length; ++index) { + var mapping = this._generatedMappings[index]; + + // Mappings do not contain a field for the last generated columnt. We + // can come up with an optimistic estimate, however, by assuming that + // mappings are contiguous (i.e. given two consecutive mappings, the + // first mapping ends where the second one starts). + if (index + 1 < this._generatedMappings.length) { + var nextMapping = this._generatedMappings[index + 1]; + + if (mapping.generatedLine === nextMapping.generatedLine) { + mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1; + continue; + } + } + + // The last mapping for each line spans the entire line. + mapping.lastGeneratedColumn = Infinity; + } + }; + +/** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. + * - column: The column number in the generated source. + * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or + * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. + * - column: The column number in the original source, or null. + * - name: The original identifier, or null. + */ +BasicSourceMapConsumer.prototype.originalPositionFor = + function SourceMapConsumer_originalPositionFor(aArgs) { + var needle = { + generatedLine: util.getArg(aArgs, 'line'), + generatedColumn: util.getArg(aArgs, 'column') + }; + + var index = this._findMapping( + needle, + this._generatedMappings, + "generatedLine", + "generatedColumn", + util.compareByGeneratedPositionsDeflated, + util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND) + ); + + if (index >= 0) { + var mapping = this._generatedMappings[index]; + + if (mapping.generatedLine === needle.generatedLine) { + var source = util.getArg(mapping, 'source', null); + if (source !== null) { + source = this._sources.at(source); + if (this.sourceRoot != null) { + source = util.join(this.sourceRoot, source); + } + } + var name = util.getArg(mapping, 'name', null); + if (name !== null) { + name = this._names.at(name); + } + return { + source: source, + line: util.getArg(mapping, 'originalLine', null), + column: util.getArg(mapping, 'originalColumn', null), + name: name + }; + } + } + + return { + source: null, + line: null, + column: null, + name: null + }; + }; + +/** + * Return true if we have the source content for every source in the source + * map, false otherwise. + */ +BasicSourceMapConsumer.prototype.hasContentsOfAllSources = + function BasicSourceMapConsumer_hasContentsOfAllSources() { + if (!this.sourcesContent) { + return false; + } + return this.sourcesContent.length >= this._sources.size() && + !this.sourcesContent.some(function (sc) { return sc == null; }); + }; + +/** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * available. + */ +BasicSourceMapConsumer.prototype.sourceContentFor = + function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { + if (!this.sourcesContent) { + return null; + } + + if (this.sourceRoot != null) { + aSource = util.relative(this.sourceRoot, aSource); + } + + if (this._sources.has(aSource)) { + return this.sourcesContent[this._sources.indexOf(aSource)]; + } + + var url; + if (this.sourceRoot != null + && (url = util.urlParse(this.sourceRoot))) { + // XXX: file:// URIs and absolute paths lead to unexpected behavior for + // many users. We can help them out when they expect file:// URIs to + // behave like it would if they were running a local HTTP server. See + // https://bugzilla.mozilla.org/show_bug.cgi?id=885597. + var fileUriAbsPath = aSource.replace(/^file:\/\//, ""); + if (url.scheme == "file" + && this._sources.has(fileUriAbsPath)) { + return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)] + } + + if ((!url.path || url.path == "/") + && this._sources.has("/" + aSource)) { + return this.sourcesContent[this._sources.indexOf("/" + aSource)]; + } + } + + // This function is used recursively from + // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we + // don't want to throw if we can't find the source - we just want to + // return null, so we provide a flag to exit gracefully. + if (nullOnMissing) { + return null; + } + else { + throw new Error('"' + aSource + '" is not in the SourceMap.'); + } + }; + +/** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: The column number in the original source. + * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or + * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ +BasicSourceMapConsumer.prototype.generatedPositionFor = + function SourceMapConsumer_generatedPositionFor(aArgs) { + var source = util.getArg(aArgs, 'source'); + if (this.sourceRoot != null) { + source = util.relative(this.sourceRoot, source); + } + if (!this._sources.has(source)) { + return { + line: null, + column: null, + lastColumn: null + }; + } + source = this._sources.indexOf(source); + + var needle = { + source: source, + originalLine: util.getArg(aArgs, 'line'), + originalColumn: util.getArg(aArgs, 'column') + }; + + var index = this._findMapping( + needle, + this._originalMappings, + "originalLine", + "originalColumn", + util.compareByOriginalPositions, + util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND) + ); + + if (index >= 0) { + var mapping = this._originalMappings[index]; + + if (mapping.source === needle.source) { + return { + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }; + } + } + + return { + line: null, + column: null, + lastColumn: null + }; + }; + +exports.BasicSourceMapConsumer = BasicSourceMapConsumer; + +/** + * An IndexedSourceMapConsumer instance represents a parsed source map which + * we can query for information. It differs from BasicSourceMapConsumer in + * that it takes "indexed" source maps (i.e. ones with a "sections" field) as + * input. + * + * The only parameter is a raw source map (either as a JSON string, or already + * parsed to an object). According to the spec for indexed source maps, they + * have the following attributes: + * + * - version: Which version of the source map spec this map is following. + * - file: Optional. The generated file this source map is associated with. + * - sections: A list of section definitions. + * + * Each value under the "sections" field has two fields: + * - offset: The offset into the original specified at which this section + * begins to apply, defined as an object with a "line" and "column" + * field. + * - map: A source map definition. This source map could also be indexed, + * but doesn't have to be. + * + * Instead of the "map" field, it's also possible to have a "url" field + * specifying a URL to retrieve a source map from, but that's currently + * unsupported. + * + * Here's an example source map, taken from the source map spec[0], but + * modified to omit a section which uses the "url" field. + * + * { + * version : 3, + * file: "app.js", + * sections: [{ + * offset: {line:100, column:10}, + * map: { + * version : 3, + * file: "section.js", + * sources: ["foo.js", "bar.js"], + * names: ["src", "maps", "are", "fun"], + * mappings: "AAAA,E;;ABCDE;" + * } + * }], + * } + * + * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt + */ +function IndexedSourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + var version = util.getArg(sourceMap, 'version'); + var sections = util.getArg(sourceMap, 'sections'); + + if (version != this._version) { + throw new Error('Unsupported version: ' + version); + } + + this._sources = new ArraySet(); + this._names = new ArraySet(); + + var lastOffset = { + line: -1, + column: 0 + }; + this._sections = sections.map(function (s) { + if (s.url) { + // The url field will require support for asynchronicity. + // See https://github.com/mozilla/source-map/issues/16 + throw new Error('Support for url field in sections not implemented.'); + } + var offset = util.getArg(s, 'offset'); + var offsetLine = util.getArg(offset, 'line'); + var offsetColumn = util.getArg(offset, 'column'); + + if (offsetLine < lastOffset.line || + (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) { + throw new Error('Section offsets must be ordered and non-overlapping.'); + } + lastOffset = offset; + + return { + generatedOffset: { + // The offset fields are 0-based, but we use 1-based indices when + // encoding/decoding from VLQ. + generatedLine: offsetLine + 1, + generatedColumn: offsetColumn + 1 + }, + consumer: new SourceMapConsumer(util.getArg(s, 'map')) + } + }); +} + +IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); +IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer; + +/** + * The version of the source mapping spec that we are consuming. + */ +IndexedSourceMapConsumer.prototype._version = 3; + +/** + * The list of original sources. + */ +Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', { + get: function () { + var sources = []; + for (var i = 0; i < this._sections.length; i++) { + for (var j = 0; j < this._sections[i].consumer.sources.length; j++) { + sources.push(this._sections[i].consumer.sources[j]); + } + } + return sources; + } +}); + +/** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. + * - column: The column number in the generated source. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. + * - column: The column number in the original source, or null. + * - name: The original identifier, or null. + */ +IndexedSourceMapConsumer.prototype.originalPositionFor = + function IndexedSourceMapConsumer_originalPositionFor(aArgs) { + var needle = { + generatedLine: util.getArg(aArgs, 'line'), + generatedColumn: util.getArg(aArgs, 'column') + }; + + // Find the section containing the generated position we're trying to map + // to an original position. + var sectionIndex = binarySearch.search(needle, this._sections, + function(needle, section) { + var cmp = needle.generatedLine - section.generatedOffset.generatedLine; + if (cmp) { + return cmp; + } + + return (needle.generatedColumn - + section.generatedOffset.generatedColumn); + }); + var section = this._sections[sectionIndex]; + + if (!section) { + return { + source: null, + line: null, + column: null, + name: null + }; + } + + return section.consumer.originalPositionFor({ + line: needle.generatedLine - + (section.generatedOffset.generatedLine - 1), + column: needle.generatedColumn - + (section.generatedOffset.generatedLine === needle.generatedLine + ? section.generatedOffset.generatedColumn - 1 + : 0), + bias: aArgs.bias + }); + }; + +/** + * Return true if we have the source content for every source in the source + * map, false otherwise. + */ +IndexedSourceMapConsumer.prototype.hasContentsOfAllSources = + function IndexedSourceMapConsumer_hasContentsOfAllSources() { + return this._sections.every(function (s) { + return s.consumer.hasContentsOfAllSources(); + }); + }; + +/** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * available. + */ +IndexedSourceMapConsumer.prototype.sourceContentFor = + function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + + var content = section.consumer.sourceContentFor(aSource, true); + if (content) { + return content; + } + } + if (nullOnMissing) { + return null; + } + else { + throw new Error('"' + aSource + '" is not in the SourceMap.'); + } + }; + +/** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: The column number in the original source. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ +IndexedSourceMapConsumer.prototype.generatedPositionFor = + function IndexedSourceMapConsumer_generatedPositionFor(aArgs) { + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + + // Only consider this section if the requested source is in the list of + // sources of the consumer. + if (section.consumer.sources.indexOf(util.getArg(aArgs, 'source')) === -1) { + continue; + } + var generatedPosition = section.consumer.generatedPositionFor(aArgs); + if (generatedPosition) { + var ret = { + line: generatedPosition.line + + (section.generatedOffset.generatedLine - 1), + column: generatedPosition.column + + (section.generatedOffset.generatedLine === generatedPosition.line + ? section.generatedOffset.generatedColumn - 1 + : 0) + }; + return ret; + } + } + + return { + line: null, + column: null + }; + }; + +/** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ +IndexedSourceMapConsumer.prototype._parseMappings = + function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) { + this.__generatedMappings = []; + this.__originalMappings = []; + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + var sectionMappings = section.consumer._generatedMappings; + for (var j = 0; j < sectionMappings.length; j++) { + var mapping = sectionMappings[j]; + + var source = section.consumer._sources.at(mapping.source); + if (section.consumer.sourceRoot !== null) { + source = util.join(section.consumer.sourceRoot, source); + } + this._sources.add(source); + source = this._sources.indexOf(source); + + var name = section.consumer._names.at(mapping.name); + this._names.add(name); + name = this._names.indexOf(name); + + // The mappings coming from the consumer for the section have + // generated positions relative to the start of the section, so we + // need to offset them to be relative to the start of the concatenated + // generated file. + var adjustedMapping = { + source: source, + generatedLine: mapping.generatedLine + + (section.generatedOffset.generatedLine - 1), + generatedColumn: mapping.generatedColumn + + (section.generatedOffset.generatedLine === mapping.generatedLine + ? section.generatedOffset.generatedColumn - 1 + : 0), + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + name: name + }; + + this.__generatedMappings.push(adjustedMapping); + if (typeof adjustedMapping.originalLine === 'number') { + this.__originalMappings.push(adjustedMapping); + } + } + } + + quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated); + quickSort(this.__originalMappings, util.compareByOriginalPositions); + }; + +exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer; + + +/***/ }), +/* 172 */ +/***/ ((__unused_webpack_module, exports) => { + +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +exports.GREATEST_LOWER_BOUND = 1; +exports.LEAST_UPPER_BOUND = 2; + +/** + * Recursive implementation of binary search. + * + * @param aLow Indices here and lower do not contain the needle. + * @param aHigh Indices here and higher do not contain the needle. + * @param aNeedle The element being searched for. + * @param aHaystack The non-empty array being searched. + * @param aCompare Function which takes two elements and returns -1, 0, or 1. + * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or + * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + */ +function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) { + // This function terminates when one of the following is true: + // + // 1. We find the exact element we are looking for. + // + // 2. We did not find the exact element, but we can return the index of + // the next-closest element. + // + // 3. We did not find the exact element, and there is no next-closest + // element than the one we are searching for, so we return -1. + var mid = Math.floor((aHigh - aLow) / 2) + aLow; + var cmp = aCompare(aNeedle, aHaystack[mid], true); + if (cmp === 0) { + // Found the element we are looking for. + return mid; + } + else if (cmp > 0) { + // Our needle is greater than aHaystack[mid]. + if (aHigh - mid > 1) { + // The element is in the upper half. + return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias); + } + + // The exact needle element was not found in this haystack. Determine if + // we are in termination case (3) or (2) and return the appropriate thing. + if (aBias == exports.LEAST_UPPER_BOUND) { + return aHigh < aHaystack.length ? aHigh : -1; + } else { + return mid; + } + } + else { + // Our needle is less than aHaystack[mid]. + if (mid - aLow > 1) { + // The element is in the lower half. + return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias); + } + + // we are in termination case (3) or (2) and return the appropriate thing. + if (aBias == exports.LEAST_UPPER_BOUND) { + return mid; + } else { + return aLow < 0 ? -1 : aLow; + } + } +} + +/** + * This is an implementation of binary search which will always try and return + * the index of the closest element if there is no exact hit. This is because + * mappings between original and generated line/col pairs are single points, + * and there is an implicit region between each of them, so a miss just means + * that you aren't on the very start of a region. + * + * @param aNeedle The element you are looking for. + * @param aHaystack The array that is being searched. + * @param aCompare A function which takes the needle and an element in the + * array and returns -1, 0, or 1 depending on whether the needle is less + * than, equal to, or greater than the element, respectively. + * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or + * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'. + */ +exports.search = function search(aNeedle, aHaystack, aCompare, aBias) { + if (aHaystack.length === 0) { + return -1; + } + + var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack, + aCompare, aBias || exports.GREATEST_LOWER_BOUND); + if (index < 0) { + return -1; + } + + // We have found either the exact element, or the next-closest element than + // the one we are searching for. However, there may be more than one such + // element. Make sure we always return the smallest of these. + while (index - 1 >= 0) { + if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) { + break; + } + --index; + } + + return index; +}; + + +/***/ }), +/* 173 */ +/***/ ((__unused_webpack_module, exports) => { + +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +// It turns out that some (most?) JavaScript engines don't self-host +// `Array.prototype.sort`. This makes sense because C++ will likely remain +// faster than JS when doing raw CPU-intensive sorting. However, when using a +// custom comparator function, calling back and forth between the VM's C++ and +// JIT'd JS is rather slow *and* loses JIT type information, resulting in +// worse generated code for the comparator function than would be optimal. In +// fact, when sorting with a comparator, these costs outweigh the benefits of +// sorting in C++. By using our own JS-implemented Quick Sort (below), we get +// a ~3500ms mean speed-up in `bench/bench.html`. + +/** + * Swap the elements indexed by `x` and `y` in the array `ary`. + * + * @param {Array} ary + * The array. + * @param {Number} x + * The index of the first item. + * @param {Number} y + * The index of the second item. + */ +function swap(ary, x, y) { + var temp = ary[x]; + ary[x] = ary[y]; + ary[y] = temp; +} + +/** + * Returns a random integer within the range `low .. high` inclusive. + * + * @param {Number} low + * The lower bound on the range. + * @param {Number} high + * The upper bound on the range. + */ +function randomIntInRange(low, high) { + return Math.round(low + (Math.random() * (high - low))); +} + +/** + * The Quick Sort algorithm. + * + * @param {Array} ary + * An array to sort. + * @param {function} comparator + * Function to use to compare two items. + * @param {Number} p + * Start index of the array + * @param {Number} r + * End index of the array + */ +function doQuickSort(ary, comparator, p, r) { + // If our lower bound is less than our upper bound, we (1) partition the + // array into two pieces and (2) recurse on each half. If it is not, this is + // the empty array and our base case. + + if (p < r) { + // (1) Partitioning. + // + // The partitioning chooses a pivot between `p` and `r` and moves all + // elements that are less than or equal to the pivot to the before it, and + // all the elements that are greater than it after it. The effect is that + // once partition is done, the pivot is in the exact place it will be when + // the array is put in sorted order, and it will not need to be moved + // again. This runs in O(n) time. + + // Always choose a random pivot so that an input array which is reverse + // sorted does not cause O(n^2) running time. + var pivotIndex = randomIntInRange(p, r); + var i = p - 1; + + swap(ary, pivotIndex, r); + var pivot = ary[r]; + + // Immediately after `j` is incremented in this loop, the following hold + // true: + // + // * Every element in `ary[p .. i]` is less than or equal to the pivot. + // + // * Every element in `ary[i+1 .. j-1]` is greater than the pivot. + for (var j = p; j < r; j++) { + if (comparator(ary[j], pivot) <= 0) { + i += 1; + swap(ary, i, j); + } + } + + swap(ary, i + 1, j); + var q = i + 1; + + // (2) Recurse on each half. + + doQuickSort(ary, comparator, p, q - 1); + doQuickSort(ary, comparator, q + 1, r); + } +} + +/** + * Sort the given array in-place with the given comparator function. + * + * @param {Array} ary + * An array to sort. + * @param {function} comparator + * Function to use to compare two items. + */ +exports.quickSort = function (ary, comparator) { + doQuickSort(ary, comparator, 0, ary.length - 1); +}; + + +/***/ }), +/* 174 */ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +var SourceMapGenerator = (__webpack_require__(165).SourceMapGenerator); +var util = __webpack_require__(168); + +// Matches a Windows-style `\r\n` newline or a `\n` newline used by all other +// operating systems these days (capturing the result). +var REGEX_NEWLINE = /(\r?\n)/; + +// Newline character code for charCodeAt() comparisons +var NEWLINE_CODE = 10; + +// Private symbol for identifying `SourceNode`s when multiple versions of +// the source-map library are loaded. This MUST NOT CHANGE across +// versions! +var isSourceNode = "$$$isSourceNode$$$"; + +/** + * SourceNodes provide a way to abstract over interpolating/concatenating + * snippets of generated JavaScript source code while maintaining the line and + * column information associated with the original source code. + * + * @param aLine The original line number. + * @param aColumn The original column number. + * @param aSource The original source's filename. + * @param aChunks Optional. An array of strings which are snippets of + * generated JS, or other SourceNodes. + * @param aName The original identifier. + */ +function SourceNode(aLine, aColumn, aSource, aChunks, aName) { + this.children = []; + this.sourceContents = {}; + this.line = aLine == null ? null : aLine; + this.column = aColumn == null ? null : aColumn; + this.source = aSource == null ? null : aSource; + this.name = aName == null ? null : aName; + this[isSourceNode] = true; + if (aChunks != null) this.add(aChunks); +} + +/** + * Creates a SourceNode from generated code and a SourceMapConsumer. + * + * @param aGeneratedCode The generated code + * @param aSourceMapConsumer The SourceMap for the generated code + * @param aRelativePath Optional. The path that relative sources in the + * SourceMapConsumer should be relative to. + */ +SourceNode.fromStringWithSourceMap = + function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) { + // The SourceNode we want to fill with the generated code + // and the SourceMap + var node = new SourceNode(); + + // All even indices of this array are one line of the generated code, + // while all odd indices are the newlines between two adjacent lines + // (since `REGEX_NEWLINE` captures its match). + // Processed fragments are accessed by calling `shiftNextLine`. + var remainingLines = aGeneratedCode.split(REGEX_NEWLINE); + var remainingLinesIndex = 0; + var shiftNextLine = function() { + var lineContents = getNextLine(); + // The last line of a file might not have a newline. + var newLine = getNextLine() || ""; + return lineContents + newLine; + + function getNextLine() { + return remainingLinesIndex < remainingLines.length ? + remainingLines[remainingLinesIndex++] : undefined; + } + }; + + // We need to remember the position of "remainingLines" + var lastGeneratedLine = 1, lastGeneratedColumn = 0; + + // The generate SourceNodes we need a code range. + // To extract it current and last mapping is used. + // Here we store the last mapping. + var lastMapping = null; + + aSourceMapConsumer.eachMapping(function (mapping) { + if (lastMapping !== null) { + // We add the code from "lastMapping" to "mapping": + // First check if there is a new line in between. + if (lastGeneratedLine < mapping.generatedLine) { + // Associate first line with "lastMapping" + addMappingWithCode(lastMapping, shiftNextLine()); + lastGeneratedLine++; + lastGeneratedColumn = 0; + // The remaining code is added without mapping + } else { + // There is no new line in between. + // Associate the code between "lastGeneratedColumn" and + // "mapping.generatedColumn" with "lastMapping" + var nextLine = remainingLines[remainingLinesIndex]; + var code = nextLine.substr(0, mapping.generatedColumn - + lastGeneratedColumn); + remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn - + lastGeneratedColumn); + lastGeneratedColumn = mapping.generatedColumn; + addMappingWithCode(lastMapping, code); + // No more remaining code, continue + lastMapping = mapping; + return; + } + } + // We add the generated code until the first mapping + // to the SourceNode without any mapping. + // Each line is added as separate string. + while (lastGeneratedLine < mapping.generatedLine) { + node.add(shiftNextLine()); + lastGeneratedLine++; + } + if (lastGeneratedColumn < mapping.generatedColumn) { + var nextLine = remainingLines[remainingLinesIndex]; + node.add(nextLine.substr(0, mapping.generatedColumn)); + remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn); + lastGeneratedColumn = mapping.generatedColumn; + } + lastMapping = mapping; + }, this); + // We have processed all mappings. + if (remainingLinesIndex < remainingLines.length) { + if (lastMapping) { + // Associate the remaining code in the current line with "lastMapping" + addMappingWithCode(lastMapping, shiftNextLine()); + } + // and add the remaining lines without any mapping + node.add(remainingLines.splice(remainingLinesIndex).join("")); + } + + // Copy sourcesContent into SourceNode + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + if (aRelativePath != null) { + sourceFile = util.join(aRelativePath, sourceFile); + } + node.setSourceContent(sourceFile, content); + } + }); + + return node; + + function addMappingWithCode(mapping, code) { + if (mapping === null || mapping.source === undefined) { + node.add(code); + } else { + var source = aRelativePath + ? util.join(aRelativePath, mapping.source) + : mapping.source; + node.add(new SourceNode(mapping.originalLine, + mapping.originalColumn, + source, + code, + mapping.name)); + } + } + }; + +/** + * Add a chunk of generated JS to this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ +SourceNode.prototype.add = function SourceNode_add(aChunk) { + if (Array.isArray(aChunk)) { + aChunk.forEach(function (chunk) { + this.add(chunk); + }, this); + } + else if (aChunk[isSourceNode] || typeof aChunk === "string") { + if (aChunk) { + this.children.push(aChunk); + } + } + else { + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk + ); + } + return this; +}; + +/** + * Add a chunk of generated JS to the beginning of this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ +SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) { + if (Array.isArray(aChunk)) { + for (var i = aChunk.length-1; i >= 0; i--) { + this.prepend(aChunk[i]); + } + } + else if (aChunk[isSourceNode] || typeof aChunk === "string") { + this.children.unshift(aChunk); + } + else { + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk + ); + } + return this; +}; + +/** + * Walk over the tree of JS snippets in this node and its children. The + * walking function is called once for each snippet of JS and is passed that + * snippet and the its original associated source's line/column location. + * + * @param aFn The traversal function. + */ +SourceNode.prototype.walk = function SourceNode_walk(aFn) { + var chunk; + for (var i = 0, len = this.children.length; i < len; i++) { + chunk = this.children[i]; + if (chunk[isSourceNode]) { + chunk.walk(aFn); + } + else { + if (chunk !== '') { + aFn(chunk, { source: this.source, + line: this.line, + column: this.column, + name: this.name }); + } + } + } +}; + +/** + * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between + * each of `this.children`. + * + * @param aSep The separator. + */ +SourceNode.prototype.join = function SourceNode_join(aSep) { + var newChildren; + var i; + var len = this.children.length; + if (len > 0) { + newChildren = []; + for (i = 0; i < len-1; i++) { + newChildren.push(this.children[i]); + newChildren.push(aSep); + } + newChildren.push(this.children[i]); + this.children = newChildren; + } + return this; +}; + +/** + * Call String.prototype.replace on the very right-most source snippet. Useful + * for trimming whitespace from the end of a source node, etc. + * + * @param aPattern The pattern to replace. + * @param aReplacement The thing to replace the pattern with. + */ +SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) { + var lastChild = this.children[this.children.length - 1]; + if (lastChild[isSourceNode]) { + lastChild.replaceRight(aPattern, aReplacement); + } + else if (typeof lastChild === 'string') { + this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement); + } + else { + this.children.push(''.replace(aPattern, aReplacement)); + } + return this; +}; + +/** + * Set the source content for a source file. This will be added to the SourceMapGenerator + * in the sourcesContent field. + * + * @param aSourceFile The filename of the source file + * @param aSourceContent The content of the source file + */ +SourceNode.prototype.setSourceContent = + function SourceNode_setSourceContent(aSourceFile, aSourceContent) { + this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent; + }; + +/** + * Walk over the tree of SourceNodes. The walking function is called for each + * source file content and is passed the filename and source content. + * + * @param aFn The traversal function. + */ +SourceNode.prototype.walkSourceContents = + function SourceNode_walkSourceContents(aFn) { + for (var i = 0, len = this.children.length; i < len; i++) { + if (this.children[i][isSourceNode]) { + this.children[i].walkSourceContents(aFn); + } + } + + var sources = Object.keys(this.sourceContents); + for (var i = 0, len = sources.length; i < len; i++) { + aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]); + } + }; + +/** + * Return the string representation of this source node. Walks over the tree + * and concatenates all the various snippets together to one string. + */ +SourceNode.prototype.toString = function SourceNode_toString() { + var str = ""; + this.walk(function (chunk) { + str += chunk; + }); + return str; +}; + +/** + * Returns the string representation of this source node along with a source + * map. + */ +SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) { + var generated = { + code: "", + line: 1, + column: 0 + }; + var map = new SourceMapGenerator(aArgs); + var sourceMappingActive = false; + var lastOriginalSource = null; + var lastOriginalLine = null; + var lastOriginalColumn = null; + var lastOriginalName = null; + this.walk(function (chunk, original) { + generated.code += chunk; + if (original.source !== null + && original.line !== null + && original.column !== null) { + if(lastOriginalSource !== original.source + || lastOriginalLine !== original.line + || lastOriginalColumn !== original.column + || lastOriginalName !== original.name) { + map.addMapping({ + source: original.source, + original: { + line: original.line, + column: original.column + }, + generated: { + line: generated.line, + column: generated.column + }, + name: original.name + }); + } + lastOriginalSource = original.source; + lastOriginalLine = original.line; + lastOriginalColumn = original.column; + lastOriginalName = original.name; + sourceMappingActive = true; + } else if (sourceMappingActive) { + map.addMapping({ + generated: { + line: generated.line, + column: generated.column + } + }); + lastOriginalSource = null; + sourceMappingActive = false; + } + for (var idx = 0, length = chunk.length; idx < length; idx++) { + if (chunk.charCodeAt(idx) === NEWLINE_CODE) { + generated.line++; + generated.column = 0; + // Mappings end at eol + if (idx + 1 === length) { + lastOriginalSource = null; + sourceMappingActive = false; + } else if (sourceMappingActive) { + map.addMapping({ + source: original.source, + original: { + line: original.line, + column: original.column + }, + generated: { + line: generated.line, + column: generated.column + }, + name: original.name + }); + } + } else { + generated.column++; + } + } + }); + this.walkSourceContents(function (sourceFile, sourceContent) { + map.setSourceContent(sourceFile, sourceContent); + }); + + return { code: generated.code, map: map }; +}; + +exports.SourceNode = SourceNode; + + +/***/ }), +/* 175 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var sourceMappingURL = __webpack_require__(176) + +var resolveUrl = __webpack_require__(177) +var decodeUriComponent = __webpack_require__(179) +var urix = __webpack_require__(181) +var atob = __webpack_require__(182) + + + +function callbackAsync(callback, error, result) { + setImmediate(function() { callback(error, result) }) +} + +function parseMapToJSON(string, data) { + try { + return JSON.parse(string.replace(/^\)\]\}'/, "")) + } catch (error) { + error.sourceMapData = data + throw error + } +} + +function readSync(read, url, data) { + var readUrl = decodeUriComponent(url) + try { + return String(read(readUrl)) + } catch (error) { + error.sourceMapData = data + throw error + } +} + + + +function resolveSourceMap(code, codeUrl, read, callback) { + var mapData + try { + mapData = resolveSourceMapHelper(code, codeUrl) + } catch (error) { + return callbackAsync(callback, error) + } + if (!mapData || mapData.map) { + return callbackAsync(callback, null, mapData) + } + var readUrl = decodeUriComponent(mapData.url) + read(readUrl, function(error, result) { + if (error) { + error.sourceMapData = mapData + return callback(error) + } + mapData.map = String(result) + try { + mapData.map = parseMapToJSON(mapData.map, mapData) + } catch (error) { + return callback(error) + } + callback(null, mapData) + }) +} + +function resolveSourceMapSync(code, codeUrl, read) { + var mapData = resolveSourceMapHelper(code, codeUrl) + if (!mapData || mapData.map) { + return mapData + } + mapData.map = readSync(read, mapData.url, mapData) + mapData.map = parseMapToJSON(mapData.map, mapData) + return mapData +} + +var dataUriRegex = /^data:([^,;]*)(;[^,;]*)*(?:,(.*))?$/ + +/** + * The media type for JSON text is application/json. + * + * {@link https://tools.ietf.org/html/rfc8259#section-11 | IANA Considerations } + * + * `text/json` is non-standard media type + */ +var jsonMimeTypeRegex = /^(?:application|text)\/json$/ + +/** + * JSON text exchanged between systems that are not part of a closed ecosystem + * MUST be encoded using UTF-8. + * + * {@link https://tools.ietf.org/html/rfc8259#section-8.1 | Character Encoding} + */ +var jsonCharacterEncoding = "utf-8" + +function base64ToBuf(b64) { + var binStr = atob(b64) + var len = binStr.length + var arr = new Uint8Array(len) + for (var i = 0; i < len; i++) { + arr[i] = binStr.charCodeAt(i) + } + return arr +} + +function decodeBase64String(b64) { + if (typeof TextDecoder === "undefined" || typeof Uint8Array === "undefined") { + return atob(b64) + } + var buf = base64ToBuf(b64); + // Note: `decoder.decode` method will throw a `DOMException` with the + // `"EncodingError"` value when an coding error is found. + var decoder = new TextDecoder(jsonCharacterEncoding, {fatal: true}) + return decoder.decode(buf); +} + +function resolveSourceMapHelper(code, codeUrl) { + codeUrl = urix(codeUrl) + + var url = sourceMappingURL.getFrom(code) + if (!url) { + return null + } + + var dataUri = url.match(dataUriRegex) + if (dataUri) { + var mimeType = dataUri[1] || "text/plain" + var lastParameter = dataUri[2] || "" + var encoded = dataUri[3] || "" + var data = { + sourceMappingURL: url, + url: null, + sourcesRelativeTo: codeUrl, + map: encoded + } + if (!jsonMimeTypeRegex.test(mimeType)) { + var error = new Error("Unuseful data uri mime type: " + mimeType) + error.sourceMapData = data + throw error + } + try { + data.map = parseMapToJSON( + lastParameter === ";base64" ? decodeBase64String(encoded) : decodeURIComponent(encoded), + data + ) + } catch (error) { + error.sourceMapData = data + throw error + } + return data + } + + var mapUrl = resolveUrl(codeUrl, url) + return { + sourceMappingURL: url, + url: mapUrl, + sourcesRelativeTo: mapUrl, + map: null + } +} + + + +function resolveSources(map, mapUrl, read, options, callback) { + if (typeof options === "function") { + callback = options + options = {} + } + var pending = map.sources ? map.sources.length : 0 + var result = { + sourcesResolved: [], + sourcesContent: [] + } + + if (pending === 0) { + callbackAsync(callback, null, result) + return + } + + var done = function() { + pending-- + if (pending === 0) { + callback(null, result) + } + } + + resolveSourcesHelper(map, mapUrl, options, function(fullUrl, sourceContent, index) { + result.sourcesResolved[index] = fullUrl + if (typeof sourceContent === "string") { + result.sourcesContent[index] = sourceContent + callbackAsync(done, null) + } else { + var readUrl = decodeUriComponent(fullUrl) + read(readUrl, function(error, source) { + result.sourcesContent[index] = error ? error : String(source) + done() + }) + } + }) +} + +function resolveSourcesSync(map, mapUrl, read, options) { + var result = { + sourcesResolved: [], + sourcesContent: [] + } + + if (!map.sources || map.sources.length === 0) { + return result + } + + resolveSourcesHelper(map, mapUrl, options, function(fullUrl, sourceContent, index) { + result.sourcesResolved[index] = fullUrl + if (read !== null) { + if (typeof sourceContent === "string") { + result.sourcesContent[index] = sourceContent + } else { + var readUrl = decodeUriComponent(fullUrl) + try { + result.sourcesContent[index] = String(read(readUrl)) + } catch (error) { + result.sourcesContent[index] = error + } + } + } + }) + + return result +} + +var endingSlash = /\/?$/ + +function resolveSourcesHelper(map, mapUrl, options, fn) { + options = options || {} + mapUrl = urix(mapUrl) + var fullUrl + var sourceContent + var sourceRoot + for (var index = 0, len = map.sources.length; index < len; index++) { + sourceRoot = null + if (typeof options.sourceRoot === "string") { + sourceRoot = options.sourceRoot + } else if (typeof map.sourceRoot === "string" && options.sourceRoot !== false) { + sourceRoot = map.sourceRoot + } + // If the sourceRoot is the empty string, it is equivalent to not setting + // the property at all. + if (sourceRoot === null || sourceRoot === '') { + fullUrl = resolveUrl(mapUrl, map.sources[index]) + } else { + // Make sure that the sourceRoot ends with a slash, so that `/scripts/subdir` becomes + // `/scripts/subdir/`, not `/scripts/`. Pointing to a file as source root + // does not make sense. + fullUrl = resolveUrl(mapUrl, sourceRoot.replace(endingSlash, "/"), map.sources[index]) + } + sourceContent = (map.sourcesContent || [])[index] + fn(fullUrl, sourceContent, index) + } +} + + + +function resolve(code, codeUrl, read, options, callback) { + if (typeof options === "function") { + callback = options + options = {} + } + if (code === null) { + var mapUrl = codeUrl + var data = { + sourceMappingURL: null, + url: mapUrl, + sourcesRelativeTo: mapUrl, + map: null + } + var readUrl = decodeUriComponent(mapUrl) + read(readUrl, function(error, result) { + if (error) { + error.sourceMapData = data + return callback(error) + } + data.map = String(result) + try { + data.map = parseMapToJSON(data.map, data) + } catch (error) { + return callback(error) + } + _resolveSources(data) + }) + } else { + resolveSourceMap(code, codeUrl, read, function(error, mapData) { + if (error) { + return callback(error) + } + if (!mapData) { + return callback(null, null) + } + _resolveSources(mapData) + }) + } + + function _resolveSources(mapData) { + resolveSources(mapData.map, mapData.sourcesRelativeTo, read, options, function(error, result) { + if (error) { + return callback(error) + } + mapData.sourcesResolved = result.sourcesResolved + mapData.sourcesContent = result.sourcesContent + callback(null, mapData) + }) + } +} + +function resolveSync(code, codeUrl, read, options) { + var mapData + if (code === null) { + var mapUrl = codeUrl + mapData = { + sourceMappingURL: null, + url: mapUrl, + sourcesRelativeTo: mapUrl, + map: null + } + mapData.map = readSync(read, mapUrl, mapData) + mapData.map = parseMapToJSON(mapData.map, mapData) + } else { + mapData = resolveSourceMapSync(code, codeUrl, read) + if (!mapData) { + return null + } + } + var result = resolveSourcesSync(mapData.map, mapData.sourcesRelativeTo, read, options) + mapData.sourcesResolved = result.sourcesResolved + mapData.sourcesContent = result.sourcesContent + return mapData +} + + + +module.exports = { + resolveSourceMap: resolveSourceMap, + resolveSourceMapSync: resolveSourceMapSync, + resolveSources: resolveSources, + resolveSourcesSync: resolveSourcesSync, + resolve: resolve, + resolveSync: resolveSync, + parseMapToJSON: parseMapToJSON +} + + +/***/ }), +/* 176 */ +/***/ (function(module, exports, __webpack_require__) { + +var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;// Copyright 2014 Simon Lydell +// X11 (“MIT”) Licensed. (See LICENSE.) + +void (function(root, factory) { + if (true) { + !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory), + __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? + (__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) : + __WEBPACK_AMD_DEFINE_FACTORY__), + __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) + } else {} +}(this, function() { + + var innerRegex = /[#@] sourceMappingURL=([^\s'"]*)/ + + var regex = RegExp( + "(?:" + + "/\\*" + + "(?:\\s*\r?\n(?://)?)?" + + "(?:" + innerRegex.source + ")" + + "\\s*" + + "\\*/" + + "|" + + "//(?:" + innerRegex.source + ")" + + ")" + + "\\s*" + ) + + return { + + regex: regex, + _innerRegex: innerRegex, + + getFrom: function(code) { + var match = code.match(regex) + return (match ? match[1] || match[2] || "" : null) + }, + + existsIn: function(code) { + return regex.test(code) + }, + + removeFrom: function(code) { + return code.replace(regex, "") + }, + + insertBefore: function(code, string) { + var match = code.match(regex) + if (match) { + return code.slice(0, match.index) + string + code.slice(match.index) + } else { + return code + string + } + } + } + +})); + + +/***/ }), +/* 177 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var url = __webpack_require__(178) + +function resolveUrl(/* ...urls */) { + return Array.prototype.reduce.call(arguments, function(resolved, nextUrl) { + return url.resolve(resolved, nextUrl) + }) +} + +module.exports = resolveUrl + + +/***/ }), +/* 178 */ +/***/ ((module) => { + +"use strict"; +module.exports = require("url"); + +/***/ }), +/* 179 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var decodeUriComponent = __webpack_require__(180) + +function customDecodeUriComponent(string) { + // `decodeUriComponent` turns `+` into ` `, but that's not wanted. + return decodeUriComponent(string.replace(/\+/g, "%2B")) +} + +module.exports = customDecodeUriComponent + + +/***/ }), +/* 180 */ +/***/ ((module) => { + +"use strict"; + +var token = '%[a-f0-9]{2}'; +var singleMatcher = new RegExp('(' + token + ')|([^%]+?)', 'gi'); +var multiMatcher = new RegExp('(' + token + ')+', 'gi'); + +function decodeComponents(components, split) { + try { + // Try to decode the entire string first + return [decodeURIComponent(components.join(''))]; + } catch (err) { + // Do nothing + } + + if (components.length === 1) { + return components; + } + + split = split || 1; + + // Split the array in 2 parts + var left = components.slice(0, split); + var right = components.slice(split); + + return Array.prototype.concat.call([], decodeComponents(left), decodeComponents(right)); +} + +function decode(input) { + try { + return decodeURIComponent(input); + } catch (err) { + var tokens = input.match(singleMatcher) || []; + + for (var i = 1; i < tokens.length; i++) { + input = decodeComponents(tokens, i).join(''); + + tokens = input.match(singleMatcher) || []; + } + + return input; + } +} + +function customDecodeURIComponent(input) { + // Keep track of all the replacements and prefill the map with the `BOM` + var replaceMap = { + '%FE%FF': '\uFFFD\uFFFD', + '%FF%FE': '\uFFFD\uFFFD' + }; + + var match = multiMatcher.exec(input); + while (match) { + try { + // Decode as big chunks as possible + replaceMap[match[0]] = decodeURIComponent(match[0]); + } catch (err) { + var result = decode(match[0]); + + if (result !== match[0]) { + replaceMap[match[0]] = result; + } + } + + match = multiMatcher.exec(input); + } + + // Add `%C2` at the end of the map to make sure it does not replace the combinator before everything else + replaceMap['%C2'] = '\uFFFD'; + + var entries = Object.keys(replaceMap); + + for (var i = 0; i < entries.length; i++) { + // Replace all decoded components + var key = entries[i]; + input = input.replace(new RegExp(key, 'g'), replaceMap[key]); + } + + return input; +} + +module.exports = function (encodedURI) { + if (typeof encodedURI !== 'string') { + throw new TypeError('Expected `encodedURI` to be of type `string`, got `' + typeof encodedURI + '`'); + } + + try { + encodedURI = encodedURI.replace(/\+/g, ' '); + + // Try the built in decoder first + return decodeURIComponent(encodedURI); + } catch (err) { + // Fallback to a more advanced decoder + return customDecodeURIComponent(encodedURI); + } +}; + + +/***/ }), +/* 181 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +// Copyright 2014 Simon Lydell +// X11 (“MIT”) Licensed. (See LICENSE.) + +var path = __webpack_require__(3) + +"use strict" + +function urix(aPath) { + if (path.sep === "\\") { + return aPath + .replace(/\\/g, "/") + .replace(/^[a-z]:\/?/i, "/") + } + return aPath +} + +module.exports = urix + + +/***/ }), +/* 182 */ +/***/ ((module) => { + +"use strict"; + + +function atob(str) { + return Buffer.from(str, 'base64').toString('binary'); +} + +module.exports = atob.atob = atob; + + +/***/ }), +/* 183 */ +/***/ ((module, exports, __webpack_require__) => { + +"use strict"; + + +var fs = __webpack_require__(11); +var path = __webpack_require__(3); +var define = __webpack_require__(148); +var utils = __webpack_require__(163); + +/** + * Expose `mixin()`. + * This code is based on `source-maps-support.js` in reworkcss/css + * https://github.com/reworkcss/css/blob/master/lib/stringify/source-map-support.js + * Copyright (c) 2012 TJ Holowaychuk + */ + +module.exports = mixin; + +/** + * Mixin source map support into `compiler`. + * + * @param {Object} `compiler` + * @api public + */ + +function mixin(compiler) { + define(compiler, '_comment', compiler.comment); + compiler.map = new utils.SourceMap.SourceMapGenerator(); + compiler.position = { line: 1, column: 1 }; + compiler.content = {}; + compiler.files = {}; + + for (var key in exports) { + define(compiler, key, exports[key]); + } +} + +/** + * Update position. + * + * @param {String} str + */ + +exports.updatePosition = function(str) { + var lines = str.match(/\n/g); + if (lines) this.position.line += lines.length; + var i = str.lastIndexOf('\n'); + this.position.column = ~i ? str.length - i : this.position.column + str.length; +}; + +/** + * Emit `str` with `position`. + * + * @param {String} str + * @param {Object} [pos] + * @return {String} + */ + +exports.emit = function(str, node) { + var position = node.position || {}; + var source = position.source; + if (source) { + if (position.filepath) { + source = utils.unixify(position.filepath); + } + + this.map.addMapping({ + source: source, + generated: { + line: this.position.line, + column: Math.max(this.position.column - 1, 0) + }, + original: { + line: position.start.line, + column: position.start.column - 1 + } + }); + + if (position.content) { + this.addContent(source, position); + } + if (position.filepath) { + this.addFile(source, position); + } + + this.updatePosition(str); + this.output += str; + } + return str; +}; + +/** + * Adds a file to the source map output if it has not already been added + * @param {String} `file` + * @param {Object} `pos` + */ + +exports.addFile = function(file, position) { + if (typeof position.content !== 'string') return; + if (Object.prototype.hasOwnProperty.call(this.files, file)) return; + this.files[file] = position.content; +}; + +/** + * Adds a content source to the source map output if it has not already been added + * @param {String} `source` + * @param {Object} `position` + */ + +exports.addContent = function(source, position) { + if (typeof position.content !== 'string') return; + if (Object.prototype.hasOwnProperty.call(this.content, source)) return; + this.map.setSourceContent(source, position.content); +}; + +/** + * Applies any original source maps to the output and embeds the source file + * contents in the source map. + */ + +exports.applySourceMaps = function() { + Object.keys(this.files).forEach(function(file) { + var content = this.files[file]; + this.map.setSourceContent(file, content); + + if (this.options.inputSourcemaps === true) { + var originalMap = utils.sourceMapResolve.resolveSync(content, file, fs.readFileSync); + if (originalMap) { + var map = new utils.SourceMap.SourceMapConsumer(originalMap.map); + var relativeTo = originalMap.sourcesRelativeTo; + this.map.applySourceMap(map, file, utils.unixify(path.dirname(relativeTo))); + } + } + }, this); +}; + +/** + * Process comments, drops sourceMap comments. + * @param {Object} node + */ + +exports.comment = function(node) { + if (/^# sourceMappingURL=/.test(node.comment)) { + return this.emit('', node.position); + } + return this._comment(node); +}; + + +/***/ }), +/* 184 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var use = __webpack_require__(155); +var util = __webpack_require__(17); +var Cache = __webpack_require__(185); +var define = __webpack_require__(148); +var debug = __webpack_require__(156)('snapdragon:parser'); +var Position = __webpack_require__(186); +var utils = __webpack_require__(163); + +/** + * Create a new `Parser` with the given `input` and `options`. + * @param {String} `input` + * @param {Object} `options` + * @api public + */ + +function Parser(options) { + debug('initializing', __filename); + this.options = utils.extend({source: 'string'}, options); + this.init(this.options); + use(this); +} + +/** + * Prototype methods + */ + +Parser.prototype = { + constructor: Parser, + + init: function(options) { + this.orig = ''; + this.input = ''; + this.parsed = ''; + + this.column = 1; + this.line = 1; + + this.regex = new Cache(); + this.errors = this.errors || []; + this.parsers = this.parsers || {}; + this.types = this.types || []; + this.sets = this.sets || {}; + this.fns = this.fns || []; + this.currentType = 'root'; + + var pos = this.position(); + this.bos = pos({type: 'bos', val: ''}); + + this.ast = { + type: 'root', + errors: this.errors, + nodes: [this.bos] + }; + + define(this.bos, 'parent', this.ast); + this.nodes = [this.ast]; + + this.count = 0; + this.setCount = 0; + this.stack = []; + }, + + /** + * Throw a formatted error with the cursor column and `msg`. + * @param {String} `msg` Message to use in the Error. + */ + + error: function(msg, node) { + var pos = node.position || {start: {column: 0, line: 0}}; + var line = pos.start.line; + var column = pos.start.column; + var source = this.options.source; + + var message = source + ' : ' + msg; + var err = new Error(message); + err.source = source; + err.reason = msg; + err.pos = pos; + + if (this.options.silent) { + this.errors.push(err); + } else { + throw err; + } + }, + + /** + * Define a non-enumberable property on the `Parser` instance. + * + * ```js + * parser.define('foo', 'bar'); + * ``` + * @name .define + * @param {String} `key` propery name + * @param {any} `val` property value + * @return {Object} Returns the Parser instance for chaining. + * @api public + */ + + define: function(key, val) { + define(this, key, val); + return this; + }, + + /** + * Mark position and patch `node.position`. + */ + + position: function() { + var start = { line: this.line, column: this.column }; + var self = this; + + return function(node) { + define(node, 'position', new Position(start, self)); + return node; + }; + }, + + /** + * Set parser `name` with the given `fn` + * @param {String} `name` + * @param {Function} `fn` + * @api public + */ + + set: function(type, fn) { + if (this.types.indexOf(type) === -1) { + this.types.push(type); + } + this.parsers[type] = fn.bind(this); + return this; + }, + + /** + * Get parser `name` + * @param {String} `name` + * @api public + */ + + get: function(name) { + return this.parsers[name]; + }, + + /** + * Push a `token` onto the `type` stack. + * + * @param {String} `type` + * @return {Object} `token` + * @api public + */ + + push: function(type, token) { + this.sets[type] = this.sets[type] || []; + this.count++; + this.stack.push(token); + return this.sets[type].push(token); + }, + + /** + * Pop a token off of the `type` stack + * @param {String} `type` + * @returns {Object} Returns a token + * @api public + */ + + pop: function(type) { + this.sets[type] = this.sets[type] || []; + this.count--; + this.stack.pop(); + return this.sets[type].pop(); + }, + + /** + * Return true if inside a `stack` node. Types are `braces`, `parens` or `brackets`. + * + * @param {String} `type` + * @return {Boolean} + * @api public + */ + + isInside: function(type) { + this.sets[type] = this.sets[type] || []; + return this.sets[type].length > 0; + }, + + /** + * Return true if `node` is the given `type`. + * + * ```js + * parser.isType(node, 'brace'); + * ``` + * @param {Object} `node` + * @param {String} `type` + * @return {Boolean} + * @api public + */ + + isType: function(node, type) { + return node && node.type === type; + }, + + /** + * Get the previous AST node + * @return {Object} + */ + + prev: function(n) { + return this.stack.length > 0 + ? utils.last(this.stack, n) + : utils.last(this.nodes, n); + }, + + /** + * Update line and column based on `str`. + */ + + consume: function(len) { + this.input = this.input.substr(len); + }, + + /** + * Update column based on `str`. + */ + + updatePosition: function(str, len) { + var lines = str.match(/\n/g); + if (lines) this.line += lines.length; + var i = str.lastIndexOf('\n'); + this.column = ~i ? len - i : this.column + len; + this.parsed += str; + this.consume(len); + }, + + /** + * Match `regex`, return captures, and update the cursor position by `match[0]` length. + * @param {RegExp} `regex` + * @return {Object} + */ + + match: function(regex) { + var m = regex.exec(this.input); + if (m) { + this.updatePosition(m[0], m[0].length); + return m; + } + }, + + /** + * Capture `type` with the given regex. + * @param {String} `type` + * @param {RegExp} `regex` + * @return {Function} + */ + + capture: function(type, regex) { + if (typeof regex === 'function') { + return this.set.apply(this, arguments); + } + + this.regex.set(type, regex); + this.set(type, function() { + var parsed = this.parsed; + var pos = this.position(); + var m = this.match(regex); + if (!m || !m[0]) return; + + var prev = this.prev(); + var node = pos({ + type: type, + val: m[0], + parsed: parsed, + rest: this.input + }); + + if (m[1]) { + node.inner = m[1]; + } + + define(node, 'inside', this.stack.length > 0); + define(node, 'parent', prev); + prev.nodes.push(node); + }.bind(this)); + return this; + }, + + /** + * Create a parser with open and close for parens, + * brackets or braces + */ + + capturePair: function(type, openRegex, closeRegex, fn) { + this.sets[type] = this.sets[type] || []; + + /** + * Open + */ + + this.set(type + '.open', function() { + var parsed = this.parsed; + var pos = this.position(); + var m = this.match(openRegex); + if (!m || !m[0]) return; + + var val = m[0]; + this.setCount++; + this.specialChars = true; + var open = pos({ + type: type + '.open', + val: val, + rest: this.input + }); + + if (typeof m[1] !== 'undefined') { + open.inner = m[1]; + } + + var prev = this.prev(); + var node = pos({ + type: type, + nodes: [open] + }); + + define(node, 'rest', this.input); + define(node, 'parsed', parsed); + define(node, 'prefix', m[1]); + define(node, 'parent', prev); + define(open, 'parent', node); + + if (typeof fn === 'function') { + fn.call(this, open, node); + } + + this.push(type, node); + prev.nodes.push(node); + }); + + /** + * Close + */ + + this.set(type + '.close', function() { + var pos = this.position(); + var m = this.match(closeRegex); + if (!m || !m[0]) return; + + var parent = this.pop(type); + var node = pos({ + type: type + '.close', + rest: this.input, + suffix: m[1], + val: m[0] + }); + + if (!this.isType(parent, type)) { + if (this.options.strict) { + throw new Error('missing opening "' + type + '"'); + } + + this.setCount--; + node.escaped = true; + return node; + } + + if (node.suffix === '\\') { + parent.escaped = true; + node.escaped = true; + } + + parent.nodes.push(node); + define(node, 'parent', parent); + }); + + return this; + }, + + /** + * Capture end-of-string + */ + + eos: function() { + var pos = this.position(); + if (this.input) return; + var prev = this.prev(); + + while (prev.type !== 'root' && !prev.visited) { + if (this.options.strict === true) { + throw new SyntaxError('invalid syntax:' + util.inspect(prev, null, 2)); + } + + if (!hasDelims(prev)) { + prev.parent.escaped = true; + prev.escaped = true; + } + + visit(prev, function(node) { + if (!hasDelims(node.parent)) { + node.parent.escaped = true; + node.escaped = true; + } + }); + + prev = prev.parent; + } + + var tok = pos({ + type: 'eos', + val: this.append || '' + }); + + define(tok, 'parent', this.ast); + return tok; + }, + + /** + * Run parsers to advance the cursor position + */ + + next: function() { + var parsed = this.parsed; + var len = this.types.length; + var idx = -1; + var tok; + + while (++idx < len) { + if ((tok = this.parsers[this.types[idx]].call(this))) { + define(tok, 'rest', this.input); + define(tok, 'parsed', parsed); + this.last = tok; + return tok; + } + } + }, + + /** + * Parse the given string. + * @return {Array} + */ + + parse: function(input) { + if (typeof input !== 'string') { + throw new TypeError('expected a string'); + } + + this.init(this.options); + this.orig = input; + this.input = input; + var self = this; + + function parse() { + // check input before calling `.next()` + input = self.input; + + // get the next AST ndoe + var node = self.next(); + if (node) { + var prev = self.prev(); + if (prev) { + define(node, 'parent', prev); + if (prev.nodes) { + prev.nodes.push(node); + } + } + + if (self.sets.hasOwnProperty(prev.type)) { + self.currentType = prev.type; + } + } + + // if we got here but input is not changed, throw an error + if (self.input && input === self.input) { + throw new Error('no parsers registered for: "' + self.input.slice(0, 5) + '"'); + } + } + + while (this.input) parse(); + if (this.stack.length && this.options.strict) { + var node = this.stack.pop(); + throw this.error('missing opening ' + node.type + ': "' + this.orig + '"'); + } + + var eos = this.eos(); + var tok = this.prev(); + if (tok.type !== 'eos') { + this.ast.nodes.push(eos); + } + + return this.ast; + } +}; + +/** + * Visit `node` with the given `fn` + */ + +function visit(node, fn) { + if (!node.visited) { + define(node, 'visited', true); + return node.nodes ? mapVisit(node.nodes, fn) : fn(node); + } + return node; +} + +/** + * Map visit over array of `nodes`. + */ + +function mapVisit(nodes, fn) { + var len = nodes.length; + var idx = -1; + while (++idx < len) { + visit(nodes[idx], fn); + } +} + +function hasOpen(node) { + return node.nodes && node.nodes[0].type === (node.type + '.open'); +} + +function hasClose(node) { + return node.nodes && utils.last(node.nodes).type === (node.type + '.close'); +} + +function hasDelims(node) { + return hasOpen(node) && hasClose(node); +} + +/** + * Expose `Parser` + */ + +module.exports = Parser; + + +/***/ }), +/* 185 */ +/***/ ((module) => { + +"use strict"; +/*! + * map-cache + * + * Copyright (c) 2015, Jon Schlinkert. + * Licensed under the MIT License. + */ + + + +var hasOwn = Object.prototype.hasOwnProperty; + +/** + * Expose `MapCache` + */ + +module.exports = MapCache; + +/** + * Creates a cache object to store key/value pairs. + * + * ```js + * var cache = new MapCache(); + * ``` + * + * @api public + */ + +function MapCache(data) { + this.__data__ = data || {}; +} + +/** + * Adds `value` to `key` on the cache. + * + * ```js + * cache.set('foo', 'bar'); + * ``` + * + * @param {String} `key` The key of the value to cache. + * @param {*} `value` The value to cache. + * @returns {Object} Returns the `Cache` object for chaining. + * @api public + */ + +MapCache.prototype.set = function mapSet(key, value) { + if (key !== '__proto__') { + this.__data__[key] = value; + } + return this; +}; + +/** + * Gets the cached value for `key`. + * + * ```js + * cache.get('foo'); + * //=> 'bar' + * ``` + * + * @param {String} `key` The key of the value to get. + * @returns {*} Returns the cached value. + * @api public + */ + +MapCache.prototype.get = function mapGet(key) { + return key === '__proto__' ? undefined : this.__data__[key]; +}; + +/** + * Checks if a cached value for `key` exists. + * + * ```js + * cache.has('foo'); + * //=> true + * ``` + * + * @param {String} `key` The key of the entry to check. + * @returns {Boolean} Returns `true` if an entry for `key` exists, else `false`. + * @api public + */ + +MapCache.prototype.has = function mapHas(key) { + return key !== '__proto__' && hasOwn.call(this.__data__, key); +}; + +/** + * Removes `key` and its value from the cache. + * + * ```js + * cache.del('foo'); + * ``` + * @title .del + * @param {String} `key` The key of the value to remove. + * @returns {Boolean} Returns `true` if the entry was removed successfully, else `false`. + * @api public + */ + +MapCache.prototype.del = function mapDelete(key) { + return this.has(key) && delete this.__data__[key]; +}; + + +/***/ }), +/* 186 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var define = __webpack_require__(148); + +/** + * Store position for a node + */ + +module.exports = function Position(start, parser) { + this.start = start; + this.end = { line: parser.line, column: parser.column }; + define(this, 'content', parser.orig); + define(this, 'source', parser.options.source); +}; + + +/***/ }), +/* 187 */ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +/** +* upath http://github.com/anodynos/upath/ +* +* A proxy to `path`, replacing `\` with `/` for all results & new methods to normalize & join keeping leading `./` and add, change, default, trim file extensions. +* Version 1.2.0 - Compiled on 2019-09-02 23:33:57 +* Repository git://github.com/anodynos/upath +* Copyright(c) 2019 Angelos Pikoulas +* License MIT +*/ + +// Generated by uRequire v0.7.0-beta.33 target: 'lib' template: 'nodejs' + + +var VERSION = '1.2.0'; // injected by urequire-rc-inject-version + +var extraFn, extraFunctions, isFunction, isString, isValidExt, name, path, propName, propValue, toUnix, upath, slice = [].slice, indexOf = [].indexOf || function (item) { + for (var i = 0, l = this.length; i < l; i++) { + if (i in this && this[i] === item) + return i; + } + return -1; + }, hasProp = {}.hasOwnProperty; +path = __webpack_require__(3); +isFunction = function (val) { + return val instanceof Function; +}; +isString = function (val) { + return typeof val === "string" || !!val && typeof val === "object" && Object.prototype.toString.call(val) === "[object String]"; +}; +upath = exports; +upath.VERSION = typeof VERSION !== "undefined" && VERSION !== null ? VERSION : "NO-VERSION"; +toUnix = function (p) { + var double; + p = p.replace(/\\/g, "/"); + double = /\/\//; + while (p.match(double)) { + p = p.replace(double, "/"); + } + return p; +}; +for (propName in path) { + propValue = path[propName]; + if (isFunction(propValue)) { + upath[propName] = function (propName) { + return function () { + var args, result; + args = 1 <= arguments.length ? slice.call(arguments, 0) : []; + args = args.map(function (p) { + if (isString(p)) { + return toUnix(p); + } else { + return p; + } + }); + result = path[propName].apply(path, args); + if (isString(result)) { + return toUnix(result); + } else { + return result; + } + }; + }(propName); + } else { + upath[propName] = propValue; + } +} +upath.sep = "/"; +extraFunctions = { + toUnix: toUnix, + normalizeSafe: function (p) { + p = toUnix(p); + if (p.startsWith("./")) { + if (p.startsWith("./..") || p === "./") { + return upath.normalize(p); + } else { + return "./" + upath.normalize(p); + } + } else { + return upath.normalize(p); + } + }, + normalizeTrim: function (p) { + p = upath.normalizeSafe(p); + if (p.endsWith("/")) { + return p.slice(0, +(p.length - 2) + 1 || 9000000000); + } else { + return p; + } + }, + joinSafe: function () { + var p, result; + p = 1 <= arguments.length ? slice.call(arguments, 0) : []; + result = upath.join.apply(null, p); + if (p[0].startsWith("./") && !result.startsWith("./")) { + result = "./" + result; + } + return result; + }, + addExt: function (file, ext) { + if (!ext) { + return file; + } else { + if (ext[0] !== ".") { + ext = "." + ext; + } + return file + (file.endsWith(ext) ? "" : ext); + } + }, + trimExt: function (filename, ignoreExts, maxSize) { + var oldExt; + if (maxSize == null) { + maxSize = 7; + } + oldExt = upath.extname(filename); + if (isValidExt(oldExt, ignoreExts, maxSize)) { + return filename.slice(0, +(filename.length - oldExt.length - 1) + 1 || 9000000000); + } else { + return filename; + } + }, + removeExt: function (filename, ext) { + if (!ext) { + return filename; + } else { + ext = ext[0] === "." ? ext : "." + ext; + if (upath.extname(filename) === ext) { + return upath.trimExt(filename); + } else { + return filename; + } + } + }, + changeExt: function (filename, ext, ignoreExts, maxSize) { + if (maxSize == null) { + maxSize = 7; + } + return upath.trimExt(filename, ignoreExts, maxSize) + (!ext ? "" : ext[0] === "." ? ext : "." + ext); + }, + defaultExt: function (filename, ext, ignoreExts, maxSize) { + var oldExt; + if (maxSize == null) { + maxSize = 7; + } + oldExt = upath.extname(filename); + if (isValidExt(oldExt, ignoreExts, maxSize)) { + return filename; + } else { + return upath.addExt(filename, ext); + } + } +}; +isValidExt = function (ext, ignoreExts, maxSize) { + if (ignoreExts == null) { + ignoreExts = []; + } + return ext && ext.length <= maxSize && indexOf.call(ignoreExts.map(function (e) { + return (e && e[0] !== "." ? "." : "") + e; + }), ext) < 0; +}; +for (name in extraFunctions) { + if (!hasProp.call(extraFunctions, name)) + continue; + extraFn = extraFunctions[name]; + if (upath[name] !== void 0) { + throw new Error("path." + name + " already exists."); + } else { + upath[name] = extraFn; + } +} + +; + +/***/ }), +/* 188 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var fs = __webpack_require__(11); +var sysPath = __webpack_require__(3); +var readdirp = __webpack_require__(189); +var isBinaryPath = __webpack_require__(247); + +// fs.watch helpers + +// object to hold per-process fs.watch instances +// (may be shared across chokidar FSWatcher instances) +var FsWatchInstances = Object.create(null); + + +// Private function: Instantiates the fs.watch interface + +// * path - string, path to be watched +// * options - object, options to be passed to fs.watch +// * listener - function, main event handler +// * errHandler - function, handler which emits info about errors +// * emitRaw - function, handler which emits raw event data + +// Returns new fsevents instance +function createFsWatchInstance(path, options, listener, errHandler, emitRaw) { + var handleEvent = function(rawEvent, evPath) { + listener(path); + emitRaw(rawEvent, evPath, {watchedPath: path}); + + // emit based on events occurring for files from a directory's watcher in + // case the file's watcher misses it (and rely on throttling to de-dupe) + if (evPath && path !== evPath) { + fsWatchBroadcast( + sysPath.resolve(path, evPath), 'listeners', sysPath.join(path, evPath) + ); + } + }; + try { + return fs.watch(path, options, handleEvent); + } catch (error) { + errHandler(error); + } +} + +// Private function: Helper for passing fs.watch event data to a +// collection of listeners + +// * fullPath - string, absolute path bound to the fs.watch instance +// * type - string, listener type +// * val[1..3] - arguments to be passed to listeners + +// Returns nothing +function fsWatchBroadcast(fullPath, type, val1, val2, val3) { + if (!FsWatchInstances[fullPath]) return; + FsWatchInstances[fullPath][type].forEach(function(listener) { + listener(val1, val2, val3); + }); +} + +// Private function: Instantiates the fs.watch interface or binds listeners +// to an existing one covering the same file system entry + +// * path - string, path to be watched +// * fullPath - string, absolute path +// * options - object, options to be passed to fs.watch +// * handlers - object, container for event listener functions + +// Returns close function +function setFsWatchListener(path, fullPath, options, handlers) { + var listener = handlers.listener; + var errHandler = handlers.errHandler; + var rawEmitter = handlers.rawEmitter; + var container = FsWatchInstances[fullPath]; + var watcher; + if (!options.persistent) { + watcher = createFsWatchInstance( + path, options, listener, errHandler, rawEmitter + ); + return watcher.close.bind(watcher); + } + if (!container) { + watcher = createFsWatchInstance( + path, + options, + fsWatchBroadcast.bind(null, fullPath, 'listeners'), + errHandler, // no need to use broadcast here + fsWatchBroadcast.bind(null, fullPath, 'rawEmitters') + ); + if (!watcher) return; + var broadcastErr = fsWatchBroadcast.bind(null, fullPath, 'errHandlers'); + watcher.on('error', function(error) { + container.watcherUnusable = true; // documented since Node 10.4.1 + // Workaround for https://github.com/joyent/node/issues/4337 + if (process.platform === 'win32' && error.code === 'EPERM') { + fs.open(path, 'r', function(err, fd) { + if (!err) fs.close(fd, function(err) { + if (!err) broadcastErr(error); + }); + }); + } else { + broadcastErr(error); + } + }); + container = FsWatchInstances[fullPath] = { + listeners: [listener], + errHandlers: [errHandler], + rawEmitters: [rawEmitter], + watcher: watcher + }; + } else { + container.listeners.push(listener); + container.errHandlers.push(errHandler); + container.rawEmitters.push(rawEmitter); + } + var listenerIndex = container.listeners.length - 1; + + // removes this instance's listeners and closes the underlying fs.watch + // instance if there are no more listeners left + return function close() { + delete container.listeners[listenerIndex]; + delete container.errHandlers[listenerIndex]; + delete container.rawEmitters[listenerIndex]; + if (!Object.keys(container.listeners).length) { + if (!container.watcherUnusable) { // check to protect against issue #730 + container.watcher.close(); + } + delete FsWatchInstances[fullPath]; + } + }; +} + +// fs.watchFile helpers + +// object to hold per-process fs.watchFile instances +// (may be shared across chokidar FSWatcher instances) +var FsWatchFileInstances = Object.create(null); + +// Private function: Instantiates the fs.watchFile interface or binds listeners +// to an existing one covering the same file system entry + +// * path - string, path to be watched +// * fullPath - string, absolute path +// * options - object, options to be passed to fs.watchFile +// * handlers - object, container for event listener functions + +// Returns close function +function setFsWatchFileListener(path, fullPath, options, handlers) { + var listener = handlers.listener; + var rawEmitter = handlers.rawEmitter; + var container = FsWatchFileInstances[fullPath]; + var listeners = []; + var rawEmitters = []; + if ( + container && ( + container.options.persistent < options.persistent || + container.options.interval > options.interval + ) + ) { + // "Upgrade" the watcher to persistence or a quicker interval. + // This creates some unlikely edge case issues if the user mixes + // settings in a very weird way, but solving for those cases + // doesn't seem worthwhile for the added complexity. + listeners = container.listeners; + rawEmitters = container.rawEmitters; + fs.unwatchFile(fullPath); + container = false; + } + if (!container) { + listeners.push(listener); + rawEmitters.push(rawEmitter); + container = FsWatchFileInstances[fullPath] = { + listeners: listeners, + rawEmitters: rawEmitters, + options: options, + watcher: fs.watchFile(fullPath, options, function(curr, prev) { + container.rawEmitters.forEach(function(rawEmitter) { + rawEmitter('change', fullPath, {curr: curr, prev: prev}); + }); + var currmtime = curr.mtime.getTime(); + if (curr.size !== prev.size || currmtime > prev.mtime.getTime() || currmtime === 0) { + container.listeners.forEach(function(listener) { + listener(path, curr); + }); + } + }) + }; + } else { + container.listeners.push(listener); + container.rawEmitters.push(rawEmitter); + } + var listenerIndex = container.listeners.length - 1; + + // removes this instance's listeners and closes the underlying fs.watchFile + // instance if there are no more listeners left + return function close() { + delete container.listeners[listenerIndex]; + delete container.rawEmitters[listenerIndex]; + if (!Object.keys(container.listeners).length) { + fs.unwatchFile(fullPath); + delete FsWatchFileInstances[fullPath]; + } + }; +} + +// fake constructor for attaching nodefs-specific prototype methods that +// will be copied to FSWatcher's prototype +function NodeFsHandler() {} + +// Private method: Watch file for changes with fs.watchFile or fs.watch. + +// * path - string, path to file or directory. +// * listener - function, to be executed on fs change. + +// Returns close function for the watcher instance +NodeFsHandler.prototype._watchWithNodeFs = +function(path, listener) { + var directory = sysPath.dirname(path); + var basename = sysPath.basename(path); + var parent = this._getWatchedDir(directory); + parent.add(basename); + var absolutePath = sysPath.resolve(path); + var options = {persistent: this.options.persistent}; + if (!listener) listener = Function.prototype; // empty function + + var closer; + if (this.options.usePolling) { + options.interval = this.enableBinaryInterval && isBinaryPath(basename) ? + this.options.binaryInterval : this.options.interval; + closer = setFsWatchFileListener(path, absolutePath, options, { + listener: listener, + rawEmitter: this.emit.bind(this, 'raw') + }); + } else { + closer = setFsWatchListener(path, absolutePath, options, { + listener: listener, + errHandler: this._handleError.bind(this), + rawEmitter: this.emit.bind(this, 'raw') + }); + } + return closer; +}; + +// Private method: Watch a file and emit add event if warranted + +// * file - string, the file's path +// * stats - object, result of fs.stat +// * initialAdd - boolean, was the file added at watch instantiation? +// * callback - function, called when done processing as a newly seen file + +// Returns close function for the watcher instance +NodeFsHandler.prototype._handleFile = +function(file, stats, initialAdd, callback) { + var dirname = sysPath.dirname(file); + var basename = sysPath.basename(file); + var parent = this._getWatchedDir(dirname); + // stats is always present + var prevStats = stats; + + // if the file is already being watched, do nothing + if (parent.has(basename)) return callback(); + + // kick off the watcher + var closer = this._watchWithNodeFs(file, function(path, newStats) { + if (!this._throttle('watch', file, 5)) return; + if (!newStats || newStats && newStats.mtime.getTime() === 0) { + fs.stat(file, function(error, newStats) { + // Fix issues where mtime is null but file is still present + if (error) { + this._remove(dirname, basename); + } else { + // Check that change event was not fired because of changed only accessTime. + var at = newStats.atime.getTime(); + var mt = newStats.mtime.getTime(); + if (!at || at <= mt || mt !== prevStats.mtime.getTime()) { + this._emit('change', file, newStats); + } + prevStats = newStats; + } + }.bind(this)); + // add is about to be emitted if file not already tracked in parent + } else if (parent.has(basename)) { + // Check that change event was not fired because of changed only accessTime. + var at = newStats.atime.getTime(); + var mt = newStats.mtime.getTime(); + if (!at || at <= mt || mt !== prevStats.mtime.getTime()) { + this._emit('change', file, newStats); + } + prevStats = newStats; + } + }.bind(this)); + + // emit an add event if we're supposed to + if (!(initialAdd && this.options.ignoreInitial)) { + if (!this._throttle('add', file, 0)) return; + this._emit('add', file, stats); + } + + if (callback) callback(); + return closer; +}; + +// Private method: Handle symlinks encountered while reading a dir + +// * entry - object, entry object returned by readdirp +// * directory - string, path of the directory being read +// * path - string, path of this item +// * item - string, basename of this item + +// Returns true if no more processing is needed for this entry. +NodeFsHandler.prototype._handleSymlink = +function(entry, directory, path, item) { + var full = entry.fullPath; + var dir = this._getWatchedDir(directory); + + if (!this.options.followSymlinks) { + // watch symlink directly (don't follow) and detect changes + this._readyCount++; + fs.realpath(path, function(error, linkPath) { + if (dir.has(item)) { + if (this._symlinkPaths[full] !== linkPath) { + this._symlinkPaths[full] = linkPath; + this._emit('change', path, entry.stat); + } + } else { + dir.add(item); + this._symlinkPaths[full] = linkPath; + this._emit('add', path, entry.stat); + } + this._emitReady(); + }.bind(this)); + return true; + } + + // don't follow the same symlink more than once + if (this._symlinkPaths[full]) return true; + else this._symlinkPaths[full] = true; +}; + +// Private method: Read directory to add / remove files from `@watched` list +// and re-read it on change. + +// * dir - string, fs path. +// * stats - object, result of fs.stat +// * initialAdd - boolean, was the file added at watch instantiation? +// * depth - int, depth relative to user-supplied path +// * target - string, child path actually targeted for watch +// * wh - object, common watch helpers for this path +// * callback - function, called when dir scan is complete + +// Returns close function for the watcher instance +NodeFsHandler.prototype._handleDir = +function(dir, stats, initialAdd, depth, target, wh, callback) { + var parentDir = this._getWatchedDir(sysPath.dirname(dir)); + var tracked = parentDir.has(sysPath.basename(dir)); + if (!(initialAdd && this.options.ignoreInitial) && !target && !tracked) { + if (!wh.hasGlob || wh.globFilter(dir)) this._emit('addDir', dir, stats); + } + + // ensure dir is tracked (harmless if redundant) + parentDir.add(sysPath.basename(dir)); + this._getWatchedDir(dir); + + var read = function(directory, initialAdd, done) { + // Normalize the directory name on Windows + directory = sysPath.join(directory, ''); + + if (!wh.hasGlob) { + var throttler = this._throttle('readdir', directory, 1000); + if (!throttler) return; + } + + var previous = this._getWatchedDir(wh.path); + var current = []; + + readdirp({ + root: directory, + entryType: 'all', + fileFilter: wh.filterPath, + directoryFilter: wh.filterDir, + depth: 0, + lstat: true + }).on('data', function(entry) { + var item = entry.path; + var path = sysPath.join(directory, item); + current.push(item); + + if (entry.stat.isSymbolicLink() && + this._handleSymlink(entry, directory, path, item)) return; + + // Files that present in current directory snapshot + // but absent in previous are added to watch list and + // emit `add` event. + if (item === target || !target && !previous.has(item)) { + this._readyCount++; + + // ensure relativeness of path is preserved in case of watcher reuse + path = sysPath.join(dir, sysPath.relative(dir, path)); + + this._addToNodeFs(path, initialAdd, wh, depth + 1); + } + }.bind(this)).on('end', function() { + var wasThrottled = throttler ? throttler.clear() : false; + if (done) done(); + + // Files that absent in current directory snapshot + // but present in previous emit `remove` event + // and are removed from @watched[directory]. + previous.children().filter(function(item) { + return item !== directory && + current.indexOf(item) === -1 && + // in case of intersecting globs; + // a path may have been filtered out of this readdir, but + // shouldn't be removed because it matches a different glob + (!wh.hasGlob || wh.filterPath({ + fullPath: sysPath.resolve(directory, item) + })); + }).forEach(function(item) { + this._remove(directory, item); + }, this); + + // one more time for any missed in case changes came in extremely quickly + if (wasThrottled) read(directory, false); + }.bind(this)).on('error', this._handleError.bind(this)); + }.bind(this); + + var closer; + + if (this.options.depth == null || depth <= this.options.depth) { + if (!target) read(dir, initialAdd, callback); + closer = this._watchWithNodeFs(dir, function(dirPath, stats) { + // if current directory is removed, do nothing + if (stats && stats.mtime.getTime() === 0) return; + + read(dirPath, false); + }); + } else { + callback(); + } + return closer; +}; + +// Private method: Handle added file, directory, or glob pattern. +// Delegates call to _handleFile / _handleDir after checks. + +// * path - string, path to file or directory. +// * initialAdd - boolean, was the file added at watch instantiation? +// * depth - int, depth relative to user-supplied path +// * target - string, child path actually targeted for watch +// * callback - function, indicates whether the path was found or not + +// Returns nothing +NodeFsHandler.prototype._addToNodeFs = +function(path, initialAdd, priorWh, depth, target, callback) { + if (!callback) callback = Function.prototype; + var ready = this._emitReady; + if (this._isIgnored(path) || this.closed) { + ready(); + return callback(null, false); + } + + var wh = this._getWatchHelpers(path, depth); + if (!wh.hasGlob && priorWh) { + wh.hasGlob = priorWh.hasGlob; + wh.globFilter = priorWh.globFilter; + wh.filterPath = priorWh.filterPath; + wh.filterDir = priorWh.filterDir; + } + + // evaluate what is at the path we're being asked to watch + fs[wh.statMethod](wh.watchPath, function(error, stats) { + if (this._handleError(error)) return callback(null, path); + if (this._isIgnored(wh.watchPath, stats)) { + ready(); + return callback(null, false); + } + + var initDir = function(dir, target) { + return this._handleDir(dir, stats, initialAdd, depth, target, wh, ready); + }.bind(this); + + var closer; + if (stats.isDirectory()) { + closer = initDir(wh.watchPath, target); + } else if (stats.isSymbolicLink()) { + var parent = sysPath.dirname(wh.watchPath); + this._getWatchedDir(parent).add(wh.watchPath); + this._emit('add', wh.watchPath, stats); + closer = initDir(parent, path); + + // preserve this symlink's target path + fs.realpath(path, function(error, targetPath) { + this._symlinkPaths[sysPath.resolve(path)] = targetPath; + ready(); + }.bind(this)); + } else { + closer = this._handleFile(wh.watchPath, stats, initialAdd, ready); + } + + if (closer) { + this._closers[path] = this._closers[path] || []; + this._closers[path].push(closer); + } + callback(null, false); + }.bind(this)); +}; + +module.exports = NodeFsHandler; + + +/***/ }), +/* 189 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var fs = __webpack_require__(10) + , path = __webpack_require__(3) + , micromatch = (__webpack_require__(190).isMatch) + , toString = Object.prototype.toString + ; + + +// Standard helpers +function isFunction (obj) { + return toString.call(obj) === '[object Function]'; +} + +function isString (obj) { + return toString.call(obj) === '[object String]'; +} + +function isUndefined (obj) { + return obj === void 0; +} + +/** + * Main function which ends up calling readdirRec and reads all files and directories in given root recursively. + * @param { Object } opts Options to specify root (start directory), filters and recursion depth + * @param { function } callback1 When callback2 is given calls back for each processed file - function (fileInfo) { ... }, + * when callback2 is not given, it behaves like explained in callback2 + * @param { function } callback2 Calls back once all files have been processed with an array of errors and file infos + * function (err, fileInfos) { ... } + */ +function readdir(opts, callback1, callback2) { + var stream + , handleError + , handleFatalError + , errors = [] + , readdirResult = { + directories: [] + , files: [] + } + , fileProcessed + , allProcessed + , realRoot + , aborted = false + , paused = false + ; + + // If no callbacks were given we will use a streaming interface + if (isUndefined(callback1)) { + var api = __webpack_require__(231)(); + stream = api.stream; + callback1 = api.processEntry; + callback2 = api.done; + handleError = api.handleError; + handleFatalError = api.handleFatalError; + + stream.on('close', function () { aborted = true; }); + stream.on('pause', function () { paused = true; }); + stream.on('resume', function () { paused = false; }); + } else { + handleError = function (err) { errors.push(err); }; + handleFatalError = function (err) { + handleError(err); + allProcessed(errors, null); + }; + } + + if (isUndefined(opts)){ + handleFatalError(new Error ( + 'Need to pass at least one argument: opts! \n' + + 'https://github.com/paulmillr/readdirp#options' + ) + ); + return stream; + } + + opts.root = opts.root || '.'; + opts.fileFilter = opts.fileFilter || function() { return true; }; + opts.directoryFilter = opts.directoryFilter || function() { return true; }; + opts.depth = typeof opts.depth === 'undefined' ? 999999999 : opts.depth; + opts.entryType = opts.entryType || 'files'; + + var statfn = opts.lstat === true ? fs.lstat.bind(fs) : fs.stat.bind(fs); + + if (isUndefined(callback2)) { + fileProcessed = function() { }; + allProcessed = callback1; + } else { + fileProcessed = callback1; + allProcessed = callback2; + } + + function normalizeFilter (filter) { + + if (isUndefined(filter)) return undefined; + + function isNegated (filters) { + + function negated(f) { + return f.indexOf('!') === 0; + } + + var some = filters.some(negated); + if (!some) { + return false; + } else { + if (filters.every(negated)) { + return true; + } else { + // if we detect illegal filters, bail out immediately + throw new Error( + 'Cannot mix negated with non negated glob filters: ' + filters + '\n' + + 'https://github.com/paulmillr/readdirp#filters' + ); + } + } + } + + // Turn all filters into a function + if (isFunction(filter)) { + + return filter; + + } else if (isString(filter)) { + + return function (entryInfo) { + return micromatch(entryInfo.name, filter.trim()); + }; + + } else if (filter && Array.isArray(filter)) { + + if (filter) filter = filter.map(function (f) { + return f.trim(); + }); + + return isNegated(filter) ? + // use AND to concat multiple negated filters + function (entryInfo) { + return filter.every(function (f) { + return micromatch(entryInfo.name, f); + }); + } + : + // use OR to concat multiple inclusive filters + function (entryInfo) { + return filter.some(function (f) { + return micromatch(entryInfo.name, f); + }); + }; + } + } + + function processDir(currentDir, entries, callProcessed) { + if (aborted) return; + var total = entries.length + , processed = 0 + , entryInfos = [] + ; + + fs.realpath(currentDir, function(err, realCurrentDir) { + if (aborted) return; + if (err) { + handleError(err); + callProcessed(entryInfos); + return; + } + + var relDir = path.relative(realRoot, realCurrentDir); + + if (entries.length === 0) { + callProcessed([]); + } else { + entries.forEach(function (entry) { + + var fullPath = path.join(realCurrentDir, entry) + , relPath = path.join(relDir, entry); + + statfn(fullPath, function (err, stat) { + if (err) { + handleError(err); + } else { + entryInfos.push({ + name : entry + , path : relPath // relative to root + , fullPath : fullPath + + , parentDir : relDir // relative to root + , fullParentDir : realCurrentDir + + , stat : stat + }); + } + processed++; + if (processed === total) callProcessed(entryInfos); + }); + }); + } + }); + } + + function readdirRec(currentDir, depth, callCurrentDirProcessed) { + var args = arguments; + if (aborted) return; + if (paused) { + setImmediate(function () { + readdirRec.apply(null, args); + }) + return; + } + + fs.readdir(currentDir, function (err, entries) { + if (err) { + handleError(err); + callCurrentDirProcessed(); + return; + } + + processDir(currentDir, entries, function(entryInfos) { + + var subdirs = entryInfos + .filter(function (ei) { return ei.stat.isDirectory() && opts.directoryFilter(ei); }); + + subdirs.forEach(function (di) { + if(opts.entryType === 'directories' || opts.entryType === 'both' || opts.entryType === 'all') { + fileProcessed(di); + } + readdirResult.directories.push(di); + }); + + entryInfos + .filter(function(ei) { + var isCorrectType = opts.entryType === 'all' ? + !ei.stat.isDirectory() : ei.stat.isFile() || ei.stat.isSymbolicLink(); + return isCorrectType && opts.fileFilter(ei); + }) + .forEach(function (fi) { + if(opts.entryType === 'files' || opts.entryType === 'both' || opts.entryType === 'all') { + fileProcessed(fi); + } + readdirResult.files.push(fi); + }); + + var pendingSubdirs = subdirs.length; + + // Be done if no more subfolders exist or we reached the maximum desired depth + if(pendingSubdirs === 0 || depth === opts.depth) { + callCurrentDirProcessed(); + } else { + // recurse into subdirs, keeping track of which ones are done + // and call back once all are processed + subdirs.forEach(function (subdir) { + readdirRec(subdir.fullPath, depth + 1, function () { + pendingSubdirs = pendingSubdirs - 1; + if(pendingSubdirs === 0) { + callCurrentDirProcessed(); + } + }); + }); + } + }); + }); + } + + // Validate and normalize filters + try { + opts.fileFilter = normalizeFilter(opts.fileFilter); + opts.directoryFilter = normalizeFilter(opts.directoryFilter); + } catch (err) { + // if we detect illegal filters, bail out immediately + handleFatalError(err); + return stream; + } + + // If filters were valid get on with the show + fs.realpath(opts.root, function(err, res) { + if (err) { + handleFatalError(err); + return stream; + } + + realRoot = res; + readdirRec(opts.root, 0, function () { + // All errors are collected into the errors array + if (errors.length > 0) { + allProcessed(errors, readdirResult); + } else { + allProcessed(null, readdirResult); + } + }); + }); + + return stream; +} + +module.exports = readdir; + + +/***/ }), +/* 190 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +/** + * Module dependencies + */ + +var util = __webpack_require__(17); +var braces = __webpack_require__(72); +var toRegex = __webpack_require__(73); +var extend = __webpack_require__(191); + +/** + * Local dependencies + */ + +var compilers = __webpack_require__(193); +var parsers = __webpack_require__(225); +var cache = __webpack_require__(226); +var utils = __webpack_require__(227); +var MAX_LENGTH = 1024 * 64; + +/** + * The main function takes a list of strings and one or more + * glob patterns to use for matching. + * + * ```js + * var mm = require('micromatch'); + * mm(list, patterns[, options]); + * + * console.log(mm(['a.js', 'a.txt'], ['*.js'])); + * //=> [ 'a.js' ] + * ``` + * @param {Array} `list` A list of strings to match + * @param {String|Array} `patterns` One or more glob patterns to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Array} Returns an array of matches + * @summary false + * @api public + */ + +function micromatch(list, patterns, options) { + patterns = utils.arrayify(patterns); + list = utils.arrayify(list); + + var len = patterns.length; + if (list.length === 0 || len === 0) { + return []; + } + + if (len === 1) { + return micromatch.match(list, patterns[0], options); + } + + var omit = []; + var keep = []; + var idx = -1; + + while (++idx < len) { + var pattern = patterns[idx]; + + if (typeof pattern === 'string' && pattern.charCodeAt(0) === 33 /* ! */) { + omit.push.apply(omit, micromatch.match(list, pattern.slice(1), options)); + } else { + keep.push.apply(keep, micromatch.match(list, pattern, options)); + } + } + + var matches = utils.diff(keep, omit); + if (!options || options.nodupes !== false) { + return utils.unique(matches); + } + + return matches; +} + +/** + * Similar to the main function, but `pattern` must be a string. + * + * ```js + * var mm = require('micromatch'); + * mm.match(list, pattern[, options]); + * + * console.log(mm.match(['a.a', 'a.aa', 'a.b', 'a.c'], '*.a')); + * //=> ['a.a', 'a.aa'] + * ``` + * @param {Array} `list` Array of strings to match + * @param {String} `pattern` Glob pattern to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Array} Returns an array of matches + * @api public + */ + +micromatch.match = function(list, pattern, options) { + if (Array.isArray(pattern)) { + throw new TypeError('expected pattern to be a string'); + } + + var unixify = utils.unixify(options); + var isMatch = memoize('match', pattern, options, micromatch.matcher); + var matches = []; + + list = utils.arrayify(list); + var len = list.length; + var idx = -1; + + while (++idx < len) { + var ele = list[idx]; + if (ele === pattern || isMatch(ele)) { + matches.push(utils.value(ele, unixify, options)); + } + } + + // if no options were passed, uniquify results and return + if (typeof options === 'undefined') { + return utils.unique(matches); + } + + if (matches.length === 0) { + if (options.failglob === true) { + throw new Error('no matches found for "' + pattern + '"'); + } + if (options.nonull === true || options.nullglob === true) { + return [options.unescape ? utils.unescape(pattern) : pattern]; + } + } + + // if `opts.ignore` was defined, diff ignored list + if (options.ignore) { + matches = micromatch.not(matches, options.ignore, options); + } + + return options.nodupes !== false ? utils.unique(matches) : matches; +}; + +/** + * Returns true if the specified `string` matches the given glob `pattern`. + * + * ```js + * var mm = require('micromatch'); + * mm.isMatch(string, pattern[, options]); + * + * console.log(mm.isMatch('a.a', '*.a')); + * //=> true + * console.log(mm.isMatch('a.b', '*.a')); + * //=> false + * ``` + * @param {String} `string` String to match + * @param {String} `pattern` Glob pattern to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Boolean} Returns true if the string matches the glob pattern. + * @api public + */ + +micromatch.isMatch = function(str, pattern, options) { + if (typeof str !== 'string') { + throw new TypeError('expected a string: "' + util.inspect(str) + '"'); + } + + if (isEmptyString(str) || isEmptyString(pattern)) { + return false; + } + + var equals = utils.equalsPattern(options); + if (equals(str)) { + return true; + } + + var isMatch = memoize('isMatch', pattern, options, micromatch.matcher); + return isMatch(str); +}; + +/** + * Returns true if some of the strings in the given `list` match any of the + * given glob `patterns`. + * + * ```js + * var mm = require('micromatch'); + * mm.some(list, patterns[, options]); + * + * console.log(mm.some(['foo.js', 'bar.js'], ['*.js', '!foo.js'])); + * // true + * console.log(mm.some(['foo.js'], ['*.js', '!foo.js'])); + * // false + * ``` + * @param {String|Array} `list` The string or array of strings to test. Returns as soon as the first match is found. + * @param {String|Array} `patterns` One or more glob patterns to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Boolean} Returns true if any patterns match `str` + * @api public + */ + +micromatch.some = function(list, patterns, options) { + if (typeof list === 'string') { + list = [list]; + } + for (var i = 0; i < list.length; i++) { + if (micromatch(list[i], patterns, options).length === 1) { + return true; + } + } + return false; +}; + +/** + * Returns true if every string in the given `list` matches + * any of the given glob `patterns`. + * + * ```js + * var mm = require('micromatch'); + * mm.every(list, patterns[, options]); + * + * console.log(mm.every('foo.js', ['foo.js'])); + * // true + * console.log(mm.every(['foo.js', 'bar.js'], ['*.js'])); + * // true + * console.log(mm.every(['foo.js', 'bar.js'], ['*.js', '!foo.js'])); + * // false + * console.log(mm.every(['foo.js'], ['*.js', '!foo.js'])); + * // false + * ``` + * @param {String|Array} `list` The string or array of strings to test. + * @param {String|Array} `patterns` One or more glob patterns to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Boolean} Returns true if any patterns match `str` + * @api public + */ + +micromatch.every = function(list, patterns, options) { + if (typeof list === 'string') { + list = [list]; + } + for (var i = 0; i < list.length; i++) { + if (micromatch(list[i], patterns, options).length !== 1) { + return false; + } + } + return true; +}; + +/** + * Returns true if **any** of the given glob `patterns` + * match the specified `string`. + * + * ```js + * var mm = require('micromatch'); + * mm.any(string, patterns[, options]); + * + * console.log(mm.any('a.a', ['b.*', '*.a'])); + * //=> true + * console.log(mm.any('a.a', 'b.*')); + * //=> false + * ``` + * @param {String|Array} `str` The string to test. + * @param {String|Array} `patterns` One or more glob patterns to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Boolean} Returns true if any patterns match `str` + * @api public + */ + +micromatch.any = function(str, patterns, options) { + if (typeof str !== 'string') { + throw new TypeError('expected a string: "' + util.inspect(str) + '"'); + } + + if (isEmptyString(str) || isEmptyString(patterns)) { + return false; + } + + if (typeof patterns === 'string') { + patterns = [patterns]; + } + + for (var i = 0; i < patterns.length; i++) { + if (micromatch.isMatch(str, patterns[i], options)) { + return true; + } + } + return false; +}; + +/** + * Returns true if **all** of the given `patterns` match + * the specified string. + * + * ```js + * var mm = require('micromatch'); + * mm.all(string, patterns[, options]); + * + * console.log(mm.all('foo.js', ['foo.js'])); + * // true + * + * console.log(mm.all('foo.js', ['*.js', '!foo.js'])); + * // false + * + * console.log(mm.all('foo.js', ['*.js', 'foo.js'])); + * // true + * + * console.log(mm.all('foo.js', ['*.js', 'f*', '*o*', '*o.js'])); + * // true + * ``` + * @param {String|Array} `str` The string to test. + * @param {String|Array} `patterns` One or more glob patterns to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Boolean} Returns true if any patterns match `str` + * @api public + */ + +micromatch.all = function(str, patterns, options) { + if (typeof str !== 'string') { + throw new TypeError('expected a string: "' + util.inspect(str) + '"'); + } + if (typeof patterns === 'string') { + patterns = [patterns]; + } + for (var i = 0; i < patterns.length; i++) { + if (!micromatch.isMatch(str, patterns[i], options)) { + return false; + } + } + return true; +}; + +/** + * Returns a list of strings that _**do not match any**_ of the given `patterns`. + * + * ```js + * var mm = require('micromatch'); + * mm.not(list, patterns[, options]); + * + * console.log(mm.not(['a.a', 'b.b', 'c.c'], '*.a')); + * //=> ['b.b', 'c.c'] + * ``` + * @param {Array} `list` Array of strings to match. + * @param {String|Array} `patterns` One or more glob pattern to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Array} Returns an array of strings that **do not match** the given patterns. + * @api public + */ + +micromatch.not = function(list, patterns, options) { + var opts = extend({}, options); + var ignore = opts.ignore; + delete opts.ignore; + + var unixify = utils.unixify(opts); + list = utils.arrayify(list).map(unixify); + + var matches = utils.diff(list, micromatch(list, patterns, opts)); + if (ignore) { + matches = utils.diff(matches, micromatch(list, ignore)); + } + + return opts.nodupes !== false ? utils.unique(matches) : matches; +}; + +/** + * Returns true if the given `string` contains the given pattern. Similar + * to [.isMatch](#isMatch) but the pattern can match any part of the string. + * + * ```js + * var mm = require('micromatch'); + * mm.contains(string, pattern[, options]); + * + * console.log(mm.contains('aa/bb/cc', '*b')); + * //=> true + * console.log(mm.contains('aa/bb/cc', '*d')); + * //=> false + * ``` + * @param {String} `str` The string to match. + * @param {String|Array} `patterns` Glob pattern to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Boolean} Returns true if the patter matches any part of `str`. + * @api public + */ + +micromatch.contains = function(str, patterns, options) { + if (typeof str !== 'string') { + throw new TypeError('expected a string: "' + util.inspect(str) + '"'); + } + + if (typeof patterns === 'string') { + if (isEmptyString(str) || isEmptyString(patterns)) { + return false; + } + + var equals = utils.equalsPattern(patterns, options); + if (equals(str)) { + return true; + } + var contains = utils.containsPattern(patterns, options); + if (contains(str)) { + return true; + } + } + + var opts = extend({}, options, {contains: true}); + return micromatch.any(str, patterns, opts); +}; + +/** + * Returns true if the given pattern and options should enable + * the `matchBase` option. + * @return {Boolean} + * @api private + */ + +micromatch.matchBase = function(pattern, options) { + if (pattern && pattern.indexOf('/') !== -1 || !options) return false; + return options.basename === true || options.matchBase === true; +}; + +/** + * Filter the keys of the given object with the given `glob` pattern + * and `options`. Does not attempt to match nested keys. If you need this feature, + * use [glob-object][] instead. + * + * ```js + * var mm = require('micromatch'); + * mm.matchKeys(object, patterns[, options]); + * + * var obj = { aa: 'a', ab: 'b', ac: 'c' }; + * console.log(mm.matchKeys(obj, '*b')); + * //=> { ab: 'b' } + * ``` + * @param {Object} `object` The object with keys to filter. + * @param {String|Array} `patterns` One or more glob patterns to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Object} Returns an object with only keys that match the given patterns. + * @api public + */ + +micromatch.matchKeys = function(obj, patterns, options) { + if (!utils.isObject(obj)) { + throw new TypeError('expected the first argument to be an object'); + } + var keys = micromatch(Object.keys(obj), patterns, options); + return utils.pick(obj, keys); +}; + +/** + * Returns a memoized matcher function from the given glob `pattern` and `options`. + * The returned function takes a string to match as its only argument and returns + * true if the string is a match. + * + * ```js + * var mm = require('micromatch'); + * mm.matcher(pattern[, options]); + * + * var isMatch = mm.matcher('*.!(*a)'); + * console.log(isMatch('a.a')); + * //=> false + * console.log(isMatch('a.b')); + * //=> true + * ``` + * @param {String} `pattern` Glob pattern + * @param {Object} `options` See available [options](#options) for changing how matches are performed. + * @return {Function} Returns a matcher function. + * @api public + */ + +micromatch.matcher = function matcher(pattern, options) { + if (Array.isArray(pattern)) { + return compose(pattern, options, matcher); + } + + // if pattern is a regex + if (pattern instanceof RegExp) { + return test(pattern); + } + + // if pattern is invalid + if (!utils.isString(pattern)) { + throw new TypeError('expected pattern to be an array, string or regex'); + } + + // if pattern is a non-glob string + if (!utils.hasSpecialChars(pattern)) { + if (options && options.nocase === true) { + pattern = pattern.toLowerCase(); + } + return utils.matchPath(pattern, options); + } + + // if pattern is a glob string + var re = micromatch.makeRe(pattern, options); + + // if `options.matchBase` or `options.basename` is defined + if (micromatch.matchBase(pattern, options)) { + return utils.matchBasename(re, options); + } + + function test(regex) { + var equals = utils.equalsPattern(options); + var unixify = utils.unixify(options); + + return function(str) { + if (equals(str)) { + return true; + } + + if (regex.test(unixify(str))) { + return true; + } + return false; + }; + } + + var fn = test(re); + Object.defineProperty(fn, 'result', { + configurable: true, + enumerable: false, + value: re.result + }); + return fn; +}; + +/** + * Returns an array of matches captured by `pattern` in `string, or `null` if the pattern did not match. + * + * ```js + * var mm = require('micromatch'); + * mm.capture(pattern, string[, options]); + * + * console.log(mm.capture('test/*.js', 'test/foo.js')); + * //=> ['foo'] + * console.log(mm.capture('test/*.js', 'foo/bar.css')); + * //=> null + * ``` + * @param {String} `pattern` Glob pattern to use for matching. + * @param {String} `string` String to match + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Boolean} Returns an array of captures if the string matches the glob pattern, otherwise `null`. + * @api public + */ + +micromatch.capture = function(pattern, str, options) { + var re = micromatch.makeRe(pattern, extend({capture: true}, options)); + var unixify = utils.unixify(options); + + function match() { + return function(string) { + var match = re.exec(unixify(string)); + if (!match) { + return null; + } + + return match.slice(1); + }; + } + + var capture = memoize('capture', pattern, options, match); + return capture(str); +}; + +/** + * Create a regular expression from the given glob `pattern`. + * + * ```js + * var mm = require('micromatch'); + * mm.makeRe(pattern[, options]); + * + * console.log(mm.makeRe('*.js')); + * //=> /^(?:(\.[\\\/])?(?!\.)(?=.)[^\/]*?\.js)$/ + * ``` + * @param {String} `pattern` A glob pattern to convert to regex. + * @param {Object} `options` See available [options](#options) for changing how matches are performed. + * @return {RegExp} Returns a regex created from the given pattern. + * @api public + */ + +micromatch.makeRe = function(pattern, options) { + if (typeof pattern !== 'string') { + throw new TypeError('expected pattern to be a string'); + } + + if (pattern.length > MAX_LENGTH) { + throw new Error('expected pattern to be less than ' + MAX_LENGTH + ' characters'); + } + + function makeRe() { + var result = micromatch.create(pattern, options); + var ast_array = []; + var output = result.map(function(obj) { + obj.ast.state = obj.state; + ast_array.push(obj.ast); + return obj.output; + }); + + var regex = toRegex(output.join('|'), options); + Object.defineProperty(regex, 'result', { + configurable: true, + enumerable: false, + value: ast_array + }); + return regex; + } + + return memoize('makeRe', pattern, options, makeRe); +}; + +/** + * Expand the given brace `pattern`. + * + * ```js + * var mm = require('micromatch'); + * console.log(mm.braces('foo/{a,b}/bar')); + * //=> ['foo/(a|b)/bar'] + * + * console.log(mm.braces('foo/{a,b}/bar', {expand: true})); + * //=> ['foo/(a|b)/bar'] + * ``` + * @param {String} `pattern` String with brace pattern to expand. + * @param {Object} `options` Any [options](#options) to change how expansion is performed. See the [braces][] library for all available options. + * @return {Array} + * @api public + */ + +micromatch.braces = function(pattern, options) { + if (typeof pattern !== 'string' && !Array.isArray(pattern)) { + throw new TypeError('expected pattern to be an array or string'); + } + + function expand() { + if (options && options.nobrace === true || !/\{.*\}/.test(pattern)) { + return utils.arrayify(pattern); + } + return braces(pattern, options); + } + + return memoize('braces', pattern, options, expand); +}; + +/** + * Proxy to the [micromatch.braces](#method), for parity with + * minimatch. + */ + +micromatch.braceExpand = function(pattern, options) { + var opts = extend({}, options, {expand: true}); + return micromatch.braces(pattern, opts); +}; + +/** + * Parses the given glob `pattern` and returns an array of abstract syntax + * trees (ASTs), with the compiled `output` and optional source `map` on + * each AST. + * + * ```js + * var mm = require('micromatch'); + * mm.create(pattern[, options]); + * + * console.log(mm.create('abc/*.js')); + * // [{ options: { source: 'string', sourcemap: true }, + * // state: {}, + * // compilers: + * // { ... }, + * // output: '(\\.[\\\\\\/])?abc\\/(?!\\.)(?=.)[^\\/]*?\\.js', + * // ast: + * // { type: 'root', + * // errors: [], + * // nodes: + * // [ ... ], + * // dot: false, + * // input: 'abc/*.js' }, + * // parsingErrors: [], + * // map: + * // { version: 3, + * // sources: [ 'string' ], + * // names: [], + * // mappings: 'AAAA,GAAG,EAAC,kBAAC,EAAC,EAAE', + * // sourcesContent: [ 'abc/*.js' ] }, + * // position: { line: 1, column: 28 }, + * // content: {}, + * // files: {}, + * // idx: 6 }] + * ``` + * @param {String} `pattern` Glob pattern to parse and compile. + * @param {Object} `options` Any [options](#options) to change how parsing and compiling is performed. + * @return {Object} Returns an object with the parsed AST, compiled string and optional source map. + * @api public + */ + +micromatch.create = function(pattern, options) { + return memoize('create', pattern, options, function() { + function create(str, opts) { + return micromatch.compile(micromatch.parse(str, opts), opts); + } + + pattern = micromatch.braces(pattern, options); + var len = pattern.length; + var idx = -1; + var res = []; + + while (++idx < len) { + res.push(create(pattern[idx], options)); + } + return res; + }); +}; + +/** + * Parse the given `str` with the given `options`. + * + * ```js + * var mm = require('micromatch'); + * mm.parse(pattern[, options]); + * + * var ast = mm.parse('a/{b,c}/d'); + * console.log(ast); + * // { type: 'root', + * // errors: [], + * // input: 'a/{b,c}/d', + * // nodes: + * // [ { type: 'bos', val: '' }, + * // { type: 'text', val: 'a/' }, + * // { type: 'brace', + * // nodes: + * // [ { type: 'brace.open', val: '{' }, + * // { type: 'text', val: 'b,c' }, + * // { type: 'brace.close', val: '}' } ] }, + * // { type: 'text', val: '/d' }, + * // { type: 'eos', val: '' } ] } + * ``` + * @param {String} `str` + * @param {Object} `options` + * @return {Object} Returns an AST + * @api public + */ + +micromatch.parse = function(pattern, options) { + if (typeof pattern !== 'string') { + throw new TypeError('expected a string'); + } + + function parse() { + var snapdragon = utils.instantiate(null, options); + parsers(snapdragon, options); + + var ast = snapdragon.parse(pattern, options); + utils.define(ast, 'snapdragon', snapdragon); + ast.input = pattern; + return ast; + } + + return memoize('parse', pattern, options, parse); +}; + +/** + * Compile the given `ast` or string with the given `options`. + * + * ```js + * var mm = require('micromatch'); + * mm.compile(ast[, options]); + * + * var ast = mm.parse('a/{b,c}/d'); + * console.log(mm.compile(ast)); + * // { options: { source: 'string' }, + * // state: {}, + * // compilers: + * // { eos: [Function], + * // noop: [Function], + * // bos: [Function], + * // brace: [Function], + * // 'brace.open': [Function], + * // text: [Function], + * // 'brace.close': [Function] }, + * // output: [ 'a/(b|c)/d' ], + * // ast: + * // { ... }, + * // parsingErrors: [] } + * ``` + * @param {Object|String} `ast` + * @param {Object} `options` + * @return {Object} Returns an object that has an `output` property with the compiled string. + * @api public + */ + +micromatch.compile = function(ast, options) { + if (typeof ast === 'string') { + ast = micromatch.parse(ast, options); + } + + return memoize('compile', ast.input, options, function() { + var snapdragon = utils.instantiate(ast, options); + compilers(snapdragon, options); + return snapdragon.compile(ast, options); + }); +}; + +/** + * Clear the regex cache. + * + * ```js + * mm.clearCache(); + * ``` + * @api public + */ + +micromatch.clearCache = function() { + micromatch.cache.caches = {}; +}; + +/** + * Returns true if the given value is effectively an empty string + */ + +function isEmptyString(val) { + return String(val) === '' || String(val) === './'; +} + +/** + * Compose a matcher function with the given patterns. + * This allows matcher functions to be compiled once and + * called multiple times. + */ + +function compose(patterns, options, matcher) { + var matchers; + + return memoize('compose', String(patterns), options, function() { + return function(file) { + // delay composition until it's invoked the first time, + // after that it won't be called again + if (!matchers) { + matchers = []; + for (var i = 0; i < patterns.length; i++) { + matchers.push(matcher(patterns[i], options)); + } + } + + var len = matchers.length; + while (len--) { + if (matchers[len](file) === true) { + return true; + } + } + return false; + }; + }); +} + +/** + * Memoize a generated regex or function. A unique key is generated + * from the `type` (usually method name), the `pattern`, and + * user-defined options. + */ + +function memoize(type, pattern, options, fn) { + var key = utils.createKey(type + '=' + pattern, options); + + if (options && options.cache === false) { + return fn(pattern, options); + } + + if (cache.has(type, key)) { + return cache.get(type, key); + } + + var val = fn(pattern, options); + cache.set(type, key, val); + return val; +} + +/** + * Expose compiler, parser and cache on `micromatch` + */ + +micromatch.compilers = compilers; +micromatch.parsers = parsers; +micromatch.caches = cache.caches; + +/** + * Expose `micromatch` + * @type {Function} + */ + +module.exports = micromatch; + + +/***/ }), +/* 191 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var isExtendable = __webpack_require__(192); +var assignSymbols = __webpack_require__(91); + +module.exports = Object.assign || function(obj/*, objects*/) { + if (obj === null || typeof obj === 'undefined') { + throw new TypeError('Cannot convert undefined or null to object'); + } + if (!isObject(obj)) { + obj = {}; + } + for (var i = 1; i < arguments.length; i++) { + var val = arguments[i]; + if (isString(val)) { + val = toObject(val); + } + if (isObject(val)) { + assign(obj, val); + assignSymbols(obj, val); + } + } + return obj; +}; + +function assign(a, b) { + for (var key in b) { + if (hasOwn(b, key)) { + a[key] = b[key]; + } + } +} + +function isString(val) { + return (val && typeof val === 'string'); +} + +function toObject(str) { + var obj = {}; + for (var i in str) { + obj[i] = str[i]; + } + return obj; +} + +function isObject(val) { + return (val && typeof val === 'object') || isExtendable(val); +} + +/** + * Returns true if the given `key` is an own property of `obj`. + */ + +function hasOwn(obj, key) { + return Object.prototype.hasOwnProperty.call(obj, key); +} + +function isEnum(obj, key) { + return Object.prototype.propertyIsEnumerable.call(obj, key); +} + + +/***/ }), +/* 192 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +/*! + * is-extendable + * + * Copyright (c) 2015-2017, Jon Schlinkert. + * Released under the MIT License. + */ + + + +var isPlainObject = __webpack_require__(90); + +module.exports = function isExtendable(val) { + return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); +}; + + +/***/ }), +/* 193 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var nanomatch = __webpack_require__(194); +var extglob = __webpack_require__(208); + +module.exports = function(snapdragon) { + var compilers = snapdragon.compiler.compilers; + var opts = snapdragon.options; + + // register nanomatch compilers + snapdragon.use(nanomatch.compilers); + + // get references to some specific nanomatch compilers before they + // are overridden by the extglob and/or custom compilers + var escape = compilers.escape; + var qmark = compilers.qmark; + var slash = compilers.slash; + var star = compilers.star; + var text = compilers.text; + var plus = compilers.plus; + var dot = compilers.dot; + + // register extglob compilers or escape exglobs if disabled + if (opts.extglob === false || opts.noext === true) { + snapdragon.compiler.use(escapeExtglobs); + } else { + snapdragon.use(extglob.compilers); + } + + snapdragon.use(function() { + this.options.star = this.options.star || function(/*node*/) { + return '[^\\\\/]*?'; + }; + }); + + // custom micromatch compilers + snapdragon.compiler + + // reset referenced compiler + .set('dot', dot) + .set('escape', escape) + .set('plus', plus) + .set('slash', slash) + .set('qmark', qmark) + .set('star', star) + .set('text', text); +}; + +function escapeExtglobs(compiler) { + compiler.set('paren', function(node) { + var val = ''; + visit(node, function(tok) { + if (tok.val) val += (/^\W/.test(tok.val) ? '\\' : '') + tok.val; + }); + return this.emit(val, node); + }); + + /** + * Visit `node` with the given `fn` + */ + + function visit(node, fn) { + return node.nodes ? mapVisit(node.nodes, fn) : fn(node); + } + + /** + * Map visit over array of `nodes`. + */ + + function mapVisit(nodes, fn) { + var len = nodes.length; + var idx = -1; + while (++idx < len) { + visit(nodes[idx], fn); + } + } +} + + +/***/ }), +/* 194 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +/** + * Module dependencies + */ + +var util = __webpack_require__(17); +var toRegex = __webpack_require__(73); +var extend = __webpack_require__(195); + +/** + * Local dependencies + */ + +var compilers = __webpack_require__(197); +var parsers = __webpack_require__(198); +var cache = __webpack_require__(199); +var utils = __webpack_require__(201); +var MAX_LENGTH = 1024 * 64; + +/** + * The main function takes a list of strings and one or more + * glob patterns to use for matching. + * + * ```js + * var nm = require('nanomatch'); + * nm(list, patterns[, options]); + * + * console.log(nm(['a.js', 'a.txt'], ['*.js'])); + * //=> [ 'a.js' ] + * ``` + * @param {Array} `list` A list of strings to match + * @param {String|Array} `patterns` One or more glob patterns to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Array} Returns an array of matches + * @summary false + * @api public + */ + +function nanomatch(list, patterns, options) { + patterns = utils.arrayify(patterns); + list = utils.arrayify(list); + + var len = patterns.length; + if (list.length === 0 || len === 0) { + return []; + } + + if (len === 1) { + return nanomatch.match(list, patterns[0], options); + } + + var negated = false; + var omit = []; + var keep = []; + var idx = -1; + + while (++idx < len) { + var pattern = patterns[idx]; + + if (typeof pattern === 'string' && pattern.charCodeAt(0) === 33 /* ! */) { + omit.push.apply(omit, nanomatch.match(list, pattern.slice(1), options)); + negated = true; + } else { + keep.push.apply(keep, nanomatch.match(list, pattern, options)); + } + } + + // minimatch.match parity + if (negated && keep.length === 0) { + if (options && options.unixify === false) { + keep = list.slice(); + } else { + var unixify = utils.unixify(options); + for (var i = 0; i < list.length; i++) { + keep.push(unixify(list[i])); + } + } + } + + var matches = utils.diff(keep, omit); + if (!options || options.nodupes !== false) { + return utils.unique(matches); + } + + return matches; +} + +/** + * Similar to the main function, but `pattern` must be a string. + * + * ```js + * var nm = require('nanomatch'); + * nm.match(list, pattern[, options]); + * + * console.log(nm.match(['a.a', 'a.aa', 'a.b', 'a.c'], '*.a')); + * //=> ['a.a', 'a.aa'] + * ``` + * @param {Array} `list` Array of strings to match + * @param {String} `pattern` Glob pattern to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Array} Returns an array of matches + * @api public + */ + +nanomatch.match = function(list, pattern, options) { + if (Array.isArray(pattern)) { + throw new TypeError('expected pattern to be a string'); + } + + var unixify = utils.unixify(options); + var isMatch = memoize('match', pattern, options, nanomatch.matcher); + var matches = []; + + list = utils.arrayify(list); + var len = list.length; + var idx = -1; + + while (++idx < len) { + var ele = list[idx]; + if (ele === pattern || isMatch(ele)) { + matches.push(utils.value(ele, unixify, options)); + } + } + + // if no options were passed, uniquify results and return + if (typeof options === 'undefined') { + return utils.unique(matches); + } + + if (matches.length === 0) { + if (options.failglob === true) { + throw new Error('no matches found for "' + pattern + '"'); + } + if (options.nonull === true || options.nullglob === true) { + return [options.unescape ? utils.unescape(pattern) : pattern]; + } + } + + // if `opts.ignore` was defined, diff ignored list + if (options.ignore) { + matches = nanomatch.not(matches, options.ignore, options); + } + + return options.nodupes !== false ? utils.unique(matches) : matches; +}; + +/** + * Returns true if the specified `string` matches the given glob `pattern`. + * + * ```js + * var nm = require('nanomatch'); + * nm.isMatch(string, pattern[, options]); + * + * console.log(nm.isMatch('a.a', '*.a')); + * //=> true + * console.log(nm.isMatch('a.b', '*.a')); + * //=> false + * ``` + * @param {String} `string` String to match + * @param {String} `pattern` Glob pattern to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Boolean} Returns true if the string matches the glob pattern. + * @api public + */ + +nanomatch.isMatch = function(str, pattern, options) { + if (typeof str !== 'string') { + throw new TypeError('expected a string: "' + util.inspect(str) + '"'); + } + + if (utils.isEmptyString(str) || utils.isEmptyString(pattern)) { + return false; + } + + var equals = utils.equalsPattern(options); + if (equals(str)) { + return true; + } + + var isMatch = memoize('isMatch', pattern, options, nanomatch.matcher); + return isMatch(str); +}; + +/** + * Returns true if some of the elements in the given `list` match any of the + * given glob `patterns`. + * + * ```js + * var nm = require('nanomatch'); + * nm.some(list, patterns[, options]); + * + * console.log(nm.some(['foo.js', 'bar.js'], ['*.js', '!foo.js'])); + * // true + * console.log(nm.some(['foo.js'], ['*.js', '!foo.js'])); + * // false + * ``` + * @param {String|Array} `list` The string or array of strings to test. Returns as soon as the first match is found. + * @param {String|Array} `patterns` One or more glob patterns to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Boolean} Returns true if any patterns match `str` + * @api public + */ + +nanomatch.some = function(list, patterns, options) { + if (typeof list === 'string') { + list = [list]; + } + + for (var i = 0; i < list.length; i++) { + if (nanomatch(list[i], patterns, options).length === 1) { + return true; + } + } + + return false; +}; + +/** + * Returns true if every element in the given `list` matches + * at least one of the given glob `patterns`. + * + * ```js + * var nm = require('nanomatch'); + * nm.every(list, patterns[, options]); + * + * console.log(nm.every('foo.js', ['foo.js'])); + * // true + * console.log(nm.every(['foo.js', 'bar.js'], ['*.js'])); + * // true + * console.log(nm.every(['foo.js', 'bar.js'], ['*.js', '!foo.js'])); + * // false + * console.log(nm.every(['foo.js'], ['*.js', '!foo.js'])); + * // false + * ``` + * @param {String|Array} `list` The string or array of strings to test. + * @param {String|Array} `patterns` One or more glob patterns to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Boolean} Returns true if any patterns match `str` + * @api public + */ + +nanomatch.every = function(list, patterns, options) { + if (typeof list === 'string') { + list = [list]; + } + + for (var i = 0; i < list.length; i++) { + if (nanomatch(list[i], patterns, options).length !== 1) { + return false; + } + } + + return true; +}; + +/** + * Returns true if **any** of the given glob `patterns` + * match the specified `string`. + * + * ```js + * var nm = require('nanomatch'); + * nm.any(string, patterns[, options]); + * + * console.log(nm.any('a.a', ['b.*', '*.a'])); + * //=> true + * console.log(nm.any('a.a', 'b.*')); + * //=> false + * ``` + * @param {String|Array} `str` The string to test. + * @param {String|Array} `patterns` One or more glob patterns to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Boolean} Returns true if any patterns match `str` + * @api public + */ + +nanomatch.any = function(str, patterns, options) { + if (typeof str !== 'string') { + throw new TypeError('expected a string: "' + util.inspect(str) + '"'); + } + + if (utils.isEmptyString(str) || utils.isEmptyString(patterns)) { + return false; + } + + if (typeof patterns === 'string') { + patterns = [patterns]; + } + + for (var i = 0; i < patterns.length; i++) { + if (nanomatch.isMatch(str, patterns[i], options)) { + return true; + } + } + return false; +}; + +/** + * Returns true if **all** of the given `patterns` + * match the specified string. + * + * ```js + * var nm = require('nanomatch'); + * nm.all(string, patterns[, options]); + * + * console.log(nm.all('foo.js', ['foo.js'])); + * // true + * + * console.log(nm.all('foo.js', ['*.js', '!foo.js'])); + * // false + * + * console.log(nm.all('foo.js', ['*.js', 'foo.js'])); + * // true + * + * console.log(nm.all('foo.js', ['*.js', 'f*', '*o*', '*o.js'])); + * // true + * ``` + * @param {String|Array} `str` The string to test. + * @param {String|Array} `patterns` One or more glob patterns to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Boolean} Returns true if any patterns match `str` + * @api public + */ + +nanomatch.all = function(str, patterns, options) { + if (typeof str !== 'string') { + throw new TypeError('expected a string: "' + util.inspect(str) + '"'); + } + + if (typeof patterns === 'string') { + patterns = [patterns]; + } + + for (var i = 0; i < patterns.length; i++) { + if (!nanomatch.isMatch(str, patterns[i], options)) { + return false; + } + } + return true; +}; + +/** + * Returns a list of strings that _**do not match any**_ of the given `patterns`. + * + * ```js + * var nm = require('nanomatch'); + * nm.not(list, patterns[, options]); + * + * console.log(nm.not(['a.a', 'b.b', 'c.c'], '*.a')); + * //=> ['b.b', 'c.c'] + * ``` + * @param {Array} `list` Array of strings to match. + * @param {String|Array} `patterns` One or more glob pattern to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Array} Returns an array of strings that **do not match** the given patterns. + * @api public + */ + +nanomatch.not = function(list, patterns, options) { + var opts = extend({}, options); + var ignore = opts.ignore; + delete opts.ignore; + + list = utils.arrayify(list); + + var matches = utils.diff(list, nanomatch(list, patterns, opts)); + if (ignore) { + matches = utils.diff(matches, nanomatch(list, ignore)); + } + + return opts.nodupes !== false ? utils.unique(matches) : matches; +}; + +/** + * Returns true if the given `string` contains the given pattern. Similar + * to [.isMatch](#isMatch) but the pattern can match any part of the string. + * + * ```js + * var nm = require('nanomatch'); + * nm.contains(string, pattern[, options]); + * + * console.log(nm.contains('aa/bb/cc', '*b')); + * //=> true + * console.log(nm.contains('aa/bb/cc', '*d')); + * //=> false + * ``` + * @param {String} `str` The string to match. + * @param {String|Array} `patterns` Glob pattern to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Boolean} Returns true if the patter matches any part of `str`. + * @api public + */ + +nanomatch.contains = function(str, patterns, options) { + if (typeof str !== 'string') { + throw new TypeError('expected a string: "' + util.inspect(str) + '"'); + } + + if (typeof patterns === 'string') { + if (utils.isEmptyString(str) || utils.isEmptyString(patterns)) { + return false; + } + + var equals = utils.equalsPattern(patterns, options); + if (equals(str)) { + return true; + } + var contains = utils.containsPattern(patterns, options); + if (contains(str)) { + return true; + } + } + + var opts = extend({}, options, {contains: true}); + return nanomatch.any(str, patterns, opts); +}; + +/** + * Returns true if the given pattern and options should enable + * the `matchBase` option. + * @return {Boolean} + * @api private + */ + +nanomatch.matchBase = function(pattern, options) { + if (pattern && pattern.indexOf('/') !== -1 || !options) return false; + return options.basename === true || options.matchBase === true; +}; + +/** + * Filter the keys of the given object with the given `glob` pattern + * and `options`. Does not attempt to match nested keys. If you need this feature, + * use [glob-object][] instead. + * + * ```js + * var nm = require('nanomatch'); + * nm.matchKeys(object, patterns[, options]); + * + * var obj = { aa: 'a', ab: 'b', ac: 'c' }; + * console.log(nm.matchKeys(obj, '*b')); + * //=> { ab: 'b' } + * ``` + * @param {Object} `object` The object with keys to filter. + * @param {String|Array} `patterns` One or more glob patterns to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Object} Returns an object with only keys that match the given patterns. + * @api public + */ + +nanomatch.matchKeys = function(obj, patterns, options) { + if (!utils.isObject(obj)) { + throw new TypeError('expected the first argument to be an object'); + } + var keys = nanomatch(Object.keys(obj), patterns, options); + return utils.pick(obj, keys); +}; + +/** + * Returns a memoized matcher function from the given glob `pattern` and `options`. + * The returned function takes a string to match as its only argument and returns + * true if the string is a match. + * + * ```js + * var nm = require('nanomatch'); + * nm.matcher(pattern[, options]); + * + * var isMatch = nm.matcher('*.!(*a)'); + * console.log(isMatch('a.a')); + * //=> false + * console.log(isMatch('a.b')); + * //=> true + * ``` + * @param {String} `pattern` Glob pattern + * @param {Object} `options` See available [options](#options) for changing how matches are performed. + * @return {Function} Returns a matcher function. + * @api public + */ + +nanomatch.matcher = function matcher(pattern, options) { + if (utils.isEmptyString(pattern)) { + return function() { + return false; + }; + } + + if (Array.isArray(pattern)) { + return compose(pattern, options, matcher); + } + + // if pattern is a regex + if (pattern instanceof RegExp) { + return test(pattern); + } + + // if pattern is invalid + if (!utils.isString(pattern)) { + throw new TypeError('expected pattern to be an array, string or regex'); + } + + // if pattern is a non-glob string + if (!utils.hasSpecialChars(pattern)) { + if (options && options.nocase === true) { + pattern = pattern.toLowerCase(); + } + return utils.matchPath(pattern, options); + } + + // if pattern is a glob string + var re = nanomatch.makeRe(pattern, options); + + // if `options.matchBase` or `options.basename` is defined + if (nanomatch.matchBase(pattern, options)) { + return utils.matchBasename(re, options); + } + + function test(regex) { + var equals = utils.equalsPattern(options); + var unixify = utils.unixify(options); + + return function(str) { + if (equals(str)) { + return true; + } + + if (regex.test(unixify(str))) { + return true; + } + return false; + }; + } + + // create matcher function + var matcherFn = test(re); + // set result object from compiler on matcher function, + // as a non-enumerable property. useful for debugging + utils.define(matcherFn, 'result', re.result); + return matcherFn; +}; + +/** + * Returns an array of matches captured by `pattern` in `string, or + * `null` if the pattern did not match. + * + * ```js + * var nm = require('nanomatch'); + * nm.capture(pattern, string[, options]); + * + * console.log(nm.capture('test/*.js', 'test/foo.js')); + * //=> ['foo'] + * console.log(nm.capture('test/*.js', 'foo/bar.css')); + * //=> null + * ``` + * @param {String} `pattern` Glob pattern to use for matching. + * @param {String} `string` String to match + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Boolean} Returns an array of captures if the string matches the glob pattern, otherwise `null`. + * @api public + */ + +nanomatch.capture = function(pattern, str, options) { + var re = nanomatch.makeRe(pattern, extend({capture: true}, options)); + var unixify = utils.unixify(options); + + function match() { + return function(string) { + var match = re.exec(unixify(string)); + if (!match) { + return null; + } + + return match.slice(1); + }; + } + + var capture = memoize('capture', pattern, options, match); + return capture(str); +}; + +/** + * Create a regular expression from the given glob `pattern`. + * + * ```js + * var nm = require('nanomatch'); + * nm.makeRe(pattern[, options]); + * + * console.log(nm.makeRe('*.js')); + * //=> /^(?:(\.[\\\/])?(?!\.)(?=.)[^\/]*?\.js)$/ + * ``` + * @param {String} `pattern` A glob pattern to convert to regex. + * @param {Object} `options` See available [options](#options) for changing how matches are performed. + * @return {RegExp} Returns a regex created from the given pattern. + * @api public + */ + +nanomatch.makeRe = function(pattern, options) { + if (pattern instanceof RegExp) { + return pattern; + } + + if (typeof pattern !== 'string') { + throw new TypeError('expected pattern to be a string'); + } + + if (pattern.length > MAX_LENGTH) { + throw new Error('expected pattern to be less than ' + MAX_LENGTH + ' characters'); + } + + function makeRe() { + var opts = utils.extend({wrap: false}, options); + var result = nanomatch.create(pattern, opts); + var regex = toRegex(result.output, opts); + utils.define(regex, 'result', result); + return regex; + } + + return memoize('makeRe', pattern, options, makeRe); +}; + +/** + * Parses the given glob `pattern` and returns an object with the compiled `output` + * and optional source `map`. + * + * ```js + * var nm = require('nanomatch'); + * nm.create(pattern[, options]); + * + * console.log(nm.create('abc/*.js')); + * // { options: { source: 'string', sourcemap: true }, + * // state: {}, + * // compilers: + * // { ... }, + * // output: '(\\.[\\\\\\/])?abc\\/(?!\\.)(?=.)[^\\/]*?\\.js', + * // ast: + * // { type: 'root', + * // errors: [], + * // nodes: + * // [ ... ], + * // dot: false, + * // input: 'abc/*.js' }, + * // parsingErrors: [], + * // map: + * // { version: 3, + * // sources: [ 'string' ], + * // names: [], + * // mappings: 'AAAA,GAAG,EAAC,kBAAC,EAAC,EAAE', + * // sourcesContent: [ 'abc/*.js' ] }, + * // position: { line: 1, column: 28 }, + * // content: {}, + * // files: {}, + * // idx: 6 } + * ``` + * @param {String} `pattern` Glob pattern to parse and compile. + * @param {Object} `options` Any [options](#options) to change how parsing and compiling is performed. + * @return {Object} Returns an object with the parsed AST, compiled string and optional source map. + * @api public + */ + +nanomatch.create = function(pattern, options) { + if (typeof pattern !== 'string') { + throw new TypeError('expected a string'); + } + function create() { + return nanomatch.compile(nanomatch.parse(pattern, options), options); + } + return memoize('create', pattern, options, create); +}; + +/** + * Parse the given `str` with the given `options`. + * + * ```js + * var nm = require('nanomatch'); + * nm.parse(pattern[, options]); + * + * var ast = nm.parse('a/{b,c}/d'); + * console.log(ast); + * // { type: 'root', + * // errors: [], + * // input: 'a/{b,c}/d', + * // nodes: + * // [ { type: 'bos', val: '' }, + * // { type: 'text', val: 'a/' }, + * // { type: 'brace', + * // nodes: + * // [ { type: 'brace.open', val: '{' }, + * // { type: 'text', val: 'b,c' }, + * // { type: 'brace.close', val: '}' } ] }, + * // { type: 'text', val: '/d' }, + * // { type: 'eos', val: '' } ] } + * ``` + * @param {String} `str` + * @param {Object} `options` + * @return {Object} Returns an AST + * @api public + */ + +nanomatch.parse = function(pattern, options) { + if (typeof pattern !== 'string') { + throw new TypeError('expected a string'); + } + + function parse() { + var snapdragon = utils.instantiate(null, options); + parsers(snapdragon, options); + + var ast = snapdragon.parse(pattern, options); + utils.define(ast, 'snapdragon', snapdragon); + ast.input = pattern; + return ast; + } + + return memoize('parse', pattern, options, parse); +}; + +/** + * Compile the given `ast` or string with the given `options`. + * + * ```js + * var nm = require('nanomatch'); + * nm.compile(ast[, options]); + * + * var ast = nm.parse('a/{b,c}/d'); + * console.log(nm.compile(ast)); + * // { options: { source: 'string' }, + * // state: {}, + * // compilers: + * // { eos: [Function], + * // noop: [Function], + * // bos: [Function], + * // brace: [Function], + * // 'brace.open': [Function], + * // text: [Function], + * // 'brace.close': [Function] }, + * // output: [ 'a/(b|c)/d' ], + * // ast: + * // { ... }, + * // parsingErrors: [] } + * ``` + * @param {Object|String} `ast` + * @param {Object} `options` + * @return {Object} Returns an object that has an `output` property with the compiled string. + * @api public + */ + +nanomatch.compile = function(ast, options) { + if (typeof ast === 'string') { + ast = nanomatch.parse(ast, options); + } + + function compile() { + var snapdragon = utils.instantiate(ast, options); + compilers(snapdragon, options); + return snapdragon.compile(ast, options); + } + + return memoize('compile', ast.input, options, compile); +}; + +/** + * Clear the regex cache. + * + * ```js + * nm.clearCache(); + * ``` + * @api public + */ + +nanomatch.clearCache = function() { + nanomatch.cache.__data__ = {}; +}; + +/** + * Compose a matcher function with the given patterns. + * This allows matcher functions to be compiled once and + * called multiple times. + */ + +function compose(patterns, options, matcher) { + var matchers; + + return memoize('compose', String(patterns), options, function() { + return function(file) { + // delay composition until it's invoked the first time, + // after that it won't be called again + if (!matchers) { + matchers = []; + for (var i = 0; i < patterns.length; i++) { + matchers.push(matcher(patterns[i], options)); + } + } + + var len = matchers.length; + while (len--) { + if (matchers[len](file) === true) { + return true; + } + } + return false; + }; + }); +} + +/** + * Memoize a generated regex or function. A unique key is generated + * from the `type` (usually method name), the `pattern`, and + * user-defined options. + */ + +function memoize(type, pattern, options, fn) { + var key = utils.createKey(type + '=' + pattern, options); + + if (options && options.cache === false) { + return fn(pattern, options); + } + + if (cache.has(type, key)) { + return cache.get(type, key); + } + + var val = fn(pattern, options); + cache.set(type, key, val); + return val; +} + +/** + * Expose compiler, parser and cache on `nanomatch` + */ + +nanomatch.compilers = compilers; +nanomatch.parsers = parsers; +nanomatch.cache = cache; + +/** + * Expose `nanomatch` + * @type {Function} + */ + +module.exports = nanomatch; + + +/***/ }), +/* 195 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var isExtendable = __webpack_require__(196); +var assignSymbols = __webpack_require__(91); + +module.exports = Object.assign || function(obj/*, objects*/) { + if (obj === null || typeof obj === 'undefined') { + throw new TypeError('Cannot convert undefined or null to object'); + } + if (!isObject(obj)) { + obj = {}; + } + for (var i = 1; i < arguments.length; i++) { + var val = arguments[i]; + if (isString(val)) { + val = toObject(val); + } + if (isObject(val)) { + assign(obj, val); + assignSymbols(obj, val); + } + } + return obj; +}; + +function assign(a, b) { + for (var key in b) { + if (hasOwn(b, key)) { + a[key] = b[key]; + } + } +} + +function isString(val) { + return (val && typeof val === 'string'); +} + +function toObject(str) { + var obj = {}; + for (var i in str) { + obj[i] = str[i]; + } + return obj; +} + +function isObject(val) { + return (val && typeof val === 'object') || isExtendable(val); +} + +/** + * Returns true if the given `key` is an own property of `obj`. + */ + +function hasOwn(obj, key) { + return Object.prototype.hasOwnProperty.call(obj, key); +} + +function isEnum(obj, key) { + return Object.prototype.propertyIsEnumerable.call(obj, key); +} + + +/***/ }), +/* 196 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +/*! + * is-extendable + * + * Copyright (c) 2015-2017, Jon Schlinkert. + * Released under the MIT License. + */ + + + +var isPlainObject = __webpack_require__(90); + +module.exports = function isExtendable(val) { + return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); +}; + + +/***/ }), +/* 197 */ +/***/ ((module) => { + +"use strict"; + + +/** +* Nanomatch compilers +*/ + +module.exports = function(nanomatch, options) { + function slash() { + if (options && typeof options.slash === 'string') { + return options.slash; + } + if (options && typeof options.slash === 'function') { + return options.slash.call(nanomatch); + } + return '\\\\/'; + } + + function star() { + if (options && typeof options.star === 'string') { + return options.star; + } + if (options && typeof options.star === 'function') { + return options.star.call(nanomatch); + } + return '[^' + slash() + ']*?'; + } + + var ast = nanomatch.ast = nanomatch.parser.ast; + ast.state = nanomatch.parser.state; + nanomatch.compiler.state = ast.state; + nanomatch.compiler + + /** + * Negation / escaping + */ + + .set('not', function(node) { + var prev = this.prev(); + if (this.options.nonegate === true || prev.type !== 'bos') { + return this.emit('\\' + node.val, node); + } + return this.emit(node.val, node); + }) + .set('escape', function(node) { + if (this.options.unescape && /^[-\w_.]/.test(node.val)) { + return this.emit(node.val, node); + } + return this.emit('\\' + node.val, node); + }) + .set('quoted', function(node) { + return this.emit(node.val, node); + }) + + /** + * Regex + */ + + .set('dollar', function(node) { + if (node.parent.type === 'bracket') { + return this.emit(node.val, node); + } + return this.emit('\\' + node.val, node); + }) + + /** + * Dot: "." + */ + + .set('dot', function(node) { + if (node.dotfiles === true) this.dotfiles = true; + return this.emit('\\' + node.val, node); + }) + + /** + * Slashes: "/" and "\" + */ + + .set('backslash', function(node) { + return this.emit(node.val, node); + }) + .set('slash', function(node, nodes, i) { + var val = '[' + slash() + ']'; + var parent = node.parent; + var prev = this.prev(); + + // set "node.hasSlash" to true on all ancestor parens nodes + while (parent.type === 'paren' && !parent.hasSlash) { + parent.hasSlash = true; + parent = parent.parent; + } + + if (prev.addQmark) { + val += '?'; + } + + // word boundary + if (node.rest.slice(0, 2) === '\\b') { + return this.emit(val, node); + } + + // globstars + if (node.parsed === '**' || node.parsed === './**') { + this.output = '(?:' + this.output; + return this.emit(val + ')?', node); + } + + // negation + if (node.parsed === '!**' && this.options.nonegate !== true) { + return this.emit(val + '?\\b', node); + } + return this.emit(val, node); + }) + + /** + * Square brackets + */ + + .set('bracket', function(node) { + var close = node.close; + var open = !node.escaped ? '[' : '\\['; + var negated = node.negated; + var inner = node.inner; + var val = node.val; + + if (node.escaped === true) { + inner = inner.replace(/\\?(\W)/g, '\\$1'); + negated = ''; + } + + if (inner === ']-') { + inner = '\\]\\-'; + } + + if (negated && inner.indexOf('.') === -1) { + inner += '.'; + } + if (negated && inner.indexOf('/') === -1) { + inner += '/'; + } + + val = open + negated + inner + close; + return this.emit(val, node); + }) + + /** + * Square: "[.]" (only matches a single character in brackets) + */ + + .set('square', function(node) { + var val = (/^\W/.test(node.val) ? '\\' : '') + node.val; + return this.emit(val, node); + }) + + /** + * Question mark: "?" + */ + + .set('qmark', function(node) { + var prev = this.prev(); + // don't use "slash" variable so that we always avoid + // matching backslashes and slashes with a qmark + var val = '[^.\\\\/]'; + if (this.options.dot || (prev.type !== 'bos' && prev.type !== 'slash')) { + val = '[^\\\\/]'; + } + + if (node.parsed.slice(-1) === '(') { + var ch = node.rest.charAt(0); + if (ch === '!' || ch === '=' || ch === ':') { + return this.emit(node.val, node); + } + } + + if (node.val.length > 1) { + val += '{' + node.val.length + '}'; + } + return this.emit(val, node); + }) + + /** + * Plus + */ + + .set('plus', function(node) { + var prev = node.parsed.slice(-1); + if (prev === ']' || prev === ')') { + return this.emit(node.val, node); + } + if (!this.output || (/[?*+]/.test(ch) && node.parent.type !== 'bracket')) { + return this.emit('\\+', node); + } + var ch = this.output.slice(-1); + if (/\w/.test(ch) && !node.inside) { + return this.emit('+\\+?', node); + } + return this.emit('+', node); + }) + + /** + * globstar: '**' + */ + + .set('globstar', function(node, nodes, i) { + if (!this.output) { + this.state.leadingGlobstar = true; + } + + var prev = this.prev(); + var before = this.prev(2); + var next = this.next(); + var after = this.next(2); + var type = prev.type; + var val = node.val; + + if (prev.type === 'slash' && next.type === 'slash') { + if (before.type === 'text') { + this.output += '?'; + + if (after.type !== 'text') { + this.output += '\\b'; + } + } + } + + var parsed = node.parsed; + if (parsed.charAt(0) === '!') { + parsed = parsed.slice(1); + } + + var isInside = node.isInside.paren || node.isInside.brace; + if (parsed && type !== 'slash' && type !== 'bos' && !isInside) { + val = star(); + } else { + val = this.options.dot !== true + ? '(?:(?!(?:[' + slash() + ']|^)\\.).)*?' + : '(?:(?!(?:[' + slash() + ']|^)(?:\\.{1,2})($|[' + slash() + ']))(?!\\.{2}).)*?'; + } + + if ((type === 'slash' || type === 'bos') && this.options.dot !== true) { + val = '(?!\\.)' + val; + } + + if (prev.type === 'slash' && next.type === 'slash' && before.type !== 'text') { + if (after.type === 'text' || after.type === 'star') { + node.addQmark = true; + } + } + + if (this.options.capture) { + val = '(' + val + ')'; + } + + return this.emit(val, node); + }) + + /** + * Star: "*" + */ + + .set('star', function(node, nodes, i) { + var prior = nodes[i - 2] || {}; + var prev = this.prev(); + var next = this.next(); + var type = prev.type; + + function isStart(n) { + return n.type === 'bos' || n.type === 'slash'; + } + + if (this.output === '' && this.options.contains !== true) { + this.output = '(?![' + slash() + '])'; + } + + if (type === 'bracket' && this.options.bash === false) { + var str = next && next.type === 'bracket' ? star() : '*?'; + if (!prev.nodes || prev.nodes[1].type !== 'posix') { + return this.emit(str, node); + } + } + + var prefix = !this.dotfiles && type !== 'text' && type !== 'escape' + ? (this.options.dot ? '(?!(?:^|[' + slash() + '])\\.{1,2}(?:$|[' + slash() + ']))' : '(?!\\.)') + : ''; + + if (isStart(prev) || (isStart(prior) && type === 'not')) { + if (prefix !== '(?!\\.)') { + prefix += '(?!(\\.{2}|\\.[' + slash() + ']))(?=.)'; + } else { + prefix += '(?=.)'; + } + } else if (prefix === '(?!\\.)') { + prefix = ''; + } + + if (prev.type === 'not' && prior.type === 'bos' && this.options.dot === true) { + this.output = '(?!\\.)' + this.output; + } + + var output = prefix + star(); + if (this.options.capture) { + output = '(' + output + ')'; + } + + return this.emit(output, node); + }) + + /** + * Text + */ + + .set('text', function(node) { + return this.emit(node.val, node); + }) + + /** + * End-of-string + */ + + .set('eos', function(node) { + var prev = this.prev(); + var val = node.val; + + this.output = '(?:\\.[' + slash() + '](?=.))?' + this.output; + if (this.state.metachar && prev.type !== 'qmark' && prev.type !== 'slash') { + val += (this.options.contains ? '[' + slash() + ']?' : '(?:[' + slash() + ']|$)'); + } + + return this.emit(val, node); + }); + + /** + * Allow custom compilers to be passed on options + */ + + if (options && typeof options.compilers === 'function') { + options.compilers(nanomatch.compiler); + } +}; + + + +/***/ }), +/* 198 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var regexNot = __webpack_require__(92); +var toRegex = __webpack_require__(73); + +/** + * Characters to use in negation regex (we want to "not" match + * characters that are matched by other parsers) + */ + +var cached; +var NOT_REGEX = '[\\[!*+?$^"\'.\\\\/]+'; +var not = createTextRegex(NOT_REGEX); + +/** + * Nanomatch parsers + */ + +module.exports = function(nanomatch, options) { + var parser = nanomatch.parser; + var opts = parser.options; + + parser.state = { + slashes: 0, + paths: [] + }; + + parser.ast.state = parser.state; + parser + + /** + * Beginning-of-string + */ + + .capture('prefix', function() { + if (this.parsed) return; + var m = this.match(/^\.[\\/]/); + if (!m) return; + this.state.strictOpen = !!this.options.strictOpen; + this.state.addPrefix = true; + }) + + /** + * Escape: "\\." + */ + + .capture('escape', function() { + if (this.isInside('bracket')) return; + var pos = this.position(); + var m = this.match(/^(?:\\(.)|([$^]))/); + if (!m) return; + + return pos({ + type: 'escape', + val: m[2] || m[1] + }); + }) + + /** + * Quoted strings + */ + + .capture('quoted', function() { + var pos = this.position(); + var m = this.match(/^["']/); + if (!m) return; + + var quote = m[0]; + if (this.input.indexOf(quote) === -1) { + return pos({ + type: 'escape', + val: quote + }); + } + + var tok = advanceTo(this.input, quote); + this.consume(tok.len); + + return pos({ + type: 'quoted', + val: tok.esc + }); + }) + + /** + * Negations: "!" + */ + + .capture('not', function() { + var parsed = this.parsed; + var pos = this.position(); + var m = this.match(this.notRegex || /^!+/); + if (!m) return; + var val = m[0]; + + var isNegated = (val.length % 2) === 1; + if (parsed === '' && !isNegated) { + val = ''; + } + + // if nothing has been parsed, we know `!` is at the start, + // so we need to wrap the result in a negation regex + if (parsed === '' && isNegated && this.options.nonegate !== true) { + this.bos.val = '(?!^(?:'; + this.append = ')$).*'; + val = ''; + } + return pos({ + type: 'not', + val: val + }); + }) + + /** + * Dot: "." + */ + + .capture('dot', function() { + var parsed = this.parsed; + var pos = this.position(); + var m = this.match(/^\.+/); + if (!m) return; + + var val = m[0]; + this.state.dot = val === '.' && (parsed === '' || parsed.slice(-1) === '/'); + + return pos({ + type: 'dot', + dotfiles: this.state.dot, + val: val + }); + }) + + /** + * Plus: "+" + */ + + .capture('plus', /^\+(?!\()/) + + /** + * Question mark: "?" + */ + + .capture('qmark', function() { + var parsed = this.parsed; + var pos = this.position(); + var m = this.match(/^\?+(?!\()/); + if (!m) return; + + this.state.metachar = true; + this.state.qmark = true; + + return pos({ + type: 'qmark', + parsed: parsed, + val: m[0] + }); + }) + + /** + * Globstar: "**" + */ + + .capture('globstar', function() { + var parsed = this.parsed; + var pos = this.position(); + var m = this.match(/^\*{2}(?![*(])(?=[,)/]|$)/); + if (!m) return; + + var type = opts.noglobstar !== true ? 'globstar' : 'star'; + var node = pos({type: type, parsed: parsed}); + this.state.metachar = true; + + while (this.input.slice(0, 4) === '/**/') { + this.input = this.input.slice(3); + } + + node.isInside = { + brace: this.isInside('brace'), + paren: this.isInside('paren') + }; + + if (type === 'globstar') { + this.state.globstar = true; + node.val = '**'; + + } else { + this.state.star = true; + node.val = '*'; + } + + return node; + }) + + /** + * Star: "*" + */ + + .capture('star', function() { + var pos = this.position(); + var starRe = /^(?:\*(?![*(])|[*]{3,}(?!\()|[*]{2}(?![(/]|$)|\*(?=\*\())/; + var m = this.match(starRe); + if (!m) return; + + this.state.metachar = true; + this.state.star = true; + return pos({ + type: 'star', + val: m[0] + }); + }) + + /** + * Slash: "/" + */ + + .capture('slash', function() { + var pos = this.position(); + var m = this.match(/^\//); + if (!m) return; + + this.state.slashes++; + return pos({ + type: 'slash', + val: m[0] + }); + }) + + /** + * Backslash: "\\" + */ + + .capture('backslash', function() { + var pos = this.position(); + var m = this.match(/^\\(?![*+?(){}[\]'"])/); + if (!m) return; + + var val = m[0]; + + if (this.isInside('bracket')) { + val = '\\'; + } else if (val.length > 1) { + val = '\\\\'; + } + + return pos({ + type: 'backslash', + val: val + }); + }) + + /** + * Square: "[.]" + */ + + .capture('square', function() { + if (this.isInside('bracket')) return; + var pos = this.position(); + var m = this.match(/^\[([^!^\\])\]/); + if (!m) return; + + return pos({ + type: 'square', + val: m[1] + }); + }) + + /** + * Brackets: "[...]" (basic, this can be overridden by other parsers) + */ + + .capture('bracket', function() { + var pos = this.position(); + var m = this.match(/^(?:\[([!^]?)([^\]]+|\]-)(\]|[^*+?]+)|\[)/); + if (!m) return; + + var val = m[0]; + var negated = m[1] ? '^' : ''; + var inner = (m[2] || '').replace(/\\\\+/, '\\\\'); + var close = m[3] || ''; + + if (m[2] && inner.length < m[2].length) { + val = val.replace(/\\\\+/, '\\\\'); + } + + var esc = this.input.slice(0, 2); + if (inner === '' && esc === '\\]') { + inner += esc; + this.consume(2); + + var str = this.input; + var idx = -1; + var ch; + + while ((ch = str[++idx])) { + this.consume(1); + if (ch === ']') { + close = ch; + break; + } + inner += ch; + } + } + + return pos({ + type: 'bracket', + val: val, + escaped: close !== ']', + negated: negated, + inner: inner, + close: close + }); + }) + + /** + * Text + */ + + .capture('text', function() { + if (this.isInside('bracket')) return; + var pos = this.position(); + var m = this.match(not); + if (!m || !m[0]) return; + + return pos({ + type: 'text', + val: m[0] + }); + }); + + /** + * Allow custom parsers to be passed on options + */ + + if (options && typeof options.parsers === 'function') { + options.parsers(nanomatch.parser); + } +}; + +/** + * Advance to the next non-escaped character + */ + +function advanceTo(input, endChar) { + var ch = input.charAt(0); + var tok = { len: 1, val: '', esc: '' }; + var idx = 0; + + function advance() { + if (ch !== '\\') { + tok.esc += '\\' + ch; + tok.val += ch; + } + + ch = input.charAt(++idx); + tok.len++; + + if (ch === '\\') { + advance(); + advance(); + } + } + + while (ch && ch !== endChar) { + advance(); + } + return tok; +} + +/** + * Create text regex + */ + +function createTextRegex(pattern) { + if (cached) return cached; + var opts = {contains: true, strictClose: false}; + var not = regexNot.create(pattern, opts); + var re = toRegex('^(?:[*]\\((?=.)|' + not + ')', opts); + return (cached = re); +} + +/** + * Expose negation string + */ + +module.exports.not = NOT_REGEX; + + +/***/ }), +/* 199 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +module.exports = new (__webpack_require__(200))(); + + +/***/ }), +/* 200 */ +/***/ ((module, exports, __webpack_require__) => { + +"use strict"; +/*! + * fragment-cache + * + * Copyright (c) 2016-2017, Jon Schlinkert. + * Released under the MIT License. + */ + + + +var MapCache = __webpack_require__(185); + +/** + * Create a new `FragmentCache` with an optional object to use for `caches`. + * + * ```js + * var fragment = new FragmentCache(); + * ``` + * @name FragmentCache + * @param {String} `cacheName` + * @return {Object} Returns the [map-cache][] instance. + * @api public + */ + +function FragmentCache(caches) { + this.caches = caches || {}; +} + +/** + * Prototype + */ + +FragmentCache.prototype = { + + /** + * Get cache `name` from the `fragment.caches` object. Creates a new + * `MapCache` if it doesn't already exist. + * + * ```js + * var cache = fragment.cache('files'); + * console.log(fragment.caches.hasOwnProperty('files')); + * //=> true + * ``` + * @name .cache + * @param {String} `cacheName` + * @return {Object} Returns the [map-cache][] instance. + * @api public + */ + + cache: function(cacheName) { + return this.caches[cacheName] || (this.caches[cacheName] = new MapCache()); + }, + + /** + * Set a value for property `key` on cache `name` + * + * ```js + * fragment.set('files', 'somefile.js', new File({path: 'somefile.js'})); + * ``` + * @name .set + * @param {String} `name` + * @param {String} `key` Property name to set + * @param {any} `val` The value of `key` + * @return {Object} The cache instance for chaining + * @api public + */ + + set: function(cacheName, key, val) { + var cache = this.cache(cacheName); + cache.set(key, val); + return cache; + }, + + /** + * Returns true if a non-undefined value is set for `key` on fragment cache `name`. + * + * ```js + * var cache = fragment.cache('files'); + * cache.set('somefile.js'); + * + * console.log(cache.has('somefile.js')); + * //=> true + * + * console.log(cache.has('some-other-file.js')); + * //=> false + * ``` + * @name .has + * @param {String} `name` Cache name + * @param {String} `key` Optionally specify a property to check for on cache `name` + * @return {Boolean} + * @api public + */ + + has: function(cacheName, key) { + return typeof this.get(cacheName, key) !== 'undefined'; + }, + + /** + * Get `name`, or if specified, the value of `key`. Invokes the [cache]() method, + * so that cache `name` will be created it doesn't already exist. If `key` is not passed, + * the entire cache (`name`) is returned. + * + * ```js + * var Vinyl = require('vinyl'); + * var cache = fragment.cache('files'); + * cache.set('somefile.js', new Vinyl({path: 'somefile.js'})); + * console.log(cache.get('somefile.js')); + * //=> + * ``` + * @name .get + * @param {String} `name` + * @return {Object} Returns cache `name`, or the value of `key` if specified + * @api public + */ + + get: function(name, key) { + var cache = this.cache(name); + if (typeof key === 'string') { + return cache.get(key); + } + return cache; + } +}; + +/** + * Expose `FragmentCache` + */ + +exports = module.exports = FragmentCache; + + +/***/ }), +/* 201 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var utils = module.exports; +var path = __webpack_require__(3); + +/** + * Module dependencies + */ + +var isWindows = __webpack_require__(202)(); +var Snapdragon = __webpack_require__(118); +utils.define = __webpack_require__(203); +utils.diff = __webpack_require__(205); +utils.extend = __webpack_require__(195); +utils.pick = __webpack_require__(206); +utils.typeOf = __webpack_require__(207); +utils.unique = __webpack_require__(95); + +/** + * Returns true if the given value is effectively an empty string + */ + +utils.isEmptyString = function(val) { + return String(val) === '' || String(val) === './'; +}; + +/** + * Returns true if the platform is windows, or `path.sep` is `\\`. + * This is defined as a function to allow `path.sep` to be set in unit tests, + * or by the user, if there is a reason to do so. + * @return {Boolean} + */ + +utils.isWindows = function() { + return path.sep === '\\' || isWindows === true; +}; + +/** + * Return the last element from an array + */ + +utils.last = function(arr, n) { + return arr[arr.length - (n || 1)]; +}; + +/** + * Get the `Snapdragon` instance to use + */ + +utils.instantiate = function(ast, options) { + var snapdragon; + // if an instance was created by `.parse`, use that instance + if (utils.typeOf(ast) === 'object' && ast.snapdragon) { + snapdragon = ast.snapdragon; + // if the user supplies an instance on options, use that instance + } else if (utils.typeOf(options) === 'object' && options.snapdragon) { + snapdragon = options.snapdragon; + // create a new instance + } else { + snapdragon = new Snapdragon(options); + } + + utils.define(snapdragon, 'parse', function(str, options) { + var parsed = Snapdragon.prototype.parse.call(this, str, options); + parsed.input = str; + + // escape unmatched brace/bracket/parens + var last = this.parser.stack.pop(); + if (last && this.options.strictErrors !== true) { + var open = last.nodes[0]; + var inner = last.nodes[1]; + if (last.type === 'bracket') { + if (inner.val.charAt(0) === '[') { + inner.val = '\\' + inner.val; + } + + } else { + open.val = '\\' + open.val; + var sibling = open.parent.nodes[1]; + if (sibling.type === 'star') { + sibling.loose = true; + } + } + } + + // add non-enumerable parser reference + utils.define(parsed, 'parser', this.parser); + return parsed; + }); + + return snapdragon; +}; + +/** + * Create the key to use for memoization. The key is generated + * by iterating over the options and concatenating key-value pairs + * to the pattern string. + */ + +utils.createKey = function(pattern, options) { + if (typeof options === 'undefined') { + return pattern; + } + var key = pattern; + for (var prop in options) { + if (options.hasOwnProperty(prop)) { + key += ';' + prop + '=' + String(options[prop]); + } + } + return key; +}; + +/** + * Cast `val` to an array + * @return {Array} + */ + +utils.arrayify = function(val) { + if (typeof val === 'string') return [val]; + return val ? (Array.isArray(val) ? val : [val]) : []; +}; + +/** + * Return true if `val` is a non-empty string + */ + +utils.isString = function(val) { + return typeof val === 'string'; +}; + +/** + * Return true if `val` is a non-empty string + */ + +utils.isRegex = function(val) { + return utils.typeOf(val) === 'regexp'; +}; + +/** + * Return true if `val` is a non-empty string + */ + +utils.isObject = function(val) { + return utils.typeOf(val) === 'object'; +}; + +/** + * Escape regex characters in the given string + */ + +utils.escapeRegex = function(str) { + return str.replace(/[-[\]{}()^$|*+?.\\/\s]/g, '\\$&'); +}; + +/** + * Combines duplicate characters in the provided `input` string. + * @param {String} `input` + * @returns {String} + */ + +utils.combineDupes = function(input, patterns) { + patterns = utils.arrayify(patterns).join('|').split('|'); + patterns = patterns.map(function(s) { + return s.replace(/\\?([+*\\/])/g, '\\$1'); + }); + var substr = patterns.join('|'); + var regex = new RegExp('(' + substr + ')(?=\\1)', 'g'); + return input.replace(regex, ''); +}; + +/** + * Returns true if the given `str` has special characters + */ + +utils.hasSpecialChars = function(str) { + return /(?:(?:(^|\/)[!.])|[*?+()|[\]{}]|[+@]\()/.test(str); +}; + +/** + * Normalize slashes in the given filepath. + * + * @param {String} `filepath` + * @return {String} + */ + +utils.toPosixPath = function(str) { + return str.replace(/\\+/g, '/'); +}; + +/** + * Strip backslashes before special characters in a string. + * + * @param {String} `str` + * @return {String} + */ + +utils.unescape = function(str) { + return utils.toPosixPath(str.replace(/\\(?=[*+?!.])/g, '')); +}; + +/** + * Strip the drive letter from a windows filepath + * @param {String} `fp` + * @return {String} + */ + +utils.stripDrive = function(fp) { + return utils.isWindows() ? fp.replace(/^[a-z]:[\\/]+?/i, '/') : fp; +}; + +/** + * Strip the prefix from a filepath + * @param {String} `fp` + * @return {String} + */ + +utils.stripPrefix = function(str) { + if (str.charAt(0) === '.' && (str.charAt(1) === '/' || str.charAt(1) === '\\')) { + return str.slice(2); + } + return str; +}; + +/** + * Returns true if `str` is a common character that doesn't need + * to be processed to be used for matching. + * @param {String} `str` + * @return {Boolean} + */ + +utils.isSimpleChar = function(str) { + return str.trim() === '' || str === '.'; +}; + +/** + * Returns true if the given str is an escaped or + * unescaped path character + */ + +utils.isSlash = function(str) { + return str === '/' || str === '\\/' || str === '\\' || str === '\\\\'; +}; + +/** + * Returns a function that returns true if the given + * pattern matches or contains a `filepath` + * + * @param {String} `pattern` + * @return {Function} + */ + +utils.matchPath = function(pattern, options) { + return (options && options.contains) + ? utils.containsPattern(pattern, options) + : utils.equalsPattern(pattern, options); +}; + +/** + * Returns true if the given (original) filepath or unixified path are equal + * to the given pattern. + */ + +utils._equals = function(filepath, unixPath, pattern) { + return pattern === filepath || pattern === unixPath; +}; + +/** + * Returns true if the given (original) filepath or unixified path contain + * the given pattern. + */ + +utils._contains = function(filepath, unixPath, pattern) { + return filepath.indexOf(pattern) !== -1 || unixPath.indexOf(pattern) !== -1; +}; + +/** + * Returns a function that returns true if the given + * pattern is the same as a given `filepath` + * + * @param {String} `pattern` + * @return {Function} + */ + +utils.equalsPattern = function(pattern, options) { + var unixify = utils.unixify(options); + options = options || {}; + + return function fn(filepath) { + var equal = utils._equals(filepath, unixify(filepath), pattern); + if (equal === true || options.nocase !== true) { + return equal; + } + var lower = filepath.toLowerCase(); + return utils._equals(lower, unixify(lower), pattern); + }; +}; + +/** + * Returns a function that returns true if the given + * pattern contains a `filepath` + * + * @param {String} `pattern` + * @return {Function} + */ + +utils.containsPattern = function(pattern, options) { + var unixify = utils.unixify(options); + options = options || {}; + + return function(filepath) { + var contains = utils._contains(filepath, unixify(filepath), pattern); + if (contains === true || options.nocase !== true) { + return contains; + } + var lower = filepath.toLowerCase(); + return utils._contains(lower, unixify(lower), pattern); + }; +}; + +/** + * Returns a function that returns true if the given + * regex matches the `filename` of a file path. + * + * @param {RegExp} `re` Matching regex + * @return {Function} + */ + +utils.matchBasename = function(re) { + return function(filepath) { + return re.test(filepath) || re.test(path.basename(filepath)); + }; +}; + +/** + * Returns the given value unchanced. + * @return {any} + */ + +utils.identity = function(val) { + return val; +}; + +/** + * Determines the filepath to return based on the provided options. + * @return {any} + */ + +utils.value = function(str, unixify, options) { + if (options && options.unixify === false) { + return str; + } + if (options && typeof options.unixify === 'function') { + return options.unixify(str); + } + return unixify(str); +}; + +/** + * Returns a function that normalizes slashes in a string to forward + * slashes, strips `./` from beginning of paths, and optionally unescapes + * special characters. + * @return {Function} + */ + +utils.unixify = function(options) { + var opts = options || {}; + return function(filepath) { + if (opts.stripPrefix !== false) { + filepath = utils.stripPrefix(filepath); + } + if (opts.unescape === true) { + filepath = utils.unescape(filepath); + } + if (opts.unixify === true || utils.isWindows()) { + filepath = utils.toPosixPath(filepath); + } + return filepath; + }; +}; + + +/***/ }), +/* 202 */ +/***/ ((module, exports) => { + +var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! + * is-windows + * + * Copyright © 2015-2018, Jon Schlinkert. + * Released under the MIT License. + */ + +(function(factory) { + if (exports && typeof exports === 'object' && "object" !== 'undefined') { + module.exports = factory(); + } else if (true) { + !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), + __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? + (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), + __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + } else {} +})(function() { + 'use strict'; + return function isWindows() { + return process && (process.platform === 'win32' || /^(msys|cygwin)$/.test(process.env.OSTYPE)); + }; +}); + + +/***/ }), +/* 203 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +/*! + * define-property + * + * Copyright (c) 2015-2018, Jon Schlinkert. + * Released under the MIT License. + */ + + + +var isobject = __webpack_require__(81); +var isDescriptor = __webpack_require__(204); +var define = (typeof Reflect !== 'undefined' && Reflect.defineProperty) + ? Reflect.defineProperty + : Object.defineProperty; + +module.exports = function defineProperty(obj, key, val) { + if (!isobject(obj) && typeof obj !== 'function' && !Array.isArray(obj)) { + throw new TypeError('expected an object, function, or array'); + } + + if (typeof key !== 'string') { + throw new TypeError('expected "key" to be a string'); + } + + if (isDescriptor(val)) { + define(obj, key, val); + return obj; + } + + define(obj, key, { + configurable: true, + enumerable: false, + writable: true, + value: val + }); + + return obj; +}; + + +/***/ }), +/* 204 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var isAccessor = __webpack_require__(83); +var isData = __webpack_require__(87); + +module.exports = function isDescriptor(obj, key) { + if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) { + return false; + } + + if ('get' in obj || 'set' in obj) { + return isAccessor(obj, key); + } + + return isData(obj, key); +}; + + +/***/ }), +/* 205 */ +/***/ ((module) => { + +"use strict"; +/*! + * arr-diff + * + * Copyright (c) 2014-2017, Jon Schlinkert. + * Released under the MIT License. + */ + + + +module.exports = function diff(arr/*, arrays*/) { + var len = arguments.length; + var idx = 0; + while (++idx < len) { + arr = diffArray(arr, arguments[idx]); + } + return arr; +}; + +function diffArray(one, two) { + if (!Array.isArray(two)) { + return one.slice(); + } + + var tlen = two.length + var olen = one.length; + var idx = -1; + var arr = []; + + while (++idx < olen) { + var ele = one[idx]; + + var hasEle = false; + for (var i = 0; i < tlen; i++) { + var val = two[i]; + + if (ele === val) { + hasEle = true; + break; + } + } + + if (hasEle === false) { + arr.push(ele); + } + } + return arr; +} + + +/***/ }), +/* 206 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +/*! + * object.pick + * + * Copyright (c) 2014-2015 Jon Schlinkert, contributors. + * Licensed under the MIT License + */ + + + +var isObject = __webpack_require__(81); + +module.exports = function pick(obj, keys) { + if (!isObject(obj) && typeof obj !== 'function') { + return {}; + } + + var res = {}; + if (typeof keys === 'string') { + if (keys in obj) { + res[keys] = obj[keys]; + } + return res; + } + + var len = keys.length; + var idx = -1; + + while (++idx < len) { + var key = keys[idx]; + if (key in obj) { + res[key] = obj[key]; + } + } + return res; +}; + + +/***/ }), +/* 207 */ +/***/ ((module) => { + +var toString = Object.prototype.toString; + +module.exports = function kindOf(val) { + if (val === void 0) return 'undefined'; + if (val === null) return 'null'; + + var type = typeof val; + if (type === 'boolean') return 'boolean'; + if (type === 'string') return 'string'; + if (type === 'number') return 'number'; + if (type === 'symbol') return 'symbol'; + if (type === 'function') { + return isGeneratorFn(val) ? 'generatorfunction' : 'function'; + } + + if (isArray(val)) return 'array'; + if (isBuffer(val)) return 'buffer'; + if (isArguments(val)) return 'arguments'; + if (isDate(val)) return 'date'; + if (isError(val)) return 'error'; + if (isRegexp(val)) return 'regexp'; + + switch (ctorName(val)) { + case 'Symbol': return 'symbol'; + case 'Promise': return 'promise'; + + // Set, Map, WeakSet, WeakMap + case 'WeakMap': return 'weakmap'; + case 'WeakSet': return 'weakset'; + case 'Map': return 'map'; + case 'Set': return 'set'; + + // 8-bit typed arrays + case 'Int8Array': return 'int8array'; + case 'Uint8Array': return 'uint8array'; + case 'Uint8ClampedArray': return 'uint8clampedarray'; + + // 16-bit typed arrays + case 'Int16Array': return 'int16array'; + case 'Uint16Array': return 'uint16array'; + + // 32-bit typed arrays + case 'Int32Array': return 'int32array'; + case 'Uint32Array': return 'uint32array'; + case 'Float32Array': return 'float32array'; + case 'Float64Array': return 'float64array'; + } + + if (isGeneratorObj(val)) { + return 'generator'; + } + + // Non-plain objects + type = toString.call(val); + switch (type) { + case '[object Object]': return 'object'; + // iterators + case '[object Map Iterator]': return 'mapiterator'; + case '[object Set Iterator]': return 'setiterator'; + case '[object String Iterator]': return 'stringiterator'; + case '[object Array Iterator]': return 'arrayiterator'; + } + + // other + return type.slice(8, -1).toLowerCase().replace(/\s/g, ''); +}; + +function ctorName(val) { + return typeof val.constructor === 'function' ? val.constructor.name : null; +} + +function isArray(val) { + if (Array.isArray) return Array.isArray(val); + return val instanceof Array; +} + +function isError(val) { + return val instanceof Error || (typeof val.message === 'string' && val.constructor && typeof val.constructor.stackTraceLimit === 'number'); +} + +function isDate(val) { + if (val instanceof Date) return true; + return typeof val.toDateString === 'function' + && typeof val.getDate === 'function' + && typeof val.setDate === 'function'; +} + +function isRegexp(val) { + if (val instanceof RegExp) return true; + return typeof val.flags === 'string' + && typeof val.ignoreCase === 'boolean' + && typeof val.multiline === 'boolean' + && typeof val.global === 'boolean'; +} + +function isGeneratorFn(name, val) { + return ctorName(name) === 'GeneratorFunction'; +} + +function isGeneratorObj(val) { + return typeof val.throw === 'function' + && typeof val.return === 'function' + && typeof val.next === 'function'; +} + +function isArguments(val) { + try { + if (typeof val.length === 'number' && typeof val.callee === 'function') { + return true; + } + } catch (err) { + if (err.message.indexOf('callee') !== -1) { + return true; + } + } + return false; +} + +/** + * If you need to support Safari 5-7 (8-10 yr-old browser), + * take a look at https://github.com/feross/is-buffer + */ + +function isBuffer(val) { + if (val.constructor && typeof val.constructor.isBuffer === 'function') { + return val.constructor.isBuffer(val); + } + return false; +} + + +/***/ }), +/* 208 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +/** + * Module dependencies + */ + +var extend = __webpack_require__(96); +var unique = __webpack_require__(95); +var toRegex = __webpack_require__(73); + +/** + * Local dependencies + */ + +var compilers = __webpack_require__(209); +var parsers = __webpack_require__(220); +var Extglob = __webpack_require__(224); +var utils = __webpack_require__(223); +var MAX_LENGTH = 1024 * 64; + +/** + * Convert the given `extglob` pattern into a regex-compatible string. Returns + * an object with the compiled result and the parsed AST. + * + * ```js + * var extglob = require('extglob'); + * console.log(extglob('*.!(*a)')); + * //=> '(?!\\.)[^/]*?\\.(?!(?!\\.)[^/]*?a\\b).*?' + * ``` + * @param {String} `pattern` + * @param {Object} `options` + * @return {String} + * @api public + */ + +function extglob(pattern, options) { + return extglob.create(pattern, options).output; +} + +/** + * Takes an array of strings and an extglob pattern and returns a new + * array that contains only the strings that match the pattern. + * + * ```js + * var extglob = require('extglob'); + * console.log(extglob.match(['a.a', 'a.b', 'a.c'], '*.!(*a)')); + * //=> ['a.b', 'a.c'] + * ``` + * @param {Array} `list` Array of strings to match + * @param {String} `pattern` Extglob pattern + * @param {Object} `options` + * @return {Array} Returns an array of matches + * @api public + */ + +extglob.match = function(list, pattern, options) { + if (typeof pattern !== 'string') { + throw new TypeError('expected pattern to be a string'); + } + + list = utils.arrayify(list); + var isMatch = extglob.matcher(pattern, options); + var len = list.length; + var idx = -1; + var matches = []; + + while (++idx < len) { + var ele = list[idx]; + + if (isMatch(ele)) { + matches.push(ele); + } + } + + // if no options were passed, uniquify results and return + if (typeof options === 'undefined') { + return unique(matches); + } + + if (matches.length === 0) { + if (options.failglob === true) { + throw new Error('no matches found for "' + pattern + '"'); + } + if (options.nonull === true || options.nullglob === true) { + return [pattern.split('\\').join('')]; + } + } + + return options.nodupes !== false ? unique(matches) : matches; +}; + +/** + * Returns true if the specified `string` matches the given + * extglob `pattern`. + * + * ```js + * var extglob = require('extglob'); + * + * console.log(extglob.isMatch('a.a', '*.!(*a)')); + * //=> false + * console.log(extglob.isMatch('a.b', '*.!(*a)')); + * //=> true + * ``` + * @param {String} `string` String to match + * @param {String} `pattern` Extglob pattern + * @param {String} `options` + * @return {Boolean} + * @api public + */ + +extglob.isMatch = function(str, pattern, options) { + if (typeof pattern !== 'string') { + throw new TypeError('expected pattern to be a string'); + } + + if (typeof str !== 'string') { + throw new TypeError('expected a string'); + } + + if (pattern === str) { + return true; + } + + if (pattern === '' || pattern === ' ' || pattern === '.') { + return pattern === str; + } + + var isMatch = utils.memoize('isMatch', pattern, options, extglob.matcher); + return isMatch(str); +}; + +/** + * Returns true if the given `string` contains the given pattern. Similar to `.isMatch` but + * the pattern can match any part of the string. + * + * ```js + * var extglob = require('extglob'); + * console.log(extglob.contains('aa/bb/cc', '*b')); + * //=> true + * console.log(extglob.contains('aa/bb/cc', '*d')); + * //=> false + * ``` + * @param {String} `str` The string to match. + * @param {String} `pattern` Glob pattern to use for matching. + * @param {Object} `options` + * @return {Boolean} Returns true if the patter matches any part of `str`. + * @api public + */ + +extglob.contains = function(str, pattern, options) { + if (typeof str !== 'string') { + throw new TypeError('expected a string'); + } + + if (pattern === '' || pattern === ' ' || pattern === '.') { + return pattern === str; + } + + var opts = extend({}, options, {contains: true}); + opts.strictClose = false; + opts.strictOpen = false; + return extglob.isMatch(str, pattern, opts); +}; + +/** + * Takes an extglob pattern and returns a matcher function. The returned + * function takes the string to match as its only argument. + * + * ```js + * var extglob = require('extglob'); + * var isMatch = extglob.matcher('*.!(*a)'); + * + * console.log(isMatch('a.a')); + * //=> false + * console.log(isMatch('a.b')); + * //=> true + * ``` + * @param {String} `pattern` Extglob pattern + * @param {String} `options` + * @return {Boolean} + * @api public + */ + +extglob.matcher = function(pattern, options) { + if (typeof pattern !== 'string') { + throw new TypeError('expected pattern to be a string'); + } + + function matcher() { + var re = extglob.makeRe(pattern, options); + return function(str) { + return re.test(str); + }; + } + + return utils.memoize('matcher', pattern, options, matcher); +}; + +/** + * Convert the given `extglob` pattern into a regex-compatible string. Returns + * an object with the compiled result and the parsed AST. + * + * ```js + * var extglob = require('extglob'); + * console.log(extglob.create('*.!(*a)').output); + * //=> '(?!\\.)[^/]*?\\.(?!(?!\\.)[^/]*?a\\b).*?' + * ``` + * @param {String} `str` + * @param {Object} `options` + * @return {String} + * @api public + */ + +extglob.create = function(pattern, options) { + if (typeof pattern !== 'string') { + throw new TypeError('expected pattern to be a string'); + } + + function create() { + var ext = new Extglob(options); + var ast = ext.parse(pattern, options); + return ext.compile(ast, options); + } + + return utils.memoize('create', pattern, options, create); +}; + +/** + * Returns an array of matches captured by `pattern` in `string`, or `null` + * if the pattern did not match. + * + * ```js + * var extglob = require('extglob'); + * extglob.capture(pattern, string[, options]); + * + * console.log(extglob.capture('test/*.js', 'test/foo.js')); + * //=> ['foo'] + * console.log(extglob.capture('test/*.js', 'foo/bar.css')); + * //=> null + * ``` + * @param {String} `pattern` Glob pattern to use for matching. + * @param {String} `string` String to match + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Boolean} Returns an array of captures if the string matches the glob pattern, otherwise `null`. + * @api public + */ + +extglob.capture = function(pattern, str, options) { + var re = extglob.makeRe(pattern, extend({capture: true}, options)); + + function match() { + return function(string) { + var match = re.exec(string); + if (!match) { + return null; + } + + return match.slice(1); + }; + } + + var capture = utils.memoize('capture', pattern, options, match); + return capture(str); +}; + +/** + * Create a regular expression from the given `pattern` and `options`. + * + * ```js + * var extglob = require('extglob'); + * var re = extglob.makeRe('*.!(*a)'); + * console.log(re); + * //=> /^[^\/]*?\.(?![^\/]*?a)[^\/]*?$/ + * ``` + * @param {String} `pattern` The pattern to convert to regex. + * @param {Object} `options` + * @return {RegExp} + * @api public + */ + +extglob.makeRe = function(pattern, options) { + if (pattern instanceof RegExp) { + return pattern; + } + + if (typeof pattern !== 'string') { + throw new TypeError('expected pattern to be a string'); + } + + if (pattern.length > MAX_LENGTH) { + throw new Error('expected pattern to be less than ' + MAX_LENGTH + ' characters'); + } + + function makeRe() { + var opts = extend({strictErrors: false}, options); + if (opts.strictErrors === true) opts.strict = true; + var res = extglob.create(pattern, opts); + return toRegex(res.output, opts); + } + + var regex = utils.memoize('makeRe', pattern, options, makeRe); + if (regex.source.length > MAX_LENGTH) { + throw new SyntaxError('potentially malicious regex detected'); + } + + return regex; +}; + +/** + * Cache + */ + +extglob.cache = utils.cache; +extglob.clearCache = function() { + extglob.cache.__data__ = {}; +}; + +/** + * Expose `Extglob` constructor, parsers and compilers + */ + +extglob.Extglob = Extglob; +extglob.compilers = compilers; +extglob.parsers = parsers; + +/** + * Expose `extglob` + * @type {Function} + */ + +module.exports = extglob; + + +/***/ }), +/* 209 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var brackets = __webpack_require__(210); + +/** + * Extglob compilers + */ + +module.exports = function(extglob) { + function star() { + if (typeof extglob.options.star === 'function') { + return extglob.options.star.apply(this, arguments); + } + if (typeof extglob.options.star === 'string') { + return extglob.options.star; + } + return '.*?'; + } + + /** + * Use `expand-brackets` compilers + */ + + extglob.use(brackets.compilers); + extglob.compiler + + /** + * Escaped: "\\*" + */ + + .set('escape', function(node) { + return this.emit(node.val, node); + }) + + /** + * Dot: "." + */ + + .set('dot', function(node) { + return this.emit('\\' + node.val, node); + }) + + /** + * Question mark: "?" + */ + + .set('qmark', function(node) { + var val = '[^\\\\/.]'; + var prev = this.prev(); + + if (node.parsed.slice(-1) === '(') { + var ch = node.rest.charAt(0); + if (ch !== '!' && ch !== '=' && ch !== ':') { + return this.emit(val, node); + } + return this.emit(node.val, node); + } + + if (prev.type === 'text' && prev.val) { + return this.emit(val, node); + } + + if (node.val.length > 1) { + val += '{' + node.val.length + '}'; + } + return this.emit(val, node); + }) + + /** + * Plus: "+" + */ + + .set('plus', function(node) { + var prev = node.parsed.slice(-1); + if (prev === ']' || prev === ')') { + return this.emit(node.val, node); + } + var ch = this.output.slice(-1); + if (!this.output || (/[?*+]/.test(ch) && node.parent.type !== 'bracket')) { + return this.emit('\\+', node); + } + if (/\w/.test(ch) && !node.inside) { + return this.emit('+\\+?', node); + } + return this.emit('+', node); + }) + + /** + * Star: "*" + */ + + .set('star', function(node) { + var prev = this.prev(); + var prefix = prev.type !== 'text' && prev.type !== 'escape' + ? '(?!\\.)' + : ''; + + return this.emit(prefix + star.call(this, node), node); + }) + + /** + * Parens + */ + + .set('paren', function(node) { + return this.mapVisit(node.nodes); + }) + .set('paren.open', function(node) { + var capture = this.options.capture ? '(' : ''; + + switch (node.parent.prefix) { + case '!': + case '^': + return this.emit(capture + '(?:(?!(?:', node); + case '*': + case '+': + case '?': + case '@': + return this.emit(capture + '(?:', node); + default: { + var val = node.val; + if (this.options.bash === true) { + val = '\\' + val; + } else if (!this.options.capture && val === '(' && node.parent.rest[0] !== '?') { + val += '?:'; + } + + return this.emit(val, node); + } + } + }) + .set('paren.close', function(node) { + var capture = this.options.capture ? ')' : ''; + + switch (node.prefix) { + case '!': + case '^': + var prefix = /^(\)|$)/.test(node.rest) ? '$' : ''; + var str = star.call(this, node); + + // if the extglob has a slash explicitly defined, we know the user wants + // to match slashes, so we need to ensure the "star" regex allows for it + if (node.parent.hasSlash && !this.options.star && this.options.slash !== false) { + str = '.*?'; + } + + return this.emit(prefix + ('))' + str + ')') + capture, node); + case '*': + case '+': + case '?': + return this.emit(')' + node.prefix + capture, node); + case '@': + return this.emit(')' + capture, node); + default: { + var val = (this.options.bash === true ? '\\' : '') + ')'; + return this.emit(val, node); + } + } + }) + + /** + * Text + */ + + .set('text', function(node) { + var val = node.val.replace(/[\[\]]/g, '\\$&'); + return this.emit(val, node); + }); +}; + + +/***/ }), +/* 210 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +/** + * Local dependencies + */ + +var compilers = __webpack_require__(211); +var parsers = __webpack_require__(213); + +/** + * Module dependencies + */ + +var debug = __webpack_require__(215)('expand-brackets'); +var extend = __webpack_require__(96); +var Snapdragon = __webpack_require__(118); +var toRegex = __webpack_require__(73); + +/** + * Parses the given POSIX character class `pattern` and returns a + * string that can be used for creating regular expressions for matching. + * + * @param {String} `pattern` + * @param {Object} `options` + * @return {Object} + * @api public + */ + +function brackets(pattern, options) { + debug('initializing from <%s>', __filename); + var res = brackets.create(pattern, options); + return res.output; +} + +/** + * Takes an array of strings and a POSIX character class pattern, and returns a new + * array with only the strings that matched the pattern. + * + * ```js + * var brackets = require('expand-brackets'); + * console.log(brackets.match(['1', 'a', 'ab'], '[[:alpha:]]')); + * //=> ['a'] + * + * console.log(brackets.match(['1', 'a', 'ab'], '[[:alpha:]]+')); + * //=> ['a', 'ab'] + * ``` + * @param {Array} `arr` Array of strings to match + * @param {String} `pattern` POSIX character class pattern(s) + * @param {Object} `options` + * @return {Array} + * @api public + */ + +brackets.match = function(arr, pattern, options) { + arr = [].concat(arr); + var opts = extend({}, options); + var isMatch = brackets.matcher(pattern, opts); + var len = arr.length; + var idx = -1; + var res = []; + + while (++idx < len) { + var ele = arr[idx]; + if (isMatch(ele)) { + res.push(ele); + } + } + + if (res.length === 0) { + if (opts.failglob === true) { + throw new Error('no matches found for "' + pattern + '"'); + } + + if (opts.nonull === true || opts.nullglob === true) { + return [pattern.split('\\').join('')]; + } + } + return res; +}; + +/** + * Returns true if the specified `string` matches the given + * brackets `pattern`. + * + * ```js + * var brackets = require('expand-brackets'); + * + * console.log(brackets.isMatch('a.a', '[[:alpha:]].[[:alpha:]]')); + * //=> true + * console.log(brackets.isMatch('1.2', '[[:alpha:]].[[:alpha:]]')); + * //=> false + * ``` + * @param {String} `string` String to match + * @param {String} `pattern` Poxis pattern + * @param {String} `options` + * @return {Boolean} + * @api public + */ + +brackets.isMatch = function(str, pattern, options) { + return brackets.matcher(pattern, options)(str); +}; + +/** + * Takes a POSIX character class pattern and returns a matcher function. The returned + * function takes the string to match as its only argument. + * + * ```js + * var brackets = require('expand-brackets'); + * var isMatch = brackets.matcher('[[:lower:]].[[:upper:]]'); + * + * console.log(isMatch('a.a')); + * //=> false + * console.log(isMatch('a.A')); + * //=> true + * ``` + * @param {String} `pattern` Poxis pattern + * @param {String} `options` + * @return {Boolean} + * @api public + */ + +brackets.matcher = function(pattern, options) { + var re = brackets.makeRe(pattern, options); + return function(str) { + return re.test(str); + }; +}; + +/** + * Create a regular expression from the given `pattern`. + * + * ```js + * var brackets = require('expand-brackets'); + * var re = brackets.makeRe('[[:alpha:]]'); + * console.log(re); + * //=> /^(?:[a-zA-Z])$/ + * ``` + * @param {String} `pattern` The pattern to convert to regex. + * @param {Object} `options` + * @return {RegExp} + * @api public + */ + +brackets.makeRe = function(pattern, options) { + var res = brackets.create(pattern, options); + var opts = extend({strictErrors: false}, options); + return toRegex(res.output, opts); +}; + +/** + * Parses the given POSIX character class `pattern` and returns an object + * with the compiled `output` and optional source `map`. + * + * ```js + * var brackets = require('expand-brackets'); + * console.log(brackets('[[:alpha:]]')); + * // { options: { source: 'string' }, + * // input: '[[:alpha:]]', + * // state: {}, + * // compilers: + * // { eos: [Function], + * // noop: [Function], + * // bos: [Function], + * // not: [Function], + * // escape: [Function], + * // text: [Function], + * // posix: [Function], + * // bracket: [Function], + * // 'bracket.open': [Function], + * // 'bracket.inner': [Function], + * // 'bracket.literal': [Function], + * // 'bracket.close': [Function] }, + * // output: '[a-zA-Z]', + * // ast: + * // { type: 'root', + * // errors: [], + * // nodes: [ [Object], [Object], [Object] ] }, + * // parsingErrors: [] } + * ``` + * @param {String} `pattern` + * @param {Object} `options` + * @return {Object} + * @api public + */ + +brackets.create = function(pattern, options) { + var snapdragon = (options && options.snapdragon) || new Snapdragon(options); + compilers(snapdragon); + parsers(snapdragon); + + var ast = snapdragon.parse(pattern, options); + ast.input = pattern; + var res = snapdragon.compile(ast, options); + res.input = pattern; + return res; +}; + +/** + * Expose `brackets` constructor, parsers and compilers + */ + +brackets.compilers = compilers; +brackets.parsers = parsers; + +/** + * Expose `brackets` + * @type {Function} + */ + +module.exports = brackets; + + +/***/ }), +/* 211 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var posix = __webpack_require__(212); + +module.exports = function(brackets) { + brackets.compiler + + /** + * Escaped characters + */ + + .set('escape', function(node) { + return this.emit('\\' + node.val.replace(/^\\/, ''), node); + }) + + /** + * Text + */ + + .set('text', function(node) { + return this.emit(node.val.replace(/([{}])/g, '\\$1'), node); + }) + + /** + * POSIX character classes + */ + + .set('posix', function(node) { + if (node.val === '[::]') { + return this.emit('\\[::\\]', node); + } + + var val = posix[node.inner]; + if (typeof val === 'undefined') { + val = '[' + node.inner + ']'; + } + return this.emit(val, node); + }) + + /** + * Non-posix brackets + */ + + .set('bracket', function(node) { + return this.mapVisit(node.nodes); + }) + .set('bracket.open', function(node) { + return this.emit(node.val, node); + }) + .set('bracket.inner', function(node) { + var inner = node.val; + + if (inner === '[' || inner === ']') { + return this.emit('\\' + node.val, node); + } + if (inner === '^]') { + return this.emit('^\\]', node); + } + if (inner === '^') { + return this.emit('^', node); + } + + if (/-/.test(inner) && !/(\d-\d|\w-\w)/.test(inner)) { + inner = inner.split('-').join('\\-'); + } + + var isNegated = inner.charAt(0) === '^'; + // add slashes to negated brackets, per spec + if (isNegated && inner.indexOf('/') === -1) { + inner += '/'; + } + if (isNegated && inner.indexOf('.') === -1) { + inner += '.'; + } + + // don't unescape `0` (octal literal) + inner = inner.replace(/\\([1-9])/g, '$1'); + return this.emit(inner, node); + }) + .set('bracket.close', function(node) { + var val = node.val.replace(/^\\/, ''); + if (node.parent.escaped === true) { + return this.emit('\\' + val, node); + } + return this.emit(val, node); + }); +}; + + +/***/ }), +/* 212 */ +/***/ ((module) => { + +"use strict"; + + +/** + * POSIX character classes + */ + +module.exports = { + alnum: 'a-zA-Z0-9', + alpha: 'a-zA-Z', + ascii: '\\x00-\\x7F', + blank: ' \\t', + cntrl: '\\x00-\\x1F\\x7F', + digit: '0-9', + graph: '\\x21-\\x7E', + lower: 'a-z', + print: '\\x20-\\x7E ', + punct: '\\-!"#$%&\'()\\*+,./:;<=>?@[\\]^_`{|}~', + space: ' \\t\\r\\n\\v\\f', + upper: 'A-Z', + word: 'A-Za-z0-9_', + xdigit: 'A-Fa-f0-9' +}; + + +/***/ }), +/* 213 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var utils = __webpack_require__(214); +var define = __webpack_require__(148); + +/** + * Text regex + */ + +var TEXT_REGEX = '(\\[(?=.*\\])|\\])+'; +var not = utils.createRegex(TEXT_REGEX); + +/** + * Brackets parsers + */ + +function parsers(brackets) { + brackets.state = brackets.state || {}; + brackets.parser.sets.bracket = brackets.parser.sets.bracket || []; + brackets.parser + + .capture('escape', function() { + if (this.isInside('bracket')) return; + var pos = this.position(); + var m = this.match(/^\\(.)/); + if (!m) return; + + return pos({ + type: 'escape', + val: m[0] + }); + }) + + /** + * Text parser + */ + + .capture('text', function() { + if (this.isInside('bracket')) return; + var pos = this.position(); + var m = this.match(not); + if (!m || !m[0]) return; + + return pos({ + type: 'text', + val: m[0] + }); + }) + + /** + * POSIX character classes: "[[:alpha:][:digits:]]" + */ + + .capture('posix', function() { + var pos = this.position(); + var m = this.match(/^\[:(.*?):\](?=.*\])/); + if (!m) return; + + var inside = this.isInside('bracket'); + if (inside) { + brackets.posix++; + } + + return pos({ + type: 'posix', + insideBracket: inside, + inner: m[1], + val: m[0] + }); + }) + + /** + * Bracket (noop) + */ + + .capture('bracket', function() {}) + + /** + * Open: '[' + */ + + .capture('bracket.open', function() { + var parsed = this.parsed; + var pos = this.position(); + var m = this.match(/^\[(?=.*\])/); + if (!m) return; + + var prev = this.prev(); + var last = utils.last(prev.nodes); + + if (parsed.slice(-1) === '\\' && !this.isInside('bracket')) { + last.val = last.val.slice(0, last.val.length - 1); + return pos({ + type: 'escape', + val: m[0] + }); + } + + var open = pos({ + type: 'bracket.open', + val: m[0] + }); + + if (last.type === 'bracket.open' || this.isInside('bracket')) { + open.val = '\\' + open.val; + open.type = 'bracket.inner'; + open.escaped = true; + return open; + } + + var node = pos({ + type: 'bracket', + nodes: [open] + }); + + define(node, 'parent', prev); + define(open, 'parent', node); + this.push('bracket', node); + prev.nodes.push(node); + }) + + /** + * Bracket text + */ + + .capture('bracket.inner', function() { + if (!this.isInside('bracket')) return; + var pos = this.position(); + var m = this.match(not); + if (!m || !m[0]) return; + + var next = this.input.charAt(0); + var val = m[0]; + + var node = pos({ + type: 'bracket.inner', + val: val + }); + + if (val === '\\\\') { + return node; + } + + var first = val.charAt(0); + var last = val.slice(-1); + + if (first === '!') { + val = '^' + val.slice(1); + } + + if (last === '\\' || (val === '^' && next === ']')) { + val += this.input[0]; + this.consume(1); + } + + node.val = val; + return node; + }) + + /** + * Close: ']' + */ + + .capture('bracket.close', function() { + var parsed = this.parsed; + var pos = this.position(); + var m = this.match(/^\]/); + if (!m) return; + + var prev = this.prev(); + var last = utils.last(prev.nodes); + + if (parsed.slice(-1) === '\\' && !this.isInside('bracket')) { + last.val = last.val.slice(0, last.val.length - 1); + + return pos({ + type: 'escape', + val: m[0] + }); + } + + var node = pos({ + type: 'bracket.close', + rest: this.input, + val: m[0] + }); + + if (last.type === 'bracket.open') { + node.type = 'bracket.inner'; + node.escaped = true; + return node; + } + + var bracket = this.pop('bracket'); + if (!this.isType(bracket, 'bracket')) { + if (this.options.strict) { + throw new Error('missing opening "["'); + } + node.type = 'bracket.inner'; + node.escaped = true; + return node; + } + + bracket.nodes.push(node); + define(node, 'parent', bracket); + }); +} + +/** + * Brackets parsers + */ + +module.exports = parsers; + +/** + * Expose text regex + */ + +module.exports.TEXT_REGEX = TEXT_REGEX; + + +/***/ }), +/* 214 */ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + + +var toRegex = __webpack_require__(73); +var regexNot = __webpack_require__(92); +var cached; + +/** + * Get the last element from `array` + * @param {Array} `array` + * @return {*} + */ + +exports.last = function(arr) { + return arr[arr.length - 1]; +}; + +/** + * Create and cache regex to use for text nodes + */ + +exports.createRegex = function(pattern, include) { + if (cached) return cached; + var opts = {contains: true, strictClose: false}; + var not = regexNot.create(pattern, opts); + var re; + + if (typeof include === 'string') { + re = toRegex('^(?:' + include + '|' + not + ')', opts); + } else { + re = toRegex(not, opts); + } + + return (cached = re); +}; + + +/***/ }), +/* 215 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +/** + * Detect Electron renderer process, which is node, but we should + * treat as a browser. + */ + +if (typeof process !== 'undefined' && process.type === 'renderer') { + module.exports = __webpack_require__(216); +} else { + module.exports = __webpack_require__(219); +} + + +/***/ }), +/* 216 */ +/***/ ((module, exports, __webpack_require__) => { + +/** + * This is the web browser implementation of `debug()`. + * + * Expose `debug()` as the module. + */ + +exports = module.exports = __webpack_require__(217); +exports.log = log; +exports.formatArgs = formatArgs; +exports.save = save; +exports.load = load; +exports.useColors = useColors; +exports.storage = 'undefined' != typeof chrome + && 'undefined' != typeof chrome.storage + ? chrome.storage.local + : localstorage(); + +/** + * Colors. + */ + +exports.colors = [ + 'lightseagreen', + 'forestgreen', + 'goldenrod', + 'dodgerblue', + 'darkorchid', + 'crimson' +]; + +/** + * Currently only WebKit-based Web Inspectors, Firefox >= v31, + * and the Firebug extension (any Firefox version) are known + * to support "%c" CSS customizations. + * + * TODO: add a `localStorage` variable to explicitly enable/disable colors + */ + +function useColors() { + // NB: In an Electron preload script, document will be defined but not fully + // initialized. Since we know we're in Chrome, we'll just detect this case + // explicitly + if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') { + return true; + } + + // is webkit? http://stackoverflow.com/a/16459606/376773 + // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 + return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || + // is firebug? http://stackoverflow.com/a/398120/376773 + (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) || + // is firefox >= v31? + // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages + (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) || + // double check webkit in userAgent just in case we are in a worker + (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)); +} + +/** + * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. + */ + +exports.formatters.j = function(v) { + try { + return JSON.stringify(v); + } catch (err) { + return '[UnexpectedJSONParseError]: ' + err.message; + } +}; + + +/** + * Colorize log arguments if enabled. + * + * @api public + */ + +function formatArgs(args) { + var useColors = this.useColors; + + args[0] = (useColors ? '%c' : '') + + this.namespace + + (useColors ? ' %c' : ' ') + + args[0] + + (useColors ? '%c ' : ' ') + + '+' + exports.humanize(this.diff); + + if (!useColors) return; + + var c = 'color: ' + this.color; + args.splice(1, 0, c, 'color: inherit') + + // the final "%c" is somewhat tricky, because there could be other + // arguments passed either before or after the %c, so we need to + // figure out the correct index to insert the CSS into + var index = 0; + var lastC = 0; + args[0].replace(/%[a-zA-Z%]/g, function(match) { + if ('%%' === match) return; + index++; + if ('%c' === match) { + // we only are interested in the *last* %c + // (the user may have provided their own) + lastC = index; + } + }); + + args.splice(lastC, 0, c); +} + +/** + * Invokes `console.log()` when available. + * No-op when `console.log` is not a "function". + * + * @api public + */ + +function log() { + // this hackery is required for IE8/9, where + // the `console.log` function doesn't have 'apply' + return 'object' === typeof console + && console.log + && Function.prototype.apply.call(console.log, console, arguments); +} + +/** + * Save `namespaces`. + * + * @param {String} namespaces + * @api private + */ + +function save(namespaces) { + try { + if (null == namespaces) { + exports.storage.removeItem('debug'); + } else { + exports.storage.debug = namespaces; + } + } catch(e) {} +} + +/** + * Load `namespaces`. + * + * @return {String} returns the previously persisted debug modes + * @api private + */ + +function load() { + var r; + try { + r = exports.storage.debug; + } catch(e) {} + + // If debug isn't set in LS, and we're in Electron, try to load $DEBUG + if (!r && typeof process !== 'undefined' && 'env' in process) { + r = process.env.DEBUG; + } + + return r; +} + +/** + * Enable namespaces listed in `localStorage.debug` initially. + */ + +exports.enable(load()); + +/** + * Localstorage attempts to return the localstorage. + * + * This is necessary because safari throws + * when a user disables cookies/localstorage + * and you attempt to access it. + * + * @return {LocalStorage} + * @api private + */ + +function localstorage() { + try { + return window.localStorage; + } catch (e) {} +} + + +/***/ }), +/* 217 */ +/***/ ((module, exports, __webpack_require__) => { + + +/** + * This is the common logic for both the Node.js and web browser + * implementations of `debug()`. + * + * Expose `debug()` as the module. + */ + +exports = module.exports = createDebug.debug = createDebug['default'] = createDebug; +exports.coerce = coerce; +exports.disable = disable; +exports.enable = enable; +exports.enabled = enabled; +exports.humanize = __webpack_require__(218); + +/** + * The currently active debug mode names, and names to skip. + */ + +exports.names = []; +exports.skips = []; + +/** + * Map of special "%n" handling functions, for the debug "format" argument. + * + * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". + */ + +exports.formatters = {}; + +/** + * Previous log timestamp. + */ + +var prevTime; + +/** + * Select a color. + * @param {String} namespace + * @return {Number} + * @api private + */ + +function selectColor(namespace) { + var hash = 0, i; + + for (i in namespace) { + hash = ((hash << 5) - hash) + namespace.charCodeAt(i); + hash |= 0; // Convert to 32bit integer + } + + return exports.colors[Math.abs(hash) % exports.colors.length]; +} + +/** + * Create a debugger with the given `namespace`. + * + * @param {String} namespace + * @return {Function} + * @api public + */ + +function createDebug(namespace) { + + function debug() { + // disabled? + if (!debug.enabled) return; + + var self = debug; + + // set `diff` timestamp + var curr = +new Date(); + var ms = curr - (prevTime || curr); + self.diff = ms; + self.prev = prevTime; + self.curr = curr; + prevTime = curr; + + // turn the `arguments` into a proper Array + var args = new Array(arguments.length); + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i]; + } + + args[0] = exports.coerce(args[0]); + + if ('string' !== typeof args[0]) { + // anything else let's inspect with %O + args.unshift('%O'); + } + + // apply any `formatters` transformations + var index = 0; + args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) { + // if we encounter an escaped % then don't increase the array index + if (match === '%%') return match; + index++; + var formatter = exports.formatters[format]; + if ('function' === typeof formatter) { + var val = args[index]; + match = formatter.call(self, val); + + // now we need to remove `args[index]` since it's inlined in the `format` + args.splice(index, 1); + index--; + } + return match; + }); + + // apply env-specific formatting (colors, etc.) + exports.formatArgs.call(self, args); + + var logFn = debug.log || exports.log || console.log.bind(console); + logFn.apply(self, args); + } + + debug.namespace = namespace; + debug.enabled = exports.enabled(namespace); + debug.useColors = exports.useColors(); + debug.color = selectColor(namespace); + + // env-specific initialization logic for debug instances + if ('function' === typeof exports.init) { + exports.init(debug); + } + + return debug; +} + +/** + * Enables a debug mode by namespaces. This can include modes + * separated by a colon and wildcards. + * + * @param {String} namespaces + * @api public + */ + +function enable(namespaces) { + exports.save(namespaces); + + exports.names = []; + exports.skips = []; + + var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); + var len = split.length; + + for (var i = 0; i < len; i++) { + if (!split[i]) continue; // ignore empty strings + namespaces = split[i].replace(/\*/g, '.*?'); + if (namespaces[0] === '-') { + exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); + } else { + exports.names.push(new RegExp('^' + namespaces + '$')); + } + } +} + +/** + * Disable debug output. + * + * @api public + */ + +function disable() { + exports.enable(''); +} + +/** + * Returns true if the given mode name is enabled, false otherwise. + * + * @param {String} name + * @return {Boolean} + * @api public + */ + +function enabled(name) { + var i, len; + for (i = 0, len = exports.skips.length; i < len; i++) { + if (exports.skips[i].test(name)) { + return false; + } + } + for (i = 0, len = exports.names.length; i < len; i++) { + if (exports.names[i].test(name)) { + return true; + } + } + return false; +} + +/** + * Coerce `val`. + * + * @param {Mixed} val + * @return {Mixed} + * @api private + */ + +function coerce(val) { + if (val instanceof Error) return val.stack || val.message; + return val; +} + + +/***/ }), +/* 218 */ +/***/ ((module) => { + +/** + * Helpers. + */ + +var s = 1000; +var m = s * 60; +var h = m * 60; +var d = h * 24; +var y = d * 365.25; + +/** + * Parse or format the given `val`. + * + * Options: + * + * - `long` verbose formatting [false] + * + * @param {String|Number} val + * @param {Object} [options] + * @throws {Error} throw an error if val is not a non-empty string or a number + * @return {String|Number} + * @api public + */ + +module.exports = function(val, options) { + options = options || {}; + var type = typeof val; + if (type === 'string' && val.length > 0) { + return parse(val); + } else if (type === 'number' && isNaN(val) === false) { + return options.long ? fmtLong(val) : fmtShort(val); + } + throw new Error( + 'val is not a non-empty string or a valid number. val=' + + JSON.stringify(val) + ); +}; + +/** + * Parse the given `str` and return milliseconds. + * + * @param {String} str + * @return {Number} + * @api private + */ + +function parse(str) { + str = String(str); + if (str.length > 100) { + return; + } + var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec( + str + ); + if (!match) { + return; + } + var n = parseFloat(match[1]); + var type = (match[2] || 'ms').toLowerCase(); + switch (type) { + case 'years': + case 'year': + case 'yrs': + case 'yr': + case 'y': + return n * y; + case 'days': + case 'day': + case 'd': + return n * d; + case 'hours': + case 'hour': + case 'hrs': + case 'hr': + case 'h': + return n * h; + case 'minutes': + case 'minute': + case 'mins': + case 'min': + case 'm': + return n * m; + case 'seconds': + case 'second': + case 'secs': + case 'sec': + case 's': + return n * s; + case 'milliseconds': + case 'millisecond': + case 'msecs': + case 'msec': + case 'ms': + return n; + default: + return undefined; + } +} + +/** + * Short format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtShort(ms) { + if (ms >= d) { + return Math.round(ms / d) + 'd'; + } + if (ms >= h) { + return Math.round(ms / h) + 'h'; + } + if (ms >= m) { + return Math.round(ms / m) + 'm'; + } + if (ms >= s) { + return Math.round(ms / s) + 's'; + } + return ms + 'ms'; +} + +/** + * Long format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtLong(ms) { + return plural(ms, d, 'day') || + plural(ms, h, 'hour') || + plural(ms, m, 'minute') || + plural(ms, s, 'second') || + ms + ' ms'; +} + +/** + * Pluralization helper. + */ + +function plural(ms, n, name) { + if (ms < n) { + return; + } + if (ms < n * 1.5) { + return Math.floor(ms / n) + ' ' + name; + } + return Math.ceil(ms / n) + ' ' + name + 's'; +} + + +/***/ }), +/* 219 */ +/***/ ((module, exports, __webpack_require__) => { + +/** + * Module dependencies. + */ + +var tty = __webpack_require__(161); +var util = __webpack_require__(17); + +/** + * This is the Node.js implementation of `debug()`. + * + * Expose `debug()` as the module. + */ + +exports = module.exports = __webpack_require__(217); +exports.init = init; +exports.log = log; +exports.formatArgs = formatArgs; +exports.save = save; +exports.load = load; +exports.useColors = useColors; + +/** + * Colors. + */ + +exports.colors = [6, 2, 3, 4, 5, 1]; + +/** + * Build up the default `inspectOpts` object from the environment variables. + * + * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js + */ + +exports.inspectOpts = Object.keys(process.env).filter(function (key) { + return /^debug_/i.test(key); +}).reduce(function (obj, key) { + // camel-case + var prop = key + .substring(6) + .toLowerCase() + .replace(/_([a-z])/g, function (_, k) { return k.toUpperCase() }); + + // coerce string value into JS value + var val = process.env[key]; + if (/^(yes|on|true|enabled)$/i.test(val)) val = true; + else if (/^(no|off|false|disabled)$/i.test(val)) val = false; + else if (val === 'null') val = null; + else val = Number(val); + + obj[prop] = val; + return obj; +}, {}); + +/** + * The file descriptor to write the `debug()` calls to. + * Set the `DEBUG_FD` env variable to override with another value. i.e.: + * + * $ DEBUG_FD=3 node script.js 3>debug.log + */ + +var fd = parseInt(process.env.DEBUG_FD, 10) || 2; + +if (1 !== fd && 2 !== fd) { + util.deprecate(function(){}, 'except for stderr(2) and stdout(1), any other usage of DEBUG_FD is deprecated. Override debug.log if you want to use a different log function (https://git.io/debug_fd)')() +} + +var stream = 1 === fd ? process.stdout : + 2 === fd ? process.stderr : + createWritableStdioStream(fd); + +/** + * Is stdout a TTY? Colored output is enabled when `true`. + */ + +function useColors() { + return 'colors' in exports.inspectOpts + ? Boolean(exports.inspectOpts.colors) + : tty.isatty(fd); +} + +/** + * Map %o to `util.inspect()`, all on a single line. + */ + +exports.formatters.o = function(v) { + this.inspectOpts.colors = this.useColors; + return util.inspect(v, this.inspectOpts) + .split('\n').map(function(str) { + return str.trim() + }).join(' '); +}; + +/** + * Map %o to `util.inspect()`, allowing multiple lines if needed. + */ + +exports.formatters.O = function(v) { + this.inspectOpts.colors = this.useColors; + return util.inspect(v, this.inspectOpts); +}; + +/** + * Adds ANSI color escape codes if enabled. + * + * @api public + */ + +function formatArgs(args) { + var name = this.namespace; + var useColors = this.useColors; + + if (useColors) { + var c = this.color; + var prefix = ' \u001b[3' + c + ';1m' + name + ' ' + '\u001b[0m'; + + args[0] = prefix + args[0].split('\n').join('\n' + prefix); + args.push('\u001b[3' + c + 'm+' + exports.humanize(this.diff) + '\u001b[0m'); + } else { + args[0] = new Date().toUTCString() + + ' ' + name + ' ' + args[0]; + } +} + +/** + * Invokes `util.format()` with the specified arguments and writes to `stream`. + */ + +function log() { + return stream.write(util.format.apply(util, arguments) + '\n'); +} + +/** + * Save `namespaces`. + * + * @param {String} namespaces + * @api private + */ + +function save(namespaces) { + if (null == namespaces) { + // If you set a process.env field to null or undefined, it gets cast to the + // string 'null' or 'undefined'. Just delete instead. + delete process.env.DEBUG; + } else { + process.env.DEBUG = namespaces; + } +} + +/** + * Load `namespaces`. + * + * @return {String} returns the previously persisted debug modes + * @api private + */ + +function load() { + return process.env.DEBUG; +} + +/** + * Copied from `node/src/node.js`. + * + * XXX: It's lame that node doesn't expose this API out-of-the-box. It also + * relies on the undocumented `tty_wrap.guessHandleType()` which is also lame. + */ + +function createWritableStdioStream (fd) { + var stream; + var tty_wrap = process.binding('tty_wrap'); + + // Note stream._type is used for test-module-load-list.js + + switch (tty_wrap.guessHandleType(fd)) { + case 'TTY': + stream = new tty.WriteStream(fd); + stream._type = 'tty'; + + // Hack to have stream not keep the event loop alive. + // See https://github.com/joyent/node/issues/1726 + if (stream._handle && stream._handle.unref) { + stream._handle.unref(); + } + break; + + case 'FILE': + var fs = __webpack_require__(11); + stream = new fs.SyncWriteStream(fd, { autoClose: false }); + stream._type = 'fs'; + break; + + case 'PIPE': + case 'TCP': + var net = __webpack_require__(162); + stream = new net.Socket({ + fd: fd, + readable: false, + writable: true + }); + + // FIXME Should probably have an option in net.Socket to create a + // stream from an existing fd which is writable only. But for now + // we'll just add this hack and set the `readable` member to false. + // Test: ./node test/fixtures/echo.js < /etc/passwd + stream.readable = false; + stream.read = null; + stream._type = 'pipe'; + + // FIXME Hack to have stream not keep the event loop alive. + // See https://github.com/joyent/node/issues/1726 + if (stream._handle && stream._handle.unref) { + stream._handle.unref(); + } + break; + + default: + // Probably an error on in uv_guess_handle() + throw new Error('Implement me. Unknown stream file type!'); + } + + // For supporting legacy API we put the FD here. + stream.fd = fd; + + stream._isStdio = true; + + return stream; +} + +/** + * Init logic for `debug` instances. + * + * Create a new `inspectOpts` object in case `useColors` is set + * differently for a particular `debug` instance. + */ + +function init (debug) { + debug.inspectOpts = {}; + + var keys = Object.keys(exports.inspectOpts); + for (var i = 0; i < keys.length; i++) { + debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]]; + } +} + +/** + * Enable namespaces listed in `process.env.DEBUG` initially. + */ + +exports.enable(load()); + + +/***/ }), +/* 220 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var brackets = __webpack_require__(210); +var define = __webpack_require__(221); +var utils = __webpack_require__(223); + +/** + * Characters to use in text regex (we want to "not" match + * characters that are matched by other parsers) + */ + +var TEXT_REGEX = '([!@*?+]?\\(|\\)|[*?.+\\\\]|\\[:?(?=.*\\])|:?\\])+'; +var not = utils.createRegex(TEXT_REGEX); + +/** + * Extglob parsers + */ + +function parsers(extglob) { + extglob.state = extglob.state || {}; + + /** + * Use `expand-brackets` parsers + */ + + extglob.use(brackets.parsers); + extglob.parser.sets.paren = extglob.parser.sets.paren || []; + extglob.parser + + /** + * Extglob open: "*(" + */ + + .capture('paren.open', function() { + var parsed = this.parsed; + var pos = this.position(); + var m = this.match(/^([!@*?+])?\(/); + if (!m) return; + + var prev = this.prev(); + var prefix = m[1]; + var val = m[0]; + + var open = pos({ + type: 'paren.open', + parsed: parsed, + val: val + }); + + var node = pos({ + type: 'paren', + prefix: prefix, + nodes: [open] + }); + + // if nested negation extglobs, just cancel them out to simplify + if (prefix === '!' && prev.type === 'paren' && prev.prefix === '!') { + prev.prefix = '@'; + node.prefix = '@'; + } + + define(node, 'rest', this.input); + define(node, 'parsed', parsed); + define(node, 'parent', prev); + define(open, 'parent', node); + + this.push('paren', node); + prev.nodes.push(node); + }) + + /** + * Extglob close: ")" + */ + + .capture('paren.close', function() { + var parsed = this.parsed; + var pos = this.position(); + var m = this.match(/^\)/); + if (!m) return; + + var parent = this.pop('paren'); + var node = pos({ + type: 'paren.close', + rest: this.input, + parsed: parsed, + val: m[0] + }); + + if (!this.isType(parent, 'paren')) { + if (this.options.strict) { + throw new Error('missing opening paren: "("'); + } + node.escaped = true; + return node; + } + + node.prefix = parent.prefix; + parent.nodes.push(node); + define(node, 'parent', parent); + }) + + /** + * Escape: "\\." + */ + + .capture('escape', function() { + var pos = this.position(); + var m = this.match(/^\\(.)/); + if (!m) return; + + return pos({ + type: 'escape', + val: m[0], + ch: m[1] + }); + }) + + /** + * Question marks: "?" + */ + + .capture('qmark', function() { + var parsed = this.parsed; + var pos = this.position(); + var m = this.match(/^\?+(?!\()/); + if (!m) return; + extglob.state.metachar = true; + return pos({ + type: 'qmark', + rest: this.input, + parsed: parsed, + val: m[0] + }); + }) + + /** + * Character parsers + */ + + .capture('star', /^\*(?!\()/) + .capture('plus', /^\+(?!\()/) + .capture('dot', /^\./) + .capture('text', not); +}; + +/** + * Expose text regex string + */ + +module.exports.TEXT_REGEX = TEXT_REGEX; + +/** + * Extglob parsers + */ + +module.exports = parsers; + + +/***/ }), +/* 221 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +/*! + * define-property + * + * Copyright (c) 2015, 2017, Jon Schlinkert. + * Released under the MIT License. + */ + + + +var isDescriptor = __webpack_require__(222); + +module.exports = function defineProperty(obj, prop, val) { + if (typeof obj !== 'object' && typeof obj !== 'function') { + throw new TypeError('expected an object or function.'); + } + + if (typeof prop !== 'string') { + throw new TypeError('expected `prop` to be a string.'); + } + + if (isDescriptor(val) && ('set' in val || 'get' in val)) { + return Object.defineProperty(obj, prop, val); + } + + return Object.defineProperty(obj, prop, { + configurable: true, + enumerable: false, + writable: true, + value: val + }); +}; + + +/***/ }), +/* 222 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var isAccessor = __webpack_require__(83); +var isData = __webpack_require__(87); + +module.exports = function isDescriptor(obj, key) { + if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) { + return false; + } + + if ('get' in obj || 'set' in obj) { + return isAccessor(obj, key); + } + + return isData(obj, key); +}; + + +/***/ }), +/* 223 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var regex = __webpack_require__(92); +var Cache = __webpack_require__(200); + +/** + * Utils + */ + +var utils = module.exports; +var cache = utils.cache = new Cache(); + +/** + * Cast `val` to an array + * @return {Array} + */ + +utils.arrayify = function(val) { + if (!Array.isArray(val)) { + return [val]; + } + return val; +}; + +/** + * Memoize a generated regex or function + */ + +utils.memoize = function(type, pattern, options, fn) { + var key = utils.createKey(type + pattern, options); + + if (cache.has(type, key)) { + return cache.get(type, key); + } + + var val = fn(pattern, options); + if (options && options.cache === false) { + return val; + } + + cache.set(type, key, val); + return val; +}; + +/** + * Create the key to use for memoization. The key is generated + * by iterating over the options and concatenating key-value pairs + * to the pattern string. + */ + +utils.createKey = function(pattern, options) { + var key = pattern; + if (typeof options === 'undefined') { + return key; + } + for (var prop in options) { + key += ';' + prop + '=' + String(options[prop]); + } + return key; +}; + +/** + * Create the regex to use for matching text + */ + +utils.createRegex = function(str) { + var opts = {contains: true, strictClose: false}; + return regex(str, opts); +}; + + +/***/ }), +/* 224 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +/** + * Module dependencies + */ + +var Snapdragon = __webpack_require__(118); +var define = __webpack_require__(221); +var extend = __webpack_require__(96); + +/** + * Local dependencies + */ + +var compilers = __webpack_require__(209); +var parsers = __webpack_require__(220); + +/** + * Customize Snapdragon parser and renderer + */ + +function Extglob(options) { + this.options = extend({source: 'extglob'}, options); + this.snapdragon = this.options.snapdragon || new Snapdragon(this.options); + this.snapdragon.patterns = this.snapdragon.patterns || {}; + this.compiler = this.snapdragon.compiler; + this.parser = this.snapdragon.parser; + + compilers(this.snapdragon); + parsers(this.snapdragon); + + /** + * Override Snapdragon `.parse` method + */ + + define(this.snapdragon, 'parse', function(str, options) { + var parsed = Snapdragon.prototype.parse.apply(this, arguments); + parsed.input = str; + + // escape unmatched brace/bracket/parens + var last = this.parser.stack.pop(); + if (last && this.options.strict !== true) { + var node = last.nodes[0]; + node.val = '\\' + node.val; + var sibling = node.parent.nodes[1]; + if (sibling.type === 'star') { + sibling.loose = true; + } + } + + // add non-enumerable parser reference + define(parsed, 'parser', this.parser); + return parsed; + }); + + /** + * Decorate `.parse` method + */ + + define(this, 'parse', function(ast, options) { + return this.snapdragon.parse.apply(this.snapdragon, arguments); + }); + + /** + * Decorate `.compile` method + */ + + define(this, 'compile', function(ast, options) { + return this.snapdragon.compile.apply(this.snapdragon, arguments); + }); + +} + +/** + * Expose `Extglob` + */ + +module.exports = Extglob; + + +/***/ }), +/* 225 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var extglob = __webpack_require__(208); +var nanomatch = __webpack_require__(194); +var regexNot = __webpack_require__(92); +var toRegex = __webpack_require__(73); +var not; + +/** + * Characters to use in negation regex (we want to "not" match + * characters that are matched by other parsers) + */ + +var TEXT = '([!@*?+]?\\(|\\)|\\[:?(?=.*?:?\\])|:?\\]|[*+?!^$.\\\\/])+'; +var createNotRegex = function(opts) { + return not || (not = textRegex(TEXT)); +}; + +/** + * Parsers + */ + +module.exports = function(snapdragon) { + var parsers = snapdragon.parser.parsers; + + // register nanomatch parsers + snapdragon.use(nanomatch.parsers); + + // get references to some specific nanomatch parsers before they + // are overridden by the extglob and/or parsers + var escape = parsers.escape; + var slash = parsers.slash; + var qmark = parsers.qmark; + var plus = parsers.plus; + var star = parsers.star; + var dot = parsers.dot; + + // register extglob parsers + snapdragon.use(extglob.parsers); + + // custom micromatch parsers + snapdragon.parser + .use(function() { + // override "notRegex" created in nanomatch parser + this.notRegex = /^\!+(?!\()/; + }) + // reset the referenced parsers + .capture('escape', escape) + .capture('slash', slash) + .capture('qmark', qmark) + .capture('star', star) + .capture('plus', plus) + .capture('dot', dot) + + /** + * Override `text` parser + */ + + .capture('text', function() { + if (this.isInside('bracket')) return; + var pos = this.position(); + var m = this.match(createNotRegex(this.options)); + if (!m || !m[0]) return; + + // escape regex boundary characters and simple brackets + var val = m[0].replace(/([[\]^$])/g, '\\$1'); + + return pos({ + type: 'text', + val: val + }); + }); +}; + +/** + * Create text regex + */ + +function textRegex(pattern) { + var notStr = regexNot.create(pattern, {contains: true, strictClose: false}); + var prefix = '(?:[\\^]|\\\\|'; + return toRegex(prefix + notStr + ')', {strictClose: false}); +} + + +/***/ }), +/* 226 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +module.exports = new (__webpack_require__(200))(); + + +/***/ }), +/* 227 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var utils = module.exports; +var path = __webpack_require__(3); + +/** + * Module dependencies + */ + +var Snapdragon = __webpack_require__(118); +utils.define = __webpack_require__(228); +utils.diff = __webpack_require__(205); +utils.extend = __webpack_require__(191); +utils.pick = __webpack_require__(206); +utils.typeOf = __webpack_require__(230); +utils.unique = __webpack_require__(95); + +/** + * Returns true if the platform is windows, or `path.sep` is `\\`. + * This is defined as a function to allow `path.sep` to be set in unit tests, + * or by the user, if there is a reason to do so. + * @return {Boolean} + */ + +utils.isWindows = function() { + return path.sep === '\\' || process.platform === 'win32'; +}; + +/** + * Get the `Snapdragon` instance to use + */ + +utils.instantiate = function(ast, options) { + var snapdragon; + // if an instance was created by `.parse`, use that instance + if (utils.typeOf(ast) === 'object' && ast.snapdragon) { + snapdragon = ast.snapdragon; + // if the user supplies an instance on options, use that instance + } else if (utils.typeOf(options) === 'object' && options.snapdragon) { + snapdragon = options.snapdragon; + // create a new instance + } else { + snapdragon = new Snapdragon(options); + } + + utils.define(snapdragon, 'parse', function(str, options) { + var parsed = Snapdragon.prototype.parse.apply(this, arguments); + parsed.input = str; + + // escape unmatched brace/bracket/parens + var last = this.parser.stack.pop(); + if (last && this.options.strictErrors !== true) { + var open = last.nodes[0]; + var inner = last.nodes[1]; + if (last.type === 'bracket') { + if (inner.val.charAt(0) === '[') { + inner.val = '\\' + inner.val; + } + + } else { + open.val = '\\' + open.val; + var sibling = open.parent.nodes[1]; + if (sibling.type === 'star') { + sibling.loose = true; + } + } + } + + // add non-enumerable parser reference + utils.define(parsed, 'parser', this.parser); + return parsed; + }); + + return snapdragon; +}; + +/** + * Create the key to use for memoization. The key is generated + * by iterating over the options and concatenating key-value pairs + * to the pattern string. + */ + +utils.createKey = function(pattern, options) { + if (utils.typeOf(options) !== 'object') { + return pattern; + } + var val = pattern; + var keys = Object.keys(options); + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + val += ';' + key + '=' + String(options[key]); + } + return val; +}; + +/** + * Cast `val` to an array + * @return {Array} + */ + +utils.arrayify = function(val) { + if (typeof val === 'string') return [val]; + return val ? (Array.isArray(val) ? val : [val]) : []; +}; + +/** + * Return true if `val` is a non-empty string + */ + +utils.isString = function(val) { + return typeof val === 'string'; +}; + +/** + * Return true if `val` is a non-empty string + */ + +utils.isObject = function(val) { + return utils.typeOf(val) === 'object'; +}; + +/** + * Returns true if the given `str` has special characters + */ + +utils.hasSpecialChars = function(str) { + return /(?:(?:(^|\/)[!.])|[*?+()|\[\]{}]|[+@]\()/.test(str); +}; + +/** + * Escape regex characters in the given string + */ + +utils.escapeRegex = function(str) { + return str.replace(/[-[\]{}()^$|*+?.\\\/\s]/g, '\\$&'); +}; + +/** + * Normalize slashes in the given filepath. + * + * @param {String} `filepath` + * @return {String} + */ + +utils.toPosixPath = function(str) { + return str.replace(/\\+/g, '/'); +}; + +/** + * Strip backslashes before special characters in a string. + * + * @param {String} `str` + * @return {String} + */ + +utils.unescape = function(str) { + return utils.toPosixPath(str.replace(/\\(?=[*+?!.])/g, '')); +}; + +/** + * Strip the prefix from a filepath + * @param {String} `fp` + * @return {String} + */ + +utils.stripPrefix = function(str) { + if (str.charAt(0) !== '.') { + return str; + } + var ch = str.charAt(1); + if (utils.isSlash(ch)) { + return str.slice(2); + } + return str; +}; + +/** + * Returns true if the given str is an escaped or + * unescaped path character + */ + +utils.isSlash = function(str) { + return str === '/' || str === '\\/' || str === '\\' || str === '\\\\'; +}; + +/** + * Returns a function that returns true if the given + * pattern matches or contains a `filepath` + * + * @param {String} `pattern` + * @return {Function} + */ + +utils.matchPath = function(pattern, options) { + return (options && options.contains) + ? utils.containsPattern(pattern, options) + : utils.equalsPattern(pattern, options); +}; + +/** + * Returns true if the given (original) filepath or unixified path are equal + * to the given pattern. + */ + +utils._equals = function(filepath, unixPath, pattern) { + return pattern === filepath || pattern === unixPath; +}; + +/** + * Returns true if the given (original) filepath or unixified path contain + * the given pattern. + */ + +utils._contains = function(filepath, unixPath, pattern) { + return filepath.indexOf(pattern) !== -1 || unixPath.indexOf(pattern) !== -1; +}; + +/** + * Returns a function that returns true if the given + * pattern is the same as a given `filepath` + * + * @param {String} `pattern` + * @return {Function} + */ + +utils.equalsPattern = function(pattern, options) { + var unixify = utils.unixify(options); + options = options || {}; + + return function fn(filepath) { + var equal = utils._equals(filepath, unixify(filepath), pattern); + if (equal === true || options.nocase !== true) { + return equal; + } + var lower = filepath.toLowerCase(); + return utils._equals(lower, unixify(lower), pattern); + }; +}; + +/** + * Returns a function that returns true if the given + * pattern contains a `filepath` + * + * @param {String} `pattern` + * @return {Function} + */ + +utils.containsPattern = function(pattern, options) { + var unixify = utils.unixify(options); + options = options || {}; + + return function(filepath) { + var contains = utils._contains(filepath, unixify(filepath), pattern); + if (contains === true || options.nocase !== true) { + return contains; + } + var lower = filepath.toLowerCase(); + return utils._contains(lower, unixify(lower), pattern); + }; +}; + +/** + * Returns a function that returns true if the given + * regex matches the `filename` of a file path. + * + * @param {RegExp} `re` Matching regex + * @return {Function} + */ + +utils.matchBasename = function(re) { + return function(filepath) { + return re.test(path.basename(filepath)); + }; +}; + +/** + * Determines the filepath to return based on the provided options. + * @return {any} + */ + +utils.value = function(str, unixify, options) { + if (options && options.unixify === false) { + return str; + } + return unixify(str); +}; + +/** + * Returns a function that normalizes slashes in a string to forward + * slashes, strips `./` from beginning of paths, and optionally unescapes + * special characters. + * @return {Function} + */ + +utils.unixify = function(options) { + options = options || {}; + return function(filepath) { + if (utils.isWindows() || options.unixify === true) { + filepath = utils.toPosixPath(filepath); + } + if (options.stripPrefix !== false) { + filepath = utils.stripPrefix(filepath); + } + if (options.unescape === true) { + filepath = utils.unescape(filepath); + } + return filepath; + }; +}; + + +/***/ }), +/* 228 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +/*! + * define-property + * + * Copyright (c) 2015-2018, Jon Schlinkert. + * Released under the MIT License. + */ + + + +var isobject = __webpack_require__(81); +var isDescriptor = __webpack_require__(229); +var define = (typeof Reflect !== 'undefined' && Reflect.defineProperty) + ? Reflect.defineProperty + : Object.defineProperty; + +module.exports = function defineProperty(obj, key, val) { + if (!isobject(obj) && typeof obj !== 'function' && !Array.isArray(obj)) { + throw new TypeError('expected an object, function, or array'); + } + + if (typeof key !== 'string') { + throw new TypeError('expected "key" to be a string'); + } + + if (isDescriptor(val)) { + define(obj, key, val); + return obj; + } + + define(obj, key, { + configurable: true, + enumerable: false, + writable: true, + value: val + }); + + return obj; +}; + + +/***/ }), +/* 229 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var isAccessor = __webpack_require__(83); +var isData = __webpack_require__(87); + +module.exports = function isDescriptor(obj, key) { + if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) { + return false; + } + + if ('get' in obj || 'set' in obj) { + return isAccessor(obj, key); + } + + return isData(obj, key); +}; + + +/***/ }), +/* 230 */ +/***/ ((module) => { + +var toString = Object.prototype.toString; + +module.exports = function kindOf(val) { + if (val === void 0) return 'undefined'; + if (val === null) return 'null'; + + var type = typeof val; + if (type === 'boolean') return 'boolean'; + if (type === 'string') return 'string'; + if (type === 'number') return 'number'; + if (type === 'symbol') return 'symbol'; + if (type === 'function') { + return isGeneratorFn(val) ? 'generatorfunction' : 'function'; + } + + if (isArray(val)) return 'array'; + if (isBuffer(val)) return 'buffer'; + if (isArguments(val)) return 'arguments'; + if (isDate(val)) return 'date'; + if (isError(val)) return 'error'; + if (isRegexp(val)) return 'regexp'; + + switch (ctorName(val)) { + case 'Symbol': return 'symbol'; + case 'Promise': return 'promise'; + + // Set, Map, WeakSet, WeakMap + case 'WeakMap': return 'weakmap'; + case 'WeakSet': return 'weakset'; + case 'Map': return 'map'; + case 'Set': return 'set'; + + // 8-bit typed arrays + case 'Int8Array': return 'int8array'; + case 'Uint8Array': return 'uint8array'; + case 'Uint8ClampedArray': return 'uint8clampedarray'; + + // 16-bit typed arrays + case 'Int16Array': return 'int16array'; + case 'Uint16Array': return 'uint16array'; + + // 32-bit typed arrays + case 'Int32Array': return 'int32array'; + case 'Uint32Array': return 'uint32array'; + case 'Float32Array': return 'float32array'; + case 'Float64Array': return 'float64array'; + } + + if (isGeneratorObj(val)) { + return 'generator'; + } + + // Non-plain objects + type = toString.call(val); + switch (type) { + case '[object Object]': return 'object'; + // iterators + case '[object Map Iterator]': return 'mapiterator'; + case '[object Set Iterator]': return 'setiterator'; + case '[object String Iterator]': return 'stringiterator'; + case '[object Array Iterator]': return 'arrayiterator'; + } + + // other + return type.slice(8, -1).toLowerCase().replace(/\s/g, ''); +}; + +function ctorName(val) { + return typeof val.constructor === 'function' ? val.constructor.name : null; +} + +function isArray(val) { + if (Array.isArray) return Array.isArray(val); + return val instanceof Array; +} + +function isError(val) { + return val instanceof Error || (typeof val.message === 'string' && val.constructor && typeof val.constructor.stackTraceLimit === 'number'); +} + +function isDate(val) { + if (val instanceof Date) return true; + return typeof val.toDateString === 'function' + && typeof val.getDate === 'function' + && typeof val.setDate === 'function'; +} + +function isRegexp(val) { + if (val instanceof RegExp) return true; + return typeof val.flags === 'string' + && typeof val.ignoreCase === 'boolean' + && typeof val.multiline === 'boolean' + && typeof val.global === 'boolean'; +} + +function isGeneratorFn(name, val) { + return ctorName(name) === 'GeneratorFunction'; +} + +function isGeneratorObj(val) { + return typeof val.throw === 'function' + && typeof val.return === 'function' + && typeof val.next === 'function'; +} + +function isArguments(val) { + try { + if (typeof val.length === 'number' && typeof val.callee === 'function') { + return true; + } + } catch (err) { + if (err.message.indexOf('callee') !== -1) { + return true; + } + } + return false; +} + +/** + * If you need to support Safari 5-7 (8-10 yr-old browser), + * take a look at https://github.com/feross/is-buffer + */ + +function isBuffer(val) { + if (val.constructor && typeof val.constructor.isBuffer === 'function') { + return val.constructor.isBuffer(val); + } + return false; +} + + +/***/ }), +/* 231 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var stream = __webpack_require__(232); +var util = __webpack_require__(17); + +var Readable = stream.Readable; + +module.exports = ReaddirpReadable; + +util.inherits(ReaddirpReadable, Readable); + +function ReaddirpReadable (opts) { + if (!(this instanceof ReaddirpReadable)) return new ReaddirpReadable(opts); + + opts = opts || {}; + + opts.objectMode = true; + Readable.call(this, opts); + + // backpressure not implemented at this point + this.highWaterMark = Infinity; + + this._destroyed = false; + this._paused = false; + this._warnings = []; + this._errors = []; + + this._pauseResumeErrors(); +} + +var proto = ReaddirpReadable.prototype; + +proto._pauseResumeErrors = function () { + var self = this; + self.on('pause', function () { self._paused = true }); + self.on('resume', function () { + if (self._destroyed) return; + self._paused = false; + + self._warnings.forEach(function (err) { self.emit('warn', err) }); + self._warnings.length = 0; + + self._errors.forEach(function (err) { self.emit('error', err) }); + self._errors.length = 0; + }) +} + +// called for each entry +proto._processEntry = function (entry) { + if (this._destroyed) return; + this.push(entry); +} + +proto._read = function () { } + +proto.destroy = function () { + // when stream is destroyed it will emit nothing further, not even errors or warnings + this.push(null); + this.readable = false; + this._destroyed = true; + this.emit('close'); +} + +proto._done = function () { + this.push(null); +} + +// we emit errors and warnings async since we may handle errors like invalid args +// within the initial event loop before any event listeners subscribed +proto._handleError = function (err) { + var self = this; + setImmediate(function () { + if (self._paused) return self._warnings.push(err); + if (!self._destroyed) self.emit('warn', err); + }); +} + +proto._handleFatalError = function (err) { + var self = this; + setImmediate(function () { + if (self._paused) return self._errors.push(err); + if (!self._destroyed) self.emit('error', err); + }); +} + +function createStreamAPI () { + var stream = new ReaddirpReadable(); + + return { + stream : stream + , processEntry : stream._processEntry.bind(stream) + , done : stream._done.bind(stream) + , handleError : stream._handleError.bind(stream) + , handleFatalError : stream._handleFatalError.bind(stream) + }; +} + +module.exports = createStreamAPI; + + +/***/ }), +/* 232 */ +/***/ ((module, exports, __webpack_require__) => { + +var Stream = __webpack_require__(15); +if (process.env.READABLE_STREAM === 'disable' && Stream) { + module.exports = Stream; + exports = module.exports = Stream.Readable; + exports.Readable = Stream.Readable; + exports.Writable = Stream.Writable; + exports.Duplex = Stream.Duplex; + exports.Transform = Stream.Transform; + exports.PassThrough = Stream.PassThrough; + exports.Stream = Stream; +} else { + exports = module.exports = __webpack_require__(233); + exports.Stream = Stream || exports; + exports.Readable = exports; + exports.Writable = __webpack_require__(242); + exports.Duplex = __webpack_require__(241); + exports.Transform = __webpack_require__(245); + exports.PassThrough = __webpack_require__(246); +} + + +/***/ }), +/* 233 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +// 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 pna = __webpack_require__(234); +/**/ + +module.exports = Readable; + +/**/ +var isArray = __webpack_require__(136); +/**/ + +/**/ +var Duplex; +/**/ + +Readable.ReadableState = ReadableState; + +/**/ +var EE = (__webpack_require__(53).EventEmitter); + +var EElistenerCount = function (emitter, type) { + return emitter.listeners(type).length; +}; +/**/ + +/**/ +var Stream = __webpack_require__(235); +/**/ + +/**/ + +var Buffer = (__webpack_require__(236).Buffer); +var OurUint8Array = (typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}).Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +/**/ +var util = Object.create(__webpack_require__(238)); +util.inherits = __webpack_require__(70); +/**/ + +/**/ +var debugUtil = __webpack_require__(17); +var debug = void 0; +if (debugUtil && debugUtil.debuglog) { + debug = debugUtil.debuglog('stream'); +} else { + debug = function () {}; +} +/**/ + +var BufferList = __webpack_require__(239); +var destroyImpl = __webpack_require__(240); +var StringDecoder; + +util.inherits(Readable, Stream); + +var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; + +function prependListener(emitter, event, fn) { + // Sadly this is not cacheable as some libraries bundle their own + // event emitter implementation with them. + if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); + + // This is a hack to make sure that our error handler is attached before any + // userland ones. NEVER DO THIS. This is here only because this code needs + // to continue to work with older versions of Node.js that do not include + // the prependListener() method. The goal is to eventually remove this hack. + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; +} + +function ReadableState(options, stream) { + Duplex = Duplex || __webpack_require__(241); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // 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 (isDuplex) 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 readableHwm = options.readableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // A linked list is used to store data chunks instead of an array because the + // linked list can remove elements from the beginning faster than + // array.shift() + this.buffer = new BufferList(); + 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 event 'readable'/'data' is emitted + // 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 read 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; + this.resumeScheduled = false; + + // has it been destroyed + this.destroyed = 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'; + + // 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 = (__webpack_require__(244).StringDecoder); + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } +} + +function Readable(options) { + Duplex = Duplex || __webpack_require__(241); + + if (!(this instanceof Readable)) return new Readable(options); + + this._readableState = new ReadableState(options, this); + + // legacy + this.readable = true; + + if (options) { + if (typeof options.read === 'function') this._read = options.read; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + } + + Stream.call(this); +} + +Object.defineProperty(Readable.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined) { + return false; + } + return this._readableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._readableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + } +}); + +Readable.prototype.destroy = destroyImpl.destroy; +Readable.prototype._undestroy = destroyImpl.undestroy; +Readable.prototype._destroy = function (err, cb) { + this.push(null); + cb(err); +}; + +// 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; + var skipChunkCheck; + + if (!state.objectMode) { + if (typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { + chunk = Buffer.from(chunk, encoding); + encoding = ''; + } + skipChunkCheck = true; + } + } else { + skipChunkCheck = true; + } + + return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); +}; + +// Unshift should *always* be something directly out of read() +Readable.prototype.unshift = function (chunk) { + return readableAddChunk(this, chunk, null, true, false); +}; + +function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { + var state = stream._readableState; + if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else { + var er; + if (!skipChunkCheck) er = chunkInvalid(state, chunk); + if (er) { + stream.emit('error', er); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (addToFront) { + if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true); + } else if (state.ended) { + stream.emit('error', new Error('stream.push() after EOF')); + } else { + state.reading = false; + if (state.decoder && !encoding) { + chunk = state.decoder.write(chunk); + if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); + } else { + addChunk(stream, state, chunk, false); + } + } + } else if (!addToFront) { + state.reading = false; + } + } + + return needMoreData(state); +} + +function addChunk(stream, state, chunk, addToFront) { + 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); +} + +function chunkInvalid(state, chunk) { + var er; + if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + return er; +} + +// 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); +} + +Readable.prototype.isPaused = function () { + return this._readableState.flowing === false; +}; + +// backwards compatibility. +Readable.prototype.setEncoding = function (enc) { + if (!StringDecoder) StringDecoder = (__webpack_require__(244).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 to prevent increasing hwm excessively in + // tiny amounts + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + return n; +} + +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function howMuchToRead(n, state) { + if (n <= 0 || state.length === 0 && state.ended) return 0; + if (state.objectMode) return 1; + if (n !== n) { + // Only flow one buffer at a time + if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; + } + // If we're asking for more than the current hwm, then raise the hwm. + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); + if (n <= state.length) return n; + // Don't have enough + if (!state.ended) { + state.needReadable = true; + return 0; + } + return state.length; +} + +// you can override either this method, or the async _read(n) below. +Readable.prototype.read = function (n) { + debug('read', n); + n = parseInt(n, 10); + var state = this._readableState; + var nOrig = n; + + if (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); + } else 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 (!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; + } else { + state.length -= n; + } + + if (state.length === 0) { + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (!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) endReadable(this); + } + + if (ret !== null) this.emit('data', ret); + + return ret; +}; + +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) pna.nextTick(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; + pna.nextTick(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('_read() is 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 : unpipe; + if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn); + + dest.on('unpipe', onunpipe); + function onunpipe(readable, unpipeInfo) { + debug('onunpipe'); + if (readable === src) { + if (unpipeInfo && unpipeInfo.hasUnpiped === false) { + unpipeInfo.hasUnpiped = true; + 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); + + var cleanedUp = false; + 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', unpipe); + src.removeListener('data', ondata); + + cleanedUp = true; + + // 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(); + } + + // If the user pushes more data while we're writing to dest then we'll end up + // in ondata again. However, we only want to increase awaitDrain once because + // dest will only emit one 'drain' event for the multiple writes. + // => Introduce a guard on increasing awaitDrain. + var increasedAwaitDrain = false; + src.on('data', ondata); + function ondata(chunk) { + debug('ondata'); + increasedAwaitDrain = false; + var ret = dest.write(chunk); + if (false === ret && !increasedAwaitDrain) { + // If the user unpiped during `dest.write()`, it is possible + // to get stuck in a permanently paused state if that write + // also returned false. + // => Check whether `dest` is still a piping destination. + if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { + debug('false write response, pause', state.awaitDrain); + state.awaitDrain++; + increasedAwaitDrain = true; + } + 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); + } + + // Make sure our error handler is attached before userland ones. + prependListener(dest, 'error', onerror); + + // 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; + var unpipeInfo = { hasUnpiped: false }; + + // 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, unpipeInfo); + 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, { hasUnpiped: false }); + }return this; + } + + // try to find the right one. + var index = indexOf(state.pipes, dest); + if (index === -1) return this; + + state.pipes.splice(index, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) state.pipes = state.pipes[0]; + + dest.emit('unpipe', this, unpipeInfo); + + 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 (ev === 'data') { + // Start flowing on next tick if stream isn't explicitly paused + if (this._readableState.flowing !== false) this.resume(); + } else if (ev === 'readable') { + var state = this._readableState; + if (!state.endEmitted && !state.readableListening) { + state.readableListening = state.needReadable = true; + state.emittedReadable = false; + if (!state.reading) { + pna.nextTick(nReadingNextTick, this); + } else if (state.length) { + emitReadable(this); + } + } + } + + 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; + pna.nextTick(resume_, stream, state); + } +} + +function resume_(stream, state) { + if (!state.reading) { + debug('resume read 0'); + stream.read(0); + } + + state.resumeScheduled = false; + state.awaitDrain = 0; + 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); + while (state.flowing && stream.read() !== null) {} +} + +// 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 _this = this; + + var state = this._readableState; + var paused = false; + + stream.on('end', function () { + debug('wrapped end'); + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) _this.push(chunk); + } + + _this.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 = _this.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. + for (var n = 0; n < kProxyEvents.length; n++) { + stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); + } + + // when we try to consume some more bytes, simply unpause the + // underlying stream. + this._read = function (n) { + debug('wrapped _read', n); + if (paused) { + paused = false; + stream.resume(); + } + }; + + return this; +}; + +Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._readableState.highWaterMark; + } +}); + +// 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. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromList(n, state) { + // nothing buffered + if (state.length === 0) return null; + + var ret; + if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { + // read it all, truncate the list + if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); + state.buffer.clear(); + } else { + // read part of list + ret = fromListPartial(n, state.buffer, state.decoder); + } + + return ret; +} + +// Extracts only enough buffered data to satisfy the amount requested. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromListPartial(n, list, hasStrings) { + var ret; + if (n < list.head.data.length) { + // slice is the same for buffers and strings + ret = list.head.data.slice(0, n); + list.head.data = list.head.data.slice(n); + } else if (n === list.head.data.length) { + // first chunk is a perfect match + ret = list.shift(); + } else { + // result spans more than one buffer + ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); + } + return ret; +} + +// Copies a specified amount of characters from the list of buffered data +// chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBufferString(n, list) { + var p = list.head; + var c = 1; + var ret = p.data; + n -= ret.length; + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str;else ret += str.slice(0, n); + n -= nb; + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = str.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +// Copies a specified amount of bytes from the list of buffered data chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBuffer(n, list) { + var ret = Buffer.allocUnsafe(n); + var p = list.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = buf.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + 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; + pna.nextTick(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 indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + return -1; +} + +/***/ }), +/* 234 */ +/***/ ((module) => { + +"use strict"; + + +if (typeof process === 'undefined' || + !process.version || + process.version.indexOf('v0.') === 0 || + process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) { + module.exports = { nextTick: nextTick }; +} else { + module.exports = process +} + +function nextTick(fn, arg1, arg2, arg3) { + if (typeof fn !== 'function') { + throw new TypeError('"callback" argument must be a function'); + } + var len = arguments.length; + var args, i; + switch (len) { + case 0: + case 1: + return process.nextTick(fn); + case 2: + return process.nextTick(function afterTickOne() { + fn.call(null, arg1); + }); + case 3: + return process.nextTick(function afterTickTwo() { + fn.call(null, arg1, arg2); + }); + case 4: + return process.nextTick(function afterTickThree() { + fn.call(null, arg1, arg2, arg3); + }); + default: + args = new Array(len - 1); + i = 0; + while (i < args.length) { + args[i++] = arguments[i]; + } + return process.nextTick(function afterTick() { + fn.apply(null, args); + }); + } +} + + + +/***/ }), +/* 235 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +module.exports = __webpack_require__(15); + + +/***/ }), +/* 236 */ +/***/ ((module, exports, __webpack_require__) => { + +/* eslint-disable node/no-deprecated-api */ +var buffer = __webpack_require__(237) +var Buffer = buffer.Buffer + +// alternative to using Object.keys for old browsers +function copyProps (src, dst) { + for (var key in src) { + dst[key] = src[key] + } +} +if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) { + module.exports = buffer +} else { + // Copy properties from require('buffer') + copyProps(buffer, exports) + exports.Buffer = SafeBuffer +} + +function SafeBuffer (arg, encodingOrOffset, length) { + return Buffer(arg, encodingOrOffset, length) +} + +// Copy static methods from Buffer +copyProps(Buffer, SafeBuffer) + +SafeBuffer.from = function (arg, encodingOrOffset, length) { + if (typeof arg === 'number') { + throw new TypeError('Argument must not be a number') + } + return Buffer(arg, encodingOrOffset, length) +} + +SafeBuffer.alloc = function (size, fill, encoding) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + var buf = Buffer(size) + if (fill !== undefined) { + if (typeof encoding === 'string') { + buf.fill(fill, encoding) + } else { + buf.fill(fill) + } + } else { + buf.fill(0) + } + return buf +} + +SafeBuffer.allocUnsafe = function (size) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + return Buffer(size) +} + +SafeBuffer.allocUnsafeSlow = function (size) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + return buffer.SlowBuffer(size) +} + + +/***/ }), +/* 237 */ +/***/ ((module) => { + +"use strict"; +module.exports = require("buffer"); + +/***/ }), +/* 238 */ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +// 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(arg) { + if (Array.isArray) { + return Array.isArray(arg); + } + return objectToString(arg) === '[object Array]'; +} +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 objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; + +function isDate(d) { + return objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; + +function isError(e) { + return (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 = __webpack_require__(237).Buffer.isBuffer; + +function objectToString(o) { + return Object.prototype.toString.call(o); +} + + +/***/ }), +/* 239 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Buffer = (__webpack_require__(236).Buffer); +var util = __webpack_require__(17); + +function copyBuffer(src, target, offset) { + src.copy(target, offset); +} + +module.exports = function () { + function BufferList() { + _classCallCheck(this, BufferList); + + this.head = null; + this.tail = null; + this.length = 0; + } + + BufferList.prototype.push = function push(v) { + var entry = { data: v, next: null }; + if (this.length > 0) this.tail.next = entry;else this.head = entry; + this.tail = entry; + ++this.length; + }; + + BufferList.prototype.unshift = function unshift(v) { + var entry = { data: v, next: this.head }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; + }; + + BufferList.prototype.shift = function shift() { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; + --this.length; + return ret; + }; + + BufferList.prototype.clear = function clear() { + this.head = this.tail = null; + this.length = 0; + }; + + BufferList.prototype.join = function join(s) { + if (this.length === 0) return ''; + var p = this.head; + var ret = '' + p.data; + while (p = p.next) { + ret += s + p.data; + }return ret; + }; + + BufferList.prototype.concat = function concat(n) { + if (this.length === 0) return Buffer.alloc(0); + var ret = Buffer.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + while (p) { + copyBuffer(p.data, ret, i); + i += p.data.length; + p = p.next; + } + return ret; + }; + + return BufferList; +}(); + +if (util && util.inspect && util.inspect.custom) { + module.exports.prototype[util.inspect.custom] = function () { + var obj = util.inspect({ length: this.length }); + return this.constructor.name + ' ' + obj; + }; +} + +/***/ }), +/* 240 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +/**/ + +var pna = __webpack_require__(234); +/**/ + +// undocumented cb() API, needed for core, not for public API +function destroy(err, cb) { + var _this = this; + + var readableDestroyed = this._readableState && this._readableState.destroyed; + var writableDestroyed = this._writableState && this._writableState.destroyed; + + if (readableDestroyed || writableDestroyed) { + if (cb) { + cb(err); + } else if (err) { + if (!this._writableState) { + pna.nextTick(emitErrorNT, this, err); + } else if (!this._writableState.errorEmitted) { + this._writableState.errorEmitted = true; + pna.nextTick(emitErrorNT, this, err); + } + } + + return this; + } + + // we set destroyed to true before firing error callbacks in order + // to make it re-entrance safe in case destroy() is called within callbacks + + if (this._readableState) { + this._readableState.destroyed = true; + } + + // if this is a duplex stream mark the writable part as destroyed as well + if (this._writableState) { + this._writableState.destroyed = true; + } + + this._destroy(err || null, function (err) { + if (!cb && err) { + if (!_this._writableState) { + pna.nextTick(emitErrorNT, _this, err); + } else if (!_this._writableState.errorEmitted) { + _this._writableState.errorEmitted = true; + pna.nextTick(emitErrorNT, _this, err); + } + } else if (cb) { + cb(err); + } + }); + + return this; +} + +function undestroy() { + if (this._readableState) { + this._readableState.destroyed = false; + this._readableState.reading = false; + this._readableState.ended = false; + this._readableState.endEmitted = false; + } + + if (this._writableState) { + this._writableState.destroyed = false; + this._writableState.ended = false; + this._writableState.ending = false; + this._writableState.finalCalled = false; + this._writableState.prefinished = false; + this._writableState.finished = false; + this._writableState.errorEmitted = false; + } +} + +function emitErrorNT(self, err) { + self.emit('error', err); +} + +module.exports = { + destroy: destroy, + undestroy: undestroy +}; + +/***/ }), +/* 241 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +// 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. + +// 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. + + + +/**/ + +var pna = __webpack_require__(234); +/**/ + +/**/ +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) { + keys.push(key); + }return keys; +}; +/**/ + +module.exports = Duplex; + +/**/ +var util = Object.create(__webpack_require__(238)); +util.inherits = __webpack_require__(70); +/**/ + +var Readable = __webpack_require__(233); +var Writable = __webpack_require__(242); + +util.inherits(Duplex, Readable); + +{ + // avoid scope creep, the keys array can then be collected + 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); +} + +Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// 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. + pna.nextTick(onEndNT, this); +} + +function onEndNT(self) { + self.end(); +} + +Object.defineProperty(Duplex.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined || this._writableState === undefined) { + return false; + } + return this._readableState.destroyed && this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (this._readableState === undefined || this._writableState === undefined) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + this._writableState.destroyed = value; + } +}); + +Duplex.prototype._destroy = function (err, cb) { + this.push(null); + this.end(); + + pna.nextTick(cb, err); +}; + +/***/ }), +/* 242 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +// 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. + +// A bit simpler than readable streams. +// Implement an async ._write(chunk, encoding, cb), and it'll handle all +// the drain event emission and buffering. + + + +/**/ + +var pna = __webpack_require__(234); +/**/ + +module.exports = Writable; + +/* */ +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + this.next = null; +} + +// It seems a linked list but it is not +// there will be only 2 of these for each stream +function CorkedRequest(state) { + var _this = this; + + this.next = null; + this.entry = null; + this.finish = function () { + onCorkedFinish(_this, state); + }; +} +/* */ + +/**/ +var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick; +/**/ + +/**/ +var Duplex; +/**/ + +Writable.WritableState = WritableState; + +/**/ +var util = Object.create(__webpack_require__(238)); +util.inherits = __webpack_require__(70); +/**/ + +/**/ +var internalUtil = { + deprecate: __webpack_require__(243) +}; +/**/ + +/**/ +var Stream = __webpack_require__(235); +/**/ + +/**/ + +var Buffer = (__webpack_require__(236).Buffer); +var OurUint8Array = (typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}).Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +var destroyImpl = __webpack_require__(240); + +util.inherits(Writable, Stream); + +function nop() {} + +function WritableState(options, stream) { + Duplex = Duplex || __webpack_require__(241); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag to indicate whether or not this stream + // contains buffers or objects. + this.objectMode = !!options.objectMode; + + if (isDuplex) 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 writableHwm = options.writableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // if _final has been called + this.finalCalled = false; + + // drain event flag. + 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; + + // has it been destroyed + this.destroyed = 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; + + // count buffered requests + this.bufferedRequestCount = 0; + + // allocate the first CorkedRequest, there is always + // one allocated and free to use, and we maintain at most two + this.corkedRequestsFree = new CorkedRequest(this); +} + +WritableState.prototype.getBuffer = function getBuffer() { + 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.', 'DEP0003') + }); + } catch (_) {} +})(); + +// Test _writableState for inheritance to account for Duplex streams, +// whose prototype chain only points to Readable. +var realHasInstance; +if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { + realHasInstance = Function.prototype[Symbol.hasInstance]; + Object.defineProperty(Writable, Symbol.hasInstance, { + value: function (object) { + if (realHasInstance.call(this, object)) return true; + if (this !== Writable) return false; + + return object && object._writableState instanceof WritableState; + } + }); +} else { + realHasInstance = function (object) { + return object instanceof this; + }; +} + +function Writable(options) { + Duplex = Duplex || __webpack_require__(241); + + // Writable ctor is applied to Duplexes, too. + // `realHasInstance` is necessary because using plain `instanceof` + // would return false, as no `_writableState` property is attached. + + // Trying to use the custom `instanceof` for Writable here will also break the + // Node.js LazyTransform implementation, which has a non-trivial getter for + // `_writableState` that would lead to infinite recursion. + if (!realHasInstance.call(Writable, this) && !(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; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + + if (typeof options.final === 'function') this._final = options.final; + } + + 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); + pna.nextTick(cb, er); +} + +// Checks that a user-supplied chunk is valid, especially for the particular +// mode the stream is in. Currently this means that `null` is never accepted +// and undefined/non-string values are only allowed in object mode. +function validChunk(stream, state, chunk, cb) { + var valid = true; + var er = false; + + if (chunk === null) { + er = new TypeError('May not write null values to stream'); + } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + if (er) { + stream.emit('error', er); + pna.nextTick(cb, er); + valid = false; + } + return valid; +} + +Writable.prototype.write = function (chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + var isBuf = !state.objectMode && _isUint8Array(chunk); + + if (isBuf && !Buffer.isBuffer(chunk)) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; + + if (typeof cb !== 'function') cb = nop; + + if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, isBuf, 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.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; + return this; +}; + +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { + chunk = Buffer.from(chunk, encoding); + } + return chunk; +} + +Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// 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, isBuf, chunk, encoding, cb) { + if (!isBuf) { + var newChunk = decodeChunk(state, chunk, encoding); + if (chunk !== newChunk) { + isBuf = true; + encoding = 'buffer'; + chunk = newChunk; + } + } + 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 = { + chunk: chunk, + encoding: encoding, + isBuf: isBuf, + callback: cb, + next: null + }; + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + state.bufferedRequestCount += 1; + } 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) { + // defer the callback if we are being called synchronously + // to avoid piling up things on the stack + pna.nextTick(cb, er); + // this can emit finish, and it will always happen + // after error + pna.nextTick(finishMaybe, stream, state); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + } else { + // the caller expect this to happen before if + // it is async + cb(er); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + // this can emit finish, but finish must + // always follow error + finishMaybe(stream, state); + } +} + +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) { + /**/ + asyncWrite(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 l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; + + var count = 0; + var allBuffers = true; + while (entry) { + buffer[count] = entry; + if (!entry.isBuf) allBuffers = false; + entry = entry.next; + count += 1; + } + buffer.allBuffers = allBuffers; + + doWrite(stream, state, true, state.length, buffer, '', holder.finish); + + // doWrite is almost always async, defer these to save a bit of time + // as the hot path ends with doWrite + state.pendingcb++; + state.lastBufferedRequest = null; + if (holder.next) { + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state.corkedRequestsFree = new CorkedRequest(state); + } + state.bufferedRequestCount = 0; + } 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; + state.bufferedRequestCount--; + // 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('_write() is 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) endWritable(this, state, cb); +}; + +function needFinish(state) { + return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; +} +function callFinal(stream, state) { + stream._final(function (err) { + state.pendingcb--; + if (err) { + stream.emit('error', err); + } + state.prefinished = true; + stream.emit('prefinish'); + finishMaybe(stream, state); + }); +} +function prefinish(stream, state) { + if (!state.prefinished && !state.finalCalled) { + if (typeof stream._final === 'function') { + state.pendingcb++; + state.finalCalled = true; + pna.nextTick(callFinal, stream, state); + } else { + state.prefinished = true; + stream.emit('prefinish'); + } + } +} + +function finishMaybe(stream, state) { + var need = needFinish(state); + if (need) { + prefinish(stream, state); + if (state.pendingcb === 0) { + state.finished = true; + stream.emit('finish'); + } + } + return need; +} + +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + if (cb) { + if (state.finished) pna.nextTick(cb);else stream.once('finish', cb); + } + state.ended = true; + stream.writable = false; +} + +function onCorkedFinish(corkReq, state, err) { + var entry = corkReq.entry; + corkReq.entry = null; + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; + } + + // reuse the free corkReq. + state.corkedRequestsFree.next = corkReq; +} + +Object.defineProperty(Writable.prototype, 'destroyed', { + get: function () { + if (this._writableState === undefined) { + return false; + } + return this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._writableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._writableState.destroyed = value; + } +}); + +Writable.prototype.destroy = destroyImpl.destroy; +Writable.prototype._undestroy = destroyImpl.undestroy; +Writable.prototype._destroy = function (err, cb) { + this.end(); + cb(err); +}; + +/***/ }), +/* 243 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +/** + * For Node.js, simply re-export the core `util.deprecate` function. + */ + +module.exports = __webpack_require__(17).deprecate; + + +/***/ }), +/* 244 */ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; +// 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 = (__webpack_require__(236).Buffer); +/**/ + +var isEncoding = Buffer.isEncoding || function (encoding) { + encoding = '' + 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 _normalizeEncoding(enc) { + if (!enc) return 'utf8'; + var retried; + while (true) { + switch (enc) { + case 'utf8': + case 'utf-8': + return 'utf8'; + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return 'utf16le'; + case 'latin1': + case 'binary': + return 'latin1'; + case 'base64': + case 'ascii': + case 'hex': + return enc; + default: + if (retried) return; // undefined + enc = ('' + enc).toLowerCase(); + retried = true; + } + } +}; + +// Do not cache `Buffer.isEncoding` when checking encoding names as some +// modules monkey-patch it to support additional encodings +function normalizeEncoding(enc) { + var nenc = _normalizeEncoding(enc); + if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc); + return nenc || enc; +} + +// StringDecoder provides an interface for efficiently splitting a series of +// buffers into a series of JS strings without breaking apart multi-byte +// characters. +exports.StringDecoder = StringDecoder; +function StringDecoder(encoding) { + this.encoding = normalizeEncoding(encoding); + var nb; + switch (this.encoding) { + case 'utf16le': + this.text = utf16Text; + this.end = utf16End; + nb = 4; + break; + case 'utf8': + this.fillLast = utf8FillLast; + nb = 4; + break; + case 'base64': + this.text = base64Text; + this.end = base64End; + nb = 3; + break; + default: + this.write = simpleWrite; + this.end = simpleEnd; + return; + } + this.lastNeed = 0; + this.lastTotal = 0; + this.lastChar = Buffer.allocUnsafe(nb); +} + +StringDecoder.prototype.write = function (buf) { + if (buf.length === 0) return ''; + var r; + var i; + if (this.lastNeed) { + r = this.fillLast(buf); + if (r === undefined) return ''; + i = this.lastNeed; + this.lastNeed = 0; + } else { + i = 0; + } + if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i); + return r || ''; +}; + +StringDecoder.prototype.end = utf8End; + +// Returns only complete characters in a Buffer +StringDecoder.prototype.text = utf8Text; + +// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer +StringDecoder.prototype.fillLast = function (buf) { + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length); + this.lastNeed -= buf.length; +}; + +// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a +// continuation byte. If an invalid byte is detected, -2 is returned. +function utf8CheckByte(byte) { + if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4; + return byte >> 6 === 0x02 ? -1 : -2; +} + +// Checks at most 3 bytes at the end of a Buffer in order to detect an +// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4) +// needed to complete the UTF-8 character (if applicable) are returned. +function utf8CheckIncomplete(self, buf, i) { + var j = buf.length - 1; + if (j < i) return 0; + var nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 1; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 2; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) { + if (nb === 2) nb = 0;else self.lastNeed = nb - 3; + } + return nb; + } + return 0; +} + +// Validates as many continuation bytes for a multi-byte UTF-8 character as +// needed or are available. If we see a non-continuation byte where we expect +// one, we "replace" the validated continuation bytes we've seen so far with +// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding +// behavior. The continuation byte check is included three times in the case +// where all of the continuation bytes for a character exist in the same buffer. +// It is also done this way as a slight performance increase instead of using a +// loop. +function utf8CheckExtraBytes(self, buf, p) { + if ((buf[0] & 0xC0) !== 0x80) { + self.lastNeed = 0; + return '\ufffd'; + } + if (self.lastNeed > 1 && buf.length > 1) { + if ((buf[1] & 0xC0) !== 0x80) { + self.lastNeed = 1; + return '\ufffd'; + } + if (self.lastNeed > 2 && buf.length > 2) { + if ((buf[2] & 0xC0) !== 0x80) { + self.lastNeed = 2; + return '\ufffd'; + } + } + } +} + +// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer. +function utf8FillLast(buf) { + var p = this.lastTotal - this.lastNeed; + var r = utf8CheckExtraBytes(this, buf, p); + if (r !== undefined) return r; + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, p, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, p, 0, buf.length); + this.lastNeed -= buf.length; +} + +// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a +// partial character, the character's bytes are buffered until the required +// number of bytes are available. +function utf8Text(buf, i) { + var total = utf8CheckIncomplete(this, buf, i); + if (!this.lastNeed) return buf.toString('utf8', i); + this.lastTotal = total; + var end = buf.length - (total - this.lastNeed); + buf.copy(this.lastChar, 0, end); + return buf.toString('utf8', i, end); +} + +// For UTF-8, a replacement character is added when ending on a partial +// character. +function utf8End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + '\ufffd'; + return r; +} + +// UTF-16LE typically needs two bytes per character, but even if we have an even +// number of bytes available, we need to check if we end on a leading/high +// surrogate. In that case, we need to wait for the next two bytes in order to +// decode the last character properly. +function utf16Text(buf, i) { + if ((buf.length - i) % 2 === 0) { + var r = buf.toString('utf16le', i); + if (r) { + var c = r.charCodeAt(r.length - 1); + if (c >= 0xD800 && c <= 0xDBFF) { + this.lastNeed = 2; + this.lastTotal = 4; + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + return r.slice(0, -1); + } + } + return r; + } + this.lastNeed = 1; + this.lastTotal = 2; + this.lastChar[0] = buf[buf.length - 1]; + return buf.toString('utf16le', i, buf.length - 1); +} + +// For UTF-16LE we do not explicitly append special replacement characters if we +// end on a partial character, we simply let v8 handle that. +function utf16End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) { + var end = this.lastTotal - this.lastNeed; + return r + this.lastChar.toString('utf16le', 0, end); + } + return r; +} + +function base64Text(buf, i) { + var n = (buf.length - i) % 3; + if (n === 0) return buf.toString('base64', i); + this.lastNeed = 3 - n; + this.lastTotal = 3; + if (n === 1) { + this.lastChar[0] = buf[buf.length - 1]; + } else { + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + } + return buf.toString('base64', i, buf.length - n); +} + +function base64End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed); + return r; +} + +// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex) +function simpleWrite(buf) { + return buf.toString(this.encoding); +} + +function simpleEnd(buf) { + return buf && buf.length ? this.write(buf) : ''; +} + +/***/ }), +/* 245 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +// 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. + +// 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. + + + +module.exports = Transform; + +var Duplex = __webpack_require__(241); + +/**/ +var util = Object.create(__webpack_require__(238)); +util.inherits = __webpack_require__(70); +/**/ + +util.inherits(Transform, Duplex); + +function afterTransform(er, data) { + var ts = this._transformState; + ts.transforming = false; + + var cb = ts.writecb; + + if (!cb) { + return this.emit('error', new Error('write callback called multiple times')); + } + + ts.writechunk = null; + ts.writecb = null; + + if (data != null) // single equals check for both `null` and `undefined` + this.push(data); + + cb(er); + + var rs = this._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + this._read(rs.highWaterMark); + } +} + +function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); + + Duplex.call(this, options); + + this._transformState = { + afterTransform: afterTransform.bind(this), + needTransform: false, + transforming: false, + writecb: null, + writechunk: null, + writeencoding: null + }; + + // 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; + } + + // When the writable side finishes, then flush out anything remaining. + this.on('prefinish', prefinish); +} + +function prefinish() { + var _this = this; + + if (typeof this._flush === 'function') { + this._flush(function (er, data) { + done(_this, er, data); + }); + } else { + done(this, null, null); + } +} + +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('_transform() is 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; + } +}; + +Transform.prototype._destroy = function (err, cb) { + var _this2 = this; + + Duplex.prototype._destroy.call(this, err, function (err2) { + cb(err2); + _this2.emit('close'); + }); +}; + +function done(stream, er, data) { + if (er) return stream.emit('error', er); + + if (data != null) // single equals check for both `null` and `undefined` + stream.push(data); + + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0'); + + if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming'); + + return stream.push(null); +} + +/***/ }), +/* 246 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +// 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. + +// a passthrough stream. +// basically just the most minimal sort of Transform stream. +// Every written chunk gets output as-is. + + + +module.exports = PassThrough; + +var Transform = __webpack_require__(245); + +/**/ +var util = Object.create(__webpack_require__(238)); +util.inherits = __webpack_require__(70); +/**/ + +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); +}; + +/***/ }), +/* 247 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var path = __webpack_require__(3); +var binaryExtensions = __webpack_require__(248); +var exts = Object.create(null); + +binaryExtensions.forEach(function (el) { + exts[el] = true; +}); + +module.exports = function (filepath) { + return path.extname(filepath).slice(1).toLowerCase() in exts; +}; + + +/***/ }), +/* 248 */ +/***/ ((module) => { + +"use strict"; +module.exports = /*#__PURE__*/JSON.parse('["3dm","3ds","3g2","3gp","7z","a","aac","adp","ai","aif","aiff","alz","ape","apk","ar","arj","asf","au","avi","bak","baml","bh","bin","bk","bmp","btif","bz2","bzip2","cab","caf","cgm","class","cmx","cpio","cr2","cur","dat","dcm","deb","dex","djvu","dll","dmg","dng","doc","docm","docx","dot","dotm","dra","DS_Store","dsk","dts","dtshd","dvb","dwg","dxf","ecelp4800","ecelp7470","ecelp9600","egg","eol","eot","epub","exe","f4v","fbs","fh","fla","flac","fli","flv","fpx","fst","fvt","g3","gh","gif","graffle","gz","gzip","h261","h263","h264","icns","ico","ief","img","ipa","iso","jar","jpeg","jpg","jpgv","jpm","jxr","key","ktx","lha","lib","lvp","lz","lzh","lzma","lzo","m3u","m4a","m4v","mar","mdi","mht","mid","midi","mj2","mka","mkv","mmr","mng","mobi","mov","movie","mp3","mp4","mp4a","mpeg","mpg","mpga","mxu","nef","npx","numbers","nupkg","o","oga","ogg","ogv","otf","pages","pbm","pcx","pdb","pdf","pea","pgm","pic","png","pnm","pot","potm","potx","ppa","ppam","ppm","pps","ppsm","ppsx","ppt","pptm","pptx","psd","pya","pyc","pyo","pyv","qt","rar","ras","raw","resources","rgb","rip","rlc","rmf","rmvb","rtf","rz","s3m","s7z","scpt","sgi","shar","sil","sketch","slk","smv","snk","so","stl","suo","sub","swf","tar","tbz","tbz2","tga","tgz","thmx","tif","tiff","tlz","ttc","ttf","txz","udf","uvh","uvi","uvm","uvp","uvs","uvu","viv","vob","war","wav","wax","wbmp","wdp","weba","webm","webp","whl","wim","wm","wma","wmv","wmx","woff","woff2","wrm","wvx","xbm","xif","xla","xlam","xls","xlsb","xlsm","xlsx","xlt","xltm","xltx","xm","xmind","xpi","xpm","xwd","xz","z","zip","zipx"]'); + +/***/ }), +/* 249 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var fs = __webpack_require__(11); +var sysPath = __webpack_require__(3); +var readdirp = __webpack_require__(189); +var fsevents; +try { fsevents = __webpack_require__(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'vscode-fsevents'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); } catch (error) { + if (process.env.CHOKIDAR_PRINT_FSEVENTS_REQUIRE_ERROR) console.error(error) +} + +// fsevents instance helper functions + +// object to hold per-process fsevents instances +// (may be shared across chokidar FSWatcher instances) +var FSEventsWatchers = Object.create(null); + +// Threshold of duplicate path prefixes at which to start +// consolidating going forward +var consolidateThreshhold = 10; + +// Private function: Instantiates the fsevents interface + +// * path - string, path to be watched +// * callback - function, called when fsevents is bound and ready + +// Returns new fsevents instance +function createFSEventsInstance(path, callback) { + return (new fsevents(path)).on('fsevent', callback).start(); +} + +// Private function: Instantiates the fsevents interface or binds listeners +// to an existing one covering the same file tree + +// * path - string, path to be watched +// * realPath - string, real path (in case of symlinks) +// * listener - function, called when fsevents emits events +// * rawEmitter - function, passes data to listeners of the 'raw' event + +// Returns close function +function setFSEventsListener(path, realPath, listener, rawEmitter) { + var watchPath = sysPath.extname(path) ? sysPath.dirname(path) : path; + var watchContainer; + var parentPath = sysPath.dirname(watchPath); + + // If we've accumulated a substantial number of paths that + // could have been consolidated by watching one directory + // above the current one, create a watcher on the parent + // path instead, so that we do consolidate going forward. + if (couldConsolidate(parentPath)) { + watchPath = parentPath; + } + + var resolvedPath = sysPath.resolve(path); + var hasSymlink = resolvedPath !== realPath; + function filteredListener(fullPath, flags, info) { + if (hasSymlink) fullPath = fullPath.replace(realPath, resolvedPath); + if ( + fullPath === resolvedPath || + !fullPath.indexOf(resolvedPath + sysPath.sep) + ) listener(fullPath, flags, info); + } + + // check if there is already a watcher on a parent path + // modifies `watchPath` to the parent path when it finds a match + function watchedParent() { + return Object.keys(FSEventsWatchers).some(function(watchedPath) { + // condition is met when indexOf returns 0 + if (!realPath.indexOf(sysPath.resolve(watchedPath) + sysPath.sep)) { + watchPath = watchedPath; + return true; + } + }); + } + + if (watchPath in FSEventsWatchers || watchedParent()) { + watchContainer = FSEventsWatchers[watchPath]; + watchContainer.listeners.push(filteredListener); + } else { + watchContainer = FSEventsWatchers[watchPath] = { + listeners: [filteredListener], + rawEmitters: [rawEmitter], + watcher: createFSEventsInstance(watchPath, function(fullPath, flags) { + var info = fsevents.getInfo(fullPath, flags); + watchContainer.listeners.forEach(function(listener) { + listener(fullPath, flags, info); + }); + watchContainer.rawEmitters.forEach(function(emitter) { + emitter(info.event, fullPath, info); + }); + }) + }; + } + var listenerIndex = watchContainer.listeners.length - 1; + + // removes this instance's listeners and closes the underlying fsevents + // instance if there are no more listeners left + return function close() { + delete watchContainer.listeners[listenerIndex]; + delete watchContainer.rawEmitters[listenerIndex]; + if (!Object.keys(watchContainer.listeners).length) { + watchContainer.watcher.stop(); + delete FSEventsWatchers[watchPath]; + } + }; +} + +// Decide whether or not we should start a new higher-level +// parent watcher +function couldConsolidate(path) { + var keys = Object.keys(FSEventsWatchers); + var count = 0; + + for (var i = 0, len = keys.length; i < len; ++i) { + var watchPath = keys[i]; + if (watchPath.indexOf(path) === 0) { + count++; + if (count >= consolidateThreshhold) { + return true; + } + } + } + + return false; +} + +// returns boolean indicating whether fsevents can be used +function canUse() { + return fsevents && Object.keys(FSEventsWatchers).length < 128; +} + +// determines subdirectory traversal levels from root to path +function depth(path, root) { + var i = 0; + while (!path.indexOf(root) && (path = sysPath.dirname(path)) !== root) i++; + return i; +} + +// fake constructor for attaching fsevents-specific prototype methods that +// will be copied to FSWatcher's prototype +function FsEventsHandler() {} + +// Private method: Handle symlinks encountered during directory scan + +// * watchPath - string, file/dir path to be watched with fsevents +// * realPath - string, real path (in case of symlinks) +// * transform - function, path transformer +// * globFilter - function, path filter in case a glob pattern was provided + +// Returns close function for the watcher instance +FsEventsHandler.prototype._watchWithFsEvents = +function(watchPath, realPath, transform, globFilter) { + if (this._isIgnored(watchPath)) return; + var watchCallback = function(fullPath, flags, info) { + if ( + this.options.depth !== undefined && + depth(fullPath, realPath) > this.options.depth + ) return; + var path = transform(sysPath.join( + watchPath, sysPath.relative(watchPath, fullPath) + )); + if (globFilter && !globFilter(path)) return; + // ensure directories are tracked + var parent = sysPath.dirname(path); + var item = sysPath.basename(path); + var watchedDir = this._getWatchedDir( + info.type === 'directory' ? path : parent + ); + var checkIgnored = function(stats) { + if (this._isIgnored(path, stats)) { + this._ignoredPaths[path] = true; + if (stats && stats.isDirectory()) { + this._ignoredPaths[path + '/**/*'] = true; + } + return true; + } else { + delete this._ignoredPaths[path]; + delete this._ignoredPaths[path + '/**/*']; + } + }.bind(this); + + var handleEvent = function(event) { + if (checkIgnored()) return; + + if (event === 'unlink') { + // suppress unlink events on never before seen files + if (info.type === 'directory' || watchedDir.has(item)) { + this._remove(parent, item); + } + } else { + if (event === 'add') { + // track new directories + if (info.type === 'directory') this._getWatchedDir(path); + + if (info.type === 'symlink' && this.options.followSymlinks) { + // push symlinks back to the top of the stack to get handled + var curDepth = this.options.depth === undefined ? + undefined : depth(fullPath, realPath) + 1; + return this._addToFsEvents(path, false, true, curDepth); + } else { + // track new paths + // (other than symlinks being followed, which will be tracked soon) + this._getWatchedDir(parent).add(item); + } + } + var eventName = info.type === 'directory' ? event + 'Dir' : event; + this._emit(eventName, path); + if (eventName === 'addDir') this._addToFsEvents(path, false, true); + } + }.bind(this); + + function addOrChange() { + handleEvent(watchedDir.has(item) ? 'change' : 'add'); + } + function checkFd() { + fs.open(path, 'r', function(error, fd) { + if (error) { + error.code !== 'EACCES' ? + handleEvent('unlink') : addOrChange(); + } else { + fs.close(fd, function(err) { + err && err.code !== 'EACCES' ? + handleEvent('unlink') : addOrChange(); + }); + } + }); + } + // correct for wrong events emitted + var wrongEventFlags = [ + 69888, 70400, 71424, 72704, 73472, 131328, 131840, 262912 + ]; + if (wrongEventFlags.indexOf(flags) !== -1 || info.event === 'unknown') { + if (typeof this.options.ignored === 'function') { + fs.stat(path, function(error, stats) { + if (checkIgnored(stats)) return; + stats ? addOrChange() : handleEvent('unlink'); + }); + } else { + checkFd(); + } + } else { + switch (info.event) { + case 'created': + case 'modified': + return addOrChange(); + case 'deleted': + case 'moved': + return checkFd(); + } + } + }.bind(this); + + var closer = setFSEventsListener( + watchPath, + realPath, + watchCallback, + this.emit.bind(this, 'raw') + ); + + this._emitReady(); + return closer; +}; + +// Private method: Handle symlinks encountered during directory scan + +// * linkPath - string, path to symlink +// * fullPath - string, absolute path to the symlink +// * transform - function, pre-existing path transformer +// * curDepth - int, level of subdirectories traversed to where symlink is + +// Returns nothing +FsEventsHandler.prototype._handleFsEventsSymlink = +function(linkPath, fullPath, transform, curDepth) { + // don't follow the same symlink more than once + if (this._symlinkPaths[fullPath]) return; + else this._symlinkPaths[fullPath] = true; + + this._readyCount++; + + fs.realpath(linkPath, function(error, linkTarget) { + if (this._handleError(error) || this._isIgnored(linkTarget)) { + return this._emitReady(); + } + + this._readyCount++; + + // add the linkTarget for watching with a wrapper for transform + // that causes emitted paths to incorporate the link's path + this._addToFsEvents(linkTarget || linkPath, function(path) { + var dotSlash = '.' + sysPath.sep; + var aliasedPath = linkPath; + if (linkTarget && linkTarget !== dotSlash) { + aliasedPath = path.replace(linkTarget, linkPath); + } else if (path !== dotSlash) { + aliasedPath = sysPath.join(linkPath, path); + } + return transform(aliasedPath); + }, false, curDepth); + }.bind(this)); +}; + +// Private method: Handle added path with fsevents + +// * path - string, file/directory path or glob pattern +// * transform - function, converts working path to what the user expects +// * forceAdd - boolean, ensure add is emitted +// * priorDepth - int, level of subdirectories already traversed + +// Returns nothing +FsEventsHandler.prototype._addToFsEvents = +function(path, transform, forceAdd, priorDepth) { + + // applies transform if provided, otherwise returns same value + var processPath = typeof transform === 'function' ? + transform : function(val) { return val; }; + + var emitAdd = function(newPath, stats) { + var pp = processPath(newPath); + var isDir = stats.isDirectory(); + var dirObj = this._getWatchedDir(sysPath.dirname(pp)); + var base = sysPath.basename(pp); + + // ensure empty dirs get tracked + if (isDir) this._getWatchedDir(pp); + + if (dirObj.has(base)) return; + dirObj.add(base); + + if (!this.options.ignoreInitial || forceAdd === true) { + this._emit(isDir ? 'addDir' : 'add', pp, stats); + } + }.bind(this); + + var wh = this._getWatchHelpers(path); + + // evaluate what is at the path we're being asked to watch + fs[wh.statMethod](wh.watchPath, function(error, stats) { + if (this._handleError(error) || this._isIgnored(wh.watchPath, stats)) { + this._emitReady(); + return this._emitReady(); + } + + if (stats.isDirectory()) { + // emit addDir unless this is a glob parent + if (!wh.globFilter) emitAdd(processPath(path), stats); + + // don't recurse further if it would exceed depth setting + if (priorDepth && priorDepth > this.options.depth) return; + + // scan the contents of the dir + readdirp({ + root: wh.watchPath, + entryType: 'all', + fileFilter: wh.filterPath, + directoryFilter: wh.filterDir, + lstat: true, + depth: this.options.depth - (priorDepth || 0) + }).on('data', function(entry) { + // need to check filterPath on dirs b/c filterDir is less restrictive + if (entry.stat.isDirectory() && !wh.filterPath(entry)) return; + + var joinedPath = sysPath.join(wh.watchPath, entry.path); + var fullPath = entry.fullPath; + + if (wh.followSymlinks && entry.stat.isSymbolicLink()) { + // preserve the current depth here since it can't be derived from + // real paths past the symlink + var curDepth = this.options.depth === undefined ? + undefined : depth(joinedPath, sysPath.resolve(wh.watchPath)) + 1; + + this._handleFsEventsSymlink(joinedPath, fullPath, processPath, curDepth); + } else { + emitAdd(joinedPath, entry.stat); + } + }.bind(this)).on('error', function() { + // Ignore readdirp errors + }).on('end', this._emitReady); + } else { + emitAdd(wh.watchPath, stats); + this._emitReady(); + } + }.bind(this)); + + if (this.options.persistent && forceAdd !== true) { + var initWatch = function(error, realPath) { + if (this.closed) return; + var closer = this._watchWithFsEvents( + wh.watchPath, + sysPath.resolve(realPath || wh.watchPath), + processPath, + wh.globFilter + ); + if (closer) { + this._closers[path] = this._closers[path] || []; + this._closers[path].push(closer); + } + }.bind(this); + + if (typeof transform === 'function') { + // realpath has already been resolved + initWatch(); + } else { + fs.realpath(wh.watchPath, initWatch); + } + } +}; + +module.exports = FsEventsHandler; +module.exports.canUse = canUse; + + +/***/ }), +/* 250 */ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Check = Check; +exports.Lock = Lock; +exports.Unlock = Unlock; +const lockfile = __importStar(__webpack_require__(251)); +const util_1 = __webpack_require__(254); +exports["default"] = { + Check, + Lock, + Unlock +}; +function Check(filepath, options = {}) { + return util_1.Util.promisify(lockfile.check)(filepath, options); +} +function Lock(filepath, options = {}) { + return util_1.Util.promisify(lockfile.lock)(filepath, options); +} +function Unlock(filepath) { + return util_1.Util.promisify(lockfile.unlock)(filepath); +} + + +/***/ }), +/* 251 */ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +var fs = __webpack_require__(11) + +var wx = 'wx' +if (process.version.match(/^v0\.[0-6]/)) { + var c = __webpack_require__(13) + wx = c.O_TRUNC | c.O_CREAT | c.O_WRONLY | c.O_EXCL +} + +var os = __webpack_require__(67) +exports.filetime = 'ctime' +if (os.platform() == "win32") { + exports.filetime = 'mtime' +} + +var debug +var util = __webpack_require__(17) +if (util.debuglog) + debug = util.debuglog('LOCKFILE') +else if (/\blockfile\b/i.test(process.env.NODE_DEBUG)) + debug = function() { + var msg = util.format.apply(util, arguments) + console.error('LOCKFILE %d %s', process.pid, msg) + } +else + debug = function() {} + +var locks = {} + +function hasOwnProperty (obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop) +} + +var onExit = __webpack_require__(252) +onExit(function () { + debug('exit listener') + // cleanup + Object.keys(locks).forEach(exports.unlockSync) +}) + +// XXX https://github.com/joyent/node/issues/3555 +// Remove when node 0.8 is deprecated. +if (/^v0\.[0-8]\./.test(process.version)) { + debug('uncaughtException, version = %s', process.version) + process.on('uncaughtException', function H (er) { + debug('uncaughtException') + var l = process.listeners('uncaughtException').filter(function (h) { + return h !== H + }) + if (!l.length) { + // cleanup + try { Object.keys(locks).forEach(exports.unlockSync) } catch (e) {} + process.removeListener('uncaughtException', H) + throw er + } + }) +} + +exports.unlock = function (path, cb) { + debug('unlock', path) + // best-effort. unlocking an already-unlocked lock is a noop + delete locks[path] + fs.unlink(path, function (unlinkEr) { cb && cb() }) +} + +exports.unlockSync = function (path) { + debug('unlockSync', path) + // best-effort. unlocking an already-unlocked lock is a noop + try { fs.unlinkSync(path) } catch (er) {} + delete locks[path] +} + + +// if the file can be opened in readonly mode, then it's there. +// if the error is something other than ENOENT, then it's not. +exports.check = function (path, opts, cb) { + if (typeof opts === 'function') cb = opts, opts = {} + debug('check', path, opts) + fs.open(path, 'r', function (er, fd) { + if (er) { + if (er.code !== 'ENOENT') return cb(er) + return cb(null, false) + } + + if (!opts.stale) { + return fs.close(fd, function (er) { + return cb(er, true) + }) + } + + fs.fstat(fd, function (er, st) { + if (er) return fs.close(fd, function (er2) { + return cb(er) + }) + + fs.close(fd, function (er) { + var age = Date.now() - st[exports.filetime].getTime() + return cb(er, age <= opts.stale) + }) + }) + }) +} + +exports.checkSync = function (path, opts) { + opts = opts || {} + debug('checkSync', path, opts) + if (opts.wait) { + throw new Error('opts.wait not supported sync for obvious reasons') + } + + try { + var fd = fs.openSync(path, 'r') + } catch (er) { + if (er.code !== 'ENOENT') throw er + return false + } + + if (!opts.stale) { + try { fs.closeSync(fd) } catch (er) {} + return true + } + + // file exists. however, might be stale + if (opts.stale) { + try { + var st = fs.fstatSync(fd) + } finally { + fs.closeSync(fd) + } + var age = Date.now() - st[exports.filetime].getTime() + return (age <= opts.stale) + } +} + + + +var req = 1 +exports.lock = function (path, opts, cb) { + if (typeof opts === 'function') cb = opts, opts = {} + opts.req = opts.req || req++ + debug('lock', path, opts) + opts.start = opts.start || Date.now() + + if (typeof opts.retries === 'number' && opts.retries > 0) { + debug('has retries', opts.retries) + var retries = opts.retries + opts.retries = 0 + cb = (function (orig) { return function cb (er, fd) { + debug('retry-mutated callback') + retries -= 1 + if (!er || retries < 0) return orig(er, fd) + + debug('lock retry', path, opts) + + if (opts.retryWait) setTimeout(retry, opts.retryWait) + else retry() + + function retry () { + opts.start = Date.now() + debug('retrying', opts.start) + exports.lock(path, opts, cb) + } + }})(cb) + } + + // try to engage the lock. + // if this succeeds, then we're in business. + fs.open(path, wx, function (er, fd) { + if (!er) { + debug('locked', path, fd) + locks[path] = fd + return fs.close(fd, function () { + return cb() + }) + } + + debug('failed to acquire lock', er) + + // something other than "currently locked" + // maybe eperm or something. + if (er.code !== 'EEXIST') { + debug('not EEXIST error', er) + return cb(er) + } + + // someone's got this one. see if it's valid. + if (!opts.stale) return notStale(er, path, opts, cb) + + return maybeStale(er, path, opts, false, cb) + }) + debug('lock return') +} + + +// Staleness checking algorithm +// 1. acquire $lock, fail +// 2. stat $lock, find that it is stale +// 3. acquire $lock.STALE +// 4. stat $lock, assert that it is still stale +// 5. unlink $lock +// 6. link $lock.STALE $lock +// 7. unlink $lock.STALE +// On any failure, clean up whatever we've done, and raise the error. +function maybeStale (originalEr, path, opts, hasStaleLock, cb) { + fs.stat(path, function (statEr, st) { + if (statEr) { + if (statEr.code === 'ENOENT') { + // expired already! + opts.stale = false + debug('lock stale enoent retry', path, opts) + exports.lock(path, opts, cb) + return + } + return cb(statEr) + } + + var age = Date.now() - st[exports.filetime].getTime() + if (age <= opts.stale) return notStale(originalEr, path, opts, cb) + + debug('lock stale', path, opts) + if (hasStaleLock) { + exports.unlock(path, function (er) { + if (er) return cb(er) + debug('lock stale retry', path, opts) + fs.link(path + '.STALE', path, function (er) { + fs.unlink(path + '.STALE', function () { + // best effort. if the unlink fails, oh well. + cb(er) + }) + }) + }) + } else { + debug('acquire .STALE file lock', opts) + exports.lock(path + '.STALE', opts, function (er) { + if (er) return cb(er) + maybeStale(originalEr, path, opts, true, cb) + }) + } + }) +} + +function notStale (er, path, opts, cb) { + debug('notStale', path, opts) + + // if we can't wait, then just call it a failure + if (typeof opts.wait !== 'number' || opts.wait <= 0) { + debug('notStale, wait is not a number') + return cb(er) + } + + // poll for some ms for the lock to clear + var now = Date.now() + var start = opts.start || now + var end = start + opts.wait + + if (end <= now) + return cb(er) + + debug('now=%d, wait until %d (delta=%d)', start, end, end-start) + var wait = Math.min(end - start, opts.pollPeriod || 100) + var timer = setTimeout(poll, wait) + + function poll () { + debug('notStale, polling', path, opts) + exports.lock(path, opts, cb) + } +} + +exports.lockSync = function (path, opts) { + opts = opts || {} + opts.req = opts.req || req++ + debug('lockSync', path, opts) + if (opts.wait || opts.retryWait) { + throw new Error('opts.wait not supported sync for obvious reasons') + } + + try { + var fd = fs.openSync(path, wx) + locks[path] = fd + try { fs.closeSync(fd) } catch (er) {} + debug('locked sync!', path, fd) + return + } catch (er) { + if (er.code !== 'EEXIST') return retryThrow(path, opts, er) + + if (opts.stale) { + var st = fs.statSync(path) + var ct = st[exports.filetime].getTime() + if (!(ct % 1000) && (opts.stale % 1000)) { + // probably don't have subsecond resolution. + // round up the staleness indicator. + // Yes, this will be wrong 1/1000 times on platforms + // with subsecond stat precision, but that's acceptable + // in exchange for not mistakenly removing locks on + // most other systems. + opts.stale = 1000 * Math.ceil(opts.stale / 1000) + } + var age = Date.now() - ct + if (age > opts.stale) { + debug('lockSync stale', path, opts, age) + exports.unlockSync(path) + return exports.lockSync(path, opts) + } + } + + // failed to lock! + debug('failed to lock', path, opts, er) + return retryThrow(path, opts, er) + } +} + +function retryThrow (path, opts, er) { + if (typeof opts.retries === 'number' && opts.retries > 0) { + var newRT = opts.retries - 1 + debug('retryThrow', path, opts, newRT) + opts.retries = newRT + return exports.lockSync(path, opts) + } + throw er +} + + + +/***/ }), +/* 252 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +// Note: since nyc uses this module to output coverage, any lines +// that are in the direct sync flow of nyc's outputCoverage are +// ignored, since we can never get coverage for them. +// grab a reference to node's real process object right away +var process = global.process + +const processOk = function (process) { + return process && + typeof process === 'object' && + typeof process.removeListener === 'function' && + typeof process.emit === 'function' && + typeof process.reallyExit === 'function' && + typeof process.listeners === 'function' && + typeof process.kill === 'function' && + typeof process.pid === 'number' && + typeof process.on === 'function' +} + +// some kind of non-node environment, just no-op +/* istanbul ignore if */ +if (!processOk(process)) { + module.exports = function () { + return function () {} + } +} else { + var assert = __webpack_require__(18) + var signals = __webpack_require__(253) + var isWin = /^win/i.test(process.platform) + + var EE = __webpack_require__(53) + /* istanbul ignore if */ + if (typeof EE !== 'function') { + EE = EE.EventEmitter + } + + var emitter + if (process.__signal_exit_emitter__) { + emitter = process.__signal_exit_emitter__ + } else { + emitter = process.__signal_exit_emitter__ = new EE() + emitter.count = 0 + emitter.emitted = {} + } + + // Because this emitter is a global, we have to check to see if a + // previous version of this library failed to enable infinite listeners. + // I know what you're about to say. But literally everything about + // signal-exit is a compromise with evil. Get used to it. + if (!emitter.infinite) { + emitter.setMaxListeners(Infinity) + emitter.infinite = true + } + + module.exports = function (cb, opts) { + /* istanbul ignore if */ + if (!processOk(global.process)) { + return function () {} + } + assert.equal(typeof cb, 'function', 'a callback must be provided for exit handler') + + if (loaded === false) { + load() + } + + var ev = 'exit' + if (opts && opts.alwaysLast) { + ev = 'afterexit' + } + + var remove = function () { + emitter.removeListener(ev, cb) + if (emitter.listeners('exit').length === 0 && + emitter.listeners('afterexit').length === 0) { + unload() + } + } + emitter.on(ev, cb) + + return remove + } + + var unload = function unload () { + if (!loaded || !processOk(global.process)) { + return + } + loaded = false + + signals.forEach(function (sig) { + try { + process.removeListener(sig, sigListeners[sig]) + } catch (er) {} + }) + process.emit = originalProcessEmit + process.reallyExit = originalProcessReallyExit + emitter.count -= 1 + } + module.exports.unload = unload + + var emit = function emit (event, code, signal) { + /* istanbul ignore if */ + if (emitter.emitted[event]) { + return + } + emitter.emitted[event] = true + emitter.emit(event, code, signal) + } + + // { : , ... } + var sigListeners = {} + signals.forEach(function (sig) { + sigListeners[sig] = function listener () { + /* istanbul ignore if */ + if (!processOk(global.process)) { + return + } + // If there are no other listeners, an exit is coming! + // Simplest way: remove us and then re-send the signal. + // We know that this will kill the process, so we can + // safely emit now. + var listeners = process.listeners(sig) + if (listeners.length === emitter.count) { + unload() + emit('exit', null, sig) + /* istanbul ignore next */ + emit('afterexit', null, sig) + /* istanbul ignore next */ + if (isWin && sig === 'SIGHUP') { + // "SIGHUP" throws an `ENOSYS` error on Windows, + // so use a supported signal instead + sig = 'SIGINT' + } + /* istanbul ignore next */ + process.kill(process.pid, sig) + } + } + }) + + module.exports.signals = function () { + return signals + } + + var loaded = false + + var load = function load () { + if (loaded || !processOk(global.process)) { + return + } + loaded = true + + // This is the number of onSignalExit's that are in play. + // It's important so that we can count the correct number of + // listeners on signals, and don't wait for the other one to + // handle it instead of us. + emitter.count += 1 + + signals = signals.filter(function (sig) { + try { + process.on(sig, sigListeners[sig]) + return true + } catch (er) { + return false + } + }) + + process.emit = processEmit + process.reallyExit = processReallyExit + } + module.exports.load = load + + var originalProcessReallyExit = process.reallyExit + var processReallyExit = function processReallyExit (code) { + /* istanbul ignore if */ + if (!processOk(global.process)) { + return + } + process.exitCode = code || /* istanbul ignore next */ 0 + emit('exit', process.exitCode, null) + /* istanbul ignore next */ + emit('afterexit', process.exitCode, null) + /* istanbul ignore next */ + originalProcessReallyExit.call(process, process.exitCode) + } + + var originalProcessEmit = process.emit + var processEmit = function processEmit (ev, arg) { + if (ev === 'exit' && processOk(global.process)) { + /* istanbul ignore else */ + if (arg !== undefined) { + process.exitCode = arg + } + var ret = originalProcessEmit.apply(this, arguments) + /* istanbul ignore next */ + emit('exit', process.exitCode, null) + /* istanbul ignore next */ + emit('afterexit', process.exitCode, null) + /* istanbul ignore next */ + return ret + } else { + return originalProcessEmit.apply(this, arguments) + } + } +} + + +/***/ }), +/* 253 */ +/***/ ((module) => { + +// This is not the set of all possible signals. +// +// It IS, however, the set of all signals that trigger +// an exit on either Linux or BSD systems. Linux is a +// superset of the signal names supported on BSD, and +// the unknown signals just fail to register, so we can +// catch that easily enough. +// +// Don't bother with SIGKILL. It's uncatchable, which +// means that we can't fire any callbacks anyway. +// +// If a user does happen to register a handler on a non- +// fatal signal like SIGWINCH or something, and then +// exit, it'll end up firing `process.emit('exit')`, so +// the handler will be fired anyway. +// +// SIGBUS, SIGFPE, SIGSEGV and SIGILL, when not raised +// artificially, inherently leave the process in a +// state from which it is not safe to try and enter JS +// listeners. +module.exports = [ + 'SIGABRT', + 'SIGALRM', + 'SIGHUP', + 'SIGINT', + 'SIGTERM' +] + +if (process.platform !== 'win32') { + module.exports.push( + 'SIGVTALRM', + 'SIGXCPU', + 'SIGXFSZ', + 'SIGUSR2', + 'SIGTRAP', + 'SIGSYS', + 'SIGQUIT', + 'SIGIOT' + // should detect profiler and enable/disable accordingly. + // see #21 + // 'SIGPROF' + ) +} + +if (process.platform === 'linux') { + module.exports.push( + 'SIGIO', + 'SIGPOLL', + 'SIGPWR', + 'SIGSTKFLT', + 'SIGUNUSED' + ) +} + + +/***/ }), +/* 254 */ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Util = void 0; +class Util { + static async Sleep(ms) { + return new Promise(resolve => { + setTimeout(() => { + resolve(ms); + }, ms); + }); + } + /** + * promisify the function + * it will be remove when vscode use node@^8.0 + * @param fn + */ + static promisify(fn) { + return function (...argv) { + return new Promise((resolve, reject) => { + fn.call(this, ...argv, (err, data) => { + if (err) { + reject(err); + } + else { + resolve(data); + } + }); + }); + }; + } +} +exports.Util = Util; + + +/***/ }), +/* 255 */ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.FileService = exports.File = void 0; +const fs = __importStar(__webpack_require__(7)); +const path = __importStar(__webpack_require__(3)); +const recursiveRead = __importStar(__webpack_require__(256)); +class File { + fileName; + content; + filePath; + gistName; + constructor(fileName, content, filePath, gistName) { + this.fileName = fileName; + this.content = content; + this.filePath = filePath; + this.gistName = gistName; + } +} +exports.File = File; +class FileService { + static CUSTOMIZED_SYNC_PREFIX = "|customized_sync|"; + static async ReadFile(filePath) { + try { + const data = await fs.readFile(filePath, { encoding: "utf8" }); + return data; + } + catch (err) { + console.error(err); + throw err; + } + } + static async IsDirectory(filepath) { + try { + const stat = await fs.lstat(filepath); + return stat.isDirectory(); + } + catch (err) { + return false; + } + } + static async GetFile(filePath, fileName) { + const fileExists = await FileService.FileExists(filePath); + if (!fileExists) { + return null; + } + const content = await FileService.ReadFile(filePath); + if (content === null) { + return null; + } + const pathFromUser = filePath.substring(filePath.lastIndexOf("User") + 5, filePath.length); + const arr = pathFromUser.indexOf("/") + ? pathFromUser.split("/") + : pathFromUser.split(path.sep); + let gistName = ""; + arr.forEach((element, index) => { + if (index < arr.length - 1) { + gistName += element + "|"; + } + else { + gistName += element; + } + }); + const file = new File(fileName, content, filePath, gistName); + return file; + } + static async WriteFile(filePath, data) { + if (!data) { + console.error(new Error("Unable to write file. FilePath :" + filePath + " Data :" + data)); + return false; + } + try { + await fs.writeFile(filePath, data); + return true; + } + catch (err) { + console.error(err); + return false; + } + } + static async ListFiles(directory, customSettings) { + function folderMatcher(file, stats) { + if (stats.isDirectory()) { + return customSettings.ignoreUploadFolders.some(fold => { + return file.split(path.sep).includes(fold); + }); + } + return false; + } + function fileExtensionMatcher(file, stats) { + if (stats.isDirectory()) { + return false; + } + const ext = path.extname(file).slice(1); + if (!customSettings.supportedFileExtensions.includes(ext)) { + return true; + } + return false; + } + const files = await recursiveRead(directory, [ + ...customSettings.ignoreUploadFiles, + folderMatcher, + fileExtensionMatcher + ]); + return Promise.all(files.map(file => { + return FileService.GetFile(file, path.basename(file)); + })); + } + static async CreateDirTree(userFolder, fileName) { + let fullPath = userFolder; + let result; + let paths = null; + if (fileName.indexOf("|") > -1) { + paths = fileName.split("|"); + } + else if (fileName.indexOf("//") > -1) { + paths = fileName.split("//"); + } + else if (fileName.indexOf("\\") > -1) { + paths = fileName.split("\\"); + } + if (paths != null) { + for (let i = 0; i < paths.length - 1; i++) { + const element = paths[i]; + fullPath += element + path.sep; + await FileService.CreateDirectory(fullPath); + } + result = fullPath + paths[paths.length - 1]; + return result; + } + else { + result = fullPath + fileName; + return result; + } + } + static async DeleteFile(filePath) { + try { + const stat = await FileService.FileExists(filePath); + if (stat) { + await fs.unlink(filePath); + } + return true; + } + catch (err) { + console.error("Unable to delete file. File Path is :" + filePath); + return false; + } + } + static async FileExists(filePath) { + try { + await fs.access(filePath, fs.constants.F_OK); + return true; + } + catch (err) { + return false; + } + } + static async CreateDirectory(name) { + try { + await fs.mkdir(name); + return true; + } + catch (err) { + if (err.code === "EEXIST") { + return false; + } + throw err; + } + } + static async GetCustomFile(filePath, fileName) { + const fileExists = await FileService.FileExists(filePath); + if (!fileExists) { + return null; + } + const content = await FileService.ReadFile(filePath); + if (content === null) { + return null; + } + // for identifing Customized Sync file + const gistName = FileService.CUSTOMIZED_SYNC_PREFIX + fileName; + const file = new File(fileName, content, filePath, gistName); + return file; + } + static async CreateCustomDirTree(filePath) { + const dir = path.dirname(filePath); + const fileExists = await FileService.FileExists(dir); + if (!fileExists) { + // mkdir recursively + await fs.mkdirs(dir); + } + return filePath; + } + static ExtractFileName(fullPath) { + return path.basename(fullPath); + } + static ConcatPath(...filePaths) { + return filePaths.join(path.sep); + } +} +exports.FileService = FileService; + + +/***/ }), +/* 256 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var fs = __webpack_require__(11); +var p = __webpack_require__(3); +var minimatch = __webpack_require__(257); + +function patternMatcher(pattern) { + return function(path, stats) { + var minimatcher = new minimatch.Minimatch(pattern, { matchBase: true }); + return (!minimatcher.negate || stats.isFile()) && minimatcher.match(path); + }; +} + +function toMatcherFunction(ignoreEntry) { + if (typeof ignoreEntry == "function") { + return ignoreEntry; + } else { + return patternMatcher(ignoreEntry); + } +} + +function readdir(path, ignores, callback) { + if (typeof ignores == "function") { + callback = ignores; + ignores = []; + } + + if (!callback) { + return new Promise(function(resolve, reject) { + readdir(path, ignores || [], function(err, data) { + if (err) { + reject(err); + } else { + resolve(data); + } + }); + }); + } + + ignores = ignores.map(toMatcherFunction); + + var list = []; + + fs.readdir(path, function(err, files) { + if (err) { + return callback(err); + } + + var pending = files.length; + if (!pending) { + // we are done, woop woop + return callback(null, list); + } + + files.forEach(function(file) { + var filePath = p.join(path, file); + fs.stat(filePath, function(_err, stats) { + if (_err) { + return callback(_err); + } + + if ( + ignores.some(function(matcher) { + return matcher(filePath, stats); + }) + ) { + pending -= 1; + if (!pending) { + return callback(null, list); + } + return null; + } + + if (stats.isDirectory()) { + readdir(filePath, ignores, function(__err, res) { + if (__err) { + return callback(__err); + } + + list = list.concat(res); + pending -= 1; + if (!pending) { + return callback(null, list); + } + }); + } else { + list.push(filePath); + pending -= 1; + if (!pending) { + return callback(null, list); + } + } + }); + }); + }); +} + +module.exports = readdir; + + +/***/ }), +/* 257 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +module.exports = minimatch +minimatch.Minimatch = Minimatch + +var path = (function () { try { return __webpack_require__(3) } catch (e) {}}()) || { + sep: '/' +} +minimatch.sep = path.sep + +var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {} +var expand = __webpack_require__(258) + +var plTypes = { + '!': { open: '(?:(?!(?:', close: '))[^/]*?)'}, + '?': { open: '(?:', close: ')?' }, + '+': { open: '(?:', close: ')+' }, + '*': { open: '(?:', close: ')*' }, + '@': { open: '(?:', close: ')' } +} + +// any single thing other than / +// don't need to escape / when using new RegExp() +var qmark = '[^/]' + +// * => any number of characters +var star = qmark + '*?' + +// ** when dots are allowed. Anything goes, except .. and . +// not (^ or / followed by one or two dots followed by $ or /), +// followed by anything, any number of times. +var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?' + +// not a ^ or / followed by a dot, +// followed by anything, any number of times. +var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?' + +// characters that need to be escaped in RegExp. +var reSpecials = charSet('().*{}+?[]^$\\!') + +// "abc" -> { a:true, b:true, c:true } +function charSet (s) { + return s.split('').reduce(function (set, c) { + set[c] = true + return set + }, {}) +} + +// normalizes slashes. +var slashSplit = /\/+/ + +minimatch.filter = filter +function filter (pattern, options) { + options = options || {} + return function (p, i, list) { + return minimatch(p, pattern, options) + } +} + +function ext (a, b) { + b = b || {} + var t = {} + Object.keys(a).forEach(function (k) { + t[k] = a[k] + }) + Object.keys(b).forEach(function (k) { + t[k] = b[k] + }) + return t +} + +minimatch.defaults = function (def) { + if (!def || typeof def !== 'object' || !Object.keys(def).length) { + return minimatch + } + + var orig = minimatch + + var m = function minimatch (p, pattern, options) { + return orig(p, pattern, ext(def, options)) + } + + m.Minimatch = function Minimatch (pattern, options) { + return new orig.Minimatch(pattern, ext(def, options)) + } + m.Minimatch.defaults = function defaults (options) { + return orig.defaults(ext(def, options)).Minimatch + } + + m.filter = function filter (pattern, options) { + return orig.filter(pattern, ext(def, options)) + } + + m.defaults = function defaults (options) { + return orig.defaults(ext(def, options)) + } + + m.makeRe = function makeRe (pattern, options) { + return orig.makeRe(pattern, ext(def, options)) + } + + m.braceExpand = function braceExpand (pattern, options) { + return orig.braceExpand(pattern, ext(def, options)) + } + + m.match = function (list, pattern, options) { + return orig.match(list, pattern, ext(def, options)) + } + + return m +} + +Minimatch.defaults = function (def) { + return minimatch.defaults(def).Minimatch +} + +function minimatch (p, pattern, options) { + assertValidPattern(pattern) + + if (!options) options = {} + + // shortcut: comments match nothing. + if (!options.nocomment && pattern.charAt(0) === '#') { + return false + } + + return new Minimatch(pattern, options).match(p) +} + +function Minimatch (pattern, options) { + if (!(this instanceof Minimatch)) { + return new Minimatch(pattern, options) + } + + assertValidPattern(pattern) + + if (!options) options = {} + + pattern = pattern.trim() + + // windows support: need to use /, not \ + if (!options.allowWindowsEscape && path.sep !== '/') { + pattern = pattern.split(path.sep).join('/') + } + + this.options = options + this.set = [] + this.pattern = pattern + this.regexp = null + this.negate = false + this.comment = false + this.empty = false + this.partial = !!options.partial + + // make the set of regexps etc. + this.make() +} + +Minimatch.prototype.debug = function () {} + +Minimatch.prototype.make = make +function make () { + var pattern = this.pattern + var options = this.options + + // empty patterns and comments match nothing. + if (!options.nocomment && pattern.charAt(0) === '#') { + this.comment = true + return + } + if (!pattern) { + this.empty = true + return + } + + // step 1: figure out negation, etc. + this.parseNegate() + + // step 2: expand braces + var set = this.globSet = this.braceExpand() + + if (options.debug) this.debug = function debug() { console.error.apply(console, arguments) } + + this.debug(this.pattern, set) + + // step 3: now we have a set, so turn each one into a series of path-portion + // matching patterns. + // These will be regexps, except in the case of "**", which is + // set to the GLOBSTAR object for globstar behavior, + // and will not contain any / characters + set = this.globParts = set.map(function (s) { + return s.split(slashSplit) + }) + + this.debug(this.pattern, set) + + // glob --> regexps + set = set.map(function (s, si, set) { + return s.map(this.parse, this) + }, this) + + this.debug(this.pattern, set) + + // filter out everything that didn't compile properly. + set = set.filter(function (s) { + return s.indexOf(false) === -1 + }) + + this.debug(this.pattern, set) + + this.set = set +} + +Minimatch.prototype.parseNegate = parseNegate +function parseNegate () { + var pattern = this.pattern + var negate = false + var options = this.options + var negateOffset = 0 + + if (options.nonegate) return + + for (var i = 0, l = pattern.length + ; i < l && pattern.charAt(i) === '!' + ; i++) { + negate = !negate + negateOffset++ + } + + if (negateOffset) this.pattern = pattern.substr(negateOffset) + this.negate = negate +} + +// Brace expansion: +// a{b,c}d -> abd acd +// a{b,}c -> abc ac +// a{0..3}d -> a0d a1d a2d a3d +// a{b,c{d,e}f}g -> abg acdfg acefg +// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg +// +// Invalid sets are not expanded. +// a{2..}b -> a{2..}b +// a{b}c -> a{b}c +minimatch.braceExpand = function (pattern, options) { + return braceExpand(pattern, options) +} + +Minimatch.prototype.braceExpand = braceExpand + +function braceExpand (pattern, options) { + if (!options) { + if (this instanceof Minimatch) { + options = this.options + } else { + options = {} + } + } + + pattern = typeof pattern === 'undefined' + ? this.pattern : pattern + + assertValidPattern(pattern) + + // Thanks to Yeting Li for + // improving this regexp to avoid a ReDOS vulnerability. + if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) { + // shortcut. no need to expand. + return [pattern] + } + + return expand(pattern) +} + +var MAX_PATTERN_LENGTH = 1024 * 64 +var assertValidPattern = function (pattern) { + if (typeof pattern !== 'string') { + throw new TypeError('invalid pattern') + } + + if (pattern.length > MAX_PATTERN_LENGTH) { + throw new TypeError('pattern is too long') + } +} + +// parse a component of the expanded set. +// At this point, no pattern may contain "/" in it +// so we're going to return a 2d array, where each entry is the full +// pattern, split on '/', and then turned into a regular expression. +// A regexp is made at the end which joins each array with an +// escaped /, and another full one which joins each regexp with |. +// +// Following the lead of Bash 4.1, note that "**" only has special meaning +// when it is the *only* thing in a path portion. Otherwise, any series +// of * is equivalent to a single *. Globstar behavior is enabled by +// default, and can be disabled by setting options.noglobstar. +Minimatch.prototype.parse = parse +var SUBPARSE = {} +function parse (pattern, isSub) { + assertValidPattern(pattern) + + var options = this.options + + // shortcuts + if (pattern === '**') { + if (!options.noglobstar) + return GLOBSTAR + else + pattern = '*' + } + if (pattern === '') return '' + + var re = '' + var hasMagic = !!options.nocase + var escaping = false + // ? => one single character + var patternListStack = [] + var negativeLists = [] + var stateChar + var inClass = false + var reClassStart = -1 + var classStart = -1 + // . and .. never match anything that doesn't start with ., + // even when options.dot is set. + var patternStart = pattern.charAt(0) === '.' ? '' // anything + // not (start or / followed by . or .. followed by / or end) + : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))' + : '(?!\\.)' + var self = this + + function clearStateChar () { + if (stateChar) { + // we had some state-tracking character + // that wasn't consumed by this pass. + switch (stateChar) { + case '*': + re += star + hasMagic = true + break + case '?': + re += qmark + hasMagic = true + break + default: + re += '\\' + stateChar + break + } + self.debug('clearStateChar %j %j', stateChar, re) + stateChar = false + } + } + + for (var i = 0, len = pattern.length, c + ; (i < len) && (c = pattern.charAt(i)) + ; i++) { + this.debug('%s\t%s %s %j', pattern, i, re, c) + + // skip over any that are escaped. + if (escaping && reSpecials[c]) { + re += '\\' + c + escaping = false + continue + } + + switch (c) { + /* istanbul ignore next */ + case '/': { + // completely not allowed, even escaped. + // Should already be path-split by now. + return false + } + + case '\\': + clearStateChar() + escaping = true + continue + + // the various stateChar values + // for the "extglob" stuff. + case '?': + case '*': + case '+': + case '@': + case '!': + this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c) + + // all of those are literals inside a class, except that + // the glob [!a] means [^a] in regexp + if (inClass) { + this.debug(' in class') + if (c === '!' && i === classStart + 1) c = '^' + re += c + continue + } + + // if we already have a stateChar, then it means + // that there was something like ** or +? in there. + // Handle the stateChar, then proceed with this one. + self.debug('call clearStateChar %j', stateChar) + clearStateChar() + stateChar = c + // if extglob is disabled, then +(asdf|foo) isn't a thing. + // just clear the statechar *now*, rather than even diving into + // the patternList stuff. + if (options.noext) clearStateChar() + continue + + case '(': + if (inClass) { + re += '(' + continue + } + + if (!stateChar) { + re += '\\(' + continue + } + + patternListStack.push({ + type: stateChar, + start: i - 1, + reStart: re.length, + open: plTypes[stateChar].open, + close: plTypes[stateChar].close + }) + // negation is (?:(?!js)[^/]*) + re += stateChar === '!' ? '(?:(?!(?:' : '(?:' + this.debug('plType %j %j', stateChar, re) + stateChar = false + continue + + case ')': + if (inClass || !patternListStack.length) { + re += '\\)' + continue + } + + clearStateChar() + hasMagic = true + var pl = patternListStack.pop() + // negation is (?:(?!js)[^/]*) + // The others are (?:) + re += pl.close + if (pl.type === '!') { + negativeLists.push(pl) + } + pl.reEnd = re.length + continue + + case '|': + if (inClass || !patternListStack.length || escaping) { + re += '\\|' + escaping = false + continue + } + + clearStateChar() + re += '|' + continue + + // these are mostly the same in regexp and glob + case '[': + // swallow any state-tracking char before the [ + clearStateChar() + + if (inClass) { + re += '\\' + c + continue + } + + inClass = true + classStart = i + reClassStart = re.length + re += c + continue + + case ']': + // a right bracket shall lose its special + // meaning and represent itself in + // a bracket expression if it occurs + // first in the list. -- POSIX.2 2.8.3.2 + if (i === classStart + 1 || !inClass) { + re += '\\' + c + escaping = false + continue + } + + // handle the case where we left a class open. + // "[z-a]" is valid, equivalent to "\[z-a\]" + // split where the last [ was, make sure we don't have + // an invalid re. if so, re-walk the contents of the + // would-be class to re-translate any characters that + // were passed through as-is + // TODO: It would probably be faster to determine this + // without a try/catch and a new RegExp, but it's tricky + // to do safely. For now, this is safe and works. + var cs = pattern.substring(classStart + 1, i) + try { + RegExp('[' + cs + ']') + } catch (er) { + // not a valid class! + var sp = this.parse(cs, SUBPARSE) + re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]' + hasMagic = hasMagic || sp[1] + inClass = false + continue + } + + // finish up the class. + hasMagic = true + inClass = false + re += c + continue + + default: + // swallow any state char that wasn't consumed + clearStateChar() + + if (escaping) { + // no need + escaping = false + } else if (reSpecials[c] + && !(c === '^' && inClass)) { + re += '\\' + } + + re += c + + } // switch + } // for + + // handle the case where we left a class open. + // "[abc" is valid, equivalent to "\[abc" + if (inClass) { + // split where the last [ was, and escape it + // this is a huge pita. We now have to re-walk + // the contents of the would-be class to re-translate + // any characters that were passed through as-is + cs = pattern.substr(classStart + 1) + sp = this.parse(cs, SUBPARSE) + re = re.substr(0, reClassStart) + '\\[' + sp[0] + hasMagic = hasMagic || sp[1] + } + + // handle the case where we had a +( thing at the *end* + // of the pattern. + // each pattern list stack adds 3 chars, and we need to go through + // and escape any | chars that were passed through as-is for the regexp. + // Go through and escape them, taking care not to double-escape any + // | chars that were already escaped. + for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) { + var tail = re.slice(pl.reStart + pl.open.length) + this.debug('setting tail', re, pl) + // maybe some even number of \, then maybe 1 \, followed by a | + tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) { + if (!$2) { + // the | isn't already escaped, so escape it. + $2 = '\\' + } + + // need to escape all those slashes *again*, without escaping the + // one that we need for escaping the | character. As it works out, + // escaping an even number of slashes can be done by simply repeating + // it exactly after itself. That's why this trick works. + // + // I am sorry that you have to see this. + return $1 + $1 + $2 + '|' + }) + + this.debug('tail=%j\n %s', tail, tail, pl, re) + var t = pl.type === '*' ? star + : pl.type === '?' ? qmark + : '\\' + pl.type + + hasMagic = true + re = re.slice(0, pl.reStart) + t + '\\(' + tail + } + + // handle trailing things that only matter at the very end. + clearStateChar() + if (escaping) { + // trailing \\ + re += '\\\\' + } + + // only need to apply the nodot start if the re starts with + // something that could conceivably capture a dot + var addPatternStart = false + switch (re.charAt(0)) { + case '[': case '.': case '(': addPatternStart = true + } + + // Hack to work around lack of negative lookbehind in JS + // A pattern like: *.!(x).!(y|z) needs to ensure that a name + // like 'a.xyz.yz' doesn't match. So, the first negative + // lookahead, has to look ALL the way ahead, to the end of + // the pattern. + for (var n = negativeLists.length - 1; n > -1; n--) { + var nl = negativeLists[n] + + var nlBefore = re.slice(0, nl.reStart) + var nlFirst = re.slice(nl.reStart, nl.reEnd - 8) + var nlLast = re.slice(nl.reEnd - 8, nl.reEnd) + var nlAfter = re.slice(nl.reEnd) + + nlLast += nlAfter + + // Handle nested stuff like *(*.js|!(*.json)), where open parens + // mean that we should *not* include the ) in the bit that is considered + // "after" the negated section. + var openParensBefore = nlBefore.split('(').length - 1 + var cleanAfter = nlAfter + for (i = 0; i < openParensBefore; i++) { + cleanAfter = cleanAfter.replace(/\)[+*?]?/, '') + } + nlAfter = cleanAfter + + var dollar = '' + if (nlAfter === '' && isSub !== SUBPARSE) { + dollar = '$' + } + var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast + re = newRe + } + + // if the re is not "" at this point, then we need to make sure + // it doesn't match against an empty path part. + // Otherwise a/* will match a/, which it should not. + if (re !== '' && hasMagic) { + re = '(?=.)' + re + } + + if (addPatternStart) { + re = patternStart + re + } + + // parsing just a piece of a larger pattern. + if (isSub === SUBPARSE) { + return [re, hasMagic] + } + + // skip the regexp for non-magical patterns + // unescape anything in it, though, so that it'll be + // an exact match against a file etc. + if (!hasMagic) { + return globUnescape(pattern) + } + + var flags = options.nocase ? 'i' : '' + try { + var regExp = new RegExp('^' + re + '$', flags) + } catch (er) /* istanbul ignore next - should be impossible */ { + // If it was an invalid regular expression, then it can't match + // anything. This trick looks for a character after the end of + // the string, which is of course impossible, except in multi-line + // mode, but it's not a /m regex. + return new RegExp('$.') + } + + regExp._glob = pattern + regExp._src = re + + return regExp +} + +minimatch.makeRe = function (pattern, options) { + return new Minimatch(pattern, options || {}).makeRe() +} + +Minimatch.prototype.makeRe = makeRe +function makeRe () { + if (this.regexp || this.regexp === false) return this.regexp + + // at this point, this.set is a 2d array of partial + // pattern strings, or "**". + // + // It's better to use .match(). This function shouldn't + // be used, really, but it's pretty convenient sometimes, + // when you just want to work with a regex. + var set = this.set + + if (!set.length) { + this.regexp = false + return this.regexp + } + var options = this.options + + var twoStar = options.noglobstar ? star + : options.dot ? twoStarDot + : twoStarNoDot + var flags = options.nocase ? 'i' : '' + + var re = set.map(function (pattern) { + return pattern.map(function (p) { + return (p === GLOBSTAR) ? twoStar + : (typeof p === 'string') ? regExpEscape(p) + : p._src + }).join('\\\/') + }).join('|') + + // must match entire pattern + // ending in a * or ** will make it less strict. + re = '^(?:' + re + ')$' + + // can match anything, as long as it's not this. + if (this.negate) re = '^(?!' + re + ').*$' + + try { + this.regexp = new RegExp(re, flags) + } catch (ex) /* istanbul ignore next - should be impossible */ { + this.regexp = false + } + return this.regexp +} + +minimatch.match = function (list, pattern, options) { + options = options || {} + var mm = new Minimatch(pattern, options) + list = list.filter(function (f) { + return mm.match(f) + }) + if (mm.options.nonull && !list.length) { + list.push(pattern) + } + return list +} + +Minimatch.prototype.match = function match (f, partial) { + if (typeof partial === 'undefined') partial = this.partial + this.debug('match', f, this.pattern) + // short-circuit in the case of busted things. + // comments, etc. + if (this.comment) return false + if (this.empty) return f === '' + + if (f === '/' && partial) return true + + var options = this.options + + // windows: need to use /, not \ + if (path.sep !== '/') { + f = f.split(path.sep).join('/') + } + + // treat the test path as a set of pathparts. + f = f.split(slashSplit) + this.debug(this.pattern, 'split', f) + + // just ONE of the pattern sets in this.set needs to match + // in order for it to be valid. If negating, then just one + // match means that we have failed. + // Either way, return on the first hit. + + var set = this.set + this.debug(this.pattern, 'set', set) + + // Find the basename of the path by looking for the last non-empty segment + var filename + var i + for (i = f.length - 1; i >= 0; i--) { + filename = f[i] + if (filename) break + } + + for (i = 0; i < set.length; i++) { + var pattern = set[i] + var file = f + if (options.matchBase && pattern.length === 1) { + file = [filename] + } + var hit = this.matchOne(file, pattern, partial) + if (hit) { + if (options.flipNegate) return true + return !this.negate + } + } + + // didn't get any hits. this is success if it's a negative + // pattern, failure otherwise. + if (options.flipNegate) return false + return this.negate +} + +// set partial to true to test if, for example, +// "/a/b" matches the start of "/*/b/*/d" +// Partial means, if you run out of file before you run +// out of pattern, then that's fine, as long as all +// the parts match. +Minimatch.prototype.matchOne = function (file, pattern, partial) { + var options = this.options + + this.debug('matchOne', + { 'this': this, file: file, pattern: pattern }) + + this.debug('matchOne', file.length, pattern.length) + + for (var fi = 0, + pi = 0, + fl = file.length, + pl = pattern.length + ; (fi < fl) && (pi < pl) + ; fi++, pi++) { + this.debug('matchOne loop') + var p = pattern[pi] + var f = file[fi] + + this.debug(pattern, p, f) + + // should be impossible. + // some invalid regexp stuff in the set. + /* istanbul ignore if */ + if (p === false) return false + + if (p === GLOBSTAR) { + this.debug('GLOBSTAR', [pattern, p, f]) + + // "**" + // a/**/b/**/c would match the following: + // a/b/x/y/z/c + // a/x/y/z/b/c + // a/b/x/b/x/c + // a/b/c + // To do this, take the rest of the pattern after + // the **, and see if it would match the file remainder. + // If so, return success. + // If not, the ** "swallows" a segment, and try again. + // This is recursively awful. + // + // a/**/b/**/c matching a/b/x/y/z/c + // - a matches a + // - doublestar + // - matchOne(b/x/y/z/c, b/**/c) + // - b matches b + // - doublestar + // - matchOne(x/y/z/c, c) -> no + // - matchOne(y/z/c, c) -> no + // - matchOne(z/c, c) -> no + // - matchOne(c, c) yes, hit + var fr = fi + var pr = pi + 1 + if (pr === pl) { + this.debug('** at the end') + // a ** at the end will just swallow the rest. + // We have found a match. + // however, it will not swallow /.x, unless + // options.dot is set. + // . and .. are *never* matched by **, for explosively + // exponential reasons. + for (; fi < fl; fi++) { + if (file[fi] === '.' || file[fi] === '..' || + (!options.dot && file[fi].charAt(0) === '.')) return false + } + return true + } + + // ok, let's see if we can swallow whatever we can. + while (fr < fl) { + var swallowee = file[fr] + + this.debug('\nglobstar while', file, fr, pattern, pr, swallowee) + + // XXX remove this slice. Just pass the start index. + if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { + this.debug('globstar found match!', fr, fl, swallowee) + // found a match. + return true + } else { + // can't swallow "." or ".." ever. + // can only swallow ".foo" when explicitly asked. + if (swallowee === '.' || swallowee === '..' || + (!options.dot && swallowee.charAt(0) === '.')) { + this.debug('dot detected!', file, fr, pattern, pr) + break + } + + // ** swallows a segment, and continue. + this.debug('globstar swallow a segment, and continue') + fr++ + } + } + + // no match was found. + // However, in partial mode, we can't say this is necessarily over. + // If there's more *pattern* left, then + /* istanbul ignore if */ + if (partial) { + // ran out of file + this.debug('\n>>> no match, partial?', file, fr, pattern, pr) + if (fr === fl) return true + } + return false + } + + // something other than ** + // non-magic patterns just have to match exactly + // patterns with magic have been turned into regexps. + var hit + if (typeof p === 'string') { + hit = f === p + this.debug('string match', p, f, hit) + } else { + hit = f.match(p) + this.debug('pattern match', p, f, hit) + } + + if (!hit) return false + } + + // Note: ending in / means that we'll get a final "" + // at the end of the pattern. This can only match a + // corresponding "" at the end of the file. + // If the file ends in /, then it can only match a + // a pattern that ends in /, unless the pattern just + // doesn't have any more for it. But, a/b/ should *not* + // match "a/b/*", even though "" matches against the + // [^/]*? pattern, except in partial mode, where it might + // simply not be reached yet. + // However, a/b/ should still satisfy a/* + + // now either we fell off the end of the pattern, or we're done. + if (fi === fl && pi === pl) { + // ran out of pattern and filename at the same time. + // an exact hit! + return true + } else if (fi === fl) { + // ran out of file, but still had pattern left. + // this is ok if we're doing the match as part of + // a glob fs traversal. + return partial + } else /* istanbul ignore else */ if (pi === pl) { + // ran out of pattern, still have file left. + // this is only acceptable if we're on the very last + // empty segment of a file with a trailing slash. + // a/* should match a/b/ + return (fi === fl - 1) && (file[fi] === '') + } + + // should be unreachable. + /* istanbul ignore next */ + throw new Error('wtf?') +} + +// replace stuff like \* with * +function globUnescape (s) { + return s.replace(/\\(.)/g, '$1') +} + +function regExpEscape (s) { + return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') +} + + +/***/ }), +/* 258 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var concatMap = __webpack_require__(259); +var balanced = __webpack_require__(260); + +module.exports = expandTop; + +var escSlash = '\0SLASH'+Math.random()+'\0'; +var escOpen = '\0OPEN'+Math.random()+'\0'; +var escClose = '\0CLOSE'+Math.random()+'\0'; +var escComma = '\0COMMA'+Math.random()+'\0'; +var escPeriod = '\0PERIOD'+Math.random()+'\0'; + +function numeric(str) { + return parseInt(str, 10) == str + ? parseInt(str, 10) + : str.charCodeAt(0); +} + +function escapeBraces(str) { + return str.split('\\\\').join(escSlash) + .split('\\{').join(escOpen) + .split('\\}').join(escClose) + .split('\\,').join(escComma) + .split('\\.').join(escPeriod); +} + +function unescapeBraces(str) { + return str.split(escSlash).join('\\') + .split(escOpen).join('{') + .split(escClose).join('}') + .split(escComma).join(',') + .split(escPeriod).join('.'); +} + + +// Basically just str.split(","), but handling cases +// where we have nested braced sections, which should be +// treated as individual members, like {a,{b,c},d} +function parseCommaParts(str) { + if (!str) + return ['']; + + var parts = []; + var m = balanced('{', '}', str); + + if (!m) + return str.split(','); + + var pre = m.pre; + var body = m.body; + var post = m.post; + var p = pre.split(','); + + p[p.length-1] += '{' + body + '}'; + var postParts = parseCommaParts(post); + if (post.length) { + p[p.length-1] += postParts.shift(); + p.push.apply(p, postParts); + } + + parts.push.apply(parts, p); + + return parts; +} + +function expandTop(str) { + if (!str) + return []; + + // I don't know why Bash 4.3 does this, but it does. + // Anything starting with {} will have the first two bytes preserved + // but *only* at the top level, so {},a}b will not expand to anything, + // but a{},b}c will be expanded to [a}c,abc]. + // One could argue that this is a bug in Bash, but since the goal of + // this module is to match Bash's rules, we escape a leading {} + if (str.substr(0, 2) === '{}') { + str = '\\{\\}' + str.substr(2); + } + + return expand(escapeBraces(str), true).map(unescapeBraces); +} + +function identity(e) { + return e; +} + +function embrace(str) { + return '{' + str + '}'; +} +function isPadded(el) { + return /^-?0\d/.test(el); +} + +function lte(i, y) { + return i <= y; +} +function gte(i, y) { + return i >= y; +} + +function expand(str, isTop) { + var expansions = []; + + var m = balanced('{', '}', str); + if (!m || /\$$/.test(m.pre)) return [str]; + + var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); + var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); + var isSequence = isNumericSequence || isAlphaSequence; + var isOptions = m.body.indexOf(',') >= 0; + if (!isSequence && !isOptions) { + // {a},b} + if (m.post.match(/,.*\}/)) { + str = m.pre + '{' + m.body + escClose + m.post; + return expand(str); + } + return [str]; + } + + var n; + if (isSequence) { + n = m.body.split(/\.\./); + } else { + n = parseCommaParts(m.body); + if (n.length === 1) { + // x{{a,b}}y ==> x{a}y x{b}y + n = expand(n[0], false).map(embrace); + if (n.length === 1) { + var post = m.post.length + ? expand(m.post, false) + : ['']; + return post.map(function(p) { + return m.pre + n[0] + p; + }); + } + } + } + + // at this point, n is the parts, and we know it's not a comma set + // with a single entry. + + // no need to expand pre, since it is guaranteed to be free of brace-sets + var pre = m.pre; + var post = m.post.length + ? expand(m.post, false) + : ['']; + + var N; + + if (isSequence) { + var x = numeric(n[0]); + var y = numeric(n[1]); + var width = Math.max(n[0].length, n[1].length) + var incr = n.length == 3 + ? Math.abs(numeric(n[2])) + : 1; + var test = lte; + var reverse = y < x; + if (reverse) { + incr *= -1; + test = gte; + } + var pad = n.some(isPadded); + + N = []; + + for (var i = x; test(i, y); i += incr) { + var c; + if (isAlphaSequence) { + c = String.fromCharCode(i); + if (c === '\\') + c = ''; + } else { + c = String(i); + if (pad) { + var need = width - c.length; + if (need > 0) { + var z = new Array(need + 1).join('0'); + if (i < 0) + c = '-' + z + c.slice(1); + else + c = z + c; + } + } + } + N.push(c); + } + } else { + N = concatMap(n, function(el) { return expand(el, false) }); + } + + for (var j = 0; j < N.length; j++) { + for (var k = 0; k < post.length; k++) { + var expansion = pre + N[j] + post[k]; + if (!isTop || isSequence || expansion) + expansions.push(expansion); + } + } + + return expansions; +} + + + +/***/ }), +/* 259 */ +/***/ ((module) => { + +module.exports = function (xs, fn) { + var res = []; + for (var i = 0; i < xs.length; i++) { + var x = fn(xs[i], i); + if (isArray(x)) res.push.apply(res, x); + else res.push(x); + } + return res; +}; + +var isArray = Array.isArray || function (xs) { + return Object.prototype.toString.call(xs) === '[object Array]'; +}; + + +/***/ }), +/* 260 */ +/***/ ((module) => { + +"use strict"; + +module.exports = balanced; +function balanced(a, b, str) { + if (a instanceof RegExp) a = maybeMatch(a, str); + if (b instanceof RegExp) b = maybeMatch(b, str); + + var r = range(a, b, str); + + return r && { + start: r[0], + end: r[1], + pre: str.slice(0, r[0]), + body: str.slice(r[0] + a.length, r[1]), + post: str.slice(r[1] + b.length) + }; +} + +function maybeMatch(reg, str) { + var m = str.match(reg); + return m ? m[0] : null; +} + +balanced.range = range; +function range(a, b, str) { + var begs, beg, left, right, result; + var ai = str.indexOf(a); + var bi = str.indexOf(b, ai + 1); + var i = ai; + + if (ai >= 0 && bi > 0) { + if(a===b) { + return [ai, bi]; + } + begs = []; + left = str.length; + + while (i >= 0 && !result) { + if (i == ai) { + begs.push(i); + ai = str.indexOf(a, i + 1); + } else if (begs.length == 1) { + result = [ begs.pop(), bi ]; + } else { + beg = begs.pop(); + if (beg < left) { + left = beg; + right = bi; + } + + bi = str.indexOf(b, i + 1); + } + + i = ai < bi && ai >= 0 ? ai : bi; + } + + if (begs.length) { + result = [ left, right ]; + } + } + + return result; +} + + +/***/ }), +/* 261 */ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.WebviewService = void 0; +const fs_extra_1 = __webpack_require__(7); +const lodash_1 = __webpack_require__(262); +const url_1 = __webpack_require__(178); +const vscode = __importStar(__webpack_require__(1)); +const commons_1 = __importDefault(__webpack_require__(46)); +const localize_1 = __importDefault(__webpack_require__(47)); +const settingType_model_1 = __webpack_require__(263); +const state_1 = __webpack_require__(5); +const github_oauth_service_1 = __webpack_require__(264); +class WebviewService { + globalSettings = [ + { + name: (0, localize_1.default)("ext.globalConfig.token.name"), + placeholder: (0, localize_1.default)("ext.globalConfig.token.placeholder"), + type: settingType_model_1.UISettingType.TextInput, + correspondingSetting: "token" + }, + { + name: (0, localize_1.default)("ext.globalConfig.githubEnterpriseUrl.name"), + placeholder: (0, localize_1.default)("ext.globalConfig.githubEnterpriseUrl.placeholder"), + type: settingType_model_1.UISettingType.TextInput, + correspondingSetting: "githubEnterpriseUrl" + }, + { + name: (0, localize_1.default)("ext.globalConfig.ignoreUploadFolders.name"), + placeholder: (0, localize_1.default)("ext.globalConfig.ignoreUploadFolders.placeholder"), + type: settingType_model_1.UISettingType.TextArea, + correspondingSetting: "ignoreUploadFolders" + }, + { + name: (0, localize_1.default)("ext.globalConfig.ignoreExtensions.name"), + placeholder: (0, localize_1.default)("ext.globalConfig.ignoreExtensions.placeholder"), + type: settingType_model_1.UISettingType.TextArea, + correspondingSetting: "ignoreExtensions" + }, + { + name: (0, localize_1.default)("ext.globalConfig.hostName.name"), + placeholder: (0, localize_1.default)("ext.globalConfig.hostName.placeholder"), + type: settingType_model_1.UISettingType.TextInput, + correspondingSetting: "hostName" + }, + { + name: (0, localize_1.default)("ext.globalConfig.ignoreUploadFiles.name"), + placeholder: (0, localize_1.default)("ext.globalConfig.ignoreUploadFiles.placeholder"), + type: settingType_model_1.UISettingType.TextArea, + correspondingSetting: "ignoreUploadFiles" + }, + { + name: (0, localize_1.default)("ext.globalConfig.supportedFileExtensions.name"), + placeholder: (0, localize_1.default)("ext.globalConfig.supportedFileExtensions.placeholder"), + type: settingType_model_1.UISettingType.TextArea, + correspondingSetting: "supportedFileExtensions" + }, + { + name: (0, localize_1.default)("ext.globalConfig.gistDescription.name"), + placeholder: (0, localize_1.default)("ext.globalConfig.gistDescription.placeholder"), + type: settingType_model_1.UISettingType.TextInput, + correspondingSetting: "gistDescription" + }, + { + name: (0, localize_1.default)("ext.globalConfig.autoUploadDelay.name"), + placeholder: (0, localize_1.default)("ext.globalConfig.autoUploadDelay.placeholder"), + type: settingType_model_1.UISettingType.NumberInput, + correspondingSetting: "autoUploadDelay" + }, + { + name: (0, localize_1.default)("ext.globalConfig.askGistDescription.name"), + placeholder: "", + type: settingType_model_1.UISettingType.Checkbox, + correspondingSetting: "askGistDescription" + }, + { + name: (0, localize_1.default)("ext.globalConfig.downloadPublicGist.name"), + placeholder: "", + type: settingType_model_1.UISettingType.Checkbox, + correspondingSetting: "downloadPublicGist" + }, + { + name: (0, localize_1.default)("ext.globalConfig.openTokenLink.name"), + placeholder: "", + type: settingType_model_1.UISettingType.Checkbox, + correspondingSetting: "openTokenLink" + } + ]; + environmentSettings = [ + { + name: (0, localize_1.default)("ext.config.gist.name"), + placeholder: (0, localize_1.default)("ext.config.gist.placeholder"), + type: settingType_model_1.UISettingType.TextInput, + correspondingSetting: "gist", + tooltip: (0, localize_1.default)("ext.config.gist") + }, + { + name: (0, localize_1.default)("ext.config.autoDownload.name"), + placeholder: "", + type: settingType_model_1.UISettingType.Checkbox, + correspondingSetting: "autoDownload", + tooltip: (0, localize_1.default)("ext.config.autoDownload") + }, + { + name: (0, localize_1.default)("ext.config.autoUpload.name"), + placeholder: "", + type: settingType_model_1.UISettingType.Checkbox, + correspondingSetting: "autoUpload", + tooltip: (0, localize_1.default)("ext.config.autoUpload") + }, + { + name: (0, localize_1.default)("ext.config.forceDownload.name"), + placeholder: "", + type: settingType_model_1.UISettingType.Checkbox, + correspondingSetting: "forceDownload", + tooltip: (0, localize_1.default)("ext.config.forceDownload") + }, + { + name: (0, localize_1.default)("ext.config.forceUpload.name"), + placeholder: "", + type: settingType_model_1.UISettingType.Checkbox, + correspondingSetting: "forceUpload", + tooltip: (0, localize_1.default)("ext.config.forceUpload") + }, + { + name: (0, localize_1.default)("ext.config.quietSync.name"), + placeholder: "", + type: settingType_model_1.UISettingType.Checkbox, + correspondingSetting: "quietSync", + tooltip: (0, localize_1.default)("ext.config.quietSync") + }, + { + name: (0, localize_1.default)("ext.config.removeExtensions.name"), + placeholder: "", + type: settingType_model_1.UISettingType.Checkbox, + correspondingSetting: "removeExtensions", + tooltip: (0, localize_1.default)("ext.config.removeExtensions") + }, + { + name: (0, localize_1.default)("ext.config.syncExtensions.name"), + placeholder: "", + type: settingType_model_1.UISettingType.Checkbox, + correspondingSetting: "syncExtensions", + tooltip: (0, localize_1.default)("ext.config.syncExtensions") + } + ]; + webviews = [ + { + name: "landing-page", + htmlPath: "landing-page.html", + replaceables: [ + { + find: "@RELEASE_NOTES", + replace: "releaseNotes" + }, + { + find: "@CHECKED", + replace: "checked" + } + ] + }, + { + name: "settings", + htmlPath: "settings.html", + replaceables: [ + { + find: "@GLOBAL_DATA", + replace: "customSettings" + }, + { + find: "@ENV_DATA", + replace: "extSettings" + }, + { + find: "@GLOBAL_MAP", + replace: this.globalSettings + }, + { + find: "@ENV_MAP", + replace: this.environmentSettings + } + ] + }, + { + name: "gist-selection", + htmlPath: "gist-selection.html", + replaceables: [ + { + find: "@GISTS", + replace: "gists" + }, + { + find: "@SKIP", + replace: "skip" + } + ] + } + ]; + constructor() { + this.webviews = this.webviews.map(view => { + return { + ...view, + htmlContent: (0, fs_extra_1.readFileSync)(`${state_1.state.context.extensionPath}/ui/${view.name}/${view.htmlPath}`, "utf-8") + }; + }); + } + OpenSettingsPage(customSettings, extSettings) { + const webview = this.webviews[1]; + const content = this.GenerateContent({ + content: webview.htmlContent, + items: webview.replaceables, + customSettings, + extSettings + }); + if (webview.webview) { + webview.webview.webview.html = content; + webview.webview.reveal(); + return webview.webview; + } + const settingsPanel = vscode.window.createWebviewPanel("syncSettings", "Sync Settings", vscode.ViewColumn.One, { + retainContextWhenHidden: true, + enableScripts: true + }); + settingsPanel.webview.html = content; + settingsPanel.webview.onDidReceiveMessage(async (message) => { + if (message === "openGist") { + const [customConfig, extConfig] = await Promise.all([ + state_1.state.commons.GetCustomSettings(), + state_1.state.commons.GetSettings() + ]); + const host = customConfig.githubEnterpriseUrl + ? new url_1.URL(customConfig.githubEnterpriseUrl) + : new url_1.URL("https://github.com"); + const username = await new github_oauth_service_1.GitHubOAuthService(0).getUser(customConfig.token, host); + if (!username) { + return commons_1.default.LogException(null, "Sync: Invalid Access Token.", true); + } + vscode.env.openExternal(vscode.Uri.parse(`https://gist.${host.hostname}/${username}/${extConfig.gist}`)); + return; + } + this.ReceiveSettingChange(message, customSettings, extSettings); + }); + webview.webview = settingsPanel; + settingsPanel.onDidDispose(() => (webview.webview = null)); + return settingsPanel; + } + UpdateSettingsPage(customSettings, extSettings) { + const webview = this.webviews[1]; + if (webview.webview) { + webview.webview.webview.html = this.GenerateContent({ + content: webview.htmlContent, + items: webview.replaceables, + customSettings, + extSettings + }); + } + } + ReceiveSettingChange(message, customSettings, extSettings) { + let value = message.text; + if (message.text === "true" || message.text === "false") { + value = message.text === "true"; + } + if (message.type === "global") { + if ((0, lodash_1.has)(customSettings, message.command)) { + (0, lodash_1.set)(customSettings, message.command, value); + state_1.state.commons.SetCustomSettings(customSettings); + } + } + else { + extSettings[message.command] = value; + state_1.state.commons.SaveSettings(extSettings); + } + } + IsLandingPageEnabled() { + return !state_1.state.context.globalState.get("landingPage.dontShowThisAgain"); + } + OpenLandingPage(cmd) { + const webview = this.webviews[0]; + const releaseNotes = __webpack_require__(Object(function webpackMissingModule() { var e = new Error("Cannot find module '../../release-notes.json'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); + const content = this.GenerateContent({ + content: webview.htmlContent, + items: webview.replaceables, + releaseNotes, + checked: this.IsLandingPageEnabled() + }); + if (webview.webview) { + webview.webview.webview.html = content; + webview.webview.reveal(); + return webview.webview; + } + const landingPanel = vscode.window.createWebviewPanel("landingPage", "Welcome to Settings Sync", vscode.ViewColumn.One, { + retainContextWhenHidden: true, + enableScripts: true + }); + landingPanel.webview.onDidReceiveMessage(async (message) => { + switch (message.command) { + case "loginWithGitHub": + new github_oauth_service_1.GitHubOAuthService(54321).StartProcess(cmd); + const customSettings = await state_1.state.commons.GetCustomSettings(); + const host = customSettings.githubEnterpriseUrl + ? new url_1.URL(customSettings.githubEnterpriseUrl) + : new url_1.URL("https://github.com"); + vscode.commands.executeCommand("vscode.open", vscode.Uri.parse(`https://${host.hostname}/login/oauth/authorize?scope=gist%20read:user&client_id=cfd96460d8b110e2351b&redirect_uri=http://localhost:54321/callback`)); + break; + case "editConfiguration": + this.OpenSettingsPage(await state_1.state.commons.GetCustomSettings(), await state_1.state.commons.GetSettings()); + break; + case "downloadPublicGist": + const [extConfig, customConfig] = await Promise.all([ + state_1.state.commons.GetSettings(), + state_1.state.commons.GetCustomSettings() + ]); + const publicGist = await vscode.window.showInputBox({ + placeHolder: (0, localize_1.default)("common.placeholder.enterGistId"), + ignoreFocusOut: true + }); + if (!publicGist) { + break; + } + await state_1.state.commons.SetCustomSettings({ + ...customConfig, + downloadPublicGist: true + }); + await state_1.state.commons.SaveSettings({ + ...extConfig, + gist: publicGist + }); + vscode.window.showInformationMessage((0, localize_1.default)("cmd.otherOptions.warning.tokenNotRequire")); + vscode.commands.executeCommand("extension.downloadSettings"); + break; + case "dontShowThisAgain": + await state_1.state.context.globalState.update("landingPage.dontShowThisAgain", message.data); + break; + } + }); + landingPanel.webview.html = content; + webview.webview = landingPanel; + landingPanel.onDidDispose(() => (webview.webview = null)); + return landingPanel; + } + OpenGistSelectionpage(gists, cmd) { + const webview = this.webviews[2]; + const content = this.GenerateContent({ + content: webview.htmlContent, + items: webview.replaceables, + gists, + skip: cmd !== "extension.downloadSettings" + ? `Skip (new one will be created upon first upload)` + : "" + }); + if (webview.webview) { + webview.webview.webview.html = content; + webview.webview.reveal(); + return webview.webview; + } + const gistSelectionPanel = vscode.window.createWebviewPanel("selectGist", "Select Your Existing Gist", vscode.ViewColumn.One, { + retainContextWhenHidden: true, + enableScripts: true + }); + gistSelectionPanel.webview.html = content; + gistSelectionPanel.webview.onDidReceiveMessage(async (message) => { + if (!message.close) { + const extSettings = await state_1.state.commons.GetSettings(); + extSettings.gist = message.id; + state_1.state.commons.SaveSettings(extSettings); + } + else { + gistSelectionPanel.dispose(); + } + }); + webview.webview = gistSelectionPanel; + gistSelectionPanel.onDidDispose(() => { + webview.webview = null; + if (cmd) { + vscode.commands.executeCommand(cmd); + } + }); + return gistSelectionPanel; + } + GenerateContent(options) { + const toReplace = []; + options.items.forEach(option => { + if (typeof option.replace === "string") { + toReplace.push({ + ...option, + replace: JSON.stringify(options[option.replace]) + }); + } + else { + toReplace.push({ + find: option.find, + replace: JSON.stringify(option.replace) + }); + } + }); + return toReplace + .reduce((acc, cur) => acc.replace(new RegExp(cur.find, "g"), cur.replace), options.content) + .replace(new RegExp("@PWD", "g"), vscode.Uri.file(state_1.state.context.extensionPath) + .with({ + scheme: "vscode-resource" + }) + .toString()); + } +} +exports.WebviewService = WebviewService; + + +/***/ }), +/* 262 */ +/***/ (function(module, exports, __webpack_require__) { + +/* module decorator */ module = __webpack_require__.nmd(module); +var __WEBPACK_AMD_DEFINE_RESULT__;/** + * @license + * Lodash + * Copyright OpenJS Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */ +;(function() { + + /** Used as a safe reference for `undefined` in pre-ES5 environments. */ + var undefined; + + /** Used as the semantic version number. */ + var VERSION = '4.17.21'; + + /** Used as the size to enable large array optimizations. */ + var LARGE_ARRAY_SIZE = 200; + + /** Error message constants. */ + var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.', + FUNC_ERROR_TEXT = 'Expected a function', + INVALID_TEMPL_VAR_ERROR_TEXT = 'Invalid `variable` option passed into `_.template`'; + + /** Used to stand-in for `undefined` hash values. */ + var HASH_UNDEFINED = '__lodash_hash_undefined__'; + + /** Used as the maximum memoize cache size. */ + var MAX_MEMOIZE_SIZE = 500; + + /** Used as the internal argument placeholder. */ + var PLACEHOLDER = '__lodash_placeholder__'; + + /** Used to compose bitmasks for cloning. */ + var CLONE_DEEP_FLAG = 1, + CLONE_FLAT_FLAG = 2, + CLONE_SYMBOLS_FLAG = 4; + + /** Used to compose bitmasks for value comparisons. */ + var COMPARE_PARTIAL_FLAG = 1, + COMPARE_UNORDERED_FLAG = 2; + + /** Used to compose bitmasks for function metadata. */ + var WRAP_BIND_FLAG = 1, + WRAP_BIND_KEY_FLAG = 2, + WRAP_CURRY_BOUND_FLAG = 4, + WRAP_CURRY_FLAG = 8, + WRAP_CURRY_RIGHT_FLAG = 16, + WRAP_PARTIAL_FLAG = 32, + WRAP_PARTIAL_RIGHT_FLAG = 64, + WRAP_ARY_FLAG = 128, + WRAP_REARG_FLAG = 256, + WRAP_FLIP_FLAG = 512; + + /** Used as default options for `_.truncate`. */ + var DEFAULT_TRUNC_LENGTH = 30, + DEFAULT_TRUNC_OMISSION = '...'; + + /** Used to detect hot functions by number of calls within a span of milliseconds. */ + var HOT_COUNT = 800, + HOT_SPAN = 16; + + /** Used to indicate the type of lazy iteratees. */ + var LAZY_FILTER_FLAG = 1, + LAZY_MAP_FLAG = 2, + LAZY_WHILE_FLAG = 3; + + /** Used as references for various `Number` constants. */ + var INFINITY = 1 / 0, + MAX_SAFE_INTEGER = 9007199254740991, + MAX_INTEGER = 1.7976931348623157e+308, + NAN = 0 / 0; + + /** Used as references for the maximum length and index of an array. */ + var MAX_ARRAY_LENGTH = 4294967295, + MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1, + HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1; + + /** Used to associate wrap methods with their bit flags. */ + var wrapFlags = [ + ['ary', WRAP_ARY_FLAG], + ['bind', WRAP_BIND_FLAG], + ['bindKey', WRAP_BIND_KEY_FLAG], + ['curry', WRAP_CURRY_FLAG], + ['curryRight', WRAP_CURRY_RIGHT_FLAG], + ['flip', WRAP_FLIP_FLAG], + ['partial', WRAP_PARTIAL_FLAG], + ['partialRight', WRAP_PARTIAL_RIGHT_FLAG], + ['rearg', WRAP_REARG_FLAG] + ]; + + /** `Object#toString` result references. */ + var argsTag = '[object Arguments]', + arrayTag = '[object Array]', + asyncTag = '[object AsyncFunction]', + boolTag = '[object Boolean]', + dateTag = '[object Date]', + domExcTag = '[object DOMException]', + errorTag = '[object Error]', + funcTag = '[object Function]', + genTag = '[object GeneratorFunction]', + mapTag = '[object Map]', + numberTag = '[object Number]', + nullTag = '[object Null]', + objectTag = '[object Object]', + promiseTag = '[object Promise]', + proxyTag = '[object Proxy]', + regexpTag = '[object RegExp]', + setTag = '[object Set]', + stringTag = '[object String]', + symbolTag = '[object Symbol]', + undefinedTag = '[object Undefined]', + weakMapTag = '[object WeakMap]', + weakSetTag = '[object WeakSet]'; + + var arrayBufferTag = '[object ArrayBuffer]', + dataViewTag = '[object DataView]', + float32Tag = '[object Float32Array]', + float64Tag = '[object Float64Array]', + int8Tag = '[object Int8Array]', + int16Tag = '[object Int16Array]', + int32Tag = '[object Int32Array]', + uint8Tag = '[object Uint8Array]', + uint8ClampedTag = '[object Uint8ClampedArray]', + uint16Tag = '[object Uint16Array]', + uint32Tag = '[object Uint32Array]'; + + /** Used to match empty string literals in compiled template source. */ + var reEmptyStringLeading = /\b__p \+= '';/g, + reEmptyStringMiddle = /\b(__p \+=) '' \+/g, + reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g; + + /** Used to match HTML entities and HTML characters. */ + var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g, + reUnescapedHtml = /[&<>"']/g, + reHasEscapedHtml = RegExp(reEscapedHtml.source), + reHasUnescapedHtml = RegExp(reUnescapedHtml.source); + + /** Used to match template delimiters. */ + var reEscape = /<%-([\s\S]+?)%>/g, + reEvaluate = /<%([\s\S]+?)%>/g, + reInterpolate = /<%=([\s\S]+?)%>/g; + + /** Used to match property names within property paths. */ + var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, + reIsPlainProp = /^\w*$/, + rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; + + /** + * Used to match `RegExp` + * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). + */ + var reRegExpChar = /[\\^$.*+?()[\]{}|]/g, + reHasRegExpChar = RegExp(reRegExpChar.source); + + /** Used to match leading whitespace. */ + var reTrimStart = /^\s+/; + + /** Used to match a single whitespace character. */ + var reWhitespace = /\s/; + + /** Used to match wrap detail comments. */ + var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/, + reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/, + reSplitDetails = /,? & /; + + /** Used to match words composed of alphanumeric characters. */ + var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g; + + /** + * Used to validate the `validate` option in `_.template` variable. + * + * Forbids characters which could potentially change the meaning of the function argument definition: + * - "()," (modification of function parameters) + * - "=" (default value) + * - "[]{}" (destructuring of function parameters) + * - "/" (beginning of a comment) + * - whitespace + */ + var reForbiddenIdentifierChars = /[()=,{}\[\]\/\s]/; + + /** Used to match backslashes in property paths. */ + var reEscapeChar = /\\(\\)?/g; + + /** + * Used to match + * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components). + */ + var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g; + + /** Used to match `RegExp` flags from their coerced string values. */ + var reFlags = /\w*$/; + + /** Used to detect bad signed hexadecimal string values. */ + var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; + + /** Used to detect binary string values. */ + var reIsBinary = /^0b[01]+$/i; + + /** Used to detect host constructors (Safari). */ + var reIsHostCtor = /^\[object .+?Constructor\]$/; + + /** Used to detect octal string values. */ + var reIsOctal = /^0o[0-7]+$/i; + + /** Used to detect unsigned integer values. */ + var reIsUint = /^(?:0|[1-9]\d*)$/; + + /** Used to match Latin Unicode letters (excluding mathematical operators). */ + var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g; + + /** Used to ensure capturing order of template delimiters. */ + var reNoMatch = /($^)/; + + /** Used to match unescaped characters in compiled string literals. */ + var reUnescapedString = /['\n\r\u2028\u2029\\]/g; + + /** Used to compose unicode character classes. */ + var rsAstralRange = '\\ud800-\\udfff', + rsComboMarksRange = '\\u0300-\\u036f', + reComboHalfMarksRange = '\\ufe20-\\ufe2f', + rsComboSymbolsRange = '\\u20d0-\\u20ff', + rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, + rsDingbatRange = '\\u2700-\\u27bf', + rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff', + rsMathOpRange = '\\xac\\xb1\\xd7\\xf7', + rsNonCharRange = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf', + rsPunctuationRange = '\\u2000-\\u206f', + rsSpaceRange = ' \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000', + rsUpperRange = 'A-Z\\xc0-\\xd6\\xd8-\\xde', + rsVarRange = '\\ufe0e\\ufe0f', + rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange; + + /** Used to compose unicode capture groups. */ + var rsApos = "['\u2019]", + rsAstral = '[' + rsAstralRange + ']', + rsBreak = '[' + rsBreakRange + ']', + rsCombo = '[' + rsComboRange + ']', + rsDigits = '\\d+', + rsDingbat = '[' + rsDingbatRange + ']', + rsLower = '[' + rsLowerRange + ']', + rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']', + rsFitz = '\\ud83c[\\udffb-\\udfff]', + rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')', + rsNonAstral = '[^' + rsAstralRange + ']', + rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}', + rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]', + rsUpper = '[' + rsUpperRange + ']', + rsZWJ = '\\u200d'; + + /** Used to compose unicode regexes. */ + var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')', + rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')', + rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?', + rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?', + reOptMod = rsModifier + '?', + rsOptVar = '[' + rsVarRange + ']?', + rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*', + rsOrdLower = '\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])', + rsOrdUpper = '\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])', + rsSeq = rsOptVar + reOptMod + rsOptJoin, + rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq, + rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')'; + + /** Used to match apostrophes. */ + var reApos = RegExp(rsApos, 'g'); + + /** + * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and + * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols). + */ + var reComboMark = RegExp(rsCombo, 'g'); + + /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */ + var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g'); + + /** Used to match complex or compound words. */ + var reUnicodeWord = RegExp([ + rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')', + rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')', + rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower, + rsUpper + '+' + rsOptContrUpper, + rsOrdUpper, + rsOrdLower, + rsDigits, + rsEmoji + ].join('|'), 'g'); + + /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */ + var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']'); + + /** Used to detect strings that need a more robust regexp to match words. */ + var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/; + + /** Used to assign default `context` object properties. */ + var contextProps = [ + 'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array', + 'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object', + 'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array', + 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap', + '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout' + ]; + + /** Used to make template sourceURLs easier to identify. */ + var templateCounter = -1; + + /** Used to identify `toStringTag` values of typed arrays. */ + var typedArrayTags = {}; + typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = + typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = + typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = + typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = + typedArrayTags[uint32Tag] = true; + typedArrayTags[argsTag] = typedArrayTags[arrayTag] = + typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = + typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = + typedArrayTags[errorTag] = typedArrayTags[funcTag] = + typedArrayTags[mapTag] = typedArrayTags[numberTag] = + typedArrayTags[objectTag] = typedArrayTags[regexpTag] = + typedArrayTags[setTag] = typedArrayTags[stringTag] = + typedArrayTags[weakMapTag] = false; + + /** Used to identify `toStringTag` values supported by `_.clone`. */ + var cloneableTags = {}; + cloneableTags[argsTag] = cloneableTags[arrayTag] = + cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] = + cloneableTags[boolTag] = cloneableTags[dateTag] = + cloneableTags[float32Tag] = cloneableTags[float64Tag] = + cloneableTags[int8Tag] = cloneableTags[int16Tag] = + cloneableTags[int32Tag] = cloneableTags[mapTag] = + cloneableTags[numberTag] = cloneableTags[objectTag] = + cloneableTags[regexpTag] = cloneableTags[setTag] = + cloneableTags[stringTag] = cloneableTags[symbolTag] = + cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = + cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true; + cloneableTags[errorTag] = cloneableTags[funcTag] = + cloneableTags[weakMapTag] = false; + + /** Used to map Latin Unicode letters to basic Latin letters. */ + var deburredLetters = { + // Latin-1 Supplement block. + '\xc0': 'A', '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A', + '\xe0': 'a', '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a', + '\xc7': 'C', '\xe7': 'c', + '\xd0': 'D', '\xf0': 'd', + '\xc8': 'E', '\xc9': 'E', '\xca': 'E', '\xcb': 'E', + '\xe8': 'e', '\xe9': 'e', '\xea': 'e', '\xeb': 'e', + '\xcc': 'I', '\xcd': 'I', '\xce': 'I', '\xcf': 'I', + '\xec': 'i', '\xed': 'i', '\xee': 'i', '\xef': 'i', + '\xd1': 'N', '\xf1': 'n', + '\xd2': 'O', '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O', + '\xf2': 'o', '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o', + '\xd9': 'U', '\xda': 'U', '\xdb': 'U', '\xdc': 'U', + '\xf9': 'u', '\xfa': 'u', '\xfb': 'u', '\xfc': 'u', + '\xdd': 'Y', '\xfd': 'y', '\xff': 'y', + '\xc6': 'Ae', '\xe6': 'ae', + '\xde': 'Th', '\xfe': 'th', + '\xdf': 'ss', + // Latin Extended-A block. + '\u0100': 'A', '\u0102': 'A', '\u0104': 'A', + '\u0101': 'a', '\u0103': 'a', '\u0105': 'a', + '\u0106': 'C', '\u0108': 'C', '\u010a': 'C', '\u010c': 'C', + '\u0107': 'c', '\u0109': 'c', '\u010b': 'c', '\u010d': 'c', + '\u010e': 'D', '\u0110': 'D', '\u010f': 'd', '\u0111': 'd', + '\u0112': 'E', '\u0114': 'E', '\u0116': 'E', '\u0118': 'E', '\u011a': 'E', + '\u0113': 'e', '\u0115': 'e', '\u0117': 'e', '\u0119': 'e', '\u011b': 'e', + '\u011c': 'G', '\u011e': 'G', '\u0120': 'G', '\u0122': 'G', + '\u011d': 'g', '\u011f': 'g', '\u0121': 'g', '\u0123': 'g', + '\u0124': 'H', '\u0126': 'H', '\u0125': 'h', '\u0127': 'h', + '\u0128': 'I', '\u012a': 'I', '\u012c': 'I', '\u012e': 'I', '\u0130': 'I', + '\u0129': 'i', '\u012b': 'i', '\u012d': 'i', '\u012f': 'i', '\u0131': 'i', + '\u0134': 'J', '\u0135': 'j', + '\u0136': 'K', '\u0137': 'k', '\u0138': 'k', + '\u0139': 'L', '\u013b': 'L', '\u013d': 'L', '\u013f': 'L', '\u0141': 'L', + '\u013a': 'l', '\u013c': 'l', '\u013e': 'l', '\u0140': 'l', '\u0142': 'l', + '\u0143': 'N', '\u0145': 'N', '\u0147': 'N', '\u014a': 'N', + '\u0144': 'n', '\u0146': 'n', '\u0148': 'n', '\u014b': 'n', + '\u014c': 'O', '\u014e': 'O', '\u0150': 'O', + '\u014d': 'o', '\u014f': 'o', '\u0151': 'o', + '\u0154': 'R', '\u0156': 'R', '\u0158': 'R', + '\u0155': 'r', '\u0157': 'r', '\u0159': 'r', + '\u015a': 'S', '\u015c': 'S', '\u015e': 'S', '\u0160': 'S', + '\u015b': 's', '\u015d': 's', '\u015f': 's', '\u0161': 's', + '\u0162': 'T', '\u0164': 'T', '\u0166': 'T', + '\u0163': 't', '\u0165': 't', '\u0167': 't', + '\u0168': 'U', '\u016a': 'U', '\u016c': 'U', '\u016e': 'U', '\u0170': 'U', '\u0172': 'U', + '\u0169': 'u', '\u016b': 'u', '\u016d': 'u', '\u016f': 'u', '\u0171': 'u', '\u0173': 'u', + '\u0174': 'W', '\u0175': 'w', + '\u0176': 'Y', '\u0177': 'y', '\u0178': 'Y', + '\u0179': 'Z', '\u017b': 'Z', '\u017d': 'Z', + '\u017a': 'z', '\u017c': 'z', '\u017e': 'z', + '\u0132': 'IJ', '\u0133': 'ij', + '\u0152': 'Oe', '\u0153': 'oe', + '\u0149': "'n", '\u017f': 's' + }; + + /** Used to map characters to HTML entities. */ + var htmlEscapes = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' + }; + + /** Used to map HTML entities to characters. */ + var htmlUnescapes = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + ''': "'" + }; + + /** Used to escape characters for inclusion in compiled string literals. */ + var stringEscapes = { + '\\': '\\', + "'": "'", + '\n': 'n', + '\r': 'r', + '\u2028': 'u2028', + '\u2029': 'u2029' + }; + + /** Built-in method references without a dependency on `root`. */ + var freeParseFloat = parseFloat, + freeParseInt = parseInt; + + /** Detect free variable `global` from Node.js. */ + var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; + + /** Detect free variable `self`. */ + var freeSelf = typeof self == 'object' && self && self.Object === Object && self; + + /** Used as a reference to the global object. */ + var root = freeGlobal || freeSelf || Function('return this')(); + + /** Detect free variable `exports`. */ + var freeExports = true && exports && !exports.nodeType && exports; + + /** Detect free variable `module`. */ + var freeModule = freeExports && "object" == 'object' && module && !module.nodeType && module; + + /** Detect the popular CommonJS extension `module.exports`. */ + var moduleExports = freeModule && freeModule.exports === freeExports; + + /** Detect free variable `process` from Node.js. */ + var freeProcess = moduleExports && freeGlobal.process; + + /** Used to access faster Node.js helpers. */ + var nodeUtil = (function() { + try { + // Use `util.types` for Node.js 10+. + var types = freeModule && freeModule.require && freeModule.require('util').types; + + if (types) { + return types; + } + + // Legacy `process.binding('util')` for Node.js < 10. + return freeProcess && freeProcess.binding && freeProcess.binding('util'); + } catch (e) {} + }()); + + /* Node.js helper references. */ + var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer, + nodeIsDate = nodeUtil && nodeUtil.isDate, + nodeIsMap = nodeUtil && nodeUtil.isMap, + nodeIsRegExp = nodeUtil && nodeUtil.isRegExp, + nodeIsSet = nodeUtil && nodeUtil.isSet, + nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray; + + /*--------------------------------------------------------------------------*/ + + /** + * A faster alternative to `Function#apply`, this function invokes `func` + * with the `this` binding of `thisArg` and the arguments of `args`. + * + * @private + * @param {Function} func The function to invoke. + * @param {*} thisArg The `this` binding of `func`. + * @param {Array} args The arguments to invoke `func` with. + * @returns {*} Returns the result of `func`. + */ + function apply(func, thisArg, args) { + switch (args.length) { + case 0: return func.call(thisArg); + case 1: return func.call(thisArg, args[0]); + case 2: return func.call(thisArg, args[0], args[1]); + case 3: return func.call(thisArg, args[0], args[1], args[2]); + } + return func.apply(thisArg, args); + } + + /** + * A specialized version of `baseAggregator` for arrays. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} setter The function to set `accumulator` values. + * @param {Function} iteratee The iteratee to transform keys. + * @param {Object} accumulator The initial aggregated object. + * @returns {Function} Returns `accumulator`. + */ + function arrayAggregator(array, setter, iteratee, accumulator) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + var value = array[index]; + setter(accumulator, value, iteratee(value), array); + } + return accumulator; + } + + /** + * A specialized version of `_.forEach` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns `array`. + */ + function arrayEach(array, iteratee) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + if (iteratee(array[index], index, array) === false) { + break; + } + } + return array; + } + + /** + * A specialized version of `_.forEachRight` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns `array`. + */ + function arrayEachRight(array, iteratee) { + var length = array == null ? 0 : array.length; + + while (length--) { + if (iteratee(array[length], length, array) === false) { + break; + } + } + return array; + } + + /** + * A specialized version of `_.every` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false`. + */ + function arrayEvery(array, predicate) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + if (!predicate(array[index], index, array)) { + return false; + } + } + return true; + } + + /** + * A specialized version of `_.filter` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + */ + function arrayFilter(array, predicate) { + var index = -1, + length = array == null ? 0 : array.length, + resIndex = 0, + result = []; + + while (++index < length) { + var value = array[index]; + if (predicate(value, index, array)) { + result[resIndex++] = value; + } + } + return result; + } + + /** + * A specialized version of `_.includes` for arrays without support for + * specifying an index to search from. + * + * @private + * @param {Array} [array] The array to inspect. + * @param {*} target The value to search for. + * @returns {boolean} Returns `true` if `target` is found, else `false`. + */ + function arrayIncludes(array, value) { + var length = array == null ? 0 : array.length; + return !!length && baseIndexOf(array, value, 0) > -1; + } + + /** + * This function is like `arrayIncludes` except that it accepts a comparator. + * + * @private + * @param {Array} [array] The array to inspect. + * @param {*} target The value to search for. + * @param {Function} comparator The comparator invoked per element. + * @returns {boolean} Returns `true` if `target` is found, else `false`. + */ + function arrayIncludesWith(array, value, comparator) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + if (comparator(value, array[index])) { + return true; + } + } + return false; + } + + /** + * A specialized version of `_.map` for arrays without support for iteratee + * shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + */ + function arrayMap(array, iteratee) { + var index = -1, + length = array == null ? 0 : array.length, + result = Array(length); + + while (++index < length) { + result[index] = iteratee(array[index], index, array); + } + return result; + } + + /** + * Appends the elements of `values` to `array`. + * + * @private + * @param {Array} array The array to modify. + * @param {Array} values The values to append. + * @returns {Array} Returns `array`. + */ + function arrayPush(array, values) { + var index = -1, + length = values.length, + offset = array.length; + + while (++index < length) { + array[offset + index] = values[index]; + } + return array; + } + + /** + * A specialized version of `_.reduce` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @param {boolean} [initAccum] Specify using the first element of `array` as + * the initial value. + * @returns {*} Returns the accumulated value. + */ + function arrayReduce(array, iteratee, accumulator, initAccum) { + var index = -1, + length = array == null ? 0 : array.length; + + if (initAccum && length) { + accumulator = array[++index]; + } + while (++index < length) { + accumulator = iteratee(accumulator, array[index], index, array); + } + return accumulator; + } + + /** + * A specialized version of `_.reduceRight` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @param {boolean} [initAccum] Specify using the last element of `array` as + * the initial value. + * @returns {*} Returns the accumulated value. + */ + function arrayReduceRight(array, iteratee, accumulator, initAccum) { + var length = array == null ? 0 : array.length; + if (initAccum && length) { + accumulator = array[--length]; + } + while (length--) { + accumulator = iteratee(accumulator, array[length], length, array); + } + return accumulator; + } + + /** + * A specialized version of `_.some` for arrays without support for iteratee + * shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + */ + function arraySome(array, predicate) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + if (predicate(array[index], index, array)) { + return true; + } + } + return false; + } + + /** + * Gets the size of an ASCII `string`. + * + * @private + * @param {string} string The string inspect. + * @returns {number} Returns the string size. + */ + var asciiSize = baseProperty('length'); + + /** + * Converts an ASCII `string` to an array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the converted array. + */ + function asciiToArray(string) { + return string.split(''); + } + + /** + * Splits an ASCII `string` into an array of its words. + * + * @private + * @param {string} The string to inspect. + * @returns {Array} Returns the words of `string`. + */ + function asciiWords(string) { + return string.match(reAsciiWord) || []; + } + + /** + * The base implementation of methods like `_.findKey` and `_.findLastKey`, + * without support for iteratee shorthands, which iterates over `collection` + * using `eachFunc`. + * + * @private + * @param {Array|Object} collection The collection to inspect. + * @param {Function} predicate The function invoked per iteration. + * @param {Function} eachFunc The function to iterate over `collection`. + * @returns {*} Returns the found element or its key, else `undefined`. + */ + function baseFindKey(collection, predicate, eachFunc) { + var result; + eachFunc(collection, function(value, key, collection) { + if (predicate(value, key, collection)) { + result = key; + return false; + } + }); + return result; + } + + /** + * The base implementation of `_.findIndex` and `_.findLastIndex` without + * support for iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Function} predicate The function invoked per iteration. + * @param {number} fromIndex The index to search from. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function baseFindIndex(array, predicate, fromIndex, fromRight) { + var length = array.length, + index = fromIndex + (fromRight ? 1 : -1); + + while ((fromRight ? index-- : ++index < length)) { + if (predicate(array[index], index, array)) { + return index; + } + } + return -1; + } + + /** + * The base implementation of `_.indexOf` without `fromIndex` bounds checks. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function baseIndexOf(array, value, fromIndex) { + return value === value + ? strictIndexOf(array, value, fromIndex) + : baseFindIndex(array, baseIsNaN, fromIndex); + } + + /** + * This function is like `baseIndexOf` except that it accepts a comparator. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @param {Function} comparator The comparator invoked per element. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function baseIndexOfWith(array, value, fromIndex, comparator) { + var index = fromIndex - 1, + length = array.length; + + while (++index < length) { + if (comparator(array[index], value)) { + return index; + } + } + return -1; + } + + /** + * The base implementation of `_.isNaN` without support for number objects. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. + */ + function baseIsNaN(value) { + return value !== value; + } + + /** + * The base implementation of `_.mean` and `_.meanBy` without support for + * iteratee shorthands. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {number} Returns the mean. + */ + function baseMean(array, iteratee) { + var length = array == null ? 0 : array.length; + return length ? (baseSum(array, iteratee) / length) : NAN; + } + + /** + * The base implementation of `_.property` without support for deep paths. + * + * @private + * @param {string} key The key of the property to get. + * @returns {Function} Returns the new accessor function. + */ + function baseProperty(key) { + return function(object) { + return object == null ? undefined : object[key]; + }; + } + + /** + * The base implementation of `_.propertyOf` without support for deep paths. + * + * @private + * @param {Object} object The object to query. + * @returns {Function} Returns the new accessor function. + */ + function basePropertyOf(object) { + return function(key) { + return object == null ? undefined : object[key]; + }; + } + + /** + * The base implementation of `_.reduce` and `_.reduceRight`, without support + * for iteratee shorthands, which iterates over `collection` using `eachFunc`. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {*} accumulator The initial value. + * @param {boolean} initAccum Specify using the first or last element of + * `collection` as the initial value. + * @param {Function} eachFunc The function to iterate over `collection`. + * @returns {*} Returns the accumulated value. + */ + function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) { + eachFunc(collection, function(value, index, collection) { + accumulator = initAccum + ? (initAccum = false, value) + : iteratee(accumulator, value, index, collection); + }); + return accumulator; + } + + /** + * The base implementation of `_.sortBy` which uses `comparer` to define the + * sort order of `array` and replaces criteria objects with their corresponding + * values. + * + * @private + * @param {Array} array The array to sort. + * @param {Function} comparer The function to define sort order. + * @returns {Array} Returns `array`. + */ + function baseSortBy(array, comparer) { + var length = array.length; + + array.sort(comparer); + while (length--) { + array[length] = array[length].value; + } + return array; + } + + /** + * The base implementation of `_.sum` and `_.sumBy` without support for + * iteratee shorthands. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {number} Returns the sum. + */ + function baseSum(array, iteratee) { + var result, + index = -1, + length = array.length; + + while (++index < length) { + var current = iteratee(array[index]); + if (current !== undefined) { + result = result === undefined ? current : (result + current); + } + } + return result; + } + + /** + * The base implementation of `_.times` without support for iteratee shorthands + * or max array length checks. + * + * @private + * @param {number} n The number of times to invoke `iteratee`. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the array of results. + */ + function baseTimes(n, iteratee) { + var index = -1, + result = Array(n); + + while (++index < n) { + result[index] = iteratee(index); + } + return result; + } + + /** + * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array + * of key-value pairs for `object` corresponding to the property names of `props`. + * + * @private + * @param {Object} object The object to query. + * @param {Array} props The property names to get values for. + * @returns {Object} Returns the key-value pairs. + */ + function baseToPairs(object, props) { + return arrayMap(props, function(key) { + return [key, object[key]]; + }); + } + + /** + * The base implementation of `_.trim`. + * + * @private + * @param {string} string The string to trim. + * @returns {string} Returns the trimmed string. + */ + function baseTrim(string) { + return string + ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '') + : string; + } + + /** + * The base implementation of `_.unary` without support for storing metadata. + * + * @private + * @param {Function} func The function to cap arguments for. + * @returns {Function} Returns the new capped function. + */ + function baseUnary(func) { + return function(value) { + return func(value); + }; + } + + /** + * The base implementation of `_.values` and `_.valuesIn` which creates an + * array of `object` property values corresponding to the property names + * of `props`. + * + * @private + * @param {Object} object The object to query. + * @param {Array} props The property names to get values for. + * @returns {Object} Returns the array of property values. + */ + function baseValues(object, props) { + return arrayMap(props, function(key) { + return object[key]; + }); + } + + /** + * Checks if a `cache` value for `key` exists. + * + * @private + * @param {Object} cache The cache to query. + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function cacheHas(cache, key) { + return cache.has(key); + } + + /** + * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol + * that is not found in the character symbols. + * + * @private + * @param {Array} strSymbols The string symbols to inspect. + * @param {Array} chrSymbols The character symbols to find. + * @returns {number} Returns the index of the first unmatched string symbol. + */ + function charsStartIndex(strSymbols, chrSymbols) { + var index = -1, + length = strSymbols.length; + + while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {} + return index; + } + + /** + * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol + * that is not found in the character symbols. + * + * @private + * @param {Array} strSymbols The string symbols to inspect. + * @param {Array} chrSymbols The character symbols to find. + * @returns {number} Returns the index of the last unmatched string symbol. + */ + function charsEndIndex(strSymbols, chrSymbols) { + var index = strSymbols.length; + + while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {} + return index; + } + + /** + * Gets the number of `placeholder` occurrences in `array`. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} placeholder The placeholder to search for. + * @returns {number} Returns the placeholder count. + */ + function countHolders(array, placeholder) { + var length = array.length, + result = 0; + + while (length--) { + if (array[length] === placeholder) { + ++result; + } + } + return result; + } + + /** + * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A + * letters to basic Latin letters. + * + * @private + * @param {string} letter The matched letter to deburr. + * @returns {string} Returns the deburred letter. + */ + var deburrLetter = basePropertyOf(deburredLetters); + + /** + * Used by `_.escape` to convert characters to HTML entities. + * + * @private + * @param {string} chr The matched character to escape. + * @returns {string} Returns the escaped character. + */ + var escapeHtmlChar = basePropertyOf(htmlEscapes); + + /** + * Used by `_.template` to escape characters for inclusion in compiled string literals. + * + * @private + * @param {string} chr The matched character to escape. + * @returns {string} Returns the escaped character. + */ + function escapeStringChar(chr) { + return '\\' + stringEscapes[chr]; + } + + /** + * Gets the value at `key` of `object`. + * + * @private + * @param {Object} [object] The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ + function getValue(object, key) { + return object == null ? undefined : object[key]; + } + + /** + * Checks if `string` contains Unicode symbols. + * + * @private + * @param {string} string The string to inspect. + * @returns {boolean} Returns `true` if a symbol is found, else `false`. + */ + function hasUnicode(string) { + return reHasUnicode.test(string); + } + + /** + * Checks if `string` contains a word composed of Unicode symbols. + * + * @private + * @param {string} string The string to inspect. + * @returns {boolean} Returns `true` if a word is found, else `false`. + */ + function hasUnicodeWord(string) { + return reHasUnicodeWord.test(string); + } + + /** + * Converts `iterator` to an array. + * + * @private + * @param {Object} iterator The iterator to convert. + * @returns {Array} Returns the converted array. + */ + function iteratorToArray(iterator) { + var data, + result = []; + + while (!(data = iterator.next()).done) { + result.push(data.value); + } + return result; + } + + /** + * Converts `map` to its key-value pairs. + * + * @private + * @param {Object} map The map to convert. + * @returns {Array} Returns the key-value pairs. + */ + function mapToArray(map) { + var index = -1, + result = Array(map.size); + + map.forEach(function(value, key) { + result[++index] = [key, value]; + }); + return result; + } + + /** + * Creates a unary function that invokes `func` with its argument transformed. + * + * @private + * @param {Function} func The function to wrap. + * @param {Function} transform The argument transform. + * @returns {Function} Returns the new function. + */ + function overArg(func, transform) { + return function(arg) { + return func(transform(arg)); + }; + } + + /** + * Replaces all `placeholder` elements in `array` with an internal placeholder + * and returns an array of their indexes. + * + * @private + * @param {Array} array The array to modify. + * @param {*} placeholder The placeholder to replace. + * @returns {Array} Returns the new array of placeholder indexes. + */ + function replaceHolders(array, placeholder) { + var index = -1, + length = array.length, + resIndex = 0, + result = []; + + while (++index < length) { + var value = array[index]; + if (value === placeholder || value === PLACEHOLDER) { + array[index] = PLACEHOLDER; + result[resIndex++] = index; + } + } + return result; + } + + /** + * Converts `set` to an array of its values. + * + * @private + * @param {Object} set The set to convert. + * @returns {Array} Returns the values. + */ + function setToArray(set) { + var index = -1, + result = Array(set.size); + + set.forEach(function(value) { + result[++index] = value; + }); + return result; + } + + /** + * Converts `set` to its value-value pairs. + * + * @private + * @param {Object} set The set to convert. + * @returns {Array} Returns the value-value pairs. + */ + function setToPairs(set) { + var index = -1, + result = Array(set.size); + + set.forEach(function(value) { + result[++index] = [value, value]; + }); + return result; + } + + /** + * A specialized version of `_.indexOf` which performs strict equality + * comparisons of values, i.e. `===`. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function strictIndexOf(array, value, fromIndex) { + var index = fromIndex - 1, + length = array.length; + + while (++index < length) { + if (array[index] === value) { + return index; + } + } + return -1; + } + + /** + * A specialized version of `_.lastIndexOf` which performs strict equality + * comparisons of values, i.e. `===`. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function strictLastIndexOf(array, value, fromIndex) { + var index = fromIndex + 1; + while (index--) { + if (array[index] === value) { + return index; + } + } + return index; + } + + /** + * Gets the number of symbols in `string`. + * + * @private + * @param {string} string The string to inspect. + * @returns {number} Returns the string size. + */ + function stringSize(string) { + return hasUnicode(string) + ? unicodeSize(string) + : asciiSize(string); + } + + /** + * Converts `string` to an array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the converted array. + */ + function stringToArray(string) { + return hasUnicode(string) + ? unicodeToArray(string) + : asciiToArray(string); + } + + /** + * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace + * character of `string`. + * + * @private + * @param {string} string The string to inspect. + * @returns {number} Returns the index of the last non-whitespace character. + */ + function trimmedEndIndex(string) { + var index = string.length; + + while (index-- && reWhitespace.test(string.charAt(index))) {} + return index; + } + + /** + * Used by `_.unescape` to convert HTML entities to characters. + * + * @private + * @param {string} chr The matched character to unescape. + * @returns {string} Returns the unescaped character. + */ + var unescapeHtmlChar = basePropertyOf(htmlUnescapes); + + /** + * Gets the size of a Unicode `string`. + * + * @private + * @param {string} string The string inspect. + * @returns {number} Returns the string size. + */ + function unicodeSize(string) { + var result = reUnicode.lastIndex = 0; + while (reUnicode.test(string)) { + ++result; + } + return result; + } + + /** + * Converts a Unicode `string` to an array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the converted array. + */ + function unicodeToArray(string) { + return string.match(reUnicode) || []; + } + + /** + * Splits a Unicode `string` into an array of its words. + * + * @private + * @param {string} The string to inspect. + * @returns {Array} Returns the words of `string`. + */ + function unicodeWords(string) { + return string.match(reUnicodeWord) || []; + } + + /*--------------------------------------------------------------------------*/ + + /** + * Create a new pristine `lodash` function using the `context` object. + * + * @static + * @memberOf _ + * @since 1.1.0 + * @category Util + * @param {Object} [context=root] The context object. + * @returns {Function} Returns a new `lodash` function. + * @example + * + * _.mixin({ 'foo': _.constant('foo') }); + * + * var lodash = _.runInContext(); + * lodash.mixin({ 'bar': lodash.constant('bar') }); + * + * _.isFunction(_.foo); + * // => true + * _.isFunction(_.bar); + * // => false + * + * lodash.isFunction(lodash.foo); + * // => false + * lodash.isFunction(lodash.bar); + * // => true + * + * // Create a suped-up `defer` in Node.js. + * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer; + */ + var runInContext = (function runInContext(context) { + context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps)); + + /** Built-in constructor references. */ + var Array = context.Array, + Date = context.Date, + Error = context.Error, + Function = context.Function, + Math = context.Math, + Object = context.Object, + RegExp = context.RegExp, + String = context.String, + TypeError = context.TypeError; + + /** Used for built-in method references. */ + var arrayProto = Array.prototype, + funcProto = Function.prototype, + objectProto = Object.prototype; + + /** Used to detect overreaching core-js shims. */ + var coreJsData = context['__core-js_shared__']; + + /** Used to resolve the decompiled source of functions. */ + var funcToString = funcProto.toString; + + /** Used to check objects for own properties. */ + var hasOwnProperty = objectProto.hasOwnProperty; + + /** Used to generate unique IDs. */ + var idCounter = 0; + + /** Used to detect methods masquerading as native. */ + var maskSrcKey = (function() { + var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); + return uid ? ('Symbol(src)_1.' + uid) : ''; + }()); + + /** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ + var nativeObjectToString = objectProto.toString; + + /** Used to infer the `Object` constructor. */ + var objectCtorString = funcToString.call(Object); + + /** Used to restore the original `_` reference in `_.noConflict`. */ + var oldDash = root._; + + /** Used to detect if a method is native. */ + var reIsNative = RegExp('^' + + funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' + ); + + /** Built-in value references. */ + var Buffer = moduleExports ? context.Buffer : undefined, + Symbol = context.Symbol, + Uint8Array = context.Uint8Array, + allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined, + getPrototype = overArg(Object.getPrototypeOf, Object), + objectCreate = Object.create, + propertyIsEnumerable = objectProto.propertyIsEnumerable, + splice = arrayProto.splice, + spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined, + symIterator = Symbol ? Symbol.iterator : undefined, + symToStringTag = Symbol ? Symbol.toStringTag : undefined; + + var defineProperty = (function() { + try { + var func = getNative(Object, 'defineProperty'); + func({}, '', {}); + return func; + } catch (e) {} + }()); + + /** Mocked built-ins. */ + var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout, + ctxNow = Date && Date.now !== root.Date.now && Date.now, + ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout; + + /* Built-in method references for those with the same name as other `lodash` methods. */ + var nativeCeil = Math.ceil, + nativeFloor = Math.floor, + nativeGetSymbols = Object.getOwnPropertySymbols, + nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined, + nativeIsFinite = context.isFinite, + nativeJoin = arrayProto.join, + nativeKeys = overArg(Object.keys, Object), + nativeMax = Math.max, + nativeMin = Math.min, + nativeNow = Date.now, + nativeParseInt = context.parseInt, + nativeRandom = Math.random, + nativeReverse = arrayProto.reverse; + + /* Built-in method references that are verified to be native. */ + var DataView = getNative(context, 'DataView'), + Map = getNative(context, 'Map'), + Promise = getNative(context, 'Promise'), + Set = getNative(context, 'Set'), + WeakMap = getNative(context, 'WeakMap'), + nativeCreate = getNative(Object, 'create'); + + /** Used to store function metadata. */ + var metaMap = WeakMap && new WeakMap; + + /** Used to lookup unminified function names. */ + var realNames = {}; + + /** Used to detect maps, sets, and weakmaps. */ + var dataViewCtorString = toSource(DataView), + mapCtorString = toSource(Map), + promiseCtorString = toSource(Promise), + setCtorString = toSource(Set), + weakMapCtorString = toSource(WeakMap); + + /** Used to convert symbols to primitives and strings. */ + var symbolProto = Symbol ? Symbol.prototype : undefined, + symbolValueOf = symbolProto ? symbolProto.valueOf : undefined, + symbolToString = symbolProto ? symbolProto.toString : undefined; + + /*------------------------------------------------------------------------*/ + + /** + * Creates a `lodash` object which wraps `value` to enable implicit method + * chain sequences. Methods that operate on and return arrays, collections, + * and functions can be chained together. Methods that retrieve a single value + * or may return a primitive value will automatically end the chain sequence + * and return the unwrapped value. Otherwise, the value must be unwrapped + * with `_#value`. + * + * Explicit chain sequences, which must be unwrapped with `_#value`, may be + * enabled using `_.chain`. + * + * The execution of chained methods is lazy, that is, it's deferred until + * `_#value` is implicitly or explicitly called. + * + * Lazy evaluation allows several methods to support shortcut fusion. + * Shortcut fusion is an optimization to merge iteratee calls; this avoids + * the creation of intermediate arrays and can greatly reduce the number of + * iteratee executions. Sections of a chain sequence qualify for shortcut + * fusion if the section is applied to an array and iteratees accept only + * one argument. The heuristic for whether a section qualifies for shortcut + * fusion is subject to change. + * + * Chaining is supported in custom builds as long as the `_#value` method is + * directly or indirectly included in the build. + * + * In addition to lodash methods, wrappers have `Array` and `String` methods. + * + * The wrapper `Array` methods are: + * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift` + * + * The wrapper `String` methods are: + * `replace` and `split` + * + * The wrapper methods that support shortcut fusion are: + * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`, + * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`, + * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray` + * + * The chainable wrapper methods are: + * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`, + * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`, + * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`, + * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`, + * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`, + * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`, + * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`, + * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`, + * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`, + * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`, + * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`, + * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`, + * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`, + * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`, + * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`, + * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`, + * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`, + * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`, + * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`, + * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`, + * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`, + * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`, + * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`, + * `zipObject`, `zipObjectDeep`, and `zipWith` + * + * The wrapper methods that are **not** chainable by default are: + * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`, + * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`, + * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`, + * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`, + * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`, + * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`, + * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`, + * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`, + * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`, + * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`, + * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`, + * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`, + * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`, + * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`, + * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`, + * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`, + * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`, + * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`, + * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`, + * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`, + * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`, + * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`, + * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`, + * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`, + * `upperFirst`, `value`, and `words` + * + * @name _ + * @constructor + * @category Seq + * @param {*} value The value to wrap in a `lodash` instance. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * function square(n) { + * return n * n; + * } + * + * var wrapped = _([1, 2, 3]); + * + * // Returns an unwrapped value. + * wrapped.reduce(_.add); + * // => 6 + * + * // Returns a wrapped value. + * var squares = wrapped.map(square); + * + * _.isArray(squares); + * // => false + * + * _.isArray(squares.value()); + * // => true + */ + function lodash(value) { + if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) { + if (value instanceof LodashWrapper) { + return value; + } + if (hasOwnProperty.call(value, '__wrapped__')) { + return wrapperClone(value); + } + } + return new LodashWrapper(value); + } + + /** + * The base implementation of `_.create` without support for assigning + * properties to the created object. + * + * @private + * @param {Object} proto The object to inherit from. + * @returns {Object} Returns the new object. + */ + var baseCreate = (function() { + function object() {} + return function(proto) { + if (!isObject(proto)) { + return {}; + } + if (objectCreate) { + return objectCreate(proto); + } + object.prototype = proto; + var result = new object; + object.prototype = undefined; + return result; + }; + }()); + + /** + * The function whose prototype chain sequence wrappers inherit from. + * + * @private + */ + function baseLodash() { + // No operation performed. + } + + /** + * The base constructor for creating `lodash` wrapper objects. + * + * @private + * @param {*} value The value to wrap. + * @param {boolean} [chainAll] Enable explicit method chain sequences. + */ + function LodashWrapper(value, chainAll) { + this.__wrapped__ = value; + this.__actions__ = []; + this.__chain__ = !!chainAll; + this.__index__ = 0; + this.__values__ = undefined; + } + + /** + * By default, the template delimiters used by lodash are like those in + * embedded Ruby (ERB) as well as ES2015 template strings. Change the + * following template settings to use alternative delimiters. + * + * @static + * @memberOf _ + * @type {Object} + */ + lodash.templateSettings = { + + /** + * Used to detect `data` property values to be HTML-escaped. + * + * @memberOf _.templateSettings + * @type {RegExp} + */ + 'escape': reEscape, + + /** + * Used to detect code to be evaluated. + * + * @memberOf _.templateSettings + * @type {RegExp} + */ + 'evaluate': reEvaluate, + + /** + * Used to detect `data` property values to inject. + * + * @memberOf _.templateSettings + * @type {RegExp} + */ + 'interpolate': reInterpolate, + + /** + * Used to reference the data object in the template text. + * + * @memberOf _.templateSettings + * @type {string} + */ + 'variable': '', + + /** + * Used to import variables into the compiled template. + * + * @memberOf _.templateSettings + * @type {Object} + */ + 'imports': { + + /** + * A reference to the `lodash` function. + * + * @memberOf _.templateSettings.imports + * @type {Function} + */ + '_': lodash + } + }; + + // Ensure wrappers are instances of `baseLodash`. + lodash.prototype = baseLodash.prototype; + lodash.prototype.constructor = lodash; + + LodashWrapper.prototype = baseCreate(baseLodash.prototype); + LodashWrapper.prototype.constructor = LodashWrapper; + + /*------------------------------------------------------------------------*/ + + /** + * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation. + * + * @private + * @constructor + * @param {*} value The value to wrap. + */ + function LazyWrapper(value) { + this.__wrapped__ = value; + this.__actions__ = []; + this.__dir__ = 1; + this.__filtered__ = false; + this.__iteratees__ = []; + this.__takeCount__ = MAX_ARRAY_LENGTH; + this.__views__ = []; + } + + /** + * Creates a clone of the lazy wrapper object. + * + * @private + * @name clone + * @memberOf LazyWrapper + * @returns {Object} Returns the cloned `LazyWrapper` object. + */ + function lazyClone() { + var result = new LazyWrapper(this.__wrapped__); + result.__actions__ = copyArray(this.__actions__); + result.__dir__ = this.__dir__; + result.__filtered__ = this.__filtered__; + result.__iteratees__ = copyArray(this.__iteratees__); + result.__takeCount__ = this.__takeCount__; + result.__views__ = copyArray(this.__views__); + return result; + } + + /** + * Reverses the direction of lazy iteration. + * + * @private + * @name reverse + * @memberOf LazyWrapper + * @returns {Object} Returns the new reversed `LazyWrapper` object. + */ + function lazyReverse() { + if (this.__filtered__) { + var result = new LazyWrapper(this); + result.__dir__ = -1; + result.__filtered__ = true; + } else { + result = this.clone(); + result.__dir__ *= -1; + } + return result; + } + + /** + * Extracts the unwrapped value from its lazy wrapper. + * + * @private + * @name value + * @memberOf LazyWrapper + * @returns {*} Returns the unwrapped value. + */ + function lazyValue() { + var array = this.__wrapped__.value(), + dir = this.__dir__, + isArr = isArray(array), + isRight = dir < 0, + arrLength = isArr ? array.length : 0, + view = getView(0, arrLength, this.__views__), + start = view.start, + end = view.end, + length = end - start, + index = isRight ? end : (start - 1), + iteratees = this.__iteratees__, + iterLength = iteratees.length, + resIndex = 0, + takeCount = nativeMin(length, this.__takeCount__); + + if (!isArr || (!isRight && arrLength == length && takeCount == length)) { + return baseWrapperValue(array, this.__actions__); + } + var result = []; + + outer: + while (length-- && resIndex < takeCount) { + index += dir; + + var iterIndex = -1, + value = array[index]; + + while (++iterIndex < iterLength) { + var data = iteratees[iterIndex], + iteratee = data.iteratee, + type = data.type, + computed = iteratee(value); + + if (type == LAZY_MAP_FLAG) { + value = computed; + } else if (!computed) { + if (type == LAZY_FILTER_FLAG) { + continue outer; + } else { + break outer; + } + } + } + result[resIndex++] = value; + } + return result; + } + + // Ensure `LazyWrapper` is an instance of `baseLodash`. + LazyWrapper.prototype = baseCreate(baseLodash.prototype); + LazyWrapper.prototype.constructor = LazyWrapper; + + /*------------------------------------------------------------------------*/ + + /** + * Creates a hash object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function Hash(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + + /** + * Removes all key-value entries from the hash. + * + * @private + * @name clear + * @memberOf Hash + */ + function hashClear() { + this.__data__ = nativeCreate ? nativeCreate(null) : {}; + this.size = 0; + } + + /** + * Removes `key` and its value from the hash. + * + * @private + * @name delete + * @memberOf Hash + * @param {Object} hash The hash to modify. + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function hashDelete(key) { + var result = this.has(key) && delete this.__data__[key]; + this.size -= result ? 1 : 0; + return result; + } + + /** + * Gets the hash value for `key`. + * + * @private + * @name get + * @memberOf Hash + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function hashGet(key) { + var data = this.__data__; + if (nativeCreate) { + var result = data[key]; + return result === HASH_UNDEFINED ? undefined : result; + } + return hasOwnProperty.call(data, key) ? data[key] : undefined; + } + + /** + * Checks if a hash value for `key` exists. + * + * @private + * @name has + * @memberOf Hash + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function hashHas(key) { + var data = this.__data__; + return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key); + } + + /** + * Sets the hash `key` to `value`. + * + * @private + * @name set + * @memberOf Hash + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the hash instance. + */ + function hashSet(key, value) { + var data = this.__data__; + this.size += this.has(key) ? 0 : 1; + data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; + return this; + } + + // Add methods to `Hash`. + Hash.prototype.clear = hashClear; + Hash.prototype['delete'] = hashDelete; + Hash.prototype.get = hashGet; + Hash.prototype.has = hashHas; + Hash.prototype.set = hashSet; + + /*------------------------------------------------------------------------*/ + + /** + * Creates an list cache object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function ListCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + + /** + * Removes all key-value entries from the list cache. + * + * @private + * @name clear + * @memberOf ListCache + */ + function listCacheClear() { + this.__data__ = []; + this.size = 0; + } + + /** + * Removes `key` and its value from the list cache. + * + * @private + * @name delete + * @memberOf ListCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function listCacheDelete(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + return false; + } + var lastIndex = data.length - 1; + if (index == lastIndex) { + data.pop(); + } else { + splice.call(data, index, 1); + } + --this.size; + return true; + } + + /** + * Gets the list cache value for `key`. + * + * @private + * @name get + * @memberOf ListCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function listCacheGet(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + return index < 0 ? undefined : data[index][1]; + } + + /** + * Checks if a list cache value for `key` exists. + * + * @private + * @name has + * @memberOf ListCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function listCacheHas(key) { + return assocIndexOf(this.__data__, key) > -1; + } + + /** + * Sets the list cache `key` to `value`. + * + * @private + * @name set + * @memberOf ListCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the list cache instance. + */ + function listCacheSet(key, value) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + ++this.size; + data.push([key, value]); + } else { + data[index][1] = value; + } + return this; + } + + // Add methods to `ListCache`. + ListCache.prototype.clear = listCacheClear; + ListCache.prototype['delete'] = listCacheDelete; + ListCache.prototype.get = listCacheGet; + ListCache.prototype.has = listCacheHas; + ListCache.prototype.set = listCacheSet; + + /*------------------------------------------------------------------------*/ + + /** + * Creates a map cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function MapCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + + /** + * Removes all key-value entries from the map. + * + * @private + * @name clear + * @memberOf MapCache + */ + function mapCacheClear() { + this.size = 0; + this.__data__ = { + 'hash': new Hash, + 'map': new (Map || ListCache), + 'string': new Hash + }; + } + + /** + * Removes `key` and its value from the map. + * + * @private + * @name delete + * @memberOf MapCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function mapCacheDelete(key) { + var result = getMapData(this, key)['delete'](key); + this.size -= result ? 1 : 0; + return result; + } + + /** + * Gets the map value for `key`. + * + * @private + * @name get + * @memberOf MapCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function mapCacheGet(key) { + return getMapData(this, key).get(key); + } + + /** + * Checks if a map value for `key` exists. + * + * @private + * @name has + * @memberOf MapCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function mapCacheHas(key) { + return getMapData(this, key).has(key); + } + + /** + * Sets the map `key` to `value`. + * + * @private + * @name set + * @memberOf MapCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the map cache instance. + */ + function mapCacheSet(key, value) { + var data = getMapData(this, key), + size = data.size; + + data.set(key, value); + this.size += data.size == size ? 0 : 1; + return this; + } + + // Add methods to `MapCache`. + MapCache.prototype.clear = mapCacheClear; + MapCache.prototype['delete'] = mapCacheDelete; + MapCache.prototype.get = mapCacheGet; + MapCache.prototype.has = mapCacheHas; + MapCache.prototype.set = mapCacheSet; + + /*------------------------------------------------------------------------*/ + + /** + * + * Creates an array cache object to store unique values. + * + * @private + * @constructor + * @param {Array} [values] The values to cache. + */ + function SetCache(values) { + var index = -1, + length = values == null ? 0 : values.length; + + this.__data__ = new MapCache; + while (++index < length) { + this.add(values[index]); + } + } + + /** + * Adds `value` to the array cache. + * + * @private + * @name add + * @memberOf SetCache + * @alias push + * @param {*} value The value to cache. + * @returns {Object} Returns the cache instance. + */ + function setCacheAdd(value) { + this.__data__.set(value, HASH_UNDEFINED); + return this; + } + + /** + * Checks if `value` is in the array cache. + * + * @private + * @name has + * @memberOf SetCache + * @param {*} value The value to search for. + * @returns {number} Returns `true` if `value` is found, else `false`. + */ + function setCacheHas(value) { + return this.__data__.has(value); + } + + // Add methods to `SetCache`. + SetCache.prototype.add = SetCache.prototype.push = setCacheAdd; + SetCache.prototype.has = setCacheHas; + + /*------------------------------------------------------------------------*/ + + /** + * Creates a stack cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function Stack(entries) { + var data = this.__data__ = new ListCache(entries); + this.size = data.size; + } + + /** + * Removes all key-value entries from the stack. + * + * @private + * @name clear + * @memberOf Stack + */ + function stackClear() { + this.__data__ = new ListCache; + this.size = 0; + } + + /** + * Removes `key` and its value from the stack. + * + * @private + * @name delete + * @memberOf Stack + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function stackDelete(key) { + var data = this.__data__, + result = data['delete'](key); + + this.size = data.size; + return result; + } + + /** + * Gets the stack value for `key`. + * + * @private + * @name get + * @memberOf Stack + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function stackGet(key) { + return this.__data__.get(key); + } + + /** + * Checks if a stack value for `key` exists. + * + * @private + * @name has + * @memberOf Stack + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function stackHas(key) { + return this.__data__.has(key); + } + + /** + * Sets the stack `key` to `value`. + * + * @private + * @name set + * @memberOf Stack + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the stack cache instance. + */ + function stackSet(key, value) { + var data = this.__data__; + if (data instanceof ListCache) { + var pairs = data.__data__; + if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) { + pairs.push([key, value]); + this.size = ++data.size; + return this; + } + data = this.__data__ = new MapCache(pairs); + } + data.set(key, value); + this.size = data.size; + return this; + } + + // Add methods to `Stack`. + Stack.prototype.clear = stackClear; + Stack.prototype['delete'] = stackDelete; + Stack.prototype.get = stackGet; + Stack.prototype.has = stackHas; + Stack.prototype.set = stackSet; + + /*------------------------------------------------------------------------*/ + + /** + * Creates an array of the enumerable property names of the array-like `value`. + * + * @private + * @param {*} value The value to query. + * @param {boolean} inherited Specify returning inherited property names. + * @returns {Array} Returns the array of property names. + */ + function arrayLikeKeys(value, inherited) { + var isArr = isArray(value), + isArg = !isArr && isArguments(value), + isBuff = !isArr && !isArg && isBuffer(value), + isType = !isArr && !isArg && !isBuff && isTypedArray(value), + skipIndexes = isArr || isArg || isBuff || isType, + result = skipIndexes ? baseTimes(value.length, String) : [], + length = result.length; + + for (var key in value) { + if ((inherited || hasOwnProperty.call(value, key)) && + !(skipIndexes && ( + // Safari 9 has enumerable `arguments.length` in strict mode. + key == 'length' || + // Node.js 0.10 has enumerable non-index properties on buffers. + (isBuff && (key == 'offset' || key == 'parent')) || + // PhantomJS 2 has enumerable non-index properties on typed arrays. + (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) || + // Skip index properties. + isIndex(key, length) + ))) { + result.push(key); + } + } + return result; + } + + /** + * A specialized version of `_.sample` for arrays. + * + * @private + * @param {Array} array The array to sample. + * @returns {*} Returns the random element. + */ + function arraySample(array) { + var length = array.length; + return length ? array[baseRandom(0, length - 1)] : undefined; + } + + /** + * A specialized version of `_.sampleSize` for arrays. + * + * @private + * @param {Array} array The array to sample. + * @param {number} n The number of elements to sample. + * @returns {Array} Returns the random elements. + */ + function arraySampleSize(array, n) { + return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length)); + } + + /** + * A specialized version of `_.shuffle` for arrays. + * + * @private + * @param {Array} array The array to shuffle. + * @returns {Array} Returns the new shuffled array. + */ + function arrayShuffle(array) { + return shuffleSelf(copyArray(array)); + } + + /** + * This function is like `assignValue` except that it doesn't assign + * `undefined` values. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ + function assignMergeValue(object, key, value) { + if ((value !== undefined && !eq(object[key], value)) || + (value === undefined && !(key in object))) { + baseAssignValue(object, key, value); + } + } + + /** + * Assigns `value` to `key` of `object` if the existing value is not equivalent + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ + function assignValue(object, key, value) { + var objValue = object[key]; + if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) || + (value === undefined && !(key in object))) { + baseAssignValue(object, key, value); + } + } + + /** + * Gets the index at which the `key` is found in `array` of key-value pairs. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} key The key to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function assocIndexOf(array, key) { + var length = array.length; + while (length--) { + if (eq(array[length][0], key)) { + return length; + } + } + return -1; + } + + /** + * Aggregates elements of `collection` on `accumulator` with keys transformed + * by `iteratee` and values set by `setter`. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} setter The function to set `accumulator` values. + * @param {Function} iteratee The iteratee to transform keys. + * @param {Object} accumulator The initial aggregated object. + * @returns {Function} Returns `accumulator`. + */ + function baseAggregator(collection, setter, iteratee, accumulator) { + baseEach(collection, function(value, key, collection) { + setter(accumulator, value, iteratee(value), collection); + }); + return accumulator; + } + + /** + * The base implementation of `_.assign` without support for multiple sources + * or `customizer` functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @returns {Object} Returns `object`. + */ + function baseAssign(object, source) { + return object && copyObject(source, keys(source), object); + } + + /** + * The base implementation of `_.assignIn` without support for multiple sources + * or `customizer` functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @returns {Object} Returns `object`. + */ + function baseAssignIn(object, source) { + return object && copyObject(source, keysIn(source), object); + } + + /** + * The base implementation of `assignValue` and `assignMergeValue` without + * value checks. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ + function baseAssignValue(object, key, value) { + if (key == '__proto__' && defineProperty) { + defineProperty(object, key, { + 'configurable': true, + 'enumerable': true, + 'value': value, + 'writable': true + }); + } else { + object[key] = value; + } + } + + /** + * The base implementation of `_.at` without support for individual paths. + * + * @private + * @param {Object} object The object to iterate over. + * @param {string[]} paths The property paths to pick. + * @returns {Array} Returns the picked elements. + */ + function baseAt(object, paths) { + var index = -1, + length = paths.length, + result = Array(length), + skip = object == null; + + while (++index < length) { + result[index] = skip ? undefined : get(object, paths[index]); + } + return result; + } + + /** + * The base implementation of `_.clamp` which doesn't coerce arguments. + * + * @private + * @param {number} number The number to clamp. + * @param {number} [lower] The lower bound. + * @param {number} upper The upper bound. + * @returns {number} Returns the clamped number. + */ + function baseClamp(number, lower, upper) { + if (number === number) { + if (upper !== undefined) { + number = number <= upper ? number : upper; + } + if (lower !== undefined) { + number = number >= lower ? number : lower; + } + } + return number; + } + + /** + * The base implementation of `_.clone` and `_.cloneDeep` which tracks + * traversed objects. + * + * @private + * @param {*} value The value to clone. + * @param {boolean} bitmask The bitmask flags. + * 1 - Deep clone + * 2 - Flatten inherited properties + * 4 - Clone symbols + * @param {Function} [customizer] The function to customize cloning. + * @param {string} [key] The key of `value`. + * @param {Object} [object] The parent object of `value`. + * @param {Object} [stack] Tracks traversed objects and their clone counterparts. + * @returns {*} Returns the cloned value. + */ + function baseClone(value, bitmask, customizer, key, object, stack) { + var result, + isDeep = bitmask & CLONE_DEEP_FLAG, + isFlat = bitmask & CLONE_FLAT_FLAG, + isFull = bitmask & CLONE_SYMBOLS_FLAG; + + if (customizer) { + result = object ? customizer(value, key, object, stack) : customizer(value); + } + if (result !== undefined) { + return result; + } + if (!isObject(value)) { + return value; + } + var isArr = isArray(value); + if (isArr) { + result = initCloneArray(value); + if (!isDeep) { + return copyArray(value, result); + } + } else { + var tag = getTag(value), + isFunc = tag == funcTag || tag == genTag; + + if (isBuffer(value)) { + return cloneBuffer(value, isDeep); + } + if (tag == objectTag || tag == argsTag || (isFunc && !object)) { + result = (isFlat || isFunc) ? {} : initCloneObject(value); + if (!isDeep) { + return isFlat + ? copySymbolsIn(value, baseAssignIn(result, value)) + : copySymbols(value, baseAssign(result, value)); + } + } else { + if (!cloneableTags[tag]) { + return object ? value : {}; + } + result = initCloneByTag(value, tag, isDeep); + } + } + // Check for circular references and return its corresponding clone. + stack || (stack = new Stack); + var stacked = stack.get(value); + if (stacked) { + return stacked; + } + stack.set(value, result); + + if (isSet(value)) { + value.forEach(function(subValue) { + result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack)); + }); + } else if (isMap(value)) { + value.forEach(function(subValue, key) { + result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack)); + }); + } + + var keysFunc = isFull + ? (isFlat ? getAllKeysIn : getAllKeys) + : (isFlat ? keysIn : keys); + + var props = isArr ? undefined : keysFunc(value); + arrayEach(props || value, function(subValue, key) { + if (props) { + key = subValue; + subValue = value[key]; + } + // Recursively populate clone (susceptible to call stack limits). + assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack)); + }); + return result; + } + + /** + * The base implementation of `_.conforms` which doesn't clone `source`. + * + * @private + * @param {Object} source The object of property predicates to conform to. + * @returns {Function} Returns the new spec function. + */ + function baseConforms(source) { + var props = keys(source); + return function(object) { + return baseConformsTo(object, source, props); + }; + } + + /** + * The base implementation of `_.conformsTo` which accepts `props` to check. + * + * @private + * @param {Object} object The object to inspect. + * @param {Object} source The object of property predicates to conform to. + * @returns {boolean} Returns `true` if `object` conforms, else `false`. + */ + function baseConformsTo(object, source, props) { + var length = props.length; + if (object == null) { + return !length; + } + object = Object(object); + while (length--) { + var key = props[length], + predicate = source[key], + value = object[key]; + + if ((value === undefined && !(key in object)) || !predicate(value)) { + return false; + } + } + return true; + } + + /** + * The base implementation of `_.delay` and `_.defer` which accepts `args` + * to provide to `func`. + * + * @private + * @param {Function} func The function to delay. + * @param {number} wait The number of milliseconds to delay invocation. + * @param {Array} args The arguments to provide to `func`. + * @returns {number|Object} Returns the timer id or timeout object. + */ + function baseDelay(func, wait, args) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + return setTimeout(function() { func.apply(undefined, args); }, wait); + } + + /** + * The base implementation of methods like `_.difference` without support + * for excluding multiple arrays or iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Array} values The values to exclude. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of filtered values. + */ + function baseDifference(array, values, iteratee, comparator) { + var index = -1, + includes = arrayIncludes, + isCommon = true, + length = array.length, + result = [], + valuesLength = values.length; + + if (!length) { + return result; + } + if (iteratee) { + values = arrayMap(values, baseUnary(iteratee)); + } + if (comparator) { + includes = arrayIncludesWith; + isCommon = false; + } + else if (values.length >= LARGE_ARRAY_SIZE) { + includes = cacheHas; + isCommon = false; + values = new SetCache(values); + } + outer: + while (++index < length) { + var value = array[index], + computed = iteratee == null ? value : iteratee(value); + + value = (comparator || value !== 0) ? value : 0; + if (isCommon && computed === computed) { + var valuesIndex = valuesLength; + while (valuesIndex--) { + if (values[valuesIndex] === computed) { + continue outer; + } + } + result.push(value); + } + else if (!includes(values, computed, comparator)) { + result.push(value); + } + } + return result; + } + + /** + * The base implementation of `_.forEach` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + */ + var baseEach = createBaseEach(baseForOwn); + + /** + * The base implementation of `_.forEachRight` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + */ + var baseEachRight = createBaseEach(baseForOwnRight, true); + + /** + * The base implementation of `_.every` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false` + */ + function baseEvery(collection, predicate) { + var result = true; + baseEach(collection, function(value, index, collection) { + result = !!predicate(value, index, collection); + return result; + }); + return result; + } + + /** + * The base implementation of methods like `_.max` and `_.min` which accepts a + * `comparator` to determine the extremum value. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The iteratee invoked per iteration. + * @param {Function} comparator The comparator used to compare values. + * @returns {*} Returns the extremum value. + */ + function baseExtremum(array, iteratee, comparator) { + var index = -1, + length = array.length; + + while (++index < length) { + var value = array[index], + current = iteratee(value); + + if (current != null && (computed === undefined + ? (current === current && !isSymbol(current)) + : comparator(current, computed) + )) { + var computed = current, + result = value; + } + } + return result; + } + + /** + * The base implementation of `_.fill` without an iteratee call guard. + * + * @private + * @param {Array} array The array to fill. + * @param {*} value The value to fill `array` with. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns `array`. + */ + function baseFill(array, value, start, end) { + var length = array.length; + + start = toInteger(start); + if (start < 0) { + start = -start > length ? 0 : (length + start); + } + end = (end === undefined || end > length) ? length : toInteger(end); + if (end < 0) { + end += length; + } + end = start > end ? 0 : toLength(end); + while (start < end) { + array[start++] = value; + } + return array; + } + + /** + * The base implementation of `_.filter` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + */ + function baseFilter(collection, predicate) { + var result = []; + baseEach(collection, function(value, index, collection) { + if (predicate(value, index, collection)) { + result.push(value); + } + }); + return result; + } + + /** + * The base implementation of `_.flatten` with support for restricting flattening. + * + * @private + * @param {Array} array The array to flatten. + * @param {number} depth The maximum recursion depth. + * @param {boolean} [predicate=isFlattenable] The function invoked per iteration. + * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks. + * @param {Array} [result=[]] The initial result value. + * @returns {Array} Returns the new flattened array. + */ + function baseFlatten(array, depth, predicate, isStrict, result) { + var index = -1, + length = array.length; + + predicate || (predicate = isFlattenable); + result || (result = []); + + while (++index < length) { + var value = array[index]; + if (depth > 0 && predicate(value)) { + if (depth > 1) { + // Recursively flatten arrays (susceptible to call stack limits). + baseFlatten(value, depth - 1, predicate, isStrict, result); + } else { + arrayPush(result, value); + } + } else if (!isStrict) { + result[result.length] = value; + } + } + return result; + } + + /** + * The base implementation of `baseForOwn` which iterates over `object` + * properties returned by `keysFunc` and invokes `iteratee` for each property. + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {Function} keysFunc The function to get the keys of `object`. + * @returns {Object} Returns `object`. + */ + var baseFor = createBaseFor(); + + /** + * This function is like `baseFor` except that it iterates over properties + * in the opposite order. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {Function} keysFunc The function to get the keys of `object`. + * @returns {Object} Returns `object`. + */ + var baseForRight = createBaseFor(true); + + /** + * The base implementation of `_.forOwn` without support for iteratee shorthands. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Object} Returns `object`. + */ + function baseForOwn(object, iteratee) { + return object && baseFor(object, iteratee, keys); + } + + /** + * The base implementation of `_.forOwnRight` without support for iteratee shorthands. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Object} Returns `object`. + */ + function baseForOwnRight(object, iteratee) { + return object && baseForRight(object, iteratee, keys); + } + + /** + * The base implementation of `_.functions` which creates an array of + * `object` function property names filtered from `props`. + * + * @private + * @param {Object} object The object to inspect. + * @param {Array} props The property names to filter. + * @returns {Array} Returns the function names. + */ + function baseFunctions(object, props) { + return arrayFilter(props, function(key) { + return isFunction(object[key]); + }); + } + + /** + * The base implementation of `_.get` without support for default values. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @returns {*} Returns the resolved value. + */ + function baseGet(object, path) { + path = castPath(path, object); + + var index = 0, + length = path.length; + + while (object != null && index < length) { + object = object[toKey(path[index++])]; + } + return (index && index == length) ? object : undefined; + } + + /** + * The base implementation of `getAllKeys` and `getAllKeysIn` which uses + * `keysFunc` and `symbolsFunc` to get the enumerable property names and + * symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Function} keysFunc The function to get the keys of `object`. + * @param {Function} symbolsFunc The function to get the symbols of `object`. + * @returns {Array} Returns the array of property names and symbols. + */ + function baseGetAllKeys(object, keysFunc, symbolsFunc) { + var result = keysFunc(object); + return isArray(object) ? result : arrayPush(result, symbolsFunc(object)); + } + + /** + * The base implementation of `getTag` without fallbacks for buggy environments. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ + function baseGetTag(value) { + if (value == null) { + return value === undefined ? undefinedTag : nullTag; + } + return (symToStringTag && symToStringTag in Object(value)) + ? getRawTag(value) + : objectToString(value); + } + + /** + * The base implementation of `_.gt` which doesn't coerce arguments. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is greater than `other`, + * else `false`. + */ + function baseGt(value, other) { + return value > other; + } + + /** + * The base implementation of `_.has` without support for deep paths. + * + * @private + * @param {Object} [object] The object to query. + * @param {Array|string} key The key to check. + * @returns {boolean} Returns `true` if `key` exists, else `false`. + */ + function baseHas(object, key) { + return object != null && hasOwnProperty.call(object, key); + } + + /** + * The base implementation of `_.hasIn` without support for deep paths. + * + * @private + * @param {Object} [object] The object to query. + * @param {Array|string} key The key to check. + * @returns {boolean} Returns `true` if `key` exists, else `false`. + */ + function baseHasIn(object, key) { + return object != null && key in Object(object); + } + + /** + * The base implementation of `_.inRange` which doesn't coerce arguments. + * + * @private + * @param {number} number The number to check. + * @param {number} start The start of the range. + * @param {number} end The end of the range. + * @returns {boolean} Returns `true` if `number` is in the range, else `false`. + */ + function baseInRange(number, start, end) { + return number >= nativeMin(start, end) && number < nativeMax(start, end); + } + + /** + * The base implementation of methods like `_.intersection`, without support + * for iteratee shorthands, that accepts an array of arrays to inspect. + * + * @private + * @param {Array} arrays The arrays to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of shared values. + */ + function baseIntersection(arrays, iteratee, comparator) { + var includes = comparator ? arrayIncludesWith : arrayIncludes, + length = arrays[0].length, + othLength = arrays.length, + othIndex = othLength, + caches = Array(othLength), + maxLength = Infinity, + result = []; + + while (othIndex--) { + var array = arrays[othIndex]; + if (othIndex && iteratee) { + array = arrayMap(array, baseUnary(iteratee)); + } + maxLength = nativeMin(array.length, maxLength); + caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120)) + ? new SetCache(othIndex && array) + : undefined; + } + array = arrays[0]; + + var index = -1, + seen = caches[0]; + + outer: + while (++index < length && result.length < maxLength) { + var value = array[index], + computed = iteratee ? iteratee(value) : value; + + value = (comparator || value !== 0) ? value : 0; + if (!(seen + ? cacheHas(seen, computed) + : includes(result, computed, comparator) + )) { + othIndex = othLength; + while (--othIndex) { + var cache = caches[othIndex]; + if (!(cache + ? cacheHas(cache, computed) + : includes(arrays[othIndex], computed, comparator)) + ) { + continue outer; + } + } + if (seen) { + seen.push(computed); + } + result.push(value); + } + } + return result; + } + + /** + * The base implementation of `_.invert` and `_.invertBy` which inverts + * `object` with values transformed by `iteratee` and set by `setter`. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} setter The function to set `accumulator` values. + * @param {Function} iteratee The iteratee to transform values. + * @param {Object} accumulator The initial inverted object. + * @returns {Function} Returns `accumulator`. + */ + function baseInverter(object, setter, iteratee, accumulator) { + baseForOwn(object, function(value, key, object) { + setter(accumulator, iteratee(value), key, object); + }); + return accumulator; + } + + /** + * The base implementation of `_.invoke` without support for individual + * method arguments. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path of the method to invoke. + * @param {Array} args The arguments to invoke the method with. + * @returns {*} Returns the result of the invoked method. + */ + function baseInvoke(object, path, args) { + path = castPath(path, object); + object = parent(object, path); + var func = object == null ? object : object[toKey(last(path))]; + return func == null ? undefined : apply(func, object, args); + } + + /** + * The base implementation of `_.isArguments`. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + */ + function baseIsArguments(value) { + return isObjectLike(value) && baseGetTag(value) == argsTag; + } + + /** + * The base implementation of `_.isArrayBuffer` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`. + */ + function baseIsArrayBuffer(value) { + return isObjectLike(value) && baseGetTag(value) == arrayBufferTag; + } + + /** + * The base implementation of `_.isDate` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a date object, else `false`. + */ + function baseIsDate(value) { + return isObjectLike(value) && baseGetTag(value) == dateTag; + } + + /** + * The base implementation of `_.isEqual` which supports partial comparisons + * and tracks traversed objects. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @param {boolean} bitmask The bitmask flags. + * 1 - Unordered comparison + * 2 - Partial comparison + * @param {Function} [customizer] The function to customize comparisons. + * @param {Object} [stack] Tracks traversed `value` and `other` objects. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + */ + function baseIsEqual(value, other, bitmask, customizer, stack) { + if (value === other) { + return true; + } + if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) { + return value !== value && other !== other; + } + return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack); + } + + /** + * A specialized version of `baseIsEqual` for arrays and objects which performs + * deep comparisons and tracks traversed objects enabling objects with circular + * references to be compared. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} [stack] Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ + function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { + var objIsArr = isArray(object), + othIsArr = isArray(other), + objTag = objIsArr ? arrayTag : getTag(object), + othTag = othIsArr ? arrayTag : getTag(other); + + objTag = objTag == argsTag ? objectTag : objTag; + othTag = othTag == argsTag ? objectTag : othTag; + + var objIsObj = objTag == objectTag, + othIsObj = othTag == objectTag, + isSameTag = objTag == othTag; + + if (isSameTag && isBuffer(object)) { + if (!isBuffer(other)) { + return false; + } + objIsArr = true; + objIsObj = false; + } + if (isSameTag && !objIsObj) { + stack || (stack = new Stack); + return (objIsArr || isTypedArray(object)) + ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) + : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack); + } + if (!(bitmask & COMPARE_PARTIAL_FLAG)) { + var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), + othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); + + if (objIsWrapped || othIsWrapped) { + var objUnwrapped = objIsWrapped ? object.value() : object, + othUnwrapped = othIsWrapped ? other.value() : other; + + stack || (stack = new Stack); + return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack); + } + } + if (!isSameTag) { + return false; + } + stack || (stack = new Stack); + return equalObjects(object, other, bitmask, customizer, equalFunc, stack); + } + + /** + * The base implementation of `_.isMap` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a map, else `false`. + */ + function baseIsMap(value) { + return isObjectLike(value) && getTag(value) == mapTag; + } + + /** + * The base implementation of `_.isMatch` without support for iteratee shorthands. + * + * @private + * @param {Object} object The object to inspect. + * @param {Object} source The object of property values to match. + * @param {Array} matchData The property names, values, and compare flags to match. + * @param {Function} [customizer] The function to customize comparisons. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + */ + function baseIsMatch(object, source, matchData, customizer) { + var index = matchData.length, + length = index, + noCustomizer = !customizer; + + if (object == null) { + return !length; + } + object = Object(object); + while (index--) { + var data = matchData[index]; + if ((noCustomizer && data[2]) + ? data[1] !== object[data[0]] + : !(data[0] in object) + ) { + return false; + } + } + while (++index < length) { + data = matchData[index]; + var key = data[0], + objValue = object[key], + srcValue = data[1]; + + if (noCustomizer && data[2]) { + if (objValue === undefined && !(key in object)) { + return false; + } + } else { + var stack = new Stack; + if (customizer) { + var result = customizer(objValue, srcValue, key, object, source, stack); + } + if (!(result === undefined + ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack) + : result + )) { + return false; + } + } + } + return true; + } + + /** + * The base implementation of `_.isNative` without bad shim checks. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. + */ + function baseIsNative(value) { + if (!isObject(value) || isMasked(value)) { + return false; + } + var pattern = isFunction(value) ? reIsNative : reIsHostCtor; + return pattern.test(toSource(value)); + } + + /** + * The base implementation of `_.isRegExp` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a regexp, else `false`. + */ + function baseIsRegExp(value) { + return isObjectLike(value) && baseGetTag(value) == regexpTag; + } + + /** + * The base implementation of `_.isSet` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a set, else `false`. + */ + function baseIsSet(value) { + return isObjectLike(value) && getTag(value) == setTag; + } + + /** + * The base implementation of `_.isTypedArray` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. + */ + function baseIsTypedArray(value) { + return isObjectLike(value) && + isLength(value.length) && !!typedArrayTags[baseGetTag(value)]; + } + + /** + * The base implementation of `_.iteratee`. + * + * @private + * @param {*} [value=_.identity] The value to convert to an iteratee. + * @returns {Function} Returns the iteratee. + */ + function baseIteratee(value) { + // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9. + // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details. + if (typeof value == 'function') { + return value; + } + if (value == null) { + return identity; + } + if (typeof value == 'object') { + return isArray(value) + ? baseMatchesProperty(value[0], value[1]) + : baseMatches(value); + } + return property(value); + } + + /** + * The base implementation of `_.keys` which doesn't treat sparse arrays as dense. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ + function baseKeys(object) { + if (!isPrototype(object)) { + return nativeKeys(object); + } + var result = []; + for (var key in Object(object)) { + if (hasOwnProperty.call(object, key) && key != 'constructor') { + result.push(key); + } + } + return result; + } + + /** + * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ + function baseKeysIn(object) { + if (!isObject(object)) { + return nativeKeysIn(object); + } + var isProto = isPrototype(object), + result = []; + + for (var key in object) { + if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) { + result.push(key); + } + } + return result; + } + + /** + * The base implementation of `_.lt` which doesn't coerce arguments. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is less than `other`, + * else `false`. + */ + function baseLt(value, other) { + return value < other; + } + + /** + * The base implementation of `_.map` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + */ + function baseMap(collection, iteratee) { + var index = -1, + result = isArrayLike(collection) ? Array(collection.length) : []; + + baseEach(collection, function(value, key, collection) { + result[++index] = iteratee(value, key, collection); + }); + return result; + } + + /** + * The base implementation of `_.matches` which doesn't clone `source`. + * + * @private + * @param {Object} source The object of property values to match. + * @returns {Function} Returns the new spec function. + */ + function baseMatches(source) { + var matchData = getMatchData(source); + if (matchData.length == 1 && matchData[0][2]) { + return matchesStrictComparable(matchData[0][0], matchData[0][1]); + } + return function(object) { + return object === source || baseIsMatch(object, source, matchData); + }; + } + + /** + * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`. + * + * @private + * @param {string} path The path of the property to get. + * @param {*} srcValue The value to match. + * @returns {Function} Returns the new spec function. + */ + function baseMatchesProperty(path, srcValue) { + if (isKey(path) && isStrictComparable(srcValue)) { + return matchesStrictComparable(toKey(path), srcValue); + } + return function(object) { + var objValue = get(object, path); + return (objValue === undefined && objValue === srcValue) + ? hasIn(object, path) + : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG); + }; + } + + /** + * The base implementation of `_.merge` without support for multiple sources. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {number} srcIndex The index of `source`. + * @param {Function} [customizer] The function to customize merged values. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + */ + function baseMerge(object, source, srcIndex, customizer, stack) { + if (object === source) { + return; + } + baseFor(source, function(srcValue, key) { + stack || (stack = new Stack); + if (isObject(srcValue)) { + baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack); + } + else { + var newValue = customizer + ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack) + : undefined; + + if (newValue === undefined) { + newValue = srcValue; + } + assignMergeValue(object, key, newValue); + } + }, keysIn); + } + + /** + * A specialized version of `baseMerge` for arrays and objects which performs + * deep merges and tracks traversed objects enabling objects with circular + * references to be merged. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {string} key The key of the value to merge. + * @param {number} srcIndex The index of `source`. + * @param {Function} mergeFunc The function to merge values. + * @param {Function} [customizer] The function to customize assigned values. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + */ + function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) { + var objValue = safeGet(object, key), + srcValue = safeGet(source, key), + stacked = stack.get(srcValue); + + if (stacked) { + assignMergeValue(object, key, stacked); + return; + } + var newValue = customizer + ? customizer(objValue, srcValue, (key + ''), object, source, stack) + : undefined; + + var isCommon = newValue === undefined; + + if (isCommon) { + var isArr = isArray(srcValue), + isBuff = !isArr && isBuffer(srcValue), + isTyped = !isArr && !isBuff && isTypedArray(srcValue); + + newValue = srcValue; + if (isArr || isBuff || isTyped) { + if (isArray(objValue)) { + newValue = objValue; + } + else if (isArrayLikeObject(objValue)) { + newValue = copyArray(objValue); + } + else if (isBuff) { + isCommon = false; + newValue = cloneBuffer(srcValue, true); + } + else if (isTyped) { + isCommon = false; + newValue = cloneTypedArray(srcValue, true); + } + else { + newValue = []; + } + } + else if (isPlainObject(srcValue) || isArguments(srcValue)) { + newValue = objValue; + if (isArguments(objValue)) { + newValue = toPlainObject(objValue); + } + else if (!isObject(objValue) || isFunction(objValue)) { + newValue = initCloneObject(srcValue); + } + } + else { + isCommon = false; + } + } + if (isCommon) { + // Recursively merge objects and arrays (susceptible to call stack limits). + stack.set(srcValue, newValue); + mergeFunc(newValue, srcValue, srcIndex, customizer, stack); + stack['delete'](srcValue); + } + assignMergeValue(object, key, newValue); + } + + /** + * The base implementation of `_.nth` which doesn't coerce arguments. + * + * @private + * @param {Array} array The array to query. + * @param {number} n The index of the element to return. + * @returns {*} Returns the nth element of `array`. + */ + function baseNth(array, n) { + var length = array.length; + if (!length) { + return; + } + n += n < 0 ? length : 0; + return isIndex(n, length) ? array[n] : undefined; + } + + /** + * The base implementation of `_.orderBy` without param guards. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by. + * @param {string[]} orders The sort orders of `iteratees`. + * @returns {Array} Returns the new sorted array. + */ + function baseOrderBy(collection, iteratees, orders) { + if (iteratees.length) { + iteratees = arrayMap(iteratees, function(iteratee) { + if (isArray(iteratee)) { + return function(value) { + return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee); + } + } + return iteratee; + }); + } else { + iteratees = [identity]; + } + + var index = -1; + iteratees = arrayMap(iteratees, baseUnary(getIteratee())); + + var result = baseMap(collection, function(value, key, collection) { + var criteria = arrayMap(iteratees, function(iteratee) { + return iteratee(value); + }); + return { 'criteria': criteria, 'index': ++index, 'value': value }; + }); + + return baseSortBy(result, function(object, other) { + return compareMultiple(object, other, orders); + }); + } + + /** + * The base implementation of `_.pick` without support for individual + * property identifiers. + * + * @private + * @param {Object} object The source object. + * @param {string[]} paths The property paths to pick. + * @returns {Object} Returns the new object. + */ + function basePick(object, paths) { + return basePickBy(object, paths, function(value, path) { + return hasIn(object, path); + }); + } + + /** + * The base implementation of `_.pickBy` without support for iteratee shorthands. + * + * @private + * @param {Object} object The source object. + * @param {string[]} paths The property paths to pick. + * @param {Function} predicate The function invoked per property. + * @returns {Object} Returns the new object. + */ + function basePickBy(object, paths, predicate) { + var index = -1, + length = paths.length, + result = {}; + + while (++index < length) { + var path = paths[index], + value = baseGet(object, path); + + if (predicate(value, path)) { + baseSet(result, castPath(path, object), value); + } + } + return result; + } + + /** + * A specialized version of `baseProperty` which supports deep paths. + * + * @private + * @param {Array|string} path The path of the property to get. + * @returns {Function} Returns the new accessor function. + */ + function basePropertyDeep(path) { + return function(object) { + return baseGet(object, path); + }; + } + + /** + * The base implementation of `_.pullAllBy` without support for iteratee + * shorthands. + * + * @private + * @param {Array} array The array to modify. + * @param {Array} values The values to remove. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns `array`. + */ + function basePullAll(array, values, iteratee, comparator) { + var indexOf = comparator ? baseIndexOfWith : baseIndexOf, + index = -1, + length = values.length, + seen = array; + + if (array === values) { + values = copyArray(values); + } + if (iteratee) { + seen = arrayMap(array, baseUnary(iteratee)); + } + while (++index < length) { + var fromIndex = 0, + value = values[index], + computed = iteratee ? iteratee(value) : value; + + while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) { + if (seen !== array) { + splice.call(seen, fromIndex, 1); + } + splice.call(array, fromIndex, 1); + } + } + return array; + } + + /** + * The base implementation of `_.pullAt` without support for individual + * indexes or capturing the removed elements. + * + * @private + * @param {Array} array The array to modify. + * @param {number[]} indexes The indexes of elements to remove. + * @returns {Array} Returns `array`. + */ + function basePullAt(array, indexes) { + var length = array ? indexes.length : 0, + lastIndex = length - 1; + + while (length--) { + var index = indexes[length]; + if (length == lastIndex || index !== previous) { + var previous = index; + if (isIndex(index)) { + splice.call(array, index, 1); + } else { + baseUnset(array, index); + } + } + } + return array; + } + + /** + * The base implementation of `_.random` without support for returning + * floating-point numbers. + * + * @private + * @param {number} lower The lower bound. + * @param {number} upper The upper bound. + * @returns {number} Returns the random number. + */ + function baseRandom(lower, upper) { + return lower + nativeFloor(nativeRandom() * (upper - lower + 1)); + } + + /** + * The base implementation of `_.range` and `_.rangeRight` which doesn't + * coerce arguments. + * + * @private + * @param {number} start The start of the range. + * @param {number} end The end of the range. + * @param {number} step The value to increment or decrement by. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Array} Returns the range of numbers. + */ + function baseRange(start, end, step, fromRight) { + var index = -1, + length = nativeMax(nativeCeil((end - start) / (step || 1)), 0), + result = Array(length); + + while (length--) { + result[fromRight ? length : ++index] = start; + start += step; + } + return result; + } + + /** + * The base implementation of `_.repeat` which doesn't coerce arguments. + * + * @private + * @param {string} string The string to repeat. + * @param {number} n The number of times to repeat the string. + * @returns {string} Returns the repeated string. + */ + function baseRepeat(string, n) { + var result = ''; + if (!string || n < 1 || n > MAX_SAFE_INTEGER) { + return result; + } + // Leverage the exponentiation by squaring algorithm for a faster repeat. + // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details. + do { + if (n % 2) { + result += string; + } + n = nativeFloor(n / 2); + if (n) { + string += string; + } + } while (n); + + return result; + } + + /** + * The base implementation of `_.rest` which doesn't validate or coerce arguments. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @returns {Function} Returns the new function. + */ + function baseRest(func, start) { + return setToString(overRest(func, start, identity), func + ''); + } + + /** + * The base implementation of `_.sample`. + * + * @private + * @param {Array|Object} collection The collection to sample. + * @returns {*} Returns the random element. + */ + function baseSample(collection) { + return arraySample(values(collection)); + } + + /** + * The base implementation of `_.sampleSize` without param guards. + * + * @private + * @param {Array|Object} collection The collection to sample. + * @param {number} n The number of elements to sample. + * @returns {Array} Returns the random elements. + */ + function baseSampleSize(collection, n) { + var array = values(collection); + return shuffleSelf(array, baseClamp(n, 0, array.length)); + } + + /** + * The base implementation of `_.set`. + * + * @private + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {*} value The value to set. + * @param {Function} [customizer] The function to customize path creation. + * @returns {Object} Returns `object`. + */ + function baseSet(object, path, value, customizer) { + if (!isObject(object)) { + return object; + } + path = castPath(path, object); + + var index = -1, + length = path.length, + lastIndex = length - 1, + nested = object; + + while (nested != null && ++index < length) { + var key = toKey(path[index]), + newValue = value; + + if (key === '__proto__' || key === 'constructor' || key === 'prototype') { + return object; + } + + if (index != lastIndex) { + var objValue = nested[key]; + newValue = customizer ? customizer(objValue, key, nested) : undefined; + if (newValue === undefined) { + newValue = isObject(objValue) + ? objValue + : (isIndex(path[index + 1]) ? [] : {}); + } + } + assignValue(nested, key, newValue); + nested = nested[key]; + } + return object; + } + + /** + * The base implementation of `setData` without support for hot loop shorting. + * + * @private + * @param {Function} func The function to associate metadata with. + * @param {*} data The metadata. + * @returns {Function} Returns `func`. + */ + var baseSetData = !metaMap ? identity : function(func, data) { + metaMap.set(func, data); + return func; + }; + + /** + * The base implementation of `setToString` without support for hot loop shorting. + * + * @private + * @param {Function} func The function to modify. + * @param {Function} string The `toString` result. + * @returns {Function} Returns `func`. + */ + var baseSetToString = !defineProperty ? identity : function(func, string) { + return defineProperty(func, 'toString', { + 'configurable': true, + 'enumerable': false, + 'value': constant(string), + 'writable': true + }); + }; + + /** + * The base implementation of `_.shuffle`. + * + * @private + * @param {Array|Object} collection The collection to shuffle. + * @returns {Array} Returns the new shuffled array. + */ + function baseShuffle(collection) { + return shuffleSelf(values(collection)); + } + + /** + * The base implementation of `_.slice` without an iteratee call guard. + * + * @private + * @param {Array} array The array to slice. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the slice of `array`. + */ + function baseSlice(array, start, end) { + var index = -1, + length = array.length; + + if (start < 0) { + start = -start > length ? 0 : (length + start); + } + end = end > length ? length : end; + if (end < 0) { + end += length; + } + length = start > end ? 0 : ((end - start) >>> 0); + start >>>= 0; + + var result = Array(length); + while (++index < length) { + result[index] = array[index + start]; + } + return result; + } + + /** + * The base implementation of `_.some` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + */ + function baseSome(collection, predicate) { + var result; + + baseEach(collection, function(value, index, collection) { + result = predicate(value, index, collection); + return !result; + }); + return !!result; + } + + /** + * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which + * performs a binary search of `array` to determine the index at which `value` + * should be inserted into `array` in order to maintain its sort order. + * + * @private + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {boolean} [retHighest] Specify returning the highest qualified index. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + */ + function baseSortedIndex(array, value, retHighest) { + var low = 0, + high = array == null ? low : array.length; + + if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) { + while (low < high) { + var mid = (low + high) >>> 1, + computed = array[mid]; + + if (computed !== null && !isSymbol(computed) && + (retHighest ? (computed <= value) : (computed < value))) { + low = mid + 1; + } else { + high = mid; + } + } + return high; + } + return baseSortedIndexBy(array, value, identity, retHighest); + } + + /** + * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy` + * which invokes `iteratee` for `value` and each element of `array` to compute + * their sort ranking. The iteratee is invoked with one argument; (value). + * + * @private + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {Function} iteratee The iteratee invoked per element. + * @param {boolean} [retHighest] Specify returning the highest qualified index. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + */ + function baseSortedIndexBy(array, value, iteratee, retHighest) { + var low = 0, + high = array == null ? 0 : array.length; + if (high === 0) { + return 0; + } + + value = iteratee(value); + var valIsNaN = value !== value, + valIsNull = value === null, + valIsSymbol = isSymbol(value), + valIsUndefined = value === undefined; + + while (low < high) { + var mid = nativeFloor((low + high) / 2), + computed = iteratee(array[mid]), + othIsDefined = computed !== undefined, + othIsNull = computed === null, + othIsReflexive = computed === computed, + othIsSymbol = isSymbol(computed); + + if (valIsNaN) { + var setLow = retHighest || othIsReflexive; + } else if (valIsUndefined) { + setLow = othIsReflexive && (retHighest || othIsDefined); + } else if (valIsNull) { + setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull); + } else if (valIsSymbol) { + setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol); + } else if (othIsNull || othIsSymbol) { + setLow = false; + } else { + setLow = retHighest ? (computed <= value) : (computed < value); + } + if (setLow) { + low = mid + 1; + } else { + high = mid; + } + } + return nativeMin(high, MAX_ARRAY_INDEX); + } + + /** + * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without + * support for iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @returns {Array} Returns the new duplicate free array. + */ + function baseSortedUniq(array, iteratee) { + var index = -1, + length = array.length, + resIndex = 0, + result = []; + + while (++index < length) { + var value = array[index], + computed = iteratee ? iteratee(value) : value; + + if (!index || !eq(computed, seen)) { + var seen = computed; + result[resIndex++] = value === 0 ? 0 : value; + } + } + return result; + } + + /** + * The base implementation of `_.toNumber` which doesn't ensure correct + * conversions of binary, hexadecimal, or octal string values. + * + * @private + * @param {*} value The value to process. + * @returns {number} Returns the number. + */ + function baseToNumber(value) { + if (typeof value == 'number') { + return value; + } + if (isSymbol(value)) { + return NAN; + } + return +value; + } + + /** + * The base implementation of `_.toString` which doesn't convert nullish + * values to empty strings. + * + * @private + * @param {*} value The value to process. + * @returns {string} Returns the string. + */ + function baseToString(value) { + // Exit early for strings to avoid a performance hit in some environments. + if (typeof value == 'string') { + return value; + } + if (isArray(value)) { + // Recursively convert values (susceptible to call stack limits). + return arrayMap(value, baseToString) + ''; + } + if (isSymbol(value)) { + return symbolToString ? symbolToString.call(value) : ''; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; + } + + /** + * The base implementation of `_.uniqBy` without support for iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new duplicate free array. + */ + function baseUniq(array, iteratee, comparator) { + var index = -1, + includes = arrayIncludes, + length = array.length, + isCommon = true, + result = [], + seen = result; + + if (comparator) { + isCommon = false; + includes = arrayIncludesWith; + } + else if (length >= LARGE_ARRAY_SIZE) { + var set = iteratee ? null : createSet(array); + if (set) { + return setToArray(set); + } + isCommon = false; + includes = cacheHas; + seen = new SetCache; + } + else { + seen = iteratee ? [] : result; + } + outer: + while (++index < length) { + var value = array[index], + computed = iteratee ? iteratee(value) : value; + + value = (comparator || value !== 0) ? value : 0; + if (isCommon && computed === computed) { + var seenIndex = seen.length; + while (seenIndex--) { + if (seen[seenIndex] === computed) { + continue outer; + } + } + if (iteratee) { + seen.push(computed); + } + result.push(value); + } + else if (!includes(seen, computed, comparator)) { + if (seen !== result) { + seen.push(computed); + } + result.push(value); + } + } + return result; + } + + /** + * The base implementation of `_.unset`. + * + * @private + * @param {Object} object The object to modify. + * @param {Array|string} path The property path to unset. + * @returns {boolean} Returns `true` if the property is deleted, else `false`. + */ + function baseUnset(object, path) { + path = castPath(path, object); + object = parent(object, path); + return object == null || delete object[toKey(last(path))]; + } + + /** + * The base implementation of `_.update`. + * + * @private + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to update. + * @param {Function} updater The function to produce the updated value. + * @param {Function} [customizer] The function to customize path creation. + * @returns {Object} Returns `object`. + */ + function baseUpdate(object, path, updater, customizer) { + return baseSet(object, path, updater(baseGet(object, path)), customizer); + } + + /** + * The base implementation of methods like `_.dropWhile` and `_.takeWhile` + * without support for iteratee shorthands. + * + * @private + * @param {Array} array The array to query. + * @param {Function} predicate The function invoked per iteration. + * @param {boolean} [isDrop] Specify dropping elements instead of taking them. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Array} Returns the slice of `array`. + */ + function baseWhile(array, predicate, isDrop, fromRight) { + var length = array.length, + index = fromRight ? length : -1; + + while ((fromRight ? index-- : ++index < length) && + predicate(array[index], index, array)) {} + + return isDrop + ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length)) + : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index)); + } + + /** + * The base implementation of `wrapperValue` which returns the result of + * performing a sequence of actions on the unwrapped `value`, where each + * successive action is supplied the return value of the previous. + * + * @private + * @param {*} value The unwrapped value. + * @param {Array} actions Actions to perform to resolve the unwrapped value. + * @returns {*} Returns the resolved value. + */ + function baseWrapperValue(value, actions) { + var result = value; + if (result instanceof LazyWrapper) { + result = result.value(); + } + return arrayReduce(actions, function(result, action) { + return action.func.apply(action.thisArg, arrayPush([result], action.args)); + }, result); + } + + /** + * The base implementation of methods like `_.xor`, without support for + * iteratee shorthands, that accepts an array of arrays to inspect. + * + * @private + * @param {Array} arrays The arrays to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of values. + */ + function baseXor(arrays, iteratee, comparator) { + var length = arrays.length; + if (length < 2) { + return length ? baseUniq(arrays[0]) : []; + } + var index = -1, + result = Array(length); + + while (++index < length) { + var array = arrays[index], + othIndex = -1; + + while (++othIndex < length) { + if (othIndex != index) { + result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator); + } + } + } + return baseUniq(baseFlatten(result, 1), iteratee, comparator); + } + + /** + * This base implementation of `_.zipObject` which assigns values using `assignFunc`. + * + * @private + * @param {Array} props The property identifiers. + * @param {Array} values The property values. + * @param {Function} assignFunc The function to assign values. + * @returns {Object} Returns the new object. + */ + function baseZipObject(props, values, assignFunc) { + var index = -1, + length = props.length, + valsLength = values.length, + result = {}; + + while (++index < length) { + var value = index < valsLength ? values[index] : undefined; + assignFunc(result, props[index], value); + } + return result; + } + + /** + * Casts `value` to an empty array if it's not an array like object. + * + * @private + * @param {*} value The value to inspect. + * @returns {Array|Object} Returns the cast array-like object. + */ + function castArrayLikeObject(value) { + return isArrayLikeObject(value) ? value : []; + } + + /** + * Casts `value` to `identity` if it's not a function. + * + * @private + * @param {*} value The value to inspect. + * @returns {Function} Returns cast function. + */ + function castFunction(value) { + return typeof value == 'function' ? value : identity; + } + + /** + * Casts `value` to a path array if it's not one. + * + * @private + * @param {*} value The value to inspect. + * @param {Object} [object] The object to query keys on. + * @returns {Array} Returns the cast property path array. + */ + function castPath(value, object) { + if (isArray(value)) { + return value; + } + return isKey(value, object) ? [value] : stringToPath(toString(value)); + } + + /** + * A `baseRest` alias which can be replaced with `identity` by module + * replacement plugins. + * + * @private + * @type {Function} + * @param {Function} func The function to apply a rest parameter to. + * @returns {Function} Returns the new function. + */ + var castRest = baseRest; + + /** + * Casts `array` to a slice if it's needed. + * + * @private + * @param {Array} array The array to inspect. + * @param {number} start The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the cast slice. + */ + function castSlice(array, start, end) { + var length = array.length; + end = end === undefined ? length : end; + return (!start && end >= length) ? array : baseSlice(array, start, end); + } + + /** + * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout). + * + * @private + * @param {number|Object} id The timer id or timeout object of the timer to clear. + */ + var clearTimeout = ctxClearTimeout || function(id) { + return root.clearTimeout(id); + }; + + /** + * Creates a clone of `buffer`. + * + * @private + * @param {Buffer} buffer The buffer to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Buffer} Returns the cloned buffer. + */ + function cloneBuffer(buffer, isDeep) { + if (isDeep) { + return buffer.slice(); + } + var length = buffer.length, + result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length); + + buffer.copy(result); + return result; + } + + /** + * Creates a clone of `arrayBuffer`. + * + * @private + * @param {ArrayBuffer} arrayBuffer The array buffer to clone. + * @returns {ArrayBuffer} Returns the cloned array buffer. + */ + function cloneArrayBuffer(arrayBuffer) { + var result = new arrayBuffer.constructor(arrayBuffer.byteLength); + new Uint8Array(result).set(new Uint8Array(arrayBuffer)); + return result; + } + + /** + * Creates a clone of `dataView`. + * + * @private + * @param {Object} dataView The data view to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the cloned data view. + */ + function cloneDataView(dataView, isDeep) { + var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer; + return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength); + } + + /** + * Creates a clone of `regexp`. + * + * @private + * @param {Object} regexp The regexp to clone. + * @returns {Object} Returns the cloned regexp. + */ + function cloneRegExp(regexp) { + var result = new regexp.constructor(regexp.source, reFlags.exec(regexp)); + result.lastIndex = regexp.lastIndex; + return result; + } + + /** + * Creates a clone of the `symbol` object. + * + * @private + * @param {Object} symbol The symbol object to clone. + * @returns {Object} Returns the cloned symbol object. + */ + function cloneSymbol(symbol) { + return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {}; + } + + /** + * Creates a clone of `typedArray`. + * + * @private + * @param {Object} typedArray The typed array to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the cloned typed array. + */ + function cloneTypedArray(typedArray, isDeep) { + var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer; + return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length); + } + + /** + * Compares values to sort them in ascending order. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {number} Returns the sort order indicator for `value`. + */ + function compareAscending(value, other) { + if (value !== other) { + var valIsDefined = value !== undefined, + valIsNull = value === null, + valIsReflexive = value === value, + valIsSymbol = isSymbol(value); + + var othIsDefined = other !== undefined, + othIsNull = other === null, + othIsReflexive = other === other, + othIsSymbol = isSymbol(other); + + if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) || + (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) || + (valIsNull && othIsDefined && othIsReflexive) || + (!valIsDefined && othIsReflexive) || + !valIsReflexive) { + return 1; + } + if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) || + (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) || + (othIsNull && valIsDefined && valIsReflexive) || + (!othIsDefined && valIsReflexive) || + !othIsReflexive) { + return -1; + } + } + return 0; + } + + /** + * Used by `_.orderBy` to compare multiple properties of a value to another + * and stable sort them. + * + * If `orders` is unspecified, all values are sorted in ascending order. Otherwise, + * specify an order of "desc" for descending or "asc" for ascending sort order + * of corresponding values. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {boolean[]|string[]} orders The order to sort by for each property. + * @returns {number} Returns the sort order indicator for `object`. + */ + function compareMultiple(object, other, orders) { + var index = -1, + objCriteria = object.criteria, + othCriteria = other.criteria, + length = objCriteria.length, + ordersLength = orders.length; + + while (++index < length) { + var result = compareAscending(objCriteria[index], othCriteria[index]); + if (result) { + if (index >= ordersLength) { + return result; + } + var order = orders[index]; + return result * (order == 'desc' ? -1 : 1); + } + } + // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications + // that causes it, under certain circumstances, to provide the same value for + // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247 + // for more details. + // + // This also ensures a stable sort in V8 and other engines. + // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details. + return object.index - other.index; + } + + /** + * Creates an array that is the composition of partially applied arguments, + * placeholders, and provided arguments into a single array of arguments. + * + * @private + * @param {Array} args The provided arguments. + * @param {Array} partials The arguments to prepend to those provided. + * @param {Array} holders The `partials` placeholder indexes. + * @params {boolean} [isCurried] Specify composing for a curried function. + * @returns {Array} Returns the new array of composed arguments. + */ + function composeArgs(args, partials, holders, isCurried) { + var argsIndex = -1, + argsLength = args.length, + holdersLength = holders.length, + leftIndex = -1, + leftLength = partials.length, + rangeLength = nativeMax(argsLength - holdersLength, 0), + result = Array(leftLength + rangeLength), + isUncurried = !isCurried; + + while (++leftIndex < leftLength) { + result[leftIndex] = partials[leftIndex]; + } + while (++argsIndex < holdersLength) { + if (isUncurried || argsIndex < argsLength) { + result[holders[argsIndex]] = args[argsIndex]; + } + } + while (rangeLength--) { + result[leftIndex++] = args[argsIndex++]; + } + return result; + } + + /** + * This function is like `composeArgs` except that the arguments composition + * is tailored for `_.partialRight`. + * + * @private + * @param {Array} args The provided arguments. + * @param {Array} partials The arguments to append to those provided. + * @param {Array} holders The `partials` placeholder indexes. + * @params {boolean} [isCurried] Specify composing for a curried function. + * @returns {Array} Returns the new array of composed arguments. + */ + function composeArgsRight(args, partials, holders, isCurried) { + var argsIndex = -1, + argsLength = args.length, + holdersIndex = -1, + holdersLength = holders.length, + rightIndex = -1, + rightLength = partials.length, + rangeLength = nativeMax(argsLength - holdersLength, 0), + result = Array(rangeLength + rightLength), + isUncurried = !isCurried; + + while (++argsIndex < rangeLength) { + result[argsIndex] = args[argsIndex]; + } + var offset = argsIndex; + while (++rightIndex < rightLength) { + result[offset + rightIndex] = partials[rightIndex]; + } + while (++holdersIndex < holdersLength) { + if (isUncurried || argsIndex < argsLength) { + result[offset + holders[holdersIndex]] = args[argsIndex++]; + } + } + return result; + } + + /** + * Copies the values of `source` to `array`. + * + * @private + * @param {Array} source The array to copy values from. + * @param {Array} [array=[]] The array to copy values to. + * @returns {Array} Returns `array`. + */ + function copyArray(source, array) { + var index = -1, + length = source.length; + + array || (array = Array(length)); + while (++index < length) { + array[index] = source[index]; + } + return array; + } + + /** + * Copies properties of `source` to `object`. + * + * @private + * @param {Object} source The object to copy properties from. + * @param {Array} props The property identifiers to copy. + * @param {Object} [object={}] The object to copy properties to. + * @param {Function} [customizer] The function to customize copied values. + * @returns {Object} Returns `object`. + */ + function copyObject(source, props, object, customizer) { + var isNew = !object; + object || (object = {}); + + var index = -1, + length = props.length; + + while (++index < length) { + var key = props[index]; + + var newValue = customizer + ? customizer(object[key], source[key], key, object, source) + : undefined; + + if (newValue === undefined) { + newValue = source[key]; + } + if (isNew) { + baseAssignValue(object, key, newValue); + } else { + assignValue(object, key, newValue); + } + } + return object; + } + + /** + * Copies own symbols of `source` to `object`. + * + * @private + * @param {Object} source The object to copy symbols from. + * @param {Object} [object={}] The object to copy symbols to. + * @returns {Object} Returns `object`. + */ + function copySymbols(source, object) { + return copyObject(source, getSymbols(source), object); + } + + /** + * Copies own and inherited symbols of `source` to `object`. + * + * @private + * @param {Object} source The object to copy symbols from. + * @param {Object} [object={}] The object to copy symbols to. + * @returns {Object} Returns `object`. + */ + function copySymbolsIn(source, object) { + return copyObject(source, getSymbolsIn(source), object); + } + + /** + * Creates a function like `_.groupBy`. + * + * @private + * @param {Function} setter The function to set accumulator values. + * @param {Function} [initializer] The accumulator object initializer. + * @returns {Function} Returns the new aggregator function. + */ + function createAggregator(setter, initializer) { + return function(collection, iteratee) { + var func = isArray(collection) ? arrayAggregator : baseAggregator, + accumulator = initializer ? initializer() : {}; + + return func(collection, setter, getIteratee(iteratee, 2), accumulator); + }; + } + + /** + * Creates a function like `_.assign`. + * + * @private + * @param {Function} assigner The function to assign values. + * @returns {Function} Returns the new assigner function. + */ + function createAssigner(assigner) { + return baseRest(function(object, sources) { + var index = -1, + length = sources.length, + customizer = length > 1 ? sources[length - 1] : undefined, + guard = length > 2 ? sources[2] : undefined; + + customizer = (assigner.length > 3 && typeof customizer == 'function') + ? (length--, customizer) + : undefined; + + if (guard && isIterateeCall(sources[0], sources[1], guard)) { + customizer = length < 3 ? undefined : customizer; + length = 1; + } + object = Object(object); + while (++index < length) { + var source = sources[index]; + if (source) { + assigner(object, source, index, customizer); + } + } + return object; + }); + } + + /** + * Creates a `baseEach` or `baseEachRight` function. + * + * @private + * @param {Function} eachFunc The function to iterate over a collection. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ + function createBaseEach(eachFunc, fromRight) { + return function(collection, iteratee) { + if (collection == null) { + return collection; + } + if (!isArrayLike(collection)) { + return eachFunc(collection, iteratee); + } + var length = collection.length, + index = fromRight ? length : -1, + iterable = Object(collection); + + while ((fromRight ? index-- : ++index < length)) { + if (iteratee(iterable[index], index, iterable) === false) { + break; + } + } + return collection; + }; + } + + /** + * Creates a base function for methods like `_.forIn` and `_.forOwn`. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ + function createBaseFor(fromRight) { + return function(object, iteratee, keysFunc) { + var index = -1, + iterable = Object(object), + props = keysFunc(object), + length = props.length; + + while (length--) { + var key = props[fromRight ? length : ++index]; + if (iteratee(iterable[key], key, iterable) === false) { + break; + } + } + return object; + }; + } + + /** + * Creates a function that wraps `func` to invoke it with the optional `this` + * binding of `thisArg`. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {*} [thisArg] The `this` binding of `func`. + * @returns {Function} Returns the new wrapped function. + */ + function createBind(func, bitmask, thisArg) { + var isBind = bitmask & WRAP_BIND_FLAG, + Ctor = createCtor(func); + + function wrapper() { + var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; + return fn.apply(isBind ? thisArg : this, arguments); + } + return wrapper; + } + + /** + * Creates a function like `_.lowerFirst`. + * + * @private + * @param {string} methodName The name of the `String` case method to use. + * @returns {Function} Returns the new case function. + */ + function createCaseFirst(methodName) { + return function(string) { + string = toString(string); + + var strSymbols = hasUnicode(string) + ? stringToArray(string) + : undefined; + + var chr = strSymbols + ? strSymbols[0] + : string.charAt(0); + + var trailing = strSymbols + ? castSlice(strSymbols, 1).join('') + : string.slice(1); + + return chr[methodName]() + trailing; + }; + } + + /** + * Creates a function like `_.camelCase`. + * + * @private + * @param {Function} callback The function to combine each word. + * @returns {Function} Returns the new compounder function. + */ + function createCompounder(callback) { + return function(string) { + return arrayReduce(words(deburr(string).replace(reApos, '')), callback, ''); + }; + } + + /** + * Creates a function that produces an instance of `Ctor` regardless of + * whether it was invoked as part of a `new` expression or by `call` or `apply`. + * + * @private + * @param {Function} Ctor The constructor to wrap. + * @returns {Function} Returns the new wrapped function. + */ + function createCtor(Ctor) { + return function() { + // Use a `switch` statement to work with class constructors. See + // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist + // for more details. + var args = arguments; + switch (args.length) { + case 0: return new Ctor; + case 1: return new Ctor(args[0]); + case 2: return new Ctor(args[0], args[1]); + case 3: return new Ctor(args[0], args[1], args[2]); + case 4: return new Ctor(args[0], args[1], args[2], args[3]); + case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]); + case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]); + case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); + } + var thisBinding = baseCreate(Ctor.prototype), + result = Ctor.apply(thisBinding, args); + + // Mimic the constructor's `return` behavior. + // See https://es5.github.io/#x13.2.2 for more details. + return isObject(result) ? result : thisBinding; + }; + } + + /** + * Creates a function that wraps `func` to enable currying. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {number} arity The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ + function createCurry(func, bitmask, arity) { + var Ctor = createCtor(func); + + function wrapper() { + var length = arguments.length, + args = Array(length), + index = length, + placeholder = getHolder(wrapper); + + while (index--) { + args[index] = arguments[index]; + } + var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder) + ? [] + : replaceHolders(args, placeholder); + + length -= holders.length; + if (length < arity) { + return createRecurry( + func, bitmask, createHybrid, wrapper.placeholder, undefined, + args, holders, undefined, undefined, arity - length); + } + var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; + return apply(fn, this, args); + } + return wrapper; + } + + /** + * Creates a `_.find` or `_.findLast` function. + * + * @private + * @param {Function} findIndexFunc The function to find the collection index. + * @returns {Function} Returns the new find function. + */ + function createFind(findIndexFunc) { + return function(collection, predicate, fromIndex) { + var iterable = Object(collection); + if (!isArrayLike(collection)) { + var iteratee = getIteratee(predicate, 3); + collection = keys(collection); + predicate = function(key) { return iteratee(iterable[key], key, iterable); }; + } + var index = findIndexFunc(collection, predicate, fromIndex); + return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined; + }; + } + + /** + * Creates a `_.flow` or `_.flowRight` function. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new flow function. + */ + function createFlow(fromRight) { + return flatRest(function(funcs) { + var length = funcs.length, + index = length, + prereq = LodashWrapper.prototype.thru; + + if (fromRight) { + funcs.reverse(); + } + while (index--) { + var func = funcs[index]; + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + if (prereq && !wrapper && getFuncName(func) == 'wrapper') { + var wrapper = new LodashWrapper([], true); + } + } + index = wrapper ? index : length; + while (++index < length) { + func = funcs[index]; + + var funcName = getFuncName(func), + data = funcName == 'wrapper' ? getData(func) : undefined; + + if (data && isLaziable(data[0]) && + data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) && + !data[4].length && data[9] == 1 + ) { + wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]); + } else { + wrapper = (func.length == 1 && isLaziable(func)) + ? wrapper[funcName]() + : wrapper.thru(func); + } + } + return function() { + var args = arguments, + value = args[0]; + + if (wrapper && args.length == 1 && isArray(value)) { + return wrapper.plant(value).value(); + } + var index = 0, + result = length ? funcs[index].apply(this, args) : value; + + while (++index < length) { + result = funcs[index].call(this, result); + } + return result; + }; + }); + } + + /** + * Creates a function that wraps `func` to invoke it with optional `this` + * binding of `thisArg`, partial application, and currying. + * + * @private + * @param {Function|string} func The function or method name to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {*} [thisArg] The `this` binding of `func`. + * @param {Array} [partials] The arguments to prepend to those provided to + * the new function. + * @param {Array} [holders] The `partials` placeholder indexes. + * @param {Array} [partialsRight] The arguments to append to those provided + * to the new function. + * @param {Array} [holdersRight] The `partialsRight` placeholder indexes. + * @param {Array} [argPos] The argument positions of the new function. + * @param {number} [ary] The arity cap of `func`. + * @param {number} [arity] The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ + function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) { + var isAry = bitmask & WRAP_ARY_FLAG, + isBind = bitmask & WRAP_BIND_FLAG, + isBindKey = bitmask & WRAP_BIND_KEY_FLAG, + isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG), + isFlip = bitmask & WRAP_FLIP_FLAG, + Ctor = isBindKey ? undefined : createCtor(func); + + function wrapper() { + var length = arguments.length, + args = Array(length), + index = length; + + while (index--) { + args[index] = arguments[index]; + } + if (isCurried) { + var placeholder = getHolder(wrapper), + holdersCount = countHolders(args, placeholder); + } + if (partials) { + args = composeArgs(args, partials, holders, isCurried); + } + if (partialsRight) { + args = composeArgsRight(args, partialsRight, holdersRight, isCurried); + } + length -= holdersCount; + if (isCurried && length < arity) { + var newHolders = replaceHolders(args, placeholder); + return createRecurry( + func, bitmask, createHybrid, wrapper.placeholder, thisArg, + args, newHolders, argPos, ary, arity - length + ); + } + var thisBinding = isBind ? thisArg : this, + fn = isBindKey ? thisBinding[func] : func; + + length = args.length; + if (argPos) { + args = reorder(args, argPos); + } else if (isFlip && length > 1) { + args.reverse(); + } + if (isAry && ary < length) { + args.length = ary; + } + if (this && this !== root && this instanceof wrapper) { + fn = Ctor || createCtor(fn); + } + return fn.apply(thisBinding, args); + } + return wrapper; + } + + /** + * Creates a function like `_.invertBy`. + * + * @private + * @param {Function} setter The function to set accumulator values. + * @param {Function} toIteratee The function to resolve iteratees. + * @returns {Function} Returns the new inverter function. + */ + function createInverter(setter, toIteratee) { + return function(object, iteratee) { + return baseInverter(object, setter, toIteratee(iteratee), {}); + }; + } + + /** + * Creates a function that performs a mathematical operation on two values. + * + * @private + * @param {Function} operator The function to perform the operation. + * @param {number} [defaultValue] The value used for `undefined` arguments. + * @returns {Function} Returns the new mathematical operation function. + */ + function createMathOperation(operator, defaultValue) { + return function(value, other) { + var result; + if (value === undefined && other === undefined) { + return defaultValue; + } + if (value !== undefined) { + result = value; + } + if (other !== undefined) { + if (result === undefined) { + return other; + } + if (typeof value == 'string' || typeof other == 'string') { + value = baseToString(value); + other = baseToString(other); + } else { + value = baseToNumber(value); + other = baseToNumber(other); + } + result = operator(value, other); + } + return result; + }; + } + + /** + * Creates a function like `_.over`. + * + * @private + * @param {Function} arrayFunc The function to iterate over iteratees. + * @returns {Function} Returns the new over function. + */ + function createOver(arrayFunc) { + return flatRest(function(iteratees) { + iteratees = arrayMap(iteratees, baseUnary(getIteratee())); + return baseRest(function(args) { + var thisArg = this; + return arrayFunc(iteratees, function(iteratee) { + return apply(iteratee, thisArg, args); + }); + }); + }); + } + + /** + * Creates the padding for `string` based on `length`. The `chars` string + * is truncated if the number of characters exceeds `length`. + * + * @private + * @param {number} length The padding length. + * @param {string} [chars=' '] The string used as padding. + * @returns {string} Returns the padding for `string`. + */ + function createPadding(length, chars) { + chars = chars === undefined ? ' ' : baseToString(chars); + + var charsLength = chars.length; + if (charsLength < 2) { + return charsLength ? baseRepeat(chars, length) : chars; + } + var result = baseRepeat(chars, nativeCeil(length / stringSize(chars))); + return hasUnicode(chars) + ? castSlice(stringToArray(result), 0, length).join('') + : result.slice(0, length); + } + + /** + * Creates a function that wraps `func` to invoke it with the `this` binding + * of `thisArg` and `partials` prepended to the arguments it receives. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {*} thisArg The `this` binding of `func`. + * @param {Array} partials The arguments to prepend to those provided to + * the new function. + * @returns {Function} Returns the new wrapped function. + */ + function createPartial(func, bitmask, thisArg, partials) { + var isBind = bitmask & WRAP_BIND_FLAG, + Ctor = createCtor(func); + + function wrapper() { + var argsIndex = -1, + argsLength = arguments.length, + leftIndex = -1, + leftLength = partials.length, + args = Array(leftLength + argsLength), + fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; + + while (++leftIndex < leftLength) { + args[leftIndex] = partials[leftIndex]; + } + while (argsLength--) { + args[leftIndex++] = arguments[++argsIndex]; + } + return apply(fn, isBind ? thisArg : this, args); + } + return wrapper; + } + + /** + * Creates a `_.range` or `_.rangeRight` function. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new range function. + */ + function createRange(fromRight) { + return function(start, end, step) { + if (step && typeof step != 'number' && isIterateeCall(start, end, step)) { + end = step = undefined; + } + // Ensure the sign of `-0` is preserved. + start = toFinite(start); + if (end === undefined) { + end = start; + start = 0; + } else { + end = toFinite(end); + } + step = step === undefined ? (start < end ? 1 : -1) : toFinite(step); + return baseRange(start, end, step, fromRight); + }; + } + + /** + * Creates a function that performs a relational operation on two values. + * + * @private + * @param {Function} operator The function to perform the operation. + * @returns {Function} Returns the new relational operation function. + */ + function createRelationalOperation(operator) { + return function(value, other) { + if (!(typeof value == 'string' && typeof other == 'string')) { + value = toNumber(value); + other = toNumber(other); + } + return operator(value, other); + }; + } + + /** + * Creates a function that wraps `func` to continue currying. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {Function} wrapFunc The function to create the `func` wrapper. + * @param {*} placeholder The placeholder value. + * @param {*} [thisArg] The `this` binding of `func`. + * @param {Array} [partials] The arguments to prepend to those provided to + * the new function. + * @param {Array} [holders] The `partials` placeholder indexes. + * @param {Array} [argPos] The argument positions of the new function. + * @param {number} [ary] The arity cap of `func`. + * @param {number} [arity] The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ + function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) { + var isCurry = bitmask & WRAP_CURRY_FLAG, + newHolders = isCurry ? holders : undefined, + newHoldersRight = isCurry ? undefined : holders, + newPartials = isCurry ? partials : undefined, + newPartialsRight = isCurry ? undefined : partials; + + bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG); + bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG); + + if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) { + bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG); + } + var newData = [ + func, bitmask, thisArg, newPartials, newHolders, newPartialsRight, + newHoldersRight, argPos, ary, arity + ]; + + var result = wrapFunc.apply(undefined, newData); + if (isLaziable(func)) { + setData(result, newData); + } + result.placeholder = placeholder; + return setWrapToString(result, func, bitmask); + } + + /** + * Creates a function like `_.round`. + * + * @private + * @param {string} methodName The name of the `Math` method to use when rounding. + * @returns {Function} Returns the new round function. + */ + function createRound(methodName) { + var func = Math[methodName]; + return function(number, precision) { + number = toNumber(number); + precision = precision == null ? 0 : nativeMin(toInteger(precision), 292); + if (precision && nativeIsFinite(number)) { + // Shift with exponential notation to avoid floating-point issues. + // See [MDN](https://mdn.io/round#Examples) for more details. + var pair = (toString(number) + 'e').split('e'), + value = func(pair[0] + 'e' + (+pair[1] + precision)); + + pair = (toString(value) + 'e').split('e'); + return +(pair[0] + 'e' + (+pair[1] - precision)); + } + return func(number); + }; + } + + /** + * Creates a set object of `values`. + * + * @private + * @param {Array} values The values to add to the set. + * @returns {Object} Returns the new set. + */ + var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) { + return new Set(values); + }; + + /** + * Creates a `_.toPairs` or `_.toPairsIn` function. + * + * @private + * @param {Function} keysFunc The function to get the keys of a given object. + * @returns {Function} Returns the new pairs function. + */ + function createToPairs(keysFunc) { + return function(object) { + var tag = getTag(object); + if (tag == mapTag) { + return mapToArray(object); + } + if (tag == setTag) { + return setToPairs(object); + } + return baseToPairs(object, keysFunc(object)); + }; + } + + /** + * Creates a function that either curries or invokes `func` with optional + * `this` binding and partially applied arguments. + * + * @private + * @param {Function|string} func The function or method name to wrap. + * @param {number} bitmask The bitmask flags. + * 1 - `_.bind` + * 2 - `_.bindKey` + * 4 - `_.curry` or `_.curryRight` of a bound function + * 8 - `_.curry` + * 16 - `_.curryRight` + * 32 - `_.partial` + * 64 - `_.partialRight` + * 128 - `_.rearg` + * 256 - `_.ary` + * 512 - `_.flip` + * @param {*} [thisArg] The `this` binding of `func`. + * @param {Array} [partials] The arguments to be partially applied. + * @param {Array} [holders] The `partials` placeholder indexes. + * @param {Array} [argPos] The argument positions of the new function. + * @param {number} [ary] The arity cap of `func`. + * @param {number} [arity] The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ + function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) { + var isBindKey = bitmask & WRAP_BIND_KEY_FLAG; + if (!isBindKey && typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + var length = partials ? partials.length : 0; + if (!length) { + bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG); + partials = holders = undefined; + } + ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0); + arity = arity === undefined ? arity : toInteger(arity); + length -= holders ? holders.length : 0; + + if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) { + var partialsRight = partials, + holdersRight = holders; + + partials = holders = undefined; + } + var data = isBindKey ? undefined : getData(func); + + var newData = [ + func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, + argPos, ary, arity + ]; + + if (data) { + mergeData(newData, data); + } + func = newData[0]; + bitmask = newData[1]; + thisArg = newData[2]; + partials = newData[3]; + holders = newData[4]; + arity = newData[9] = newData[9] === undefined + ? (isBindKey ? 0 : func.length) + : nativeMax(newData[9] - length, 0); + + if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) { + bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG); + } + if (!bitmask || bitmask == WRAP_BIND_FLAG) { + var result = createBind(func, bitmask, thisArg); + } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) { + result = createCurry(func, bitmask, arity); + } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) { + result = createPartial(func, bitmask, thisArg, partials); + } else { + result = createHybrid.apply(undefined, newData); + } + var setter = data ? baseSetData : setData; + return setWrapToString(setter(result, newData), func, bitmask); + } + + /** + * Used by `_.defaults` to customize its `_.assignIn` use to assign properties + * of source objects to the destination object for all destination properties + * that resolve to `undefined`. + * + * @private + * @param {*} objValue The destination value. + * @param {*} srcValue The source value. + * @param {string} key The key of the property to assign. + * @param {Object} object The parent object of `objValue`. + * @returns {*} Returns the value to assign. + */ + function customDefaultsAssignIn(objValue, srcValue, key, object) { + if (objValue === undefined || + (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) { + return srcValue; + } + return objValue; + } + + /** + * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source + * objects into destination objects that are passed thru. + * + * @private + * @param {*} objValue The destination value. + * @param {*} srcValue The source value. + * @param {string} key The key of the property to merge. + * @param {Object} object The parent object of `objValue`. + * @param {Object} source The parent object of `srcValue`. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + * @returns {*} Returns the value to assign. + */ + function customDefaultsMerge(objValue, srcValue, key, object, source, stack) { + if (isObject(objValue) && isObject(srcValue)) { + // Recursively merge objects and arrays (susceptible to call stack limits). + stack.set(srcValue, objValue); + baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack); + stack['delete'](srcValue); + } + return objValue; + } + + /** + * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain + * objects. + * + * @private + * @param {*} value The value to inspect. + * @param {string} key The key of the property to inspect. + * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`. + */ + function customOmitClone(value) { + return isPlainObject(value) ? undefined : value; + } + + /** + * A specialized version of `baseIsEqualDeep` for arrays with support for + * partial deep comparisons. + * + * @private + * @param {Array} array The array to compare. + * @param {Array} other The other array to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `array` and `other` objects. + * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. + */ + function equalArrays(array, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG, + arrLength = array.length, + othLength = other.length; + + if (arrLength != othLength && !(isPartial && othLength > arrLength)) { + return false; + } + // Check that cyclic values are equal. + var arrStacked = stack.get(array); + var othStacked = stack.get(other); + if (arrStacked && othStacked) { + return arrStacked == other && othStacked == array; + } + var index = -1, + result = true, + seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined; + + stack.set(array, other); + stack.set(other, array); + + // Ignore non-index properties. + while (++index < arrLength) { + var arrValue = array[index], + othValue = other[index]; + + if (customizer) { + var compared = isPartial + ? customizer(othValue, arrValue, index, other, array, stack) + : customizer(arrValue, othValue, index, array, other, stack); + } + if (compared !== undefined) { + if (compared) { + continue; + } + result = false; + break; + } + // Recursively compare arrays (susceptible to call stack limits). + if (seen) { + if (!arraySome(other, function(othValue, othIndex) { + if (!cacheHas(seen, othIndex) && + (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) { + return seen.push(othIndex); + } + })) { + result = false; + break; + } + } else if (!( + arrValue === othValue || + equalFunc(arrValue, othValue, bitmask, customizer, stack) + )) { + result = false; + break; + } + } + stack['delete'](array); + stack['delete'](other); + return result; + } + + /** + * A specialized version of `baseIsEqualDeep` for comparing objects of + * the same `toStringTag`. + * + * **Note:** This function only supports comparing values with tags of + * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {string} tag The `toStringTag` of the objects to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ + function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) { + switch (tag) { + case dataViewTag: + if ((object.byteLength != other.byteLength) || + (object.byteOffset != other.byteOffset)) { + return false; + } + object = object.buffer; + other = other.buffer; + + case arrayBufferTag: + if ((object.byteLength != other.byteLength) || + !equalFunc(new Uint8Array(object), new Uint8Array(other))) { + return false; + } + return true; + + case boolTag: + case dateTag: + case numberTag: + // Coerce booleans to `1` or `0` and dates to milliseconds. + // Invalid dates are coerced to `NaN`. + return eq(+object, +other); + + case errorTag: + return object.name == other.name && object.message == other.message; + + case regexpTag: + case stringTag: + // Coerce regexes to strings and treat strings, primitives and objects, + // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring + // for more details. + return object == (other + ''); + + case mapTag: + var convert = mapToArray; + + case setTag: + var isPartial = bitmask & COMPARE_PARTIAL_FLAG; + convert || (convert = setToArray); + + if (object.size != other.size && !isPartial) { + return false; + } + // Assume cyclic values are equal. + var stacked = stack.get(object); + if (stacked) { + return stacked == other; + } + bitmask |= COMPARE_UNORDERED_FLAG; + + // Recursively compare objects (susceptible to call stack limits). + stack.set(object, other); + var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack); + stack['delete'](object); + return result; + + case symbolTag: + if (symbolValueOf) { + return symbolValueOf.call(object) == symbolValueOf.call(other); + } + } + return false; + } + + /** + * A specialized version of `baseIsEqualDeep` for objects with support for + * partial deep comparisons. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ + function equalObjects(object, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG, + objProps = getAllKeys(object), + objLength = objProps.length, + othProps = getAllKeys(other), + othLength = othProps.length; + + if (objLength != othLength && !isPartial) { + return false; + } + var index = objLength; + while (index--) { + var key = objProps[index]; + if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) { + return false; + } + } + // Check that cyclic values are equal. + var objStacked = stack.get(object); + var othStacked = stack.get(other); + if (objStacked && othStacked) { + return objStacked == other && othStacked == object; + } + var result = true; + stack.set(object, other); + stack.set(other, object); + + var skipCtor = isPartial; + while (++index < objLength) { + key = objProps[index]; + var objValue = object[key], + othValue = other[key]; + + if (customizer) { + var compared = isPartial + ? customizer(othValue, objValue, key, other, object, stack) + : customizer(objValue, othValue, key, object, other, stack); + } + // Recursively compare objects (susceptible to call stack limits). + if (!(compared === undefined + ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack)) + : compared + )) { + result = false; + break; + } + skipCtor || (skipCtor = key == 'constructor'); + } + if (result && !skipCtor) { + var objCtor = object.constructor, + othCtor = other.constructor; + + // Non `Object` object instances with different constructors are not equal. + if (objCtor != othCtor && + ('constructor' in object && 'constructor' in other) && + !(typeof objCtor == 'function' && objCtor instanceof objCtor && + typeof othCtor == 'function' && othCtor instanceof othCtor)) { + result = false; + } + } + stack['delete'](object); + stack['delete'](other); + return result; + } + + /** + * A specialized version of `baseRest` which flattens the rest array. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @returns {Function} Returns the new function. + */ + function flatRest(func) { + return setToString(overRest(func, undefined, flatten), func + ''); + } + + /** + * Creates an array of own enumerable property names and symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names and symbols. + */ + function getAllKeys(object) { + return baseGetAllKeys(object, keys, getSymbols); + } + + /** + * Creates an array of own and inherited enumerable property names and + * symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names and symbols. + */ + function getAllKeysIn(object) { + return baseGetAllKeys(object, keysIn, getSymbolsIn); + } + + /** + * Gets metadata for `func`. + * + * @private + * @param {Function} func The function to query. + * @returns {*} Returns the metadata for `func`. + */ + var getData = !metaMap ? noop : function(func) { + return metaMap.get(func); + }; + + /** + * Gets the name of `func`. + * + * @private + * @param {Function} func The function to query. + * @returns {string} Returns the function name. + */ + function getFuncName(func) { + var result = (func.name + ''), + array = realNames[result], + length = hasOwnProperty.call(realNames, result) ? array.length : 0; + + while (length--) { + var data = array[length], + otherFunc = data.func; + if (otherFunc == null || otherFunc == func) { + return data.name; + } + } + return result; + } + + /** + * Gets the argument placeholder value for `func`. + * + * @private + * @param {Function} func The function to inspect. + * @returns {*} Returns the placeholder value. + */ + function getHolder(func) { + var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func; + return object.placeholder; + } + + /** + * Gets the appropriate "iteratee" function. If `_.iteratee` is customized, + * this function returns the custom method, otherwise it returns `baseIteratee`. + * If arguments are provided, the chosen function is invoked with them and + * its result is returned. + * + * @private + * @param {*} [value] The value to convert to an iteratee. + * @param {number} [arity] The arity of the created iteratee. + * @returns {Function} Returns the chosen function or its result. + */ + function getIteratee() { + var result = lodash.iteratee || iteratee; + result = result === iteratee ? baseIteratee : result; + return arguments.length ? result(arguments[0], arguments[1]) : result; + } + + /** + * Gets the data for `map`. + * + * @private + * @param {Object} map The map to query. + * @param {string} key The reference key. + * @returns {*} Returns the map data. + */ + function getMapData(map, key) { + var data = map.__data__; + return isKeyable(key) + ? data[typeof key == 'string' ? 'string' : 'hash'] + : data.map; + } + + /** + * Gets the property names, values, and compare flags of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the match data of `object`. + */ + function getMatchData(object) { + var result = keys(object), + length = result.length; + + while (length--) { + var key = result[length], + value = object[key]; + + result[length] = [key, value, isStrictComparable(value)]; + } + return result; + } + + /** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ + function getNative(object, key) { + var value = getValue(object, key); + return baseIsNative(value) ? value : undefined; + } + + /** + * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the raw `toStringTag`. + */ + function getRawTag(value) { + var isOwn = hasOwnProperty.call(value, symToStringTag), + tag = value[symToStringTag]; + + try { + value[symToStringTag] = undefined; + var unmasked = true; + } catch (e) {} + + var result = nativeObjectToString.call(value); + if (unmasked) { + if (isOwn) { + value[symToStringTag] = tag; + } else { + delete value[symToStringTag]; + } + } + return result; + } + + /** + * Creates an array of the own enumerable symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of symbols. + */ + var getSymbols = !nativeGetSymbols ? stubArray : function(object) { + if (object == null) { + return []; + } + object = Object(object); + return arrayFilter(nativeGetSymbols(object), function(symbol) { + return propertyIsEnumerable.call(object, symbol); + }); + }; + + /** + * Creates an array of the own and inherited enumerable symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of symbols. + */ + var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) { + var result = []; + while (object) { + arrayPush(result, getSymbols(object)); + object = getPrototype(object); + } + return result; + }; + + /** + * Gets the `toStringTag` of `value`. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ + var getTag = baseGetTag; + + // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6. + if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) || + (Map && getTag(new Map) != mapTag) || + (Promise && getTag(Promise.resolve()) != promiseTag) || + (Set && getTag(new Set) != setTag) || + (WeakMap && getTag(new WeakMap) != weakMapTag)) { + getTag = function(value) { + var result = baseGetTag(value), + Ctor = result == objectTag ? value.constructor : undefined, + ctorString = Ctor ? toSource(Ctor) : ''; + + if (ctorString) { + switch (ctorString) { + case dataViewCtorString: return dataViewTag; + case mapCtorString: return mapTag; + case promiseCtorString: return promiseTag; + case setCtorString: return setTag; + case weakMapCtorString: return weakMapTag; + } + } + return result; + }; + } + + /** + * Gets the view, applying any `transforms` to the `start` and `end` positions. + * + * @private + * @param {number} start The start of the view. + * @param {number} end The end of the view. + * @param {Array} transforms The transformations to apply to the view. + * @returns {Object} Returns an object containing the `start` and `end` + * positions of the view. + */ + function getView(start, end, transforms) { + var index = -1, + length = transforms.length; + + while (++index < length) { + var data = transforms[index], + size = data.size; + + switch (data.type) { + case 'drop': start += size; break; + case 'dropRight': end -= size; break; + case 'take': end = nativeMin(end, start + size); break; + case 'takeRight': start = nativeMax(start, end - size); break; + } + } + return { 'start': start, 'end': end }; + } + + /** + * Extracts wrapper details from the `source` body comment. + * + * @private + * @param {string} source The source to inspect. + * @returns {Array} Returns the wrapper details. + */ + function getWrapDetails(source) { + var match = source.match(reWrapDetails); + return match ? match[1].split(reSplitDetails) : []; + } + + /** + * Checks if `path` exists on `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @param {Function} hasFunc The function to check properties. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + */ + function hasPath(object, path, hasFunc) { + path = castPath(path, object); + + var index = -1, + length = path.length, + result = false; + + while (++index < length) { + var key = toKey(path[index]); + if (!(result = object != null && hasFunc(object, key))) { + break; + } + object = object[key]; + } + if (result || ++index != length) { + return result; + } + length = object == null ? 0 : object.length; + return !!length && isLength(length) && isIndex(key, length) && + (isArray(object) || isArguments(object)); + } + + /** + * Initializes an array clone. + * + * @private + * @param {Array} array The array to clone. + * @returns {Array} Returns the initialized clone. + */ + function initCloneArray(array) { + var length = array.length, + result = new array.constructor(length); + + // Add properties assigned by `RegExp#exec`. + if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) { + result.index = array.index; + result.input = array.input; + } + return result; + } + + /** + * Initializes an object clone. + * + * @private + * @param {Object} object The object to clone. + * @returns {Object} Returns the initialized clone. + */ + function initCloneObject(object) { + return (typeof object.constructor == 'function' && !isPrototype(object)) + ? baseCreate(getPrototype(object)) + : {}; + } + + /** + * Initializes an object clone based on its `toStringTag`. + * + * **Note:** This function only supports cloning values with tags of + * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`. + * + * @private + * @param {Object} object The object to clone. + * @param {string} tag The `toStringTag` of the object to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the initialized clone. + */ + function initCloneByTag(object, tag, isDeep) { + var Ctor = object.constructor; + switch (tag) { + case arrayBufferTag: + return cloneArrayBuffer(object); + + case boolTag: + case dateTag: + return new Ctor(+object); + + case dataViewTag: + return cloneDataView(object, isDeep); + + case float32Tag: case float64Tag: + case int8Tag: case int16Tag: case int32Tag: + case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag: + return cloneTypedArray(object, isDeep); + + case mapTag: + return new Ctor; + + case numberTag: + case stringTag: + return new Ctor(object); + + case regexpTag: + return cloneRegExp(object); + + case setTag: + return new Ctor; + + case symbolTag: + return cloneSymbol(object); + } + } + + /** + * Inserts wrapper `details` in a comment at the top of the `source` body. + * + * @private + * @param {string} source The source to modify. + * @returns {Array} details The details to insert. + * @returns {string} Returns the modified source. + */ + function insertWrapDetails(source, details) { + var length = details.length; + if (!length) { + return source; + } + var lastIndex = length - 1; + details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex]; + details = details.join(length > 2 ? ', ' : ' '); + return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n'); + } + + /** + * Checks if `value` is a flattenable `arguments` object or array. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is flattenable, else `false`. + */ + function isFlattenable(value) { + return isArray(value) || isArguments(value) || + !!(spreadableSymbol && value && value[spreadableSymbol]); + } + + /** + * Checks if `value` is a valid array-like index. + * + * @private + * @param {*} value The value to check. + * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. + * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. + */ + function isIndex(value, length) { + var type = typeof value; + length = length == null ? MAX_SAFE_INTEGER : length; + + return !!length && + (type == 'number' || + (type != 'symbol' && reIsUint.test(value))) && + (value > -1 && value % 1 == 0 && value < length); + } + + /** + * Checks if the given arguments are from an iteratee call. + * + * @private + * @param {*} value The potential iteratee value argument. + * @param {*} index The potential iteratee index or key argument. + * @param {*} object The potential iteratee object argument. + * @returns {boolean} Returns `true` if the arguments are from an iteratee call, + * else `false`. + */ + function isIterateeCall(value, index, object) { + if (!isObject(object)) { + return false; + } + var type = typeof index; + if (type == 'number' + ? (isArrayLike(object) && isIndex(index, object.length)) + : (type == 'string' && index in object) + ) { + return eq(object[index], value); + } + return false; + } + + /** + * Checks if `value` is a property name and not a property path. + * + * @private + * @param {*} value The value to check. + * @param {Object} [object] The object to query keys on. + * @returns {boolean} Returns `true` if `value` is a property name, else `false`. + */ + function isKey(value, object) { + if (isArray(value)) { + return false; + } + var type = typeof value; + if (type == 'number' || type == 'symbol' || type == 'boolean' || + value == null || isSymbol(value)) { + return true; + } + return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || + (object != null && value in Object(object)); + } + + /** + * Checks if `value` is suitable for use as unique object key. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is suitable, else `false`. + */ + function isKeyable(value) { + var type = typeof value; + return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') + ? (value !== '__proto__') + : (value === null); + } + + /** + * Checks if `func` has a lazy counterpart. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` has a lazy counterpart, + * else `false`. + */ + function isLaziable(func) { + var funcName = getFuncName(func), + other = lodash[funcName]; + + if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) { + return false; + } + if (func === other) { + return true; + } + var data = getData(other); + return !!data && func === data[0]; + } + + /** + * Checks if `func` has its source masked. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` is masked, else `false`. + */ + function isMasked(func) { + return !!maskSrcKey && (maskSrcKey in func); + } + + /** + * Checks if `func` is capable of being masked. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `func` is maskable, else `false`. + */ + var isMaskable = coreJsData ? isFunction : stubFalse; + + /** + * Checks if `value` is likely a prototype object. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. + */ + function isPrototype(value) { + var Ctor = value && value.constructor, + proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto; + + return value === proto; + } + + /** + * Checks if `value` is suitable for strict equality comparisons, i.e. `===`. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` if suitable for strict + * equality comparisons, else `false`. + */ + function isStrictComparable(value) { + return value === value && !isObject(value); + } + + /** + * A specialized version of `matchesProperty` for source values suitable + * for strict equality comparisons, i.e. `===`. + * + * @private + * @param {string} key The key of the property to get. + * @param {*} srcValue The value to match. + * @returns {Function} Returns the new spec function. + */ + function matchesStrictComparable(key, srcValue) { + return function(object) { + if (object == null) { + return false; + } + return object[key] === srcValue && + (srcValue !== undefined || (key in Object(object))); + }; + } + + /** + * A specialized version of `_.memoize` which clears the memoized function's + * cache when it exceeds `MAX_MEMOIZE_SIZE`. + * + * @private + * @param {Function} func The function to have its output memoized. + * @returns {Function} Returns the new memoized function. + */ + function memoizeCapped(func) { + var result = memoize(func, function(key) { + if (cache.size === MAX_MEMOIZE_SIZE) { + cache.clear(); + } + return key; + }); + + var cache = result.cache; + return result; + } + + /** + * Merges the function metadata of `source` into `data`. + * + * Merging metadata reduces the number of wrappers used to invoke a function. + * This is possible because methods like `_.bind`, `_.curry`, and `_.partial` + * may be applied regardless of execution order. Methods like `_.ary` and + * `_.rearg` modify function arguments, making the order in which they are + * executed important, preventing the merging of metadata. However, we make + * an exception for a safe combined case where curried functions have `_.ary` + * and or `_.rearg` applied. + * + * @private + * @param {Array} data The destination metadata. + * @param {Array} source The source metadata. + * @returns {Array} Returns `data`. + */ + function mergeData(data, source) { + var bitmask = data[1], + srcBitmask = source[1], + newBitmask = bitmask | srcBitmask, + isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG); + + var isCombo = + ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) || + ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) || + ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG)); + + // Exit early if metadata can't be merged. + if (!(isCommon || isCombo)) { + return data; + } + // Use source `thisArg` if available. + if (srcBitmask & WRAP_BIND_FLAG) { + data[2] = source[2]; + // Set when currying a bound function. + newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG; + } + // Compose partial arguments. + var value = source[3]; + if (value) { + var partials = data[3]; + data[3] = partials ? composeArgs(partials, value, source[4]) : value; + data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4]; + } + // Compose partial right arguments. + value = source[5]; + if (value) { + partials = data[5]; + data[5] = partials ? composeArgsRight(partials, value, source[6]) : value; + data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6]; + } + // Use source `argPos` if available. + value = source[7]; + if (value) { + data[7] = value; + } + // Use source `ary` if it's smaller. + if (srcBitmask & WRAP_ARY_FLAG) { + data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]); + } + // Use source `arity` if one is not provided. + if (data[9] == null) { + data[9] = source[9]; + } + // Use source `func` and merge bitmasks. + data[0] = source[0]; + data[1] = newBitmask; + + return data; + } + + /** + * This function is like + * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) + * except that it includes inherited enumerable properties. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ + function nativeKeysIn(object) { + var result = []; + if (object != null) { + for (var key in Object(object)) { + result.push(key); + } + } + return result; + } + + /** + * Converts `value` to a string using `Object.prototype.toString`. + * + * @private + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + */ + function objectToString(value) { + return nativeObjectToString.call(value); + } + + /** + * A specialized version of `baseRest` which transforms the rest array. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @param {Function} transform The rest array transform. + * @returns {Function} Returns the new function. + */ + function overRest(func, start, transform) { + start = nativeMax(start === undefined ? (func.length - 1) : start, 0); + return function() { + var args = arguments, + index = -1, + length = nativeMax(args.length - start, 0), + array = Array(length); + + while (++index < length) { + array[index] = args[start + index]; + } + index = -1; + var otherArgs = Array(start + 1); + while (++index < start) { + otherArgs[index] = args[index]; + } + otherArgs[start] = transform(array); + return apply(func, this, otherArgs); + }; + } + + /** + * Gets the parent value at `path` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Array} path The path to get the parent value of. + * @returns {*} Returns the parent value. + */ + function parent(object, path) { + return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1)); + } + + /** + * Reorder `array` according to the specified indexes where the element at + * the first index is assigned as the first element, the element at + * the second index is assigned as the second element, and so on. + * + * @private + * @param {Array} array The array to reorder. + * @param {Array} indexes The arranged array indexes. + * @returns {Array} Returns `array`. + */ + function reorder(array, indexes) { + var arrLength = array.length, + length = nativeMin(indexes.length, arrLength), + oldArray = copyArray(array); + + while (length--) { + var index = indexes[length]; + array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined; + } + return array; + } + + /** + * Gets the value at `key`, unless `key` is "__proto__" or "constructor". + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ + function safeGet(object, key) { + if (key === 'constructor' && typeof object[key] === 'function') { + return; + } + + if (key == '__proto__') { + return; + } + + return object[key]; + } + + /** + * Sets metadata for `func`. + * + * **Note:** If this function becomes hot, i.e. is invoked a lot in a short + * period of time, it will trip its breaker and transition to an identity + * function to avoid garbage collection pauses in V8. See + * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070) + * for more details. + * + * @private + * @param {Function} func The function to associate metadata with. + * @param {*} data The metadata. + * @returns {Function} Returns `func`. + */ + var setData = shortOut(baseSetData); + + /** + * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout). + * + * @private + * @param {Function} func The function to delay. + * @param {number} wait The number of milliseconds to delay invocation. + * @returns {number|Object} Returns the timer id or timeout object. + */ + var setTimeout = ctxSetTimeout || function(func, wait) { + return root.setTimeout(func, wait); + }; + + /** + * Sets the `toString` method of `func` to return `string`. + * + * @private + * @param {Function} func The function to modify. + * @param {Function} string The `toString` result. + * @returns {Function} Returns `func`. + */ + var setToString = shortOut(baseSetToString); + + /** + * Sets the `toString` method of `wrapper` to mimic the source of `reference` + * with wrapper details in a comment at the top of the source body. + * + * @private + * @param {Function} wrapper The function to modify. + * @param {Function} reference The reference function. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @returns {Function} Returns `wrapper`. + */ + function setWrapToString(wrapper, reference, bitmask) { + var source = (reference + ''); + return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask))); + } + + /** + * Creates a function that'll short out and invoke `identity` instead + * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN` + * milliseconds. + * + * @private + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new shortable function. + */ + function shortOut(func) { + var count = 0, + lastCalled = 0; + + return function() { + var stamp = nativeNow(), + remaining = HOT_SPAN - (stamp - lastCalled); + + lastCalled = stamp; + if (remaining > 0) { + if (++count >= HOT_COUNT) { + return arguments[0]; + } + } else { + count = 0; + } + return func.apply(undefined, arguments); + }; + } + + /** + * A specialized version of `_.shuffle` which mutates and sets the size of `array`. + * + * @private + * @param {Array} array The array to shuffle. + * @param {number} [size=array.length] The size of `array`. + * @returns {Array} Returns `array`. + */ + function shuffleSelf(array, size) { + var index = -1, + length = array.length, + lastIndex = length - 1; + + size = size === undefined ? length : size; + while (++index < size) { + var rand = baseRandom(index, lastIndex), + value = array[rand]; + + array[rand] = array[index]; + array[index] = value; + } + array.length = size; + return array; + } + + /** + * Converts `string` to a property path array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the property path array. + */ + var stringToPath = memoizeCapped(function(string) { + var result = []; + if (string.charCodeAt(0) === 46 /* . */) { + result.push(''); + } + string.replace(rePropName, function(match, number, quote, subString) { + result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match)); + }); + return result; + }); + + /** + * Converts `value` to a string key if it's not a string or symbol. + * + * @private + * @param {*} value The value to inspect. + * @returns {string|symbol} Returns the key. + */ + function toKey(value) { + if (typeof value == 'string' || isSymbol(value)) { + return value; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; + } + + /** + * Converts `func` to its source code. + * + * @private + * @param {Function} func The function to convert. + * @returns {string} Returns the source code. + */ + function toSource(func) { + if (func != null) { + try { + return funcToString.call(func); + } catch (e) {} + try { + return (func + ''); + } catch (e) {} + } + return ''; + } + + /** + * Updates wrapper `details` based on `bitmask` flags. + * + * @private + * @returns {Array} details The details to modify. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @returns {Array} Returns `details`. + */ + function updateWrapDetails(details, bitmask) { + arrayEach(wrapFlags, function(pair) { + var value = '_.' + pair[0]; + if ((bitmask & pair[1]) && !arrayIncludes(details, value)) { + details.push(value); + } + }); + return details.sort(); + } + + /** + * Creates a clone of `wrapper`. + * + * @private + * @param {Object} wrapper The wrapper to clone. + * @returns {Object} Returns the cloned wrapper. + */ + function wrapperClone(wrapper) { + if (wrapper instanceof LazyWrapper) { + return wrapper.clone(); + } + var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__); + result.__actions__ = copyArray(wrapper.__actions__); + result.__index__ = wrapper.__index__; + result.__values__ = wrapper.__values__; + return result; + } + + /*------------------------------------------------------------------------*/ + + /** + * Creates an array of elements split into groups the length of `size`. + * If `array` can't be split evenly, the final chunk will be the remaining + * elements. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to process. + * @param {number} [size=1] The length of each chunk + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the new array of chunks. + * @example + * + * _.chunk(['a', 'b', 'c', 'd'], 2); + * // => [['a', 'b'], ['c', 'd']] + * + * _.chunk(['a', 'b', 'c', 'd'], 3); + * // => [['a', 'b', 'c'], ['d']] + */ + function chunk(array, size, guard) { + if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) { + size = 1; + } else { + size = nativeMax(toInteger(size), 0); + } + var length = array == null ? 0 : array.length; + if (!length || size < 1) { + return []; + } + var index = 0, + resIndex = 0, + result = Array(nativeCeil(length / size)); + + while (index < length) { + result[resIndex++] = baseSlice(array, index, (index += size)); + } + return result; + } + + /** + * Creates an array with all falsey values removed. The values `false`, `null`, + * `0`, `""`, `undefined`, and `NaN` are falsey. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to compact. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * _.compact([0, 1, false, 2, '', 3]); + * // => [1, 2, 3] + */ + function compact(array) { + var index = -1, + length = array == null ? 0 : array.length, + resIndex = 0, + result = []; + + while (++index < length) { + var value = array[index]; + if (value) { + result[resIndex++] = value; + } + } + return result; + } + + /** + * Creates a new array concatenating `array` with any additional arrays + * and/or values. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to concatenate. + * @param {...*} [values] The values to concatenate. + * @returns {Array} Returns the new concatenated array. + * @example + * + * var array = [1]; + * var other = _.concat(array, 2, [3], [[4]]); + * + * console.log(other); + * // => [1, 2, 3, [4]] + * + * console.log(array); + * // => [1] + */ + function concat() { + var length = arguments.length; + if (!length) { + return []; + } + var args = Array(length - 1), + array = arguments[0], + index = length; + + while (index--) { + args[index - 1] = arguments[index]; + } + return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1)); + } + + /** + * Creates an array of `array` values not included in the other given arrays + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. The order and references of result values are + * determined by the first array. + * + * **Note:** Unlike `_.pullAll`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {...Array} [values] The values to exclude. + * @returns {Array} Returns the new array of filtered values. + * @see _.without, _.xor + * @example + * + * _.difference([2, 1], [2, 3]); + * // => [1] + */ + var difference = baseRest(function(array, values) { + return isArrayLikeObject(array) + ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true)) + : []; + }); + + /** + * This method is like `_.difference` except that it accepts `iteratee` which + * is invoked for each element of `array` and `values` to generate the criterion + * by which they're compared. The order and references of result values are + * determined by the first array. The iteratee is invoked with one argument: + * (value). + * + * **Note:** Unlike `_.pullAllBy`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {...Array} [values] The values to exclude. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor); + * // => [1.2] + * + * // The `_.property` iteratee shorthand. + * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x'); + * // => [{ 'x': 2 }] + */ + var differenceBy = baseRest(function(array, values) { + var iteratee = last(values); + if (isArrayLikeObject(iteratee)) { + iteratee = undefined; + } + return isArrayLikeObject(array) + ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2)) + : []; + }); + + /** + * This method is like `_.difference` except that it accepts `comparator` + * which is invoked to compare elements of `array` to `values`. The order and + * references of result values are determined by the first array. The comparator + * is invoked with two arguments: (arrVal, othVal). + * + * **Note:** Unlike `_.pullAllWith`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {...Array} [values] The values to exclude. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; + * + * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual); + * // => [{ 'x': 2, 'y': 1 }] + */ + var differenceWith = baseRest(function(array, values) { + var comparator = last(values); + if (isArrayLikeObject(comparator)) { + comparator = undefined; + } + return isArrayLikeObject(array) + ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator) + : []; + }); + + /** + * Creates a slice of `array` with `n` elements dropped from the beginning. + * + * @static + * @memberOf _ + * @since 0.5.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to drop. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.drop([1, 2, 3]); + * // => [2, 3] + * + * _.drop([1, 2, 3], 2); + * // => [3] + * + * _.drop([1, 2, 3], 5); + * // => [] + * + * _.drop([1, 2, 3], 0); + * // => [1, 2, 3] + */ + function drop(array, n, guard) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + n = (guard || n === undefined) ? 1 : toInteger(n); + return baseSlice(array, n < 0 ? 0 : n, length); + } + + /** + * Creates a slice of `array` with `n` elements dropped from the end. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to drop. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.dropRight([1, 2, 3]); + * // => [1, 2] + * + * _.dropRight([1, 2, 3], 2); + * // => [1] + * + * _.dropRight([1, 2, 3], 5); + * // => [] + * + * _.dropRight([1, 2, 3], 0); + * // => [1, 2, 3] + */ + function dropRight(array, n, guard) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + n = (guard || n === undefined) ? 1 : toInteger(n); + n = length - n; + return baseSlice(array, 0, n < 0 ? 0 : n); + } + + /** + * Creates a slice of `array` excluding elements dropped from the end. + * Elements are dropped until `predicate` returns falsey. The predicate is + * invoked with three arguments: (value, index, array). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the slice of `array`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': false } + * ]; + * + * _.dropRightWhile(users, function(o) { return !o.active; }); + * // => objects for ['barney'] + * + * // The `_.matches` iteratee shorthand. + * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false }); + * // => objects for ['barney', 'fred'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.dropRightWhile(users, ['active', false]); + * // => objects for ['barney'] + * + * // The `_.property` iteratee shorthand. + * _.dropRightWhile(users, 'active'); + * // => objects for ['barney', 'fred', 'pebbles'] + */ + function dropRightWhile(array, predicate) { + return (array && array.length) + ? baseWhile(array, getIteratee(predicate, 3), true, true) + : []; + } + + /** + * Creates a slice of `array` excluding elements dropped from the beginning. + * Elements are dropped until `predicate` returns falsey. The predicate is + * invoked with three arguments: (value, index, array). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the slice of `array`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': true } + * ]; + * + * _.dropWhile(users, function(o) { return !o.active; }); + * // => objects for ['pebbles'] + * + * // The `_.matches` iteratee shorthand. + * _.dropWhile(users, { 'user': 'barney', 'active': false }); + * // => objects for ['fred', 'pebbles'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.dropWhile(users, ['active', false]); + * // => objects for ['pebbles'] + * + * // The `_.property` iteratee shorthand. + * _.dropWhile(users, 'active'); + * // => objects for ['barney', 'fred', 'pebbles'] + */ + function dropWhile(array, predicate) { + return (array && array.length) + ? baseWhile(array, getIteratee(predicate, 3), true) + : []; + } + + /** + * Fills elements of `array` with `value` from `start` up to, but not + * including, `end`. + * + * **Note:** This method mutates `array`. + * + * @static + * @memberOf _ + * @since 3.2.0 + * @category Array + * @param {Array} array The array to fill. + * @param {*} value The value to fill `array` with. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns `array`. + * @example + * + * var array = [1, 2, 3]; + * + * _.fill(array, 'a'); + * console.log(array); + * // => ['a', 'a', 'a'] + * + * _.fill(Array(3), 2); + * // => [2, 2, 2] + * + * _.fill([4, 6, 8, 10], '*', 1, 3); + * // => [4, '*', '*', 10] + */ + function fill(array, value, start, end) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + if (start && typeof start != 'number' && isIterateeCall(array, value, start)) { + start = 0; + end = length; + } + return baseFill(array, value, start, end); + } + + /** + * This method is like `_.find` except that it returns the index of the first + * element `predicate` returns truthy for instead of the element itself. + * + * @static + * @memberOf _ + * @since 1.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=0] The index to search from. + * @returns {number} Returns the index of the found element, else `-1`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': true } + * ]; + * + * _.findIndex(users, function(o) { return o.user == 'barney'; }); + * // => 0 + * + * // The `_.matches` iteratee shorthand. + * _.findIndex(users, { 'user': 'fred', 'active': false }); + * // => 1 + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findIndex(users, ['active', false]); + * // => 0 + * + * // The `_.property` iteratee shorthand. + * _.findIndex(users, 'active'); + * // => 2 + */ + function findIndex(array, predicate, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = fromIndex == null ? 0 : toInteger(fromIndex); + if (index < 0) { + index = nativeMax(length + index, 0); + } + return baseFindIndex(array, getIteratee(predicate, 3), index); + } + + /** + * This method is like `_.findIndex` except that it iterates over elements + * of `collection` from right to left. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=array.length-1] The index to search from. + * @returns {number} Returns the index of the found element, else `-1`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': false } + * ]; + * + * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; }); + * // => 2 + * + * // The `_.matches` iteratee shorthand. + * _.findLastIndex(users, { 'user': 'barney', 'active': true }); + * // => 0 + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findLastIndex(users, ['active', false]); + * // => 2 + * + * // The `_.property` iteratee shorthand. + * _.findLastIndex(users, 'active'); + * // => 0 + */ + function findLastIndex(array, predicate, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = length - 1; + if (fromIndex !== undefined) { + index = toInteger(fromIndex); + index = fromIndex < 0 + ? nativeMax(length + index, 0) + : nativeMin(index, length - 1); + } + return baseFindIndex(array, getIteratee(predicate, 3), index, true); + } + + /** + * Flattens `array` a single level deep. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to flatten. + * @returns {Array} Returns the new flattened array. + * @example + * + * _.flatten([1, [2, [3, [4]], 5]]); + * // => [1, 2, [3, [4]], 5] + */ + function flatten(array) { + var length = array == null ? 0 : array.length; + return length ? baseFlatten(array, 1) : []; + } + + /** + * Recursively flattens `array`. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to flatten. + * @returns {Array} Returns the new flattened array. + * @example + * + * _.flattenDeep([1, [2, [3, [4]], 5]]); + * // => [1, 2, 3, 4, 5] + */ + function flattenDeep(array) { + var length = array == null ? 0 : array.length; + return length ? baseFlatten(array, INFINITY) : []; + } + + /** + * Recursively flatten `array` up to `depth` times. + * + * @static + * @memberOf _ + * @since 4.4.0 + * @category Array + * @param {Array} array The array to flatten. + * @param {number} [depth=1] The maximum recursion depth. + * @returns {Array} Returns the new flattened array. + * @example + * + * var array = [1, [2, [3, [4]], 5]]; + * + * _.flattenDepth(array, 1); + * // => [1, 2, [3, [4]], 5] + * + * _.flattenDepth(array, 2); + * // => [1, 2, 3, [4], 5] + */ + function flattenDepth(array, depth) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + depth = depth === undefined ? 1 : toInteger(depth); + return baseFlatten(array, depth); + } + + /** + * The inverse of `_.toPairs`; this method returns an object composed + * from key-value `pairs`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} pairs The key-value pairs. + * @returns {Object} Returns the new object. + * @example + * + * _.fromPairs([['a', 1], ['b', 2]]); + * // => { 'a': 1, 'b': 2 } + */ + function fromPairs(pairs) { + var index = -1, + length = pairs == null ? 0 : pairs.length, + result = {}; + + while (++index < length) { + var pair = pairs[index]; + result[pair[0]] = pair[1]; + } + return result; + } + + /** + * Gets the first element of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @alias first + * @category Array + * @param {Array} array The array to query. + * @returns {*} Returns the first element of `array`. + * @example + * + * _.head([1, 2, 3]); + * // => 1 + * + * _.head([]); + * // => undefined + */ + function head(array) { + return (array && array.length) ? array[0] : undefined; + } + + /** + * Gets the index at which the first occurrence of `value` is found in `array` + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. If `fromIndex` is negative, it's used as the + * offset from the end of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} [fromIndex=0] The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.indexOf([1, 2, 1, 2], 2); + * // => 1 + * + * // Search from the `fromIndex`. + * _.indexOf([1, 2, 1, 2], 2, 2); + * // => 3 + */ + function indexOf(array, value, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = fromIndex == null ? 0 : toInteger(fromIndex); + if (index < 0) { + index = nativeMax(length + index, 0); + } + return baseIndexOf(array, value, index); + } + + /** + * Gets all but the last element of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to query. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.initial([1, 2, 3]); + * // => [1, 2] + */ + function initial(array) { + var length = array == null ? 0 : array.length; + return length ? baseSlice(array, 0, -1) : []; + } + + /** + * Creates an array of unique values that are included in all given arrays + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. The order and references of result values are + * determined by the first array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @returns {Array} Returns the new array of intersecting values. + * @example + * + * _.intersection([2, 1], [2, 3]); + * // => [2] + */ + var intersection = baseRest(function(arrays) { + var mapped = arrayMap(arrays, castArrayLikeObject); + return (mapped.length && mapped[0] === arrays[0]) + ? baseIntersection(mapped) + : []; + }); + + /** + * This method is like `_.intersection` except that it accepts `iteratee` + * which is invoked for each element of each `arrays` to generate the criterion + * by which they're compared. The order and references of result values are + * determined by the first array. The iteratee is invoked with one argument: + * (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new array of intersecting values. + * @example + * + * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor); + * // => [2.1] + * + * // The `_.property` iteratee shorthand. + * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); + * // => [{ 'x': 1 }] + */ + var intersectionBy = baseRest(function(arrays) { + var iteratee = last(arrays), + mapped = arrayMap(arrays, castArrayLikeObject); + + if (iteratee === last(mapped)) { + iteratee = undefined; + } else { + mapped.pop(); + } + return (mapped.length && mapped[0] === arrays[0]) + ? baseIntersection(mapped, getIteratee(iteratee, 2)) + : []; + }); + + /** + * This method is like `_.intersection` except that it accepts `comparator` + * which is invoked to compare elements of `arrays`. The order and references + * of result values are determined by the first array. The comparator is + * invoked with two arguments: (arrVal, othVal). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of intersecting values. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; + * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; + * + * _.intersectionWith(objects, others, _.isEqual); + * // => [{ 'x': 1, 'y': 2 }] + */ + var intersectionWith = baseRest(function(arrays) { + var comparator = last(arrays), + mapped = arrayMap(arrays, castArrayLikeObject); + + comparator = typeof comparator == 'function' ? comparator : undefined; + if (comparator) { + mapped.pop(); + } + return (mapped.length && mapped[0] === arrays[0]) + ? baseIntersection(mapped, undefined, comparator) + : []; + }); + + /** + * Converts all elements in `array` into a string separated by `separator`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to convert. + * @param {string} [separator=','] The element separator. + * @returns {string} Returns the joined string. + * @example + * + * _.join(['a', 'b', 'c'], '~'); + * // => 'a~b~c' + */ + function join(array, separator) { + return array == null ? '' : nativeJoin.call(array, separator); + } + + /** + * Gets the last element of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to query. + * @returns {*} Returns the last element of `array`. + * @example + * + * _.last([1, 2, 3]); + * // => 3 + */ + function last(array) { + var length = array == null ? 0 : array.length; + return length ? array[length - 1] : undefined; + } + + /** + * This method is like `_.indexOf` except that it iterates over elements of + * `array` from right to left. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} [fromIndex=array.length-1] The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.lastIndexOf([1, 2, 1, 2], 2); + * // => 3 + * + * // Search from the `fromIndex`. + * _.lastIndexOf([1, 2, 1, 2], 2, 2); + * // => 1 + */ + function lastIndexOf(array, value, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = length; + if (fromIndex !== undefined) { + index = toInteger(fromIndex); + index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1); + } + return value === value + ? strictLastIndexOf(array, value, index) + : baseFindIndex(array, baseIsNaN, index, true); + } + + /** + * Gets the element at index `n` of `array`. If `n` is negative, the nth + * element from the end is returned. + * + * @static + * @memberOf _ + * @since 4.11.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=0] The index of the element to return. + * @returns {*} Returns the nth element of `array`. + * @example + * + * var array = ['a', 'b', 'c', 'd']; + * + * _.nth(array, 1); + * // => 'b' + * + * _.nth(array, -2); + * // => 'c'; + */ + function nth(array, n) { + return (array && array.length) ? baseNth(array, toInteger(n)) : undefined; + } + + /** + * Removes all given values from `array` using + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove` + * to remove elements from an array by predicate. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {...*} [values] The values to remove. + * @returns {Array} Returns `array`. + * @example + * + * var array = ['a', 'b', 'c', 'a', 'b', 'c']; + * + * _.pull(array, 'a', 'c'); + * console.log(array); + * // => ['b', 'b'] + */ + var pull = baseRest(pullAll); + + /** + * This method is like `_.pull` except that it accepts an array of values to remove. + * + * **Note:** Unlike `_.difference`, this method mutates `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {Array} values The values to remove. + * @returns {Array} Returns `array`. + * @example + * + * var array = ['a', 'b', 'c', 'a', 'b', 'c']; + * + * _.pullAll(array, ['a', 'c']); + * console.log(array); + * // => ['b', 'b'] + */ + function pullAll(array, values) { + return (array && array.length && values && values.length) + ? basePullAll(array, values) + : array; + } + + /** + * This method is like `_.pullAll` except that it accepts `iteratee` which is + * invoked for each element of `array` and `values` to generate the criterion + * by which they're compared. The iteratee is invoked with one argument: (value). + * + * **Note:** Unlike `_.differenceBy`, this method mutates `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {Array} values The values to remove. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns `array`. + * @example + * + * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }]; + * + * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x'); + * console.log(array); + * // => [{ 'x': 2 }] + */ + function pullAllBy(array, values, iteratee) { + return (array && array.length && values && values.length) + ? basePullAll(array, values, getIteratee(iteratee, 2)) + : array; + } + + /** + * This method is like `_.pullAll` except that it accepts `comparator` which + * is invoked to compare elements of `array` to `values`. The comparator is + * invoked with two arguments: (arrVal, othVal). + * + * **Note:** Unlike `_.differenceWith`, this method mutates `array`. + * + * @static + * @memberOf _ + * @since 4.6.0 + * @category Array + * @param {Array} array The array to modify. + * @param {Array} values The values to remove. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns `array`. + * @example + * + * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }]; + * + * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual); + * console.log(array); + * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }] + */ + function pullAllWith(array, values, comparator) { + return (array && array.length && values && values.length) + ? basePullAll(array, values, undefined, comparator) + : array; + } + + /** + * Removes elements from `array` corresponding to `indexes` and returns an + * array of removed elements. + * + * **Note:** Unlike `_.at`, this method mutates `array`. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {...(number|number[])} [indexes] The indexes of elements to remove. + * @returns {Array} Returns the new array of removed elements. + * @example + * + * var array = ['a', 'b', 'c', 'd']; + * var pulled = _.pullAt(array, [1, 3]); + * + * console.log(array); + * // => ['a', 'c'] + * + * console.log(pulled); + * // => ['b', 'd'] + */ + var pullAt = flatRest(function(array, indexes) { + var length = array == null ? 0 : array.length, + result = baseAt(array, indexes); + + basePullAt(array, arrayMap(indexes, function(index) { + return isIndex(index, length) ? +index : index; + }).sort(compareAscending)); + + return result; + }); + + /** + * Removes all elements from `array` that `predicate` returns truthy for + * and returns an array of the removed elements. The predicate is invoked + * with three arguments: (value, index, array). + * + * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull` + * to pull elements from an array by value. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new array of removed elements. + * @example + * + * var array = [1, 2, 3, 4]; + * var evens = _.remove(array, function(n) { + * return n % 2 == 0; + * }); + * + * console.log(array); + * // => [1, 3] + * + * console.log(evens); + * // => [2, 4] + */ + function remove(array, predicate) { + var result = []; + if (!(array && array.length)) { + return result; + } + var index = -1, + indexes = [], + length = array.length; + + predicate = getIteratee(predicate, 3); + while (++index < length) { + var value = array[index]; + if (predicate(value, index, array)) { + result.push(value); + indexes.push(index); + } + } + basePullAt(array, indexes); + return result; + } + + /** + * Reverses `array` so that the first element becomes the last, the second + * element becomes the second to last, and so on. + * + * **Note:** This method mutates `array` and is based on + * [`Array#reverse`](https://mdn.io/Array/reverse). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to modify. + * @returns {Array} Returns `array`. + * @example + * + * var array = [1, 2, 3]; + * + * _.reverse(array); + * // => [3, 2, 1] + * + * console.log(array); + * // => [3, 2, 1] + */ + function reverse(array) { + return array == null ? array : nativeReverse.call(array); + } + + /** + * Creates a slice of `array` from `start` up to, but not including, `end`. + * + * **Note:** This method is used instead of + * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are + * returned. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to slice. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the slice of `array`. + */ + function slice(array, start, end) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + if (end && typeof end != 'number' && isIterateeCall(array, start, end)) { + start = 0; + end = length; + } + else { + start = start == null ? 0 : toInteger(start); + end = end === undefined ? length : toInteger(end); + } + return baseSlice(array, start, end); + } + + /** + * Uses a binary search to determine the lowest index at which `value` + * should be inserted into `array` in order to maintain its sort order. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + * @example + * + * _.sortedIndex([30, 50], 40); + * // => 1 + */ + function sortedIndex(array, value) { + return baseSortedIndex(array, value); + } + + /** + * This method is like `_.sortedIndex` except that it accepts `iteratee` + * which is invoked for `value` and each element of `array` to compute their + * sort ranking. The iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + * @example + * + * var objects = [{ 'x': 4 }, { 'x': 5 }]; + * + * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; }); + * // => 0 + * + * // The `_.property` iteratee shorthand. + * _.sortedIndexBy(objects, { 'x': 4 }, 'x'); + * // => 0 + */ + function sortedIndexBy(array, value, iteratee) { + return baseSortedIndexBy(array, value, getIteratee(iteratee, 2)); + } + + /** + * This method is like `_.indexOf` except that it performs a binary + * search on a sorted `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.sortedIndexOf([4, 5, 5, 5, 6], 5); + * // => 1 + */ + function sortedIndexOf(array, value) { + var length = array == null ? 0 : array.length; + if (length) { + var index = baseSortedIndex(array, value); + if (index < length && eq(array[index], value)) { + return index; + } + } + return -1; + } + + /** + * This method is like `_.sortedIndex` except that it returns the highest + * index at which `value` should be inserted into `array` in order to + * maintain its sort order. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + * @example + * + * _.sortedLastIndex([4, 5, 5, 5, 6], 5); + * // => 4 + */ + function sortedLastIndex(array, value) { + return baseSortedIndex(array, value, true); + } + + /** + * This method is like `_.sortedLastIndex` except that it accepts `iteratee` + * which is invoked for `value` and each element of `array` to compute their + * sort ranking. The iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + * @example + * + * var objects = [{ 'x': 4 }, { 'x': 5 }]; + * + * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; }); + * // => 1 + * + * // The `_.property` iteratee shorthand. + * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x'); + * // => 1 + */ + function sortedLastIndexBy(array, value, iteratee) { + return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true); + } + + /** + * This method is like `_.lastIndexOf` except that it performs a binary + * search on a sorted `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5); + * // => 3 + */ + function sortedLastIndexOf(array, value) { + var length = array == null ? 0 : array.length; + if (length) { + var index = baseSortedIndex(array, value, true) - 1; + if (eq(array[index], value)) { + return index; + } + } + return -1; + } + + /** + * This method is like `_.uniq` except that it's designed and optimized + * for sorted arrays. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * _.sortedUniq([1, 1, 2]); + * // => [1, 2] + */ + function sortedUniq(array) { + return (array && array.length) + ? baseSortedUniq(array) + : []; + } + + /** + * This method is like `_.uniqBy` except that it's designed and optimized + * for sorted arrays. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor); + * // => [1.1, 2.3] + */ + function sortedUniqBy(array, iteratee) { + return (array && array.length) + ? baseSortedUniq(array, getIteratee(iteratee, 2)) + : []; + } + + /** + * Gets all but the first element of `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to query. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.tail([1, 2, 3]); + * // => [2, 3] + */ + function tail(array) { + var length = array == null ? 0 : array.length; + return length ? baseSlice(array, 1, length) : []; + } + + /** + * Creates a slice of `array` with `n` elements taken from the beginning. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to take. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.take([1, 2, 3]); + * // => [1] + * + * _.take([1, 2, 3], 2); + * // => [1, 2] + * + * _.take([1, 2, 3], 5); + * // => [1, 2, 3] + * + * _.take([1, 2, 3], 0); + * // => [] + */ + function take(array, n, guard) { + if (!(array && array.length)) { + return []; + } + n = (guard || n === undefined) ? 1 : toInteger(n); + return baseSlice(array, 0, n < 0 ? 0 : n); + } + + /** + * Creates a slice of `array` with `n` elements taken from the end. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to take. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.takeRight([1, 2, 3]); + * // => [3] + * + * _.takeRight([1, 2, 3], 2); + * // => [2, 3] + * + * _.takeRight([1, 2, 3], 5); + * // => [1, 2, 3] + * + * _.takeRight([1, 2, 3], 0); + * // => [] + */ + function takeRight(array, n, guard) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + n = (guard || n === undefined) ? 1 : toInteger(n); + n = length - n; + return baseSlice(array, n < 0 ? 0 : n, length); + } + + /** + * Creates a slice of `array` with elements taken from the end. Elements are + * taken until `predicate` returns falsey. The predicate is invoked with + * three arguments: (value, index, array). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the slice of `array`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': false } + * ]; + * + * _.takeRightWhile(users, function(o) { return !o.active; }); + * // => objects for ['fred', 'pebbles'] + * + * // The `_.matches` iteratee shorthand. + * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false }); + * // => objects for ['pebbles'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.takeRightWhile(users, ['active', false]); + * // => objects for ['fred', 'pebbles'] + * + * // The `_.property` iteratee shorthand. + * _.takeRightWhile(users, 'active'); + * // => [] + */ + function takeRightWhile(array, predicate) { + return (array && array.length) + ? baseWhile(array, getIteratee(predicate, 3), false, true) + : []; + } + + /** + * Creates a slice of `array` with elements taken from the beginning. Elements + * are taken until `predicate` returns falsey. The predicate is invoked with + * three arguments: (value, index, array). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the slice of `array`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': true } + * ]; + * + * _.takeWhile(users, function(o) { return !o.active; }); + * // => objects for ['barney', 'fred'] + * + * // The `_.matches` iteratee shorthand. + * _.takeWhile(users, { 'user': 'barney', 'active': false }); + * // => objects for ['barney'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.takeWhile(users, ['active', false]); + * // => objects for ['barney', 'fred'] + * + * // The `_.property` iteratee shorthand. + * _.takeWhile(users, 'active'); + * // => [] + */ + function takeWhile(array, predicate) { + return (array && array.length) + ? baseWhile(array, getIteratee(predicate, 3)) + : []; + } + + /** + * Creates an array of unique values, in order, from all given arrays using + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @returns {Array} Returns the new array of combined values. + * @example + * + * _.union([2], [1, 2]); + * // => [2, 1] + */ + var union = baseRest(function(arrays) { + return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true)); + }); + + /** + * This method is like `_.union` except that it accepts `iteratee` which is + * invoked for each element of each `arrays` to generate the criterion by + * which uniqueness is computed. Result values are chosen from the first + * array in which the value occurs. The iteratee is invoked with one argument: + * (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new array of combined values. + * @example + * + * _.unionBy([2.1], [1.2, 2.3], Math.floor); + * // => [2.1, 1.2] + * + * // The `_.property` iteratee shorthand. + * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); + * // => [{ 'x': 1 }, { 'x': 2 }] + */ + var unionBy = baseRest(function(arrays) { + var iteratee = last(arrays); + if (isArrayLikeObject(iteratee)) { + iteratee = undefined; + } + return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2)); + }); + + /** + * This method is like `_.union` except that it accepts `comparator` which + * is invoked to compare elements of `arrays`. Result values are chosen from + * the first array in which the value occurs. The comparator is invoked + * with two arguments: (arrVal, othVal). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of combined values. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; + * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; + * + * _.unionWith(objects, others, _.isEqual); + * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }] + */ + var unionWith = baseRest(function(arrays) { + var comparator = last(arrays); + comparator = typeof comparator == 'function' ? comparator : undefined; + return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator); + }); + + /** + * Creates a duplicate-free version of an array, using + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons, in which only the first occurrence of each element + * is kept. The order of result values is determined by the order they occur + * in the array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * _.uniq([2, 1, 2]); + * // => [2, 1] + */ + function uniq(array) { + return (array && array.length) ? baseUniq(array) : []; + } + + /** + * This method is like `_.uniq` except that it accepts `iteratee` which is + * invoked for each element in `array` to generate the criterion by which + * uniqueness is computed. The order of result values is determined by the + * order they occur in the array. The iteratee is invoked with one argument: + * (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * _.uniqBy([2.1, 1.2, 2.3], Math.floor); + * // => [2.1, 1.2] + * + * // The `_.property` iteratee shorthand. + * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x'); + * // => [{ 'x': 1 }, { 'x': 2 }] + */ + function uniqBy(array, iteratee) { + return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : []; + } + + /** + * This method is like `_.uniq` except that it accepts `comparator` which + * is invoked to compare elements of `array`. The order of result values is + * determined by the order they occur in the array.The comparator is invoked + * with two arguments: (arrVal, othVal). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }]; + * + * _.uniqWith(objects, _.isEqual); + * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }] + */ + function uniqWith(array, comparator) { + comparator = typeof comparator == 'function' ? comparator : undefined; + return (array && array.length) ? baseUniq(array, undefined, comparator) : []; + } + + /** + * This method is like `_.zip` except that it accepts an array of grouped + * elements and creates an array regrouping the elements to their pre-zip + * configuration. + * + * @static + * @memberOf _ + * @since 1.2.0 + * @category Array + * @param {Array} array The array of grouped elements to process. + * @returns {Array} Returns the new array of regrouped elements. + * @example + * + * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]); + * // => [['a', 1, true], ['b', 2, false]] + * + * _.unzip(zipped); + * // => [['a', 'b'], [1, 2], [true, false]] + */ + function unzip(array) { + if (!(array && array.length)) { + return []; + } + var length = 0; + array = arrayFilter(array, function(group) { + if (isArrayLikeObject(group)) { + length = nativeMax(group.length, length); + return true; + } + }); + return baseTimes(length, function(index) { + return arrayMap(array, baseProperty(index)); + }); + } + + /** + * This method is like `_.unzip` except that it accepts `iteratee` to specify + * how regrouped values should be combined. The iteratee is invoked with the + * elements of each group: (...group). + * + * @static + * @memberOf _ + * @since 3.8.0 + * @category Array + * @param {Array} array The array of grouped elements to process. + * @param {Function} [iteratee=_.identity] The function to combine + * regrouped values. + * @returns {Array} Returns the new array of regrouped elements. + * @example + * + * var zipped = _.zip([1, 2], [10, 20], [100, 200]); + * // => [[1, 10, 100], [2, 20, 200]] + * + * _.unzipWith(zipped, _.add); + * // => [3, 30, 300] + */ + function unzipWith(array, iteratee) { + if (!(array && array.length)) { + return []; + } + var result = unzip(array); + if (iteratee == null) { + return result; + } + return arrayMap(result, function(group) { + return apply(iteratee, undefined, group); + }); + } + + /** + * Creates an array excluding all given values using + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * **Note:** Unlike `_.pull`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {...*} [values] The values to exclude. + * @returns {Array} Returns the new array of filtered values. + * @see _.difference, _.xor + * @example + * + * _.without([2, 1, 2, 3], 1, 2); + * // => [3] + */ + var without = baseRest(function(array, values) { + return isArrayLikeObject(array) + ? baseDifference(array, values) + : []; + }); + + /** + * Creates an array of unique values that is the + * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference) + * of the given arrays. The order of result values is determined by the order + * they occur in the arrays. + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @returns {Array} Returns the new array of filtered values. + * @see _.difference, _.without + * @example + * + * _.xor([2, 1], [2, 3]); + * // => [1, 3] + */ + var xor = baseRest(function(arrays) { + return baseXor(arrayFilter(arrays, isArrayLikeObject)); + }); + + /** + * This method is like `_.xor` except that it accepts `iteratee` which is + * invoked for each element of each `arrays` to generate the criterion by + * which by which they're compared. The order of result values is determined + * by the order they occur in the arrays. The iteratee is invoked with one + * argument: (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor); + * // => [1.2, 3.4] + * + * // The `_.property` iteratee shorthand. + * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); + * // => [{ 'x': 2 }] + */ + var xorBy = baseRest(function(arrays) { + var iteratee = last(arrays); + if (isArrayLikeObject(iteratee)) { + iteratee = undefined; + } + return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2)); + }); + + /** + * This method is like `_.xor` except that it accepts `comparator` which is + * invoked to compare elements of `arrays`. The order of result values is + * determined by the order they occur in the arrays. The comparator is invoked + * with two arguments: (arrVal, othVal). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; + * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; + * + * _.xorWith(objects, others, _.isEqual); + * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }] + */ + var xorWith = baseRest(function(arrays) { + var comparator = last(arrays); + comparator = typeof comparator == 'function' ? comparator : undefined; + return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator); + }); + + /** + * Creates an array of grouped elements, the first of which contains the + * first elements of the given arrays, the second of which contains the + * second elements of the given arrays, and so on. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {...Array} [arrays] The arrays to process. + * @returns {Array} Returns the new array of grouped elements. + * @example + * + * _.zip(['a', 'b'], [1, 2], [true, false]); + * // => [['a', 1, true], ['b', 2, false]] + */ + var zip = baseRest(unzip); + + /** + * This method is like `_.fromPairs` except that it accepts two arrays, + * one of property identifiers and one of corresponding values. + * + * @static + * @memberOf _ + * @since 0.4.0 + * @category Array + * @param {Array} [props=[]] The property identifiers. + * @param {Array} [values=[]] The property values. + * @returns {Object} Returns the new object. + * @example + * + * _.zipObject(['a', 'b'], [1, 2]); + * // => { 'a': 1, 'b': 2 } + */ + function zipObject(props, values) { + return baseZipObject(props || [], values || [], assignValue); + } + + /** + * This method is like `_.zipObject` except that it supports property paths. + * + * @static + * @memberOf _ + * @since 4.1.0 + * @category Array + * @param {Array} [props=[]] The property identifiers. + * @param {Array} [values=[]] The property values. + * @returns {Object} Returns the new object. + * @example + * + * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]); + * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } } + */ + function zipObjectDeep(props, values) { + return baseZipObject(props || [], values || [], baseSet); + } + + /** + * This method is like `_.zip` except that it accepts `iteratee` to specify + * how grouped values should be combined. The iteratee is invoked with the + * elements of each group: (...group). + * + * @static + * @memberOf _ + * @since 3.8.0 + * @category Array + * @param {...Array} [arrays] The arrays to process. + * @param {Function} [iteratee=_.identity] The function to combine + * grouped values. + * @returns {Array} Returns the new array of grouped elements. + * @example + * + * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) { + * return a + b + c; + * }); + * // => [111, 222] + */ + var zipWith = baseRest(function(arrays) { + var length = arrays.length, + iteratee = length > 1 ? arrays[length - 1] : undefined; + + iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined; + return unzipWith(arrays, iteratee); + }); + + /*------------------------------------------------------------------------*/ + + /** + * Creates a `lodash` wrapper instance that wraps `value` with explicit method + * chain sequences enabled. The result of such sequences must be unwrapped + * with `_#value`. + * + * @static + * @memberOf _ + * @since 1.3.0 + * @category Seq + * @param {*} value The value to wrap. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 40 }, + * { 'user': 'pebbles', 'age': 1 } + * ]; + * + * var youngest = _ + * .chain(users) + * .sortBy('age') + * .map(function(o) { + * return o.user + ' is ' + o.age; + * }) + * .head() + * .value(); + * // => 'pebbles is 1' + */ + function chain(value) { + var result = lodash(value); + result.__chain__ = true; + return result; + } + + /** + * This method invokes `interceptor` and returns `value`. The interceptor + * is invoked with one argument; (value). The purpose of this method is to + * "tap into" a method chain sequence in order to modify intermediate results. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Seq + * @param {*} value The value to provide to `interceptor`. + * @param {Function} interceptor The function to invoke. + * @returns {*} Returns `value`. + * @example + * + * _([1, 2, 3]) + * .tap(function(array) { + * // Mutate input array. + * array.pop(); + * }) + * .reverse() + * .value(); + * // => [2, 1] + */ + function tap(value, interceptor) { + interceptor(value); + return value; + } + + /** + * This method is like `_.tap` except that it returns the result of `interceptor`. + * The purpose of this method is to "pass thru" values replacing intermediate + * results in a method chain sequence. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Seq + * @param {*} value The value to provide to `interceptor`. + * @param {Function} interceptor The function to invoke. + * @returns {*} Returns the result of `interceptor`. + * @example + * + * _(' abc ') + * .chain() + * .trim() + * .thru(function(value) { + * return [value]; + * }) + * .value(); + * // => ['abc'] + */ + function thru(value, interceptor) { + return interceptor(value); + } + + /** + * This method is the wrapper version of `_.at`. + * + * @name at + * @memberOf _ + * @since 1.0.0 + * @category Seq + * @param {...(string|string[])} [paths] The property paths to pick. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] }; + * + * _(object).at(['a[0].b.c', 'a[1]']).value(); + * // => [3, 4] + */ + var wrapperAt = flatRest(function(paths) { + var length = paths.length, + start = length ? paths[0] : 0, + value = this.__wrapped__, + interceptor = function(object) { return baseAt(object, paths); }; + + if (length > 1 || this.__actions__.length || + !(value instanceof LazyWrapper) || !isIndex(start)) { + return this.thru(interceptor); + } + value = value.slice(start, +start + (length ? 1 : 0)); + value.__actions__.push({ + 'func': thru, + 'args': [interceptor], + 'thisArg': undefined + }); + return new LodashWrapper(value, this.__chain__).thru(function(array) { + if (length && !array.length) { + array.push(undefined); + } + return array; + }); + }); + + /** + * Creates a `lodash` wrapper instance with explicit method chain sequences enabled. + * + * @name chain + * @memberOf _ + * @since 0.1.0 + * @category Seq + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 40 } + * ]; + * + * // A sequence without explicit chaining. + * _(users).head(); + * // => { 'user': 'barney', 'age': 36 } + * + * // A sequence with explicit chaining. + * _(users) + * .chain() + * .head() + * .pick('user') + * .value(); + * // => { 'user': 'barney' } + */ + function wrapperChain() { + return chain(this); + } + + /** + * Executes the chain sequence and returns the wrapped result. + * + * @name commit + * @memberOf _ + * @since 3.2.0 + * @category Seq + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var array = [1, 2]; + * var wrapped = _(array).push(3); + * + * console.log(array); + * // => [1, 2] + * + * wrapped = wrapped.commit(); + * console.log(array); + * // => [1, 2, 3] + * + * wrapped.last(); + * // => 3 + * + * console.log(array); + * // => [1, 2, 3] + */ + function wrapperCommit() { + return new LodashWrapper(this.value(), this.__chain__); + } + + /** + * Gets the next value on a wrapped object following the + * [iterator protocol](https://mdn.io/iteration_protocols#iterator). + * + * @name next + * @memberOf _ + * @since 4.0.0 + * @category Seq + * @returns {Object} Returns the next iterator value. + * @example + * + * var wrapped = _([1, 2]); + * + * wrapped.next(); + * // => { 'done': false, 'value': 1 } + * + * wrapped.next(); + * // => { 'done': false, 'value': 2 } + * + * wrapped.next(); + * // => { 'done': true, 'value': undefined } + */ + function wrapperNext() { + if (this.__values__ === undefined) { + this.__values__ = toArray(this.value()); + } + var done = this.__index__ >= this.__values__.length, + value = done ? undefined : this.__values__[this.__index__++]; + + return { 'done': done, 'value': value }; + } + + /** + * Enables the wrapper to be iterable. + * + * @name Symbol.iterator + * @memberOf _ + * @since 4.0.0 + * @category Seq + * @returns {Object} Returns the wrapper object. + * @example + * + * var wrapped = _([1, 2]); + * + * wrapped[Symbol.iterator]() === wrapped; + * // => true + * + * Array.from(wrapped); + * // => [1, 2] + */ + function wrapperToIterator() { + return this; + } + + /** + * Creates a clone of the chain sequence planting `value` as the wrapped value. + * + * @name plant + * @memberOf _ + * @since 3.2.0 + * @category Seq + * @param {*} value The value to plant. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * function square(n) { + * return n * n; + * } + * + * var wrapped = _([1, 2]).map(square); + * var other = wrapped.plant([3, 4]); + * + * other.value(); + * // => [9, 16] + * + * wrapped.value(); + * // => [1, 4] + */ + function wrapperPlant(value) { + var result, + parent = this; + + while (parent instanceof baseLodash) { + var clone = wrapperClone(parent); + clone.__index__ = 0; + clone.__values__ = undefined; + if (result) { + previous.__wrapped__ = clone; + } else { + result = clone; + } + var previous = clone; + parent = parent.__wrapped__; + } + previous.__wrapped__ = value; + return result; + } + + /** + * This method is the wrapper version of `_.reverse`. + * + * **Note:** This method mutates the wrapped array. + * + * @name reverse + * @memberOf _ + * @since 0.1.0 + * @category Seq + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var array = [1, 2, 3]; + * + * _(array).reverse().value() + * // => [3, 2, 1] + * + * console.log(array); + * // => [3, 2, 1] + */ + function wrapperReverse() { + var value = this.__wrapped__; + if (value instanceof LazyWrapper) { + var wrapped = value; + if (this.__actions__.length) { + wrapped = new LazyWrapper(this); + } + wrapped = wrapped.reverse(); + wrapped.__actions__.push({ + 'func': thru, + 'args': [reverse], + 'thisArg': undefined + }); + return new LodashWrapper(wrapped, this.__chain__); + } + return this.thru(reverse); + } + + /** + * Executes the chain sequence to resolve the unwrapped value. + * + * @name value + * @memberOf _ + * @since 0.1.0 + * @alias toJSON, valueOf + * @category Seq + * @returns {*} Returns the resolved unwrapped value. + * @example + * + * _([1, 2, 3]).value(); + * // => [1, 2, 3] + */ + function wrapperValue() { + return baseWrapperValue(this.__wrapped__, this.__actions__); + } + + /*------------------------------------------------------------------------*/ + + /** + * Creates an object composed of keys generated from the results of running + * each element of `collection` thru `iteratee`. The corresponding value of + * each key is the number of times the key was returned by `iteratee`. The + * iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 0.5.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The iteratee to transform keys. + * @returns {Object} Returns the composed aggregate object. + * @example + * + * _.countBy([6.1, 4.2, 6.3], Math.floor); + * // => { '4': 1, '6': 2 } + * + * // The `_.property` iteratee shorthand. + * _.countBy(['one', 'two', 'three'], 'length'); + * // => { '3': 2, '5': 1 } + */ + var countBy = createAggregator(function(result, value, key) { + if (hasOwnProperty.call(result, key)) { + ++result[key]; + } else { + baseAssignValue(result, key, 1); + } + }); + + /** + * Checks if `predicate` returns truthy for **all** elements of `collection`. + * Iteration is stopped once `predicate` returns falsey. The predicate is + * invoked with three arguments: (value, index|key, collection). + * + * **Note:** This method returns `true` for + * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because + * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of + * elements of empty collections. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false`. + * @example + * + * _.every([true, 1, null, 'yes'], Boolean); + * // => false + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': false }, + * { 'user': 'fred', 'age': 40, 'active': false } + * ]; + * + * // The `_.matches` iteratee shorthand. + * _.every(users, { 'user': 'barney', 'active': false }); + * // => false + * + * // The `_.matchesProperty` iteratee shorthand. + * _.every(users, ['active', false]); + * // => true + * + * // The `_.property` iteratee shorthand. + * _.every(users, 'active'); + * // => false + */ + function every(collection, predicate, guard) { + var func = isArray(collection) ? arrayEvery : baseEvery; + if (guard && isIterateeCall(collection, predicate, guard)) { + predicate = undefined; + } + return func(collection, getIteratee(predicate, 3)); + } + + /** + * Iterates over elements of `collection`, returning an array of all elements + * `predicate` returns truthy for. The predicate is invoked with three + * arguments: (value, index|key, collection). + * + * **Note:** Unlike `_.remove`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + * @see _.reject + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': true }, + * { 'user': 'fred', 'age': 40, 'active': false } + * ]; + * + * _.filter(users, function(o) { return !o.active; }); + * // => objects for ['fred'] + * + * // The `_.matches` iteratee shorthand. + * _.filter(users, { 'age': 36, 'active': true }); + * // => objects for ['barney'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.filter(users, ['active', false]); + * // => objects for ['fred'] + * + * // The `_.property` iteratee shorthand. + * _.filter(users, 'active'); + * // => objects for ['barney'] + * + * // Combining several predicates using `_.overEvery` or `_.overSome`. + * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]])); + * // => objects for ['fred', 'barney'] + */ + function filter(collection, predicate) { + var func = isArray(collection) ? arrayFilter : baseFilter; + return func(collection, getIteratee(predicate, 3)); + } + + /** + * Iterates over elements of `collection`, returning the first element + * `predicate` returns truthy for. The predicate is invoked with three + * arguments: (value, index|key, collection). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=0] The index to search from. + * @returns {*} Returns the matched element, else `undefined`. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': true }, + * { 'user': 'fred', 'age': 40, 'active': false }, + * { 'user': 'pebbles', 'age': 1, 'active': true } + * ]; + * + * _.find(users, function(o) { return o.age < 40; }); + * // => object for 'barney' + * + * // The `_.matches` iteratee shorthand. + * _.find(users, { 'age': 1, 'active': true }); + * // => object for 'pebbles' + * + * // The `_.matchesProperty` iteratee shorthand. + * _.find(users, ['active', false]); + * // => object for 'fred' + * + * // The `_.property` iteratee shorthand. + * _.find(users, 'active'); + * // => object for 'barney' + */ + var find = createFind(findIndex); + + /** + * This method is like `_.find` except that it iterates over elements of + * `collection` from right to left. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Collection + * @param {Array|Object} collection The collection to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=collection.length-1] The index to search from. + * @returns {*} Returns the matched element, else `undefined`. + * @example + * + * _.findLast([1, 2, 3, 4], function(n) { + * return n % 2 == 1; + * }); + * // => 3 + */ + var findLast = createFind(findLastIndex); + + /** + * Creates a flattened array of values by running each element in `collection` + * thru `iteratee` and flattening the mapped results. The iteratee is invoked + * with three arguments: (value, index|key, collection). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new flattened array. + * @example + * + * function duplicate(n) { + * return [n, n]; + * } + * + * _.flatMap([1, 2], duplicate); + * // => [1, 1, 2, 2] + */ + function flatMap(collection, iteratee) { + return baseFlatten(map(collection, iteratee), 1); + } + + /** + * This method is like `_.flatMap` except that it recursively flattens the + * mapped results. + * + * @static + * @memberOf _ + * @since 4.7.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new flattened array. + * @example + * + * function duplicate(n) { + * return [[[n, n]]]; + * } + * + * _.flatMapDeep([1, 2], duplicate); + * // => [1, 1, 2, 2] + */ + function flatMapDeep(collection, iteratee) { + return baseFlatten(map(collection, iteratee), INFINITY); + } + + /** + * This method is like `_.flatMap` except that it recursively flattens the + * mapped results up to `depth` times. + * + * @static + * @memberOf _ + * @since 4.7.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {number} [depth=1] The maximum recursion depth. + * @returns {Array} Returns the new flattened array. + * @example + * + * function duplicate(n) { + * return [[[n, n]]]; + * } + * + * _.flatMapDepth([1, 2], duplicate, 2); + * // => [[1, 1], [2, 2]] + */ + function flatMapDepth(collection, iteratee, depth) { + depth = depth === undefined ? 1 : toInteger(depth); + return baseFlatten(map(collection, iteratee), depth); + } + + /** + * Iterates over elements of `collection` and invokes `iteratee` for each element. + * The iteratee is invoked with three arguments: (value, index|key, collection). + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * **Note:** As with other "Collections" methods, objects with a "length" + * property are iterated like arrays. To avoid this behavior use `_.forIn` + * or `_.forOwn` for object iteration. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @alias each + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + * @see _.forEachRight + * @example + * + * _.forEach([1, 2], function(value) { + * console.log(value); + * }); + * // => Logs `1` then `2`. + * + * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) { + * console.log(key); + * }); + * // => Logs 'a' then 'b' (iteration order is not guaranteed). + */ + function forEach(collection, iteratee) { + var func = isArray(collection) ? arrayEach : baseEach; + return func(collection, getIteratee(iteratee, 3)); + } + + /** + * This method is like `_.forEach` except that it iterates over elements of + * `collection` from right to left. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @alias eachRight + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + * @see _.forEach + * @example + * + * _.forEachRight([1, 2], function(value) { + * console.log(value); + * }); + * // => Logs `2` then `1`. + */ + function forEachRight(collection, iteratee) { + var func = isArray(collection) ? arrayEachRight : baseEachRight; + return func(collection, getIteratee(iteratee, 3)); + } + + /** + * Creates an object composed of keys generated from the results of running + * each element of `collection` thru `iteratee`. The order of grouped values + * is determined by the order they occur in `collection`. The corresponding + * value of each key is an array of elements responsible for generating the + * key. The iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The iteratee to transform keys. + * @returns {Object} Returns the composed aggregate object. + * @example + * + * _.groupBy([6.1, 4.2, 6.3], Math.floor); + * // => { '4': [4.2], '6': [6.1, 6.3] } + * + * // The `_.property` iteratee shorthand. + * _.groupBy(['one', 'two', 'three'], 'length'); + * // => { '3': ['one', 'two'], '5': ['three'] } + */ + var groupBy = createAggregator(function(result, value, key) { + if (hasOwnProperty.call(result, key)) { + result[key].push(value); + } else { + baseAssignValue(result, key, [value]); + } + }); + + /** + * Checks if `value` is in `collection`. If `collection` is a string, it's + * checked for a substring of `value`, otherwise + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * is used for equality comparisons. If `fromIndex` is negative, it's used as + * the offset from the end of `collection`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object|string} collection The collection to inspect. + * @param {*} value The value to search for. + * @param {number} [fromIndex=0] The index to search from. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`. + * @returns {boolean} Returns `true` if `value` is found, else `false`. + * @example + * + * _.includes([1, 2, 3], 1); + * // => true + * + * _.includes([1, 2, 3], 1, 2); + * // => false + * + * _.includes({ 'a': 1, 'b': 2 }, 1); + * // => true + * + * _.includes('abcd', 'bc'); + * // => true + */ + function includes(collection, value, fromIndex, guard) { + collection = isArrayLike(collection) ? collection : values(collection); + fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0; + + var length = collection.length; + if (fromIndex < 0) { + fromIndex = nativeMax(length + fromIndex, 0); + } + return isString(collection) + ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1) + : (!!length && baseIndexOf(collection, value, fromIndex) > -1); + } + + /** + * Invokes the method at `path` of each element in `collection`, returning + * an array of the results of each invoked method. Any additional arguments + * are provided to each invoked method. If `path` is a function, it's invoked + * for, and `this` bound to, each element in `collection`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Array|Function|string} path The path of the method to invoke or + * the function invoked per iteration. + * @param {...*} [args] The arguments to invoke each method with. + * @returns {Array} Returns the array of results. + * @example + * + * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort'); + * // => [[1, 5, 7], [1, 2, 3]] + * + * _.invokeMap([123, 456], String.prototype.split, ''); + * // => [['1', '2', '3'], ['4', '5', '6']] + */ + var invokeMap = baseRest(function(collection, path, args) { + var index = -1, + isFunc = typeof path == 'function', + result = isArrayLike(collection) ? Array(collection.length) : []; + + baseEach(collection, function(value) { + result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args); + }); + return result; + }); + + /** + * Creates an object composed of keys generated from the results of running + * each element of `collection` thru `iteratee`. The corresponding value of + * each key is the last element responsible for generating the key. The + * iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The iteratee to transform keys. + * @returns {Object} Returns the composed aggregate object. + * @example + * + * var array = [ + * { 'dir': 'left', 'code': 97 }, + * { 'dir': 'right', 'code': 100 } + * ]; + * + * _.keyBy(array, function(o) { + * return String.fromCharCode(o.code); + * }); + * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } } + * + * _.keyBy(array, 'dir'); + * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } } + */ + var keyBy = createAggregator(function(result, value, key) { + baseAssignValue(result, key, value); + }); + + /** + * Creates an array of values by running each element in `collection` thru + * `iteratee`. The iteratee is invoked with three arguments: + * (value, index|key, collection). + * + * Many lodash methods are guarded to work as iteratees for methods like + * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`. + * + * The guarded methods are: + * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`, + * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`, + * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`, + * `template`, `trim`, `trimEnd`, `trimStart`, and `words` + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + * @example + * + * function square(n) { + * return n * n; + * } + * + * _.map([4, 8], square); + * // => [16, 64] + * + * _.map({ 'a': 4, 'b': 8 }, square); + * // => [16, 64] (iteration order is not guaranteed) + * + * var users = [ + * { 'user': 'barney' }, + * { 'user': 'fred' } + * ]; + * + * // The `_.property` iteratee shorthand. + * _.map(users, 'user'); + * // => ['barney', 'fred'] + */ + function map(collection, iteratee) { + var func = isArray(collection) ? arrayMap : baseMap; + return func(collection, getIteratee(iteratee, 3)); + } + + /** + * This method is like `_.sortBy` except that it allows specifying the sort + * orders of the iteratees to sort by. If `orders` is unspecified, all values + * are sorted in ascending order. Otherwise, specify an order of "desc" for + * descending or "asc" for ascending sort order of corresponding values. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]] + * The iteratees to sort by. + * @param {string[]} [orders] The sort orders of `iteratees`. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`. + * @returns {Array} Returns the new sorted array. + * @example + * + * var users = [ + * { 'user': 'fred', 'age': 48 }, + * { 'user': 'barney', 'age': 34 }, + * { 'user': 'fred', 'age': 40 }, + * { 'user': 'barney', 'age': 36 } + * ]; + * + * // Sort by `user` in ascending order and by `age` in descending order. + * _.orderBy(users, ['user', 'age'], ['asc', 'desc']); + * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]] + */ + function orderBy(collection, iteratees, orders, guard) { + if (collection == null) { + return []; + } + if (!isArray(iteratees)) { + iteratees = iteratees == null ? [] : [iteratees]; + } + orders = guard ? undefined : orders; + if (!isArray(orders)) { + orders = orders == null ? [] : [orders]; + } + return baseOrderBy(collection, iteratees, orders); + } + + /** + * Creates an array of elements split into two groups, the first of which + * contains elements `predicate` returns truthy for, the second of which + * contains elements `predicate` returns falsey for. The predicate is + * invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the array of grouped elements. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': false }, + * { 'user': 'fred', 'age': 40, 'active': true }, + * { 'user': 'pebbles', 'age': 1, 'active': false } + * ]; + * + * _.partition(users, function(o) { return o.active; }); + * // => objects for [['fred'], ['barney', 'pebbles']] + * + * // The `_.matches` iteratee shorthand. + * _.partition(users, { 'age': 1, 'active': false }); + * // => objects for [['pebbles'], ['barney', 'fred']] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.partition(users, ['active', false]); + * // => objects for [['barney', 'pebbles'], ['fred']] + * + * // The `_.property` iteratee shorthand. + * _.partition(users, 'active'); + * // => objects for [['fred'], ['barney', 'pebbles']] + */ + var partition = createAggregator(function(result, value, key) { + result[key ? 0 : 1].push(value); + }, function() { return [[], []]; }); + + /** + * Reduces `collection` to a value which is the accumulated result of running + * each element in `collection` thru `iteratee`, where each successive + * invocation is supplied the return value of the previous. If `accumulator` + * is not given, the first element of `collection` is used as the initial + * value. The iteratee is invoked with four arguments: + * (accumulator, value, index|key, collection). + * + * Many lodash methods are guarded to work as iteratees for methods like + * `_.reduce`, `_.reduceRight`, and `_.transform`. + * + * The guarded methods are: + * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`, + * and `sortBy` + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @returns {*} Returns the accumulated value. + * @see _.reduceRight + * @example + * + * _.reduce([1, 2], function(sum, n) { + * return sum + n; + * }, 0); + * // => 3 + * + * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { + * (result[value] || (result[value] = [])).push(key); + * return result; + * }, {}); + * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed) + */ + function reduce(collection, iteratee, accumulator) { + var func = isArray(collection) ? arrayReduce : baseReduce, + initAccum = arguments.length < 3; + + return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach); + } + + /** + * This method is like `_.reduce` except that it iterates over elements of + * `collection` from right to left. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @returns {*} Returns the accumulated value. + * @see _.reduce + * @example + * + * var array = [[0, 1], [2, 3], [4, 5]]; + * + * _.reduceRight(array, function(flattened, other) { + * return flattened.concat(other); + * }, []); + * // => [4, 5, 2, 3, 0, 1] + */ + function reduceRight(collection, iteratee, accumulator) { + var func = isArray(collection) ? arrayReduceRight : baseReduce, + initAccum = arguments.length < 3; + + return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight); + } + + /** + * The opposite of `_.filter`; this method returns the elements of `collection` + * that `predicate` does **not** return truthy for. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + * @see _.filter + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': false }, + * { 'user': 'fred', 'age': 40, 'active': true } + * ]; + * + * _.reject(users, function(o) { return !o.active; }); + * // => objects for ['fred'] + * + * // The `_.matches` iteratee shorthand. + * _.reject(users, { 'age': 40, 'active': true }); + * // => objects for ['barney'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.reject(users, ['active', false]); + * // => objects for ['fred'] + * + * // The `_.property` iteratee shorthand. + * _.reject(users, 'active'); + * // => objects for ['barney'] + */ + function reject(collection, predicate) { + var func = isArray(collection) ? arrayFilter : baseFilter; + return func(collection, negate(getIteratee(predicate, 3))); + } + + /** + * Gets a random element from `collection`. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Collection + * @param {Array|Object} collection The collection to sample. + * @returns {*} Returns the random element. + * @example + * + * _.sample([1, 2, 3, 4]); + * // => 2 + */ + function sample(collection) { + var func = isArray(collection) ? arraySample : baseSample; + return func(collection); + } + + /** + * Gets `n` random elements at unique keys from `collection` up to the + * size of `collection`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to sample. + * @param {number} [n=1] The number of elements to sample. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the random elements. + * @example + * + * _.sampleSize([1, 2, 3], 2); + * // => [3, 1] + * + * _.sampleSize([1, 2, 3], 4); + * // => [2, 3, 1] + */ + function sampleSize(collection, n, guard) { + if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) { + n = 1; + } else { + n = toInteger(n); + } + var func = isArray(collection) ? arraySampleSize : baseSampleSize; + return func(collection, n); + } + + /** + * Creates an array of shuffled values, using a version of the + * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to shuffle. + * @returns {Array} Returns the new shuffled array. + * @example + * + * _.shuffle([1, 2, 3, 4]); + * // => [4, 1, 3, 2] + */ + function shuffle(collection) { + var func = isArray(collection) ? arrayShuffle : baseShuffle; + return func(collection); + } + + /** + * Gets the size of `collection` by returning its length for array-like + * values or the number of own enumerable string keyed properties for objects. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object|string} collection The collection to inspect. + * @returns {number} Returns the collection size. + * @example + * + * _.size([1, 2, 3]); + * // => 3 + * + * _.size({ 'a': 1, 'b': 2 }); + * // => 2 + * + * _.size('pebbles'); + * // => 7 + */ + function size(collection) { + if (collection == null) { + return 0; + } + if (isArrayLike(collection)) { + return isString(collection) ? stringSize(collection) : collection.length; + } + var tag = getTag(collection); + if (tag == mapTag || tag == setTag) { + return collection.size; + } + return baseKeys(collection).length; + } + + /** + * Checks if `predicate` returns truthy for **any** element of `collection`. + * Iteration is stopped once `predicate` returns truthy. The predicate is + * invoked with three arguments: (value, index|key, collection). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + * @example + * + * _.some([null, 0, 'yes', false], Boolean); + * // => true + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false } + * ]; + * + * // The `_.matches` iteratee shorthand. + * _.some(users, { 'user': 'barney', 'active': false }); + * // => false + * + * // The `_.matchesProperty` iteratee shorthand. + * _.some(users, ['active', false]); + * // => true + * + * // The `_.property` iteratee shorthand. + * _.some(users, 'active'); + * // => true + */ + function some(collection, predicate, guard) { + var func = isArray(collection) ? arraySome : baseSome; + if (guard && isIterateeCall(collection, predicate, guard)) { + predicate = undefined; + } + return func(collection, getIteratee(predicate, 3)); + } + + /** + * Creates an array of elements, sorted in ascending order by the results of + * running each element in a collection thru each iteratee. This method + * performs a stable sort, that is, it preserves the original sort order of + * equal elements. The iteratees are invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {...(Function|Function[])} [iteratees=[_.identity]] + * The iteratees to sort by. + * @returns {Array} Returns the new sorted array. + * @example + * + * var users = [ + * { 'user': 'fred', 'age': 48 }, + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 30 }, + * { 'user': 'barney', 'age': 34 } + * ]; + * + * _.sortBy(users, [function(o) { return o.user; }]); + * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]] + * + * _.sortBy(users, ['user', 'age']); + * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]] + */ + var sortBy = baseRest(function(collection, iteratees) { + if (collection == null) { + return []; + } + var length = iteratees.length; + if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) { + iteratees = []; + } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) { + iteratees = [iteratees[0]]; + } + return baseOrderBy(collection, baseFlatten(iteratees, 1), []); + }); + + /*------------------------------------------------------------------------*/ + + /** + * Gets the timestamp of the number of milliseconds that have elapsed since + * the Unix epoch (1 January 1970 00:00:00 UTC). + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Date + * @returns {number} Returns the timestamp. + * @example + * + * _.defer(function(stamp) { + * console.log(_.now() - stamp); + * }, _.now()); + * // => Logs the number of milliseconds it took for the deferred invocation. + */ + var now = ctxNow || function() { + return root.Date.now(); + }; + + /*------------------------------------------------------------------------*/ + + /** + * The opposite of `_.before`; this method creates a function that invokes + * `func` once it's called `n` or more times. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {number} n The number of calls before `func` is invoked. + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new restricted function. + * @example + * + * var saves = ['profile', 'settings']; + * + * var done = _.after(saves.length, function() { + * console.log('done saving!'); + * }); + * + * _.forEach(saves, function(type) { + * asyncSave({ 'type': type, 'complete': done }); + * }); + * // => Logs 'done saving!' after the two async saves have completed. + */ + function after(n, func) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + n = toInteger(n); + return function() { + if (--n < 1) { + return func.apply(this, arguments); + } + }; + } + + /** + * Creates a function that invokes `func`, with up to `n` arguments, + * ignoring any additional arguments. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} func The function to cap arguments for. + * @param {number} [n=func.length] The arity cap. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Function} Returns the new capped function. + * @example + * + * _.map(['6', '8', '10'], _.ary(parseInt, 1)); + * // => [6, 8, 10] + */ + function ary(func, n, guard) { + n = guard ? undefined : n; + n = (func && n == null) ? func.length : n; + return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n); + } + + /** + * Creates a function that invokes `func`, with the `this` binding and arguments + * of the created function, while it's called less than `n` times. Subsequent + * calls to the created function return the result of the last `func` invocation. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {number} n The number of calls at which `func` is no longer invoked. + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new restricted function. + * @example + * + * jQuery(element).on('click', _.before(5, addContactToList)); + * // => Allows adding up to 4 contacts to the list. + */ + function before(n, func) { + var result; + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + n = toInteger(n); + return function() { + if (--n > 0) { + result = func.apply(this, arguments); + } + if (n <= 1) { + func = undefined; + } + return result; + }; + } + + /** + * Creates a function that invokes `func` with the `this` binding of `thisArg` + * and `partials` prepended to the arguments it receives. + * + * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds, + * may be used as a placeholder for partially applied arguments. + * + * **Note:** Unlike native `Function#bind`, this method doesn't set the "length" + * property of bound functions. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to bind. + * @param {*} thisArg The `this` binding of `func`. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new bound function. + * @example + * + * function greet(greeting, punctuation) { + * return greeting + ' ' + this.user + punctuation; + * } + * + * var object = { 'user': 'fred' }; + * + * var bound = _.bind(greet, object, 'hi'); + * bound('!'); + * // => 'hi fred!' + * + * // Bound with placeholders. + * var bound = _.bind(greet, object, _, '!'); + * bound('hi'); + * // => 'hi fred!' + */ + var bind = baseRest(function(func, thisArg, partials) { + var bitmask = WRAP_BIND_FLAG; + if (partials.length) { + var holders = replaceHolders(partials, getHolder(bind)); + bitmask |= WRAP_PARTIAL_FLAG; + } + return createWrap(func, bitmask, thisArg, partials, holders); + }); + + /** + * Creates a function that invokes the method at `object[key]` with `partials` + * prepended to the arguments it receives. + * + * This method differs from `_.bind` by allowing bound functions to reference + * methods that may be redefined or don't yet exist. See + * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern) + * for more details. + * + * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for partially applied arguments. + * + * @static + * @memberOf _ + * @since 0.10.0 + * @category Function + * @param {Object} object The object to invoke the method on. + * @param {string} key The key of the method. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new bound function. + * @example + * + * var object = { + * 'user': 'fred', + * 'greet': function(greeting, punctuation) { + * return greeting + ' ' + this.user + punctuation; + * } + * }; + * + * var bound = _.bindKey(object, 'greet', 'hi'); + * bound('!'); + * // => 'hi fred!' + * + * object.greet = function(greeting, punctuation) { + * return greeting + 'ya ' + this.user + punctuation; + * }; + * + * bound('!'); + * // => 'hiya fred!' + * + * // Bound with placeholders. + * var bound = _.bindKey(object, 'greet', _, '!'); + * bound('hi'); + * // => 'hiya fred!' + */ + var bindKey = baseRest(function(object, key, partials) { + var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG; + if (partials.length) { + var holders = replaceHolders(partials, getHolder(bindKey)); + bitmask |= WRAP_PARTIAL_FLAG; + } + return createWrap(key, bitmask, object, partials, holders); + }); + + /** + * Creates a function that accepts arguments of `func` and either invokes + * `func` returning its result, if at least `arity` number of arguments have + * been provided, or returns a function that accepts the remaining `func` + * arguments, and so on. The arity of `func` may be specified if `func.length` + * is not sufficient. + * + * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds, + * may be used as a placeholder for provided arguments. + * + * **Note:** This method doesn't set the "length" property of curried functions. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Function + * @param {Function} func The function to curry. + * @param {number} [arity=func.length] The arity of `func`. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Function} Returns the new curried function. + * @example + * + * var abc = function(a, b, c) { + * return [a, b, c]; + * }; + * + * var curried = _.curry(abc); + * + * curried(1)(2)(3); + * // => [1, 2, 3] + * + * curried(1, 2)(3); + * // => [1, 2, 3] + * + * curried(1, 2, 3); + * // => [1, 2, 3] + * + * // Curried with placeholders. + * curried(1)(_, 3)(2); + * // => [1, 2, 3] + */ + function curry(func, arity, guard) { + arity = guard ? undefined : arity; + var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity); + result.placeholder = curry.placeholder; + return result; + } + + /** + * This method is like `_.curry` except that arguments are applied to `func` + * in the manner of `_.partialRight` instead of `_.partial`. + * + * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for provided arguments. + * + * **Note:** This method doesn't set the "length" property of curried functions. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} func The function to curry. + * @param {number} [arity=func.length] The arity of `func`. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Function} Returns the new curried function. + * @example + * + * var abc = function(a, b, c) { + * return [a, b, c]; + * }; + * + * var curried = _.curryRight(abc); + * + * curried(3)(2)(1); + * // => [1, 2, 3] + * + * curried(2, 3)(1); + * // => [1, 2, 3] + * + * curried(1, 2, 3); + * // => [1, 2, 3] + * + * // Curried with placeholders. + * curried(3)(1, _)(2); + * // => [1, 2, 3] + */ + function curryRight(func, arity, guard) { + arity = guard ? undefined : arity; + var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity); + result.placeholder = curryRight.placeholder; + return result; + } + + /** + * Creates a debounced function that delays invoking `func` until after `wait` + * milliseconds have elapsed since the last time the debounced function was + * invoked. The debounced function comes with a `cancel` method to cancel + * delayed `func` invocations and a `flush` method to immediately invoke them. + * Provide `options` to indicate whether `func` should be invoked on the + * leading and/or trailing edge of the `wait` timeout. The `func` is invoked + * with the last arguments provided to the debounced function. Subsequent + * calls to the debounced function return the result of the last `func` + * invocation. + * + * **Note:** If `leading` and `trailing` options are `true`, `func` is + * invoked on the trailing edge of the timeout only if the debounced function + * is invoked more than once during the `wait` timeout. + * + * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred + * until to the next tick, similar to `setTimeout` with a timeout of `0`. + * + * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) + * for details over the differences between `_.debounce` and `_.throttle`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to debounce. + * @param {number} [wait=0] The number of milliseconds to delay. + * @param {Object} [options={}] The options object. + * @param {boolean} [options.leading=false] + * Specify invoking on the leading edge of the timeout. + * @param {number} [options.maxWait] + * The maximum time `func` is allowed to be delayed before it's invoked. + * @param {boolean} [options.trailing=true] + * Specify invoking on the trailing edge of the timeout. + * @returns {Function} Returns the new debounced function. + * @example + * + * // Avoid costly calculations while the window size is in flux. + * jQuery(window).on('resize', _.debounce(calculateLayout, 150)); + * + * // Invoke `sendMail` when clicked, debouncing subsequent calls. + * jQuery(element).on('click', _.debounce(sendMail, 300, { + * 'leading': true, + * 'trailing': false + * })); + * + * // Ensure `batchLog` is invoked once after 1 second of debounced calls. + * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 }); + * var source = new EventSource('/stream'); + * jQuery(source).on('message', debounced); + * + * // Cancel the trailing debounced invocation. + * jQuery(window).on('popstate', debounced.cancel); + */ + function debounce(func, wait, options) { + var lastArgs, + lastThis, + maxWait, + result, + timerId, + lastCallTime, + lastInvokeTime = 0, + leading = false, + maxing = false, + trailing = true; + + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + wait = toNumber(wait) || 0; + if (isObject(options)) { + leading = !!options.leading; + maxing = 'maxWait' in options; + maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait; + trailing = 'trailing' in options ? !!options.trailing : trailing; + } + + function invokeFunc(time) { + var args = lastArgs, + thisArg = lastThis; + + lastArgs = lastThis = undefined; + lastInvokeTime = time; + result = func.apply(thisArg, args); + return result; + } + + function leadingEdge(time) { + // Reset any `maxWait` timer. + lastInvokeTime = time; + // Start the timer for the trailing edge. + timerId = setTimeout(timerExpired, wait); + // Invoke the leading edge. + return leading ? invokeFunc(time) : result; + } + + function remainingWait(time) { + var timeSinceLastCall = time - lastCallTime, + timeSinceLastInvoke = time - lastInvokeTime, + timeWaiting = wait - timeSinceLastCall; + + return maxing + ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) + : timeWaiting; + } + + function shouldInvoke(time) { + var timeSinceLastCall = time - lastCallTime, + timeSinceLastInvoke = time - lastInvokeTime; + + // Either this is the first call, activity has stopped and we're at the + // trailing edge, the system time has gone backwards and we're treating + // it as the trailing edge, or we've hit the `maxWait` limit. + return (lastCallTime === undefined || (timeSinceLastCall >= wait) || + (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait)); + } + + function timerExpired() { + var time = now(); + if (shouldInvoke(time)) { + return trailingEdge(time); + } + // Restart the timer. + timerId = setTimeout(timerExpired, remainingWait(time)); + } + + function trailingEdge(time) { + timerId = undefined; + + // Only invoke if we have `lastArgs` which means `func` has been + // debounced at least once. + if (trailing && lastArgs) { + return invokeFunc(time); + } + lastArgs = lastThis = undefined; + return result; + } + + function cancel() { + if (timerId !== undefined) { + clearTimeout(timerId); + } + lastInvokeTime = 0; + lastArgs = lastCallTime = lastThis = timerId = undefined; + } + + function flush() { + return timerId === undefined ? result : trailingEdge(now()); + } + + function debounced() { + var time = now(), + isInvoking = shouldInvoke(time); + + lastArgs = arguments; + lastThis = this; + lastCallTime = time; + + if (isInvoking) { + if (timerId === undefined) { + return leadingEdge(lastCallTime); + } + if (maxing) { + // Handle invocations in a tight loop. + clearTimeout(timerId); + timerId = setTimeout(timerExpired, wait); + return invokeFunc(lastCallTime); + } + } + if (timerId === undefined) { + timerId = setTimeout(timerExpired, wait); + } + return result; + } + debounced.cancel = cancel; + debounced.flush = flush; + return debounced; + } + + /** + * Defers invoking the `func` until the current call stack has cleared. Any + * additional arguments are provided to `func` when it's invoked. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to defer. + * @param {...*} [args] The arguments to invoke `func` with. + * @returns {number} Returns the timer id. + * @example + * + * _.defer(function(text) { + * console.log(text); + * }, 'deferred'); + * // => Logs 'deferred' after one millisecond. + */ + var defer = baseRest(function(func, args) { + return baseDelay(func, 1, args); + }); + + /** + * Invokes `func` after `wait` milliseconds. Any additional arguments are + * provided to `func` when it's invoked. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to delay. + * @param {number} wait The number of milliseconds to delay invocation. + * @param {...*} [args] The arguments to invoke `func` with. + * @returns {number} Returns the timer id. + * @example + * + * _.delay(function(text) { + * console.log(text); + * }, 1000, 'later'); + * // => Logs 'later' after one second. + */ + var delay = baseRest(function(func, wait, args) { + return baseDelay(func, toNumber(wait) || 0, args); + }); + + /** + * Creates a function that invokes `func` with arguments reversed. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Function + * @param {Function} func The function to flip arguments for. + * @returns {Function} Returns the new flipped function. + * @example + * + * var flipped = _.flip(function() { + * return _.toArray(arguments); + * }); + * + * flipped('a', 'b', 'c', 'd'); + * // => ['d', 'c', 'b', 'a'] + */ + function flip(func) { + return createWrap(func, WRAP_FLIP_FLAG); + } + + /** + * Creates a function that memoizes the result of `func`. If `resolver` is + * provided, it determines the cache key for storing the result based on the + * arguments provided to the memoized function. By default, the first argument + * provided to the memoized function is used as the map cache key. The `func` + * is invoked with the `this` binding of the memoized function. + * + * **Note:** The cache is exposed as the `cache` property on the memoized + * function. Its creation may be customized by replacing the `_.memoize.Cache` + * constructor with one whose instances implement the + * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) + * method interface of `clear`, `delete`, `get`, `has`, and `set`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to have its output memoized. + * @param {Function} [resolver] The function to resolve the cache key. + * @returns {Function} Returns the new memoized function. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * var other = { 'c': 3, 'd': 4 }; + * + * var values = _.memoize(_.values); + * values(object); + * // => [1, 2] + * + * values(other); + * // => [3, 4] + * + * object.a = 2; + * values(object); + * // => [1, 2] + * + * // Modify the result cache. + * values.cache.set(object, ['a', 'b']); + * values(object); + * // => ['a', 'b'] + * + * // Replace `_.memoize.Cache`. + * _.memoize.Cache = WeakMap; + */ + function memoize(func, resolver) { + if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) { + throw new TypeError(FUNC_ERROR_TEXT); + } + var memoized = function() { + var args = arguments, + key = resolver ? resolver.apply(this, args) : args[0], + cache = memoized.cache; + + if (cache.has(key)) { + return cache.get(key); + } + var result = func.apply(this, args); + memoized.cache = cache.set(key, result) || cache; + return result; + }; + memoized.cache = new (memoize.Cache || MapCache); + return memoized; + } + + // Expose `MapCache`. + memoize.Cache = MapCache; + + /** + * Creates a function that negates the result of the predicate `func`. The + * `func` predicate is invoked with the `this` binding and arguments of the + * created function. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} predicate The predicate to negate. + * @returns {Function} Returns the new negated function. + * @example + * + * function isEven(n) { + * return n % 2 == 0; + * } + * + * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven)); + * // => [1, 3, 5] + */ + function negate(predicate) { + if (typeof predicate != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + return function() { + var args = arguments; + switch (args.length) { + case 0: return !predicate.call(this); + case 1: return !predicate.call(this, args[0]); + case 2: return !predicate.call(this, args[0], args[1]); + case 3: return !predicate.call(this, args[0], args[1], args[2]); + } + return !predicate.apply(this, args); + }; + } + + /** + * Creates a function that is restricted to invoking `func` once. Repeat calls + * to the function return the value of the first invocation. The `func` is + * invoked with the `this` binding and arguments of the created function. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new restricted function. + * @example + * + * var initialize = _.once(createApplication); + * initialize(); + * initialize(); + * // => `createApplication` is invoked once + */ + function once(func) { + return before(2, func); + } + + /** + * Creates a function that invokes `func` with its arguments transformed. + * + * @static + * @since 4.0.0 + * @memberOf _ + * @category Function + * @param {Function} func The function to wrap. + * @param {...(Function|Function[])} [transforms=[_.identity]] + * The argument transforms. + * @returns {Function} Returns the new function. + * @example + * + * function doubled(n) { + * return n * 2; + * } + * + * function square(n) { + * return n * n; + * } + * + * var func = _.overArgs(function(x, y) { + * return [x, y]; + * }, [square, doubled]); + * + * func(9, 3); + * // => [81, 6] + * + * func(10, 5); + * // => [100, 10] + */ + var overArgs = castRest(function(func, transforms) { + transforms = (transforms.length == 1 && isArray(transforms[0])) + ? arrayMap(transforms[0], baseUnary(getIteratee())) + : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee())); + + var funcsLength = transforms.length; + return baseRest(function(args) { + var index = -1, + length = nativeMin(args.length, funcsLength); + + while (++index < length) { + args[index] = transforms[index].call(this, args[index]); + } + return apply(func, this, args); + }); + }); + + /** + * Creates a function that invokes `func` with `partials` prepended to the + * arguments it receives. This method is like `_.bind` except it does **not** + * alter the `this` binding. + * + * The `_.partial.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for partially applied arguments. + * + * **Note:** This method doesn't set the "length" property of partially + * applied functions. + * + * @static + * @memberOf _ + * @since 0.2.0 + * @category Function + * @param {Function} func The function to partially apply arguments to. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new partially applied function. + * @example + * + * function greet(greeting, name) { + * return greeting + ' ' + name; + * } + * + * var sayHelloTo = _.partial(greet, 'hello'); + * sayHelloTo('fred'); + * // => 'hello fred' + * + * // Partially applied with placeholders. + * var greetFred = _.partial(greet, _, 'fred'); + * greetFred('hi'); + * // => 'hi fred' + */ + var partial = baseRest(function(func, partials) { + var holders = replaceHolders(partials, getHolder(partial)); + return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders); + }); + + /** + * This method is like `_.partial` except that partially applied arguments + * are appended to the arguments it receives. + * + * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for partially applied arguments. + * + * **Note:** This method doesn't set the "length" property of partially + * applied functions. + * + * @static + * @memberOf _ + * @since 1.0.0 + * @category Function + * @param {Function} func The function to partially apply arguments to. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new partially applied function. + * @example + * + * function greet(greeting, name) { + * return greeting + ' ' + name; + * } + * + * var greetFred = _.partialRight(greet, 'fred'); + * greetFred('hi'); + * // => 'hi fred' + * + * // Partially applied with placeholders. + * var sayHelloTo = _.partialRight(greet, 'hello', _); + * sayHelloTo('fred'); + * // => 'hello fred' + */ + var partialRight = baseRest(function(func, partials) { + var holders = replaceHolders(partials, getHolder(partialRight)); + return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders); + }); + + /** + * Creates a function that invokes `func` with arguments arranged according + * to the specified `indexes` where the argument value at the first index is + * provided as the first argument, the argument value at the second index is + * provided as the second argument, and so on. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} func The function to rearrange arguments for. + * @param {...(number|number[])} indexes The arranged argument indexes. + * @returns {Function} Returns the new function. + * @example + * + * var rearged = _.rearg(function(a, b, c) { + * return [a, b, c]; + * }, [2, 0, 1]); + * + * rearged('b', 'c', 'a') + * // => ['a', 'b', 'c'] + */ + var rearg = flatRest(function(func, indexes) { + return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes); + }); + + /** + * Creates a function that invokes `func` with the `this` binding of the + * created function and arguments from `start` and beyond provided as + * an array. + * + * **Note:** This method is based on the + * [rest parameter](https://mdn.io/rest_parameters). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Function + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @returns {Function} Returns the new function. + * @example + * + * var say = _.rest(function(what, names) { + * return what + ' ' + _.initial(names).join(', ') + + * (_.size(names) > 1 ? ', & ' : '') + _.last(names); + * }); + * + * say('hello', 'fred', 'barney', 'pebbles'); + * // => 'hello fred, barney, & pebbles' + */ + function rest(func, start) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + start = start === undefined ? start : toInteger(start); + return baseRest(func, start); + } + + /** + * Creates a function that invokes `func` with the `this` binding of the + * create function and an array of arguments much like + * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply). + * + * **Note:** This method is based on the + * [spread operator](https://mdn.io/spread_operator). + * + * @static + * @memberOf _ + * @since 3.2.0 + * @category Function + * @param {Function} func The function to spread arguments over. + * @param {number} [start=0] The start position of the spread. + * @returns {Function} Returns the new function. + * @example + * + * var say = _.spread(function(who, what) { + * return who + ' says ' + what; + * }); + * + * say(['fred', 'hello']); + * // => 'fred says hello' + * + * var numbers = Promise.all([ + * Promise.resolve(40), + * Promise.resolve(36) + * ]); + * + * numbers.then(_.spread(function(x, y) { + * return x + y; + * })); + * // => a Promise of 76 + */ + function spread(func, start) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + start = start == null ? 0 : nativeMax(toInteger(start), 0); + return baseRest(function(args) { + var array = args[start], + otherArgs = castSlice(args, 0, start); + + if (array) { + arrayPush(otherArgs, array); + } + return apply(func, this, otherArgs); + }); + } + + /** + * Creates a throttled function that only invokes `func` at most once per + * every `wait` milliseconds. The throttled function comes with a `cancel` + * method to cancel delayed `func` invocations and a `flush` method to + * immediately invoke them. Provide `options` to indicate whether `func` + * should be invoked on the leading and/or trailing edge of the `wait` + * timeout. The `func` is invoked with the last arguments provided to the + * throttled function. Subsequent calls to the throttled function return the + * result of the last `func` invocation. + * + * **Note:** If `leading` and `trailing` options are `true`, `func` is + * invoked on the trailing edge of the timeout only if the throttled function + * is invoked more than once during the `wait` timeout. + * + * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred + * until to the next tick, similar to `setTimeout` with a timeout of `0`. + * + * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) + * for details over the differences between `_.throttle` and `_.debounce`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to throttle. + * @param {number} [wait=0] The number of milliseconds to throttle invocations to. + * @param {Object} [options={}] The options object. + * @param {boolean} [options.leading=true] + * Specify invoking on the leading edge of the timeout. + * @param {boolean} [options.trailing=true] + * Specify invoking on the trailing edge of the timeout. + * @returns {Function} Returns the new throttled function. + * @example + * + * // Avoid excessively updating the position while scrolling. + * jQuery(window).on('scroll', _.throttle(updatePosition, 100)); + * + * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes. + * var throttled = _.throttle(renewToken, 300000, { 'trailing': false }); + * jQuery(element).on('click', throttled); + * + * // Cancel the trailing throttled invocation. + * jQuery(window).on('popstate', throttled.cancel); + */ + function throttle(func, wait, options) { + var leading = true, + trailing = true; + + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + if (isObject(options)) { + leading = 'leading' in options ? !!options.leading : leading; + trailing = 'trailing' in options ? !!options.trailing : trailing; + } + return debounce(func, wait, { + 'leading': leading, + 'maxWait': wait, + 'trailing': trailing + }); + } + + /** + * Creates a function that accepts up to one argument, ignoring any + * additional arguments. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Function + * @param {Function} func The function to cap arguments for. + * @returns {Function} Returns the new capped function. + * @example + * + * _.map(['6', '8', '10'], _.unary(parseInt)); + * // => [6, 8, 10] + */ + function unary(func) { + return ary(func, 1); + } + + /** + * Creates a function that provides `value` to `wrapper` as its first + * argument. Any additional arguments provided to the function are appended + * to those provided to the `wrapper`. The wrapper is invoked with the `this` + * binding of the created function. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {*} value The value to wrap. + * @param {Function} [wrapper=identity] The wrapper function. + * @returns {Function} Returns the new function. + * @example + * + * var p = _.wrap(_.escape, function(func, text) { + * return '

' + func(text) + '

'; + * }); + * + * p('fred, barney, & pebbles'); + * // => '

fred, barney, & pebbles

' + */ + function wrap(value, wrapper) { + return partial(castFunction(wrapper), value); + } + + /*------------------------------------------------------------------------*/ + + /** + * Casts `value` as an array if it's not one. + * + * @static + * @memberOf _ + * @since 4.4.0 + * @category Lang + * @param {*} value The value to inspect. + * @returns {Array} Returns the cast array. + * @example + * + * _.castArray(1); + * // => [1] + * + * _.castArray({ 'a': 1 }); + * // => [{ 'a': 1 }] + * + * _.castArray('abc'); + * // => ['abc'] + * + * _.castArray(null); + * // => [null] + * + * _.castArray(undefined); + * // => [undefined] + * + * _.castArray(); + * // => [] + * + * var array = [1, 2, 3]; + * console.log(_.castArray(array) === array); + * // => true + */ + function castArray() { + if (!arguments.length) { + return []; + } + var value = arguments[0]; + return isArray(value) ? value : [value]; + } + + /** + * Creates a shallow clone of `value`. + * + * **Note:** This method is loosely based on the + * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm) + * and supports cloning arrays, array buffers, booleans, date objects, maps, + * numbers, `Object` objects, regexes, sets, strings, symbols, and typed + * arrays. The own enumerable properties of `arguments` objects are cloned + * as plain objects. An empty object is returned for uncloneable values such + * as error objects, functions, DOM nodes, and WeakMaps. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to clone. + * @returns {*} Returns the cloned value. + * @see _.cloneDeep + * @example + * + * var objects = [{ 'a': 1 }, { 'b': 2 }]; + * + * var shallow = _.clone(objects); + * console.log(shallow[0] === objects[0]); + * // => true + */ + function clone(value) { + return baseClone(value, CLONE_SYMBOLS_FLAG); + } + + /** + * This method is like `_.clone` except that it accepts `customizer` which + * is invoked to produce the cloned value. If `customizer` returns `undefined`, + * cloning is handled by the method instead. The `customizer` is invoked with + * up to four arguments; (value [, index|key, object, stack]). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to clone. + * @param {Function} [customizer] The function to customize cloning. + * @returns {*} Returns the cloned value. + * @see _.cloneDeepWith + * @example + * + * function customizer(value) { + * if (_.isElement(value)) { + * return value.cloneNode(false); + * } + * } + * + * var el = _.cloneWith(document.body, customizer); + * + * console.log(el === document.body); + * // => false + * console.log(el.nodeName); + * // => 'BODY' + * console.log(el.childNodes.length); + * // => 0 + */ + function cloneWith(value, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return baseClone(value, CLONE_SYMBOLS_FLAG, customizer); + } + + /** + * This method is like `_.clone` except that it recursively clones `value`. + * + * @static + * @memberOf _ + * @since 1.0.0 + * @category Lang + * @param {*} value The value to recursively clone. + * @returns {*} Returns the deep cloned value. + * @see _.clone + * @example + * + * var objects = [{ 'a': 1 }, { 'b': 2 }]; + * + * var deep = _.cloneDeep(objects); + * console.log(deep[0] === objects[0]); + * // => false + */ + function cloneDeep(value) { + return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG); + } + + /** + * This method is like `_.cloneWith` except that it recursively clones `value`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to recursively clone. + * @param {Function} [customizer] The function to customize cloning. + * @returns {*} Returns the deep cloned value. + * @see _.cloneWith + * @example + * + * function customizer(value) { + * if (_.isElement(value)) { + * return value.cloneNode(true); + * } + * } + * + * var el = _.cloneDeepWith(document.body, customizer); + * + * console.log(el === document.body); + * // => false + * console.log(el.nodeName); + * // => 'BODY' + * console.log(el.childNodes.length); + * // => 20 + */ + function cloneDeepWith(value, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer); + } + + /** + * Checks if `object` conforms to `source` by invoking the predicate + * properties of `source` with the corresponding property values of `object`. + * + * **Note:** This method is equivalent to `_.conforms` when `source` is + * partially applied. + * + * @static + * @memberOf _ + * @since 4.14.0 + * @category Lang + * @param {Object} object The object to inspect. + * @param {Object} source The object of property predicates to conform to. + * @returns {boolean} Returns `true` if `object` conforms, else `false`. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * + * _.conformsTo(object, { 'b': function(n) { return n > 1; } }); + * // => true + * + * _.conformsTo(object, { 'b': function(n) { return n > 2; } }); + * // => false + */ + function conformsTo(object, source) { + return source == null || baseConformsTo(object, source, keys(source)); + } + + /** + * Performs a + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * comparison between two values to determine if they are equivalent. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; + * + * _.eq(object, object); + * // => true + * + * _.eq(object, other); + * // => false + * + * _.eq('a', 'a'); + * // => true + * + * _.eq('a', Object('a')); + * // => false + * + * _.eq(NaN, NaN); + * // => true + */ + function eq(value, other) { + return value === other || (value !== value && other !== other); + } + + /** + * Checks if `value` is greater than `other`. + * + * @static + * @memberOf _ + * @since 3.9.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is greater than `other`, + * else `false`. + * @see _.lt + * @example + * + * _.gt(3, 1); + * // => true + * + * _.gt(3, 3); + * // => false + * + * _.gt(1, 3); + * // => false + */ + var gt = createRelationalOperation(baseGt); + + /** + * Checks if `value` is greater than or equal to `other`. + * + * @static + * @memberOf _ + * @since 3.9.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is greater than or equal to + * `other`, else `false`. + * @see _.lte + * @example + * + * _.gte(3, 1); + * // => true + * + * _.gte(3, 3); + * // => true + * + * _.gte(1, 3); + * // => false + */ + var gte = createRelationalOperation(function(value, other) { + return value >= other; + }); + + /** + * Checks if `value` is likely an `arguments` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + * else `false`. + * @example + * + * _.isArguments(function() { return arguments; }()); + * // => true + * + * _.isArguments([1, 2, 3]); + * // => false + */ + var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) { + return isObjectLike(value) && hasOwnProperty.call(value, 'callee') && + !propertyIsEnumerable.call(value, 'callee'); + }; + + /** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(document.body.children); + * // => false + * + * _.isArray('abc'); + * // => false + * + * _.isArray(_.noop); + * // => false + */ + var isArray = Array.isArray; + + /** + * Checks if `value` is classified as an `ArrayBuffer` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`. + * @example + * + * _.isArrayBuffer(new ArrayBuffer(2)); + * // => true + * + * _.isArrayBuffer(new Array(2)); + * // => false + */ + var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer; + + /** + * Checks if `value` is array-like. A value is considered array-like if it's + * not a function and has a `value.length` that's an integer greater than or + * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. + * @example + * + * _.isArrayLike([1, 2, 3]); + * // => true + * + * _.isArrayLike(document.body.children); + * // => true + * + * _.isArrayLike('abc'); + * // => true + * + * _.isArrayLike(_.noop); + * // => false + */ + function isArrayLike(value) { + return value != null && isLength(value.length) && !isFunction(value); + } + + /** + * This method is like `_.isArrayLike` except that it also checks if `value` + * is an object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array-like object, + * else `false`. + * @example + * + * _.isArrayLikeObject([1, 2, 3]); + * // => true + * + * _.isArrayLikeObject(document.body.children); + * // => true + * + * _.isArrayLikeObject('abc'); + * // => false + * + * _.isArrayLikeObject(_.noop); + * // => false + */ + function isArrayLikeObject(value) { + return isObjectLike(value) && isArrayLike(value); + } + + /** + * Checks if `value` is classified as a boolean primitive or object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a boolean, else `false`. + * @example + * + * _.isBoolean(false); + * // => true + * + * _.isBoolean(null); + * // => false + */ + function isBoolean(value) { + return value === true || value === false || + (isObjectLike(value) && baseGetTag(value) == boolTag); + } + + /** + * Checks if `value` is a buffer. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a buffer, else `false`. + * @example + * + * _.isBuffer(new Buffer(2)); + * // => true + * + * _.isBuffer(new Uint8Array(2)); + * // => false + */ + var isBuffer = nativeIsBuffer || stubFalse; + + /** + * Checks if `value` is classified as a `Date` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a date object, else `false`. + * @example + * + * _.isDate(new Date); + * // => true + * + * _.isDate('Mon April 23 2012'); + * // => false + */ + var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate; + + /** + * Checks if `value` is likely a DOM element. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`. + * @example + * + * _.isElement(document.body); + * // => true + * + * _.isElement(''); + * // => false + */ + function isElement(value) { + return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value); + } + + /** + * Checks if `value` is an empty object, collection, map, or set. + * + * Objects are considered empty if they have no own enumerable string keyed + * properties. + * + * Array-like values such as `arguments` objects, arrays, buffers, strings, or + * jQuery-like collections are considered empty if they have a `length` of `0`. + * Similarly, maps and sets are considered empty if they have a `size` of `0`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is empty, else `false`. + * @example + * + * _.isEmpty(null); + * // => true + * + * _.isEmpty(true); + * // => true + * + * _.isEmpty(1); + * // => true + * + * _.isEmpty([1, 2, 3]); + * // => false + * + * _.isEmpty({ 'a': 1 }); + * // => false + */ + function isEmpty(value) { + if (value == null) { + return true; + } + if (isArrayLike(value) && + (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' || + isBuffer(value) || isTypedArray(value) || isArguments(value))) { + return !value.length; + } + var tag = getTag(value); + if (tag == mapTag || tag == setTag) { + return !value.size; + } + if (isPrototype(value)) { + return !baseKeys(value).length; + } + for (var key in value) { + if (hasOwnProperty.call(value, key)) { + return false; + } + } + return true; + } + + /** + * Performs a deep comparison between two values to determine if they are + * equivalent. + * + * **Note:** This method supports comparing arrays, array buffers, booleans, + * date objects, error objects, maps, numbers, `Object` objects, regexes, + * sets, strings, symbols, and typed arrays. `Object` objects are compared + * by their own, not inherited, enumerable properties. Functions and DOM + * nodes are compared by strict equality, i.e. `===`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; + * + * _.isEqual(object, other); + * // => true + * + * object === other; + * // => false + */ + function isEqual(value, other) { + return baseIsEqual(value, other); + } + + /** + * This method is like `_.isEqual` except that it accepts `customizer` which + * is invoked to compare values. If `customizer` returns `undefined`, comparisons + * are handled by the method instead. The `customizer` is invoked with up to + * six arguments: (objValue, othValue [, index|key, object, other, stack]). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @param {Function} [customizer] The function to customize comparisons. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * function isGreeting(value) { + * return /^h(?:i|ello)$/.test(value); + * } + * + * function customizer(objValue, othValue) { + * if (isGreeting(objValue) && isGreeting(othValue)) { + * return true; + * } + * } + * + * var array = ['hello', 'goodbye']; + * var other = ['hi', 'goodbye']; + * + * _.isEqualWith(array, other, customizer); + * // => true + */ + function isEqualWith(value, other, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + var result = customizer ? customizer(value, other) : undefined; + return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result; + } + + /** + * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`, + * `SyntaxError`, `TypeError`, or `URIError` object. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an error object, else `false`. + * @example + * + * _.isError(new Error); + * // => true + * + * _.isError(Error); + * // => false + */ + function isError(value) { + if (!isObjectLike(value)) { + return false; + } + var tag = baseGetTag(value); + return tag == errorTag || tag == domExcTag || + (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value)); + } + + /** + * Checks if `value` is a finite primitive number. + * + * **Note:** This method is based on + * [`Number.isFinite`](https://mdn.io/Number/isFinite). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a finite number, else `false`. + * @example + * + * _.isFinite(3); + * // => true + * + * _.isFinite(Number.MIN_VALUE); + * // => true + * + * _.isFinite(Infinity); + * // => false + * + * _.isFinite('3'); + * // => false + */ + function isFinite(value) { + return typeof value == 'number' && nativeIsFinite(value); + } + + /** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a function, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ + function isFunction(value) { + if (!isObject(value)) { + return false; + } + // The use of `Object#toString` avoids issues with the `typeof` operator + // in Safari 9 which returns 'object' for typed arrays and other constructors. + var tag = baseGetTag(value); + return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; + } + + /** + * Checks if `value` is an integer. + * + * **Note:** This method is based on + * [`Number.isInteger`](https://mdn.io/Number/isInteger). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an integer, else `false`. + * @example + * + * _.isInteger(3); + * // => true + * + * _.isInteger(Number.MIN_VALUE); + * // => false + * + * _.isInteger(Infinity); + * // => false + * + * _.isInteger('3'); + * // => false + */ + function isInteger(value) { + return typeof value == 'number' && value == toInteger(value); + } + + /** + * Checks if `value` is a valid array-like length. + * + * **Note:** This method is loosely based on + * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + * @example + * + * _.isLength(3); + * // => true + * + * _.isLength(Number.MIN_VALUE); + * // => false + * + * _.isLength(Infinity); + * // => false + * + * _.isLength('3'); + * // => false + */ + function isLength(value) { + return typeof value == 'number' && + value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; + } + + /** + * Checks if `value` is the + * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) + * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(_.noop); + * // => true + * + * _.isObject(null); + * // => false + */ + function isObject(value) { + var type = typeof value; + return value != null && (type == 'object' || type == 'function'); + } + + /** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ + function isObjectLike(value) { + return value != null && typeof value == 'object'; + } + + /** + * Checks if `value` is classified as a `Map` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a map, else `false`. + * @example + * + * _.isMap(new Map); + * // => true + * + * _.isMap(new WeakMap); + * // => false + */ + var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap; + + /** + * Performs a partial deep comparison between `object` and `source` to + * determine if `object` contains equivalent property values. + * + * **Note:** This method is equivalent to `_.matches` when `source` is + * partially applied. + * + * Partial comparisons will match empty array and empty object `source` + * values against any array or object value, respectively. See `_.isEqual` + * for a list of supported value comparisons. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {Object} object The object to inspect. + * @param {Object} source The object of property values to match. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * + * _.isMatch(object, { 'b': 2 }); + * // => true + * + * _.isMatch(object, { 'b': 1 }); + * // => false + */ + function isMatch(object, source) { + return object === source || baseIsMatch(object, source, getMatchData(source)); + } + + /** + * This method is like `_.isMatch` except that it accepts `customizer` which + * is invoked to compare values. If `customizer` returns `undefined`, comparisons + * are handled by the method instead. The `customizer` is invoked with five + * arguments: (objValue, srcValue, index|key, object, source). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {Object} object The object to inspect. + * @param {Object} source The object of property values to match. + * @param {Function} [customizer] The function to customize comparisons. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + * @example + * + * function isGreeting(value) { + * return /^h(?:i|ello)$/.test(value); + * } + * + * function customizer(objValue, srcValue) { + * if (isGreeting(objValue) && isGreeting(srcValue)) { + * return true; + * } + * } + * + * var object = { 'greeting': 'hello' }; + * var source = { 'greeting': 'hi' }; + * + * _.isMatchWith(object, source, customizer); + * // => true + */ + function isMatchWith(object, source, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return baseIsMatch(object, source, getMatchData(source), customizer); + } + + /** + * Checks if `value` is `NaN`. + * + * **Note:** This method is based on + * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as + * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for + * `undefined` and other non-number values. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. + * @example + * + * _.isNaN(NaN); + * // => true + * + * _.isNaN(new Number(NaN)); + * // => true + * + * isNaN(undefined); + * // => true + * + * _.isNaN(undefined); + * // => false + */ + function isNaN(value) { + // An `NaN` primitive is the only value that is not equal to itself. + // Perform the `toStringTag` check first to avoid errors with some + // ActiveX objects in IE. + return isNumber(value) && value != +value; + } + + /** + * Checks if `value` is a pristine native function. + * + * **Note:** This method can't reliably detect native functions in the presence + * of the core-js package because core-js circumvents this kind of detection. + * Despite multiple requests, the core-js maintainer has made it clear: any + * attempt to fix the detection will be obstructed. As a result, we're left + * with little choice but to throw an error. Unfortunately, this also affects + * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill), + * which rely on core-js. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. + * @example + * + * _.isNative(Array.prototype.push); + * // => true + * + * _.isNative(_); + * // => false + */ + function isNative(value) { + if (isMaskable(value)) { + throw new Error(CORE_ERROR_TEXT); + } + return baseIsNative(value); + } + + /** + * Checks if `value` is `null`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `null`, else `false`. + * @example + * + * _.isNull(null); + * // => true + * + * _.isNull(void 0); + * // => false + */ + function isNull(value) { + return value === null; + } + + /** + * Checks if `value` is `null` or `undefined`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is nullish, else `false`. + * @example + * + * _.isNil(null); + * // => true + * + * _.isNil(void 0); + * // => true + * + * _.isNil(NaN); + * // => false + */ + function isNil(value) { + return value == null; + } + + /** + * Checks if `value` is classified as a `Number` primitive or object. + * + * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are + * classified as numbers, use the `_.isFinite` method. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a number, else `false`. + * @example + * + * _.isNumber(3); + * // => true + * + * _.isNumber(Number.MIN_VALUE); + * // => true + * + * _.isNumber(Infinity); + * // => true + * + * _.isNumber('3'); + * // => false + */ + function isNumber(value) { + return typeof value == 'number' || + (isObjectLike(value) && baseGetTag(value) == numberTag); + } + + /** + * Checks if `value` is a plain object, that is, an object created by the + * `Object` constructor or one with a `[[Prototype]]` of `null`. + * + * @static + * @memberOf _ + * @since 0.8.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a plain object, else `false`. + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * _.isPlainObject(new Foo); + * // => false + * + * _.isPlainObject([1, 2, 3]); + * // => false + * + * _.isPlainObject({ 'x': 0, 'y': 0 }); + * // => true + * + * _.isPlainObject(Object.create(null)); + * // => true + */ + function isPlainObject(value) { + if (!isObjectLike(value) || baseGetTag(value) != objectTag) { + return false; + } + var proto = getPrototype(value); + if (proto === null) { + return true; + } + var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor; + return typeof Ctor == 'function' && Ctor instanceof Ctor && + funcToString.call(Ctor) == objectCtorString; + } + + /** + * Checks if `value` is classified as a `RegExp` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a regexp, else `false`. + * @example + * + * _.isRegExp(/abc/); + * // => true + * + * _.isRegExp('/abc/'); + * // => false + */ + var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp; + + /** + * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754 + * double precision number which isn't the result of a rounded unsafe integer. + * + * **Note:** This method is based on + * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`. + * @example + * + * _.isSafeInteger(3); + * // => true + * + * _.isSafeInteger(Number.MIN_VALUE); + * // => false + * + * _.isSafeInteger(Infinity); + * // => false + * + * _.isSafeInteger('3'); + * // => false + */ + function isSafeInteger(value) { + return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER; + } + + /** + * Checks if `value` is classified as a `Set` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a set, else `false`. + * @example + * + * _.isSet(new Set); + * // => true + * + * _.isSet(new WeakSet); + * // => false + */ + var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet; + + /** + * Checks if `value` is classified as a `String` primitive or object. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a string, else `false`. + * @example + * + * _.isString('abc'); + * // => true + * + * _.isString(1); + * // => false + */ + function isString(value) { + return typeof value == 'string' || + (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag); + } + + /** + * Checks if `value` is classified as a `Symbol` primitive or object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. + * @example + * + * _.isSymbol(Symbol.iterator); + * // => true + * + * _.isSymbol('abc'); + * // => false + */ + function isSymbol(value) { + return typeof value == 'symbol' || + (isObjectLike(value) && baseGetTag(value) == symbolTag); + } + + /** + * Checks if `value` is classified as a typed array. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. + * @example + * + * _.isTypedArray(new Uint8Array); + * // => true + * + * _.isTypedArray([]); + * // => false + */ + var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray; + + /** + * Checks if `value` is `undefined`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`. + * @example + * + * _.isUndefined(void 0); + * // => true + * + * _.isUndefined(null); + * // => false + */ + function isUndefined(value) { + return value === undefined; + } + + /** + * Checks if `value` is classified as a `WeakMap` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a weak map, else `false`. + * @example + * + * _.isWeakMap(new WeakMap); + * // => true + * + * _.isWeakMap(new Map); + * // => false + */ + function isWeakMap(value) { + return isObjectLike(value) && getTag(value) == weakMapTag; + } + + /** + * Checks if `value` is classified as a `WeakSet` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a weak set, else `false`. + * @example + * + * _.isWeakSet(new WeakSet); + * // => true + * + * _.isWeakSet(new Set); + * // => false + */ + function isWeakSet(value) { + return isObjectLike(value) && baseGetTag(value) == weakSetTag; + } + + /** + * Checks if `value` is less than `other`. + * + * @static + * @memberOf _ + * @since 3.9.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is less than `other`, + * else `false`. + * @see _.gt + * @example + * + * _.lt(1, 3); + * // => true + * + * _.lt(3, 3); + * // => false + * + * _.lt(3, 1); + * // => false + */ + var lt = createRelationalOperation(baseLt); + + /** + * Checks if `value` is less than or equal to `other`. + * + * @static + * @memberOf _ + * @since 3.9.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is less than or equal to + * `other`, else `false`. + * @see _.gte + * @example + * + * _.lte(1, 3); + * // => true + * + * _.lte(3, 3); + * // => true + * + * _.lte(3, 1); + * // => false + */ + var lte = createRelationalOperation(function(value, other) { + return value <= other; + }); + + /** + * Converts `value` to an array. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Lang + * @param {*} value The value to convert. + * @returns {Array} Returns the converted array. + * @example + * + * _.toArray({ 'a': 1, 'b': 2 }); + * // => [1, 2] + * + * _.toArray('abc'); + * // => ['a', 'b', 'c'] + * + * _.toArray(1); + * // => [] + * + * _.toArray(null); + * // => [] + */ + function toArray(value) { + if (!value) { + return []; + } + if (isArrayLike(value)) { + return isString(value) ? stringToArray(value) : copyArray(value); + } + if (symIterator && value[symIterator]) { + return iteratorToArray(value[symIterator]()); + } + var tag = getTag(value), + func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values); + + return func(value); + } + + /** + * Converts `value` to a finite number. + * + * @static + * @memberOf _ + * @since 4.12.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted number. + * @example + * + * _.toFinite(3.2); + * // => 3.2 + * + * _.toFinite(Number.MIN_VALUE); + * // => 5e-324 + * + * _.toFinite(Infinity); + * // => 1.7976931348623157e+308 + * + * _.toFinite('3.2'); + * // => 3.2 + */ + function toFinite(value) { + if (!value) { + return value === 0 ? value : 0; + } + value = toNumber(value); + if (value === INFINITY || value === -INFINITY) { + var sign = (value < 0 ? -1 : 1); + return sign * MAX_INTEGER; + } + return value === value ? value : 0; + } + + /** + * Converts `value` to an integer. + * + * **Note:** This method is loosely based on + * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted integer. + * @example + * + * _.toInteger(3.2); + * // => 3 + * + * _.toInteger(Number.MIN_VALUE); + * // => 0 + * + * _.toInteger(Infinity); + * // => 1.7976931348623157e+308 + * + * _.toInteger('3.2'); + * // => 3 + */ + function toInteger(value) { + var result = toFinite(value), + remainder = result % 1; + + return result === result ? (remainder ? result - remainder : result) : 0; + } + + /** + * Converts `value` to an integer suitable for use as the length of an + * array-like object. + * + * **Note:** This method is based on + * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted integer. + * @example + * + * _.toLength(3.2); + * // => 3 + * + * _.toLength(Number.MIN_VALUE); + * // => 0 + * + * _.toLength(Infinity); + * // => 4294967295 + * + * _.toLength('3.2'); + * // => 3 + */ + function toLength(value) { + return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0; + } + + /** + * Converts `value` to a number. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to process. + * @returns {number} Returns the number. + * @example + * + * _.toNumber(3.2); + * // => 3.2 + * + * _.toNumber(Number.MIN_VALUE); + * // => 5e-324 + * + * _.toNumber(Infinity); + * // => Infinity + * + * _.toNumber('3.2'); + * // => 3.2 + */ + function toNumber(value) { + if (typeof value == 'number') { + return value; + } + if (isSymbol(value)) { + return NAN; + } + if (isObject(value)) { + var other = typeof value.valueOf == 'function' ? value.valueOf() : value; + value = isObject(other) ? (other + '') : other; + } + if (typeof value != 'string') { + return value === 0 ? value : +value; + } + value = baseTrim(value); + var isBinary = reIsBinary.test(value); + return (isBinary || reIsOctal.test(value)) + ? freeParseInt(value.slice(2), isBinary ? 2 : 8) + : (reIsBadHex.test(value) ? NAN : +value); + } + + /** + * Converts `value` to a plain object flattening inherited enumerable string + * keyed properties of `value` to own properties of the plain object. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {Object} Returns the converted plain object. + * @example + * + * function Foo() { + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.assign({ 'a': 1 }, new Foo); + * // => { 'a': 1, 'b': 2 } + * + * _.assign({ 'a': 1 }, _.toPlainObject(new Foo)); + * // => { 'a': 1, 'b': 2, 'c': 3 } + */ + function toPlainObject(value) { + return copyObject(value, keysIn(value)); + } + + /** + * Converts `value` to a safe integer. A safe integer can be compared and + * represented correctly. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted integer. + * @example + * + * _.toSafeInteger(3.2); + * // => 3 + * + * _.toSafeInteger(Number.MIN_VALUE); + * // => 0 + * + * _.toSafeInteger(Infinity); + * // => 9007199254740991 + * + * _.toSafeInteger('3.2'); + * // => 3 + */ + function toSafeInteger(value) { + return value + ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER) + : (value === 0 ? value : 0); + } + + /** + * Converts `value` to a string. An empty string is returned for `null` + * and `undefined` values. The sign of `-0` is preserved. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + * @example + * + * _.toString(null); + * // => '' + * + * _.toString(-0); + * // => '-0' + * + * _.toString([1, 2, 3]); + * // => '1,2,3' + */ + function toString(value) { + return value == null ? '' : baseToString(value); + } + + /*------------------------------------------------------------------------*/ + + /** + * Assigns own enumerable string keyed properties of source objects to the + * destination object. Source objects are applied from left to right. + * Subsequent sources overwrite property assignments of previous sources. + * + * **Note:** This method mutates `object` and is loosely based on + * [`Object.assign`](https://mdn.io/Object/assign). + * + * @static + * @memberOf _ + * @since 0.10.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.assignIn + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * function Bar() { + * this.c = 3; + * } + * + * Foo.prototype.b = 2; + * Bar.prototype.d = 4; + * + * _.assign({ 'a': 0 }, new Foo, new Bar); + * // => { 'a': 1, 'c': 3 } + */ + var assign = createAssigner(function(object, source) { + if (isPrototype(source) || isArrayLike(source)) { + copyObject(source, keys(source), object); + return; + } + for (var key in source) { + if (hasOwnProperty.call(source, key)) { + assignValue(object, key, source[key]); + } + } + }); + + /** + * This method is like `_.assign` except that it iterates over own and + * inherited source properties. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias extend + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.assign + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * function Bar() { + * this.c = 3; + * } + * + * Foo.prototype.b = 2; + * Bar.prototype.d = 4; + * + * _.assignIn({ 'a': 0 }, new Foo, new Bar); + * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 } + */ + var assignIn = createAssigner(function(object, source) { + copyObject(source, keysIn(source), object); + }); + + /** + * This method is like `_.assignIn` except that it accepts `customizer` + * which is invoked to produce the assigned values. If `customizer` returns + * `undefined`, assignment is handled by the method instead. The `customizer` + * is invoked with five arguments: (objValue, srcValue, key, object, source). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias extendWith + * @category Object + * @param {Object} object The destination object. + * @param {...Object} sources The source objects. + * @param {Function} [customizer] The function to customize assigned values. + * @returns {Object} Returns `object`. + * @see _.assignWith + * @example + * + * function customizer(objValue, srcValue) { + * return _.isUndefined(objValue) ? srcValue : objValue; + * } + * + * var defaults = _.partialRight(_.assignInWith, customizer); + * + * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); + * // => { 'a': 1, 'b': 2 } + */ + var assignInWith = createAssigner(function(object, source, srcIndex, customizer) { + copyObject(source, keysIn(source), object, customizer); + }); + + /** + * This method is like `_.assign` except that it accepts `customizer` + * which is invoked to produce the assigned values. If `customizer` returns + * `undefined`, assignment is handled by the method instead. The `customizer` + * is invoked with five arguments: (objValue, srcValue, key, object, source). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} sources The source objects. + * @param {Function} [customizer] The function to customize assigned values. + * @returns {Object} Returns `object`. + * @see _.assignInWith + * @example + * + * function customizer(objValue, srcValue) { + * return _.isUndefined(objValue) ? srcValue : objValue; + * } + * + * var defaults = _.partialRight(_.assignWith, customizer); + * + * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); + * // => { 'a': 1, 'b': 2 } + */ + var assignWith = createAssigner(function(object, source, srcIndex, customizer) { + copyObject(source, keys(source), object, customizer); + }); + + /** + * Creates an array of values corresponding to `paths` of `object`. + * + * @static + * @memberOf _ + * @since 1.0.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {...(string|string[])} [paths] The property paths to pick. + * @returns {Array} Returns the picked values. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] }; + * + * _.at(object, ['a[0].b.c', 'a[1]']); + * // => [3, 4] + */ + var at = flatRest(baseAt); + + /** + * Creates an object that inherits from the `prototype` object. If a + * `properties` object is given, its own enumerable string keyed properties + * are assigned to the created object. + * + * @static + * @memberOf _ + * @since 2.3.0 + * @category Object + * @param {Object} prototype The object to inherit from. + * @param {Object} [properties] The properties to assign to the object. + * @returns {Object} Returns the new object. + * @example + * + * function Shape() { + * this.x = 0; + * this.y = 0; + * } + * + * function Circle() { + * Shape.call(this); + * } + * + * Circle.prototype = _.create(Shape.prototype, { + * 'constructor': Circle + * }); + * + * var circle = new Circle; + * circle instanceof Circle; + * // => true + * + * circle instanceof Shape; + * // => true + */ + function create(prototype, properties) { + var result = baseCreate(prototype); + return properties == null ? result : baseAssign(result, properties); + } + + /** + * Assigns own and inherited enumerable string keyed properties of source + * objects to the destination object for all destination properties that + * resolve to `undefined`. Source objects are applied from left to right. + * Once a property is set, additional values of the same property are ignored. + * + * **Note:** This method mutates `object`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.defaultsDeep + * @example + * + * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); + * // => { 'a': 1, 'b': 2 } + */ + var defaults = baseRest(function(object, sources) { + object = Object(object); + + var index = -1; + var length = sources.length; + var guard = length > 2 ? sources[2] : undefined; + + if (guard && isIterateeCall(sources[0], sources[1], guard)) { + length = 1; + } + + while (++index < length) { + var source = sources[index]; + var props = keysIn(source); + var propsIndex = -1; + var propsLength = props.length; + + while (++propsIndex < propsLength) { + var key = props[propsIndex]; + var value = object[key]; + + if (value === undefined || + (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) { + object[key] = source[key]; + } + } + } + + return object; + }); + + /** + * This method is like `_.defaults` except that it recursively assigns + * default properties. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 3.10.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.defaults + * @example + * + * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } }); + * // => { 'a': { 'b': 2, 'c': 3 } } + */ + var defaultsDeep = baseRest(function(args) { + args.push(undefined, customDefaultsMerge); + return apply(mergeWith, undefined, args); + }); + + /** + * This method is like `_.find` except that it returns the key of the first + * element `predicate` returns truthy for instead of the element itself. + * + * @static + * @memberOf _ + * @since 1.1.0 + * @category Object + * @param {Object} object The object to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {string|undefined} Returns the key of the matched element, + * else `undefined`. + * @example + * + * var users = { + * 'barney': { 'age': 36, 'active': true }, + * 'fred': { 'age': 40, 'active': false }, + * 'pebbles': { 'age': 1, 'active': true } + * }; + * + * _.findKey(users, function(o) { return o.age < 40; }); + * // => 'barney' (iteration order is not guaranteed) + * + * // The `_.matches` iteratee shorthand. + * _.findKey(users, { 'age': 1, 'active': true }); + * // => 'pebbles' + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findKey(users, ['active', false]); + * // => 'fred' + * + * // The `_.property` iteratee shorthand. + * _.findKey(users, 'active'); + * // => 'barney' + */ + function findKey(object, predicate) { + return baseFindKey(object, getIteratee(predicate, 3), baseForOwn); + } + + /** + * This method is like `_.findKey` except that it iterates over elements of + * a collection in the opposite order. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Object + * @param {Object} object The object to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {string|undefined} Returns the key of the matched element, + * else `undefined`. + * @example + * + * var users = { + * 'barney': { 'age': 36, 'active': true }, + * 'fred': { 'age': 40, 'active': false }, + * 'pebbles': { 'age': 1, 'active': true } + * }; + * + * _.findLastKey(users, function(o) { return o.age < 40; }); + * // => returns 'pebbles' assuming `_.findKey` returns 'barney' + * + * // The `_.matches` iteratee shorthand. + * _.findLastKey(users, { 'age': 36, 'active': true }); + * // => 'barney' + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findLastKey(users, ['active', false]); + * // => 'fred' + * + * // The `_.property` iteratee shorthand. + * _.findLastKey(users, 'active'); + * // => 'pebbles' + */ + function findLastKey(object, predicate) { + return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight); + } + + /** + * Iterates over own and inherited enumerable string keyed properties of an + * object and invokes `iteratee` for each property. The iteratee is invoked + * with three arguments: (value, key, object). Iteratee functions may exit + * iteration early by explicitly returning `false`. + * + * @static + * @memberOf _ + * @since 0.3.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forInRight + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forIn(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed). + */ + function forIn(object, iteratee) { + return object == null + ? object + : baseFor(object, getIteratee(iteratee, 3), keysIn); + } + + /** + * This method is like `_.forIn` except that it iterates over properties of + * `object` in the opposite order. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forIn + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forInRight(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'. + */ + function forInRight(object, iteratee) { + return object == null + ? object + : baseForRight(object, getIteratee(iteratee, 3), keysIn); + } + + /** + * Iterates over own enumerable string keyed properties of an object and + * invokes `iteratee` for each property. The iteratee is invoked with three + * arguments: (value, key, object). Iteratee functions may exit iteration + * early by explicitly returning `false`. + * + * @static + * @memberOf _ + * @since 0.3.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forOwnRight + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forOwn(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'a' then 'b' (iteration order is not guaranteed). + */ + function forOwn(object, iteratee) { + return object && baseForOwn(object, getIteratee(iteratee, 3)); + } + + /** + * This method is like `_.forOwn` except that it iterates over properties of + * `object` in the opposite order. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forOwn + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forOwnRight(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'. + */ + function forOwnRight(object, iteratee) { + return object && baseForOwnRight(object, getIteratee(iteratee, 3)); + } + + /** + * Creates an array of function property names from own enumerable properties + * of `object`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to inspect. + * @returns {Array} Returns the function names. + * @see _.functionsIn + * @example + * + * function Foo() { + * this.a = _.constant('a'); + * this.b = _.constant('b'); + * } + * + * Foo.prototype.c = _.constant('c'); + * + * _.functions(new Foo); + * // => ['a', 'b'] + */ + function functions(object) { + return object == null ? [] : baseFunctions(object, keys(object)); + } + + /** + * Creates an array of function property names from own and inherited + * enumerable properties of `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to inspect. + * @returns {Array} Returns the function names. + * @see _.functions + * @example + * + * function Foo() { + * this.a = _.constant('a'); + * this.b = _.constant('b'); + * } + * + * Foo.prototype.c = _.constant('c'); + * + * _.functionsIn(new Foo); + * // => ['a', 'b', 'c'] + */ + function functionsIn(object) { + return object == null ? [] : baseFunctions(object, keysIn(object)); + } + + /** + * Gets the value at `path` of `object`. If the resolved value is + * `undefined`, the `defaultValue` is returned in its place. + * + * @static + * @memberOf _ + * @since 3.7.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @param {*} [defaultValue] The value returned for `undefined` resolved values. + * @returns {*} Returns the resolved value. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.get(object, 'a[0].b.c'); + * // => 3 + * + * _.get(object, ['a', '0', 'b', 'c']); + * // => 3 + * + * _.get(object, 'a.b.c', 'default'); + * // => 'default' + */ + function get(object, path, defaultValue) { + var result = object == null ? undefined : baseGet(object, path); + return result === undefined ? defaultValue : result; + } + + /** + * Checks if `path` is a direct property of `object`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + * @example + * + * var object = { 'a': { 'b': 2 } }; + * var other = _.create({ 'a': _.create({ 'b': 2 }) }); + * + * _.has(object, 'a'); + * // => true + * + * _.has(object, 'a.b'); + * // => true + * + * _.has(object, ['a', 'b']); + * // => true + * + * _.has(other, 'a'); + * // => false + */ + function has(object, path) { + return object != null && hasPath(object, path, baseHas); + } + + /** + * Checks if `path` is a direct or inherited property of `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + * @example + * + * var object = _.create({ 'a': _.create({ 'b': 2 }) }); + * + * _.hasIn(object, 'a'); + * // => true + * + * _.hasIn(object, 'a.b'); + * // => true + * + * _.hasIn(object, ['a', 'b']); + * // => true + * + * _.hasIn(object, 'b'); + * // => false + */ + function hasIn(object, path) { + return object != null && hasPath(object, path, baseHasIn); + } + + /** + * Creates an object composed of the inverted keys and values of `object`. + * If `object` contains duplicate values, subsequent values overwrite + * property assignments of previous values. + * + * @static + * @memberOf _ + * @since 0.7.0 + * @category Object + * @param {Object} object The object to invert. + * @returns {Object} Returns the new inverted object. + * @example + * + * var object = { 'a': 1, 'b': 2, 'c': 1 }; + * + * _.invert(object); + * // => { '1': 'c', '2': 'b' } + */ + var invert = createInverter(function(result, value, key) { + if (value != null && + typeof value.toString != 'function') { + value = nativeObjectToString.call(value); + } + + result[value] = key; + }, constant(identity)); + + /** + * This method is like `_.invert` except that the inverted object is generated + * from the results of running each element of `object` thru `iteratee`. The + * corresponding inverted value of each inverted key is an array of keys + * responsible for generating the inverted value. The iteratee is invoked + * with one argument: (value). + * + * @static + * @memberOf _ + * @since 4.1.0 + * @category Object + * @param {Object} object The object to invert. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Object} Returns the new inverted object. + * @example + * + * var object = { 'a': 1, 'b': 2, 'c': 1 }; + * + * _.invertBy(object); + * // => { '1': ['a', 'c'], '2': ['b'] } + * + * _.invertBy(object, function(value) { + * return 'group' + value; + * }); + * // => { 'group1': ['a', 'c'], 'group2': ['b'] } + */ + var invertBy = createInverter(function(result, value, key) { + if (value != null && + typeof value.toString != 'function') { + value = nativeObjectToString.call(value); + } + + if (hasOwnProperty.call(result, value)) { + result[value].push(key); + } else { + result[value] = [key]; + } + }, getIteratee); + + /** + * Invokes the method at `path` of `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the method to invoke. + * @param {...*} [args] The arguments to invoke the method with. + * @returns {*} Returns the result of the invoked method. + * @example + * + * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] }; + * + * _.invoke(object, 'a[0].b.c.slice', 1, 3); + * // => [2, 3] + */ + var invoke = baseRest(baseInvoke); + + /** + * Creates an array of the own enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. See the + * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) + * for more details. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keys(new Foo); + * // => ['a', 'b'] (iteration order is not guaranteed) + * + * _.keys('hi'); + * // => ['0', '1'] + */ + function keys(object) { + return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object); + } + + /** + * Creates an array of the own and inherited enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keysIn(new Foo); + * // => ['a', 'b', 'c'] (iteration order is not guaranteed) + */ + function keysIn(object) { + return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object); + } + + /** + * The opposite of `_.mapValues`; this method creates an object with the + * same values as `object` and keys generated by running each own enumerable + * string keyed property of `object` thru `iteratee`. The iteratee is invoked + * with three arguments: (value, key, object). + * + * @static + * @memberOf _ + * @since 3.8.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns the new mapped object. + * @see _.mapValues + * @example + * + * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) { + * return key + value; + * }); + * // => { 'a1': 1, 'b2': 2 } + */ + function mapKeys(object, iteratee) { + var result = {}; + iteratee = getIteratee(iteratee, 3); + + baseForOwn(object, function(value, key, object) { + baseAssignValue(result, iteratee(value, key, object), value); + }); + return result; + } + + /** + * Creates an object with the same keys as `object` and values generated + * by running each own enumerable string keyed property of `object` thru + * `iteratee`. The iteratee is invoked with three arguments: + * (value, key, object). + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns the new mapped object. + * @see _.mapKeys + * @example + * + * var users = { + * 'fred': { 'user': 'fred', 'age': 40 }, + * 'pebbles': { 'user': 'pebbles', 'age': 1 } + * }; + * + * _.mapValues(users, function(o) { return o.age; }); + * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) + * + * // The `_.property` iteratee shorthand. + * _.mapValues(users, 'age'); + * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) + */ + function mapValues(object, iteratee) { + var result = {}; + iteratee = getIteratee(iteratee, 3); + + baseForOwn(object, function(value, key, object) { + baseAssignValue(result, key, iteratee(value, key, object)); + }); + return result; + } + + /** + * This method is like `_.assign` except that it recursively merges own and + * inherited enumerable string keyed properties of source objects into the + * destination object. Source properties that resolve to `undefined` are + * skipped if a destination value exists. Array and plain object properties + * are merged recursively. Other objects and value types are overridden by + * assignment. Source objects are applied from left to right. Subsequent + * sources overwrite property assignments of previous sources. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 0.5.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @example + * + * var object = { + * 'a': [{ 'b': 2 }, { 'd': 4 }] + * }; + * + * var other = { + * 'a': [{ 'c': 3 }, { 'e': 5 }] + * }; + * + * _.merge(object, other); + * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] } + */ + var merge = createAssigner(function(object, source, srcIndex) { + baseMerge(object, source, srcIndex); + }); + + /** + * This method is like `_.merge` except that it accepts `customizer` which + * is invoked to produce the merged values of the destination and source + * properties. If `customizer` returns `undefined`, merging is handled by the + * method instead. The `customizer` is invoked with six arguments: + * (objValue, srcValue, key, object, source, stack). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} sources The source objects. + * @param {Function} customizer The function to customize assigned values. + * @returns {Object} Returns `object`. + * @example + * + * function customizer(objValue, srcValue) { + * if (_.isArray(objValue)) { + * return objValue.concat(srcValue); + * } + * } + * + * var object = { 'a': [1], 'b': [2] }; + * var other = { 'a': [3], 'b': [4] }; + * + * _.mergeWith(object, other, customizer); + * // => { 'a': [1, 3], 'b': [2, 4] } + */ + var mergeWith = createAssigner(function(object, source, srcIndex, customizer) { + baseMerge(object, source, srcIndex, customizer); + }); + + /** + * The opposite of `_.pick`; this method creates an object composed of the + * own and inherited enumerable property paths of `object` that are not omitted. + * + * **Note:** This method is considerably slower than `_.pick`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The source object. + * @param {...(string|string[])} [paths] The property paths to omit. + * @returns {Object} Returns the new object. + * @example + * + * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * + * _.omit(object, ['a', 'c']); + * // => { 'b': '2' } + */ + var omit = flatRest(function(object, paths) { + var result = {}; + if (object == null) { + return result; + } + var isDeep = false; + paths = arrayMap(paths, function(path) { + path = castPath(path, object); + isDeep || (isDeep = path.length > 1); + return path; + }); + copyObject(object, getAllKeysIn(object), result); + if (isDeep) { + result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone); + } + var length = paths.length; + while (length--) { + baseUnset(result, paths[length]); + } + return result; + }); + + /** + * The opposite of `_.pickBy`; this method creates an object composed of + * the own and inherited enumerable string keyed properties of `object` that + * `predicate` doesn't return truthy for. The predicate is invoked with two + * arguments: (value, key). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The source object. + * @param {Function} [predicate=_.identity] The function invoked per property. + * @returns {Object} Returns the new object. + * @example + * + * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * + * _.omitBy(object, _.isNumber); + * // => { 'b': '2' } + */ + function omitBy(object, predicate) { + return pickBy(object, negate(getIteratee(predicate))); + } + + /** + * Creates an object composed of the picked `object` properties. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The source object. + * @param {...(string|string[])} [paths] The property paths to pick. + * @returns {Object} Returns the new object. + * @example + * + * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * + * _.pick(object, ['a', 'c']); + * // => { 'a': 1, 'c': 3 } + */ + var pick = flatRest(function(object, paths) { + return object == null ? {} : basePick(object, paths); + }); + + /** + * Creates an object composed of the `object` properties `predicate` returns + * truthy for. The predicate is invoked with two arguments: (value, key). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The source object. + * @param {Function} [predicate=_.identity] The function invoked per property. + * @returns {Object} Returns the new object. + * @example + * + * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * + * _.pickBy(object, _.isNumber); + * // => { 'a': 1, 'c': 3 } + */ + function pickBy(object, predicate) { + if (object == null) { + return {}; + } + var props = arrayMap(getAllKeysIn(object), function(prop) { + return [prop]; + }); + predicate = getIteratee(predicate); + return basePickBy(object, props, function(value, path) { + return predicate(value, path[0]); + }); + } + + /** + * This method is like `_.get` except that if the resolved value is a + * function it's invoked with the `this` binding of its parent object and + * its result is returned. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to resolve. + * @param {*} [defaultValue] The value returned for `undefined` resolved values. + * @returns {*} Returns the resolved value. + * @example + * + * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] }; + * + * _.result(object, 'a[0].b.c1'); + * // => 3 + * + * _.result(object, 'a[0].b.c2'); + * // => 4 + * + * _.result(object, 'a[0].b.c3', 'default'); + * // => 'default' + * + * _.result(object, 'a[0].b.c3', _.constant('default')); + * // => 'default' + */ + function result(object, path, defaultValue) { + path = castPath(path, object); + + var index = -1, + length = path.length; + + // Ensure the loop is entered when path is empty. + if (!length) { + length = 1; + object = undefined; + } + while (++index < length) { + var value = object == null ? undefined : object[toKey(path[index])]; + if (value === undefined) { + index = length; + value = defaultValue; + } + object = isFunction(value) ? value.call(object) : value; + } + return object; + } + + /** + * Sets the value at `path` of `object`. If a portion of `path` doesn't exist, + * it's created. Arrays are created for missing index properties while objects + * are created for all other missing properties. Use `_.setWith` to customize + * `path` creation. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 3.7.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {*} value The value to set. + * @returns {Object} Returns `object`. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.set(object, 'a[0].b.c', 4); + * console.log(object.a[0].b.c); + * // => 4 + * + * _.set(object, ['x', '0', 'y', 'z'], 5); + * console.log(object.x[0].y.z); + * // => 5 + */ + function set(object, path, value) { + return object == null ? object : baseSet(object, path, value); + } + + /** + * This method is like `_.set` except that it accepts `customizer` which is + * invoked to produce the objects of `path`. If `customizer` returns `undefined` + * path creation is handled by the method instead. The `customizer` is invoked + * with three arguments: (nsValue, key, nsObject). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {*} value The value to set. + * @param {Function} [customizer] The function to customize assigned values. + * @returns {Object} Returns `object`. + * @example + * + * var object = {}; + * + * _.setWith(object, '[0][1]', 'a', Object); + * // => { '0': { '1': 'a' } } + */ + function setWith(object, path, value, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return object == null ? object : baseSet(object, path, value, customizer); + } + + /** + * Creates an array of own enumerable string keyed-value pairs for `object` + * which can be consumed by `_.fromPairs`. If `object` is a map or set, its + * entries are returned. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias entries + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the key-value pairs. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.toPairs(new Foo); + * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed) + */ + var toPairs = createToPairs(keys); + + /** + * Creates an array of own and inherited enumerable string keyed-value pairs + * for `object` which can be consumed by `_.fromPairs`. If `object` is a map + * or set, its entries are returned. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias entriesIn + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the key-value pairs. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.toPairsIn(new Foo); + * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed) + */ + var toPairsIn = createToPairs(keysIn); + + /** + * An alternative to `_.reduce`; this method transforms `object` to a new + * `accumulator` object which is the result of running each of its own + * enumerable string keyed properties thru `iteratee`, with each invocation + * potentially mutating the `accumulator` object. If `accumulator` is not + * provided, a new object with the same `[[Prototype]]` will be used. The + * iteratee is invoked with four arguments: (accumulator, value, key, object). + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * @static + * @memberOf _ + * @since 1.3.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [accumulator] The custom accumulator value. + * @returns {*} Returns the accumulated value. + * @example + * + * _.transform([2, 3, 4], function(result, n) { + * result.push(n *= n); + * return n % 2 == 0; + * }, []); + * // => [4, 9] + * + * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { + * (result[value] || (result[value] = [])).push(key); + * }, {}); + * // => { '1': ['a', 'c'], '2': ['b'] } + */ + function transform(object, iteratee, accumulator) { + var isArr = isArray(object), + isArrLike = isArr || isBuffer(object) || isTypedArray(object); + + iteratee = getIteratee(iteratee, 4); + if (accumulator == null) { + var Ctor = object && object.constructor; + if (isArrLike) { + accumulator = isArr ? new Ctor : []; + } + else if (isObject(object)) { + accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {}; + } + else { + accumulator = {}; + } + } + (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) { + return iteratee(accumulator, value, index, object); + }); + return accumulator; + } + + /** + * Removes the property at `path` of `object`. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to unset. + * @returns {boolean} Returns `true` if the property is deleted, else `false`. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 7 } }] }; + * _.unset(object, 'a[0].b.c'); + * // => true + * + * console.log(object); + * // => { 'a': [{ 'b': {} }] }; + * + * _.unset(object, ['a', '0', 'b', 'c']); + * // => true + * + * console.log(object); + * // => { 'a': [{ 'b': {} }] }; + */ + function unset(object, path) { + return object == null ? true : baseUnset(object, path); + } + + /** + * This method is like `_.set` except that accepts `updater` to produce the + * value to set. Use `_.updateWith` to customize `path` creation. The `updater` + * is invoked with one argument: (value). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.6.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {Function} updater The function to produce the updated value. + * @returns {Object} Returns `object`. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.update(object, 'a[0].b.c', function(n) { return n * n; }); + * console.log(object.a[0].b.c); + * // => 9 + * + * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; }); + * console.log(object.x[0].y.z); + * // => 0 + */ + function update(object, path, updater) { + return object == null ? object : baseUpdate(object, path, castFunction(updater)); + } + + /** + * This method is like `_.update` except that it accepts `customizer` which is + * invoked to produce the objects of `path`. If `customizer` returns `undefined` + * path creation is handled by the method instead. The `customizer` is invoked + * with three arguments: (nsValue, key, nsObject). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.6.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {Function} updater The function to produce the updated value. + * @param {Function} [customizer] The function to customize assigned values. + * @returns {Object} Returns `object`. + * @example + * + * var object = {}; + * + * _.updateWith(object, '[0][1]', _.constant('a'), Object); + * // => { '0': { '1': 'a' } } + */ + function updateWith(object, path, updater, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer); + } + + /** + * Creates an array of the own enumerable string keyed property values of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property values. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.values(new Foo); + * // => [1, 2] (iteration order is not guaranteed) + * + * _.values('hi'); + * // => ['h', 'i'] + */ + function values(object) { + return object == null ? [] : baseValues(object, keys(object)); + } + + /** + * Creates an array of the own and inherited enumerable string keyed property + * values of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property values. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.valuesIn(new Foo); + * // => [1, 2, 3] (iteration order is not guaranteed) + */ + function valuesIn(object) { + return object == null ? [] : baseValues(object, keysIn(object)); + } + + /*------------------------------------------------------------------------*/ + + /** + * Clamps `number` within the inclusive `lower` and `upper` bounds. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Number + * @param {number} number The number to clamp. + * @param {number} [lower] The lower bound. + * @param {number} upper The upper bound. + * @returns {number} Returns the clamped number. + * @example + * + * _.clamp(-10, -5, 5); + * // => -5 + * + * _.clamp(10, -5, 5); + * // => 5 + */ + function clamp(number, lower, upper) { + if (upper === undefined) { + upper = lower; + lower = undefined; + } + if (upper !== undefined) { + upper = toNumber(upper); + upper = upper === upper ? upper : 0; + } + if (lower !== undefined) { + lower = toNumber(lower); + lower = lower === lower ? lower : 0; + } + return baseClamp(toNumber(number), lower, upper); + } + + /** + * Checks if `n` is between `start` and up to, but not including, `end`. If + * `end` is not specified, it's set to `start` with `start` then set to `0`. + * If `start` is greater than `end` the params are swapped to support + * negative ranges. + * + * @static + * @memberOf _ + * @since 3.3.0 + * @category Number + * @param {number} number The number to check. + * @param {number} [start=0] The start of the range. + * @param {number} end The end of the range. + * @returns {boolean} Returns `true` if `number` is in the range, else `false`. + * @see _.range, _.rangeRight + * @example + * + * _.inRange(3, 2, 4); + * // => true + * + * _.inRange(4, 8); + * // => true + * + * _.inRange(4, 2); + * // => false + * + * _.inRange(2, 2); + * // => false + * + * _.inRange(1.2, 2); + * // => true + * + * _.inRange(5.2, 4); + * // => false + * + * _.inRange(-3, -2, -6); + * // => true + */ + function inRange(number, start, end) { + start = toFinite(start); + if (end === undefined) { + end = start; + start = 0; + } else { + end = toFinite(end); + } + number = toNumber(number); + return baseInRange(number, start, end); + } + + /** + * Produces a random number between the inclusive `lower` and `upper` bounds. + * If only one argument is provided a number between `0` and the given number + * is returned. If `floating` is `true`, or either `lower` or `upper` are + * floats, a floating-point number is returned instead of an integer. + * + * **Note:** JavaScript follows the IEEE-754 standard for resolving + * floating-point values which can produce unexpected results. + * + * @static + * @memberOf _ + * @since 0.7.0 + * @category Number + * @param {number} [lower=0] The lower bound. + * @param {number} [upper=1] The upper bound. + * @param {boolean} [floating] Specify returning a floating-point number. + * @returns {number} Returns the random number. + * @example + * + * _.random(0, 5); + * // => an integer between 0 and 5 + * + * _.random(5); + * // => also an integer between 0 and 5 + * + * _.random(5, true); + * // => a floating-point number between 0 and 5 + * + * _.random(1.2, 5.2); + * // => a floating-point number between 1.2 and 5.2 + */ + function random(lower, upper, floating) { + if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) { + upper = floating = undefined; + } + if (floating === undefined) { + if (typeof upper == 'boolean') { + floating = upper; + upper = undefined; + } + else if (typeof lower == 'boolean') { + floating = lower; + lower = undefined; + } + } + if (lower === undefined && upper === undefined) { + lower = 0; + upper = 1; + } + else { + lower = toFinite(lower); + if (upper === undefined) { + upper = lower; + lower = 0; + } else { + upper = toFinite(upper); + } + } + if (lower > upper) { + var temp = lower; + lower = upper; + upper = temp; + } + if (floating || lower % 1 || upper % 1) { + var rand = nativeRandom(); + return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper); + } + return baseRandom(lower, upper); + } + + /*------------------------------------------------------------------------*/ + + /** + * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the camel cased string. + * @example + * + * _.camelCase('Foo Bar'); + * // => 'fooBar' + * + * _.camelCase('--foo-bar--'); + * // => 'fooBar' + * + * _.camelCase('__FOO_BAR__'); + * // => 'fooBar' + */ + var camelCase = createCompounder(function(result, word, index) { + word = word.toLowerCase(); + return result + (index ? capitalize(word) : word); + }); + + /** + * Converts the first character of `string` to upper case and the remaining + * to lower case. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to capitalize. + * @returns {string} Returns the capitalized string. + * @example + * + * _.capitalize('FRED'); + * // => 'Fred' + */ + function capitalize(string) { + return upperFirst(toString(string).toLowerCase()); + } + + /** + * Deburrs `string` by converting + * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table) + * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A) + * letters to basic Latin letters and removing + * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to deburr. + * @returns {string} Returns the deburred string. + * @example + * + * _.deburr('déjà vu'); + * // => 'deja vu' + */ + function deburr(string) { + string = toString(string); + return string && string.replace(reLatin, deburrLetter).replace(reComboMark, ''); + } + + /** + * Checks if `string` ends with the given target string. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to inspect. + * @param {string} [target] The string to search for. + * @param {number} [position=string.length] The position to search up to. + * @returns {boolean} Returns `true` if `string` ends with `target`, + * else `false`. + * @example + * + * _.endsWith('abc', 'c'); + * // => true + * + * _.endsWith('abc', 'b'); + * // => false + * + * _.endsWith('abc', 'b', 2); + * // => true + */ + function endsWith(string, target, position) { + string = toString(string); + target = baseToString(target); + + var length = string.length; + position = position === undefined + ? length + : baseClamp(toInteger(position), 0, length); + + var end = position; + position -= target.length; + return position >= 0 && string.slice(position, end) == target; + } + + /** + * Converts the characters "&", "<", ">", '"', and "'" in `string` to their + * corresponding HTML entities. + * + * **Note:** No other characters are escaped. To escape additional + * characters use a third-party library like [_he_](https://mths.be/he). + * + * Though the ">" character is escaped for symmetry, characters like + * ">" and "/" don't need escaping in HTML and have no special meaning + * unless they're part of a tag or unquoted attribute value. See + * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands) + * (under "semi-related fun fact") for more details. + * + * When working with HTML you should always + * [quote attribute values](http://wonko.com/post/html-escaping) to reduce + * XSS vectors. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category String + * @param {string} [string=''] The string to escape. + * @returns {string} Returns the escaped string. + * @example + * + * _.escape('fred, barney, & pebbles'); + * // => 'fred, barney, & pebbles' + */ + function escape(string) { + string = toString(string); + return (string && reHasUnescapedHtml.test(string)) + ? string.replace(reUnescapedHtml, escapeHtmlChar) + : string; + } + + /** + * Escapes the `RegExp` special characters "^", "$", "\", ".", "*", "+", + * "?", "(", ")", "[", "]", "{", "}", and "|" in `string`. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to escape. + * @returns {string} Returns the escaped string. + * @example + * + * _.escapeRegExp('[lodash](https://lodash.com/)'); + * // => '\[lodash\]\(https://lodash\.com/\)' + */ + function escapeRegExp(string) { + string = toString(string); + return (string && reHasRegExpChar.test(string)) + ? string.replace(reRegExpChar, '\\$&') + : string; + } + + /** + * Converts `string` to + * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the kebab cased string. + * @example + * + * _.kebabCase('Foo Bar'); + * // => 'foo-bar' + * + * _.kebabCase('fooBar'); + * // => 'foo-bar' + * + * _.kebabCase('__FOO_BAR__'); + * // => 'foo-bar' + */ + var kebabCase = createCompounder(function(result, word, index) { + return result + (index ? '-' : '') + word.toLowerCase(); + }); + + /** + * Converts `string`, as space separated words, to lower case. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the lower cased string. + * @example + * + * _.lowerCase('--Foo-Bar--'); + * // => 'foo bar' + * + * _.lowerCase('fooBar'); + * // => 'foo bar' + * + * _.lowerCase('__FOO_BAR__'); + * // => 'foo bar' + */ + var lowerCase = createCompounder(function(result, word, index) { + return result + (index ? ' ' : '') + word.toLowerCase(); + }); + + /** + * Converts the first character of `string` to lower case. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the converted string. + * @example + * + * _.lowerFirst('Fred'); + * // => 'fred' + * + * _.lowerFirst('FRED'); + * // => 'fRED' + */ + var lowerFirst = createCaseFirst('toLowerCase'); + + /** + * Pads `string` on the left and right sides if it's shorter than `length`. + * Padding characters are truncated if they can't be evenly divided by `length`. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to pad. + * @param {number} [length=0] The padding length. + * @param {string} [chars=' '] The string used as padding. + * @returns {string} Returns the padded string. + * @example + * + * _.pad('abc', 8); + * // => ' abc ' + * + * _.pad('abc', 8, '_-'); + * // => '_-abc_-_' + * + * _.pad('abc', 3); + * // => 'abc' + */ + function pad(string, length, chars) { + string = toString(string); + length = toInteger(length); + + var strLength = length ? stringSize(string) : 0; + if (!length || strLength >= length) { + return string; + } + var mid = (length - strLength) / 2; + return ( + createPadding(nativeFloor(mid), chars) + + string + + createPadding(nativeCeil(mid), chars) + ); + } + + /** + * Pads `string` on the right side if it's shorter than `length`. Padding + * characters are truncated if they exceed `length`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to pad. + * @param {number} [length=0] The padding length. + * @param {string} [chars=' '] The string used as padding. + * @returns {string} Returns the padded string. + * @example + * + * _.padEnd('abc', 6); + * // => 'abc ' + * + * _.padEnd('abc', 6, '_-'); + * // => 'abc_-_' + * + * _.padEnd('abc', 3); + * // => 'abc' + */ + function padEnd(string, length, chars) { + string = toString(string); + length = toInteger(length); + + var strLength = length ? stringSize(string) : 0; + return (length && strLength < length) + ? (string + createPadding(length - strLength, chars)) + : string; + } + + /** + * Pads `string` on the left side if it's shorter than `length`. Padding + * characters are truncated if they exceed `length`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to pad. + * @param {number} [length=0] The padding length. + * @param {string} [chars=' '] The string used as padding. + * @returns {string} Returns the padded string. + * @example + * + * _.padStart('abc', 6); + * // => ' abc' + * + * _.padStart('abc', 6, '_-'); + * // => '_-_abc' + * + * _.padStart('abc', 3); + * // => 'abc' + */ + function padStart(string, length, chars) { + string = toString(string); + length = toInteger(length); + + var strLength = length ? stringSize(string) : 0; + return (length && strLength < length) + ? (createPadding(length - strLength, chars) + string) + : string; + } + + /** + * Converts `string` to an integer of the specified radix. If `radix` is + * `undefined` or `0`, a `radix` of `10` is used unless `value` is a + * hexadecimal, in which case a `radix` of `16` is used. + * + * **Note:** This method aligns with the + * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`. + * + * @static + * @memberOf _ + * @since 1.1.0 + * @category String + * @param {string} string The string to convert. + * @param {number} [radix=10] The radix to interpret `value` by. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {number} Returns the converted integer. + * @example + * + * _.parseInt('08'); + * // => 8 + * + * _.map(['6', '08', '10'], _.parseInt); + * // => [6, 8, 10] + */ + function parseInt(string, radix, guard) { + if (guard || radix == null) { + radix = 0; + } else if (radix) { + radix = +radix; + } + return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0); + } + + /** + * Repeats the given string `n` times. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to repeat. + * @param {number} [n=1] The number of times to repeat the string. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {string} Returns the repeated string. + * @example + * + * _.repeat('*', 3); + * // => '***' + * + * _.repeat('abc', 2); + * // => 'abcabc' + * + * _.repeat('abc', 0); + * // => '' + */ + function repeat(string, n, guard) { + if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) { + n = 1; + } else { + n = toInteger(n); + } + return baseRepeat(toString(string), n); + } + + /** + * Replaces matches for `pattern` in `string` with `replacement`. + * + * **Note:** This method is based on + * [`String#replace`](https://mdn.io/String/replace). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to modify. + * @param {RegExp|string} pattern The pattern to replace. + * @param {Function|string} replacement The match replacement. + * @returns {string} Returns the modified string. + * @example + * + * _.replace('Hi Fred', 'Fred', 'Barney'); + * // => 'Hi Barney' + */ + function replace() { + var args = arguments, + string = toString(args[0]); + + return args.length < 3 ? string : string.replace(args[1], args[2]); + } + + /** + * Converts `string` to + * [snake case](https://en.wikipedia.org/wiki/Snake_case). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the snake cased string. + * @example + * + * _.snakeCase('Foo Bar'); + * // => 'foo_bar' + * + * _.snakeCase('fooBar'); + * // => 'foo_bar' + * + * _.snakeCase('--FOO-BAR--'); + * // => 'foo_bar' + */ + var snakeCase = createCompounder(function(result, word, index) { + return result + (index ? '_' : '') + word.toLowerCase(); + }); + + /** + * Splits `string` by `separator`. + * + * **Note:** This method is based on + * [`String#split`](https://mdn.io/String/split). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to split. + * @param {RegExp|string} separator The separator pattern to split by. + * @param {number} [limit] The length to truncate results to. + * @returns {Array} Returns the string segments. + * @example + * + * _.split('a-b-c', '-', 2); + * // => ['a', 'b'] + */ + function split(string, separator, limit) { + if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) { + separator = limit = undefined; + } + limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0; + if (!limit) { + return []; + } + string = toString(string); + if (string && ( + typeof separator == 'string' || + (separator != null && !isRegExp(separator)) + )) { + separator = baseToString(separator); + if (!separator && hasUnicode(string)) { + return castSlice(stringToArray(string), 0, limit); + } + } + return string.split(separator, limit); + } + + /** + * Converts `string` to + * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage). + * + * @static + * @memberOf _ + * @since 3.1.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the start cased string. + * @example + * + * _.startCase('--foo-bar--'); + * // => 'Foo Bar' + * + * _.startCase('fooBar'); + * // => 'Foo Bar' + * + * _.startCase('__FOO_BAR__'); + * // => 'FOO BAR' + */ + var startCase = createCompounder(function(result, word, index) { + return result + (index ? ' ' : '') + upperFirst(word); + }); + + /** + * Checks if `string` starts with the given target string. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to inspect. + * @param {string} [target] The string to search for. + * @param {number} [position=0] The position to search from. + * @returns {boolean} Returns `true` if `string` starts with `target`, + * else `false`. + * @example + * + * _.startsWith('abc', 'a'); + * // => true + * + * _.startsWith('abc', 'b'); + * // => false + * + * _.startsWith('abc', 'b', 1); + * // => true + */ + function startsWith(string, target, position) { + string = toString(string); + position = position == null + ? 0 + : baseClamp(toInteger(position), 0, string.length); + + target = baseToString(target); + return string.slice(position, position + target.length) == target; + } + + /** + * Creates a compiled template function that can interpolate data properties + * in "interpolate" delimiters, HTML-escape interpolated data properties in + * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data + * properties may be accessed as free variables in the template. If a setting + * object is given, it takes precedence over `_.templateSettings` values. + * + * **Note:** In the development build `_.template` utilizes + * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl) + * for easier debugging. + * + * For more information on precompiling templates see + * [lodash's custom builds documentation](https://lodash.com/custom-builds). + * + * For more information on Chrome extension sandboxes see + * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval). + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category String + * @param {string} [string=''] The template string. + * @param {Object} [options={}] The options object. + * @param {RegExp} [options.escape=_.templateSettings.escape] + * The HTML "escape" delimiter. + * @param {RegExp} [options.evaluate=_.templateSettings.evaluate] + * The "evaluate" delimiter. + * @param {Object} [options.imports=_.templateSettings.imports] + * An object to import into the template as free variables. + * @param {RegExp} [options.interpolate=_.templateSettings.interpolate] + * The "interpolate" delimiter. + * @param {string} [options.sourceURL='lodash.templateSources[n]'] + * The sourceURL of the compiled template. + * @param {string} [options.variable='obj'] + * The data object variable name. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Function} Returns the compiled template function. + * @example + * + * // Use the "interpolate" delimiter to create a compiled template. + * var compiled = _.template('hello <%= user %>!'); + * compiled({ 'user': 'fred' }); + * // => 'hello fred!' + * + * // Use the HTML "escape" delimiter to escape data property values. + * var compiled = _.template('<%- value %>'); + * compiled({ 'value': ' + + + +
+ +

+ Select Your Existing Gist +

+
+
+
+ + + + + + + + + + + diff --git a/src/ui/gist-selection/gist-selection.js b/src/ui/gist-selection/gist-selection.js new file mode 100644 index 00000000..22d30af2 --- /dev/null +++ b/src/ui/gist-selection/gist-selection.js @@ -0,0 +1,89 @@ +//import { debug } from "vscode"; + +// @ts-nocheck +function appendHTML(parent, html) { + var div = document.createElement("div"); + div.innerHTML = html; + while (div.children.length > 0) { + parent.appendChild(div.children[0]); + } + div.remove(); +} + +const vscode = acquireVsCodeApi(); +/* https://stackoverflow.com/questions/3177836/how-to-format-time-since-xxx-e-g-4-minutes-ago-similar-to-stack-exchange-site */ +function timeSince(date) { + var seconds = Math.floor((new Date() - date) / 1000); + + var interval = Math.floor(seconds / 31536000); + + if (interval > 1) { + return interval + " years"; + } + interval = Math.floor(seconds / 2592000); + if (interval > 1) { + return interval + " months"; + } + interval = Math.floor(seconds / 86400); + if (interval > 1) { + return interval + " days"; + } + interval = Math.floor(seconds / 3600); + if (interval > 1) { + return interval + " hours"; + } + interval = Math.floor(seconds / 60); + if (interval > 1) { + return interval + " minutes"; + } + return Math.floor(seconds) + " seconds"; +} + +function appendHTML(parent, html) { + var div = document.createElement("div"); + div.innerHTML = html; + while (div.children.length > 0) { + parent.appendChild(div.children[0]); + } + div.remove(); +} + +function saveGistId(id) { + vscode.postMessage({ id }); + $("#modal").modal(); +} + +const selectionContainer = document.querySelector("#selectionContainer"); + +document + .querySelector(".modal-content") + .classList.add( + document.body.className.includes("vscode-dark") ? "bg-dark" : "bg-light" + ); + +const skipContainer = document.querySelector("#skipContainer"); +appendHTML(skipContainer, skip); + +const selectionTemplate = ` +`; + +if (!gists.length) { + appendHTML( + selectionContainer, + "

No Gists found on your account. Skip this window and upload the settings to create a new Gist.

" + ); +} else { + gists + .sort((a, b) => new Date(b.updated_at) - new Date(a.updated_at)) + .forEach(gist => { + const html = selectionTemplate + .replace(new RegExp("@description", "g"), gist.description) + .replace(new RegExp("@id", "g"), gist.id) + .replace( + new RegExp("@timestamp", "g"), + timeSince(new Date(gist.updated_at)) + ); + appendHTML(selectionContainer, html); + }); +} + diff --git a/src/ui/landing-page/landing-page.html b/src/ui/landing-page/landing-page.html new file mode 100644 index 00000000..d7d5ec88 --- /dev/null +++ b/src/ui/landing-page/landing-page.html @@ -0,0 +1,178 @@ + + + + + + + + + + + + + + +
+
+

+ What's New in + + vX.X.X + + +

+
+
+
+

+ Configuration +

+

+ Login via GitHub to setup Settings Sync, or configure the settings + manually. +

+ + +
+
+

+ Show Your Support +

+

+ While being free and open source, if you find + Settings Sync + useful, please consider supporting it by donating via PayPal or Open + Collective. +

+ + +
+
+
+ +
+
+ + +
+
+ + + + + + + diff --git a/src/ui/landing-page/landing-page.js b/src/ui/landing-page/landing-page.js new file mode 100644 index 00000000..52c23d2d --- /dev/null +++ b/src/ui/landing-page/landing-page.js @@ -0,0 +1,40 @@ +// @ts-nocheck +const vscode = acquireVsCodeApi(); + +function sendCommand(command, data) { + vscode.postMessage({ + command, + data + }); +} + +function appendHTML(parent, html) { + var div = document.createElement("div"); + div.innerHTML = html; + while (div.children.length > 0) { + parent.appendChild(div.children[0]); + } + div.remove(); +} + +const releaseNoteTemplate = `
@TYPE@NOTE @EXTRA
`; + +const notesElement = document.querySelector("#notes"); +releaseNotes.changes.forEach(change => { + const html = releaseNoteTemplate + .replace(new RegExp("@NOTE", "g"), change.details) + .replace(new RegExp("@TYPE", "g"), change.type) + .replace(new RegExp("@COLOR", "g"), change.color) + .replace( + new RegExp("@EXTRA", "g"), + change.author && change.pullRequest + ? `(Thanks to @${change.author} for PR #${change.pullRequest})` + : "" + ); + appendHTML(notesElement, html); +}); + +const currentVersionElement = document.querySelector("#current-version"); +currentVersionElement.innerHTML = releaseNotes.currentVersion; + +document.querySelector("#customCheck1").checked = checked === "true"; diff --git a/src/ui/settings/settings.html b/src/ui/settings/settings.html new file mode 100644 index 00000000..5697b2b3 --- /dev/null +++ b/src/ui/settings/settings.html @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + +
+
+

+ Environment Settings +

+
+

+
+
+

+ Global Settings +

+
+
+
+ + + + + + + + + + + diff --git a/src/ui/settings/settings.js b/src/ui/settings/settings.js new file mode 100644 index 00000000..17e5d4c1 --- /dev/null +++ b/src/ui/settings/settings.js @@ -0,0 +1,269 @@ +// @ts-nocheck + +function appendHTML(parent, html) { + var div = document.createElement("div"); + div.innerHTML = html; + while (div.children.length > 0) { + parent.appendChild(div.children[0]); + } + div.remove(); +} + +const vscode = acquireVsCodeApi(); + +const textInputTemplate = `
+ + @tooltip + +
`; + +const textInputGroupTemplate = `
+ + @tooltip +
+ +
+ +
+
+
`; + +const numberInputTemplate = `
+ + @tooltip + +
`; + +const checkboxTemplate = `
+ + + @tooltip +
`; + +const textareaTemplate = `
+ + @tooltip + +
`; + +const globalParent = document.getElementById("globalSettings"); +const envParent = document.getElementById("environmentSettings"); +const saveStatus = document.getElementById("saveStatus"); + +globalMap.forEach(settingMap => { + let template; + switch (settingMap.type) { + case "textinput": + template = textInputTemplate; + break; + case "numberinput": + template = numberInputTemplate; + break; + case "checkbox": + template = checkboxTemplate; + break; + case "textarea": + template = textareaTemplate; + break; + } + const html = template + .replace(new RegExp("@name", "g"), settingMap.name) + .replace(new RegExp("@placeholder", "g"), settingMap.placeholder) + .replace( + new RegExp("@correspondingSetting", "g"), + settingMap.correspondingSetting + ) + .replace(new RegExp("@tooltip"), "") + .replace(new RegExp("@settingType", "g"), "global"); + appendHTML(globalParent, html); +}); + +envMap.forEach(envMap => { + let template; + switch (envMap.type) { + case "textinput": + template = textInputTemplate; + break; + case "numberinput": + template = textInputTemplate; + break; + case "checkbox": + template = checkboxTemplate; + break; + } + const isInputGroup = envMap.correspondingSetting === "gist"; + let disabledStatus = ""; + if (isInputGroup) { + template = textInputGroupTemplate; + if (!_.get(envData, "gist") || !_.get(globalData, "token")) { + disabledStatus = "disabled"; + } + } + const html = template + .replace(new RegExp("@name", "g"), envMap.name) + .replace(new RegExp("@placeholder", "g"), envMap.placeholder) + .replace( + new RegExp("@correspondingSetting", "g"), + envMap.correspondingSetting + ) + .replace( + new RegExp("@tooltip"), + ` + + + ` + ) + .replace(new RegExp("@settingType", "g"), "env") + .replace( + new RegExp("@action", "g"), + `inputGroupAction('${envMap.correspondingSetting}')` + ) + .replace(new RegExp("@disabled", "g"), disabledStatus); + appendHTML(envParent, html); +}); + +$(document).ready(function() { + save(); + $('[data-toggle="tooltip"]').tooltip({ container: "html" }); + $(".text") + .each((i, el) => { + if ($(el).attr("settingType") === "global") { + $(el).val(_.get(globalData, $(el).attr("setting"))); + } else { + $(el).val(envData[$(el).attr("setting")]); + } + }) + .change(function() { + save(); + let val = $(this).val(); + vscode.postMessage({ + command: $(this).attr("setting"), + text: val, + type: $(this).attr("settingType") + }); + }); + $(".number") + .each((i, el) => { + if ($(el).attr("settingType") === "global") { + $(el).val(_.get(globalData, $(el).attr("setting"))); + } else { + $(el).val(envData[$(el).attr("setting")]); + } + }) + .change(function() { + save(); + let val = Number($(this).val()); + vscode.postMessage({ + command: $(this).attr("setting"), + text: val, + type: $(this).attr("settingType") + }); + }); + $(".checkbox") + .each((i, el) => { + if ($(el).attr("settingType") === "global") { + $(el).prop("checked", _.get(globalData, $(el).attr("setting"))); + } else { + $(el).prop("checked", envData[$(el).attr("setting")]); + } + }) + .change(function() { + save(); + let val = $(this).is(":checked"); + vscode.postMessage({ + command: $(this).attr("setting"), + text: val, + type: $(this).attr("settingType") + }); + }); + $(".textarea") + .each((i, el) => { + let str = ""; + const items = _.get(globalData, $(el).attr("setting")); + items.forEach(item => (str += item + "\n")); + $(el).val(str.slice(0, -1)); + $(el).prop("rows", items.length); + }) + .change(function() { + save(); + let val = []; + $(this) + .val() + .split("\n") + .forEach(item => { + if (item !== "") { + val.push(item); + } + }); + vscode.postMessage({ + command: $(this).attr("setting"), + text: val, + type: "global" + }); + }); +}); + +function save() { + saveStatus.innerHTML = ``; + setTimeout( + () => + (saveStatus.innerHTML = ``), + 1000 + ); +} + +function inputGroupAction(setting) { + if (setting === "gist") { + vscode.postMessage("openGist"); + } +} diff --git a/src/ui/shared/fonts.js b/src/ui/shared/fonts.js new file mode 100644 index 00000000..c8341802 --- /dev/null +++ b/src/ui/shared/fonts.js @@ -0,0 +1,19 @@ +// @ts-nocheck + +document.querySelector("font-injector").innerHTML = ``; diff --git a/src/ui/shared/page-header.js b/src/ui/shared/page-header.js new file mode 100644 index 00000000..a27dd99e --- /dev/null +++ b/src/ui/shared/page-header.js @@ -0,0 +1,18 @@ +// @ts-nocheck + +document.querySelector("page-header").innerHTML = ` +

+ +Settings Sync +

+

+Synchronize settings, snippets, themes, icons, launch, +keybindings, workspaces and extensions across machines +using GitHub Gist. +

+
`; diff --git a/src/ui/shared/styles.css b/src/ui/shared/styles.css new file mode 100644 index 00000000..cea26430 --- /dev/null +++ b/src/ui/shared/styles.css @@ -0,0 +1,199 @@ +html, +body { + height: 100%; + width: 100%; + display: flex; + flex-direction: column; + font-family: "Roboto", sans-serif; + letter-spacing: 0.0625em; +} + +body.vscode-dark { + background-color: #1b1b1b; + color: #e9e9e9; +} + +body.vscode-light { + background-color: #fff; + color: #1b1b1b; +} + +.vscode-light .logo { + -webkit-filter: invert(1) opacity(0.5); + filter: invert(1) opacity(0.5); +} + +.tooltip { + display: block; +} + +.content-row { + flex-grow: 1; + overflow-y: hidden; + padding-bottom: 1rem; +} + +.modal-header { + border-bottom: none; +} + +.modal-footer { + border-top: none; +} + +.modal-body { + padding: 0rem 1rem; +} + +.footer > .col-one { + padding-left: 0; +} + +.footer > .col-two { + padding-right: 0; +} + +.footer { + margin: 0; +} + +.scrollable { + overflow-y: auto; +} + +.content { + background-color: burlywood; + overflow: scroll; +} + +:root { + --btn: #0e629c; + --btn-hover: #15496e; + --btn-click: #0e3450; + --link: dodgerblue; + --link-hover: rgb(15, 109, 204); +} + +.dock-bottom-left { + position: fixed; + bottom: 4rem; + left: 4rem; +} + +.dock-bottom-right { + position: fixed; + bottom: 1rem; + right: 1rem; + background-color: rgb(42, 42, 42); + border-radius: 1.5rem; + padding-left: 1rem; + padding-right: 1rem; + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.logo { + padding-right: 0.5rem; + filter: opacity(0.5); +} + +.change { + line-height: 150%; +} + +.badge-success { + color: #fff; + background-color: #73c991; +} + +.badge-danger { + color: #fff; + background-color: #ce4f59; +} + +.badge { + vertical-align: 2px; + line-height: 120%; + width: 6rem; +} + +body { + position: relative; + min-height: 35rem; + background-position: center; + background-repeat: no-repeat; + background-attachment: scroll; + background-size: cover; + margin-top: 40px; + margin-bottom: 40px; +} + +body h1 { + font-size: 3.5rem; + line-height: 2.5rem; + font-weight: bold; + color: #808080 !important; + font-family: "Open Sans"; + display: flex; + align-items: center; /* align vertical */ + justify-content: center; /* align horizontal */ +} + +body h2 { + /* max-width: 20rem; */ + font-size: 1rem; +} + +body h3 { + /* max-width: 20rem; */ + font-size: 1.5rem; +} + +.btn { + -webkit-box-shadow: 0 0.1875rem 0.1875rem 0 rgba(0, 0, 0, 0.1) !important; + box-shadow: 0 0.1875rem 0.1875rem 0 rgba(0, 0, 0, 0.1) !important; + padding: 1rem; + font-size: 80%; + text-transform: uppercase; + letter-spacing: 0.15rem; + border: 0; + width: 100%; + height: 100%; + display: flex; + justify-content: center; /* align horizontal */ + align-items: center; /* align vertical */ +} + +.btn-primary { + color: #fff !important; +} + +.btn-primary, +.btn-primary:focus { + background-color: var(--btn) !important; +} + +.btn-primary:hover, +.btn-primary:active { + background-color: var(--btn-hover) !important; +} + +.text, +.textarea, +.number { + -webkit-box-shadow: 0 0.1875rem 0.1875rem 0 rgba(0, 0, 0, 0.1) !important; + box-shadow: 0 0.1875rem 0.1875rem 0 rgba(0, 0, 0, 0.1) !important; + padding: 1.25rem 2rem; + height: auto; + border: 0; +} + +a { + color: var(--link); +} + +a:focus, +a:hover { + text-decoration: none; + color: var(--link-hover); +} diff --git a/src/ui/shared/vendor/bootstrap/css/bootstrap.min.css b/src/ui/shared/vendor/bootstrap/css/bootstrap.min.css new file mode 100644 index 00000000..92e3fe87 --- /dev/null +++ b/src/ui/shared/vendor/bootstrap/css/bootstrap.min.css @@ -0,0 +1,7 @@ +/*! + * Bootstrap v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors + * Copyright 2011-2019 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[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}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.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-repeat:no-repeat;background-position:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.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") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip{display:block}.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E");background-repeat:no-repeat;background-position:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip{display:block}.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn: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){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:no-repeat 50%/50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:calc(1rem + .4rem);padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-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-top-left-radius:0;border-bottom-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}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion>.card{overflow:hidden}.accordion>.card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion>.card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion>.card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.accordion>.card .card-header{margin-bottom:-1px}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;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){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}@media (min-width:576px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-sm .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-md .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:992px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-lg .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:1200px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-xl .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush .list-group-item:last-child{margin-bottom:-1px}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{margin-bottom:0;border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);content:""}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #dee2e6;border-bottom-right-radius:.3rem;border-bottom-left-radius:.3rem}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:0s .6s opacity}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@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;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50%/100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!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}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;overflow-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/src/ui/shared/vendor/bootstrap/js/bootstrap.min.js b/src/ui/shared/vendor/bootstrap/js/bootstrap.min.js new file mode 100644 index 00000000..c4c0d1f9 --- /dev/null +++ b/src/ui/shared/vendor/bootstrap/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e((t=t||self).bootstrap={},t.jQuery,t.Popper)}(this,function(t,g,u){"use strict";function i(t,e){for(var n=0;nthis._items.length-1||t<0))if(this._isSliding)g(this._element).one(Q.SLID,function(){return e.to(t)});else{if(n===t)return this.pause(),void this.cycle();var i=ndocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},t._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},t._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:Ee},je="show",He="out",Re={HIDE:"hide"+De,HIDDEN:"hidden"+De,SHOW:"show"+De,SHOWN:"shown"+De,INSERTED:"inserted"+De,CLICK:"click"+De,FOCUSIN:"focusin"+De,FOCUSOUT:"focusout"+De,MOUSEENTER:"mouseenter"+De,MOUSELEAVE:"mouseleave"+De},xe="fade",Fe="show",Ue=".tooltip-inner",We=".arrow",qe="hover",Me="focus",Ke="click",Qe="manual",Be=function(){function i(t,e){if("undefined"==typeof u)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var t=i.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=g(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(g(this.getTipElement()).hasClass(Fe))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),g.removeData(this.element,this.constructor.DATA_KEY),g(this.element).off(this.constructor.EVENT_KEY),g(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&g(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if("none"===g(this.element).css("display"))throw new Error("Please use show on visible elements");var t=g.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){g(this.element).trigger(t);var n=_.findShadowRoot(this.element),i=g.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=_.getUID(this.constructor.NAME);o.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&g(o).addClass(xe);var s="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();g(o).data(this.constructor.DATA_KEY,this),g.contains(this.element.ownerDocument.documentElement,this.tip)||g(o).appendTo(l),g(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new u(this.element,o,{placement:a,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:We},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}}),g(o).addClass(Fe),"ontouchstart"in document.documentElement&&g(document.body).children().on("mouseover",null,g.noop);var c=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,g(e.element).trigger(e.constructor.Event.SHOWN),t===He&&e._leave(null,e)};if(g(this.tip).hasClass(xe)){var h=_.getTransitionDurationFromElement(this.tip);g(this.tip).one(_.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},t.hide=function(t){var e=this,n=this.getTipElement(),i=g.Event(this.constructor.Event.HIDE),o=function(){e._hoverState!==je&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),g(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(g(this.element).trigger(i),!i.isDefaultPrevented()){if(g(n).removeClass(Fe),"ontouchstart"in document.documentElement&&g(document.body).children().off("mouseover",null,g.noop),this._activeTrigger[Ke]=!1,this._activeTrigger[Me]=!1,this._activeTrigger[qe]=!1,g(this.tip).hasClass(xe)){var r=_.getTransitionDurationFromElement(n);g(n).one(_.TRANSITION_END,o).emulateTransitionEnd(r)}else o();this._hoverState=""}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(t){g(this.getTipElement()).addClass(Ae+"-"+t)},t.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},t.setContent=function(){var t=this.getTipElement();this.setElementContent(g(t.querySelectorAll(Ue)),this.getTitle()),g(t).removeClass(xe+" "+Fe)},t.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=Se(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?g(e).parent().is(t)||t.empty().append(e):t.text(g(e).text())},t.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},t._getOffset=function(){var e=this,t={};return"function"==typeof this.config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,e.config.offset(t.offsets,e.element)||{}),t}:t.offset=this.config.offset,t},t._getContainer=function(){return!1===this.config.container?document.body:_.isElement(this.config.container)?g(this.config.container):g(document).find(this.config.container)},t._getAttachment=function(t){return Pe[t.toUpperCase()]},t._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(t){if("click"===t)g(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(t){return i.toggle(t)});else if(t!==Qe){var e=t===qe?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=t===qe?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;g(i.element).on(e,i.config.selector,function(t){return i._enter(t)}).on(n,i.config.selector,function(t){return i._leave(t)})}}),g(this.element).closest(".modal").on("hide.bs.modal",function(){i.element&&i.hide()}),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},t._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},t._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Me:qe]=!0),g(e.getTipElement()).hasClass(Fe)||e._hoverState===je?e._hoverState=je:(clearTimeout(e._timeout),e._hoverState=je,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===je&&e.show()},e.config.delay.show):e.show())},t._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Me:qe]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=He,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){e._hoverState===He&&e.hide()},e.config.delay.hide):e.hide())},t._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},t._getConfig=function(t){var e=g(this.element).data();return Object.keys(e).forEach(function(t){-1!==Oe.indexOf(t)&&delete e[t]}),"number"==typeof(t=l({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),_.typeCheckConfig(be,t,this.constructor.DefaultType),t.sanitize&&(t.template=Se(t.template,t.whiteList,t.sanitizeFn)),t},t._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},t._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Ne);null!==e&&e.length&&t.removeClass(e.join(""))},t._handlePopperPlacementChange=function(t){var e=t.instance;this.tip=e.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},t._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(g(t).removeClass(xe),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},i._jQueryInterface=function(n){return this.each(function(){var t=g(this).data(Ie),e="object"==typeof n&&n;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),g(this).data(Ie,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return Le}},{key:"NAME",get:function(){return be}},{key:"DATA_KEY",get:function(){return Ie}},{key:"Event",get:function(){return Re}},{key:"EVENT_KEY",get:function(){return De}},{key:"DefaultType",get:function(){return ke}}]),i}();g.fn[be]=Be._jQueryInterface,g.fn[be].Constructor=Be,g.fn[be].noConflict=function(){return g.fn[be]=we,Be._jQueryInterface};var Ve="popover",Ye="bs.popover",ze="."+Ye,Xe=g.fn[Ve],$e="bs-popover",Ge=new RegExp("(^|\\s)"+$e+"\\S+","g"),Je=l({},Be.Default,{placement:"right",trigger:"click",content:"",template:''}),Ze=l({},Be.DefaultType,{content:"(string|element|function)"}),tn="fade",en="show",nn=".popover-header",on=".popover-body",rn={HIDE:"hide"+ze,HIDDEN:"hidden"+ze,SHOW:"show"+ze,SHOWN:"shown"+ze,INSERTED:"inserted"+ze,CLICK:"click"+ze,FOCUSIN:"focusin"+ze,FOCUSOUT:"focusout"+ze,MOUSEENTER:"mouseenter"+ze,MOUSELEAVE:"mouseleave"+ze},sn=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),(e.prototype.constructor=e).__proto__=n;var o=i.prototype;return o.isWithContent=function(){return this.getTitle()||this._getContent()},o.addAttachmentClass=function(t){g(this.getTipElement()).addClass($e+"-"+t)},o.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},o.setContent=function(){var t=g(this.getTipElement());this.setElementContent(t.find(nn),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(on),e),t.removeClass(tn+" "+en)},o._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},o._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Ge);null!==e&&0=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||tli{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:fa-spin 2s infinite linear}.fa-pulse{animation:fa-spin 1s infinite steps(8)}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-wizard:before{content:"\f6e8"}.fa-haykal:before{content:"\f666"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto} \ No newline at end of file diff --git a/src/ui/shared/vendor/fontawesome/css/solid.min.css b/src/ui/shared/vendor/fontawesome/css/solid.min.css new file mode 100644 index 00000000..a0d56287 --- /dev/null +++ b/src/ui/shared/vendor/fontawesome/css/solid.min.css @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 5.9.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:auto;src:url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa,.fas{font-family:"Font Awesome 5 Free";font-weight:900} \ No newline at end of file diff --git a/src/ui/shared/vendor/fontawesome/webfonts/fa-solid-900.ttf b/src/ui/shared/vendor/fontawesome/webfonts/fa-solid-900.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c6c3dd4d40e6935dbda5f4fc671956c41b768a09 GIT binary patch literal 191832 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 JlKu;TE2wOj%Q1qdB^k`WJpqvW9V}9KNYfOicm{ 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 R-Q)Ro=L@j@Nd4~k{{Y?~eeVDO literal 0 HcmV?d00001 diff --git a/src/ui/shared/vendor/google/OpenSans-Bold.ttf b/src/ui/shared/vendor/google/OpenSans-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..96fabd865df70de92f2a4bdc24d65306759fe726 GIT binary patch literal 103616 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 z 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 z

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

n{#NV($fZ=b2Ttd7 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�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 Lv7{_*LQnk1zZlrgRDjh{?=p_(BF9M+nn-P!% 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 U=0&&n0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,u,s,l,c,f,d,p,h,g,v,y,m,b,x="sizzle"+1*new Date,w=e.document,C=0,T=0,E=ae(),N=ae(),k=ae(),A=function(e,t){return e===t&&(f=!0),0},D={}.hasOwnProperty,S=[],L=S.pop,j=S.push,q=S.push,O=S.slice,P=function(e,t){for(var n=0,r=e.length;n+~]|"+I+")"+I+"*"),_=new RegExp("="+I+"*([^\\]'\"]*?)"+I+"*\\]","g"),U=new RegExp(M),V=new RegExp("^"+R+"$"),X={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+B),PSEUDO:new RegExp("^"+M),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+I+"*(even|odd|(([+-]|)(\\d*)n|)"+I+"*(?:([+-]|)"+I+"*(\\d+)|))"+I+"*\\)|)","i"),bool:new RegExp("^(?:"+H+")$","i"),needsContext:new RegExp("^"+I+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+I+"*((?:-\\d)?\\d*)"+I+"*\\)|)(?=[^-]|$)","i")},Q=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,G=/^[^{]+\{\s*\[native \w/,K=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,J=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+I+"?|("+I+")|.)","ig"),ee=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){d()},ie=me(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{q.apply(S=O.call(w.childNodes),w.childNodes),S[w.childNodes.length].nodeType}catch(e){q={apply:S.length?function(e,t){j.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function oe(e,t,r,i){var o,u,l,c,f,h,y,m=t&&t.ownerDocument,C=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==C&&9!==C&&11!==C)return r;if(!i&&((t?t.ownerDocument||t:w)!==p&&d(t),t=t||p,g)){if(11!==C&&(f=K.exec(e)))if(o=f[1]){if(9===C){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&b(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return q.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return q.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!k[e+" "]&&(!v||!v.test(e))){if(1!==C)m=t,y=e;else if("object"!==t.nodeName.toLowerCase()){(c=t.getAttribute("id"))?c=c.replace(te,ne):t.setAttribute("id",c=x),u=(h=a(e)).length;while(u--)h[u]="#"+c+" "+ye(h[u]);y=h.join(","),m=J.test(e)&&ge(t.parentNode)||t}if(y)try{return q.apply(r,m.querySelectorAll(y)),r}catch(e){}finally{c===x&&t.removeAttribute("id")}}}return s(e.replace($,"$1"),t,r,i)}function ae(){var e=[];function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}return t}function ue(e){return e[x]=!0,e}function se(e){var t=p.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function le(e,t){var n=e.split("|"),i=n.length;while(i--)r.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function de(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pe(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return ue(function(t){return t=+t,ue(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ge(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},d=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==p&&9===a.nodeType&&a.documentElement?(p=a,h=p.documentElement,g=!o(p),w!==p&&(i=p.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=se(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=se(function(e){return e.appendChild(p.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=G.test(p.getElementsByClassName),n.getById=se(function(e){return h.appendChild(e).id=x,!p.getElementsByName||!p.getElementsByName(x).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&g)return t.getElementsByClassName(e)},y=[],v=[],(n.qsa=G.test(p.querySelectorAll))&&(se(function(e){h.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+I+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+I+"*(?:value|"+H+")"),e.querySelectorAll("[id~="+x+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+x+"+*").length||v.push(".#.+[+~]")}),se(function(e){e.innerHTML="";var t=p.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+I+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(n.matchesSelector=G.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&se(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),y.push("!=",M)}),v=v.length&&new RegExp(v.join("|")),y=y.length&&new RegExp(y.join("|")),t=G.test(h.compareDocumentPosition),b=t||G.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===p||e.ownerDocument===w&&b(w,e)?-1:t===p||t.ownerDocument===w&&b(w,t)?1:c?P(c,e)-P(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],u=[t];if(!i||!o)return e===p?-1:t===p?1:i?-1:o?1:c?P(c,e)-P(c,t):0;if(i===o)return ce(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)u.unshift(n);while(a[r]===u[r])r++;return r?ce(a[r],u[r]):a[r]===w?-1:u[r]===w?1:0},p):p},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&d(e),t=t.replace(_,"='$1']"),n.matchesSelector&&g&&!k[t+" "]&&(!y||!y.test(t))&&(!v||!v.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,p,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==p&&d(e),b(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==p&&d(e);var i=r.attrHandle[t.toLowerCase()],o=i&&D.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(A),f){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:ue,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return X.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&U.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+I+")"+e+"("+I+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace(W," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),u="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,s){var l,c,f,d,p,h,g=o!==a?"nextSibling":"previousSibling",v=t.parentNode,y=u&&t.nodeName.toLowerCase(),m=!s&&!u,b=!1;if(v){if(o){while(g){d=t;while(d=d[g])if(u?d.nodeName.toLowerCase()===y:1===d.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?v.firstChild:v.lastChild],a&&m){b=(p=(l=(c=(f=(d=v)[x]||(d[x]={}))[d.uniqueID]||(f[d.uniqueID]={}))[e]||[])[0]===C&&l[1])&&l[2],d=p&&v.childNodes[p];while(d=++p&&d&&d[g]||(b=p=0)||h.pop())if(1===d.nodeType&&++b&&d===t){c[e]=[C,p,b];break}}else if(m&&(b=p=(l=(c=(f=(d=t)[x]||(d[x]={}))[d.uniqueID]||(f[d.uniqueID]={}))[e]||[])[0]===C&&l[1]),!1===b)while(d=++p&&d&&d[g]||(b=p=0)||h.pop())if((u?d.nodeName.toLowerCase()===y:1===d.nodeType)&&++b&&(m&&((c=(f=d[x]||(d[x]={}))[d.uniqueID]||(f[d.uniqueID]={}))[e]=[C,b]),d===t))break;return(b-=i)===r||b%r==0&&b/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[x]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?ue(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=P(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:ue(function(e){var t=[],n=[],r=u(e.replace($,"$1"));return r[x]?ue(function(e,t,n,i){var o,a=r(e,null,i,[]),u=e.length;while(u--)(o=a[u])&&(e[u]=!(t[u]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:ue(function(e){return function(t){return oe(e,t).length>0}}),contains:ue(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:ue(function(e){return V.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:pe(!1),disabled:pe(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xe(e,t,n){for(var r=0,i=t.length;r-1&&(o[l]=!(a[l]=f))}}else y=we(y===a?y.splice(h,y.length):y),i?i(null,a,y,s):q.apply(a,y)})}function Te(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],u=a||r.relative[" "],s=a?1:0,c=me(function(e){return e===t},u,!0),f=me(function(e){return P(t,e)>-1},u,!0),d=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];s1&&be(d),s>1&&ye(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),n,s0,i=e.length>0,o=function(o,a,u,s,c){var f,h,v,y=0,m="0",b=o&&[],x=[],w=l,T=o||i&&r.find.TAG("*",c),E=C+=null==w?1:Math.random()||.1,N=T.length;for(c&&(l=a===p||a||c);m!==N&&null!=(f=T[m]);m++){if(i&&f){h=0,a||f.ownerDocument===p||(d(f),u=!g);while(v=e[h++])if(v(f,a||p,u)){s.push(f);break}c&&(C=E)}n&&((f=!v&&f)&&y--,o&&b.push(f))}if(y+=m,n&&m!==y){h=0;while(v=t[h++])v(b,x,a,u);if(o){if(y>0)while(m--)b[m]||x[m]||(x[m]=L.call(s));x=we(x)}q.apply(s,x),c&&!o&&x.length>0&&y+t.length>1&&oe.uniqueSort(s)}return c&&(C=E,l=w),b};return n?ue(o):o}return u=oe.compile=function(e,t){var n,r=[],i=[],o=k[e+" "];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Te(t[n]))[x]?r.push(o):i.push(o);(o=k(e,Ee(i,r))).selector=e}return o},s=oe.select=function(e,t,n,i){var o,s,l,c,f,d="function"==typeof e&&e,p=!i&&a(e=d.selector||e);if(n=n||[],1===p.length){if((s=p[0]=p[0].slice(0)).length>2&&"ID"===(l=s[0]).type&&9===t.nodeType&&g&&r.relative[s[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;d&&(t=t.parentNode),e=e.slice(s.shift().value.length)}o=X.needsContext.test(e)?0:s.length;while(o--){if(l=s[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),J.test(s[0].type)&&ge(t.parentNode)||t))){if(s.splice(o,1),!(e=i.length&&ye(s)))return q.apply(n,i),n;break}}}return(d||u(e,p))(i,t,!g,n,!t||J.test(e)&&ge(t.parentNode)||t),n},n.sortStable=x.split("").sort(A).join("")===x,n.detectDuplicates=!!f,d(),n.sortDetached=se(function(e){return 1&e.compareDocumentPosition(p.createElement("fieldset"))}),se(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||le("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&se(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||le("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),se(function(e){return null==e.getAttribute("disabled")})||le(H,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);w.find=E,w.expr=E.selectors,w.expr[":"]=w.expr.pseudos,w.uniqueSort=w.unique=E.uniqueSort,w.text=E.getText,w.isXMLDoc=E.isXML,w.contains=E.contains,w.escapeSelector=E.escape;var N=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},k=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},A=w.expr.match.needsContext;function D(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var S=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function L(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):"string"!=typeof t?w.grep(e,function(e){return s.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(L(this,e||[],!1))},not:function(e){return this.pushStack(L(this,e||[],!0))},is:function(e){return!!L(this,"string"==typeof e&&A.test(e)?w(e):e||[],!1).length}});var j,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:q.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),S.test(i[1])&&w.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,j=w(r);var O=/^(?:parents|prev(?:Until|All))/,P={children:!0,contents:!0,next:!0,prev:!0};w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&w.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?w.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?s.call(w(e),this[0]):s.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function H(e,t){while((e=e[t])&&1!==e.nodeType);return e}w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return N(e,"parentNode")},parentsUntil:function(e,t,n){return N(e,"parentNode",n)},next:function(e){return H(e,"nextSibling")},prev:function(e){return H(e,"previousSibling")},nextAll:function(e){return N(e,"nextSibling")},prevAll:function(e){return N(e,"previousSibling")},nextUntil:function(e,t,n){return N(e,"nextSibling",n)},prevUntil:function(e,t,n){return N(e,"previousSibling",n)},siblings:function(e){return k((e.parentNode||{}).firstChild,e)},children:function(e){return k(e.firstChild)},contents:function(e){return D(e,"iframe")?e.contentDocument:(D(e,"template")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=w.filter(r,i)),this.length>1&&(P[e]||w.uniqueSort(i),O.test(e)&&i.reverse()),this.pushStack(i)}});var I=/[^\x20\t\r\n\f]+/g;function R(e){var t={};return w.each(e.match(I)||[],function(e,n){t[n]=!0}),t}w.Callbacks=function(e){e="string"==typeof e?R(e):w.extend({},e);var t,n,r,i,o=[],a=[],u=-1,s=function(){for(i=i||e.once,r=t=!0;a.length;u=-1){n=a.shift();while(++u-1)o.splice(n,1),n<=u&&u--}),this},has:function(e){return e?w.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||s()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function B(e){return e}function M(e){throw e}function W(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.extend({Deferred:function(t){var n=[["notify","progress",w.Callbacks("memory"),w.Callbacks("memory"),2],["resolve","done",w.Callbacks("once memory"),w.Callbacks("once memory"),0,"resolved"],["reject","fail",w.Callbacks("once memory"),w.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},"catch":function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(t){w.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var u=this,s=arguments,l=function(){var e,l;if(!(t=o&&(r!==M&&(u=void 0,s=[e]),n.rejectWith(u,s))}};t?c():(w.Deferred.getStackHook&&(c.stackTrace=w.Deferred.getStackHook()),e.setTimeout(c))}}return w.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:B,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:B)),n[2][3].add(a(0,e,g(r)?r:M))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],u=t[5];i[t[1]]=a.add,u&&a.add(function(){r=u},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=w.Deferred(),u=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&(W(e,a.done(u(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)W(i[n],u(n),a.reject);return a.promise()}});var $=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&$.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},w.readyException=function(t){e.setTimeout(function(){throw t})};var F=w.Deferred();w.fn.ready=function(e){return F.then(e)["catch"](function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||F.resolveWith(r,[w]))}}),w.ready.then=F.then;function z(){r.removeEventListener("DOMContentLoaded",z),e.removeEventListener("load",z),w.ready()}"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener("DOMContentLoaded",z),e.addEventListener("load",z));var _=function(e,t,n,r,i,o,a){var u=0,s=e.length,l=null==n;if("object"===b(n)){i=!0;for(u in n)_(e,t,u,n[u],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(w(e),n)})),t))for(;u1,null,!0)},removeData:function(e){return this.each(function(){J.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=K.get(e,t),n&&(!r||Array.isArray(n)?r=K.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=w.queue(e,t),r=n.length,i=n.shift(),o=w._queueHooks(e,t),a=function(){w.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return K.get(e,n)||K.access(e,n,{empty:w.Callbacks("once memory").add(function(){K.remove(e,[t+"queue",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&D(e,t)?w.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}!function(){var e=r.createDocumentFragment().appendChild(r.createElement("div")),t=r.createElement("input");t.setAttribute("type","radio"),t.setAttribute("checked","checked"),t.setAttribute("name","t"),e.appendChild(t),h.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var xe=r.documentElement,we=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Te=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function Ne(){return!1}function ke(){try{return r.activeElement}catch(e){}}function Ae(e,t,n,r,i,o){var a,u;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(u in t)Ae(e,u,n,r,t[u],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Ne;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,u,s,l,c,f,d,p,h,g,v=K.get(e);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(xe,i),n.guid||(n.guid=w.guid++),(s=v.events)||(s=v.events={}),(a=v.handle)||(a=v.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(I)||[""]).length;while(l--)p=g=(u=Te.exec(t[l])||[])[1],h=(u[2]||"").split(".").sort(),p&&(f=w.event.special[p]||{},p=(i?f.delegateType:f.bindType)||p,f=w.event.special[p]||{},c=w.extend({type:p,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(d=s[p])||((d=s[p]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(p,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?d.splice(d.delegateCount++,0,c):d.push(c),w.event.global[p]=!0)}},remove:function(e,t,n,r,i){var o,a,u,s,l,c,f,d,p,h,g,v=K.hasData(e)&&K.get(e);if(v&&(s=v.events)){l=(t=(t||"").match(I)||[""]).length;while(l--)if(u=Te.exec(t[l])||[],p=g=u[1],h=(u[2]||"").split(".").sort(),p){f=w.event.special[p]||{},d=s[p=(r?f.delegateType:f.bindType)||p]||[],u=u[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=d.length;while(o--)c=d[o],!i&&g!==c.origType||n&&n.guid!==c.guid||u&&!u.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(d.splice(o,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(e,c));a&&!d.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||w.removeEvent(e,p,v.handle),delete s[p])}else for(p in s)w.event.remove(e,p+t[l],n,r,!0);w.isEmptyObject(s)&&K.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,u,s=new Array(arguments.length),l=(K.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(s[0]=t,n=1;n=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&u.push({elem:l,handlers:o})}return l=this,s\x20\t\r\n\f]*)[^>]*)\/>/gi,Se=/\s*$/g;function qe(e,t){return D(e,"table")&&D(11!==t.nodeType?t:t.firstChild,"tr")?w(e).children("tbody")[0]||e:e}function Oe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Pe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function He(e,t){var n,r,i,o,a,u,s,l;if(1===t.nodeType){if(K.hasData(e)&&(o=K.access(e),a=K.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n1&&"string"==typeof v&&!h.checkClone&&Le.test(v))return e.each(function(i){var o=e.eq(i);y&&(t[0]=v.call(this,i,o.html())),Re(o,t,n,r)});if(d&&(i=be(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(s=(u=w.map(ve(i,"script"),Oe)).length;f")},clone:function(e,t,n){var r,i,o,a,u=e.cloneNode(!0),s=w.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(a=ve(u),r=0,i=(o=ve(e)).length;r0&&ye(a,!s&&ve(e,"script")),u},cleanData:function(e){for(var t,n,r,i=w.event.special,o=0;void 0!==(n=e[o]);o++)if(Y(n)){if(t=n[K.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[K.expando]=void 0}n[J.expando]&&(n[J.expando]=void 0)}}}),w.fn.extend({detach:function(e){return Be(this,e,!0)},remove:function(e){return Be(this,e)},text:function(e){return _(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||qe(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=qe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return _(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Se.test(e)&&!ge[(pe.exec(e)||["",""])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n=0&&(s+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-s-u-.5))),s}function et(e,t,n){var r=We(e),i=Fe(e,t,r),o="border-box"===w.css(e,"boxSizing",!1,r),a=o;if(Me.test(i)){if(!n)return i;i="auto"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===w.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?"border":"content"),a,r,i)+"px"}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,u=Q(t),s=Ue.test(t),l=e.style;if(s||(t=Ke(u)),a=w.cssHooks[t]||w.cssHooks[u],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(w.cssNumber[u]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(s?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,u=Q(t);return Ue.test(t)||(t=Ke(u)),(a=w.cssHooks[t]||w.cssHooks[u])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),"normal"===i&&t in Xe&&(i=Xe[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),w.each(["height","width"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!_e.test(w.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):ue(e,Ve,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=We(e),a="border-box"===w.css(e,"boxSizing",!1,o),u=r&&Ze(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(u-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,"border",!1,o)-.5)),u&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=w.css(e,t)),Je(e,n,u)}}}),w.cssHooks.marginLeft=ze(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,"marginLeft"))||e.getBoundingClientRect().left-ue(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),w.each({margin:"",padding:"",border:"Width"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(w.cssHooks[e+t].set=Je)}),w.fn.extend({css:function(e,t){return _(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=We(e),i=t.length;a1)}}),w.fn.delay=function(t,n){return t=w.fx?w.fx.speeds[t]||t:t,n=n||"fx",this.queue(n,function(n,r){var i=e.setTimeout(n,t);r.stop=function(){e.clearTimeout(i)}})},function(){var e=r.createElement("input"),t=r.createElement("select").appendChild(r.createElement("option"));e.type="checkbox",h.checkOn=""!==e.value,h.optSelected=t.selected,(e=r.createElement("input")).value="t",e.type="radio",h.radioValue="t"===e.value}();var tt,nt=w.expr.attrHandle;w.fn.extend({attr:function(e,t){return _(this,w.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?w.prop(e,t,n):(1===o&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?tt:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&"radio"===t&&D(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(I);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),tt={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\w+/g),function(e,t){var n=nt[t]||w.find.attr;nt[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=nt[a],nt[a]=i,i=null!=n(e,t,r)?a:null,nt[a]=o),i}});var rt=/^(?:input|select|textarea|button)$/i,it=/^(?:a|area)$/i;w.fn.extend({prop:function(e,t){return _(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,"tabindex");return t?parseInt(t,10):rt.test(e.nodeName)||it.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),h.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){w.propFix[this.toLowerCase()]=this});function ot(e){return(e.match(I)||[]).join(" ")}function at(e){return e.getAttribute&&e.getAttribute("class")||""}function ut(e){return Array.isArray(e)?e:"string"==typeof e?e.match(I)||[]:[]}w.fn.extend({addClass:function(e){var t,n,r,i,o,a,u,s=0;if(g(e))return this.each(function(t){w(this).addClass(e.call(this,t,at(this)))});if((t=ut(e)).length)while(n=this[s++])if(i=at(n),r=1===n.nodeType&&" "+ot(i)+" "){a=0;while(o=t[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(u=ot(r))&&n.setAttribute("class",u)}return this},removeClass:function(e){var t,n,r,i,o,a,u,s=0;if(g(e))return this.each(function(t){w(this).removeClass(e.call(this,t,at(this)))});if(!arguments.length)return this.attr("class","");if((t=ut(e)).length)while(n=this[s++])if(i=at(n),r=1===n.nodeType&&" "+ot(i)+" "){a=0;while(o=t[a++])while(r.indexOf(" "+o+" ")>-1)r=r.replace(" "+o+" "," ");i!==(u=ot(r))&&n.setAttribute("class",u)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,at(this),t),t)}):this.each(function(){var t,i,o,a;if(r){i=0,o=w(this),a=ut(e);while(t=a[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else void 0!==e&&"boolean"!==n||((t=at(this))&&K.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":K.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&(" "+ot(at(n))+" ").indexOf(t)>-1)return!0;return!1}});var st=/\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?"":e+""})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(st,""):null==n?"":n}}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,"value");return null!=t?t:ot(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,u=a?null:[],s=a?o+1:i.length;for(r=o<0?s:a?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),w.each(["radio","checkbox"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},h.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),h.focusin="onfocusin"in e;var lt=/^(?:focusinfocus|focusoutblur)$/,ct=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(t,n,i,o){var a,u,s,l,c,d,p,h,y=[i||r],m=f.call(t,"type")?t.type:t,b=f.call(t,"namespace")?t.namespace.split("."):[];if(u=h=s=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!lt.test(m+w.event.triggered)&&(m.indexOf(".")>-1&&(m=(b=m.split(".")).shift(),b.sort()),c=m.indexOf(":")<0&&"on"+m,t=t[w.expando]?t:new w.Event(m,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=b.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+b.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:w.makeArray(n,[t]),p=w.event.special[m]||{},o||!p.trigger||!1!==p.trigger.apply(i,n))){if(!o&&!p.noBubble&&!v(i)){for(l=p.delegateType||m,lt.test(l+m)||(u=u.parentNode);u;u=u.parentNode)y.push(u),s=u;s===(i.ownerDocument||r)&&y.push(s.defaultView||s.parentWindow||e)}a=0;while((u=y[a++])&&!t.isPropagationStopped())h=u,t.type=a>1?l:p.bindType||m,(d=(K.get(u,"events")||{})[t.type]&&K.get(u,"handle"))&&d.apply(u,n),(d=c&&u[c])&&d.apply&&Y(u)&&(t.result=d.apply(u,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||p._default&&!1!==p._default.apply(y.pop(),n)||!Y(i)||c&&g(i[m])&&!v(i)&&((s=i[c])&&(i[c]=null),w.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,ct),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,ct),w.event.triggered=void 0,s&&(i[c]=s)),t.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),h.focusin||w.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=K.access(r,t);i||r.addEventListener(e,n,!0),K.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=K.access(r,t)-1;i?K.access(r,t,i):(r.removeEventListener(e,n,!0),K.remove(r,t))}}});var ft=/\[\]$/,dt=/\r?\n/g,pt=/^(?:submit|button|image|reset|file)$/i,ht=/^(?:input|select|textarea|keygen)/i;function gt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||ft.test(e)?r(e,i):gt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==b(t))r(e,t);else for(i in t)gt(e+"["+i+"]",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)gt(n,e[n],t,i);return r.join("&")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,"elements");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(":disabled")&&ht.test(this.nodeName)&&!pt.test(e)&&(this.checked||!de.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(dt,"\r\n")}}):{name:t.name,value:n.replace(dt,"\r\n")}}).get()}}),w.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},h.createHTMLDocument=function(){var e=r.implementation.createHTMLDocument("").body;return e.innerHTML="

",2===e.childNodes.length}(),w.parseHTML=function(e,t,n){if("string"!=typeof e)return[];"boolean"==typeof t&&(n=t,t=!1);var i,o,a;return t||(h.createHTMLDocument?((i=(t=r.implementation.createHTMLDocument("")).createElement("base")).href=r.location.href,t.head.appendChild(i)):t=r),o=S.exec(e),a=!n&&[],o?[t.createElement(o[1])]:(o=be([e],t,a),a&&a.length&&w(a).remove(),w.merge([],o.childNodes))},w.offset={setOffset:function(e,t,n){var r,i,o,a,u,s,l,c=w.css(e,"position"),f=w(e),d={};"static"===c&&(e.style.position="relative"),u=f.offset(),o=w.css(e,"top"),s=w.css(e,"left"),(l=("absolute"===c||"fixed"===c)&&(o+s).indexOf("auto")>-1)?(a=(r=f.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(s)||0),g(t)&&(t=t.call(e,n,w.extend({},u))),null!=t.top&&(d.top=t.top-u.top+a),null!=t.left&&(d.left=t.left-u.left+i),"using"in t?t.using.call(e,d):f.css(d)}},w.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){w.offset.setOffset(this,e,t)});var t,n,r=this[0];if(r)return r.getClientRects().length?(t=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:t.top+n.pageYOffset,left:t.left+n.pageXOffset}):{top:0,left:0}},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===w.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===w.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=w(e).offset()).top+=w.css(e,"borderTopWidth",!0),i.left+=w.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-w.css(r,"marginTop",!0),left:t.left-i.left-w.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===w.css(e,"position"))e=e.offsetParent;return e||xe})}}),w.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n="pageYOffset"===t;w.fn[e]=function(r){return _(this,function(e,r,i){var o;if(v(e)?o=e:9===e.nodeType&&(o=e.defaultView),void 0===i)return o?o[t]:e[r];o?o.scrollTo(n?o.pageXOffset:i,n?i:o.pageYOffset):e[r]=i},e,r,arguments.length)}}),w.each(["top","left"],function(e,t){w.cssHooks[t]=ze(h.pixelPosition,function(e,n){if(n)return n=Fe(e,t),Me.test(n)?w(e).position()[t]+"px":n})}),w.each({Height:"height",Width:"width"},function(e,t){w.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){w.fn[r]=function(i,o){var a=arguments.length&&(n||"boolean"!=typeof i),u=n||(!0===i||!0===o?"margin":"border");return _(this,function(t,n,i){var o;return v(t)?0===r.indexOf("outer")?t["inner"+e]:t.document.documentElement["client"+e]:9===t.nodeType?(o=t.documentElement,Math.max(t.body["scroll"+e],o["scroll"+e],t.body["offset"+e],o["offset"+e],o["client"+e])):void 0===i?w.css(t,n,u):w.style(t,n,i,u)},t,a?i:void 0,a)}})}),w.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,t){w.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),w.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),w.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),w.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),g(e))return r=o.call(arguments,2),i=function(){return e.apply(t||this,r.concat(o.call(arguments)))},i.guid=e.guid=e.guid||w.guid++,i},w.holdReady=function(e){e?w.readyWait++:w.ready(!0)},w.isArray=Array.isArray,w.parseJSON=JSON.parse,w.nodeName=D,w.isFunction=g,w.isWindow=v,w.camelCase=Q,w.type=b,w.now=Date.now,w.isNumeric=function(e){var t=w.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},"function"==typeof define&&define.amd&&define("jquery",[],function(){return w});var vt=e.jQuery,yt=e.$;return w.noConflict=function(t){return e.$===w&&(e.$=yt),t&&e.jQuery===w&&(e.jQuery=vt),w},t||(e.jQuery=e.$=w),w}); diff --git a/src/ui/shared/vendor/lodash/lodash.min.js b/src/ui/shared/vendor/lodash/lodash.min.js new file mode 100644 index 00000000..c9112634 --- /dev/null +++ b/src/ui/shared/vendor/lodash/lodash.min.js @@ -0,0 +1,137 @@ +/** + * @license + * Lodash lodash.com/license | Underscore.js 1.8.3 underscorejs.org/LICENSE + */ +;(function(){function n(n,t,r){switch(r.length){case 0:return n.call(t);case 1:return n.call(t,r[0]);case 2:return n.call(t,r[0],r[1]);case 3:return n.call(t,r[0],r[1],r[2])}return n.apply(t,r)}function t(n,t,r,e){for(var u=-1,i=null==n?0:n.length;++u"']/g,G=RegExp(V.source),H=RegExp(K.source),J=/<%-([\s\S]+?)%>/g,Y=/<%([\s\S]+?)%>/g,Q=/<%=([\s\S]+?)%>/g,X=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,nn=/^\w*$/,tn=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,rn=/[\\^$.*+?()[\]{}|]/g,en=RegExp(rn.source),un=/^\s+|\s+$/g,on=/^\s+/,fn=/\s+$/,cn=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,an=/\{\n\/\* \[wrapped with (.+)\] \*/,ln=/,? & /,sn=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,hn=/\\(\\)?/g,pn=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,_n=/\w*$/,vn=/^[-+]0x[0-9a-f]+$/i,gn=/^0b[01]+$/i,dn=/^\[object .+?Constructor\]$/,yn=/^0o[0-7]+$/i,bn=/^(?:0|[1-9]\d*)$/,xn=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,jn=/($^)/,wn=/['\n\r\u2028\u2029\\]/g,mn="[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?(?:\\u200d(?:[^\\ud800-\\udfff]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?)*",An="(?:[\\u2700-\\u27bf]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])"+mn,kn="(?:[^\\ud800-\\udfff][\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]?|[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\ud800-\\udfff])",En=RegExp("['\u2019]","g"),Sn=RegExp("[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]","g"),On=RegExp("\\ud83c[\\udffb-\\udfff](?=\\ud83c[\\udffb-\\udfff])|"+kn+mn,"g"),In=RegExp(["[A-Z\\xc0-\\xd6\\xd8-\\xde]?[a-z\\xdf-\\xf6\\xf8-\\xff]+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?=[\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000]|[A-Z\\xc0-\\xd6\\xd8-\\xde]|$)|(?:[A-Z\\xc0-\\xd6\\xd8-\\xde]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?=[\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000]|[A-Z\\xc0-\\xd6\\xd8-\\xde](?:[a-z\\xdf-\\xf6\\xf8-\\xff]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])|$)|[A-Z\\xc0-\\xd6\\xd8-\\xde]?(?:[a-z\\xdf-\\xf6\\xf8-\\xff]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+(?:['\u2019](?:d|ll|m|re|s|t|ve))?|[A-Z\\xc0-\\xd6\\xd8-\\xde]+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?|\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])|\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])|\\d+",An].join("|"),"g"),Rn=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]"),zn=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Wn="Array Buffer DataView Date Error Float32Array Float64Array Function Int8Array Int16Array Int32Array Map Math Object Promise RegExp Set String Symbol TypeError Uint8Array Uint8ClampedArray Uint16Array Uint32Array WeakMap _ clearTimeout isFinite parseInt setTimeout".split(" "),Un={}; +Un["[object Float32Array]"]=Un["[object Float64Array]"]=Un["[object Int8Array]"]=Un["[object Int16Array]"]=Un["[object Int32Array]"]=Un["[object Uint8Array]"]=Un["[object Uint8ClampedArray]"]=Un["[object Uint16Array]"]=Un["[object Uint32Array]"]=true,Un["[object Arguments]"]=Un["[object Array]"]=Un["[object ArrayBuffer]"]=Un["[object Boolean]"]=Un["[object DataView]"]=Un["[object Date]"]=Un["[object Error]"]=Un["[object Function]"]=Un["[object Map]"]=Un["[object Number]"]=Un["[object Object]"]=Un["[object RegExp]"]=Un["[object Set]"]=Un["[object String]"]=Un["[object WeakMap]"]=false; +var Bn={};Bn["[object Arguments]"]=Bn["[object Array]"]=Bn["[object ArrayBuffer]"]=Bn["[object DataView]"]=Bn["[object Boolean]"]=Bn["[object Date]"]=Bn["[object Float32Array]"]=Bn["[object Float64Array]"]=Bn["[object Int8Array]"]=Bn["[object Int16Array]"]=Bn["[object Int32Array]"]=Bn["[object Map]"]=Bn["[object Number]"]=Bn["[object Object]"]=Bn["[object RegExp]"]=Bn["[object Set]"]=Bn["[object String]"]=Bn["[object Symbol]"]=Bn["[object Uint8Array]"]=Bn["[object Uint8ClampedArray]"]=Bn["[object Uint16Array]"]=Bn["[object Uint32Array]"]=true, +Bn["[object Error]"]=Bn["[object Function]"]=Bn["[object WeakMap]"]=false;var Ln={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Cn=parseFloat,Dn=parseInt,Mn=typeof global=="object"&&global&&global.Object===Object&&global,Tn=typeof self=="object"&&self&&self.Object===Object&&self,$n=Mn||Tn||Function("return this")(),Fn=typeof exports=="object"&&exports&&!exports.nodeType&&exports,Nn=Fn&&typeof module=="object"&&module&&!module.nodeType&&module,Pn=Nn&&Nn.exports===Fn,Zn=Pn&&Mn.process,qn=function(){ +try{var n=Nn&&Nn.require&&Nn.require("util").types;return n?n:Zn&&Zn.binding&&Zn.binding("util")}catch(n){}}(),Vn=qn&&qn.isArrayBuffer,Kn=qn&&qn.isDate,Gn=qn&&qn.isMap,Hn=qn&&qn.isRegExp,Jn=qn&&qn.isSet,Yn=qn&&qn.isTypedArray,Qn=b("length"),Xn=x({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e", +"\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a", +"\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I", +"\u0129":"i","\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r", +"\u0159":"r","\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ", +"\u0133":"ij","\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"}),nt=x({"&":"&","<":"<",">":">",'"':""","'":"'"}),tt=x({"&":"&","<":"<",">":">",""":'"',"'":"'"}),rt=function x(mn){function An(n){if(yu(n)&&!ff(n)&&!(n instanceof Ln)){if(n instanceof On)return n;if(oi.call(n,"__wrapped__"))return Fe(n)}return new On(n)}function kn(){}function On(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=T}function Ln(n){ +this.__wrapped__=n,this.__actions__=[],this.__dir__=1,this.__filtered__=false,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Mn(n){var t=-1,r=null==n?0:n.length;for(this.clear();++t=t?n:t)),n}function _t(n,t,e,u,i,o){var f,c=1&t,a=2&t,l=4&t;if(e&&(f=i?e(n,u,i,o):e(n)),f!==T)return f;if(!du(n))return n;if(u=ff(n)){if(f=me(n),!c)return Lr(n,f)}else{var s=vo(n),h="[object Function]"==s||"[object GeneratorFunction]"==s;if(af(n))return Ir(n,c);if("[object Object]"==s||"[object Arguments]"==s||h&&!i){if(f=a||h?{}:Ae(n),!c)return a?Mr(n,lt(f,n)):Dr(n,at(f,n))}else{if(!Bn[s])return i?n:{};f=ke(n,s,c)}}if(o||(o=new Zn), +i=o.get(n))return i;if(o.set(n,f),pf(n))return n.forEach(function(r){f.add(_t(r,t,e,r,n,o))}),f;if(sf(n))return n.forEach(function(r,u){f.set(u,_t(r,t,e,u,n,o))}),f;var a=l?a?ve:_e:a?Uu:Wu,p=u?T:a(n);return r(p||n,function(r,u){p&&(u=r,r=n[u]),ot(f,u,_t(r,t,e,u,n,o))}),f}function vt(n){var t=Wu(n);return function(r){return gt(r,n,t)}}function gt(n,t,r){var e=r.length;if(null==n)return!e;for(n=Qu(n);e--;){var u=r[e],i=t[u],o=n[u];if(o===T&&!(u in n)||!i(o))return false}return true}function dt(n,t,r){if(typeof n!="function")throw new ti("Expected a function"); +return bo(function(){n.apply(T,r)},t)}function yt(n,t,r,e){var u=-1,i=o,a=true,l=n.length,s=[],h=t.length;if(!l)return s;r&&(t=c(t,E(r))),e?(i=f,a=false):200<=t.length&&(i=O,a=false,t=new Nn(t));n:for(;++ut}function Rt(n,t){return null!=n&&oi.call(n,t)}function zt(n,t){return null!=n&&t in Qu(n)}function Wt(n,t,r){for(var e=r?f:o,u=n[0].length,i=n.length,a=i,l=Ku(i),s=1/0,h=[];a--;){var p=n[a];a&&t&&(p=c(p,E(t))),s=Ci(p.length,s), +l[a]=!r&&(t||120<=u&&120<=p.length)?new Nn(a&&p):T}var p=n[0],_=-1,v=l[0];n:for(;++_r.length?t:Et(t,hr(r,0,-1)),r=null==t?t:t[Me(Ve(r))],null==r?T:n(r,t,e)}function Lt(n){return yu(n)&&"[object Arguments]"==Ot(n)}function Ct(n){ +return yu(n)&&"[object ArrayBuffer]"==Ot(n)}function Dt(n){return yu(n)&&"[object Date]"==Ot(n)}function Mt(n,t,r,e,u){if(n===t)return true;if(null==n||null==t||!yu(n)&&!yu(t))return n!==n&&t!==t;n:{var i=ff(n),o=ff(t),f=i?"[object Array]":vo(n),c=o?"[object Array]":vo(t),f="[object Arguments]"==f?"[object Object]":f,c="[object Arguments]"==c?"[object Object]":c,a="[object Object]"==f,o="[object Object]"==c;if((c=f==c)&&af(n)){if(!af(t)){t=false;break n}i=true,a=false}if(c&&!a)u||(u=new Zn),t=i||_f(n)?se(n,t,r,e,Mt,u):he(n,t,f,r,e,Mt,u);else{ +if(!(1&r)&&(i=a&&oi.call(n,"__wrapped__"),f=o&&oi.call(t,"__wrapped__"),i||f)){n=i?n.value():n,t=f?t.value():t,u||(u=new Zn),t=Mt(n,t,r,e,u);break n}if(c)t:if(u||(u=new Zn),i=1&r,f=_e(n),o=f.length,c=_e(t).length,o==c||i){for(a=o;a--;){var l=f[a];if(!(i?l in t:oi.call(t,l))){t=false;break t}}if((c=u.get(n))&&u.get(t))t=c==t;else{c=true,u.set(n,t),u.set(t,n);for(var s=i;++at?r:0,Se(t,r)?n[t]:T}function Xt(n,t,r){var e=-1;return t=c(t.length?t:[$u],E(ye())),n=Gt(n,function(n,r,u){return{a:c(t,function(t){return t(n)}), +b:++e,c:n}}),w(n,function(n,t){var e;n:{e=-1;for(var u=n.a,i=t.a,o=u.length,f=r.length;++e=f){e=c;break n}e=c*("desc"==r[e]?-1:1);break n}}e=n.b-t.b}return e})}function nr(n,t){return tr(n,t,function(t,r){return zu(n,r)})}function tr(n,t,r){for(var e=-1,u=t.length,i={};++et||9007199254740991t&&(t=-t>u?0:u+t),r=r>u?u:r,0>r&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0,r=Ku(u);++e=u){for(;e>>1,o=n[i];null!==o&&!wu(o)&&(r?o<=t:ot.length?n:Et(n,hr(t,0,-1)),null==n||delete n[Me(Ve(t))]}function jr(n,t,r,e){for(var u=n.length,i=e?u:-1;(e?i--:++ie)return e?br(n[0]):[];for(var u=-1,i=Ku(e);++u=e?n:hr(n,t,r)}function Ir(n,t){if(t)return n.slice();var r=n.length,r=gi?gi(r):new n.constructor(r);return n.copy(r),r}function Rr(n){var t=new n.constructor(n.byteLength);return new vi(t).set(new vi(n)),t}function zr(n,t){return new n.constructor(t?Rr(n.buffer):n.buffer,n.byteOffset,n.length); +}function Wr(n,t){if(n!==t){var r=n!==T,e=null===n,u=n===n,i=wu(n),o=t!==T,f=null===t,c=t===t,a=wu(t);if(!f&&!a&&!i&&n>t||i&&o&&c&&!f&&!a||e&&o&&c||!r&&c||!u)return 1;if(!e&&!i&&!a&&nu?T:i,u=1),t=Qu(t);++eo&&f[0]!==a&&f[o-1]!==a?[]:B(f,a),o-=c.length,or?r?or(t,n):t:(r=or(t,Oi(n/D(t))),Rn.test(t)?Or(M(r),0,n).join(""):r.slice(0,n))}function te(t,r,e,u){function i(){for(var r=-1,c=arguments.length,a=-1,l=u.length,s=Ku(l+c),h=this&&this!==$n&&this instanceof i?f:t;++at||e)&&(1&n&&(i[2]=h[2],t|=1&r?0:4),(r=h[3])&&(e=i[3],i[3]=e?Ur(e,r,h[4]):r,i[4]=e?B(i[3],"__lodash_placeholder__"):h[4]),(r=h[5])&&(e=i[5],i[5]=e?Br(e,r,h[6]):r,i[6]=e?B(i[5],"__lodash_placeholder__"):h[6]),(r=h[7])&&(i[7]=r),128&n&&(i[8]=null==i[8]?h[8]:Ci(i[8],h[8])),null==i[9]&&(i[9]=h[9]),i[0]=h[0],i[1]=t),n=i[0],t=i[1], +r=i[2],e=i[3],u=i[4],f=i[9]=i[9]===T?c?0:n.length:Li(i[9]-a,0),!f&&24&t&&(t&=-25),c=t&&1!=t?8==t||16==t?Kr(n,t,f):32!=t&&33!=t||u.length?Jr.apply(T,i):te(n,t,r,e):Pr(n,t,r),Le((h?co:yo)(c,i),n,t)}function ce(n,t,r,e){return n===T||lu(n,ei[r])&&!oi.call(e,r)?t:n}function ae(n,t,r,e,u,i){return du(n)&&du(t)&&(i.set(t,n),Yt(n,t,T,ae,i),i.delete(t)),n}function le(n){return xu(n)?T:n}function se(n,t,r,e,u,i){var o=1&r,f=n.length,c=t.length;if(f!=c&&!(o&&c>f))return false;if((c=i.get(n))&&i.get(t))return c==t; +var c=-1,a=true,l=2&r?new Nn:T;for(i.set(n,t),i.set(t,n);++cr&&(r=Li(e+r,0)),_(n,ye(t,3),r)):-1}function Pe(n,t,r){var e=null==n?0:n.length;if(!e)return-1;var u=e-1;return r!==T&&(u=ku(r),u=0>r?Li(e+u,0):Ci(u,e-1)),_(n,ye(t,3),u,true)}function Ze(n){return(null==n?0:n.length)?wt(n,1):[]; +}function qe(n){return n&&n.length?n[0]:T}function Ve(n){var t=null==n?0:n.length;return t?n[t-1]:T}function Ke(n,t){return n&&n.length&&t&&t.length?er(n,t):n}function Ge(n){return null==n?n:$i.call(n)}function He(n){if(!n||!n.length)return[];var t=0;return n=i(n,function(n){if(hu(n))return t=Li(n.length,t),true}),A(t,function(t){return c(n,b(t))})}function Je(t,r){if(!t||!t.length)return[];var e=He(t);return null==r?e:c(e,function(t){return n(r,T,t)})}function Ye(n){return n=An(n),n.__chain__=true,n; +}function Qe(n,t){return t(n)}function Xe(){return this}function nu(n,t){return(ff(n)?r:uo)(n,ye(t,3))}function tu(n,t){return(ff(n)?e:io)(n,ye(t,3))}function ru(n,t){return(ff(n)?c:Gt)(n,ye(t,3))}function eu(n,t,r){return t=r?T:t,t=n&&null==t?n.length:t,fe(n,128,T,T,T,T,t)}function uu(n,t){var r;if(typeof t!="function")throw new ti("Expected a function");return n=ku(n),function(){return 0<--n&&(r=t.apply(this,arguments)),1>=n&&(t=T),r}}function iu(n,t,r){return t=r?T:t,n=fe(n,8,T,T,T,T,T,t),n.placeholder=iu.placeholder, +n}function ou(n,t,r){return t=r?T:t,n=fe(n,16,T,T,T,T,T,t),n.placeholder=ou.placeholder,n}function fu(n,t,r){function e(t){var r=c,e=a;return c=a=T,_=t,s=n.apply(e,r)}function u(n){var r=n-p;return n-=_,p===T||r>=t||0>r||g&&n>=l}function i(){var n=Go();if(u(n))return o(n);var r,e=bo;r=n-_,n=t-(n-p),r=g?Ci(n,l-r):n,h=e(i,r)}function o(n){return h=T,d&&c?e(n):(c=a=T,s)}function f(){var n=Go(),r=u(n);if(c=arguments,a=this,p=n,r){if(h===T)return _=n=p,h=bo(i,t),v?e(n):s;if(g)return h=bo(i,t),e(p)}return h===T&&(h=bo(i,t)), +s}var c,a,l,s,h,p,_=0,v=false,g=false,d=true;if(typeof n!="function")throw new ti("Expected a function");return t=Su(t)||0,du(r)&&(v=!!r.leading,l=(g="maxWait"in r)?Li(Su(r.maxWait)||0,t):l,d="trailing"in r?!!r.trailing:d),f.cancel=function(){h!==T&&lo(h),_=0,c=p=a=h=T},f.flush=function(){return h===T?s:o(Go())},f}function cu(n,t){if(typeof n!="function"||null!=t&&typeof t!="function")throw new ti("Expected a function");var r=function(){var e=arguments,u=t?t.apply(this,e):e[0],i=r.cache;return i.has(u)?i.get(u):(e=n.apply(this,e), +r.cache=i.set(u,e)||i,e)};return r.cache=new(cu.Cache||Fn),r}function au(n){if(typeof n!="function")throw new ti("Expected a function");return function(){var t=arguments;switch(t.length){case 0:return!n.call(this);case 1:return!n.call(this,t[0]);case 2:return!n.call(this,t[0],t[1]);case 3:return!n.call(this,t[0],t[1],t[2])}return!n.apply(this,t)}}function lu(n,t){return n===t||n!==n&&t!==t}function su(n){return null!=n&&gu(n.length)&&!_u(n)}function hu(n){return yu(n)&&su(n)}function pu(n){if(!yu(n))return false; +var t=Ot(n);return"[object Error]"==t||"[object DOMException]"==t||typeof n.message=="string"&&typeof n.name=="string"&&!xu(n)}function _u(n){return!!du(n)&&(n=Ot(n),"[object Function]"==n||"[object GeneratorFunction]"==n||"[object AsyncFunction]"==n||"[object Proxy]"==n)}function vu(n){return typeof n=="number"&&n==ku(n)}function gu(n){return typeof n=="number"&&-1=n}function du(n){var t=typeof n;return null!=n&&("object"==t||"function"==t)}function yu(n){return null!=n&&typeof n=="object"; +}function bu(n){return typeof n=="number"||yu(n)&&"[object Number]"==Ot(n)}function xu(n){return!(!yu(n)||"[object Object]"!=Ot(n))&&(n=di(n),null===n||(n=oi.call(n,"constructor")&&n.constructor,typeof n=="function"&&n instanceof n&&ii.call(n)==li))}function ju(n){return typeof n=="string"||!ff(n)&&yu(n)&&"[object String]"==Ot(n)}function wu(n){return typeof n=="symbol"||yu(n)&&"[object Symbol]"==Ot(n)}function mu(n){if(!n)return[];if(su(n))return ju(n)?M(n):Lr(n);if(wi&&n[wi]){n=n[wi]();for(var t,r=[];!(t=n.next()).done;)r.push(t.value); +return r}return t=vo(n),("[object Map]"==t?W:"[object Set]"==t?L:Lu)(n)}function Au(n){return n?(n=Su(n),n===$||n===-$?1.7976931348623157e308*(0>n?-1:1):n===n?n:0):0===n?n:0}function ku(n){n=Au(n);var t=n%1;return n===n?t?n-t:n:0}function Eu(n){return n?pt(ku(n),0,4294967295):0}function Su(n){if(typeof n=="number")return n;if(wu(n))return F;if(du(n)&&(n=typeof n.valueOf=="function"?n.valueOf():n,n=du(n)?n+"":n),typeof n!="string")return 0===n?n:+n;n=n.replace(un,"");var t=gn.test(n);return t||yn.test(n)?Dn(n.slice(2),t?2:8):vn.test(n)?F:+n; +}function Ou(n){return Cr(n,Uu(n))}function Iu(n){return null==n?"":yr(n)}function Ru(n,t,r){return n=null==n?T:Et(n,t),n===T?r:n}function zu(n,t){return null!=n&&we(n,t,zt)}function Wu(n){return su(n)?qn(n):Vt(n)}function Uu(n){if(su(n))n=qn(n,true);else if(du(n)){var t,r=ze(n),e=[];for(t in n)("constructor"!=t||!r&&oi.call(n,t))&&e.push(t);n=e}else{if(t=[],null!=n)for(r in Qu(n))t.push(r);n=t}return n}function Bu(n,t){if(null==n)return{};var r=c(ve(n),function(n){return[n]});return t=ye(t),tr(n,r,function(n,r){ +return t(n,r[0])})}function Lu(n){return null==n?[]:S(n,Wu(n))}function Cu(n){return $f(Iu(n).toLowerCase())}function Du(n){return(n=Iu(n))&&n.replace(xn,Xn).replace(Sn,"")}function Mu(n,t,r){return n=Iu(n),t=r?T:t,t===T?zn.test(n)?n.match(In)||[]:n.match(sn)||[]:n.match(t)||[]}function Tu(n){return function(){return n}}function $u(n){return n}function Fu(n){return qt(typeof n=="function"?n:_t(n,1))}function Nu(n,t,e){var u=Wu(t),i=kt(t,u);null!=e||du(t)&&(i.length||!u.length)||(e=t,t=n,n=this,i=kt(t,Wu(t))); +var o=!(du(e)&&"chain"in e&&!e.chain),f=_u(n);return r(i,function(r){var e=t[r];n[r]=e,f&&(n.prototype[r]=function(){var t=this.__chain__;if(o||t){var r=n(this.__wrapped__);return(r.__actions__=Lr(this.__actions__)).push({func:e,args:arguments,thisArg:n}),r.__chain__=t,r}return e.apply(n,a([this.value()],arguments))})}),n}function Pu(){}function Zu(n){return Ie(n)?b(Me(n)):rr(n)}function qu(){return[]}function Vu(){return false}mn=null==mn?$n:rt.defaults($n.Object(),mn,rt.pick($n,Wn));var Ku=mn.Array,Gu=mn.Date,Hu=mn.Error,Ju=mn.Function,Yu=mn.Math,Qu=mn.Object,Xu=mn.RegExp,ni=mn.String,ti=mn.TypeError,ri=Ku.prototype,ei=Qu.prototype,ui=mn["__core-js_shared__"],ii=Ju.prototype.toString,oi=ei.hasOwnProperty,fi=0,ci=function(){ +var n=/[^.]+$/.exec(ui&&ui.keys&&ui.keys.IE_PROTO||"");return n?"Symbol(src)_1."+n:""}(),ai=ei.toString,li=ii.call(Qu),si=$n._,hi=Xu("^"+ii.call(oi).replace(rn,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),pi=Pn?mn.Buffer:T,_i=mn.Symbol,vi=mn.Uint8Array,gi=pi?pi.allocUnsafe:T,di=U(Qu.getPrototypeOf,Qu),yi=Qu.create,bi=ei.propertyIsEnumerable,xi=ri.splice,ji=_i?_i.isConcatSpreadable:T,wi=_i?_i.iterator:T,mi=_i?_i.toStringTag:T,Ai=function(){try{var n=je(Qu,"defineProperty"); +return n({},"",{}),n}catch(n){}}(),ki=mn.clearTimeout!==$n.clearTimeout&&mn.clearTimeout,Ei=Gu&&Gu.now!==$n.Date.now&&Gu.now,Si=mn.setTimeout!==$n.setTimeout&&mn.setTimeout,Oi=Yu.ceil,Ii=Yu.floor,Ri=Qu.getOwnPropertySymbols,zi=pi?pi.isBuffer:T,Wi=mn.isFinite,Ui=ri.join,Bi=U(Qu.keys,Qu),Li=Yu.max,Ci=Yu.min,Di=Gu.now,Mi=mn.parseInt,Ti=Yu.random,$i=ri.reverse,Fi=je(mn,"DataView"),Ni=je(mn,"Map"),Pi=je(mn,"Promise"),Zi=je(mn,"Set"),qi=je(mn,"WeakMap"),Vi=je(Qu,"create"),Ki=qi&&new qi,Gi={},Hi=Te(Fi),Ji=Te(Ni),Yi=Te(Pi),Qi=Te(Zi),Xi=Te(qi),no=_i?_i.prototype:T,to=no?no.valueOf:T,ro=no?no.toString:T,eo=function(){ +function n(){}return function(t){return du(t)?yi?yi(t):(n.prototype=t,t=new n,n.prototype=T,t):{}}}();An.templateSettings={escape:J,evaluate:Y,interpolate:Q,variable:"",imports:{_:An}},An.prototype=kn.prototype,An.prototype.constructor=An,On.prototype=eo(kn.prototype),On.prototype.constructor=On,Ln.prototype=eo(kn.prototype),Ln.prototype.constructor=Ln,Mn.prototype.clear=function(){this.__data__=Vi?Vi(null):{},this.size=0},Mn.prototype.delete=function(n){return n=this.has(n)&&delete this.__data__[n], +this.size-=n?1:0,n},Mn.prototype.get=function(n){var t=this.__data__;return Vi?(n=t[n],"__lodash_hash_undefined__"===n?T:n):oi.call(t,n)?t[n]:T},Mn.prototype.has=function(n){var t=this.__data__;return Vi?t[n]!==T:oi.call(t,n)},Mn.prototype.set=function(n,t){var r=this.__data__;return this.size+=this.has(n)?0:1,r[n]=Vi&&t===T?"__lodash_hash_undefined__":t,this},Tn.prototype.clear=function(){this.__data__=[],this.size=0},Tn.prototype.delete=function(n){var t=this.__data__;return n=ft(t,n),!(0>n)&&(n==t.length-1?t.pop():xi.call(t,n,1), +--this.size,true)},Tn.prototype.get=function(n){var t=this.__data__;return n=ft(t,n),0>n?T:t[n][1]},Tn.prototype.has=function(n){return-1e?(++this.size,r.push([n,t])):r[e][1]=t,this},Fn.prototype.clear=function(){this.size=0,this.__data__={hash:new Mn,map:new(Ni||Tn),string:new Mn}},Fn.prototype.delete=function(n){return n=be(this,n).delete(n),this.size-=n?1:0,n},Fn.prototype.get=function(n){return be(this,n).get(n); +},Fn.prototype.has=function(n){return be(this,n).has(n)},Fn.prototype.set=function(n,t){var r=be(this,n),e=r.size;return r.set(n,t),this.size+=r.size==e?0:1,this},Nn.prototype.add=Nn.prototype.push=function(n){return this.__data__.set(n,"__lodash_hash_undefined__"),this},Nn.prototype.has=function(n){return this.__data__.has(n)},Zn.prototype.clear=function(){this.__data__=new Tn,this.size=0},Zn.prototype.delete=function(n){var t=this.__data__;return n=t.delete(n),this.size=t.size,n},Zn.prototype.get=function(n){ +return this.__data__.get(n)},Zn.prototype.has=function(n){return this.__data__.has(n)},Zn.prototype.set=function(n,t){var r=this.__data__;if(r instanceof Tn){var e=r.__data__;if(!Ni||199>e.length)return e.push([n,t]),this.size=++r.size,this;r=this.__data__=new Fn(e)}return r.set(n,t),this.size=r.size,this};var uo=Fr(mt),io=Fr(At,true),oo=Nr(),fo=Nr(true),co=Ki?function(n,t){return Ki.set(n,t),n}:$u,ao=Ai?function(n,t){return Ai(n,"toString",{configurable:true,enumerable:false,value:Tu(t),writable:true})}:$u,lo=ki||function(n){ +return $n.clearTimeout(n)},so=Zi&&1/L(new Zi([,-0]))[1]==$?function(n){return new Zi(n)}:Pu,ho=Ki?function(n){return Ki.get(n)}:Pu,po=Ri?function(n){return null==n?[]:(n=Qu(n),i(Ri(n),function(t){return bi.call(n,t)}))}:qu,_o=Ri?function(n){for(var t=[];n;)a(t,po(n)),n=di(n);return t}:qu,vo=Ot;(Fi&&"[object DataView]"!=vo(new Fi(new ArrayBuffer(1)))||Ni&&"[object Map]"!=vo(new Ni)||Pi&&"[object Promise]"!=vo(Pi.resolve())||Zi&&"[object Set]"!=vo(new Zi)||qi&&"[object WeakMap]"!=vo(new qi))&&(vo=function(n){ +var t=Ot(n);if(n=(n="[object Object]"==t?n.constructor:T)?Te(n):"")switch(n){case Hi:return"[object DataView]";case Ji:return"[object Map]";case Yi:return"[object Promise]";case Qi:return"[object Set]";case Xi:return"[object WeakMap]"}return t});var go=ui?_u:Vu,yo=Ce(co),bo=Si||function(n,t){return $n.setTimeout(n,t)},xo=Ce(ao),jo=function(n){n=cu(n,function(n){return 500===t.size&&t.clear(),n});var t=n.cache;return n}(function(n){var t=[];return 46===n.charCodeAt(0)&&t.push(""),n.replace(tn,function(n,r,e,u){ +t.push(e?u.replace(hn,"$1"):r||n)}),t}),wo=fr(function(n,t){return hu(n)?yt(n,wt(t,1,hu,true)):[]}),mo=fr(function(n,t){var r=Ve(t);return hu(r)&&(r=T),hu(n)?yt(n,wt(t,1,hu,true),ye(r,2)):[]}),Ao=fr(function(n,t){var r=Ve(t);return hu(r)&&(r=T),hu(n)?yt(n,wt(t,1,hu,true),T,r):[]}),ko=fr(function(n){var t=c(n,kr);return t.length&&t[0]===n[0]?Wt(t):[]}),Eo=fr(function(n){var t=Ve(n),r=c(n,kr);return t===Ve(r)?t=T:r.pop(),r.length&&r[0]===n[0]?Wt(r,ye(t,2)):[]}),So=fr(function(n){var t=Ve(n),r=c(n,kr);return(t=typeof t=="function"?t:T)&&r.pop(), +r.length&&r[0]===n[0]?Wt(r,T,t):[]}),Oo=fr(Ke),Io=pe(function(n,t){var r=null==n?0:n.length,e=ht(n,t);return ur(n,c(t,function(n){return Se(n,r)?+n:n}).sort(Wr)),e}),Ro=fr(function(n){return br(wt(n,1,hu,true))}),zo=fr(function(n){var t=Ve(n);return hu(t)&&(t=T),br(wt(n,1,hu,true),ye(t,2))}),Wo=fr(function(n){var t=Ve(n),t=typeof t=="function"?t:T;return br(wt(n,1,hu,true),T,t)}),Uo=fr(function(n,t){return hu(n)?yt(n,t):[]}),Bo=fr(function(n){return mr(i(n,hu))}),Lo=fr(function(n){var t=Ve(n);return hu(t)&&(t=T), +mr(i(n,hu),ye(t,2))}),Co=fr(function(n){var t=Ve(n),t=typeof t=="function"?t:T;return mr(i(n,hu),T,t)}),Do=fr(He),Mo=fr(function(n){var t=n.length,t=1=t}),of=Lt(function(){return arguments}())?Lt:function(n){return yu(n)&&oi.call(n,"callee")&&!bi.call(n,"callee")},ff=Ku.isArray,cf=Vn?E(Vn):Ct,af=zi||Vu,lf=Kn?E(Kn):Dt,sf=Gn?E(Gn):Tt,hf=Hn?E(Hn):Nt,pf=Jn?E(Jn):Pt,_f=Yn?E(Yn):Zt,vf=ee(Kt),gf=ee(function(n,t){return n<=t}),df=$r(function(n,t){ +if(ze(t)||su(t))Cr(t,Wu(t),n);else for(var r in t)oi.call(t,r)&&ot(n,r,t[r])}),yf=$r(function(n,t){Cr(t,Uu(t),n)}),bf=$r(function(n,t,r,e){Cr(t,Uu(t),n,e)}),xf=$r(function(n,t,r,e){Cr(t,Wu(t),n,e)}),jf=pe(ht),wf=fr(function(n,t){n=Qu(n);var r=-1,e=t.length,u=2--n)return t.apply(this,arguments)}},An.ary=eu,An.assign=df,An.assignIn=yf,An.assignInWith=bf,An.assignWith=xf,An.at=jf,An.before=uu,An.bind=Ho,An.bindAll=Nf,An.bindKey=Jo,An.castArray=function(){if(!arguments.length)return[];var n=arguments[0];return ff(n)?n:[n]},An.chain=Ye,An.chunk=function(n,t,r){if(t=(r?Oe(n,t,r):t===T)?1:Li(ku(t),0),r=null==n?0:n.length,!r||1>t)return[];for(var e=0,u=0,i=Ku(Oi(r/t));et?0:t,e)):[]},An.dropRight=function(n,t,r){var e=null==n?0:n.length;return e?(t=r||t===T?1:ku(t),t=e-t,hr(n,0,0>t?0:t)):[]},An.dropRightWhile=function(n,t){return n&&n.length?jr(n,ye(t,3),true,true):[]; +},An.dropWhile=function(n,t){return n&&n.length?jr(n,ye(t,3),true):[]},An.fill=function(n,t,r,e){var u=null==n?0:n.length;if(!u)return[];for(r&&typeof r!="number"&&Oe(n,t,r)&&(r=0,e=u),u=n.length,r=ku(r),0>r&&(r=-r>u?0:u+r),e=e===T||e>u?u:ku(e),0>e&&(e+=u),e=r>e?0:Eu(e);r>>0,r?(n=Iu(n))&&(typeof t=="string"||null!=t&&!hf(t))&&(t=yr(t),!t&&Rn.test(n))?Or(M(n),0,r):n.split(t,r):[]},An.spread=function(t,r){if(typeof t!="function")throw new ti("Expected a function");return r=null==r?0:Li(ku(r),0), +fr(function(e){var u=e[r];return e=Or(e,0,r),u&&a(e,u),n(t,this,e)})},An.tail=function(n){var t=null==n?0:n.length;return t?hr(n,1,t):[]},An.take=function(n,t,r){return n&&n.length?(t=r||t===T?1:ku(t),hr(n,0,0>t?0:t)):[]},An.takeRight=function(n,t,r){var e=null==n?0:n.length;return e?(t=r||t===T?1:ku(t),t=e-t,hr(n,0>t?0:t,e)):[]},An.takeRightWhile=function(n,t){return n&&n.length?jr(n,ye(t,3),false,true):[]},An.takeWhile=function(n,t){return n&&n.length?jr(n,ye(t,3)):[]},An.tap=function(n,t){return t(n), +n},An.throttle=function(n,t,r){var e=true,u=true;if(typeof n!="function")throw new ti("Expected a function");return du(r)&&(e="leading"in r?!!r.leading:e,u="trailing"in r?!!r.trailing:u),fu(n,t,{leading:e,maxWait:t,trailing:u})},An.thru=Qe,An.toArray=mu,An.toPairs=zf,An.toPairsIn=Wf,An.toPath=function(n){return ff(n)?c(n,Me):wu(n)?[n]:Lr(jo(Iu(n)))},An.toPlainObject=Ou,An.transform=function(n,t,e){var u=ff(n),i=u||af(n)||_f(n);if(t=ye(t,4),null==e){var o=n&&n.constructor;e=i?u?new o:[]:du(n)&&_u(o)?eo(di(n)):{}; +}return(i?r:mt)(n,function(n,r,u){return t(e,n,r,u)}),e},An.unary=function(n){return eu(n,1)},An.union=Ro,An.unionBy=zo,An.unionWith=Wo,An.uniq=function(n){return n&&n.length?br(n):[]},An.uniqBy=function(n,t){return n&&n.length?br(n,ye(t,2)):[]},An.uniqWith=function(n,t){return t=typeof t=="function"?t:T,n&&n.length?br(n,T,t):[]},An.unset=function(n,t){return null==n||xr(n,t)},An.unzip=He,An.unzipWith=Je,An.update=function(n,t,r){return null!=n&&(r=Er(r),n=lr(n,t,r(Et(n,t)),void 0)),n},An.updateWith=function(n,t,r,e){ +return e=typeof e=="function"?e:T,null!=n&&(r=Er(r),n=lr(n,t,r(Et(n,t)),e)),n},An.values=Lu,An.valuesIn=function(n){return null==n?[]:S(n,Uu(n))},An.without=Uo,An.words=Mu,An.wrap=function(n,t){return nf(Er(t),n)},An.xor=Bo,An.xorBy=Lo,An.xorWith=Co,An.zip=Do,An.zipObject=function(n,t){return Ar(n||[],t||[],ot)},An.zipObjectDeep=function(n,t){return Ar(n||[],t||[],lr)},An.zipWith=Mo,An.entries=zf,An.entriesIn=Wf,An.extend=yf,An.extendWith=bf,Nu(An,An),An.add=Qf,An.attempt=Ff,An.camelCase=Uf,An.capitalize=Cu, +An.ceil=Xf,An.clamp=function(n,t,r){return r===T&&(r=t,t=T),r!==T&&(r=Su(r),r=r===r?r:0),t!==T&&(t=Su(t),t=t===t?t:0),pt(Su(n),t,r)},An.clone=function(n){return _t(n,4)},An.cloneDeep=function(n){return _t(n,5)},An.cloneDeepWith=function(n,t){return t=typeof t=="function"?t:T,_t(n,5,t)},An.cloneWith=function(n,t){return t=typeof t=="function"?t:T,_t(n,4,t)},An.conformsTo=function(n,t){return null==t||gt(n,t,Wu(t))},An.deburr=Du,An.defaultTo=function(n,t){return null==n||n!==n?t:n},An.divide=nc,An.endsWith=function(n,t,r){ +n=Iu(n),t=yr(t);var e=n.length,e=r=r===T?e:pt(ku(r),0,e);return r-=t.length,0<=r&&n.slice(r,e)==t},An.eq=lu,An.escape=function(n){return(n=Iu(n))&&H.test(n)?n.replace(K,nt):n},An.escapeRegExp=function(n){return(n=Iu(n))&&en.test(n)?n.replace(rn,"\\$&"):n},An.every=function(n,t,r){var e=ff(n)?u:bt;return r&&Oe(n,t,r)&&(t=T),e(n,ye(t,3))},An.find=Fo,An.findIndex=Ne,An.findKey=function(n,t){return p(n,ye(t,3),mt)},An.findLast=No,An.findLastIndex=Pe,An.findLastKey=function(n,t){return p(n,ye(t,3),At); +},An.floor=tc,An.forEach=nu,An.forEachRight=tu,An.forIn=function(n,t){return null==n?n:oo(n,ye(t,3),Uu)},An.forInRight=function(n,t){return null==n?n:fo(n,ye(t,3),Uu)},An.forOwn=function(n,t){return n&&mt(n,ye(t,3))},An.forOwnRight=function(n,t){return n&&At(n,ye(t,3))},An.get=Ru,An.gt=ef,An.gte=uf,An.has=function(n,t){return null!=n&&we(n,t,Rt)},An.hasIn=zu,An.head=qe,An.identity=$u,An.includes=function(n,t,r,e){return n=su(n)?n:Lu(n),r=r&&!e?ku(r):0,e=n.length,0>r&&(r=Li(e+r,0)),ju(n)?r<=e&&-1r&&(r=Li(e+r,0)),v(n,t,r)):-1},An.inRange=function(n,t,r){return t=Au(t),r===T?(r=t,t=0):r=Au(r),n=Su(n),n>=Ci(t,r)&&n=n},An.isSet=pf,An.isString=ju,An.isSymbol=wu,An.isTypedArray=_f,An.isUndefined=function(n){return n===T},An.isWeakMap=function(n){return yu(n)&&"[object WeakMap]"==vo(n)},An.isWeakSet=function(n){return yu(n)&&"[object WeakSet]"==Ot(n)},An.join=function(n,t){return null==n?"":Ui.call(n,t)},An.kebabCase=Bf,An.last=Ve,An.lastIndexOf=function(n,t,r){var e=null==n?0:n.length;if(!e)return-1;var u=e;if(r!==T&&(u=ku(r),u=0>u?Li(e+u,0):Ci(u,e-1)), +t===t)n:{for(r=u+1;r--;)if(n[r]===t){n=r;break n}n=r}else n=_(n,d,u,true);return n},An.lowerCase=Lf,An.lowerFirst=Cf,An.lt=vf,An.lte=gf,An.max=function(n){return n&&n.length?xt(n,$u,It):T},An.maxBy=function(n,t){return n&&n.length?xt(n,ye(t,2),It):T},An.mean=function(n){return y(n,$u)},An.meanBy=function(n,t){return y(n,ye(t,2))},An.min=function(n){return n&&n.length?xt(n,$u,Kt):T},An.minBy=function(n,t){return n&&n.length?xt(n,ye(t,2),Kt):T},An.stubArray=qu,An.stubFalse=Vu,An.stubObject=function(){ +return{}},An.stubString=function(){return""},An.stubTrue=function(){return true},An.multiply=rc,An.nth=function(n,t){return n&&n.length?Qt(n,ku(t)):T},An.noConflict=function(){return $n._===this&&($n._=si),this},An.noop=Pu,An.now=Go,An.pad=function(n,t,r){n=Iu(n);var e=(t=ku(t))?D(n):0;return!t||e>=t?n:(t=(t-e)/2,ne(Ii(t),r)+n+ne(Oi(t),r))},An.padEnd=function(n,t,r){n=Iu(n);var e=(t=ku(t))?D(n):0;return t&&et){var e=n;n=t,t=e}return r||n%1||t%1?(r=Ti(),Ci(n+r*(t-n+Cn("1e-"+((r+"").length-1))),t)):ir(n,t)},An.reduce=function(n,t,r){var e=ff(n)?l:j,u=3>arguments.length;return e(n,ye(t,4),r,u,uo)},An.reduceRight=function(n,t,r){ +var e=ff(n)?s:j,u=3>arguments.length;return e(n,ye(t,4),r,u,io)},An.repeat=function(n,t,r){return t=(r?Oe(n,t,r):t===T)?1:ku(t),or(Iu(n),t)},An.replace=function(){var n=arguments,t=Iu(n[0]);return 3>n.length?t:t.replace(n[1],n[2])},An.result=function(n,t,r){t=Sr(t,n);var e=-1,u=t.length;for(u||(u=1,n=T);++en||9007199254740991=i)return n;if(i=r-D(e),1>i)return e;if(r=o?Or(o,0,i).join(""):n.slice(0,i),u===T)return r+e;if(o&&(i+=r.length-i),hf(u)){if(n.slice(i).search(u)){var f=r;for(u.global||(u=Xu(u.source,Iu(_n.exec(u))+"g")), +u.lastIndex=0;o=u.exec(f);)var c=o.index;r=r.slice(0,c===T?i:c)}}else n.indexOf(yr(u),i)!=i&&(u=r.lastIndexOf(u),-1e.__dir__?"Right":"")}),e},Ln.prototype[n+"Right"]=function(t){return this.reverse()[n](t).reverse()}}),r(["filter","map","takeWhile"],function(n,t){var r=t+1,e=1==r||3==r;Ln.prototype[n]=function(n){var t=this.clone();return t.__iteratees__.push({ +iteratee:ye(n,3),type:r}),t.__filtered__=t.__filtered__||e,t}}),r(["head","last"],function(n,t){var r="take"+(t?"Right":"");Ln.prototype[n]=function(){return this[r](1).value()[0]}}),r(["initial","tail"],function(n,t){var r="drop"+(t?"":"Right");Ln.prototype[n]=function(){return this.__filtered__?new Ln(this):this[r](1)}}),Ln.prototype.compact=function(){return this.filter($u)},Ln.prototype.find=function(n){return this.filter(n).head()},Ln.prototype.findLast=function(n){return this.reverse().find(n); +},Ln.prototype.invokeMap=fr(function(n,t){return typeof n=="function"?new Ln(this):this.map(function(r){return Bt(r,n,t)})}),Ln.prototype.reject=function(n){return this.filter(au(ye(n)))},Ln.prototype.slice=function(n,t){n=ku(n);var r=this;return r.__filtered__&&(0t)?new Ln(r):(0>n?r=r.takeRight(-n):n&&(r=r.drop(n)),t!==T&&(t=ku(t),r=0>t?r.dropRight(-t):r.take(t-n)),r)},Ln.prototype.takeRightWhile=function(n){return this.reverse().takeWhile(n).reverse()},Ln.prototype.toArray=function(){return this.take(4294967295); +},mt(Ln.prototype,function(n,t){var r=/^(?:filter|find|map|reject)|While$/.test(t),e=/^(?:head|last)$/.test(t),u=An[e?"take"+("last"==t?"Right":""):t],i=e||/^find/.test(t);u&&(An.prototype[t]=function(){var t=this.__wrapped__,o=e?[1]:arguments,f=t instanceof Ln,c=o[0],l=f||ff(t),s=function(n){return n=u.apply(An,a([n],o)),e&&h?n[0]:n};l&&r&&typeof c=="function"&&1!=c.length&&(f=l=false);var h=this.__chain__,p=!!this.__actions__.length,c=i&&!h,f=f&&!p;return!i&&l?(t=f?t:new Ln(this),t=n.apply(t,o),t.__actions__.push({ +func:Qe,args:[s],thisArg:T}),new On(t,h)):c&&f?n.apply(this,o):(t=this.thru(s),c?e?t.value()[0]:t.value():t)})}),r("pop push shift sort splice unshift".split(" "),function(n){var t=ri[n],r=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",e=/^(?:pop|shift)$/.test(n);An.prototype[n]=function(){var n=arguments;if(e&&!this.__chain__){var u=this.value();return t.apply(ff(u)?u:[],n)}return this[r](function(r){return t.apply(ff(r)?r:[],n)})}}),mt(Ln.prototype,function(n,t){var r=An[t];if(r){var e=r.name+""; +(Gi[e]||(Gi[e]=[])).push({name:t,func:r})}}),Gi[Jr(T,2).name]=[{name:"wrapper",func:T}],Ln.prototype.clone=function(){var n=new Ln(this.__wrapped__);return n.__actions__=Lr(this.__actions__),n.__dir__=this.__dir__,n.__filtered__=this.__filtered__,n.__iteratees__=Lr(this.__iteratees__),n.__takeCount__=this.__takeCount__,n.__views__=Lr(this.__views__),n},Ln.prototype.reverse=function(){if(this.__filtered__){var n=new Ln(this);n.__dir__=-1,n.__filtered__=true}else n=this.clone(),n.__dir__*=-1;return n; +},Ln.prototype.value=function(){var n,t=this.__wrapped__.value(),r=this.__dir__,e=ff(t),u=0>r,i=e?t.length:0;n=0;for(var o=i,f=this.__views__,c=-1,a=f.length;++c=this.__values__.length;return{done:n,value:n?T:this.__values__[this.__index__++]}},An.prototype.plant=function(n){for(var t,r=this;r instanceof kn;){ +var e=Fe(r);e.__index__=0,e.__values__=T,t?u.__wrapped__=e:t=e;var u=e,r=r.__wrapped__}return u.__wrapped__=n,t},An.prototype.reverse=function(){var n=this.__wrapped__;return n instanceof Ln?(this.__actions__.length&&(n=new Ln(this)),n=n.reverse(),n.__actions__.push({func:Qe,args:[Ge],thisArg:T}),new On(n,this.__chain__)):this.thru(Ge)},An.prototype.toJSON=An.prototype.valueOf=An.prototype.value=function(){return wr(this.__wrapped__,this.__actions__)},An.prototype.first=An.prototype.head,wi&&(An.prototype[wi]=Xe), +An}();typeof define=="function"&&typeof define.amd=="object"&&define.amd?($n._=rt, define(function(){return rt})):Nn?((Nn.exports=rt)._=rt,Fn._=rt):$n._=rt}).call(this); \ No newline at end of file diff --git a/src/ui/shared/vendor/popper.js/popper.min.js b/src/ui/shared/vendor/popper.js/popper.min.js new file mode 100644 index 00000000..94a5c26f --- /dev/null +++ b/src/ui/shared/vendor/popper.js/popper.min.js @@ -0,0 +1,5 @@ +/* + Copyright (C) Federico Zivolo 2019 + Distributed under the MIT License (license terms are at http://opensource.org/licenses/MIT). + */(function(e,t){'object'==typeof exports&&'undefined'!=typeof module?module.exports=t():'function'==typeof define&&define.amd?define(t):e.Popper=t()})(this,function(){'use strict';function e(e){return e&&'[object Function]'==={}.toString.call(e)}function t(e,t){if(1!==e.nodeType)return[];var o=e.ownerDocument.defaultView,n=o.getComputedStyle(e,null);return t?n[t]:n}function o(e){return'HTML'===e.nodeName?e:e.parentNode||e.host}function n(e){if(!e)return document.body;switch(e.nodeName){case'HTML':case'BODY':return e.ownerDocument.body;case'#document':return e.body;}var i=t(e),r=i.overflow,p=i.overflowX,s=i.overflowY;return /(auto|scroll|overlay)/.test(r+s+p)?e:n(o(e))}function r(e){return 11===e?pe:10===e?se:pe||se}function p(e){if(!e)return document.documentElement;for(var o=r(10)?document.body:null,n=e.offsetParent||null;n===o&&e.nextElementSibling;)n=(e=e.nextElementSibling).offsetParent;var i=n&&n.nodeName;return i&&'BODY'!==i&&'HTML'!==i?-1!==['TH','TD','TABLE'].indexOf(n.nodeName)&&'static'===t(n,'position')?p(n):n:e?e.ownerDocument.documentElement:document.documentElement}function s(e){var t=e.nodeName;return'BODY'!==t&&('HTML'===t||p(e.firstElementChild)===e)}function d(e){return null===e.parentNode?e:d(e.parentNode)}function a(e,t){if(!e||!e.nodeType||!t||!t.nodeType)return document.documentElement;var o=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,n=o?e:t,i=o?t:e,r=document.createRange();r.setStart(n,0),r.setEnd(i,0);var l=r.commonAncestorContainer;if(e!==l&&t!==l||n.contains(i))return s(l)?l:p(l);var f=d(e);return f.host?a(f.host,t):a(e,d(t).host)}function l(e){var t=1=o.clientWidth&&n>=o.clientHeight}),l=0a[e]&&!t.escapeWithReference&&(n=Q(f[o],a[e]-('right'===e?f.width:f.height))),le({},o,n)}};return l.forEach(function(e){var t=-1===['left','top'].indexOf(e)?'secondary':'primary';f=fe({},f,m[t](e))}),e.offsets.popper=f,e},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,o=t.popper,n=t.reference,i=e.placement.split('-')[0],r=Z,p=-1!==['top','bottom'].indexOf(i),s=p?'right':'bottom',d=p?'left':'top',a=p?'width':'height';return o[s]r(n[s])&&(e.offsets.popper[d]=r(n[s])),e}},arrow:{order:500,enabled:!0,fn:function(e,o){var n;if(!K(e.instance.modifiers,'arrow','keepTogether'))return e;var i=o.element;if('string'==typeof i){if(i=e.instance.popper.querySelector(i),!i)return e;}else if(!e.instance.popper.contains(i))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),e;var r=e.placement.split('-')[0],p=e.offsets,s=p.popper,d=p.reference,a=-1!==['left','right'].indexOf(r),l=a?'height':'width',f=a?'Top':'Left',m=f.toLowerCase(),h=a?'left':'top',c=a?'bottom':'right',u=S(i)[l];d[c]-us[c]&&(e.offsets.popper[m]+=d[m]+u-s[c]),e.offsets.popper=g(e.offsets.popper);var b=d[m]+d[l]/2-u/2,w=t(e.instance.popper),y=parseFloat(w['margin'+f],10),E=parseFloat(w['border'+f+'Width'],10),v=b-e.offsets.popper[m]-y-E;return v=ee(Q(s[l]-u,v),0),e.arrowElement=i,e.offsets.arrow=(n={},le(n,m,$(v)),le(n,h,''),n),e},element:'[x-arrow]'},flip:{order:600,enabled:!0,fn:function(e,t){if(W(e.instance.modifiers,'inner'))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var o=v(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement,e.positionFixed),n=e.placement.split('-')[0],i=T(n),r=e.placement.split('-')[1]||'',p=[];switch(t.behavior){case ge.FLIP:p=[n,i];break;case ge.CLOCKWISE:p=G(n);break;case ge.COUNTERCLOCKWISE:p=G(n,!0);break;default:p=t.behavior;}return p.forEach(function(s,d){if(n!==s||p.length===d+1)return e;n=e.placement.split('-')[0],i=T(n);var a=e.offsets.popper,l=e.offsets.reference,f=Z,m='left'===n&&f(a.right)>f(l.left)||'right'===n&&f(a.left)f(l.top)||'bottom'===n&&f(a.top)f(o.right),g=f(a.top)f(o.bottom),b='left'===n&&h||'right'===n&&c||'top'===n&&g||'bottom'===n&&u,w=-1!==['top','bottom'].indexOf(n),y=!!t.flipVariations&&(w&&'start'===r&&h||w&&'end'===r&&c||!w&&'start'===r&&g||!w&&'end'===r&&u);(m||b||y)&&(e.flipped=!0,(m||b)&&(n=p[d+1]),y&&(r=z(r)),e.placement=n+(r?'-'+r:''),e.offsets.popper=fe({},e.offsets.popper,D(e.instance.popper,e.offsets.reference,e.placement)),e=P(e.instance.modifiers,e,'flip'))}),e},behavior:'flip',padding:5,boundariesElement:'viewport'},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,o=t.split('-')[0],n=e.offsets,i=n.popper,r=n.reference,p=-1!==['left','right'].indexOf(o),s=-1===['top','left'].indexOf(o);return i[p?'left':'top']=r[o]-(s?i[p?'width':'height']:0),e.placement=T(t),e.offsets.popper=g(i),e}},hide:{order:800,enabled:!0,fn:function(e){if(!K(e.instance.modifiers,'hide','preventOverflow'))return e;var t=e.offsets.reference,o=C(e.instance.modifiers,function(e){return'preventOverflow'===e.name}).boundaries;if(t.bottomo.right||t.top>o.bottom||t.rightwindow.devicePixelRatio||!me),c='bottom'===o?'top':'bottom',g='right'===n?'left':'right',b=H('transform');if(d='bottom'==c?'HTML'===l.nodeName?-l.clientHeight+h.bottom:-f.height+h.bottom:h.top,s='right'==g?'HTML'===l.nodeName?-l.clientWidth+h.right:-f.width+h.right:h.left,a&&b)m[b]='translate3d('+s+'px, '+d+'px, 0)',m[c]=0,m[g]=0,m.willChange='transform';else{var w='bottom'==c?-1:1,y='right'==g?-1:1;m[c]=d*w,m[g]=s*y,m.willChange=c+', '+g}var E={"x-placement":e.placement};return e.attributes=fe({},E,e.attributes),e.styles=fe({},m,e.styles),e.arrowStyles=fe({},e.offsets.arrow,e.arrowStyles),e},gpuAcceleration:!0,x:'bottom',y:'right'},applyStyle:{order:900,enabled:!0,fn:function(e){return j(e.instance.popper,e.styles),V(e.instance.popper,e.attributes),e.arrowElement&&Object.keys(e.arrowStyles).length&&j(e.arrowElement,e.arrowStyles),e},onLoad:function(e,t,o,n,i){var r=L(i,t,e,o.positionFixed),p=O(o.placement,r,t,e,o.modifiers.flip.boundariesElement,o.modifiers.flip.padding);return t.setAttribute('x-placement',p),j(t,{position:o.positionFixed?'fixed':'absolute'}),o},gpuAcceleration:void 0}}},ue}); +//# sourceMappingURL=popper.min.js.map diff --git a/src/util.ts b/src/util.ts new file mode 100644 index 00000000..d353345a --- /dev/null +++ b/src/util.ts @@ -0,0 +1,31 @@ +"use strict"; + +export class Util { + public static async Sleep(ms: number): Promise { + return new Promise(resolve => { + setTimeout(() => { + resolve(ms); + }, ms); + }); + } + /** + * promisify the function + * it will be remove when vscode use node@^8.0 + * @param fn + */ + public static promisify( + fn: (...args: any[]) => any + ): (...whatever: any[]) => Promise { + return function(...argv) { + return new Promise((resolve, reject) => { + fn.call(this, ...argv, (err, data) => { + if (err) { + reject(err); + } else { + resolve(data); + } + }); + }); + }; + } +} diff --git a/webpack.config.js b/webpack.config.js index 37d7024f..626df326 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,31 +1,32 @@ //@ts-check -'use strict'; +"use strict"; -const path = require('path'); +const path = require("path"); +const { CleanWebpackPlugin } = require("clean-webpack-plugin"); //@ts-check /** @typedef {import('webpack').Configuration} WebpackConfig **/ /** @type WebpackConfig */ const extensionConfig = { - target: 'node', // VS Code extensions run in a Node.js-context 📖 -> https://webpack.js.org/configuration/node/ - mode: 'none', // this leaves the source code as close as possible to the original (when packaging we set this to 'production') + target: "node", // VS Code extensions run in a Node.js-context 📖 -> https://webpack.js.org/configuration/node/ + mode: "none", // this leaves the source code as close as possible to the original (when packaging we set this to 'production') - entry: './src/extension.ts', // the entry point of this extension, 📖 -> https://webpack.js.org/configuration/entry-context/ + entry: "./src/extension.ts", // the entry point of this extension, 📖 -> https://webpack.js.org/configuration/entry-context/ output: { // the bundle is stored in the 'dist' folder (check package.json), 📖 -> https://webpack.js.org/configuration/output/ - path: path.resolve(__dirname, 'dist'), - filename: 'extension.js', - libraryTarget: 'commonjs2' + path: path.resolve(__dirname, "dist"), + filename: "extension.js", + libraryTarget: "commonjs2", }, externals: { - vscode: 'commonjs vscode' // the vscode-module is created on-the-fly and must be excluded. Add other modules that cannot be webpack'ed, 📖 -> https://webpack.js.org/configuration/externals/ + vscode: "commonjs vscode", // the vscode-module is created on-the-fly and must be excluded. Add other modules that cannot be webpack'ed, 📖 -> https://webpack.js.org/configuration/externals/ // modules added here also need to be added in the .vscodeignore file }, resolve: { // support reading TypeScript and JavaScript files, 📖 -> https://github.com/TypeStrong/ts-loader - extensions: ['.ts', '.js'] + extensions: [".ts", ".js"], }, module: { rules: [ @@ -34,15 +35,16 @@ const extensionConfig = { exclude: /node_modules/, use: [ { - loader: 'ts-loader' - } - ] - } - ] + loader: "ts-loader", + }, + ], + }, + ], }, - devtool: 'nosources-source-map', + devtool: "nosources-source-map", infrastructureLogging: { level: "log", // enables logging required for problem matchers }, + plugins: [new CleanWebpackPlugin()], }; -module.exports = [ extensionConfig ]; \ No newline at end of file +module.exports = [extensionConfig]; From fff3d910cd5b4e5dcdcf0482a791802a47520a9b Mon Sep 17 00:00:00 2001 From: Ali Arshad Date: Fri, 6 Dec 2024 23:36:05 +0500 Subject: [PATCH 4/6] some deletion --- .gitignore | 7 - .vscode-test.mjs | 5 - .vscode/extensions.json | 5 - .vscode/launch.json | 17 - .vscode/settings.json | 13 - .vscode/tasks.json | 40 - .vscodeignore | 14 - CHANGELOG.md | 9 - README.md | 71 - code-settings-sync.code-workspace | 10 - dist/1.extension.js | 453 - dist/1.extension.js.map | 1 - dist/extension.js | 91901 ---------------- dist/extension.js.map | 1 - eslint.config.mjs | 28 - images/existing-gist.png | Bin 87215 -> 0 bytes images/login-with-github.png | Bin 156024 -> 0 bytes images/logo-128.png | Bin 4699 -> 0 bytes images/logo-256.png | Bin 10121 -> 0 bytes images/logo-512.png | Bin 22366 -> 0 bytes images/logo.sketch | Bin 20650 -> 0 bytes images/slack.png | Bin 8229 -> 0 bytes images/white-cloud.png | Bin 75394 -> 0 bytes package.json | 206 - src/commons.ts | 531 - src/enums.ts | 13 - src/environmentPath.ts | 196 - src/extension.ts | 53 - src/localize.ts | 86 - src/lockfile.ts | 34 - src/models/cloudSettings.model.ts | 6 - src/models/customConfig.model.ts | 33 - src/models/extensionConfig.model.ts | 10 - src/models/language-pack.model.ts | 3 - src/models/localConfig.model.ts | 10 - src/models/settingType.model.ts | 6 - src/models/state.model.ts | 10 - src/models/webview.model.ts | 9 - src/pragmaUtil.ts | 291 - src/service/autoUpload.service.ts | 99 - src/service/file.service.ts | 240 - src/service/github.oauth.service.ts | 136 - src/service/github.service.ts | 203 - src/service/plugin.service.ts | 243 - src/service/webview.service.ts | 479 - src/state.ts | 5 - src/sync.ts | 1145 - src/test/extension.test.ts | 3 - src/test/index.ts | 8 - src/test/pragmaUtil/index.ts | 105 - src/test/pragmaUtil/testSettings.txt | 35 - src/test/service/fileService/dummyrc | 3 - .../service/fileService/fileService.test.ts | 36 - src/ui/gist-selection/gist-selection.html | 95 - src/ui/gist-selection/gist-selection.js | 89 - src/ui/landing-page/landing-page.html | 178 - src/ui/landing-page/landing-page.js | 40 - src/ui/settings/settings.html | 68 - src/ui/settings/settings.js | 269 - src/ui/shared/fonts.js | 19 - src/ui/shared/page-header.js | 18 - src/ui/shared/styles.css | 199 - .../vendor/bootstrap/css/bootstrap.min.css | 7 - .../vendor/bootstrap/js/bootstrap.min.js | 7 - .../fontawesome/css/fontawesome.min.css | 5 - .../vendor/fontawesome/css/solid.min.css | 5 - .../fontawesome/webfonts/fa-solid-900.ttf | Bin 191832 -> 0 bytes src/ui/shared/vendor/google/OpenSans-Bold.ttf | Bin 103616 -> 0 bytes src/ui/shared/vendor/google/Roboto-Bold.ttf | Bin 170064 -> 0 bytes .../shared/vendor/google/Roboto-Regular.ttf | Bin 170984 -> 0 bytes .../vendor/jquery/jquery-3.3.1.slim.min.js | 2 - src/ui/shared/vendor/lodash/lodash.min.js | 137 - src/ui/shared/vendor/popper.js/popper.min.js | 5 - src/util.ts | 31 - tsconfig.json | 16 - vsc-extension-quickstart.md | 48 - webpack.config.js | 50 - 77 files changed, 98100 deletions(-) delete mode 100644 .gitignore delete mode 100644 .vscode-test.mjs delete mode 100644 .vscode/extensions.json delete mode 100644 .vscode/launch.json delete mode 100644 .vscode/settings.json delete mode 100644 .vscode/tasks.json delete mode 100644 .vscodeignore delete mode 100644 CHANGELOG.md delete mode 100644 README.md delete mode 100644 code-settings-sync.code-workspace delete mode 100644 dist/1.extension.js delete mode 100644 dist/1.extension.js.map delete mode 100644 dist/extension.js delete mode 100644 dist/extension.js.map delete mode 100644 eslint.config.mjs delete mode 100644 images/existing-gist.png delete mode 100644 images/login-with-github.png delete mode 100644 images/logo-128.png delete mode 100644 images/logo-256.png delete mode 100644 images/logo-512.png delete mode 100644 images/logo.sketch delete mode 100644 images/slack.png delete mode 100644 images/white-cloud.png delete mode 100644 package.json delete mode 100644 src/commons.ts delete mode 100644 src/enums.ts delete mode 100644 src/environmentPath.ts delete mode 100644 src/extension.ts delete mode 100644 src/localize.ts delete mode 100644 src/lockfile.ts delete mode 100644 src/models/cloudSettings.model.ts delete mode 100644 src/models/customConfig.model.ts delete mode 100644 src/models/extensionConfig.model.ts delete mode 100644 src/models/language-pack.model.ts delete mode 100644 src/models/localConfig.model.ts delete mode 100644 src/models/settingType.model.ts delete mode 100644 src/models/state.model.ts delete mode 100644 src/models/webview.model.ts delete mode 100644 src/pragmaUtil.ts delete mode 100644 src/service/autoUpload.service.ts delete mode 100644 src/service/file.service.ts delete mode 100644 src/service/github.oauth.service.ts delete mode 100644 src/service/github.service.ts delete mode 100644 src/service/plugin.service.ts delete mode 100644 src/service/webview.service.ts delete mode 100644 src/state.ts delete mode 100644 src/sync.ts delete mode 100644 src/test/extension.test.ts delete mode 100644 src/test/index.ts delete mode 100644 src/test/pragmaUtil/index.ts delete mode 100644 src/test/pragmaUtil/testSettings.txt delete mode 100644 src/test/service/fileService/dummyrc delete mode 100644 src/test/service/fileService/fileService.test.ts delete mode 100644 src/ui/gist-selection/gist-selection.html delete mode 100644 src/ui/gist-selection/gist-selection.js delete mode 100644 src/ui/landing-page/landing-page.html delete mode 100644 src/ui/landing-page/landing-page.js delete mode 100644 src/ui/settings/settings.html delete mode 100644 src/ui/settings/settings.js delete mode 100644 src/ui/shared/fonts.js delete mode 100644 src/ui/shared/page-header.js delete mode 100644 src/ui/shared/styles.css delete mode 100644 src/ui/shared/vendor/bootstrap/css/bootstrap.min.css delete mode 100644 src/ui/shared/vendor/bootstrap/js/bootstrap.min.js delete mode 100644 src/ui/shared/vendor/fontawesome/css/fontawesome.min.css delete mode 100644 src/ui/shared/vendor/fontawesome/css/solid.min.css delete mode 100644 src/ui/shared/vendor/fontawesome/webfonts/fa-solid-900.ttf delete mode 100644 src/ui/shared/vendor/google/OpenSans-Bold.ttf delete mode 100644 src/ui/shared/vendor/google/Roboto-Bold.ttf delete mode 100644 src/ui/shared/vendor/google/Roboto-Regular.ttf delete mode 100644 src/ui/shared/vendor/jquery/jquery-3.3.1.slim.min.js delete mode 100644 src/ui/shared/vendor/lodash/lodash.min.js delete mode 100644 src/ui/shared/vendor/popper.js/popper.min.js delete mode 100644 src/util.ts delete mode 100644 tsconfig.json delete mode 100644 vsc-extension-quickstart.md delete mode 100644 webpack.config.js diff --git a/.gitignore b/.gitignore deleted file mode 100644 index e1183eeb..00000000 --- a/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -out -node_modules -package-lock.json -*.vsix -*.lock -*.log -.history diff --git a/.vscode-test.mjs b/.vscode-test.mjs deleted file mode 100644 index b62ba25f..00000000 --- a/.vscode-test.mjs +++ /dev/null @@ -1,5 +0,0 @@ -import { defineConfig } from '@vscode/test-cli'; - -export default defineConfig({ - files: 'out/test/**/*.test.js', -}); diff --git a/.vscode/extensions.json b/.vscode/extensions.json deleted file mode 100644 index dd01eb35..00000000 --- a/.vscode/extensions.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - // See http://go.microsoft.com/fwlink/?LinkId=827846 - // for the documentation about the extensions.json format - "recommendations": ["dbaeumer.vscode-eslint", "amodio.tsl-problem-matcher", "ms-vscode.extension-test-runner"] -} diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index ccdb134d..00000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,17 +0,0 @@ -// A launch configuration that compiles the extension and then opens it inside a new window -// Use IntelliSense to learn about possible attributes. -// Hover to view descriptions of existing attributes. -// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 -{ - "version": "0.2.0", - "configurations": [ - { - "name": "Run Extension", - "type": "extensionHost", - "request": "launch", - "args": ["--extensionDevelopmentPath=${workspaceFolder}"], - "outFiles": ["${workspaceFolder}/dist/**/*.js"], - "preLaunchTask": "${defaultBuildTask}" - } - ] -} diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 16a5c022..00000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,13 +0,0 @@ -// Place your settings in this file to overwrite default and user settings. -{ - "files.exclude": { - "out": false, // set this to true to hide the "out" folder with the compiled JS files - "dist": false // set this to true to hide the "dist" folder with the compiled JS files - }, - "search.exclude": { - "out": true, // set this to false to include "out" folder in search results - "dist": true // set this to false to include "dist" folder in search results - }, - // Turn off tsc task auto detection since we have the necessary tasks as npm scripts - "typescript.tsc.autoDetect": "off" -} diff --git a/.vscode/tasks.json b/.vscode/tasks.json deleted file mode 100644 index c2ab68ae..00000000 --- a/.vscode/tasks.json +++ /dev/null @@ -1,40 +0,0 @@ -// See https://go.microsoft.com/fwlink/?LinkId=733558 -// for the documentation about the tasks.json format -{ - "version": "2.0.0", - "tasks": [ - { - "type": "npm", - "script": "watch", - "problemMatcher": "$ts-webpack-watch", - "isBackground": true, - "presentation": { - "reveal": "never", - "group": "watchers" - }, - "group": { - "kind": "build", - "isDefault": true - } - }, - { - "type": "npm", - "script": "watch-tests", - "problemMatcher": "$tsc-watch", - "isBackground": true, - "presentation": { - "reveal": "never", - "group": "watchers" - }, - "group": "build" - }, - { - "label": "tasks: watch-tests", - "dependsOn": [ - "npm: watch", - "npm: watch-tests" - ], - "problemMatcher": [] - } - ] -} diff --git a/.vscodeignore b/.vscodeignore deleted file mode 100644 index d255964e..00000000 --- a/.vscodeignore +++ /dev/null @@ -1,14 +0,0 @@ -.vscode/** -.vscode-test/** -out/** -node_modules/** -src/** -.gitignore -.yarnrc -webpack.config.js -vsc-extension-quickstart.md -**/tsconfig.json -**/eslint.config.mjs -**/*.map -**/*.ts -**/.vscode-test.* diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 34ae2a70..00000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,9 +0,0 @@ -# Change Log - -All notable changes to the "code-settings-sync" extension will be documented in this file. - -Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. - -## [Unreleased] - -- Initial release \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index c8cbbd5f..00000000 --- a/README.md +++ /dev/null @@ -1,71 +0,0 @@ -# code-settings-sync README - -This is the README for your extension "code-settings-sync". After writing up a brief description, we recommend including the following sections. - -## Features - -Describe specific features of your extension including screenshots of your extension in action. Image paths are relative to this README file. - -For example if there is an image subfolder under your extension project workspace: - -\!\[feature X\]\(images/feature-x.png\) - -> Tip: Many popular extensions utilize animations. This is an excellent way to show off your extension! We recommend short, focused animations that are easy to follow. - -## Requirements - -If you have any requirements or dependencies, add a section describing those and how to install and configure them. - -## Extension Settings - -Include if your extension adds any VS Code settings through the `contributes.configuration` extension point. - -For example: - -This extension contributes the following settings: - -* `myExtension.enable`: Enable/disable this extension. -* `myExtension.thing`: Set to `blah` to do something. - -## Known Issues - -Calling out known issues can help limit users opening duplicate issues against your extension. - -## Release Notes - -Users appreciate release notes as you update your extension. - -### 1.0.0 - -Initial release of ... - -### 1.0.1 - -Fixed issue #. - -### 1.1.0 - -Added features X, Y, and Z. - ---- - -## Following extension guidelines - -Ensure that you've read through the extensions guidelines and follow the best practices for creating your extension. - -* [Extension Guidelines](https://code.visualstudio.com/api/references/extension-guidelines) - -## Working with Markdown - -You can author your README using Visual Studio Code. Here are some useful editor keyboard shortcuts: - -* Split the editor (`Cmd+\` on macOS or `Ctrl+\` on Windows and Linux). -* Toggle preview (`Shift+Cmd+V` on macOS or `Shift+Ctrl+V` on Windows and Linux). -* Press `Ctrl+Space` (Windows, Linux, macOS) to see a list of Markdown snippets. - -## For more information - -* [Visual Studio Code's Markdown Support](http://code.visualstudio.com/docs/languages/markdown) -* [Markdown Syntax Reference](https://help.github.com/articles/markdown-basics/) - -**Enjoy!** diff --git a/code-settings-sync.code-workspace b/code-settings-sync.code-workspace deleted file mode 100644 index 248c7997..00000000 --- a/code-settings-sync.code-workspace +++ /dev/null @@ -1,10 +0,0 @@ -{ - "folders": [ - { - "path": "." - } - ], - "settings": { - "typescript.tsc.autoDetect": "off" - } -} \ No newline at end of file diff --git a/dist/1.extension.js b/dist/1.extension.js deleted file mode 100644 index 0cb4ba00..00000000 --- a/dist/1.extension.js +++ /dev/null @@ -1,453 +0,0 @@ -"use strict"; -exports.id = 1; -exports.ids = [1]; -exports.modules = { - -/***/ 487: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ toFormData: () => (/* binding */ toFormData) -/* harmony export */ }); -/* harmony import */ var fetch_blob_from_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(444); -/* harmony import */ var formdata_polyfill_esm_min_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(430); - - - -let s = 0; -const S = { - START_BOUNDARY: s++, - HEADER_FIELD_START: s++, - HEADER_FIELD: s++, - HEADER_VALUE_START: s++, - HEADER_VALUE: s++, - HEADER_VALUE_ALMOST_DONE: s++, - HEADERS_ALMOST_DONE: s++, - PART_DATA_START: s++, - PART_DATA: s++, - END: s++ -}; - -let f = 1; -const F = { - PART_BOUNDARY: f, - LAST_BOUNDARY: f *= 2 -}; - -const LF = 10; -const CR = 13; -const SPACE = 32; -const HYPHEN = 45; -const COLON = 58; -const A = 97; -const Z = 122; - -const lower = c => c | 0x20; - -const noop = () => {}; - -class MultipartParser { - /** - * @param {string} boundary - */ - constructor(boundary) { - this.index = 0; - this.flags = 0; - - this.onHeaderEnd = noop; - this.onHeaderField = noop; - this.onHeadersEnd = noop; - this.onHeaderValue = noop; - this.onPartBegin = noop; - this.onPartData = noop; - this.onPartEnd = noop; - - this.boundaryChars = {}; - - boundary = '\r\n--' + boundary; - const ui8a = new Uint8Array(boundary.length); - for (let i = 0; i < boundary.length; i++) { - ui8a[i] = boundary.charCodeAt(i); - this.boundaryChars[ui8a[i]] = true; - } - - this.boundary = ui8a; - this.lookbehind = new Uint8Array(this.boundary.length + 8); - this.state = S.START_BOUNDARY; - } - - /** - * @param {Uint8Array} data - */ - write(data) { - let i = 0; - const length_ = data.length; - let previousIndex = this.index; - let {lookbehind, boundary, boundaryChars, index, state, flags} = this; - const boundaryLength = this.boundary.length; - const boundaryEnd = boundaryLength - 1; - const bufferLength = data.length; - let c; - let cl; - - const mark = name => { - this[name + 'Mark'] = i; - }; - - const clear = name => { - delete this[name + 'Mark']; - }; - - const callback = (callbackSymbol, start, end, ui8a) => { - if (start === undefined || start !== end) { - this[callbackSymbol](ui8a && ui8a.subarray(start, end)); - } - }; - - const dataCallback = (name, clear) => { - const markSymbol = name + 'Mark'; - if (!(markSymbol in this)) { - return; - } - - if (clear) { - callback(name, this[markSymbol], i, data); - delete this[markSymbol]; - } else { - callback(name, this[markSymbol], data.length, data); - this[markSymbol] = 0; - } - }; - - for (i = 0; i < length_; i++) { - c = data[i]; - - switch (state) { - case S.START_BOUNDARY: - if (index === boundary.length - 2) { - if (c === HYPHEN) { - flags |= F.LAST_BOUNDARY; - } else if (c !== CR) { - return; - } - - index++; - break; - } else if (index - 1 === boundary.length - 2) { - if (flags & F.LAST_BOUNDARY && c === HYPHEN) { - state = S.END; - flags = 0; - } else if (!(flags & F.LAST_BOUNDARY) && c === LF) { - index = 0; - callback('onPartBegin'); - state = S.HEADER_FIELD_START; - } else { - return; - } - - break; - } - - if (c !== boundary[index + 2]) { - index = -2; - } - - if (c === boundary[index + 2]) { - index++; - } - - break; - case S.HEADER_FIELD_START: - state = S.HEADER_FIELD; - mark('onHeaderField'); - index = 0; - // falls through - case S.HEADER_FIELD: - if (c === CR) { - clear('onHeaderField'); - state = S.HEADERS_ALMOST_DONE; - break; - } - - index++; - if (c === HYPHEN) { - break; - } - - if (c === COLON) { - if (index === 1) { - // empty header field - return; - } - - dataCallback('onHeaderField', true); - state = S.HEADER_VALUE_START; - break; - } - - cl = lower(c); - if (cl < A || cl > Z) { - return; - } - - break; - case S.HEADER_VALUE_START: - if (c === SPACE) { - break; - } - - mark('onHeaderValue'); - state = S.HEADER_VALUE; - // falls through - case S.HEADER_VALUE: - if (c === CR) { - dataCallback('onHeaderValue', true); - callback('onHeaderEnd'); - state = S.HEADER_VALUE_ALMOST_DONE; - } - - break; - case S.HEADER_VALUE_ALMOST_DONE: - if (c !== LF) { - return; - } - - state = S.HEADER_FIELD_START; - break; - case S.HEADERS_ALMOST_DONE: - if (c !== LF) { - return; - } - - callback('onHeadersEnd'); - state = S.PART_DATA_START; - break; - case S.PART_DATA_START: - state = S.PART_DATA; - mark('onPartData'); - // falls through - case S.PART_DATA: - previousIndex = index; - - if (index === 0) { - // boyer-moore derrived algorithm to safely skip non-boundary data - i += boundaryEnd; - while (i < bufferLength && !(data[i] in boundaryChars)) { - i += boundaryLength; - } - - i -= boundaryEnd; - c = data[i]; - } - - if (index < boundary.length) { - if (boundary[index] === c) { - if (index === 0) { - dataCallback('onPartData', true); - } - - index++; - } else { - index = 0; - } - } else if (index === boundary.length) { - index++; - if (c === CR) { - // CR = part boundary - flags |= F.PART_BOUNDARY; - } else if (c === HYPHEN) { - // HYPHEN = end boundary - flags |= F.LAST_BOUNDARY; - } else { - index = 0; - } - } else if (index - 1 === boundary.length) { - if (flags & F.PART_BOUNDARY) { - index = 0; - if (c === LF) { - // unset the PART_BOUNDARY flag - flags &= ~F.PART_BOUNDARY; - callback('onPartEnd'); - callback('onPartBegin'); - state = S.HEADER_FIELD_START; - break; - } - } else if (flags & F.LAST_BOUNDARY) { - if (c === HYPHEN) { - callback('onPartEnd'); - state = S.END; - flags = 0; - } else { - index = 0; - } - } else { - index = 0; - } - } - - if (index > 0) { - // when matching a possible boundary, keep a lookbehind reference - // in case it turns out to be a false lead - lookbehind[index - 1] = c; - } else if (previousIndex > 0) { - // if our boundary turned out to be rubbish, the captured lookbehind - // belongs to partData - const _lookbehind = new Uint8Array(lookbehind.buffer, lookbehind.byteOffset, lookbehind.byteLength); - callback('onPartData', 0, previousIndex, _lookbehind); - previousIndex = 0; - mark('onPartData'); - - // reconsider the current character even so it interrupted the sequence - // it could be the beginning of a new sequence - i--; - } - - break; - case S.END: - break; - default: - throw new Error(`Unexpected state entered: ${state}`); - } - } - - dataCallback('onHeaderField'); - dataCallback('onHeaderValue'); - dataCallback('onPartData'); - - // Update properties for the next call - this.index = index; - this.state = state; - this.flags = flags; - } - - end() { - if ((this.state === S.HEADER_FIELD_START && this.index === 0) || - (this.state === S.PART_DATA && this.index === this.boundary.length)) { - this.onPartEnd(); - } else if (this.state !== S.END) { - throw new Error('MultipartParser.end(): stream ended unexpectedly'); - } - } -} - -function _fileName(headerValue) { - // matches either a quoted-string or a token (RFC 2616 section 19.5.1) - const m = headerValue.match(/\bfilename=("(.*?)"|([^()<>@,;:\\"/[\]?={}\s\t]+))($|;\s)/i); - if (!m) { - return; - } - - const match = m[2] || m[3] || ''; - let filename = match.slice(match.lastIndexOf('\\') + 1); - filename = filename.replace(/%22/g, '"'); - filename = filename.replace(/&#(\d{4});/g, (m, code) => { - return String.fromCharCode(code); - }); - return filename; -} - -async function toFormData(Body, ct) { - if (!/multipart/i.test(ct)) { - throw new TypeError('Failed to fetch'); - } - - const m = ct.match(/boundary=(?:"([^"]+)"|([^;]+))/i); - - if (!m) { - throw new TypeError('no or bad content-type header, no multipart boundary'); - } - - const parser = new MultipartParser(m[1] || m[2]); - - let headerField; - let headerValue; - let entryValue; - let entryName; - let contentType; - let filename; - const entryChunks = []; - const formData = new formdata_polyfill_esm_min_js__WEBPACK_IMPORTED_MODULE_1__.FormData(); - - const onPartData = ui8a => { - entryValue += decoder.decode(ui8a, {stream: true}); - }; - - const appendToFile = ui8a => { - entryChunks.push(ui8a); - }; - - const appendFileToFormData = () => { - const file = new fetch_blob_from_js__WEBPACK_IMPORTED_MODULE_0__.File(entryChunks, filename, {type: contentType}); - formData.append(entryName, file); - }; - - const appendEntryToFormData = () => { - formData.append(entryName, entryValue); - }; - - const decoder = new TextDecoder('utf-8'); - decoder.decode(); - - parser.onPartBegin = function () { - parser.onPartData = onPartData; - parser.onPartEnd = appendEntryToFormData; - - headerField = ''; - headerValue = ''; - entryValue = ''; - entryName = ''; - contentType = ''; - filename = null; - entryChunks.length = 0; - }; - - parser.onHeaderField = function (ui8a) { - headerField += decoder.decode(ui8a, {stream: true}); - }; - - parser.onHeaderValue = function (ui8a) { - headerValue += decoder.decode(ui8a, {stream: true}); - }; - - parser.onHeaderEnd = function () { - headerValue += decoder.decode(); - headerField = headerField.toLowerCase(); - - if (headerField === 'content-disposition') { - // matches either a quoted-string or a token (RFC 2616 section 19.5.1) - const m = headerValue.match(/\bname=("([^"]*)"|([^()<>@,;:\\"/[\]?={}\s\t]+))/i); - - if (m) { - entryName = m[2] || m[3] || ''; - } - - filename = _fileName(headerValue); - - if (filename) { - parser.onPartData = appendToFile; - parser.onPartEnd = appendFileToFormData; - } - } else if (headerField === 'content-type') { - contentType = headerValue; - } - - headerValue = ''; - headerField = ''; - }; - - for await (const chunk of Body) { - parser.write(chunk); - } - - parser.end(); - - return formData; -} - - -/***/ }) - -}; -; -//# sourceMappingURL=1.extension.js.map \ No newline at end of file diff --git a/dist/1.extension.js.map b/dist/1.extension.js.map deleted file mode 100644 index 33bd3857..00000000 --- a/dist/1.extension.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"1.extension.js","mappings":";;;;;;;;;;;;;;AAAwC;AACc;;AAEtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,YAAY,QAAQ;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,kBAAkB,qBAAqB;AACvC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,YAAY,YAAY;AACxB;AACA;AACA;AACA;AACA;AACA,OAAO,0DAA0D;AACjE;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA,cAAc,aAAa;AAC3B;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,kDAAkD,MAAM;AACxD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA,4DAA4D,YAAY,YAAY;AACpF;AACA;AACA;;AAEA;AACA;AACA;AACA,oCAAoC,EAAE,EAAE;AACxC;AACA,EAAE;AACF;AACA;;AAEO;AACP;AACA;AACA;;AAEA,+CAA+C;;AAE/C;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,kEAAQ;;AAE9B;AACA,sCAAsC,aAAa;AACnD;;AAEA;AACA;AACA;;AAEA;AACA,mBAAmB,oDAAI,yBAAyB,kBAAkB;AAClE;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,uCAAuC,aAAa;AACpD;;AAEA;AACA,uCAAuC,aAAa;AACpD;;AAEA;AACA;AACA;;AAEA;AACA;AACA,4DAA4D,YAAY;;AAExE;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA","sources":["webpack://code-settings-sync/./node_modules/node-fetch/src/utils/multipart-parser.js"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/dist/extension.js b/dist/extension.js deleted file mode 100644 index 28225661..00000000 --- a/dist/extension.js +++ /dev/null @@ -1,91901 +0,0 @@ -/******/ (() => { // webpackBootstrap -/******/ var __webpack_modules__ = ([ -/* 0 */ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - -"use strict"; - -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.activate = activate; -exports.deactivate = deactivate; -// The module 'vscode' contains the VS Code extensibility API -// Import the module and reference it with the alias vscode in your code below -const vscode = __importStar(__webpack_require__(1)); -const environmentPath_1 = __webpack_require__(2); -const state_1 = __webpack_require__(5); -const sync_1 = __webpack_require__(6); -// This method is called when your extension is activated -// Your extension is activated the very first time the command is executed -function activate(context) { - state_1.state.context = context; - state_1.state.environment = new environmentPath_1.Environment(); - const sync = new sync_1.Sync(); - sync.bootstrap(); - context.subscriptions.push(vscode.commands.registerCommand("extension.updateSettings", (optArgument) => { - sync.upload.bind(sync, optArgument)(); - })); - context.subscriptions.push(vscode.commands.registerCommand("extension.downloadSettings", sync.download.bind(sync))); - context.subscriptions.push(vscode.commands.registerCommand("extension.resetSettings", sync.reset.bind(sync))); - context.subscriptions.push(vscode.commands.registerCommand("extension.HowSettings", sync.how.bind(sync))); - context.subscriptions.push(vscode.commands.registerCommand("extension.otherOptions", sync.advance.bind(sync))); -} -// This method is called when your extension is deactivated -function deactivate() { } - - -/***/ }), -/* 1 */ -/***/ ((module) => { - -"use strict"; -module.exports = require("vscode"); - -/***/ }), -/* 2 */ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - -"use strict"; - -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Environment = exports.SUPPORTED_OS = void 0; -exports.osTypeFromString = osTypeFromString; -const path_1 = __webpack_require__(3); -const vscode = __importStar(__webpack_require__(1)); -const enums_1 = __webpack_require__(4); -const state_1 = __webpack_require__(5); -exports.SUPPORTED_OS = Object.keys(enums_1.OsType) - .filter(k => !/\d/.test(k)) - .map(k => k.toLowerCase()); // . ["windows", "linux", "mac"]; -function osTypeFromString(osName) { - const capitalized = osName[0].toUpperCase() + osName.substr(1).toLowerCase(); - return enums_1.OsType[capitalized]; -} -class Environment { - static CURRENT_VERSION = 343; - static getVersion() { - return (Environment.CURRENT_VERSION.toString().slice(0, 1) + - "." + - Environment.CURRENT_VERSION.toString().slice(1, 2) + - "." + - Environment.CURRENT_VERSION.toString().slice(2, 3)); - } - // public isInsiders: boolean = false; - // public isOss: boolean = false; - // public isCoderCom: boolean = false; - // public homeDir: string | null = null; - isPortable = false; - USER_FOLDER = null; - CODE_BIN; - EXTENSION_FOLDER = null; - PATH = null; - OsType = null; - FILE_SETTING = null; - FILE_LAUNCH = null; - FILE_KEYBINDING = null; - FILE_LOCALE = null; - FILE_EXTENSION = null; - FILE_CLOUDSETTINGS = null; - FILE_SYNC_LOCK = null; - FILE_CUSTOMIZEDSETTINGS_NAME = "syncLocalSettings.json"; - FILE_CUSTOMIZEDSETTINGS = null; - FILE_SETTING_NAME = "settings.json"; - FILE_LAUNCH_NAME = "launch.json"; - FILE_KEYBINDING_NAME = "keybindings.json"; - FILE_KEYBINDING_MAC = "keybindingsMac.json"; - FILE_KEYBINDING_DEFAULT = "keybindings.json"; - FILE_EXTENSION_NAME = "extensions.json"; - FILE_LOCALE_NAME = "locale.json"; - FILE_SYNC_LOCK_NAME = "sync.lock"; - FILE_CLOUDSETTINGS_NAME = "cloudSettings"; - FOLDER_SNIPPETS = null; - constructor() { - state_1.state.context.globalState.update("_", undefined); // Make sure the global state folder exists. This is needed for using this.context.globalStoragePath to access user folder - this.isPortable = !!process.env.VSCODE_PORTABLE; - this.OsType = process.platform; - if (!this.isPortable) { - this.PATH = (0, path_1.resolve)(state_1.state.context.globalStoragePath, "../../..").concat((0, path_1.normalize)("/")); - this.USER_FOLDER = (0, path_1.resolve)(this.PATH, "User").concat((0, path_1.normalize)("/")); - this.EXTENSION_FOLDER = (0, path_1.resolve)(vscode.extensions.all.filter(extension => !extension.packageJSON.isBuiltin)[0].extensionPath, "..").concat((0, path_1.normalize)("/")); // Gets first non-builtin extension's path - } - else { - this.PATH = process.env.VSCODE_PORTABLE; - this.USER_FOLDER = (0, path_1.resolve)(this.PATH, "user-data/User").concat((0, path_1.normalize)("/")); - this.EXTENSION_FOLDER = (0, path_1.resolve)(this.PATH, "extensions").concat((0, path_1.normalize)("/")); - } - /* Start Legacy Code - - this.isInsiders = /insiders/.test(this.context.asAbsolutePath("")); - this.isOss = /\boss\b/.test(this.context.asAbsolutePath("")); - this.isCoderCom = - vscode.extensions.getExtension("coder.coder") !== undefined; - const isXdg = - !this.isInsiders && - !this.isCoderCom && - process.platform === "linux" && - !!process.env.XDG_DATA_HOME; - this.homeDir = isXdg - ? process.env.XDG_DATA_HOME - : process.env[process.platform === "win32" ? "USERPROFILE" : "HOME"]; - const configSuffix = `; $; {isXdg || this.isCoderCom ? "" : "."; }vscode$; { - this.isInsiders ? "-insiders" : this.isOss ? "-oss" : ""; - }`; - - if (!this.isPortable) { - if (process.platform === "darwin") { - this.PATH = process.env.HOME + "/Library/Application Support"; - this.OsType = OsType.Mac; - } else if (process.platform === "linux") { - if (!this.isCoderCom) { - this.PATH = - isXdg && !!process.env.XDG_CONFIG_HOME - ? process.env.XDG_CONFIG_HOME - : os.homedir() + "/.config"; - } else { - this.PATH = "/tmp"; - } - this.OsType = OsType.Linux; - } else if (process.platform === "win32") { - this.PATH = process.env.APPDATA; - this.OsType = OsType.Windows; - } else { - this.PATH = "/var/local"; - this.OsType = OsType.Linux; - } - } - - if (this.isPortable) { - this.PATH = process.env.VSCODE_PORTABLE; - if (process.platform === "darwin") { - this.OsType = OsType.Mac; - } else if (process.platform === "linux") { - this.OsType = OsType.Linux; - } else if (process.platform === "win32") { - this.OsType = OsType.Windows; - } else { - this.OsType = OsType.Linux; - } - } - - if (!this.isPortable) { - const possibleCodePaths = []; - if (this.isInsiders) { - possibleCodePaths.push("/Code - Insiders"); - } else if (this.isOss) { - possibleCodePaths.push("/Code - OSS"); - possibleCodePaths.push("/VSCodium"); - } else { - possibleCodePaths.push("/Code"); - } - for (const possibleCodePath of possibleCodePaths) { - try { - fs.statSync(this.PATH + possibleCodePath); - this.PATH = this.PATH + possibleCodePath; - break; - } catch (e) { - console.error("Error :" + possibleCodePath); - console.error(e); - } - } - this.ExtensionFolder = path.join( - this.homeDir, - configSuffix, - "extensions" - ); - this.USER_FOLDER = this.PATH.concat("/User/"); - } else { - this.USER_FOLDER = this.PATH.concat("/user-data/User/"); - this.ExtensionFolder = this.PATH.concat("/extensions/"); - } - - End Legacy Code */ - this.FILE_EXTENSION = this.USER_FOLDER.concat(this.FILE_EXTENSION_NAME); - this.FILE_SETTING = this.USER_FOLDER.concat(this.FILE_SETTING_NAME); - this.FILE_LAUNCH = this.USER_FOLDER.concat(this.FILE_LAUNCH_NAME); - this.FILE_KEYBINDING = this.USER_FOLDER.concat(this.FILE_KEYBINDING_NAME); - this.FILE_LOCALE = this.USER_FOLDER.concat(this.FILE_LOCALE_NAME); - this.FOLDER_SNIPPETS = this.USER_FOLDER.concat("/snippets/"); - this.FILE_CLOUDSETTINGS = this.USER_FOLDER.concat(this.FILE_CLOUDSETTINGS_NAME); - this.FILE_CUSTOMIZEDSETTINGS = this.USER_FOLDER.concat(this.FILE_CUSTOMIZEDSETTINGS_NAME); - this.FILE_SYNC_LOCK = this.USER_FOLDER.concat(this.FILE_SYNC_LOCK_NAME); - } -} -exports.Environment = Environment; - - -/***/ }), -/* 3 */ -/***/ ((module) => { - -"use strict"; -module.exports = require("path"); - -/***/ }), -/* 4 */ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.SettingType = exports.OsType = void 0; -var OsType; -(function (OsType) { - OsType["Windows"] = "win32"; - OsType["Linux"] = "linux"; - OsType["Mac"] = "darwin"; -})(OsType || (exports.OsType = OsType = {})); -var SettingType; -(function (SettingType) { - SettingType[SettingType["Settings"] = 1] = "Settings"; - SettingType[SettingType["Launch"] = 2] = "Launch"; - SettingType[SettingType["KeyBindings"] = 3] = "KeyBindings"; - SettingType[SettingType["Locale"] = 4] = "Locale"; - SettingType[SettingType["Extensions"] = 5] = "Extensions"; -})(SettingType || (exports.SettingType = SettingType = {})); - - -/***/ }), -/* 5 */ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.state = void 0; -exports.state = { - instanceID: Math.random().toString() -}; - - -/***/ }), -/* 6 */ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - -"use strict"; - -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Sync = void 0; -const fs = __importStar(__webpack_require__(7)); -const vscode = __importStar(__webpack_require__(1)); -const commons_1 = __importDefault(__webpack_require__(46)); -const enums_1 = __webpack_require__(4); -const localize_1 = __importDefault(__webpack_require__(47)); -const lockfile = __importStar(__webpack_require__(250)); -const cloudSettings_model_1 = __webpack_require__(449); -const customConfig_model_1 = __webpack_require__(48); -const extensionConfig_model_1 = __webpack_require__(49); -const localConfig_model_1 = __webpack_require__(50); -const pragmaUtil_1 = __importDefault(__webpack_require__(450)); -const file_service_1 = __webpack_require__(255); -const github_service_1 = __webpack_require__(451); -const plugin_service_1 = __webpack_require__(486); -const state_1 = __webpack_require__(5); -class Sync { - /** - * Run when extension have been activated - */ - async bootstrap() { - state_1.state.commons = new commons_1.default(); - await state_1.state.commons.StartMigrationProcess(); - const startUpSetting = await state_1.state.commons.GetSettings(); - const startUpCustomSetting = await state_1.state.commons.GetCustomSettings(); - if (startUpSetting) { - const tokenAvailable = startUpCustomSetting.token != null && startUpCustomSetting.token !== ""; - const gistAvailable = startUpSetting.gist != null && startUpSetting.gist !== ""; - if (!startUpCustomSetting.downloadPublicGist && !tokenAvailable) { - if (state_1.state.commons.webviewService.IsLandingPageEnabled()) { - state_1.state.commons.webviewService.OpenLandingPage(); - return; - } - } - if (gistAvailable) { - if (startUpSetting.autoDownload) { - vscode.commands - .executeCommand("extension.downloadSettings") - .then(async () => { - if (startUpSetting.autoUpload && - tokenAvailable && - gistAvailable) { - await state_1.state.commons.HandleStartWatching(); - return; - } - }); - } - else { - if (startUpSetting.autoUpload && tokenAvailable && gistAvailable) { - await state_1.state.commons.HandleStartWatching(); - return; - } - } - } - } - } - /** - * Upload setting to github gist - */ - async upload(optArgument) { - // @ts-ignore - // const args = arguments; - let github = null; - const localConfig = await state_1.state.commons.InitalizeSettings(); - if (!localConfig.customConfig.token) { - state_1.state.commons.webviewService.OpenLandingPage("extension.updateSettings"); - return; - } - const allSettingFiles = []; - let uploadedExtensions = []; - const ignoredExtensions = []; - const dateNow = new Date(); - await state_1.state.commons.HandleStopWatching(); - try { - localConfig.publicGist = false; - if (optArgument && optArgument === "publicGIST") { - localConfig.publicGist = true; - } - github = new github_service_1.GitHubService(localConfig.customConfig.token, localConfig.customConfig.githubEnterpriseUrl); - await startGitProcess.call(this, localConfig.extConfig, localConfig.customConfig); - } - catch (error) { - commons_1.default.LogException(error, state_1.state.commons.ERROR_MESSAGE, true); - return; - } - async function startGitProcess(syncSetting, customSettings) { - vscode.window.setStatusBarMessage((0, localize_1.default)("cmd.updateSettings.info.uploading"), 2000); - if (customSettings.downloadPublicGist) { - if (customSettings.token == null || customSettings.token === "") { - vscode.window.showInformationMessage((0, localize_1.default)("cmd.updateSettings.warning.noToken")); - return; - } - } - vscode.window.setStatusBarMessage((0, localize_1.default)("cmd.updateSettings.info.readding"), 2000); - // var remoteList = ExtensionInformation.fromJSONList(file.content); - // var deletedList = PluginService.GetDeletedExtensions(uploadedExtensions); - if (syncSetting.syncExtensions) { - uploadedExtensions = plugin_service_1.PluginService.CreateExtensionList(); - if (customSettings.ignoreExtensions && - customSettings.ignoreExtensions.length > 0) { - uploadedExtensions = uploadedExtensions.filter(extension => { - if (customSettings.ignoreExtensions.includes(extension.name)) { - ignoredExtensions.push(extension); - return false; - } - return true; - }); - } - uploadedExtensions.sort((a, b) => a.name.localeCompare(b.name)); - const extensionFileName = state_1.state.environment.FILE_EXTENSION_NAME; - const extensionFilePath = state_1.state.environment.FILE_EXTENSION; - const extensionFileContent = JSON.stringify(uploadedExtensions, undefined, 2); - const extensionFile = new file_service_1.File(extensionFileName, extensionFileContent, extensionFilePath, extensionFileName); - allSettingFiles.push(extensionFile); - } - const contentFiles = await file_service_1.FileService.ListFiles(state_1.state.environment.USER_FOLDER, customSettings); - const customExist = await file_service_1.FileService.FileExists(state_1.state.environment.FILE_CUSTOMIZEDSETTINGS); - if (customExist) { - const customFileKeys = Object.keys(customSettings.customFiles); - if (customFileKeys.length > 0) { - for (const key of customFileKeys) { - const val = customSettings.customFiles[key]; - const customFile = await file_service_1.FileService.GetCustomFile(val, key); - if (customFile !== null) { - allSettingFiles.push(customFile); - } - } - } - } - else { - commons_1.default.LogException(null, state_1.state.commons.ERROR_MESSAGE, true); - return; - } - for (const snippetFile of contentFiles) { - if (snippetFile.fileName !== state_1.state.environment.FILE_KEYBINDING_MAC) { - if (snippetFile.content !== "") { - if (snippetFile.fileName === state_1.state.environment.FILE_KEYBINDING_NAME) { - snippetFile.gistName = - state_1.state.environment.OsType === enums_1.OsType.Mac && - !customSettings.universalKeybindings - ? state_1.state.environment.FILE_KEYBINDING_MAC - : state_1.state.environment.FILE_KEYBINDING_DEFAULT; - } - if (snippetFile.fileName === state_1.state.environment.FILE_SETTING_NAME || - snippetFile.fileName === state_1.state.environment.FILE_KEYBINDING_MAC || - snippetFile.fileName === state_1.state.environment.FILE_KEYBINDING_DEFAULT) { - try { - const parsedContent = await pragmaUtil_1.default.processBeforeUpload(snippetFile.content); - snippetFile.content = parsedContent; - } - catch (e) { - commons_1.default.LogException(null, e.message, true); - console.error(e); - return; - } - } - allSettingFiles.push(snippetFile); - } - } - } - const extProp = new cloudSettings_model_1.CloudSettings(); - extProp.lastUpload = dateNow; - const fileName = state_1.state.environment.FILE_CLOUDSETTINGS_NAME; - const fileContent = JSON.stringify(extProp); - const file = new file_service_1.File(fileName, fileContent, "", fileName); - allSettingFiles.push(file); - let completed = false; - let newGIST = false; - try { - if (syncSetting.gist == null || syncSetting.gist === "") { - if (customSettings.askGistDescription) { - customSettings.gistDescription = await state_1.state.commons.AskGistDescription(); - } - newGIST = true; - const gistID = await github.CreateEmptyGIST(localConfig.publicGist, customSettings.gistDescription); - if (gistID) { - syncSetting.gist = gistID; - vscode.window.setStatusBarMessage((0, localize_1.default)("cmd.updateSettings.info.newGistCreated"), 2000); - } - else { - vscode.window.showInformationMessage((0, localize_1.default)("cmd.updateSettings.error.newGistCreateFail")); - return; - } - } - let gistObj = await github.ReadGist(syncSetting.gist); - if (!gistObj) { - return; - } - if (gistObj.data.owner !== null) { - const gistOwnerName = gistObj.data.owner.login.trim(); - if (github.userName != null) { - const userName = github.userName.trim(); - if (gistOwnerName !== userName) { - commons_1.default.LogException(null, "Sync : You cant edit GIST for user : " + - gistObj.data.owner.login, true, () => { - console.log("Sync : Current User : " + "'" + userName + "'"); - console.log("Sync : Gist Owner User : " + "'" + gistOwnerName + "'"); - }); - return; - } - } - } - if (gistObj.data.public === true) { - localConfig.publicGist = true; - } - if (!allSettingFiles.some(fileToUpload => { - if (fileToUpload.gistName === "cloudSettings") { - return false; - } - if (!gistObj.data.files[fileToUpload.gistName]) { - return true; - } - if (gistObj.data.files[fileToUpload.gistName].content !== - fileToUpload.content) { - console.info(`Sync: file ${fileToUpload.gistName} has changed`); - return true; - } - })) { - // Gist files are the same as the local files. - if (!localConfig.extConfig.forceUpload) { - vscode.window.setStatusBarMessage((0, localize_1.default)("cmd.updateSettings.info.gotLatestVersion"), 5000); - // Exit early to avoid unneeded upload. - return; - } - // Fall through to upload code for forced upload case. - } - else { - // Gist files are different from the local files. - const gistNewer = await github.IsGistNewer(syncSetting.gist, customSettings.lastDownload); - if (!customSettings.lastDownload) { - // Unable to compare the last gist upload time with the - // last download time, so ask user to force upload. - const message = await vscode.window.showInformationMessage((0, localize_1.default)("common.prompt.gistForceUpload"), (0, localize_1.default)("common.button.yes"), (0, localize_1.default)("common.button.no")); - if (message !== (0, localize_1.default)("common.button.yes")) { - vscode.window.setStatusBarMessage((0, localize_1.default)("cmd.updateSettings.info.uploadCanceled"), 3000); - return; - } - // Fall through to upload code for one-time forced upload. - } - else if (gistNewer && !localConfig.extConfig.forceUpload) { - // Last local download is prior to the last gist upload, so - // the local settings may be out of date. - const message = await vscode.window.showInformationMessage((0, localize_1.default)("common.prompt.gistNewer"), (0, localize_1.default)("common.button.yes"), (0, localize_1.default)("common.button.no")); - if (message !== (0, localize_1.default)("common.button.yes")) { - vscode.window.setStatusBarMessage((0, localize_1.default)("cmd.updateSettings.info.uploadCanceled"), 3000); - return; - } - // Fall through to upload code for one-time forced upload. - } - // !gistNewer: Last local download is later or the same as last Gist upload, - // so OK to upload - fall through to upload code below. - } - vscode.window.setStatusBarMessage((0, localize_1.default)("cmd.updateSettings.info.uploadingFile"), 3000); - gistObj = github.UpdateGIST(gistObj, allSettingFiles); - completed = await github.SaveGIST(gistObj.data); - if (!completed) { - vscode.window.showErrorMessage((0, localize_1.default)("cmd.updateSettings.error.gistNotSave")); - return; - } - } - catch (err) { - commons_1.default.LogException(err, state_1.state.commons.ERROR_MESSAGE, true); - return; - } - if (completed) { - try { - customSettings.lastUpload = dateNow; - customSettings.lastDownload = dateNow; - await state_1.state.commons.SaveSettings(syncSetting); - await state_1.state.commons.SetCustomSettings(customSettings); - if (newGIST) { - vscode.window.showInformationMessage((0, localize_1.default)("cmd.updateSettings.info.uploadingDone", syncSetting.gist)); - } - if (optArgument && optArgument === "publicGIST") { - vscode.window.showInformationMessage((0, localize_1.default)("cmd.updateSettings.info.shareGist")); - } - if (!syncSetting.quietSync) { - state_1.state.commons.ShowSummaryOutput(true, allSettingFiles, null, uploadedExtensions, ignoredExtensions, localConfig); - vscode.window.setStatusBarMessage("").dispose(); - } - else { - vscode.window.setStatusBarMessage("").dispose(); - vscode.window.setStatusBarMessage((0, localize_1.default)("cmd.updateSettings.info.uploadingSuccess"), 5000); - } - if (syncSetting.autoUpload) { - await state_1.state.commons.HandleStartWatching(); - } - } - catch (err) { - commons_1.default.LogException(err, state_1.state.commons.ERROR_MESSAGE, true); - } - } - } - } - /** - * Download setting from github gist - */ - async download() { - const localSettings = await state_1.state.commons.InitalizeSettings(); - if (localSettings.customConfig.downloadPublicGist - ? !localSettings.extConfig.gist - : !localSettings.customConfig.token || !localSettings.extConfig.gist) { - state_1.state.commons.webviewService.OpenLandingPage("extension.downloadSettings"); - return; - } - await state_1.state.commons.HandleStopWatching(); - try { - await StartDownload(localSettings.extConfig, localSettings.customConfig); - } - catch (err) { - commons_1.default.LogException(err, state_1.state.commons.ERROR_MESSAGE, true); - return; - } - async function StartDownload(syncSetting, customSettings) { - const github = new github_service_1.GitHubService(customSettings.token, customSettings.githubEnterpriseUrl); - vscode.window.setStatusBarMessage("").dispose(); - vscode.window.setStatusBarMessage((0, localize_1.default)("cmd.downloadSettings.info.readdingOnline"), 2000); - const res = await github.ReadGist(syncSetting.gist); - if (!res) { - return; - } - let addedExtensions = []; - let deletedExtensions = []; - const ignoredExtensions = customSettings.ignoreExtensions || new Array(); - const updatedFiles = []; - const actionList = []; - if (res.data.public === true) { - localSettings.publicGist = true; - } - const keys = Object.keys(res.data.files); - if (keys.indexOf(state_1.state.environment.FILE_CLOUDSETTINGS_NAME) > -1) { - const cloudSettGist = JSON.parse(res.data.files[state_1.state.environment.FILE_CLOUDSETTINGS_NAME].content); - const cloudSett = Object.assign(new cloudSettings_model_1.CloudSettings(), cloudSettGist); - const lastUploadStr = customSettings.lastUpload - ? customSettings.lastUpload.toString() - : ""; - const lastDownloadStr = customSettings.lastDownload - ? customSettings.lastDownload.toString() - : ""; - let upToDate = false; - if (lastDownloadStr !== "") { - upToDate = - new Date(lastDownloadStr).getTime() === - new Date(cloudSett.lastUpload).getTime(); - } - if (lastUploadStr !== "") { - upToDate = - upToDate || - new Date(lastUploadStr).getTime() === - new Date(cloudSett.lastUpload).getTime(); - } - if (!syncSetting.forceDownload) { - if (upToDate) { - vscode.window.setStatusBarMessage("").dispose(); - vscode.window.setStatusBarMessage((0, localize_1.default)("cmd.downloadSettings.info.gotLatestVersion"), 5000); - return; - } - } - customSettings.lastDownload = cloudSett.lastUpload; - } - keys.forEach(gistName => { - if (res.data.files[gistName]) { - if (res.data.files[gistName].content) { - const prefix = file_service_1.FileService.CUSTOMIZED_SYNC_PREFIX; - if (gistName.indexOf(prefix) > -1) { - const fileName = gistName.split(prefix).join(""); // |customized_sync|.htmlhintrc => .htmlhintrc - if (!(fileName in customSettings.customFiles)) { - // syncLocalSettings.json > customFiles doesn't have key - return; - } - const f = new file_service_1.File(fileName, res.data.files[gistName].content, customSettings.customFiles[fileName], gistName); - updatedFiles.push(f); - } - else if (gistName.indexOf(".") > -1) { - if (customSettings.universalKeybindings) { - if (gistName === state_1.state.environment.FILE_KEYBINDING_MAC) { - return; - } - } - else { - if (state_1.state.environment.OsType === enums_1.OsType.Mac && - gistName === state_1.state.environment.FILE_KEYBINDING_DEFAULT) { - return; - } - if (state_1.state.environment.OsType !== enums_1.OsType.Mac && - gistName === state_1.state.environment.FILE_KEYBINDING_MAC) { - return; - } - } - const f = new file_service_1.File(gistName, res.data.files[gistName].content, null, gistName); - updatedFiles.push(f); - } - } - } - else { - console.log(gistName + " key in response is empty."); - } - }); - for (const file of updatedFiles) { - let writeFile = false; - let content = file.content; - if (content !== "") { - if (file.gistName === state_1.state.environment.FILE_EXTENSION_NAME) { - if (syncSetting.syncExtensions) { - if (syncSetting.removeExtensions) { - try { - deletedExtensions = await plugin_service_1.PluginService.DeleteExtensions(content, ignoredExtensions); - } - catch (err) { - vscode.window.showErrorMessage((0, localize_1.default)("cmd.downloadSettings.error.removeExtFail")); - throw new Error(err); - } - } - try { - if (!syncSetting.quietSync) { - commons_1.default.outputChannel = vscode.window.createOutputChannel("Code Settings Sync"); - commons_1.default.outputChannel.clear(); - commons_1.default.outputChannel.appendLine(`Realtime Extension Download Summary`); - commons_1.default.outputChannel.appendLine(`--------------------`); - commons_1.default.outputChannel.show(); - } - addedExtensions = await plugin_service_1.PluginService.InstallExtensions(content, ignoredExtensions, (message, dispose) => { - if (!syncSetting.quietSync) { - commons_1.default.outputChannel.appendLine(message); - } - else { - console.log(message); - if (dispose) { - vscode.window.setStatusBarMessage("Sync : " + message, 3000); - } - } - }); - } - catch (err) { - throw new Error(err); - } - } - } - else { - writeFile = true; - if (file.gistName === state_1.state.environment.FILE_KEYBINDING_DEFAULT || - file.gistName === state_1.state.environment.FILE_KEYBINDING_MAC) { - let test = ""; - state_1.state.environment.OsType === enums_1.OsType.Mac && - !customSettings.universalKeybindings - ? (test = state_1.state.environment.FILE_KEYBINDING_MAC) - : (test = state_1.state.environment.FILE_KEYBINDING_DEFAULT); - if (file.gistName !== test) { - writeFile = false; - } - } - if (writeFile) { - if (file.gistName === state_1.state.environment.FILE_KEYBINDING_MAC) { - file.fileName = state_1.state.environment.FILE_KEYBINDING_DEFAULT; - } - let filePath = ""; - if (file.filePath !== null) { - filePath = await file_service_1.FileService.CreateCustomDirTree(file.filePath); - } - else { - filePath = await file_service_1.FileService.CreateDirTree(state_1.state.environment.USER_FOLDER, file.fileName); - } - if (file.gistName === state_1.state.environment.FILE_SETTING_NAME || - file.gistName === state_1.state.environment.FILE_KEYBINDING_MAC || - file.gistName === state_1.state.environment.FILE_KEYBINDING_DEFAULT) { - const fileExists = await file_service_1.FileService.FileExists(filePath); - if (fileExists) { - const localContent = await file_service_1.FileService.ReadFile(filePath); - content = pragmaUtil_1.default.processBeforeWrite(localContent, content, state_1.state.environment.OsType, localSettings.customConfig.hostName); - } - } - actionList.push(file_service_1.FileService.WriteFile(filePath, content) - .then(() => { - // TODO : add Name attribute in File and show information message here with name , when required. - }) - .catch(err => { - commons_1.default.LogException(err, state_1.state.commons.ERROR_MESSAGE, true); - return; - })); - } - } - } - } - await Promise.all(actionList); - const settingsUpdated = await state_1.state.commons.SaveSettings(syncSetting); - const customSettingsUpdated = await state_1.state.commons.SetCustomSettings(customSettings); - if (settingsUpdated && customSettingsUpdated) { - if (!syncSetting.quietSync) { - state_1.state.commons.ShowSummaryOutput(false, updatedFiles, deletedExtensions, addedExtensions, null, localSettings); - if (deletedExtensions.length > 0 || addedExtensions.length > 0) { - const message = await vscode.window.showInformationMessage((0, localize_1.default)("common.prompt.restartCode"), "Yes"); - if (message === "Yes") { - vscode.commands.executeCommand("workbench.action.reloadWindow"); - } - } - vscode.window.setStatusBarMessage("").dispose(); - } - else { - vscode.window.setStatusBarMessage("").dispose(); - vscode.window.setStatusBarMessage((0, localize_1.default)("cmd.downloadSettings.info.downloaded"), 5000); - } - if (syncSetting.autoUpload) { - await state_1.state.commons.HandleStartWatching(); - } - } - else { - vscode.window.showErrorMessage((0, localize_1.default)("cmd.downloadSettings.error.unableSave")); - } - } - } - /** - * Reset the setting to Sync - */ - async reset() { - let extSettings = null; - let localSettings = null; - vscode.window.setStatusBarMessage((0, localize_1.default)("cmd.resetSettings.info.resetting"), 2000); - try { - extSettings = new extensionConfig_model_1.ExtensionConfig(); - localSettings = new customConfig_model_1.CustomConfig(); - await Promise.all([ - state_1.state.context.globalState.update("landingPage.dontShowThisAgain", false) - ]); - const [extSaved, customSaved, lockExist] = await Promise.all([ - state_1.state.commons.SaveSettings(extSettings), - state_1.state.commons.SetCustomSettings(localSettings), - file_service_1.FileService.FileExists(state_1.state.environment.FILE_SYNC_LOCK) - ]); - if (!lockExist) { - fs.closeSync(fs.openSync(state_1.state.environment.FILE_SYNC_LOCK, "w")); - } - // check is sync locking - if (await lockfile.Check(state_1.state.environment.FILE_SYNC_LOCK)) { - await lockfile.Unlock(state_1.state.environment.FILE_SYNC_LOCK); - } - if (extSaved && customSaved) { - vscode.window.showInformationMessage((0, localize_1.default)("cmd.resetSettings.info.settingClear")); - } - state_1.state.commons.webviewService.UpdateSettingsPage(localSettings, extSettings); - } - catch (err) { - commons_1.default.LogException(err, "Sync : Unable to clear settings. Error Logged on console. Please open an issue.", true); - } - } - async how() { - return vscode.commands.executeCommand("vscode.open", vscode.Uri.parse("http://shanalikhan.github.io/2015/12/15/Visual-Studio-Code-Sync-Settings.html")); - } - async advance() { - const setting = await state_1.state.commons.GetSettings(); - const customSettings = await state_1.state.commons.GetCustomSettings(); - if (customSettings == null) { - vscode.window - .showInformationMessage((0, localize_1.default)("cmd.otherOptions.triggerReset"), (0, localize_1.default)("common.button.yes")) - .then(val => { - if (val === (0, localize_1.default)("common.button.yes")) { - vscode.commands.executeCommand("extension.resetSettings"); - } - }); - } - const localSetting = new localConfig_model_1.LocalConfig(); - const tokenAvailable = customSettings.token != null && customSettings.token !== ""; - const gistAvailable = setting.gist != null && setting.gist !== ""; - const items = [ - "cmd.otherOptions.openSettingsPage", - "cmd.otherOptions.editLocalSetting", - "cmd.otherOptions.shareSetting", - "cmd.otherOptions.downloadSetting", - "cmd.otherOptions.toggleForceDownload", - "cmd.otherOptions.toggleForceUpload", - "cmd.otherOptions.toggleAutoUpload", - "cmd.otherOptions.toggleAutoDownload", - "cmd.otherOptions.toggleSummaryPage", - "cmd.otherOptions.customizedSync", - "cmd.otherOptions.downloadCustomFile", - "cmd.otherOptions.joinCommunity", - "cmd.otherOptions.openIssue", - "cmd.otherOptions.releaseNotes" - ].map(localize_1.default); - let selectedItem = 0; - let settingChanged = false; - const item = await vscode.window.showQuickPick(items); - // if not pick anyone, do nothing - if (!item) { - return; - } - const index = items.findIndex(v => v === item); - const handlerMap = [ - async () => { - state_1.state.commons.webviewService.OpenSettingsPage(customSettings, setting); - }, - async () => { - const file = vscode.Uri.file(state_1.state.environment.FILE_CUSTOMIZEDSETTINGS); - fs.openSync(file.fsPath, "r"); - const document = await vscode.workspace.openTextDocument(file); - await vscode.window.showTextDocument(document, vscode.ViewColumn.One, true); - }, - async () => { - // share public gist - const answer = await vscode.window.showInformationMessage((0, localize_1.default)("cmd.otherOptions.shareSetting.beforeConfirm"), "Yes"); - if (answer === "Yes") { - localSetting.publicGist = true; - settingChanged = true; - setting.gist = ""; - selectedItem = 1; - customSettings.downloadPublicGist = false; - await state_1.state.commons.SetCustomSettings(customSettings); - } - }, - async () => { - // Download Settings from Public GIST - selectedItem = 2; - customSettings.downloadPublicGist = true; - settingChanged = true; - await state_1.state.commons.SetCustomSettings(customSettings); - }, - async () => { - // toggle force download - selectedItem = 3; - settingChanged = true; - setting.forceDownload = !setting.forceDownload; - }, - async () => { - // toggle force upload - selectedItem = 4; - settingChanged = true; - setting.forceUpload = !setting.forceUpload; - }, - async () => { - // toggle auto upload - selectedItem = 5; - settingChanged = true; - setting.autoUpload = !setting.autoUpload; - }, - async () => { - // auto download on startup - selectedItem = 6; - settingChanged = true; - if (!setting) { - vscode.commands.executeCommand("extension.HowSettings"); - return; - } - if (!gistAvailable) { - vscode.commands.executeCommand("extension.HowSettings"); - return; - } - setting.autoDownload = !setting.autoDownload; - }, - async () => { - // page summary toggle - selectedItem = 7; - settingChanged = true; - if (!tokenAvailable || !gistAvailable) { - vscode.commands.executeCommand("extension.HowSettings"); - return; - } - setting.quietSync = !setting.quietSync; - }, - async () => { - // add customized sync file - const options = { - ignoreFocusOut: true, - placeHolder: (0, localize_1.default)("cmd.otherOptions.customizedSync.placeholder"), - prompt: (0, localize_1.default)("cmd.otherOptions.customizedSync.prompt") - }; - const input = await vscode.window.showInputBox(options); - if (input) { - const fileName = file_service_1.FileService.ExtractFileName(input); - if (fileName === "") { - return; - } - customSettings.customFiles[fileName] = input; - const done = await state_1.state.commons.SetCustomSettings(customSettings); - if (done) { - vscode.window.showInformationMessage((0, localize_1.default)("cmd.otherOptions.customizedSync.done", fileName)); - } - } - }, - async () => { - // Import customized sync file to workspace - const customFiles = await this.getCustomFilesFromGist(customSettings, setting); - if (customFiles.length < 1) { - return; - } - const options = { - ignoreFocusOut: true, - placeHolder: (0, localize_1.default)("cmd.otherOptions.downloadCustomFile.placeholder") - }; - const fileName = await vscode.window.showQuickPick(customFiles.map(file => { - return file.fileName; - }), options); - // if not pick anyone, do nothing - if (!fileName) { - return; - } - const selected = customFiles.find(f => { - return f.fileName === fileName; - }); - if (selected && vscode.workspace.rootPath) { - const downloadPath = file_service_1.FileService.ConcatPath(vscode.workspace.rootPath, selected.fileName); - const done = await file_service_1.FileService.WriteFile(downloadPath, selected.content); - if (done) { - vscode.window.showInformationMessage((0, localize_1.default)("cmd.otherOptions.downloadCustomFile.done", downloadPath)); - } - } - }, - async () => { - vscode.commands.executeCommand("vscode.open", vscode.Uri.parse("https://join.slack.com/t/codesettingssync/shared_invite/enQtNzQyODMzMzI5MDQ3LWNmZjVkZjE2YTg0MzY1Y2EyYzVmYThmNzg2YjZkNjhhZWY3ZTEzN2I3ZTAxMjkwNWU0ZjMyZGFhMjdiZDI3ODU")); - }, - async () => { - vscode.commands.executeCommand("vscode.open", vscode.Uri.parse("https://github.com/shanalikhan/code-settings-sync/issues/new")); - }, - async () => { - vscode.commands.executeCommand("vscode.open", vscode.Uri.parse("http://shanalikhan.github.io/2016/05/14/Visual-studio-code-sync-settings-release-notes.html")); - } - ]; - try { - await handlerMap[index](); - if (settingChanged) { - if (selectedItem === 1) { - await state_1.state.commons.HandleStopWatching(); - } - await state_1.state.commons - .SaveSettings(setting) - .then((added) => { - if (added) { - const callbackMap = { - 1: async () => { - return await vscode.commands.executeCommand("extension.updateSettings", "publicGIST"); - }, - 2: async () => { - return await vscode.window.showInformationMessage((0, localize_1.default)("cmd.otherOptions.warning.tokenNotRequire")); - }, - 3: async () => { - const message = setting.forceDownload - ? "cmd.otherOptions.toggleForceDownload.on" - : "cmd.otherOptions.toggleForceDownload.off"; - return vscode.window.showInformationMessage((0, localize_1.default)(message)); - }, - 4: async () => { - const message = setting.forceUpload - ? "cmd.otherOptions.toggleForceUpload.on" - : "cmd.otherOptions.toggleForceUpload.off"; - return vscode.window.showInformationMessage((0, localize_1.default)(message)); - }, - 5: async () => { - const message = setting.autoUpload - ? "cmd.otherOptions.toggleAutoUpload.on" - : "cmd.otherOptions.toggleAutoUpload.off"; - return vscode.window.showInformationMessage((0, localize_1.default)(message)); - }, - 6: async () => { - const message = setting.autoDownload - ? "cmd.otherOptions.toggleAutoDownload.on" - : "cmd.otherOptions.toggleAutoDownload.off"; - return vscode.window.showInformationMessage((0, localize_1.default)(message)); - }, - 7: async () => { - const message = setting.quietSync - ? "cmd.otherOptions.quietSync.on" - : "cmd.otherOptions.quietSync.off"; - return vscode.window.showInformationMessage((0, localize_1.default)(message)); - } - }; - if (callbackMap[selectedItem]) { - return callbackMap[selectedItem](); - } - } - else { - return vscode.window.showErrorMessage((0, localize_1.default)("cmd.otherOptions.error.toggleFail")); - } - }) - .catch(err => { - commons_1.default.LogException(err, "Sync : Unable to toggle. Please open an issue.", true); - }); - } - } - catch (err) { - commons_1.default.LogException(err, "Error", true); - return; - } - } - async getCustomFilesFromGist(customSettings, syncSetting) { - const github = new github_service_1.GitHubService(customSettings.token, customSettings.githubEnterpriseUrl); - const res = await github.ReadGist(syncSetting.gist); - if (!res) { - return []; - } - const keys = Object.keys(res.data.files); - const customFiles = []; - keys.forEach(gistName => { - if (res.data.files[gistName]) { - if (res.data.files[gistName].content) { - const prefix = file_service_1.FileService.CUSTOMIZED_SYNC_PREFIX; - if (gistName.indexOf(prefix) > -1) { - const fileName = gistName.split(prefix).join(""); // |customized_sync|.htmlhintrc => .htmlhintrc - const f = new file_service_1.File(fileName, res.data.files[gistName].content, fileName in customSettings.customFiles - ? customSettings.customFiles[fileName] - : null, gistName); - customFiles.push(f); - } - } - } - }); - return customFiles; - } -} -exports.Sync = Sync; - - -/***/ }), -/* 7 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -module.exports = { - // Export promiseified graceful-fs: - ...__webpack_require__(8), - // Export extra methods: - ...__webpack_require__(19), - ...__webpack_require__(28), - ...__webpack_require__(30), - ...__webpack_require__(36), - ...__webpack_require__(21), - ...__webpack_require__(43), - ...__webpack_require__(41), - ...__webpack_require__(24), - ...__webpack_require__(29) -} - - -/***/ }), -/* 8 */ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -// This is adapted from https://github.com/normalize/mz -// Copyright (c) 2014-2016 Jonathan Ong me@jongleberry.com and Contributors -const u = (__webpack_require__(9).fromCallback) -const fs = __webpack_require__(10) - -const api = [ - 'access', - 'appendFile', - 'chmod', - 'chown', - 'close', - 'copyFile', - 'fchmod', - 'fchown', - 'fdatasync', - 'fstat', - 'fsync', - 'ftruncate', - 'futimes', - 'lchmod', - 'lchown', - 'link', - 'lstat', - 'mkdir', - 'mkdtemp', - 'open', - 'opendir', - 'readdir', - 'readFile', - 'readlink', - 'realpath', - 'rename', - 'rm', - 'rmdir', - 'stat', - 'symlink', - 'truncate', - 'unlink', - 'utimes', - 'writeFile' -].filter(key => { - // Some commands are not available on some systems. Ex: - // fs.cp was added in Node.js v16.7.0 - // fs.lchown is not available on at least some Linux - return typeof fs[key] === 'function' -}) - -// Export cloned fs: -Object.assign(exports, fs) - -// Universalify async methods: -api.forEach(method => { - exports[method] = u(fs[method]) -}) - -// We differ from mz/fs in that we still ship the old, broken, fs.exists() -// since we are a drop-in replacement for the native module -exports.exists = function (filename, callback) { - if (typeof callback === 'function') { - return fs.exists(filename, callback) - } - return new Promise(resolve => { - return fs.exists(filename, resolve) - }) -} - -// fs.read(), fs.write(), fs.readv(), & fs.writev() need special treatment due to multiple callback args - -exports.read = function (fd, buffer, offset, length, position, callback) { - if (typeof callback === 'function') { - return fs.read(fd, buffer, offset, length, position, callback) - } - return new Promise((resolve, reject) => { - fs.read(fd, buffer, offset, length, position, (err, bytesRead, buffer) => { - if (err) return reject(err) - resolve({ bytesRead, buffer }) - }) - }) -} - -// Function signature can be -// fs.write(fd, buffer[, offset[, length[, position]]], callback) -// OR -// fs.write(fd, string[, position[, encoding]], callback) -// We need to handle both cases, so we use ...args -exports.write = function (fd, buffer, ...args) { - if (typeof args[args.length - 1] === 'function') { - return fs.write(fd, buffer, ...args) - } - - return new Promise((resolve, reject) => { - fs.write(fd, buffer, ...args, (err, bytesWritten, buffer) => { - if (err) return reject(err) - resolve({ bytesWritten, buffer }) - }) - }) -} - -// Function signature is -// s.readv(fd, buffers[, position], callback) -// We need to handle the optional arg, so we use ...args -exports.readv = function (fd, buffers, ...args) { - if (typeof args[args.length - 1] === 'function') { - return fs.readv(fd, buffers, ...args) - } - - return new Promise((resolve, reject) => { - fs.readv(fd, buffers, ...args, (err, bytesRead, buffers) => { - if (err) return reject(err) - resolve({ bytesRead, buffers }) - }) - }) -} - -// Function signature is -// s.writev(fd, buffers[, position], callback) -// We need to handle the optional arg, so we use ...args -exports.writev = function (fd, buffers, ...args) { - if (typeof args[args.length - 1] === 'function') { - return fs.writev(fd, buffers, ...args) - } - - return new Promise((resolve, reject) => { - fs.writev(fd, buffers, ...args, (err, bytesWritten, buffers) => { - if (err) return reject(err) - resolve({ bytesWritten, buffers }) - }) - }) -} - -// fs.realpath.native sometimes not available if fs is monkey-patched -if (typeof fs.realpath.native === 'function') { - exports.realpath.native = u(fs.realpath.native) -} else { - process.emitWarning( - 'fs.realpath.native is not a function. Is fs being monkey-patched?', - 'Warning', 'fs-extra-WARN0003' - ) -} - - -/***/ }), -/* 9 */ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - - -exports.fromCallback = function (fn) { - return Object.defineProperty(function (...args) { - if (typeof args[args.length - 1] === 'function') fn.apply(this, args) - else { - return new Promise((resolve, reject) => { - args.push((err, res) => (err != null) ? reject(err) : resolve(res)) - fn.apply(this, args) - }) - } - }, 'name', { value: fn.name }) -} - -exports.fromPromise = function (fn) { - return Object.defineProperty(function (...args) { - const cb = args[args.length - 1] - if (typeof cb !== 'function') return fn.apply(this, args) - else { - args.pop() - fn.apply(this, args).then(r => cb(null, r), cb) - } - }, 'name', { value: fn.name }) -} - - -/***/ }), -/* 10 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var fs = __webpack_require__(11) -var polyfills = __webpack_require__(12) -var legacy = __webpack_require__(14) -var clone = __webpack_require__(16) - -var util = __webpack_require__(17) - -/* istanbul ignore next - node 0.x polyfill */ -var gracefulQueue -var previousSymbol - -/* istanbul ignore else - node 0.x polyfill */ -if (typeof Symbol === 'function' && typeof Symbol.for === 'function') { - gracefulQueue = Symbol.for('graceful-fs.queue') - // This is used in testing by future versions - previousSymbol = Symbol.for('graceful-fs.previous') -} else { - gracefulQueue = '___graceful-fs.queue' - previousSymbol = '___graceful-fs.previous' -} - -function noop () {} - -function publishQueue(context, queue) { - Object.defineProperty(context, gracefulQueue, { - get: function() { - return queue - } - }) -} - -var debug = noop -if (util.debuglog) - debug = util.debuglog('gfs4') -else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) - debug = function() { - var m = util.format.apply(util, arguments) - m = 'GFS4: ' + m.split(/\n/).join('\nGFS4: ') - console.error(m) - } - -// Once time initialization -if (!fs[gracefulQueue]) { - // This queue can be shared by multiple loaded instances - var queue = global[gracefulQueue] || [] - publishQueue(fs, queue) - - // Patch fs.close/closeSync to shared queue version, because we need - // to retry() whenever a close happens *anywhere* in the program. - // This is essential when multiple graceful-fs instances are - // in play at the same time. - fs.close = (function (fs$close) { - function close (fd, cb) { - return fs$close.call(fs, fd, function (err) { - // This function uses the graceful-fs shared queue - if (!err) { - resetQueue() - } - - if (typeof cb === 'function') - cb.apply(this, arguments) - }) - } - - Object.defineProperty(close, previousSymbol, { - value: fs$close - }) - return close - })(fs.close) - - fs.closeSync = (function (fs$closeSync) { - function closeSync (fd) { - // This function uses the graceful-fs shared queue - fs$closeSync.apply(fs, arguments) - resetQueue() - } - - Object.defineProperty(closeSync, previousSymbol, { - value: fs$closeSync - }) - return closeSync - })(fs.closeSync) - - if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) { - process.on('exit', function() { - debug(fs[gracefulQueue]) - __webpack_require__(18).equal(fs[gracefulQueue].length, 0) - }) - } -} - -if (!global[gracefulQueue]) { - publishQueue(global, fs[gracefulQueue]); -} - -module.exports = patch(clone(fs)) -if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH && !fs.__patched) { - module.exports = patch(fs) - fs.__patched = true; -} - -function patch (fs) { - // Everything that references the open() function needs to be in here - polyfills(fs) - fs.gracefulify = patch - - fs.createReadStream = createReadStream - fs.createWriteStream = createWriteStream - var fs$readFile = fs.readFile - fs.readFile = readFile - function readFile (path, options, cb) { - if (typeof options === 'function') - cb = options, options = null - - return go$readFile(path, options, cb) - - function go$readFile (path, options, cb, startTime) { - return fs$readFile(path, options, function (err) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$readFile, [path, options, cb], err, startTime || Date.now(), Date.now()]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - } - }) - } - } - - var fs$writeFile = fs.writeFile - fs.writeFile = writeFile - function writeFile (path, data, options, cb) { - if (typeof options === 'function') - cb = options, options = null - - return go$writeFile(path, data, options, cb) - - function go$writeFile (path, data, options, cb, startTime) { - return fs$writeFile(path, data, options, function (err) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$writeFile, [path, data, options, cb], err, startTime || Date.now(), Date.now()]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - } - }) - } - } - - var fs$appendFile = fs.appendFile - if (fs$appendFile) - fs.appendFile = appendFile - function appendFile (path, data, options, cb) { - if (typeof options === 'function') - cb = options, options = null - - return go$appendFile(path, data, options, cb) - - function go$appendFile (path, data, options, cb, startTime) { - return fs$appendFile(path, data, options, function (err) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$appendFile, [path, data, options, cb], err, startTime || Date.now(), Date.now()]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - } - }) - } - } - - var fs$copyFile = fs.copyFile - if (fs$copyFile) - fs.copyFile = copyFile - function copyFile (src, dest, flags, cb) { - if (typeof flags === 'function') { - cb = flags - flags = 0 - } - return go$copyFile(src, dest, flags, cb) - - function go$copyFile (src, dest, flags, cb, startTime) { - return fs$copyFile(src, dest, flags, function (err) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$copyFile, [src, dest, flags, cb], err, startTime || Date.now(), Date.now()]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - } - }) - } - } - - var fs$readdir = fs.readdir - fs.readdir = readdir - var noReaddirOptionVersions = /^v[0-5]\./ - function readdir (path, options, cb) { - if (typeof options === 'function') - cb = options, options = null - - var go$readdir = noReaddirOptionVersions.test(process.version) - ? function go$readdir (path, options, cb, startTime) { - return fs$readdir(path, fs$readdirCallback( - path, options, cb, startTime - )) - } - : function go$readdir (path, options, cb, startTime) { - return fs$readdir(path, options, fs$readdirCallback( - path, options, cb, startTime - )) - } - - return go$readdir(path, options, cb) - - function fs$readdirCallback (path, options, cb, startTime) { - return function (err, files) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([ - go$readdir, - [path, options, cb], - err, - startTime || Date.now(), - Date.now() - ]) - else { - if (files && files.sort) - files.sort() - - if (typeof cb === 'function') - cb.call(this, err, files) - } - } - } - } - - if (process.version.substr(0, 4) === 'v0.8') { - var legStreams = legacy(fs) - ReadStream = legStreams.ReadStream - WriteStream = legStreams.WriteStream - } - - var fs$ReadStream = fs.ReadStream - if (fs$ReadStream) { - ReadStream.prototype = Object.create(fs$ReadStream.prototype) - ReadStream.prototype.open = ReadStream$open - } - - var fs$WriteStream = fs.WriteStream - if (fs$WriteStream) { - WriteStream.prototype = Object.create(fs$WriteStream.prototype) - WriteStream.prototype.open = WriteStream$open - } - - Object.defineProperty(fs, 'ReadStream', { - get: function () { - return ReadStream - }, - set: function (val) { - ReadStream = val - }, - enumerable: true, - configurable: true - }) - Object.defineProperty(fs, 'WriteStream', { - get: function () { - return WriteStream - }, - set: function (val) { - WriteStream = val - }, - enumerable: true, - configurable: true - }) - - // legacy names - var FileReadStream = ReadStream - Object.defineProperty(fs, 'FileReadStream', { - get: function () { - return FileReadStream - }, - set: function (val) { - FileReadStream = val - }, - enumerable: true, - configurable: true - }) - var FileWriteStream = WriteStream - Object.defineProperty(fs, 'FileWriteStream', { - get: function () { - return FileWriteStream - }, - set: function (val) { - FileWriteStream = val - }, - enumerable: true, - configurable: true - }) - - function ReadStream (path, options) { - if (this instanceof ReadStream) - return fs$ReadStream.apply(this, arguments), this - else - return ReadStream.apply(Object.create(ReadStream.prototype), arguments) - } - - function ReadStream$open () { - var that = this - open(that.path, that.flags, that.mode, function (err, fd) { - if (err) { - if (that.autoClose) - that.destroy() - - that.emit('error', err) - } else { - that.fd = fd - that.emit('open', fd) - that.read() - } - }) - } - - function WriteStream (path, options) { - if (this instanceof WriteStream) - return fs$WriteStream.apply(this, arguments), this - else - return WriteStream.apply(Object.create(WriteStream.prototype), arguments) - } - - function WriteStream$open () { - var that = this - open(that.path, that.flags, that.mode, function (err, fd) { - if (err) { - that.destroy() - that.emit('error', err) - } else { - that.fd = fd - that.emit('open', fd) - } - }) - } - - function createReadStream (path, options) { - return new fs.ReadStream(path, options) - } - - function createWriteStream (path, options) { - return new fs.WriteStream(path, options) - } - - var fs$open = fs.open - fs.open = open - function open (path, flags, mode, cb) { - if (typeof mode === 'function') - cb = mode, mode = null - - return go$open(path, flags, mode, cb) - - function go$open (path, flags, mode, cb, startTime) { - return fs$open(path, flags, mode, function (err, fd) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$open, [path, flags, mode, cb], err, startTime || Date.now(), Date.now()]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - } - }) - } - } - - return fs -} - -function enqueue (elem) { - debug('ENQUEUE', elem[0].name, elem[1]) - fs[gracefulQueue].push(elem) - retry() -} - -// keep track of the timeout between retry() calls -var retryTimer - -// reset the startTime and lastTime to now -// this resets the start of the 60 second overall timeout as well as the -// delay between attempts so that we'll retry these jobs sooner -function resetQueue () { - var now = Date.now() - for (var i = 0; i < fs[gracefulQueue].length; ++i) { - // entries that are only a length of 2 are from an older version, don't - // bother modifying those since they'll be retried anyway. - if (fs[gracefulQueue][i].length > 2) { - fs[gracefulQueue][i][3] = now // startTime - fs[gracefulQueue][i][4] = now // lastTime - } - } - // call retry to make sure we're actively processing the queue - retry() -} - -function retry () { - // clear the timer and remove it to help prevent unintended concurrency - clearTimeout(retryTimer) - retryTimer = undefined - - if (fs[gracefulQueue].length === 0) - return - - var elem = fs[gracefulQueue].shift() - var fn = elem[0] - var args = elem[1] - // these items may be unset if they were added by an older graceful-fs - var err = elem[2] - var startTime = elem[3] - var lastTime = elem[4] - - // if we don't have a startTime we have no way of knowing if we've waited - // long enough, so go ahead and retry this item now - if (startTime === undefined) { - debug('RETRY', fn.name, args) - fn.apply(null, args) - } else if (Date.now() - startTime >= 60000) { - // it's been more than 60 seconds total, bail now - debug('TIMEOUT', fn.name, args) - var cb = args.pop() - if (typeof cb === 'function') - cb.call(null, err) - } else { - // the amount of time between the last attempt and right now - var sinceAttempt = Date.now() - lastTime - // the amount of time between when we first tried, and when we last tried - // rounded up to at least 1 - var sinceStart = Math.max(lastTime - startTime, 1) - // backoff. wait longer than the total time we've been retrying, but only - // up to a maximum of 100ms - var desiredDelay = Math.min(sinceStart * 1.2, 100) - // it's been long enough since the last retry, do it again - if (sinceAttempt >= desiredDelay) { - debug('RETRY', fn.name, args) - fn.apply(null, args.concat([startTime])) - } else { - // if we can't do this job yet, push it to the end of the queue - // and let the next iteration check again - fs[gracefulQueue].push(elem) - } - } - - // schedule our next run if one isn't already scheduled - if (retryTimer === undefined) { - retryTimer = setTimeout(retry, 0) - } -} - - -/***/ }), -/* 11 */ -/***/ ((module) => { - -"use strict"; -module.exports = require("fs"); - -/***/ }), -/* 12 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var constants = __webpack_require__(13) - -var origCwd = process.cwd -var cwd = null - -var platform = process.env.GRACEFUL_FS_PLATFORM || process.platform - -process.cwd = function() { - if (!cwd) - cwd = origCwd.call(process) - return cwd -} -try { - process.cwd() -} catch (er) {} - -// This check is needed until node.js 12 is required -if (typeof process.chdir === 'function') { - var chdir = process.chdir - process.chdir = function (d) { - cwd = null - chdir.call(process, d) - } - if (Object.setPrototypeOf) Object.setPrototypeOf(process.chdir, chdir) -} - -module.exports = patch - -function patch (fs) { - // (re-)implement some things that are known busted or missing. - - // lchmod, broken prior to 0.6.2 - // back-port the fix here. - if (constants.hasOwnProperty('O_SYMLINK') && - process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) { - patchLchmod(fs) - } - - // lutimes implementation, or no-op - if (!fs.lutimes) { - patchLutimes(fs) - } - - // https://github.com/isaacs/node-graceful-fs/issues/4 - // Chown should not fail on einval or eperm if non-root. - // It should not fail on enosys ever, as this just indicates - // that a fs doesn't support the intended operation. - - fs.chown = chownFix(fs.chown) - fs.fchown = chownFix(fs.fchown) - fs.lchown = chownFix(fs.lchown) - - fs.chmod = chmodFix(fs.chmod) - fs.fchmod = chmodFix(fs.fchmod) - fs.lchmod = chmodFix(fs.lchmod) - - fs.chownSync = chownFixSync(fs.chownSync) - fs.fchownSync = chownFixSync(fs.fchownSync) - fs.lchownSync = chownFixSync(fs.lchownSync) - - fs.chmodSync = chmodFixSync(fs.chmodSync) - fs.fchmodSync = chmodFixSync(fs.fchmodSync) - fs.lchmodSync = chmodFixSync(fs.lchmodSync) - - fs.stat = statFix(fs.stat) - fs.fstat = statFix(fs.fstat) - fs.lstat = statFix(fs.lstat) - - fs.statSync = statFixSync(fs.statSync) - fs.fstatSync = statFixSync(fs.fstatSync) - fs.lstatSync = statFixSync(fs.lstatSync) - - // if lchmod/lchown do not exist, then make them no-ops - if (fs.chmod && !fs.lchmod) { - fs.lchmod = function (path, mode, cb) { - if (cb) process.nextTick(cb) - } - fs.lchmodSync = function () {} - } - if (fs.chown && !fs.lchown) { - fs.lchown = function (path, uid, gid, cb) { - if (cb) process.nextTick(cb) - } - fs.lchownSync = function () {} - } - - // on Windows, A/V software can lock the directory, causing this - // to fail with an EACCES or EPERM if the directory contains newly - // created files. Try again on failure, for up to 60 seconds. - - // Set the timeout this long because some Windows Anti-Virus, such as Parity - // bit9, may lock files for up to a minute, causing npm package install - // failures. Also, take care to yield the scheduler. Windows scheduling gives - // CPU to a busy looping process, which can cause the program causing the lock - // contention to be starved of CPU by node, so the contention doesn't resolve. - if (platform === "win32") { - fs.rename = typeof fs.rename !== 'function' ? fs.rename - : (function (fs$rename) { - function rename (from, to, cb) { - var start = Date.now() - var backoff = 0; - fs$rename(from, to, function CB (er) { - if (er - && (er.code === "EACCES" || er.code === "EPERM" || er.code === "EBUSY") - && Date.now() - start < 60000) { - setTimeout(function() { - fs.stat(to, function (stater, st) { - if (stater && stater.code === "ENOENT") - fs$rename(from, to, CB); - else - cb(er) - }) - }, backoff) - if (backoff < 100) - backoff += 10; - return; - } - if (cb) cb(er) - }) - } - if (Object.setPrototypeOf) Object.setPrototypeOf(rename, fs$rename) - return rename - })(fs.rename) - } - - // if read() returns EAGAIN, then just try it again. - fs.read = typeof fs.read !== 'function' ? fs.read - : (function (fs$read) { - function read (fd, buffer, offset, length, position, callback_) { - var callback - if (callback_ && typeof callback_ === 'function') { - var eagCounter = 0 - callback = function (er, _, __) { - if (er && er.code === 'EAGAIN' && eagCounter < 10) { - eagCounter ++ - return fs$read.call(fs, fd, buffer, offset, length, position, callback) - } - callback_.apply(this, arguments) - } - } - return fs$read.call(fs, fd, buffer, offset, length, position, callback) - } - - // This ensures `util.promisify` works as it does for native `fs.read`. - if (Object.setPrototypeOf) Object.setPrototypeOf(read, fs$read) - return read - })(fs.read) - - fs.readSync = typeof fs.readSync !== 'function' ? fs.readSync - : (function (fs$readSync) { return function (fd, buffer, offset, length, position) { - var eagCounter = 0 - while (true) { - try { - return fs$readSync.call(fs, fd, buffer, offset, length, position) - } catch (er) { - if (er.code === 'EAGAIN' && eagCounter < 10) { - eagCounter ++ - continue - } - throw er - } - } - }})(fs.readSync) - - function patchLchmod (fs) { - fs.lchmod = function (path, mode, callback) { - fs.open( path - , constants.O_WRONLY | constants.O_SYMLINK - , mode - , function (err, fd) { - if (err) { - if (callback) callback(err) - return - } - // prefer to return the chmod error, if one occurs, - // but still try to close, and report closing errors if they occur. - fs.fchmod(fd, mode, function (err) { - fs.close(fd, function(err2) { - if (callback) callback(err || err2) - }) - }) - }) - } - - fs.lchmodSync = function (path, mode) { - var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode) - - // prefer to return the chmod error, if one occurs, - // but still try to close, and report closing errors if they occur. - var threw = true - var ret - try { - ret = fs.fchmodSync(fd, mode) - threw = false - } finally { - if (threw) { - try { - fs.closeSync(fd) - } catch (er) {} - } else { - fs.closeSync(fd) - } - } - return ret - } - } - - function patchLutimes (fs) { - if (constants.hasOwnProperty("O_SYMLINK") && fs.futimes) { - fs.lutimes = function (path, at, mt, cb) { - fs.open(path, constants.O_SYMLINK, function (er, fd) { - if (er) { - if (cb) cb(er) - return - } - fs.futimes(fd, at, mt, function (er) { - fs.close(fd, function (er2) { - if (cb) cb(er || er2) - }) - }) - }) - } - - fs.lutimesSync = function (path, at, mt) { - var fd = fs.openSync(path, constants.O_SYMLINK) - var ret - var threw = true - try { - ret = fs.futimesSync(fd, at, mt) - threw = false - } finally { - if (threw) { - try { - fs.closeSync(fd) - } catch (er) {} - } else { - fs.closeSync(fd) - } - } - return ret - } - - } else if (fs.futimes) { - fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) } - fs.lutimesSync = function () {} - } - } - - function chmodFix (orig) { - if (!orig) return orig - return function (target, mode, cb) { - return orig.call(fs, target, mode, function (er) { - if (chownErOk(er)) er = null - if (cb) cb.apply(this, arguments) - }) - } - } - - function chmodFixSync (orig) { - if (!orig) return orig - return function (target, mode) { - try { - return orig.call(fs, target, mode) - } catch (er) { - if (!chownErOk(er)) throw er - } - } - } - - - function chownFix (orig) { - if (!orig) return orig - return function (target, uid, gid, cb) { - return orig.call(fs, target, uid, gid, function (er) { - if (chownErOk(er)) er = null - if (cb) cb.apply(this, arguments) - }) - } - } - - function chownFixSync (orig) { - if (!orig) return orig - return function (target, uid, gid) { - try { - return orig.call(fs, target, uid, gid) - } catch (er) { - if (!chownErOk(er)) throw er - } - } - } - - function statFix (orig) { - if (!orig) return orig - // Older versions of Node erroneously returned signed integers for - // uid + gid. - return function (target, options, cb) { - if (typeof options === 'function') { - cb = options - options = null - } - function callback (er, stats) { - if (stats) { - if (stats.uid < 0) stats.uid += 0x100000000 - if (stats.gid < 0) stats.gid += 0x100000000 - } - if (cb) cb.apply(this, arguments) - } - return options ? orig.call(fs, target, options, callback) - : orig.call(fs, target, callback) - } - } - - function statFixSync (orig) { - if (!orig) return orig - // Older versions of Node erroneously returned signed integers for - // uid + gid. - return function (target, options) { - var stats = options ? orig.call(fs, target, options) - : orig.call(fs, target) - if (stats) { - if (stats.uid < 0) stats.uid += 0x100000000 - if (stats.gid < 0) stats.gid += 0x100000000 - } - return stats; - } - } - - // ENOSYS means that the fs doesn't support the op. Just ignore - // that, because it doesn't matter. - // - // if there's no getuid, or if getuid() is something other - // than 0, and the error is EINVAL or EPERM, then just ignore - // it. - // - // This specific case is a silent failure in cp, install, tar, - // and most other unix tools that manage permissions. - // - // When running as root, or if other types of errors are - // encountered, then it's strict. - function chownErOk (er) { - if (!er) - return true - - if (er.code === "ENOSYS") - return true - - var nonroot = !process.getuid || process.getuid() !== 0 - if (nonroot) { - if (er.code === "EINVAL" || er.code === "EPERM") - return true - } - - return false - } -} - - -/***/ }), -/* 13 */ -/***/ ((module) => { - -"use strict"; -module.exports = require("constants"); - -/***/ }), -/* 14 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var Stream = (__webpack_require__(15).Stream) - -module.exports = legacy - -function legacy (fs) { - return { - ReadStream: ReadStream, - WriteStream: WriteStream - } - - function ReadStream (path, options) { - if (!(this instanceof ReadStream)) return new ReadStream(path, options); - - Stream.call(this); - - var self = this; - - this.path = path; - this.fd = null; - this.readable = true; - this.paused = false; - - this.flags = 'r'; - this.mode = 438; /*=0666*/ - this.bufferSize = 64 * 1024; - - options = options || {}; - - // Mixin options into this - var keys = Object.keys(options); - for (var index = 0, length = keys.length; index < length; index++) { - var key = keys[index]; - this[key] = options[key]; - } - - if (this.encoding) this.setEncoding(this.encoding); - - if (this.start !== undefined) { - if ('number' !== typeof this.start) { - throw TypeError('start must be a Number'); - } - if (this.end === undefined) { - this.end = Infinity; - } else if ('number' !== typeof this.end) { - throw TypeError('end must be a Number'); - } - - if (this.start > this.end) { - throw new Error('start must be <= end'); - } - - this.pos = this.start; - } - - if (this.fd !== null) { - process.nextTick(function() { - self._read(); - }); - return; - } - - fs.open(this.path, this.flags, this.mode, function (err, fd) { - if (err) { - self.emit('error', err); - self.readable = false; - return; - } - - self.fd = fd; - self.emit('open', fd); - self._read(); - }) - } - - function WriteStream (path, options) { - if (!(this instanceof WriteStream)) return new WriteStream(path, options); - - Stream.call(this); - - this.path = path; - this.fd = null; - this.writable = true; - - this.flags = 'w'; - this.encoding = 'binary'; - this.mode = 438; /*=0666*/ - this.bytesWritten = 0; - - options = options || {}; - - // Mixin options into this - var keys = Object.keys(options); - for (var index = 0, length = keys.length; index < length; index++) { - var key = keys[index]; - this[key] = options[key]; - } - - if (this.start !== undefined) { - if ('number' !== typeof this.start) { - throw TypeError('start must be a Number'); - } - if (this.start < 0) { - throw new Error('start must be >= zero'); - } - - this.pos = this.start; - } - - this.busy = false; - this._queue = []; - - if (this.fd === null) { - this._open = fs.open; - this._queue.push([this._open, this.path, this.flags, this.mode, undefined]); - this.flush(); - } - } -} - - -/***/ }), -/* 15 */ -/***/ ((module) => { - -"use strict"; -module.exports = require("stream"); - -/***/ }), -/* 16 */ -/***/ ((module) => { - -"use strict"; - - -module.exports = clone - -var getPrototypeOf = Object.getPrototypeOf || function (obj) { - return obj.__proto__ -} - -function clone (obj) { - if (obj === null || typeof obj !== 'object') - return obj - - if (obj instanceof Object) - var copy = { __proto__: getPrototypeOf(obj) } - else - var copy = Object.create(null) - - Object.getOwnPropertyNames(obj).forEach(function (key) { - Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key)) - }) - - return copy -} - - -/***/ }), -/* 17 */ -/***/ ((module) => { - -"use strict"; -module.exports = require("util"); - -/***/ }), -/* 18 */ -/***/ ((module) => { - -"use strict"; -module.exports = require("assert"); - -/***/ }), -/* 19 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -const u = (__webpack_require__(9).fromPromise) -module.exports = { - copy: u(__webpack_require__(20)), - copySync: __webpack_require__(27) -} - - -/***/ }), -/* 20 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -const fs = __webpack_require__(8) -const path = __webpack_require__(3) -const { mkdirs } = __webpack_require__(21) -const { pathExists } = __webpack_require__(24) -const { utimesMillis } = __webpack_require__(25) -const stat = __webpack_require__(26) - -async function copy (src, dest, opts = {}) { - if (typeof opts === 'function') { - opts = { filter: opts } - } - - opts.clobber = 'clobber' in opts ? !!opts.clobber : true // default to true for now - opts.overwrite = 'overwrite' in opts ? !!opts.overwrite : opts.clobber // overwrite falls back to clobber - - // Warn about using preserveTimestamps on 32-bit node - if (opts.preserveTimestamps && process.arch === 'ia32') { - process.emitWarning( - 'Using the preserveTimestamps option in 32-bit node is not recommended;\n\n' + - '\tsee https://github.com/jprichardson/node-fs-extra/issues/269', - 'Warning', 'fs-extra-WARN0001' - ) - } - - const { srcStat, destStat } = await stat.checkPaths(src, dest, 'copy', opts) - - await stat.checkParentPaths(src, srcStat, dest, 'copy') - - const include = await runFilter(src, dest, opts) - - if (!include) return - - // check if the parent of dest exists, and create it if it doesn't exist - const destParent = path.dirname(dest) - const dirExists = await pathExists(destParent) - if (!dirExists) { - await mkdirs(destParent) - } - - await getStatsAndPerformCopy(destStat, src, dest, opts) -} - -async function runFilter (src, dest, opts) { - if (!opts.filter) return true - return opts.filter(src, dest) -} - -async function getStatsAndPerformCopy (destStat, src, dest, opts) { - const statFn = opts.dereference ? fs.stat : fs.lstat - const srcStat = await statFn(src) - - if (srcStat.isDirectory()) return onDir(srcStat, destStat, src, dest, opts) - - if ( - srcStat.isFile() || - srcStat.isCharacterDevice() || - srcStat.isBlockDevice() - ) return onFile(srcStat, destStat, src, dest, opts) - - if (srcStat.isSymbolicLink()) return onLink(destStat, src, dest, opts) - if (srcStat.isSocket()) throw new Error(`Cannot copy a socket file: ${src}`) - if (srcStat.isFIFO()) throw new Error(`Cannot copy a FIFO pipe: ${src}`) - throw new Error(`Unknown file: ${src}`) -} - -async function onFile (srcStat, destStat, src, dest, opts) { - if (!destStat) return copyFile(srcStat, src, dest, opts) - - if (opts.overwrite) { - await fs.unlink(dest) - return copyFile(srcStat, src, dest, opts) - } - if (opts.errorOnExist) { - throw new Error(`'${dest}' already exists`) - } -} - -async function copyFile (srcStat, src, dest, opts) { - await fs.copyFile(src, dest) - if (opts.preserveTimestamps) { - // Make sure the file is writable before setting the timestamp - // otherwise open fails with EPERM when invoked with 'r+' - // (through utimes call) - if (fileIsNotWritable(srcStat.mode)) { - await makeFileWritable(dest, srcStat.mode) - } - - // Set timestamps and mode correspondingly - - // Note that The initial srcStat.atime cannot be trusted - // because it is modified by the read(2) system call - // (See https://nodejs.org/api/fs.html#fs_stat_time_values) - const updatedSrcStat = await fs.stat(src) - await utimesMillis(dest, updatedSrcStat.atime, updatedSrcStat.mtime) - } - - return fs.chmod(dest, srcStat.mode) -} - -function fileIsNotWritable (srcMode) { - return (srcMode & 0o200) === 0 -} - -function makeFileWritable (dest, srcMode) { - return fs.chmod(dest, srcMode | 0o200) -} - -async function onDir (srcStat, destStat, src, dest, opts) { - // the dest directory might not exist, create it - if (!destStat) { - await fs.mkdir(dest) - } - - const items = await fs.readdir(src) - - // loop through the files in the current directory to copy everything - await Promise.all(items.map(async item => { - const srcItem = path.join(src, item) - const destItem = path.join(dest, item) - - // skip the item if it is matches by the filter function - const include = await runFilter(srcItem, destItem, opts) - if (!include) return - - const { destStat } = await stat.checkPaths(srcItem, destItem, 'copy', opts) - - // If the item is a copyable file, `getStatsAndPerformCopy` will copy it - // If the item is a directory, `getStatsAndPerformCopy` will call `onDir` recursively - return getStatsAndPerformCopy(destStat, srcItem, destItem, opts) - })) - - if (!destStat) { - await fs.chmod(dest, srcStat.mode) - } -} - -async function onLink (destStat, src, dest, opts) { - let resolvedSrc = await fs.readlink(src) - if (opts.dereference) { - resolvedSrc = path.resolve(process.cwd(), resolvedSrc) - } - if (!destStat) { - return fs.symlink(resolvedSrc, dest) - } - - let resolvedDest = null - try { - resolvedDest = await fs.readlink(dest) - } catch (e) { - // dest exists and is a regular file or directory, - // Windows may throw UNKNOWN error. If dest already exists, - // fs throws error anyway, so no need to guard against it here. - if (e.code === 'EINVAL' || e.code === 'UNKNOWN') return fs.symlink(resolvedSrc, dest) - throw e - } - if (opts.dereference) { - resolvedDest = path.resolve(process.cwd(), resolvedDest) - } - if (stat.isSrcSubdir(resolvedSrc, resolvedDest)) { - throw new Error(`Cannot copy '${resolvedSrc}' to a subdirectory of itself, '${resolvedDest}'.`) - } - - // do not copy if src is a subdir of dest since unlinking - // dest in this case would result in removing src contents - // and therefore a broken symlink would be created. - if (stat.isSrcSubdir(resolvedDest, resolvedSrc)) { - throw new Error(`Cannot overwrite '${resolvedDest}' with '${resolvedSrc}'.`) - } - - // copy the link - await fs.unlink(dest) - return fs.symlink(resolvedSrc, dest) -} - -module.exports = copy - - -/***/ }), -/* 21 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - -const u = (__webpack_require__(9).fromPromise) -const { makeDir: _makeDir, makeDirSync } = __webpack_require__(22) -const makeDir = u(_makeDir) - -module.exports = { - mkdirs: makeDir, - mkdirsSync: makeDirSync, - // alias - mkdirp: makeDir, - mkdirpSync: makeDirSync, - ensureDir: makeDir, - ensureDirSync: makeDirSync -} - - -/***/ }), -/* 22 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - -const fs = __webpack_require__(8) -const { checkPath } = __webpack_require__(23) - -const getMode = options => { - const defaults = { mode: 0o777 } - if (typeof options === 'number') return options - return ({ ...defaults, ...options }).mode -} - -module.exports.makeDir = async (dir, options) => { - checkPath(dir) - - return fs.mkdir(dir, { - mode: getMode(options), - recursive: true - }) -} - -module.exports.makeDirSync = (dir, options) => { - checkPath(dir) - - return fs.mkdirSync(dir, { - mode: getMode(options), - recursive: true - }) -} - - -/***/ }), -/* 23 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// Adapted from https://github.com/sindresorhus/make-dir -// Copyright (c) Sindre Sorhus (sindresorhus.com) -// 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. - -const path = __webpack_require__(3) - -// https://github.com/nodejs/node/issues/8987 -// https://github.com/libuv/libuv/pull/1088 -module.exports.checkPath = function checkPath (pth) { - if (process.platform === 'win32') { - const pathHasInvalidWinCharacters = /[<>:"|?*]/.test(pth.replace(path.parse(pth).root, '')) - - if (pathHasInvalidWinCharacters) { - const error = new Error(`Path contains invalid characters: ${pth}`) - error.code = 'EINVAL' - throw error - } - } -} - - -/***/ }), -/* 24 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - -const u = (__webpack_require__(9).fromPromise) -const fs = __webpack_require__(8) - -function pathExists (path) { - return fs.access(path).then(() => true).catch(() => false) -} - -module.exports = { - pathExists: u(pathExists), - pathExistsSync: fs.existsSync -} - - -/***/ }), -/* 25 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -const fs = __webpack_require__(8) -const u = (__webpack_require__(9).fromPromise) - -async function utimesMillis (path, atime, mtime) { - // if (!HAS_MILLIS_RES) return fs.utimes(path, atime, mtime, callback) - const fd = await fs.open(path, 'r+') - - let closeErr = null - - try { - await fs.futimes(fd, atime, mtime) - } finally { - try { - await fs.close(fd) - } catch (e) { - closeErr = e - } - } - - if (closeErr) { - throw closeErr - } -} - -function utimesMillisSync (path, atime, mtime) { - const fd = fs.openSync(path, 'r+') - fs.futimesSync(fd, atime, mtime) - return fs.closeSync(fd) -} - -module.exports = { - utimesMillis: u(utimesMillis), - utimesMillisSync -} - - -/***/ }), -/* 26 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -const fs = __webpack_require__(8) -const path = __webpack_require__(3) -const u = (__webpack_require__(9).fromPromise) - -function getStats (src, dest, opts) { - const statFunc = opts.dereference - ? (file) => fs.stat(file, { bigint: true }) - : (file) => fs.lstat(file, { bigint: true }) - return Promise.all([ - statFunc(src), - statFunc(dest).catch(err => { - if (err.code === 'ENOENT') return null - throw err - }) - ]).then(([srcStat, destStat]) => ({ srcStat, destStat })) -} - -function getStatsSync (src, dest, opts) { - let destStat - const statFunc = opts.dereference - ? (file) => fs.statSync(file, { bigint: true }) - : (file) => fs.lstatSync(file, { bigint: true }) - const srcStat = statFunc(src) - try { - destStat = statFunc(dest) - } catch (err) { - if (err.code === 'ENOENT') return { srcStat, destStat: null } - throw err - } - return { srcStat, destStat } -} - -async function checkPaths (src, dest, funcName, opts) { - const { srcStat, destStat } = await getStats(src, dest, opts) - if (destStat) { - if (areIdentical(srcStat, destStat)) { - const srcBaseName = path.basename(src) - const destBaseName = path.basename(dest) - if (funcName === 'move' && - srcBaseName !== destBaseName && - srcBaseName.toLowerCase() === destBaseName.toLowerCase()) { - return { srcStat, destStat, isChangingCase: true } - } - throw new Error('Source and destination must not be the same.') - } - if (srcStat.isDirectory() && !destStat.isDirectory()) { - throw new Error(`Cannot overwrite non-directory '${dest}' with directory '${src}'.`) - } - if (!srcStat.isDirectory() && destStat.isDirectory()) { - throw new Error(`Cannot overwrite directory '${dest}' with non-directory '${src}'.`) - } - } - - if (srcStat.isDirectory() && isSrcSubdir(src, dest)) { - throw new Error(errMsg(src, dest, funcName)) - } - - return { srcStat, destStat } -} - -function checkPathsSync (src, dest, funcName, opts) { - const { srcStat, destStat } = getStatsSync(src, dest, opts) - - if (destStat) { - if (areIdentical(srcStat, destStat)) { - const srcBaseName = path.basename(src) - const destBaseName = path.basename(dest) - if (funcName === 'move' && - srcBaseName !== destBaseName && - srcBaseName.toLowerCase() === destBaseName.toLowerCase()) { - return { srcStat, destStat, isChangingCase: true } - } - throw new Error('Source and destination must not be the same.') - } - if (srcStat.isDirectory() && !destStat.isDirectory()) { - throw new Error(`Cannot overwrite non-directory '${dest}' with directory '${src}'.`) - } - if (!srcStat.isDirectory() && destStat.isDirectory()) { - throw new Error(`Cannot overwrite directory '${dest}' with non-directory '${src}'.`) - } - } - - if (srcStat.isDirectory() && isSrcSubdir(src, dest)) { - throw new Error(errMsg(src, dest, funcName)) - } - return { srcStat, destStat } -} - -// recursively check if dest parent is a subdirectory of src. -// It works for all file types including symlinks since it -// checks the src and dest inodes. It starts from the deepest -// parent and stops once it reaches the src parent or the root path. -async function checkParentPaths (src, srcStat, dest, funcName) { - const srcParent = path.resolve(path.dirname(src)) - const destParent = path.resolve(path.dirname(dest)) - if (destParent === srcParent || destParent === path.parse(destParent).root) return - - let destStat - try { - destStat = await fs.stat(destParent, { bigint: true }) - } catch (err) { - if (err.code === 'ENOENT') return - throw err - } - - if (areIdentical(srcStat, destStat)) { - throw new Error(errMsg(src, dest, funcName)) - } - - return checkParentPaths(src, srcStat, destParent, funcName) -} - -function checkParentPathsSync (src, srcStat, dest, funcName) { - const srcParent = path.resolve(path.dirname(src)) - const destParent = path.resolve(path.dirname(dest)) - if (destParent === srcParent || destParent === path.parse(destParent).root) return - let destStat - try { - destStat = fs.statSync(destParent, { bigint: true }) - } catch (err) { - if (err.code === 'ENOENT') return - throw err - } - if (areIdentical(srcStat, destStat)) { - throw new Error(errMsg(src, dest, funcName)) - } - return checkParentPathsSync(src, srcStat, destParent, funcName) -} - -function areIdentical (srcStat, destStat) { - return destStat.ino && destStat.dev && destStat.ino === srcStat.ino && destStat.dev === srcStat.dev -} - -// return true if dest is a subdir of src, otherwise false. -// It only checks the path strings. -function isSrcSubdir (src, dest) { - const srcArr = path.resolve(src).split(path.sep).filter(i => i) - const destArr = path.resolve(dest).split(path.sep).filter(i => i) - return srcArr.every((cur, i) => destArr[i] === cur) -} - -function errMsg (src, dest, funcName) { - return `Cannot ${funcName} '${src}' to a subdirectory of itself, '${dest}'.` -} - -module.exports = { - // checkPaths - checkPaths: u(checkPaths), - checkPathsSync, - // checkParent - checkParentPaths: u(checkParentPaths), - checkParentPathsSync, - // Misc - isSrcSubdir, - areIdentical -} - - -/***/ }), -/* 27 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -const fs = __webpack_require__(10) -const path = __webpack_require__(3) -const mkdirsSync = (__webpack_require__(21).mkdirsSync) -const utimesMillisSync = (__webpack_require__(25).utimesMillisSync) -const stat = __webpack_require__(26) - -function copySync (src, dest, opts) { - if (typeof opts === 'function') { - opts = { filter: opts } - } - - opts = opts || {} - opts.clobber = 'clobber' in opts ? !!opts.clobber : true // default to true for now - opts.overwrite = 'overwrite' in opts ? !!opts.overwrite : opts.clobber // overwrite falls back to clobber - - // Warn about using preserveTimestamps on 32-bit node - if (opts.preserveTimestamps && process.arch === 'ia32') { - process.emitWarning( - 'Using the preserveTimestamps option in 32-bit node is not recommended;\n\n' + - '\tsee https://github.com/jprichardson/node-fs-extra/issues/269', - 'Warning', 'fs-extra-WARN0002' - ) - } - - const { srcStat, destStat } = stat.checkPathsSync(src, dest, 'copy', opts) - stat.checkParentPathsSync(src, srcStat, dest, 'copy') - if (opts.filter && !opts.filter(src, dest)) return - const destParent = path.dirname(dest) - if (!fs.existsSync(destParent)) mkdirsSync(destParent) - return getStats(destStat, src, dest, opts) -} - -function getStats (destStat, src, dest, opts) { - const statSync = opts.dereference ? fs.statSync : fs.lstatSync - const srcStat = statSync(src) - - if (srcStat.isDirectory()) return onDir(srcStat, destStat, src, dest, opts) - else if (srcStat.isFile() || - srcStat.isCharacterDevice() || - srcStat.isBlockDevice()) return onFile(srcStat, destStat, src, dest, opts) - else if (srcStat.isSymbolicLink()) return onLink(destStat, src, dest, opts) - else if (srcStat.isSocket()) throw new Error(`Cannot copy a socket file: ${src}`) - else if (srcStat.isFIFO()) throw new Error(`Cannot copy a FIFO pipe: ${src}`) - throw new Error(`Unknown file: ${src}`) -} - -function onFile (srcStat, destStat, src, dest, opts) { - if (!destStat) return copyFile(srcStat, src, dest, opts) - return mayCopyFile(srcStat, src, dest, opts) -} - -function mayCopyFile (srcStat, src, dest, opts) { - if (opts.overwrite) { - fs.unlinkSync(dest) - return copyFile(srcStat, src, dest, opts) - } else if (opts.errorOnExist) { - throw new Error(`'${dest}' already exists`) - } -} - -function copyFile (srcStat, src, dest, opts) { - fs.copyFileSync(src, dest) - if (opts.preserveTimestamps) handleTimestamps(srcStat.mode, src, dest) - return setDestMode(dest, srcStat.mode) -} - -function handleTimestamps (srcMode, src, dest) { - // Make sure the file is writable before setting the timestamp - // otherwise open fails with EPERM when invoked with 'r+' - // (through utimes call) - if (fileIsNotWritable(srcMode)) makeFileWritable(dest, srcMode) - return setDestTimestamps(src, dest) -} - -function fileIsNotWritable (srcMode) { - return (srcMode & 0o200) === 0 -} - -function makeFileWritable (dest, srcMode) { - return setDestMode(dest, srcMode | 0o200) -} - -function setDestMode (dest, srcMode) { - return fs.chmodSync(dest, srcMode) -} - -function setDestTimestamps (src, dest) { - // The initial srcStat.atime cannot be trusted - // because it is modified by the read(2) system call - // (See https://nodejs.org/api/fs.html#fs_stat_time_values) - const updatedSrcStat = fs.statSync(src) - return utimesMillisSync(dest, updatedSrcStat.atime, updatedSrcStat.mtime) -} - -function onDir (srcStat, destStat, src, dest, opts) { - if (!destStat) return mkDirAndCopy(srcStat.mode, src, dest, opts) - return copyDir(src, dest, opts) -} - -function mkDirAndCopy (srcMode, src, dest, opts) { - fs.mkdirSync(dest) - copyDir(src, dest, opts) - return setDestMode(dest, srcMode) -} - -function copyDir (src, dest, opts) { - fs.readdirSync(src).forEach(item => copyDirItem(item, src, dest, opts)) -} - -function copyDirItem (item, src, dest, opts) { - const srcItem = path.join(src, item) - const destItem = path.join(dest, item) - if (opts.filter && !opts.filter(srcItem, destItem)) return - const { destStat } = stat.checkPathsSync(srcItem, destItem, 'copy', opts) - return getStats(destStat, srcItem, destItem, opts) -} - -function onLink (destStat, src, dest, opts) { - let resolvedSrc = fs.readlinkSync(src) - if (opts.dereference) { - resolvedSrc = path.resolve(process.cwd(), resolvedSrc) - } - - if (!destStat) { - return fs.symlinkSync(resolvedSrc, dest) - } else { - let resolvedDest - try { - resolvedDest = fs.readlinkSync(dest) - } catch (err) { - // dest exists and is a regular file or directory, - // Windows may throw UNKNOWN error. If dest already exists, - // fs throws error anyway, so no need to guard against it here. - if (err.code === 'EINVAL' || err.code === 'UNKNOWN') return fs.symlinkSync(resolvedSrc, dest) - throw err - } - if (opts.dereference) { - resolvedDest = path.resolve(process.cwd(), resolvedDest) - } - if (stat.isSrcSubdir(resolvedSrc, resolvedDest)) { - throw new Error(`Cannot copy '${resolvedSrc}' to a subdirectory of itself, '${resolvedDest}'.`) - } - - // prevent copy if src is a subdir of dest since unlinking - // dest in this case would result in removing src contents - // and therefore a broken symlink would be created. - if (stat.isSrcSubdir(resolvedDest, resolvedSrc)) { - throw new Error(`Cannot overwrite '${resolvedDest}' with '${resolvedSrc}'.`) - } - return copyLink(resolvedSrc, dest) - } -} - -function copyLink (resolvedSrc, dest) { - fs.unlinkSync(dest) - return fs.symlinkSync(resolvedSrc, dest) -} - -module.exports = copySync - - -/***/ }), -/* 28 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -const u = (__webpack_require__(9).fromPromise) -const fs = __webpack_require__(8) -const path = __webpack_require__(3) -const mkdir = __webpack_require__(21) -const remove = __webpack_require__(29) - -const emptyDir = u(async function emptyDir (dir) { - let items - try { - items = await fs.readdir(dir) - } catch { - return mkdir.mkdirs(dir) - } - - return Promise.all(items.map(item => remove.remove(path.join(dir, item)))) -}) - -function emptyDirSync (dir) { - let items - try { - items = fs.readdirSync(dir) - } catch { - return mkdir.mkdirsSync(dir) - } - - items.forEach(item => { - item = path.join(dir, item) - remove.removeSync(item) - }) -} - -module.exports = { - emptyDirSync, - emptydirSync: emptyDirSync, - emptyDir, - emptydir: emptyDir -} - - -/***/ }), -/* 29 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -const fs = __webpack_require__(10) -const u = (__webpack_require__(9).fromCallback) - -function remove (path, callback) { - fs.rm(path, { recursive: true, force: true }, callback) -} - -function removeSync (path) { - fs.rmSync(path, { recursive: true, force: true }) -} - -module.exports = { - remove: u(remove), - removeSync -} - - -/***/ }), -/* 30 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -const { createFile, createFileSync } = __webpack_require__(31) -const { createLink, createLinkSync } = __webpack_require__(32) -const { createSymlink, createSymlinkSync } = __webpack_require__(33) - -module.exports = { - // file - createFile, - createFileSync, - ensureFile: createFile, - ensureFileSync: createFileSync, - // link - createLink, - createLinkSync, - ensureLink: createLink, - ensureLinkSync: createLinkSync, - // symlink - createSymlink, - createSymlinkSync, - ensureSymlink: createSymlink, - ensureSymlinkSync: createSymlinkSync -} - - -/***/ }), -/* 31 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -const u = (__webpack_require__(9).fromPromise) -const path = __webpack_require__(3) -const fs = __webpack_require__(8) -const mkdir = __webpack_require__(21) - -async function createFile (file) { - let stats - try { - stats = await fs.stat(file) - } catch { } - if (stats && stats.isFile()) return - - const dir = path.dirname(file) - - let dirStats = null - try { - dirStats = await fs.stat(dir) - } catch (err) { - // if the directory doesn't exist, make it - if (err.code === 'ENOENT') { - await mkdir.mkdirs(dir) - await fs.writeFile(file, '') - return - } else { - throw err - } - } - - if (dirStats.isDirectory()) { - await fs.writeFile(file, '') - } else { - // parent is not a directory - // This is just to cause an internal ENOTDIR error to be thrown - await fs.readdir(dir) - } -} - -function createFileSync (file) { - let stats - try { - stats = fs.statSync(file) - } catch { } - if (stats && stats.isFile()) return - - const dir = path.dirname(file) - try { - if (!fs.statSync(dir).isDirectory()) { - // parent is not a directory - // This is just to cause an internal ENOTDIR error to be thrown - fs.readdirSync(dir) - } - } catch (err) { - // If the stat call above failed because the directory doesn't exist, create it - if (err && err.code === 'ENOENT') mkdir.mkdirsSync(dir) - else throw err - } - - fs.writeFileSync(file, '') -} - -module.exports = { - createFile: u(createFile), - createFileSync -} - - -/***/ }), -/* 32 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -const u = (__webpack_require__(9).fromPromise) -const path = __webpack_require__(3) -const fs = __webpack_require__(8) -const mkdir = __webpack_require__(21) -const { pathExists } = __webpack_require__(24) -const { areIdentical } = __webpack_require__(26) - -async function createLink (srcpath, dstpath) { - let dstStat - try { - dstStat = await fs.lstat(dstpath) - } catch { - // ignore error - } - - let srcStat - try { - srcStat = await fs.lstat(srcpath) - } catch (err) { - err.message = err.message.replace('lstat', 'ensureLink') - throw err - } - - if (dstStat && areIdentical(srcStat, dstStat)) return - - const dir = path.dirname(dstpath) - - const dirExists = await pathExists(dir) - - if (!dirExists) { - await mkdir.mkdirs(dir) - } - - await fs.link(srcpath, dstpath) -} - -function createLinkSync (srcpath, dstpath) { - let dstStat - try { - dstStat = fs.lstatSync(dstpath) - } catch {} - - try { - const srcStat = fs.lstatSync(srcpath) - if (dstStat && areIdentical(srcStat, dstStat)) return - } catch (err) { - err.message = err.message.replace('lstat', 'ensureLink') - throw err - } - - const dir = path.dirname(dstpath) - const dirExists = fs.existsSync(dir) - if (dirExists) return fs.linkSync(srcpath, dstpath) - mkdir.mkdirsSync(dir) - - return fs.linkSync(srcpath, dstpath) -} - -module.exports = { - createLink: u(createLink), - createLinkSync -} - - -/***/ }), -/* 33 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -const u = (__webpack_require__(9).fromPromise) -const path = __webpack_require__(3) -const fs = __webpack_require__(8) - -const { mkdirs, mkdirsSync } = __webpack_require__(21) - -const { symlinkPaths, symlinkPathsSync } = __webpack_require__(34) -const { symlinkType, symlinkTypeSync } = __webpack_require__(35) - -const { pathExists } = __webpack_require__(24) - -const { areIdentical } = __webpack_require__(26) - -async function createSymlink (srcpath, dstpath, type) { - let stats - try { - stats = await fs.lstat(dstpath) - } catch { } - - if (stats && stats.isSymbolicLink()) { - const [srcStat, dstStat] = await Promise.all([ - fs.stat(srcpath), - fs.stat(dstpath) - ]) - - if (areIdentical(srcStat, dstStat)) return - } - - const relative = await symlinkPaths(srcpath, dstpath) - srcpath = relative.toDst - const toType = await symlinkType(relative.toCwd, type) - const dir = path.dirname(dstpath) - - if (!(await pathExists(dir))) { - await mkdirs(dir) - } - - return fs.symlink(srcpath, dstpath, toType) -} - -function createSymlinkSync (srcpath, dstpath, type) { - let stats - try { - stats = fs.lstatSync(dstpath) - } catch { } - if (stats && stats.isSymbolicLink()) { - const srcStat = fs.statSync(srcpath) - const dstStat = fs.statSync(dstpath) - if (areIdentical(srcStat, dstStat)) return - } - - const relative = symlinkPathsSync(srcpath, dstpath) - srcpath = relative.toDst - type = symlinkTypeSync(relative.toCwd, type) - const dir = path.dirname(dstpath) - const exists = fs.existsSync(dir) - if (exists) return fs.symlinkSync(srcpath, dstpath, type) - mkdirsSync(dir) - return fs.symlinkSync(srcpath, dstpath, type) -} - -module.exports = { - createSymlink: u(createSymlink), - createSymlinkSync -} - - -/***/ }), -/* 34 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -const path = __webpack_require__(3) -const fs = __webpack_require__(8) -const { pathExists } = __webpack_require__(24) - -const u = (__webpack_require__(9).fromPromise) - -/** - * Function that returns two types of paths, one relative to symlink, and one - * relative to the current working directory. Checks if path is absolute or - * relative. If the path is relative, this function checks if the path is - * relative to symlink or relative to current working directory. This is an - * initiative to find a smarter `srcpath` to supply when building symlinks. - * This allows you to determine which path to use out of one of three possible - * types of source paths. The first is an absolute path. This is detected by - * `path.isAbsolute()`. When an absolute path is provided, it is checked to - * see if it exists. If it does it's used, if not an error is returned - * (callback)/ thrown (sync). The other two options for `srcpath` are a - * relative url. By default Node's `fs.symlink` works by creating a symlink - * using `dstpath` and expects the `srcpath` to be relative to the newly - * created symlink. If you provide a `srcpath` that does not exist on the file - * system it results in a broken symlink. To minimize this, the function - * checks to see if the 'relative to symlink' source file exists, and if it - * does it will use it. If it does not, it checks if there's a file that - * exists that is relative to the current working directory, if does its used. - * This preserves the expectations of the original fs.symlink spec and adds - * the ability to pass in `relative to current working direcotry` paths. - */ - -async function symlinkPaths (srcpath, dstpath) { - if (path.isAbsolute(srcpath)) { - try { - await fs.lstat(srcpath) - } catch (err) { - err.message = err.message.replace('lstat', 'ensureSymlink') - throw err - } - - return { - toCwd: srcpath, - toDst: srcpath - } - } - - const dstdir = path.dirname(dstpath) - const relativeToDst = path.join(dstdir, srcpath) - - const exists = await pathExists(relativeToDst) - if (exists) { - return { - toCwd: relativeToDst, - toDst: srcpath - } - } - - try { - await fs.lstat(srcpath) - } catch (err) { - err.message = err.message.replace('lstat', 'ensureSymlink') - throw err - } - - return { - toCwd: srcpath, - toDst: path.relative(dstdir, srcpath) - } -} - -function symlinkPathsSync (srcpath, dstpath) { - if (path.isAbsolute(srcpath)) { - const exists = fs.existsSync(srcpath) - if (!exists) throw new Error('absolute srcpath does not exist') - return { - toCwd: srcpath, - toDst: srcpath - } - } - - const dstdir = path.dirname(dstpath) - const relativeToDst = path.join(dstdir, srcpath) - const exists = fs.existsSync(relativeToDst) - if (exists) { - return { - toCwd: relativeToDst, - toDst: srcpath - } - } - - const srcExists = fs.existsSync(srcpath) - if (!srcExists) throw new Error('relative srcpath does not exist') - return { - toCwd: srcpath, - toDst: path.relative(dstdir, srcpath) - } -} - -module.exports = { - symlinkPaths: u(symlinkPaths), - symlinkPathsSync -} - - -/***/ }), -/* 35 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -const fs = __webpack_require__(8) -const u = (__webpack_require__(9).fromPromise) - -async function symlinkType (srcpath, type) { - if (type) return type - - let stats - try { - stats = await fs.lstat(srcpath) - } catch { - return 'file' - } - - return (stats && stats.isDirectory()) ? 'dir' : 'file' -} - -function symlinkTypeSync (srcpath, type) { - if (type) return type - - let stats - try { - stats = fs.lstatSync(srcpath) - } catch { - return 'file' - } - return (stats && stats.isDirectory()) ? 'dir' : 'file' -} - -module.exports = { - symlinkType: u(symlinkType), - symlinkTypeSync -} - - -/***/ }), -/* 36 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -const u = (__webpack_require__(9).fromPromise) -const jsonFile = __webpack_require__(37) - -jsonFile.outputJson = u(__webpack_require__(40)) -jsonFile.outputJsonSync = __webpack_require__(42) -// aliases -jsonFile.outputJSON = jsonFile.outputJson -jsonFile.outputJSONSync = jsonFile.outputJsonSync -jsonFile.writeJSON = jsonFile.writeJson -jsonFile.writeJSONSync = jsonFile.writeJsonSync -jsonFile.readJSON = jsonFile.readJson -jsonFile.readJSONSync = jsonFile.readJsonSync - -module.exports = jsonFile - - -/***/ }), -/* 37 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -const jsonFile = __webpack_require__(38) - -module.exports = { - // jsonfile exports - readJson: jsonFile.readFile, - readJsonSync: jsonFile.readFileSync, - writeJson: jsonFile.writeFile, - writeJsonSync: jsonFile.writeFileSync -} - - -/***/ }), -/* 38 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -let _fs -try { - _fs = __webpack_require__(10) -} catch (_) { - _fs = __webpack_require__(11) -} -const universalify = __webpack_require__(9) -const { stringify, stripBom } = __webpack_require__(39) - -async function _readFile (file, options = {}) { - if (typeof options === 'string') { - options = { encoding: options } - } - - const fs = options.fs || _fs - - const shouldThrow = 'throws' in options ? options.throws : true - - let data = await universalify.fromCallback(fs.readFile)(file, options) - - data = stripBom(data) - - let obj - try { - obj = JSON.parse(data, options ? options.reviver : null) - } catch (err) { - if (shouldThrow) { - err.message = `${file}: ${err.message}` - throw err - } else { - return null - } - } - - return obj -} - -const readFile = universalify.fromPromise(_readFile) - -function readFileSync (file, options = {}) { - if (typeof options === 'string') { - options = { encoding: options } - } - - const fs = options.fs || _fs - - const shouldThrow = 'throws' in options ? options.throws : true - - try { - let content = fs.readFileSync(file, options) - content = stripBom(content) - return JSON.parse(content, options.reviver) - } catch (err) { - if (shouldThrow) { - err.message = `${file}: ${err.message}` - throw err - } else { - return null - } - } -} - -async function _writeFile (file, obj, options = {}) { - const fs = options.fs || _fs - - const str = stringify(obj, options) - - await universalify.fromCallback(fs.writeFile)(file, str, options) -} - -const writeFile = universalify.fromPromise(_writeFile) - -function writeFileSync (file, obj, options = {}) { - const fs = options.fs || _fs - - const str = stringify(obj, options) - // not sure if fs.writeFileSync returns anything, but just in case - return fs.writeFileSync(file, str, options) -} - -const jsonfile = { - readFile, - readFileSync, - writeFile, - writeFileSync -} - -module.exports = jsonfile - - -/***/ }), -/* 39 */ -/***/ ((module) => { - -function stringify (obj, { EOL = '\n', finalEOL = true, replacer = null, spaces } = {}) { - const EOF = finalEOL ? EOL : '' - const str = JSON.stringify(obj, replacer, spaces) - - return str.replace(/\n/g, EOL) + EOF -} - -function stripBom (content) { - // we do this because JSON.parse would convert it to a utf8 string if encoding wasn't specified - if (Buffer.isBuffer(content)) content = content.toString('utf8') - return content.replace(/^\uFEFF/, '') -} - -module.exports = { stringify, stripBom } - - -/***/ }), -/* 40 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -const { stringify } = __webpack_require__(39) -const { outputFile } = __webpack_require__(41) - -async function outputJson (file, data, options = {}) { - const str = stringify(data, options) - - await outputFile(file, str, options) -} - -module.exports = outputJson - - -/***/ }), -/* 41 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -const u = (__webpack_require__(9).fromPromise) -const fs = __webpack_require__(8) -const path = __webpack_require__(3) -const mkdir = __webpack_require__(21) -const pathExists = (__webpack_require__(24).pathExists) - -async function outputFile (file, data, encoding = 'utf-8') { - const dir = path.dirname(file) - - if (!(await pathExists(dir))) { - await mkdir.mkdirs(dir) - } - - return fs.writeFile(file, data, encoding) -} - -function outputFileSync (file, ...args) { - const dir = path.dirname(file) - if (!fs.existsSync(dir)) { - mkdir.mkdirsSync(dir) - } - - fs.writeFileSync(file, ...args) -} - -module.exports = { - outputFile: u(outputFile), - outputFileSync -} - - -/***/ }), -/* 42 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -const { stringify } = __webpack_require__(39) -const { outputFileSync } = __webpack_require__(41) - -function outputJsonSync (file, data, options) { - const str = stringify(data, options) - - outputFileSync(file, str, options) -} - -module.exports = outputJsonSync - - -/***/ }), -/* 43 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -const u = (__webpack_require__(9).fromPromise) -module.exports = { - move: u(__webpack_require__(44)), - moveSync: __webpack_require__(45) -} - - -/***/ }), -/* 44 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -const fs = __webpack_require__(8) -const path = __webpack_require__(3) -const { copy } = __webpack_require__(19) -const { remove } = __webpack_require__(29) -const { mkdirp } = __webpack_require__(21) -const { pathExists } = __webpack_require__(24) -const stat = __webpack_require__(26) - -async function move (src, dest, opts = {}) { - const overwrite = opts.overwrite || opts.clobber || false - - const { srcStat, isChangingCase = false } = await stat.checkPaths(src, dest, 'move', opts) - - await stat.checkParentPaths(src, srcStat, dest, 'move') - - // If the parent of dest is not root, make sure it exists before proceeding - const destParent = path.dirname(dest) - const parsedParentPath = path.parse(destParent) - if (parsedParentPath.root !== destParent) { - await mkdirp(destParent) - } - - return doRename(src, dest, overwrite, isChangingCase) -} - -async function doRename (src, dest, overwrite, isChangingCase) { - if (!isChangingCase) { - if (overwrite) { - await remove(dest) - } else if (await pathExists(dest)) { - throw new Error('dest already exists.') - } - } - - try { - // Try w/ rename first, and try copy + remove if EXDEV - await fs.rename(src, dest) - } catch (err) { - if (err.code !== 'EXDEV') { - throw err - } - await moveAcrossDevice(src, dest, overwrite) - } -} - -async function moveAcrossDevice (src, dest, overwrite) { - const opts = { - overwrite, - errorOnExist: true, - preserveTimestamps: true - } - - await copy(src, dest, opts) - return remove(src) -} - -module.exports = move - - -/***/ }), -/* 45 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -const fs = __webpack_require__(10) -const path = __webpack_require__(3) -const copySync = (__webpack_require__(19).copySync) -const removeSync = (__webpack_require__(29).removeSync) -const mkdirpSync = (__webpack_require__(21).mkdirpSync) -const stat = __webpack_require__(26) - -function moveSync (src, dest, opts) { - opts = opts || {} - const overwrite = opts.overwrite || opts.clobber || false - - const { srcStat, isChangingCase = false } = stat.checkPathsSync(src, dest, 'move', opts) - stat.checkParentPathsSync(src, srcStat, dest, 'move') - if (!isParentRoot(dest)) mkdirpSync(path.dirname(dest)) - return doRename(src, dest, overwrite, isChangingCase) -} - -function isParentRoot (dest) { - const parent = path.dirname(dest) - const parsedPath = path.parse(parent) - return parsedPath.root === parent -} - -function doRename (src, dest, overwrite, isChangingCase) { - if (isChangingCase) return rename(src, dest, overwrite) - if (overwrite) { - removeSync(dest) - return rename(src, dest, overwrite) - } - if (fs.existsSync(dest)) throw new Error('dest already exists.') - return rename(src, dest, overwrite) -} - -function rename (src, dest, overwrite) { - try { - fs.renameSync(src, dest) - } catch (err) { - if (err.code !== 'EXDEV') throw err - return moveAcrossDevice(src, dest, overwrite) - } -} - -function moveAcrossDevice (src, dest, overwrite) { - const opts = { - overwrite, - errorOnExist: true, - preserveTimestamps: true - } - copySync(src, dest, opts) - return removeSync(src) -} - -module.exports = moveSync - - -/***/ }), -/* 46 */ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - -"use strict"; - -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -const vscode = __importStar(__webpack_require__(1)); -const environmentPath_1 = __webpack_require__(2); -const localize_1 = __importDefault(__webpack_require__(47)); -const customConfig_model_1 = __webpack_require__(48); -const extensionConfig_model_1 = __webpack_require__(49); -const localConfig_model_1 = __webpack_require__(50); -const autoUpload_service_1 = __webpack_require__(51); -const file_service_1 = __webpack_require__(255); -const webview_service_1 = __webpack_require__(261); -const state_1 = __webpack_require__(5); -class Commons { - static outputChannel = null; - static LogException(error, message, msgBox, callback) { - if (error) { - console.error(error); - if (error.status === 500) { - message = (0, localize_1.default)("common.error.connection"); - msgBox = false; - } - else if (error.status === 401) { - msgBox = true; - message = (0, localize_1.default)("common.error.invalidToken"); - } - else if (error.status === 4) { - message = (0, localize_1.default)("common.error.canNotSave"); - } - else if (error.message) { - try { - message = JSON.parse(error.message).message; - if (message.toLowerCase() === "not found") { - msgBox = true; - message = (0, localize_1.default)("common.error.invalidGistId"); - } - } - catch (error) { - // message = error.message; - } - } - } - if (msgBox === true) { - vscode.window.showErrorMessage(message); - vscode.window.setStatusBarMessage("").dispose(); - } - else { - vscode.window.setStatusBarMessage(message, 5000); - } - if (callback) { - callback.apply(this); - } - } - static GetInputBox(token) { - if (token) { - const options = { - placeHolder: (0, localize_1.default)("common.placeholder.enterGithubAccessToken"), - password: false, - prompt: (0, localize_1.default)("common.prompt.enterGithubAccessToken"), - ignoreFocusOut: true - }; - return options; - } - else { - const options = { - placeHolder: (0, localize_1.default)("common.placeholder.enterGistId"), - password: false, - prompt: (0, localize_1.default)("common.prompt.enterGistId"), - ignoreFocusOut: true - }; - return options; - } - } - autoUploadService; - webviewService = new webview_service_1.WebviewService(); - ERROR_MESSAGE = (0, localize_1.default)("common.error.message"); - constructor() { - this.InitializeAutoUpload(); - } - async InitializeAutoUpload() { - const ignored = autoUpload_service_1.AutoUploadService.GetIgnoredItems(await this.GetCustomSettings()); - this.autoUploadService = new autoUpload_service_1.AutoUploadService(ignored); - } - async HandleStartWatching() { - if (this.autoUploadService) { - this.autoUploadService.StartWatching(); - } - else { - await this.InitializeAutoUpload(); - this.HandleStartWatching(); - } - } - async HandleStopWatching() { - if (this.autoUploadService) { - this.autoUploadService.StopWatching(); - } - else { - await this.InitializeAutoUpload(); - this.HandleStopWatching(); - } - } - async InitalizeSettings() { - const settings = new localConfig_model_1.LocalConfig(); - const extSettings = this.GetSettings(); - const cusSettings = await this.GetCustomSettings(); - settings.customConfig = cusSettings; - settings.extConfig = extSettings; - return settings; - } - async GetCustomSettings() { - let customSettings = new customConfig_model_1.CustomConfig(); - try { - const customExist = await file_service_1.FileService.FileExists(state_1.state.environment.FILE_CUSTOMIZEDSETTINGS); - if (customExist) { - const customSettingStr = await file_service_1.FileService.ReadFile(state_1.state.environment.FILE_CUSTOMIZEDSETTINGS); - const tempObj = JSON.parse(customSettingStr); - Object.assign(customSettings, tempObj); - customSettings.token = customSettings.token.trim(); - } - } - catch (e) { - customSettings = null; - Commons.LogException(e, "Sync : Unable to read " + - state_1.state.environment.FILE_CUSTOMIZEDSETTINGS_NAME + - ". Make sure its Valid JSON.", true); - vscode.commands.executeCommand("vscode.open", vscode.Uri.parse("http://shanalikhan.github.io/2017/02/19/Option-to-ignore-settings-folders-code-settings-sync.html")); - } - return customSettings; - } - async SetCustomSettings(setting) { - try { - await file_service_1.FileService.WriteFile(state_1.state.environment.FILE_CUSTOMIZEDSETTINGS, JSON.stringify(setting, null, 4)); - return true; - } - catch (e) { - Commons.LogException(e, "Sync : Unable to write " + - state_1.state.environment.FILE_CUSTOMIZEDSETTINGS_NAME, true); - return false; - } - } - async StartMigrationProcess() { - const fileExist = await file_service_1.FileService.FileExists(state_1.state.environment.FILE_CUSTOMIZEDSETTINGS); - let customSettings = null; - const firstTime = !fileExist; - let fileChanged = firstTime; - if (fileExist) { - customSettings = await this.GetCustomSettings(); - } - else { - customSettings = new customConfig_model_1.CustomConfig(); - } - // vscode.workspace.getConfiguration().update("sync.version", undefined, true); - if (firstTime) { - const openExtensionPage = (0, localize_1.default)("common.action.openExtPage"); - vscode.window.showInformationMessage((0, localize_1.default)("common.info.installed")); - vscode.window - .showInformationMessage((0, localize_1.default)("common.info.needHelp"), openExtensionPage) - .then((val) => { - if (val === openExtensionPage) { - vscode.commands.executeCommand("vscode.open", vscode.Uri.parse("https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync")); - } - }); - } - else if (customSettings.version < environmentPath_1.Environment.CURRENT_VERSION) { - fileChanged = true; - // #TODO : Remove this in new update - const newIgnoredList = new customConfig_model_1.CustomConfig().ignoreUploadFiles; - newIgnoredList.forEach(m => { - if (customSettings.ignoreUploadFiles.indexOf(m) === -1) { - customSettings.ignoreUploadFiles.push(m); - } - }); - if (state_1.state.context.globalState.get("synctoken")) { - const token = state_1.state.context.globalState.get("synctoken"); - if (token !== "") { - customSettings.token = String(token); - state_1.state.context.globalState.update("synctoken", ""); - vscode.window.showInformationMessage((0, localize_1.default)("common.info.setToken")); - } - } - const releaseNotes = (0, localize_1.default)("common.action.releaseNotes"); - const writeReview = (0, localize_1.default)("common.action.writeReview"); - const support = (0, localize_1.default)("common.action.support"); - const joinCommunity = (0, localize_1.default)("common.action.joinCommunity"); - if (!customSettings.disableUpdateMessage) { - vscode.window - .showInformationMessage((0, localize_1.default)("common.info.updateTo", environmentPath_1.Environment.getVersion()), releaseNotes, writeReview, support, joinCommunity) - .then((val) => { - if (val === releaseNotes) { - vscode.commands.executeCommand("vscode.open", vscode.Uri.parse("http://shanalikhan.github.io/2016/05/14/Visual-studio-code-sync-settings-release-notes.html")); - } - if (val === writeReview) { - vscode.commands.executeCommand("vscode.open", vscode.Uri.parse("https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync#review-details")); - } - if (val === support) { - vscode.commands.executeCommand("vscode.open", vscode.Uri.parse("https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=4W3EWHHBSYMM8&lc=IE&item_name=Code%20Settings%20Sync&item_number=visual%20studio%20code%20settings%20sync¤cy_code=USD&bn=PP-DonationsBF:btn_donate_SM.gif:NonHosted")); - } - if (val === joinCommunity) { - vscode.commands.executeCommand("vscode.open", vscode.Uri.parse("https://join.slack.com/t/codesettingssync/shared_invite/enQtNzQyODMzMzI5MDQ3LWNmZjVkZjE2YTg0MzY1Y2EyYzVmYThmNzg2YjZkNjhhZWY3ZTEzN2I3ZTAxMjkwNWU0ZjMyZGFhMjdiZDI3ODU")); - } - }); - } - } - if (fileChanged) { - customSettings.version = environmentPath_1.Environment.CURRENT_VERSION; - await this.SetCustomSettings(customSettings); - } - return true; - } - async SaveSettings(setting) { - const config = vscode.workspace.getConfiguration("sync"); - const allKeysUpdated = new Array(); - const keys = Object.keys(setting); - keys.forEach(async (keyName) => { - if (setting[keyName] == null) { - setting[keyName] = ""; - } - if (keyName.toLowerCase() !== "token") { - if (config.get(keyName) !== setting[keyName]) { - allKeysUpdated.push(config.update(keyName, setting[keyName], true)); - } - } - }); - try { - await Promise.all(allKeysUpdated); - if (state_1.state.context.globalState.get("syncCounter")) { - const counter = state_1.state.context.globalState.get("syncCounter"); - let count = parseInt(counter + "", 10); - if (count % 450 === 0) { - this.DonateMessage(); - } - count = count + 1; - state_1.state.context.globalState.update("syncCounter", count); - } - else { - state_1.state.context.globalState.update("syncCounter", 1); - } - return true; - } - catch (err) { - Commons.LogException(err, this.ERROR_MESSAGE, true); - return false; - } - } - async DonateMessage() { - const donateNow = (0, localize_1.default)("common.action.donate"); - const writeReview = (0, localize_1.default)("common.action.writeReview"); - const res = await vscode.window.showInformationMessage((0, localize_1.default)("common.info.donate"), donateNow, writeReview); - if (res === donateNow) { - vscode.commands.executeCommand("vscode.open", vscode.Uri.parse("https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=4W3EWHHBSYMM8&lc=IE&item_name=Code%20Settings%20Sync&item_number=visual%20studio%20code%20settings%20sync¤cy_code=USD&bn=PP-DonationsBF:btn_donate_SM.gif:NonHosted")); - } - else if (res === writeReview) { - vscode.commands.executeCommand("vscode.open", vscode.Uri.parse("https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync#review-details")); - } - } - GetSettings() { - const settings = new extensionConfig_model_1.ExtensionConfig(); - for (const key of Object.keys(settings)) { - if (key !== "token") { - settings[key] = vscode.workspace.getConfiguration("sync").get(key); - } - } - settings.gist = settings.gist.trim(); - return settings; - } - async GetTokenAndSave(sett) { - const opt = Commons.GetInputBox(true); - const token = ((await vscode.window.showInputBox(opt)) || "").trim(); - if (token && token !== "esc") { - sett.token = token; - const saved = await this.SetCustomSettings(sett); - if (saved) { - vscode.window.setStatusBarMessage((0, localize_1.default)("common.info.tokenSaved"), 1000); - } - } - return token; - } - async GetGistAndSave(sett) { - const opt = Commons.GetInputBox(false); - const gist = ((await vscode.window.showInputBox(opt)) || "").trim(); - if (gist && gist !== "esc") { - sett.gist = gist; - const saved = await this.SaveSettings(sett); - if (saved) { - vscode.window.setStatusBarMessage((0, localize_1.default)("common.info.gistSaved"), 1000); - } - return gist; - } - } - /** - * IgnoreSettings - */ - async GetIgnoredSettings(settings) { - const ignoreSettings = {}; - const config = vscode.workspace.getConfiguration(); - const keysUpdated = []; - for (const key of settings) { - let keyValue = null; - keyValue = config.get(key, null); - if (keyValue !== null) { - ignoreSettings[key] = keyValue; - keysUpdated.push(config.update(key, undefined, true)); - } - } - await Promise.all(keysUpdated); - return ignoreSettings; - } - /** - * RestoreIgnoredSettings - */ - SetIgnoredSettings(ignoredSettings) { - const config = vscode.workspace.getConfiguration(); - const keysUpdated = []; - for (const key of Object.keys(ignoredSettings)) { - keysUpdated.push(config.update(key, ignoredSettings[key], true)); - } - } - /** - * AskGistDescription - */ - async AskGistDescription() { - return vscode.window.showInputBox({ - prompt: (0, localize_1.default)("common.prompt.multipleGist"), - ignoreFocusOut: true, - placeHolder: (0, localize_1.default)("common.placeholder.multipleGist") - }); - } - ShowSummaryOutput(upload, files, removedExtensions, addedExtensions, ignoredExtensions, syncSettings) { - if (Commons.outputChannel === null) { - Commons.outputChannel = vscode.window.createOutputChannel("Code Settings Sync"); - } - const outputChannel = Commons.outputChannel; - outputChannel.appendLine(`CODE SETTINGS SYNC ${upload ? "UPLOAD" : "DOWNLOAD"} SUMMARY`); - outputChannel.appendLine(`Version: ${environmentPath_1.Environment.getVersion()}`); - outputChannel.appendLine(`--------------------`); - outputChannel.appendLine(`GitHub Token: ${syncSettings.customConfig.token - ? syncSettings.customConfig.token.slice(0, 4) + "**********" - : "Anonymous"}`); - outputChannel.appendLine(`GitHub Gist: ${syncSettings.extConfig.gist}`); - outputChannel.appendLine(`GitHub Gist Type: ${syncSettings.publicGist ? "Public" : "Secret"}`); - outputChannel.appendLine(``); - if (!syncSettings.customConfig.token) { - outputChannel.appendLine(`Anonymous Gist cannot be edited, the extension will always create a new one during upload.`); - } - outputChannel.appendLine(`Restarting Visual Studio Code may be required to apply color and file icon theme.`); - outputChannel.appendLine(`--------------------`); - outputChannel.appendLine(`Files ${upload ? "Upload" : "Download"}ed:`); - files - .filter(item => item.fileName.indexOf(".") > 0) - .forEach(item => { - outputChannel.appendLine(` ${item.fileName} > ${item.gistName}`); - }); - outputChannel.appendLine(``); - outputChannel.appendLine(`Extensions Ignored:`); - if (!ignoredExtensions || ignoredExtensions.length === 0) { - outputChannel.appendLine(` No extensions ignored.`); - } - else { - ignoredExtensions.forEach(extn => { - outputChannel.appendLine(` ${extn.name} v${extn.version}`); - }); - } - outputChannel.appendLine(``); - outputChannel.appendLine(`Extensions Removed:`); - if (!syncSettings.extConfig.removeExtensions) { - outputChannel.appendLine(` Feature Disabled.`); - } - else { - if (!removedExtensions || removedExtensions.length === 0) { - outputChannel.appendLine(` No extensions removed.`); - } - else { - removedExtensions.forEach(extn => { - outputChannel.appendLine(` ${extn.name} v${extn.version}`); - }); - } - } - if (addedExtensions) { - outputChannel.appendLine(``); - outputChannel.appendLine(`Extensions Added:`); - if (addedExtensions.length === 0) { - outputChannel.appendLine(` No extensions installed.`); - } - addedExtensions.forEach(extn => { - outputChannel.appendLine(` ${extn.name} v${extn.version}`); - }); - } - outputChannel.appendLine(`--------------------`); - outputChannel.append(`Done.`); - outputChannel.show(true); - } -} -exports["default"] = Commons; - - -/***/ }), -/* 47 */ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Localize = void 0; -const fs_extra_1 = __webpack_require__(7); -const path_1 = __webpack_require__(3); -const vscode_1 = __webpack_require__(1); -class Localize { - bundle = this.resolveLanguagePack(); - options; - localize(key, ...args) { - const message = this.bundle[key] || key; - return this.format(message, args); - } - init() { - try { - this.options = { - ...this.options, - ...JSON.parse(process.env.VSCODE_NLS_CONFIG || "{}") - }; - } - catch (err) { - throw err; - } - } - format(message, args = []) { - return args.length - ? message.replace(/\{(\d+)\}/g, (match, rest) => args[rest[0]] || match) - : message; - } - resolveLanguagePack() { - this.init(); - const languageFormat = "package.nls{0}.json"; - const defaultLanguage = languageFormat.replace("{0}", ""); - const rootPath = vscode_1.extensions.getExtension("Shan.code-settings-sync") - .extensionPath; - const resolvedLanguage = this.recurseCandidates(rootPath, languageFormat, this.options.locale); - const languageFilePath = (0, path_1.resolve)(rootPath, resolvedLanguage); - try { - const defaultLanguageBundle = JSON.parse(resolvedLanguage !== defaultLanguage - ? (0, fs_extra_1.readFileSync)((0, path_1.resolve)(rootPath, defaultLanguage), "utf-8") - : "{}"); - const resolvedLanguageBundle = JSON.parse((0, fs_extra_1.readFileSync)(languageFilePath, "utf-8")); - return { ...defaultLanguageBundle, ...resolvedLanguageBundle }; - } - catch (err) { - throw err; - } - } - recurseCandidates(rootPath, format, candidate) { - const filename = format.replace("{0}", `.${candidate}`); - const filepath = (0, path_1.resolve)(rootPath, filename); - if ((0, fs_extra_1.existsSync)(filepath)) { - return filename; - } - if (candidate.split("-")[0] !== candidate) { - return this.recurseCandidates(rootPath, format, candidate.split("-")[0]); - } - return format.replace("{0}", ""); - } -} -exports.Localize = Localize; -exports["default"] = Localize.prototype.localize.bind(new Localize()); - - -/***/ }), -/* 48 */ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.CustomConfig = void 0; -const environmentPath_1 = __webpack_require__(2); -class CustomConfig { - ignoreUploadFiles = [ - "state.*", - "syncLocalSettings.json", - ".DS_Store", - "sync.lock", - "projects.json", - "projects_cache_vscode.json", - "projects_cache_git.json", - "projects_cache_svn.json", - "gpm_projects.json", - "gpm-recentItems.json" - ]; - ignoreUploadFolders = ["workspaceStorage"]; - ignoreExtensions = []; - gistDescription = "Visual Studio Code Settings Sync Gist"; - version = environmentPath_1.Environment.CURRENT_VERSION; - token = ""; - downloadPublicGist = false; - supportedFileExtensions = ["json", "code-snippets"]; - openTokenLink = true; - disableUpdateMessage = false; - lastUpload = null; - lastDownload = null; - githubEnterpriseUrl = null; - askGistDescription = false; - customFiles = {}; - hostName = null; - universalKeybindings = false; - autoUploadDelay = 20; -} -exports.CustomConfig = CustomConfig; - - -/***/ }), -/* 49 */ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.ExtensionConfig = void 0; -class ExtensionConfig { - gist = null; - quietSync = false; - removeExtensions = true; - syncExtensions = true; - autoDownload = false; - autoUpload = false; - forceDownload = false; - forceUpload = false; -} -exports.ExtensionConfig = ExtensionConfig; - - -/***/ }), -/* 50 */ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.LocalConfig = void 0; -const customConfig_model_1 = __webpack_require__(48); -const extensionConfig_model_1 = __webpack_require__(49); -class LocalConfig { - publicGist = false; - userName = null; - name = null; - extConfig = new extensionConfig_model_1.ExtensionConfig(); - customConfig = new customConfig_model_1.CustomConfig(); -} -exports.LocalConfig = LocalConfig; - - -/***/ }), -/* 51 */ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - -"use strict"; - -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.AutoUploadService = void 0; -const vscode = __importStar(__webpack_require__(1)); -const vscode_chokidar_1 = __webpack_require__(52); -const localize_1 = __importDefault(__webpack_require__(47)); -const lockfile_1 = __importDefault(__webpack_require__(250)); -const state_1 = __webpack_require__(5); -const util_1 = __webpack_require__(254); -const file_service_1 = __webpack_require__(255); -class AutoUploadService { - ignored; - static GetIgnoredItems(customSettings) { - return [ - ...customSettings.ignoreUploadFolders.map(folder => `**/${folder}/**`), - ...customSettings.ignoreUploadFiles.map(file => `**/${file}`) - ]; - } - watching = false; - watcher = (0, vscode_chokidar_1.watch)(state_1.state.environment.USER_FOLDER, { - depth: 2, - ignored: this.ignored - }); - constructor(ignored) { - this.ignored = ignored; - vscode.extensions.onDidChange(async () => { - if (this.watching && vscode.window.state.focused) { - console.log("Sync: Extensions changed"); - if (await lockfile_1.default.Check(state_1.state.environment.FILE_SYNC_LOCK)) { - return; - } - else { - await lockfile_1.default.Lock(state_1.state.environment.FILE_SYNC_LOCK); - } - const customConfig = await state_1.state.commons.GetCustomSettings(); - if (!customConfig.downloadPublicGist) { - await this.InitiateAutoUpload(); - } - await lockfile_1.default.Unlock(state_1.state.environment.FILE_SYNC_LOCK); - return; - } - }); - } - async StartWatching() { - this.StopWatching(); - this.watching = true; - this.watcher.addListener("change", async (path) => { - if (this.watching && vscode.window.state.focused) { - console.log(`Sync: ${file_service_1.FileService.ExtractFileName(path)} changed`); - if (await lockfile_1.default.Check(state_1.state.environment.FILE_SYNC_LOCK)) { - return; - } - else { - await lockfile_1.default.Lock(state_1.state.environment.FILE_SYNC_LOCK); - } - const customConfig = await state_1.state.commons.GetCustomSettings(); - if (customConfig) { - const fileType = path - .substring(path.lastIndexOf("."), path.length) - .slice(1); - if (customConfig.supportedFileExtensions.includes(fileType) && - !customConfig.downloadPublicGist) { - await this.InitiateAutoUpload(); - } - } - await lockfile_1.default.Unlock(state_1.state.environment.FILE_SYNC_LOCK); - return; - } - }); - } - StopWatching() { - if (this.watcher) { - this.watcher.removeAllListeners(); - } - this.watching = false; - } - async InitiateAutoUpload() { - const customSettings = await state_1.state.commons.GetCustomSettings(); - vscode.window.setStatusBarMessage("").dispose(); - vscode.window.setStatusBarMessage((0, localize_1.default)("common.info.initAutoUpload").replace("{0}", customSettings.autoUploadDelay), 5000); - await util_1.Util.Sleep(customSettings.autoUploadDelay * 1000); - vscode.commands.executeCommand("extension.updateSettings", "forceUpdate"); - } -} -exports.AutoUploadService = AutoUploadService; - - -/***/ }), -/* 52 */ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -var EventEmitter = (__webpack_require__(53).EventEmitter); -var fs = __webpack_require__(11); -var sysPath = __webpack_require__(3); -var asyncEach = __webpack_require__(54); -var anymatch = __webpack_require__(55); -var globParent = __webpack_require__(63); -var isGlob = __webpack_require__(68); -var isAbsolute = __webpack_require__(69); -var inherits = __webpack_require__(70); -var braces = __webpack_require__(72); -var normalizePath = __webpack_require__(62); -var upath = __webpack_require__(187); - -var NodeFsHandler = __webpack_require__(188); -var FsEventsHandler = __webpack_require__(249); - -var arrify = function(value) { - if (value == null) return []; - return Array.isArray(value) ? value : [value]; -}; - -var flatten = function(list, result) { - if (result == null) result = []; - list.forEach(function(item) { - if (Array.isArray(item)) { - flatten(item, result); - } else { - result.push(item); - } - }); - return result; -}; - -// Little isString util for use in Array#every. -var isString = function(thing) { - return typeof thing === 'string'; -}; - -// Public: Main class. -// Watches files & directories for changes. -// -// * _opts - object, chokidar options hash -// -// Emitted events: -// `add`, `addDir`, `change`, `unlink`, `unlinkDir`, `all`, `error` -// -// Examples -// -// var watcher = new FSWatcher() -// .add(directories) -// .on('add', path => console.log('File', path, 'was added')) -// .on('change', path => console.log('File', path, 'was changed')) -// .on('unlink', path => console.log('File', path, 'was removed')) -// .on('all', (event, path) => console.log(path, ' emitted ', event)) -// -function FSWatcher(_opts) { - EventEmitter.call(this); - var opts = {}; - // in case _opts that is passed in is a frozen object - if (_opts) for (var opt in _opts) opts[opt] = _opts[opt]; - this._watched = Object.create(null); - this._closers = Object.create(null); - this._ignoredPaths = Object.create(null); - Object.defineProperty(this, '_globIgnored', { - get: function() { return Object.keys(this._ignoredPaths); } - }); - this.closed = false; - this._throttled = Object.create(null); - this._symlinkPaths = Object.create(null); - - function undef(key) { - return opts[key] === undefined; - } - - // Set up default options. - if (undef('persistent')) opts.persistent = true; - if (undef('ignoreInitial')) opts.ignoreInitial = false; - if (undef('ignorePermissionErrors')) opts.ignorePermissionErrors = false; - if (undef('interval')) opts.interval = 100; - if (undef('binaryInterval')) opts.binaryInterval = 300; - if (undef('disableGlobbing')) opts.disableGlobbing = false; - this.enableBinaryInterval = opts.binaryInterval !== opts.interval; - - // Enable fsevents on OS X when polling isn't explicitly enabled. - if (undef('useFsEvents')) opts.useFsEvents = !opts.usePolling; - - // If we can't use fsevents, ensure the options reflect it's disabled. - if (!FsEventsHandler.canUse()) opts.useFsEvents = false; - - // Use polling on Mac if not using fsevents. - // Other platforms use non-polling fs.watch. - if (undef('usePolling') && !opts.useFsEvents) { - opts.usePolling = process.platform === 'darwin'; - } - - // Global override (useful for end-developers that need to force polling for all - // instances of chokidar, regardless of usage/dependency depth) - var envPoll = process.env.CHOKIDAR_USEPOLLING; - if (envPoll !== undefined) { - var envLower = envPoll.toLowerCase(); - - if (envLower === 'false' || envLower === '0') { - opts.usePolling = false; - } else if (envLower === 'true' || envLower === '1') { - opts.usePolling = true; - } else { - opts.usePolling = !!envLower - } - } - var envInterval = process.env.CHOKIDAR_INTERVAL; - if (envInterval) { - opts.interval = parseInt(envInterval); - } - - // Editor atomic write normalization enabled by default with fs.watch - if (undef('atomic')) opts.atomic = !opts.usePolling && !opts.useFsEvents; - if (opts.atomic) this._pendingUnlinks = Object.create(null); - - if (undef('followSymlinks')) opts.followSymlinks = true; - - if (undef('awaitWriteFinish')) opts.awaitWriteFinish = false; - if (opts.awaitWriteFinish === true) opts.awaitWriteFinish = {}; - var awf = opts.awaitWriteFinish; - if (awf) { - if (!awf.stabilityThreshold) awf.stabilityThreshold = 2000; - if (!awf.pollInterval) awf.pollInterval = 100; - - this._pendingWrites = Object.create(null); - } - if (opts.ignored) opts.ignored = arrify(opts.ignored); - - this._isntIgnored = function(path, stat) { - return !this._isIgnored(path, stat); - }.bind(this); - - var readyCalls = 0; - this._emitReady = function() { - if (++readyCalls >= this._readyCount) { - this._emitReady = Function.prototype; - this._readyEmitted = true; - // use process.nextTick to allow time for listener to be bound - process.nextTick(this.emit.bind(this, 'ready')); - } - }.bind(this); - - this.options = opts; - - // You’re frozen when your heart’s not open. - Object.freeze(opts); -} - -inherits(FSWatcher, EventEmitter); - -// Common helpers -// -------------- - -// Private method: Normalize and emit events -// -// * event - string, type of event -// * path - string, file or directory path -// * val[1..3] - arguments to be passed with event -// -// Returns the error if defined, otherwise the value of the -// FSWatcher instance's `closed` flag -FSWatcher.prototype._emit = function(event, path, val1, val2, val3) { - if (this.options.cwd) path = sysPath.relative(this.options.cwd, path); - var args = [event, path]; - if (val3 !== undefined) args.push(val1, val2, val3); - else if (val2 !== undefined) args.push(val1, val2); - else if (val1 !== undefined) args.push(val1); - - var awf = this.options.awaitWriteFinish; - if (awf && this._pendingWrites[path]) { - this._pendingWrites[path].lastChange = new Date(); - return this; - } - - if (this.options.atomic) { - if (event === 'unlink') { - this._pendingUnlinks[path] = args; - setTimeout(function() { - Object.keys(this._pendingUnlinks).forEach(function(path) { - this.emit.apply(this, this._pendingUnlinks[path]); - this.emit.apply(this, ['all'].concat(this._pendingUnlinks[path])); - delete this._pendingUnlinks[path]; - }.bind(this)); - }.bind(this), typeof this.options.atomic === "number" - ? this.options.atomic - : 100); - return this; - } else if (event === 'add' && this._pendingUnlinks[path]) { - event = args[0] = 'change'; - delete this._pendingUnlinks[path]; - } - } - - var emitEvent = function() { - this.emit.apply(this, args); - if (event !== 'error') this.emit.apply(this, ['all'].concat(args)); - }.bind(this); - - if (awf && (event === 'add' || event === 'change') && this._readyEmitted) { - var awfEmit = function(err, stats) { - if (err) { - event = args[0] = 'error'; - args[1] = err; - emitEvent(); - } else if (stats) { - // if stats doesn't exist the file must have been deleted - if (args.length > 2) { - args[2] = stats; - } else { - args.push(stats); - } - emitEvent(); - } - }; - - this._awaitWriteFinish(path, awf.stabilityThreshold, event, awfEmit); - return this; - } - - if (event === 'change') { - if (!this._throttle('change', path, 50)) return this; - } - - if ( - this.options.alwaysStat && val1 === undefined && - (event === 'add' || event === 'addDir' || event === 'change') - ) { - var fullPath = this.options.cwd ? sysPath.join(this.options.cwd, path) : path; - fs.stat(fullPath, function(error, stats) { - // Suppress event when fs.stat fails, to avoid sending undefined 'stat' - if (error || !stats) return; - - args.push(stats); - emitEvent(); - }); - } else { - emitEvent(); - } - - return this; -}; - -// Private method: Common handler for errors -// -// * error - object, Error instance -// -// Returns the error if defined, otherwise the value of the -// FSWatcher instance's `closed` flag -FSWatcher.prototype._handleError = function(error) { - var code = error && error.code; - var ipe = this.options.ignorePermissionErrors; - if (error && - code !== 'ENOENT' && - code !== 'ENOTDIR' && - (!ipe || (code !== 'EPERM' && code !== 'EACCES')) - ) this.emit('error', error); - return error || this.closed; -}; - -// Private method: Helper utility for throttling -// -// * action - string, type of action being throttled -// * path - string, path being acted upon -// * timeout - int, duration of time to suppress duplicate actions -// -// Returns throttle tracking object or false if action should be suppressed -FSWatcher.prototype._throttle = function(action, path, timeout) { - if (!(action in this._throttled)) { - this._throttled[action] = Object.create(null); - } - var throttled = this._throttled[action]; - if (path in throttled) { - throttled[path].count++; - return false; - } - function clear() { - var count = throttled[path] ? throttled[path].count : 0; - delete throttled[path]; - clearTimeout(timeoutObject); - return count; - } - var timeoutObject = setTimeout(clear, timeout); - throttled[path] = {timeoutObject: timeoutObject, clear: clear, count: 0}; - return throttled[path]; -}; - -// Private method: Awaits write operation to finish -// -// * path - string, path being acted upon -// * threshold - int, time in milliseconds a file size must be fixed before -// acknowledging write operation is finished -// * awfEmit - function, to be called when ready for event to be emitted -// Polls a newly created file for size variations. When files size does not -// change for 'threshold' milliseconds calls callback. -FSWatcher.prototype._awaitWriteFinish = function(path, threshold, event, awfEmit) { - var timeoutHandler; - - var fullPath = path; - if (this.options.cwd && !isAbsolute(path)) { - fullPath = sysPath.join(this.options.cwd, path); - } - - var now = new Date(); - - var awaitWriteFinish = (function (prevStat) { - fs.stat(fullPath, function(err, curStat) { - if (err || !(path in this._pendingWrites)) { - if (err && err.code !== 'ENOENT') awfEmit(err); - return; - } - - var now = new Date(); - - if (prevStat && curStat.size != prevStat.size) { - this._pendingWrites[path].lastChange = now; - } - - if (now - this._pendingWrites[path].lastChange >= threshold) { - delete this._pendingWrites[path]; - awfEmit(null, curStat); - } else { - timeoutHandler = setTimeout( - awaitWriteFinish.bind(this, curStat), - this.options.awaitWriteFinish.pollInterval - ); - } - }.bind(this)); - }.bind(this)); - - if (!(path in this._pendingWrites)) { - this._pendingWrites[path] = { - lastChange: now, - cancelWait: function() { - delete this._pendingWrites[path]; - clearTimeout(timeoutHandler); - return event; - }.bind(this) - }; - timeoutHandler = setTimeout( - awaitWriteFinish.bind(this), - this.options.awaitWriteFinish.pollInterval - ); - } -}; - -// Private method: Determines whether user has asked to ignore this path -// -// * path - string, path to file or directory -// * stats - object, result of fs.stat -// -// Returns boolean -var dotRe = /\..*\.(sw[px])$|\~$|\.subl.*\.tmp/; -FSWatcher.prototype._isIgnored = function(path, stats) { - if (this.options.atomic && dotRe.test(path)) return true; - - if (!this._userIgnored) { - var cwd = this.options.cwd; - var ignored = this.options.ignored; - if (cwd && ignored) { - ignored = ignored.map(function (path) { - if (typeof path !== 'string') return path; - return upath.normalize(isAbsolute(path) ? path : sysPath.join(cwd, path)); - }); - } - var paths = arrify(ignored) - .filter(function(path) { - return typeof path === 'string' && !isGlob(path); - }).map(function(path) { - return path + '/**'; - }); - this._userIgnored = anymatch( - this._globIgnored.concat(ignored).concat(paths) - ); - } - - return this._userIgnored([path, stats]); -}; - -// Private method: Provides a set of common helpers and properties relating to -// symlink and glob handling -// -// * path - string, file, directory, or glob pattern being watched -// * depth - int, at any depth > 0, this isn't a glob -// -// Returns object containing helpers for this path -var replacerRe = /^\.[\/\\]/; -FSWatcher.prototype._getWatchHelpers = function(path, depth) { - path = path.replace(replacerRe, ''); - var watchPath = depth || this.options.disableGlobbing || !isGlob(path) ? path : globParent(path); - var fullWatchPath = sysPath.resolve(watchPath); - var hasGlob = watchPath !== path; - var globFilter = hasGlob ? anymatch(path) : false; - var follow = this.options.followSymlinks; - var globSymlink = hasGlob && follow ? null : false; - - var checkGlobSymlink = function(entry) { - // only need to resolve once - // first entry should always have entry.parentDir === '' - if (globSymlink == null) { - globSymlink = entry.fullParentDir === fullWatchPath ? false : { - realPath: entry.fullParentDir, - linkPath: fullWatchPath - }; - } - - if (globSymlink) { - return entry.fullPath.replace(globSymlink.realPath, globSymlink.linkPath); - } - - return entry.fullPath; - }; - - var entryPath = function(entry) { - return sysPath.join(watchPath, - sysPath.relative(watchPath, checkGlobSymlink(entry)) - ); - }; - - var filterPath = function(entry) { - if (entry.stat && entry.stat.isSymbolicLink()) return filterDir(entry); - var resolvedPath = entryPath(entry); - return (!hasGlob || globFilter(resolvedPath)) && - this._isntIgnored(resolvedPath, entry.stat) && - (this.options.ignorePermissionErrors || - this._hasReadPermissions(entry.stat)); - }.bind(this); - - var getDirParts = function(path) { - if (!hasGlob) return false; - var parts = []; - var expandedPath = braces.expand(path); - expandedPath.forEach(function(path) { - parts.push(sysPath.relative(watchPath, path).split(/[\/\\]/)); - }); - return parts; - }; - - var dirParts = getDirParts(path); - if (dirParts) { - dirParts.forEach(function(parts) { - if (parts.length > 1) parts.pop(); - }); - } - var unmatchedGlob; - - var filterDir = function(entry) { - if (hasGlob) { - var entryParts = getDirParts(checkGlobSymlink(entry)); - var globstar = false; - unmatchedGlob = !dirParts.some(function(parts) { - return parts.every(function(part, i) { - if (part === '**') globstar = true; - return globstar || !entryParts[0][i] || anymatch(part, entryParts[0][i]); - }); - }); - } - return !unmatchedGlob && this._isntIgnored(entryPath(entry), entry.stat); - }.bind(this); - - return { - followSymlinks: follow, - statMethod: follow ? 'stat' : 'lstat', - path: path, - watchPath: watchPath, - entryPath: entryPath, - hasGlob: hasGlob, - globFilter: globFilter, - filterPath: filterPath, - filterDir: filterDir - }; -}; - -// Directory helpers -// ----------------- - -// Private method: Provides directory tracking objects -// -// * directory - string, path of the directory -// -// Returns the directory's tracking object -FSWatcher.prototype._getWatchedDir = function(directory) { - var dir = sysPath.resolve(directory); - var watcherRemove = this._remove.bind(this); - if (!(dir in this._watched)) this._watched[dir] = { - _items: Object.create(null), - add: function(item) { - if (item !== '.' && item !== '..') this._items[item] = true; - }, - remove: function(item) { - delete this._items[item]; - if (!this.children().length) { - fs.readdir(dir, function(err) { - if (err) watcherRemove(sysPath.dirname(dir), sysPath.basename(dir)); - }); - } - }, - has: function(item) {return item in this._items;}, - children: function() {return Object.keys(this._items);} - }; - return this._watched[dir]; -}; - -// File helpers -// ------------ - -// Private method: Check for read permissions -// Based on this answer on SO: http://stackoverflow.com/a/11781404/1358405 -// -// * stats - object, result of fs.stat -// -// Returns boolean -FSWatcher.prototype._hasReadPermissions = function(stats) { - return Boolean(4 & parseInt(((stats && stats.mode) & 0x1ff).toString(8)[0], 10)); -}; - -// Private method: Handles emitting unlink events for -// files and directories, and via recursion, for -// files and directories within directories that are unlinked -// -// * directory - string, directory within which the following item is located -// * item - string, base path of item/directory -// -// Returns nothing -FSWatcher.prototype._remove = function(directory, item) { - // if what is being deleted is a directory, get that directory's paths - // for recursive deleting and cleaning of watched object - // if it is not a directory, nestedDirectoryChildren will be empty array - var path = sysPath.join(directory, item); - var fullPath = sysPath.resolve(path); - var isDirectory = this._watched[path] || this._watched[fullPath]; - - // prevent duplicate handling in case of arriving here nearly simultaneously - // via multiple paths (such as _handleFile and _handleDir) - if (!this._throttle('remove', path, 100)) return; - - // if the only watched file is removed, watch for its return - var watchedDirs = Object.keys(this._watched); - if (!isDirectory && !this.options.useFsEvents && watchedDirs.length === 1) { - this.add(directory, item, true); - } - - // This will create a new entry in the watched object in either case - // so we got to do the directory check beforehand - var nestedDirectoryChildren = this._getWatchedDir(path).children(); - - // Recursively remove children directories / files. - nestedDirectoryChildren.forEach(function(nestedItem) { - this._remove(path, nestedItem); - }, this); - - // Check if item was on the watched list and remove it - var parent = this._getWatchedDir(directory); - var wasTracked = parent.has(item); - parent.remove(item); - - // If we wait for this file to be fully written, cancel the wait. - var relPath = path; - if (this.options.cwd) relPath = sysPath.relative(this.options.cwd, path); - if (this.options.awaitWriteFinish && this._pendingWrites[relPath]) { - var event = this._pendingWrites[relPath].cancelWait(); - if (event === 'add') return; - } - - // The Entry will either be a directory that just got removed - // or a bogus entry to a file, in either case we have to remove it - delete this._watched[path]; - delete this._watched[fullPath]; - var eventName = isDirectory ? 'unlinkDir' : 'unlink'; - if (wasTracked && !this._isIgnored(path)) this._emit(eventName, path); - - // Avoid conflicts if we later create another file with the same name - if (!this.options.useFsEvents) { - this._closePath(path); - } -}; - -FSWatcher.prototype._closePath = function(path) { - if (!this._closers[path]) return; - this._closers[path].forEach(function(closer) { - closer(); - }); - delete this._closers[path]; - this._getWatchedDir(sysPath.dirname(path)).remove(sysPath.basename(path)); -} - -// Public method: Adds paths to be watched on an existing FSWatcher instance - -// * paths - string or array of strings, file/directory paths and/or globs -// * _origAdd - private boolean, for handling non-existent paths to be watched -// * _internal - private boolean, indicates a non-user add - -// Returns an instance of FSWatcher for chaining. -FSWatcher.prototype.add = function(paths, _origAdd, _internal) { - var disableGlobbing = this.options.disableGlobbing; - var cwd = this.options.cwd; - this.closed = false; - paths = flatten(arrify(paths)); - - if (!paths.every(isString)) { - throw new TypeError('Non-string provided as watch path: ' + paths); - } - - if (cwd) paths = paths.map(function(path) { - var absPath; - if (isAbsolute(path)) { - absPath = path; - } else if (path[0] === '!') { - absPath = '!' + sysPath.join(cwd, path.substring(1)); - } else { - absPath = sysPath.join(cwd, path); - } - - // Check `path` instead of `absPath` because the cwd portion can't be a glob - if (disableGlobbing || !isGlob(path)) { - return absPath; - } else { - return normalizePath(absPath); - } - }); - - // set aside negated glob strings - paths = paths.filter(function(path) { - if (path[0] === '!') { - this._ignoredPaths[path.substring(1)] = true; - } else { - // if a path is being added that was previously ignored, stop ignoring it - delete this._ignoredPaths[path]; - delete this._ignoredPaths[path + '/**']; - - // reset the cached userIgnored anymatch fn - // to make ignoredPaths changes effective - this._userIgnored = null; - - return true; - } - }, this); - - if (this.options.useFsEvents && FsEventsHandler.canUse()) { - if (!this._readyCount) this._readyCount = paths.length; - if (this.options.persistent) this._readyCount *= 2; - paths.forEach(this._addToFsEvents, this); - } else { - if (!this._readyCount) this._readyCount = 0; - this._readyCount += paths.length; - asyncEach(paths, function(path, next) { - this._addToNodeFs(path, !_internal, 0, 0, _origAdd, function(err, res) { - if (res) this._emitReady(); - next(err, res); - }.bind(this)); - }.bind(this), function(error, results) { - results.forEach(function(item) { - if (!item || this.closed) return; - this.add(sysPath.dirname(item), sysPath.basename(_origAdd || item)); - }, this); - }.bind(this)); - } - - return this; -}; - -// Public method: Close watchers or start ignoring events from specified paths. - -// * paths - string or array of strings, file/directory paths and/or globs - -// Returns instance of FSWatcher for chaining. -FSWatcher.prototype.unwatch = function(paths) { - if (this.closed) return this; - paths = flatten(arrify(paths)); - - paths.forEach(function(path) { - // convert to absolute path unless relative path already matches - if (!isAbsolute(path) && !this._closers[path]) { - if (this.options.cwd) path = sysPath.join(this.options.cwd, path); - path = sysPath.resolve(path); - } - - this._closePath(path); - - this._ignoredPaths[path] = true; - if (path in this._watched) { - this._ignoredPaths[path + '/**'] = true; - } - - // reset the cached userIgnored anymatch fn - // to make ignoredPaths changes effective - this._userIgnored = null; - }, this); - - return this; -}; - -// Public method: Close watchers and remove all listeners from watched paths. - -// Returns instance of FSWatcher for chaining. -FSWatcher.prototype.close = function() { - if (this.closed) return this; - - this.closed = true; - Object.keys(this._closers).forEach(function(watchPath) { - this._closers[watchPath].forEach(function(closer) { - closer(); - }); - delete this._closers[watchPath]; - }, this); - this._watched = Object.create(null); - - this.removeAllListeners(); - return this; -}; - -// Public method: Expose list of watched paths - -// Returns object w/ dir paths as keys and arrays of contained paths as values. -FSWatcher.prototype.getWatched = function() { - var watchList = {}; - Object.keys(this._watched).forEach(function(dir) { - var key = this.options.cwd ? sysPath.relative(this.options.cwd, dir) : dir; - watchList[key || '.'] = Object.keys(this._watched[dir]._items).sort(); - }.bind(this)); - return watchList; -}; - -// Attach watch handler prototype methods -function importHandler(handler) { - Object.keys(handler.prototype).forEach(function(method) { - FSWatcher.prototype[method] = handler.prototype[method]; - }); -} -importHandler(NodeFsHandler); -if (FsEventsHandler.canUse()) importHandler(FsEventsHandler); - -// Export FSWatcher class -exports.FSWatcher = FSWatcher; - -// Public function: Instantiates watcher with paths to be tracked. - -// * paths - string or array of strings, file/directory paths and/or globs -// * options - object, chokidar options - -// Returns an instance of FSWatcher for chaining. -exports.watch = function(paths, options) { - return new FSWatcher(options).add(paths); -}; - - -/***/ }), -/* 53 */ -/***/ ((module) => { - -"use strict"; -module.exports = require("events"); - -/***/ }), -/* 54 */ -/***/ (function(module, exports) { - -var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! async-each - MIT License (c) 2016 Paul Miller (paulmillr.com) */ -(function (globals) { - 'use strict'; - var each = function (items, next, callback) { - if (!Array.isArray(items)) throw new TypeError('each() expects array as first argument'); - if (typeof next !== 'function') - throw new TypeError('each() expects function as second argument'); - if (typeof callback !== 'function') callback = Function.prototype; // no-op - - var total = items.length; - if (total === 0) return callback(undefined, items); - var transformed = new Array(total); - var transformedCount = 0; - var returned = false; - - items.forEach(function (item, index) { - next(item, function (error, transformedItem) { - if (returned) return; - if (error) { - returned = true; - return callback(error); - } - transformed[index] = transformedItem; - transformedCount += 1; // can't use index: last item could take more time - if (transformedCount === total) return callback(undefined, transformed); - }); - }); - }; - - if (true) { - !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function () { - return each; - }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), - __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); // RequireJS - } else {} -})(this); - - -/***/ }), -/* 55 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -const picomatch = __webpack_require__(56); -const normalizePath = __webpack_require__(62); - -/** - * @typedef {(testString: string) => boolean} AnymatchFn - * @typedef {string|RegExp|AnymatchFn} AnymatchPattern - * @typedef {AnymatchPattern|AnymatchPattern[]} AnymatchMatcher - */ -const BANG = '!'; -const arrify = (item) => Array.isArray(item) ? item : [item]; - -/** - * @param {AnymatchPattern} matcher - * @returns {AnymatchFn} - */ -const createPattern = (matcher) => { - if (typeof matcher === 'function') { - return matcher; - } - if (typeof matcher === 'string') { - const glob = picomatch(matcher, { dot: true }); - return (string) => matcher === string || glob(string); - } - if (matcher instanceof RegExp) { - return (string) => matcher.test(string); - } - return (string) => false; -}; - -/** - * @param {Array} patterns - * @param {Array} negatedGlobs - * @param {String|Array} path - * @param {Boolean} returnIndex - * @returns {boolean|number} - */ -const matchPatterns = (patterns, negatedGlobs, path, returnIndex) => { - const additionalArgs = Array.isArray(path); - const upath = normalizePath(additionalArgs ? path[0] : path); - for (let index = 0; index < negatedGlobs.length; index++) { - const nglob = negatedGlobs[index]; - if (nglob(upath)) { - return returnIndex ? -1 : false; - } - } - const args = additionalArgs && [upath].concat(path.slice(1)); - for (let index = 0; index < patterns.length; index++) { - const pattern = patterns[index]; - if (additionalArgs ? pattern(...args) : pattern(upath)) { - return returnIndex ? index : true; - } - } - - return returnIndex ? -1 : false; -}; - -/** - * @param {AnymatchMatcher} matchers - * @param {Array|string} testString - * @param {boolean=} returnIndex - * @returns {boolean|number|Function} - */ -const anymatch = (matchers, testString, returnIndex = false) => { - if (matchers == null) { - throw new TypeError('anymatch: specify first argument'); - } - // Early cache for matchers. - const mtchers = arrify(matchers); - const negatedGlobs = mtchers - .filter(item => typeof item === 'string' && item.charAt(0) === BANG) - .map(item => item.slice(1)) - .map(item => picomatch(item, { dot: true })); - const patterns = mtchers.map(createPattern); - - if (testString == null) { - return (testString, ri = false) => { - const returnIndex = typeof ri === 'boolean' ? ri : false; - return matchPatterns(patterns, negatedGlobs, testString, returnIndex); - } - } - if (!Array.isArray(testString) && typeof testString !== 'string') { - throw new TypeError('anymatch: second argument must be a string: got ' + - Object.prototype.toString.call(testString)) - } - - return matchPatterns(patterns, negatedGlobs, testString, returnIndex); -}; - -module.exports = anymatch; - - -/***/ }), -/* 56 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -module.exports = __webpack_require__(57); - - -/***/ }), -/* 57 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -const path = __webpack_require__(3); -const scan = __webpack_require__(58); -const parse = __webpack_require__(61); -const utils = __webpack_require__(59); -const constants = __webpack_require__(60); -const isObject = val => val && typeof val === 'object' && !Array.isArray(val); - -/** - * Creates a matcher function from one or more glob patterns. The - * returned function takes a string to match as its first argument, - * and returns true if the string is a match. The returned matcher - * function also takes a boolean as the second argument that, when true, - * returns an object with additional information. - * - * ```js - * const picomatch = require('picomatch'); - * // picomatch(glob[, options]); - * - * const isMatch = picomatch('*.!(*a)'); - * console.log(isMatch('a.a')); //=> false - * console.log(isMatch('a.b')); //=> true - * ``` - * @name picomatch - * @param {String|Array} `globs` One or more glob patterns. - * @param {Object=} `options` - * @return {Function=} Returns a matcher function. - * @api public - */ - -const picomatch = (glob, options, returnState = false) => { - if (Array.isArray(glob)) { - const fns = glob.map(input => picomatch(input, options, returnState)); - const arrayMatcher = str => { - for (const isMatch of fns) { - const state = isMatch(str); - if (state) return state; - } - return false; - }; - return arrayMatcher; - } - - const isState = isObject(glob) && glob.tokens && glob.input; - - if (glob === '' || (typeof glob !== 'string' && !isState)) { - throw new TypeError('Expected pattern to be a non-empty string'); - } - - const opts = options || {}; - const posix = utils.isWindows(options); - const regex = isState - ? picomatch.compileRe(glob, options) - : picomatch.makeRe(glob, options, false, true); - - const state = regex.state; - delete regex.state; - - let isIgnored = () => false; - if (opts.ignore) { - const ignoreOpts = { ...options, ignore: null, onMatch: null, onResult: null }; - isIgnored = picomatch(opts.ignore, ignoreOpts, returnState); - } - - const matcher = (input, returnObject = false) => { - const { isMatch, match, output } = picomatch.test(input, regex, options, { glob, posix }); - const result = { glob, state, regex, posix, input, output, match, isMatch }; - - if (typeof opts.onResult === 'function') { - opts.onResult(result); - } - - if (isMatch === false) { - result.isMatch = false; - return returnObject ? result : false; - } - - if (isIgnored(input)) { - if (typeof opts.onIgnore === 'function') { - opts.onIgnore(result); - } - result.isMatch = false; - return returnObject ? result : false; - } - - if (typeof opts.onMatch === 'function') { - opts.onMatch(result); - } - return returnObject ? result : true; - }; - - if (returnState) { - matcher.state = state; - } - - return matcher; -}; - -/** - * Test `input` with the given `regex`. This is used by the main - * `picomatch()` function to test the input string. - * - * ```js - * const picomatch = require('picomatch'); - * // picomatch.test(input, regex[, options]); - * - * console.log(picomatch.test('foo/bar', /^(?:([^/]*?)\/([^/]*?))$/)); - * // { isMatch: true, match: [ 'foo/', 'foo', 'bar' ], output: 'foo/bar' } - * ``` - * @param {String} `input` String to test. - * @param {RegExp} `regex` - * @return {Object} Returns an object with matching info. - * @api public - */ - -picomatch.test = (input, regex, options, { glob, posix } = {}) => { - if (typeof input !== 'string') { - throw new TypeError('Expected input to be a string'); - } - - if (input === '') { - return { isMatch: false, output: '' }; - } - - const opts = options || {}; - const format = opts.format || (posix ? utils.toPosixSlashes : null); - let match = input === glob; - let output = (match && format) ? format(input) : input; - - if (match === false) { - output = format ? format(input) : input; - match = output === glob; - } - - if (match === false || opts.capture === true) { - if (opts.matchBase === true || opts.basename === true) { - match = picomatch.matchBase(input, regex, options, posix); - } else { - match = regex.exec(output); - } - } - - return { isMatch: Boolean(match), match, output }; -}; - -/** - * Match the basename of a filepath. - * - * ```js - * const picomatch = require('picomatch'); - * // picomatch.matchBase(input, glob[, options]); - * console.log(picomatch.matchBase('foo/bar.js', '*.js'); // true - * ``` - * @param {String} `input` String to test. - * @param {RegExp|String} `glob` Glob pattern or regex created by [.makeRe](#makeRe). - * @return {Boolean} - * @api public - */ - -picomatch.matchBase = (input, glob, options, posix = utils.isWindows(options)) => { - const regex = glob instanceof RegExp ? glob : picomatch.makeRe(glob, options); - return regex.test(path.basename(input)); -}; - -/** - * Returns true if **any** of the given glob `patterns` match the specified `string`. - * - * ```js - * const picomatch = require('picomatch'); - * // picomatch.isMatch(string, patterns[, options]); - * - * console.log(picomatch.isMatch('a.a', ['b.*', '*.a'])); //=> true - * console.log(picomatch.isMatch('a.a', 'b.*')); //=> false - * ``` - * @param {String|Array} str The string to test. - * @param {String|Array} patterns One or more glob patterns to use for matching. - * @param {Object} [options] See available [options](#options). - * @return {Boolean} Returns true if any patterns match `str` - * @api public - */ - -picomatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str); - -/** - * Parse a glob pattern to create the source string for a regular - * expression. - * - * ```js - * const picomatch = require('picomatch'); - * const result = picomatch.parse(pattern[, options]); - * ``` - * @param {String} `pattern` - * @param {Object} `options` - * @return {Object} Returns an object with useful properties and output to be used as a regex source string. - * @api public - */ - -picomatch.parse = (pattern, options) => { - if (Array.isArray(pattern)) return pattern.map(p => picomatch.parse(p, options)); - return parse(pattern, { ...options, fastpaths: false }); -}; - -/** - * Scan a glob pattern to separate the pattern into segments. - * - * ```js - * const picomatch = require('picomatch'); - * // picomatch.scan(input[, options]); - * - * const result = picomatch.scan('!./foo/*.js'); - * console.log(result); - * { prefix: '!./', - * input: '!./foo/*.js', - * start: 3, - * base: 'foo', - * glob: '*.js', - * isBrace: false, - * isBracket: false, - * isGlob: true, - * isExtglob: false, - * isGlobstar: false, - * negated: true } - * ``` - * @param {String} `input` Glob pattern to scan. - * @param {Object} `options` - * @return {Object} Returns an object with - * @api public - */ - -picomatch.scan = (input, options) => scan(input, options); - -/** - * Compile a regular expression from the `state` object returned by the - * [parse()](#parse) method. - * - * @param {Object} `state` - * @param {Object} `options` - * @param {Boolean} `returnOutput` Intended for implementors, this argument allows you to return the raw output from the parser. - * @param {Boolean} `returnState` Adds the state to a `state` property on the returned regex. Useful for implementors and debugging. - * @return {RegExp} - * @api public - */ - -picomatch.compileRe = (state, options, returnOutput = false, returnState = false) => { - if (returnOutput === true) { - return state.output; - } - - const opts = options || {}; - const prepend = opts.contains ? '' : '^'; - const append = opts.contains ? '' : '$'; - - let source = `${prepend}(?:${state.output})${append}`; - if (state && state.negated === true) { - source = `^(?!${source}).*$`; - } - - const regex = picomatch.toRegex(source, options); - if (returnState === true) { - regex.state = state; - } - - return regex; -}; - -/** - * Create a regular expression from a parsed glob pattern. - * - * ```js - * const picomatch = require('picomatch'); - * const state = picomatch.parse('*.js'); - * // picomatch.compileRe(state[, options]); - * - * console.log(picomatch.compileRe(state)); - * //=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/ - * ``` - * @param {String} `state` The object returned from the `.parse` method. - * @param {Object} `options` - * @param {Boolean} `returnOutput` Implementors may use this argument to return the compiled output, instead of a regular expression. This is not exposed on the options to prevent end-users from mutating the result. - * @param {Boolean} `returnState` Implementors may use this argument to return the state from the parsed glob with the returned regular expression. - * @return {RegExp} Returns a regex created from the given pattern. - * @api public - */ - -picomatch.makeRe = (input, options = {}, returnOutput = false, returnState = false) => { - if (!input || typeof input !== 'string') { - throw new TypeError('Expected a non-empty string'); - } - - let parsed = { negated: false, fastpaths: true }; - - if (options.fastpaths !== false && (input[0] === '.' || input[0] === '*')) { - parsed.output = parse.fastpaths(input, options); - } - - if (!parsed.output) { - parsed = parse(input, options); - } - - return picomatch.compileRe(parsed, options, returnOutput, returnState); -}; - -/** - * Create a regular expression from the given regex source string. - * - * ```js - * const picomatch = require('picomatch'); - * // picomatch.toRegex(source[, options]); - * - * const { output } = picomatch.parse('*.js'); - * console.log(picomatch.toRegex(output)); - * //=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/ - * ``` - * @param {String} `source` Regular expression source string. - * @param {Object} `options` - * @return {RegExp} - * @api public - */ - -picomatch.toRegex = (source, options) => { - try { - const opts = options || {}; - return new RegExp(source, opts.flags || (opts.nocase ? 'i' : '')); - } catch (err) { - if (options && options.debug === true) throw err; - return /$^/; - } -}; - -/** - * Picomatch constants. - * @return {Object} - */ - -picomatch.constants = constants; - -/** - * Expose "picomatch" - */ - -module.exports = picomatch; - - -/***/ }), -/* 58 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -const utils = __webpack_require__(59); -const { - CHAR_ASTERISK, /* * */ - CHAR_AT, /* @ */ - CHAR_BACKWARD_SLASH, /* \ */ - CHAR_COMMA, /* , */ - CHAR_DOT, /* . */ - CHAR_EXCLAMATION_MARK, /* ! */ - CHAR_FORWARD_SLASH, /* / */ - CHAR_LEFT_CURLY_BRACE, /* { */ - CHAR_LEFT_PARENTHESES, /* ( */ - CHAR_LEFT_SQUARE_BRACKET, /* [ */ - CHAR_PLUS, /* + */ - CHAR_QUESTION_MARK, /* ? */ - CHAR_RIGHT_CURLY_BRACE, /* } */ - CHAR_RIGHT_PARENTHESES, /* ) */ - CHAR_RIGHT_SQUARE_BRACKET /* ] */ -} = __webpack_require__(60); - -const isPathSeparator = code => { - return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH; -}; - -const depth = token => { - if (token.isPrefix !== true) { - token.depth = token.isGlobstar ? Infinity : 1; - } -}; - -/** - * Quickly scans a glob pattern and returns an object with a handful of - * useful properties, like `isGlob`, `path` (the leading non-glob, if it exists), - * `glob` (the actual pattern), `negated` (true if the path starts with `!` but not - * with `!(`) and `negatedExtglob` (true if the path starts with `!(`). - * - * ```js - * const pm = require('picomatch'); - * console.log(pm.scan('foo/bar/*.js')); - * { isGlob: true, input: 'foo/bar/*.js', base: 'foo/bar', glob: '*.js' } - * ``` - * @param {String} `str` - * @param {Object} `options` - * @return {Object} Returns an object with tokens and regex source string. - * @api public - */ - -const scan = (input, options) => { - const opts = options || {}; - - const length = input.length - 1; - const scanToEnd = opts.parts === true || opts.scanToEnd === true; - const slashes = []; - const tokens = []; - const parts = []; - - let str = input; - let index = -1; - let start = 0; - let lastIndex = 0; - let isBrace = false; - let isBracket = false; - let isGlob = false; - let isExtglob = false; - let isGlobstar = false; - let braceEscaped = false; - let backslashes = false; - let negated = false; - let negatedExtglob = false; - let finished = false; - let braces = 0; - let prev; - let code; - let token = { value: '', depth: 0, isGlob: false }; - - const eos = () => index >= length; - const peek = () => str.charCodeAt(index + 1); - const advance = () => { - prev = code; - return str.charCodeAt(++index); - }; - - while (index < length) { - code = advance(); - let next; - - if (code === CHAR_BACKWARD_SLASH) { - backslashes = token.backslashes = true; - code = advance(); - - if (code === CHAR_LEFT_CURLY_BRACE) { - braceEscaped = true; - } - continue; - } - - if (braceEscaped === true || code === CHAR_LEFT_CURLY_BRACE) { - braces++; - - while (eos() !== true && (code = advance())) { - if (code === CHAR_BACKWARD_SLASH) { - backslashes = token.backslashes = true; - advance(); - continue; - } - - if (code === CHAR_LEFT_CURLY_BRACE) { - braces++; - continue; - } - - if (braceEscaped !== true && code === CHAR_DOT && (code = advance()) === CHAR_DOT) { - isBrace = token.isBrace = true; - isGlob = token.isGlob = true; - finished = true; - - if (scanToEnd === true) { - continue; - } - - break; - } - - if (braceEscaped !== true && code === CHAR_COMMA) { - isBrace = token.isBrace = true; - isGlob = token.isGlob = true; - finished = true; - - if (scanToEnd === true) { - continue; - } - - break; - } - - if (code === CHAR_RIGHT_CURLY_BRACE) { - braces--; - - if (braces === 0) { - braceEscaped = false; - isBrace = token.isBrace = true; - finished = true; - break; - } - } - } - - if (scanToEnd === true) { - continue; - } - - break; - } - - if (code === CHAR_FORWARD_SLASH) { - slashes.push(index); - tokens.push(token); - token = { value: '', depth: 0, isGlob: false }; - - if (finished === true) continue; - if (prev === CHAR_DOT && index === (start + 1)) { - start += 2; - continue; - } - - lastIndex = index + 1; - continue; - } - - if (opts.noext !== true) { - const isExtglobChar = code === CHAR_PLUS - || code === CHAR_AT - || code === CHAR_ASTERISK - || code === CHAR_QUESTION_MARK - || code === CHAR_EXCLAMATION_MARK; - - if (isExtglobChar === true && peek() === CHAR_LEFT_PARENTHESES) { - isGlob = token.isGlob = true; - isExtglob = token.isExtglob = true; - finished = true; - if (code === CHAR_EXCLAMATION_MARK && index === start) { - negatedExtglob = true; - } - - if (scanToEnd === true) { - while (eos() !== true && (code = advance())) { - if (code === CHAR_BACKWARD_SLASH) { - backslashes = token.backslashes = true; - code = advance(); - continue; - } - - if (code === CHAR_RIGHT_PARENTHESES) { - isGlob = token.isGlob = true; - finished = true; - break; - } - } - continue; - } - break; - } - } - - if (code === CHAR_ASTERISK) { - if (prev === CHAR_ASTERISK) isGlobstar = token.isGlobstar = true; - isGlob = token.isGlob = true; - finished = true; - - if (scanToEnd === true) { - continue; - } - break; - } - - if (code === CHAR_QUESTION_MARK) { - isGlob = token.isGlob = true; - finished = true; - - if (scanToEnd === true) { - continue; - } - break; - } - - if (code === CHAR_LEFT_SQUARE_BRACKET) { - while (eos() !== true && (next = advance())) { - if (next === CHAR_BACKWARD_SLASH) { - backslashes = token.backslashes = true; - advance(); - continue; - } - - if (next === CHAR_RIGHT_SQUARE_BRACKET) { - isBracket = token.isBracket = true; - isGlob = token.isGlob = true; - finished = true; - break; - } - } - - if (scanToEnd === true) { - continue; - } - - break; - } - - if (opts.nonegate !== true && code === CHAR_EXCLAMATION_MARK && index === start) { - negated = token.negated = true; - start++; - continue; - } - - if (opts.noparen !== true && code === CHAR_LEFT_PARENTHESES) { - isGlob = token.isGlob = true; - - if (scanToEnd === true) { - while (eos() !== true && (code = advance())) { - if (code === CHAR_LEFT_PARENTHESES) { - backslashes = token.backslashes = true; - code = advance(); - continue; - } - - if (code === CHAR_RIGHT_PARENTHESES) { - finished = true; - break; - } - } - continue; - } - break; - } - - if (isGlob === true) { - finished = true; - - if (scanToEnd === true) { - continue; - } - - break; - } - } - - if (opts.noext === true) { - isExtglob = false; - isGlob = false; - } - - let base = str; - let prefix = ''; - let glob = ''; - - if (start > 0) { - prefix = str.slice(0, start); - str = str.slice(start); - lastIndex -= start; - } - - if (base && isGlob === true && lastIndex > 0) { - base = str.slice(0, lastIndex); - glob = str.slice(lastIndex); - } else if (isGlob === true) { - base = ''; - glob = str; - } else { - base = str; - } - - if (base && base !== '' && base !== '/' && base !== str) { - if (isPathSeparator(base.charCodeAt(base.length - 1))) { - base = base.slice(0, -1); - } - } - - if (opts.unescape === true) { - if (glob) glob = utils.removeBackslashes(glob); - - if (base && backslashes === true) { - base = utils.removeBackslashes(base); - } - } - - const state = { - prefix, - input, - start, - base, - glob, - isBrace, - isBracket, - isGlob, - isExtglob, - isGlobstar, - negated, - negatedExtglob - }; - - if (opts.tokens === true) { - state.maxDepth = 0; - if (!isPathSeparator(code)) { - tokens.push(token); - } - state.tokens = tokens; - } - - if (opts.parts === true || opts.tokens === true) { - let prevIndex; - - for (let idx = 0; idx < slashes.length; idx++) { - const n = prevIndex ? prevIndex + 1 : start; - const i = slashes[idx]; - const value = input.slice(n, i); - if (opts.tokens) { - if (idx === 0 && start !== 0) { - tokens[idx].isPrefix = true; - tokens[idx].value = prefix; - } else { - tokens[idx].value = value; - } - depth(tokens[idx]); - state.maxDepth += tokens[idx].depth; - } - if (idx !== 0 || value !== '') { - parts.push(value); - } - prevIndex = i; - } - - if (prevIndex && prevIndex + 1 < input.length) { - const value = input.slice(prevIndex + 1); - parts.push(value); - - if (opts.tokens) { - tokens[tokens.length - 1].value = value; - depth(tokens[tokens.length - 1]); - state.maxDepth += tokens[tokens.length - 1].depth; - } - } - - state.slashes = slashes; - state.parts = parts; - } - - return state; -}; - -module.exports = scan; - - -/***/ }), -/* 59 */ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - - -const path = __webpack_require__(3); -const win32 = process.platform === 'win32'; -const { - REGEX_BACKSLASH, - REGEX_REMOVE_BACKSLASH, - REGEX_SPECIAL_CHARS, - REGEX_SPECIAL_CHARS_GLOBAL -} = __webpack_require__(60); - -exports.isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val); -exports.hasRegexChars = str => REGEX_SPECIAL_CHARS.test(str); -exports.isRegexChar = str => str.length === 1 && exports.hasRegexChars(str); -exports.escapeRegex = str => str.replace(REGEX_SPECIAL_CHARS_GLOBAL, '\\$1'); -exports.toPosixSlashes = str => str.replace(REGEX_BACKSLASH, '/'); - -exports.removeBackslashes = str => { - return str.replace(REGEX_REMOVE_BACKSLASH, match => { - return match === '\\' ? '' : match; - }); -}; - -exports.supportsLookbehinds = () => { - const segs = process.version.slice(1).split('.').map(Number); - if (segs.length === 3 && segs[0] >= 9 || (segs[0] === 8 && segs[1] >= 10)) { - return true; - } - return false; -}; - -exports.isWindows = options => { - if (options && typeof options.windows === 'boolean') { - return options.windows; - } - return win32 === true || path.sep === '\\'; -}; - -exports.escapeLast = (input, char, lastIdx) => { - const idx = input.lastIndexOf(char, lastIdx); - if (idx === -1) return input; - if (input[idx - 1] === '\\') return exports.escapeLast(input, char, idx - 1); - return `${input.slice(0, idx)}\\${input.slice(idx)}`; -}; - -exports.removePrefix = (input, state = {}) => { - let output = input; - if (output.startsWith('./')) { - output = output.slice(2); - state.prefix = './'; - } - return output; -}; - -exports.wrapOutput = (input, state = {}, options = {}) => { - const prepend = options.contains ? '' : '^'; - const append = options.contains ? '' : '$'; - - let output = `${prepend}(?:${input})${append}`; - if (state.negated === true) { - output = `(?:^(?!${output}).*$)`; - } - return output; -}; - - -/***/ }), -/* 60 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -const path = __webpack_require__(3); -const WIN_SLASH = '\\\\/'; -const WIN_NO_SLASH = `[^${WIN_SLASH}]`; - -/** - * Posix glob regex - */ - -const DOT_LITERAL = '\\.'; -const PLUS_LITERAL = '\\+'; -const QMARK_LITERAL = '\\?'; -const SLASH_LITERAL = '\\/'; -const ONE_CHAR = '(?=.)'; -const QMARK = '[^/]'; -const END_ANCHOR = `(?:${SLASH_LITERAL}|$)`; -const START_ANCHOR = `(?:^|${SLASH_LITERAL})`; -const DOTS_SLASH = `${DOT_LITERAL}{1,2}${END_ANCHOR}`; -const NO_DOT = `(?!${DOT_LITERAL})`; -const NO_DOTS = `(?!${START_ANCHOR}${DOTS_SLASH})`; -const NO_DOT_SLASH = `(?!${DOT_LITERAL}{0,1}${END_ANCHOR})`; -const NO_DOTS_SLASH = `(?!${DOTS_SLASH})`; -const QMARK_NO_DOT = `[^.${SLASH_LITERAL}]`; -const STAR = `${QMARK}*?`; - -const POSIX_CHARS = { - DOT_LITERAL, - PLUS_LITERAL, - QMARK_LITERAL, - SLASH_LITERAL, - ONE_CHAR, - QMARK, - END_ANCHOR, - DOTS_SLASH, - NO_DOT, - NO_DOTS, - NO_DOT_SLASH, - NO_DOTS_SLASH, - QMARK_NO_DOT, - STAR, - START_ANCHOR -}; - -/** - * Windows glob regex - */ - -const WINDOWS_CHARS = { - ...POSIX_CHARS, - - SLASH_LITERAL: `[${WIN_SLASH}]`, - QMARK: WIN_NO_SLASH, - STAR: `${WIN_NO_SLASH}*?`, - DOTS_SLASH: `${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$)`, - NO_DOT: `(?!${DOT_LITERAL})`, - NO_DOTS: `(?!(?:^|[${WIN_SLASH}])${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`, - NO_DOT_SLASH: `(?!${DOT_LITERAL}{0,1}(?:[${WIN_SLASH}]|$))`, - NO_DOTS_SLASH: `(?!${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`, - QMARK_NO_DOT: `[^.${WIN_SLASH}]`, - START_ANCHOR: `(?:^|[${WIN_SLASH}])`, - END_ANCHOR: `(?:[${WIN_SLASH}]|$)` -}; - -/** - * POSIX Bracket Regex - */ - -const POSIX_REGEX_SOURCE = { - alnum: 'a-zA-Z0-9', - alpha: 'a-zA-Z', - ascii: '\\x00-\\x7F', - blank: ' \\t', - cntrl: '\\x00-\\x1F\\x7F', - digit: '0-9', - graph: '\\x21-\\x7E', - lower: 'a-z', - print: '\\x20-\\x7E ', - punct: '\\-!"#$%&\'()\\*+,./:;<=>?@[\\]^_`{|}~', - space: ' \\t\\r\\n\\v\\f', - upper: 'A-Z', - word: 'A-Za-z0-9_', - xdigit: 'A-Fa-f0-9' -}; - -module.exports = { - MAX_LENGTH: 1024 * 64, - POSIX_REGEX_SOURCE, - - // regular expressions - REGEX_BACKSLASH: /\\(?![*+?^${}(|)[\]])/g, - REGEX_NON_SPECIAL_CHARS: /^[^@![\].,$*+?^{}()|\\/]+/, - REGEX_SPECIAL_CHARS: /[-*+?.^${}(|)[\]]/, - REGEX_SPECIAL_CHARS_BACKREF: /(\\?)((\W)(\3*))/g, - REGEX_SPECIAL_CHARS_GLOBAL: /([-*+?.^${}(|)[\]])/g, - REGEX_REMOVE_BACKSLASH: /(?:\[.*?[^\\]\]|\\(?=.))/g, - - // Replace globs with equivalent patterns to reduce parsing time. - REPLACEMENTS: { - '***': '*', - '**/**': '**', - '**/**/**': '**' - }, - - // Digits - CHAR_0: 48, /* 0 */ - CHAR_9: 57, /* 9 */ - - // Alphabet chars. - CHAR_UPPERCASE_A: 65, /* A */ - CHAR_LOWERCASE_A: 97, /* a */ - CHAR_UPPERCASE_Z: 90, /* Z */ - CHAR_LOWERCASE_Z: 122, /* z */ - - CHAR_LEFT_PARENTHESES: 40, /* ( */ - CHAR_RIGHT_PARENTHESES: 41, /* ) */ - - CHAR_ASTERISK: 42, /* * */ - - // Non-alphabetic chars. - CHAR_AMPERSAND: 38, /* & */ - CHAR_AT: 64, /* @ */ - CHAR_BACKWARD_SLASH: 92, /* \ */ - CHAR_CARRIAGE_RETURN: 13, /* \r */ - CHAR_CIRCUMFLEX_ACCENT: 94, /* ^ */ - CHAR_COLON: 58, /* : */ - CHAR_COMMA: 44, /* , */ - CHAR_DOT: 46, /* . */ - CHAR_DOUBLE_QUOTE: 34, /* " */ - CHAR_EQUAL: 61, /* = */ - CHAR_EXCLAMATION_MARK: 33, /* ! */ - CHAR_FORM_FEED: 12, /* \f */ - CHAR_FORWARD_SLASH: 47, /* / */ - CHAR_GRAVE_ACCENT: 96, /* ` */ - CHAR_HASH: 35, /* # */ - CHAR_HYPHEN_MINUS: 45, /* - */ - CHAR_LEFT_ANGLE_BRACKET: 60, /* < */ - CHAR_LEFT_CURLY_BRACE: 123, /* { */ - CHAR_LEFT_SQUARE_BRACKET: 91, /* [ */ - CHAR_LINE_FEED: 10, /* \n */ - CHAR_NO_BREAK_SPACE: 160, /* \u00A0 */ - CHAR_PERCENT: 37, /* % */ - CHAR_PLUS: 43, /* + */ - CHAR_QUESTION_MARK: 63, /* ? */ - CHAR_RIGHT_ANGLE_BRACKET: 62, /* > */ - CHAR_RIGHT_CURLY_BRACE: 125, /* } */ - CHAR_RIGHT_SQUARE_BRACKET: 93, /* ] */ - CHAR_SEMICOLON: 59, /* ; */ - CHAR_SINGLE_QUOTE: 39, /* ' */ - CHAR_SPACE: 32, /* */ - CHAR_TAB: 9, /* \t */ - CHAR_UNDERSCORE: 95, /* _ */ - CHAR_VERTICAL_LINE: 124, /* | */ - CHAR_ZERO_WIDTH_NOBREAK_SPACE: 65279, /* \uFEFF */ - - SEP: path.sep, - - /** - * Create EXTGLOB_CHARS - */ - - extglobChars(chars) { - return { - '!': { type: 'negate', open: '(?:(?!(?:', close: `))${chars.STAR})` }, - '?': { type: 'qmark', open: '(?:', close: ')?' }, - '+': { type: 'plus', open: '(?:', close: ')+' }, - '*': { type: 'star', open: '(?:', close: ')*' }, - '@': { type: 'at', open: '(?:', close: ')' } - }; - }, - - /** - * Create GLOB_CHARS - */ - - globChars(win32) { - return win32 === true ? WINDOWS_CHARS : POSIX_CHARS; - } -}; - - -/***/ }), -/* 61 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -const constants = __webpack_require__(60); -const utils = __webpack_require__(59); - -/** - * Constants - */ - -const { - MAX_LENGTH, - POSIX_REGEX_SOURCE, - REGEX_NON_SPECIAL_CHARS, - REGEX_SPECIAL_CHARS_BACKREF, - REPLACEMENTS -} = constants; - -/** - * Helpers - */ - -const expandRange = (args, options) => { - if (typeof options.expandRange === 'function') { - return options.expandRange(...args, options); - } - - args.sort(); - const value = `[${args.join('-')}]`; - - try { - /* eslint-disable-next-line no-new */ - new RegExp(value); - } catch (ex) { - return args.map(v => utils.escapeRegex(v)).join('..'); - } - - return value; -}; - -/** - * Create the message for a syntax error - */ - -const syntaxError = (type, char) => { - return `Missing ${type}: "${char}" - use "\\\\${char}" to match literal characters`; -}; - -/** - * Parse the given input string. - * @param {String} input - * @param {Object} options - * @return {Object} - */ - -const parse = (input, options) => { - if (typeof input !== 'string') { - throw new TypeError('Expected a string'); - } - - input = REPLACEMENTS[input] || input; - - const opts = { ...options }; - const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; - - let len = input.length; - if (len > max) { - throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`); - } - - const bos = { type: 'bos', value: '', output: opts.prepend || '' }; - const tokens = [bos]; - - const capture = opts.capture ? '' : '?:'; - const win32 = utils.isWindows(options); - - // create constants based on platform, for windows or posix - const PLATFORM_CHARS = constants.globChars(win32); - const EXTGLOB_CHARS = constants.extglobChars(PLATFORM_CHARS); - - const { - DOT_LITERAL, - PLUS_LITERAL, - SLASH_LITERAL, - ONE_CHAR, - DOTS_SLASH, - NO_DOT, - NO_DOT_SLASH, - NO_DOTS_SLASH, - QMARK, - QMARK_NO_DOT, - STAR, - START_ANCHOR - } = PLATFORM_CHARS; - - const globstar = opts => { - return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`; - }; - - const nodot = opts.dot ? '' : NO_DOT; - const qmarkNoDot = opts.dot ? QMARK : QMARK_NO_DOT; - let star = opts.bash === true ? globstar(opts) : STAR; - - if (opts.capture) { - star = `(${star})`; - } - - // minimatch options support - if (typeof opts.noext === 'boolean') { - opts.noextglob = opts.noext; - } - - const state = { - input, - index: -1, - start: 0, - dot: opts.dot === true, - consumed: '', - output: '', - prefix: '', - backtrack: false, - negated: false, - brackets: 0, - braces: 0, - parens: 0, - quotes: 0, - globstar: false, - tokens - }; - - input = utils.removePrefix(input, state); - len = input.length; - - const extglobs = []; - const braces = []; - const stack = []; - let prev = bos; - let value; - - /** - * Tokenizing helpers - */ - - const eos = () => state.index === len - 1; - const peek = state.peek = (n = 1) => input[state.index + n]; - const advance = state.advance = () => input[++state.index] || ''; - const remaining = () => input.slice(state.index + 1); - const consume = (value = '', num = 0) => { - state.consumed += value; - state.index += num; - }; - - const append = token => { - state.output += token.output != null ? token.output : token.value; - consume(token.value); - }; - - const negate = () => { - let count = 1; - - while (peek() === '!' && (peek(2) !== '(' || peek(3) === '?')) { - advance(); - state.start++; - count++; - } - - if (count % 2 === 0) { - return false; - } - - state.negated = true; - state.start++; - return true; - }; - - const increment = type => { - state[type]++; - stack.push(type); - }; - - const decrement = type => { - state[type]--; - stack.pop(); - }; - - /** - * Push tokens onto the tokens array. This helper speeds up - * tokenizing by 1) helping us avoid backtracking as much as possible, - * and 2) helping us avoid creating extra tokens when consecutive - * characters are plain text. This improves performance and simplifies - * lookbehinds. - */ - - const push = tok => { - if (prev.type === 'globstar') { - const isBrace = state.braces > 0 && (tok.type === 'comma' || tok.type === 'brace'); - const isExtglob = tok.extglob === true || (extglobs.length && (tok.type === 'pipe' || tok.type === 'paren')); - - if (tok.type !== 'slash' && tok.type !== 'paren' && !isBrace && !isExtglob) { - state.output = state.output.slice(0, -prev.output.length); - prev.type = 'star'; - prev.value = '*'; - prev.output = star; - state.output += prev.output; - } - } - - if (extglobs.length && tok.type !== 'paren') { - extglobs[extglobs.length - 1].inner += tok.value; - } - - if (tok.value || tok.output) append(tok); - if (prev && prev.type === 'text' && tok.type === 'text') { - prev.value += tok.value; - prev.output = (prev.output || '') + tok.value; - return; - } - - tok.prev = prev; - tokens.push(tok); - prev = tok; - }; - - const extglobOpen = (type, value) => { - const token = { ...EXTGLOB_CHARS[value], conditions: 1, inner: '' }; - - token.prev = prev; - token.parens = state.parens; - token.output = state.output; - const output = (opts.capture ? '(' : '') + token.open; - - increment('parens'); - push({ type, value, output: state.output ? '' : ONE_CHAR }); - push({ type: 'paren', extglob: true, value: advance(), output }); - extglobs.push(token); - }; - - const extglobClose = token => { - let output = token.close + (opts.capture ? ')' : ''); - let rest; - - if (token.type === 'negate') { - let extglobStar = star; - - if (token.inner && token.inner.length > 1 && token.inner.includes('/')) { - extglobStar = globstar(opts); - } - - if (extglobStar !== star || eos() || /^\)+$/.test(remaining())) { - output = token.close = `)$))${extglobStar}`; - } - - if (token.inner.includes('*') && (rest = remaining()) && /^\.[^\\/.]+$/.test(rest)) { - // Any non-magical string (`.ts`) or even nested expression (`.{ts,tsx}`) can follow after the closing parenthesis. - // In this case, we need to parse the string and use it in the output of the original pattern. - // Suitable patterns: `/!(*.d).ts`, `/!(*.d).{ts,tsx}`, `**/!(*-dbg).@(js)`. - // - // Disabling the `fastpaths` option due to a problem with parsing strings as `.ts` in the pattern like `**/!(*.d).ts`. - const expression = parse(rest, { ...options, fastpaths: false }).output; - - output = token.close = `)${expression})${extglobStar})`; - } - - if (token.prev.type === 'bos') { - state.negatedExtglob = true; - } - } - - push({ type: 'paren', extglob: true, value, output }); - decrement('parens'); - }; - - /** - * Fast paths - */ - - if (opts.fastpaths !== false && !/(^[*!]|[/()[\]{}"])/.test(input)) { - let backslashes = false; - - let output = input.replace(REGEX_SPECIAL_CHARS_BACKREF, (m, esc, chars, first, rest, index) => { - if (first === '\\') { - backslashes = true; - return m; - } - - if (first === '?') { - if (esc) { - return esc + first + (rest ? QMARK.repeat(rest.length) : ''); - } - if (index === 0) { - return qmarkNoDot + (rest ? QMARK.repeat(rest.length) : ''); - } - return QMARK.repeat(chars.length); - } - - if (first === '.') { - return DOT_LITERAL.repeat(chars.length); - } - - if (first === '*') { - if (esc) { - return esc + first + (rest ? star : ''); - } - return star; - } - return esc ? m : `\\${m}`; - }); - - if (backslashes === true) { - if (opts.unescape === true) { - output = output.replace(/\\/g, ''); - } else { - output = output.replace(/\\+/g, m => { - return m.length % 2 === 0 ? '\\\\' : (m ? '\\' : ''); - }); - } - } - - if (output === input && opts.contains === true) { - state.output = input; - return state; - } - - state.output = utils.wrapOutput(output, state, options); - return state; - } - - /** - * Tokenize input until we reach end-of-string - */ - - while (!eos()) { - value = advance(); - - if (value === '\u0000') { - continue; - } - - /** - * Escaped characters - */ - - if (value === '\\') { - const next = peek(); - - if (next === '/' && opts.bash !== true) { - continue; - } - - if (next === '.' || next === ';') { - continue; - } - - if (!next) { - value += '\\'; - push({ type: 'text', value }); - continue; - } - - // collapse slashes to reduce potential for exploits - const match = /^\\+/.exec(remaining()); - let slashes = 0; - - if (match && match[0].length > 2) { - slashes = match[0].length; - state.index += slashes; - if (slashes % 2 !== 0) { - value += '\\'; - } - } - - if (opts.unescape === true) { - value = advance(); - } else { - value += advance(); - } - - if (state.brackets === 0) { - push({ type: 'text', value }); - continue; - } - } - - /** - * If we're inside a regex character class, continue - * until we reach the closing bracket. - */ - - if (state.brackets > 0 && (value !== ']' || prev.value === '[' || prev.value === '[^')) { - if (opts.posix !== false && value === ':') { - const inner = prev.value.slice(1); - if (inner.includes('[')) { - prev.posix = true; - - if (inner.includes(':')) { - const idx = prev.value.lastIndexOf('['); - const pre = prev.value.slice(0, idx); - const rest = prev.value.slice(idx + 2); - const posix = POSIX_REGEX_SOURCE[rest]; - if (posix) { - prev.value = pre + posix; - state.backtrack = true; - advance(); - - if (!bos.output && tokens.indexOf(prev) === 1) { - bos.output = ONE_CHAR; - } - continue; - } - } - } - } - - if ((value === '[' && peek() !== ':') || (value === '-' && peek() === ']')) { - value = `\\${value}`; - } - - if (value === ']' && (prev.value === '[' || prev.value === '[^')) { - value = `\\${value}`; - } - - if (opts.posix === true && value === '!' && prev.value === '[') { - value = '^'; - } - - prev.value += value; - append({ value }); - continue; - } - - /** - * If we're inside a quoted string, continue - * until we reach the closing double quote. - */ - - if (state.quotes === 1 && value !== '"') { - value = utils.escapeRegex(value); - prev.value += value; - append({ value }); - continue; - } - - /** - * Double quotes - */ - - if (value === '"') { - state.quotes = state.quotes === 1 ? 0 : 1; - if (opts.keepQuotes === true) { - push({ type: 'text', value }); - } - continue; - } - - /** - * Parentheses - */ - - if (value === '(') { - increment('parens'); - push({ type: 'paren', value }); - continue; - } - - if (value === ')') { - if (state.parens === 0 && opts.strictBrackets === true) { - throw new SyntaxError(syntaxError('opening', '(')); - } - - const extglob = extglobs[extglobs.length - 1]; - if (extglob && state.parens === extglob.parens + 1) { - extglobClose(extglobs.pop()); - continue; - } - - push({ type: 'paren', value, output: state.parens ? ')' : '\\)' }); - decrement('parens'); - continue; - } - - /** - * Square brackets - */ - - if (value === '[') { - if (opts.nobracket === true || !remaining().includes(']')) { - if (opts.nobracket !== true && opts.strictBrackets === true) { - throw new SyntaxError(syntaxError('closing', ']')); - } - - value = `\\${value}`; - } else { - increment('brackets'); - } - - push({ type: 'bracket', value }); - continue; - } - - if (value === ']') { - if (opts.nobracket === true || (prev && prev.type === 'bracket' && prev.value.length === 1)) { - push({ type: 'text', value, output: `\\${value}` }); - continue; - } - - if (state.brackets === 0) { - if (opts.strictBrackets === true) { - throw new SyntaxError(syntaxError('opening', '[')); - } - - push({ type: 'text', value, output: `\\${value}` }); - continue; - } - - decrement('brackets'); - - const prevValue = prev.value.slice(1); - if (prev.posix !== true && prevValue[0] === '^' && !prevValue.includes('/')) { - value = `/${value}`; - } - - prev.value += value; - append({ value }); - - // when literal brackets are explicitly disabled - // assume we should match with a regex character class - if (opts.literalBrackets === false || utils.hasRegexChars(prevValue)) { - continue; - } - - const escaped = utils.escapeRegex(prev.value); - state.output = state.output.slice(0, -prev.value.length); - - // when literal brackets are explicitly enabled - // assume we should escape the brackets to match literal characters - if (opts.literalBrackets === true) { - state.output += escaped; - prev.value = escaped; - continue; - } - - // when the user specifies nothing, try to match both - prev.value = `(${capture}${escaped}|${prev.value})`; - state.output += prev.value; - continue; - } - - /** - * Braces - */ - - if (value === '{' && opts.nobrace !== true) { - increment('braces'); - - const open = { - type: 'brace', - value, - output: '(', - outputIndex: state.output.length, - tokensIndex: state.tokens.length - }; - - braces.push(open); - push(open); - continue; - } - - if (value === '}') { - const brace = braces[braces.length - 1]; - - if (opts.nobrace === true || !brace) { - push({ type: 'text', value, output: value }); - continue; - } - - let output = ')'; - - if (brace.dots === true) { - const arr = tokens.slice(); - const range = []; - - for (let i = arr.length - 1; i >= 0; i--) { - tokens.pop(); - if (arr[i].type === 'brace') { - break; - } - if (arr[i].type !== 'dots') { - range.unshift(arr[i].value); - } - } - - output = expandRange(range, opts); - state.backtrack = true; - } - - if (brace.comma !== true && brace.dots !== true) { - const out = state.output.slice(0, brace.outputIndex); - const toks = state.tokens.slice(brace.tokensIndex); - brace.value = brace.output = '\\{'; - value = output = '\\}'; - state.output = out; - for (const t of toks) { - state.output += (t.output || t.value); - } - } - - push({ type: 'brace', value, output }); - decrement('braces'); - braces.pop(); - continue; - } - - /** - * Pipes - */ - - if (value === '|') { - if (extglobs.length > 0) { - extglobs[extglobs.length - 1].conditions++; - } - push({ type: 'text', value }); - continue; - } - - /** - * Commas - */ - - if (value === ',') { - let output = value; - - const brace = braces[braces.length - 1]; - if (brace && stack[stack.length - 1] === 'braces') { - brace.comma = true; - output = '|'; - } - - push({ type: 'comma', value, output }); - continue; - } - - /** - * Slashes - */ - - if (value === '/') { - // if the beginning of the glob is "./", advance the start - // to the current index, and don't add the "./" characters - // to the state. This greatly simplifies lookbehinds when - // checking for BOS characters like "!" and "." (not "./") - if (prev.type === 'dot' && state.index === state.start + 1) { - state.start = state.index + 1; - state.consumed = ''; - state.output = ''; - tokens.pop(); - prev = bos; // reset "prev" to the first token - continue; - } - - push({ type: 'slash', value, output: SLASH_LITERAL }); - continue; - } - - /** - * Dots - */ - - if (value === '.') { - if (state.braces > 0 && prev.type === 'dot') { - if (prev.value === '.') prev.output = DOT_LITERAL; - const brace = braces[braces.length - 1]; - prev.type = 'dots'; - prev.output += value; - prev.value += value; - brace.dots = true; - continue; - } - - if ((state.braces + state.parens) === 0 && prev.type !== 'bos' && prev.type !== 'slash') { - push({ type: 'text', value, output: DOT_LITERAL }); - continue; - } - - push({ type: 'dot', value, output: DOT_LITERAL }); - continue; - } - - /** - * Question marks - */ - - if (value === '?') { - const isGroup = prev && prev.value === '('; - if (!isGroup && opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { - extglobOpen('qmark', value); - continue; - } - - if (prev && prev.type === 'paren') { - const next = peek(); - let output = value; - - if (next === '<' && !utils.supportsLookbehinds()) { - throw new Error('Node.js v10 or higher is required for regex lookbehinds'); - } - - if ((prev.value === '(' && !/[!=<:]/.test(next)) || (next === '<' && !/<([!=]|\w+>)/.test(remaining()))) { - output = `\\${value}`; - } - - push({ type: 'text', value, output }); - continue; - } - - if (opts.dot !== true && (prev.type === 'slash' || prev.type === 'bos')) { - push({ type: 'qmark', value, output: QMARK_NO_DOT }); - continue; - } - - push({ type: 'qmark', value, output: QMARK }); - continue; - } - - /** - * Exclamation - */ - - if (value === '!') { - if (opts.noextglob !== true && peek() === '(') { - if (peek(2) !== '?' || !/[!=<:]/.test(peek(3))) { - extglobOpen('negate', value); - continue; - } - } - - if (opts.nonegate !== true && state.index === 0) { - negate(); - continue; - } - } - - /** - * Plus - */ - - if (value === '+') { - if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { - extglobOpen('plus', value); - continue; - } - - if ((prev && prev.value === '(') || opts.regex === false) { - push({ type: 'plus', value, output: PLUS_LITERAL }); - continue; - } - - if ((prev && (prev.type === 'bracket' || prev.type === 'paren' || prev.type === 'brace')) || state.parens > 0) { - push({ type: 'plus', value }); - continue; - } - - push({ type: 'plus', value: PLUS_LITERAL }); - continue; - } - - /** - * Plain text - */ - - if (value === '@') { - if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { - push({ type: 'at', extglob: true, value, output: '' }); - continue; - } - - push({ type: 'text', value }); - continue; - } - - /** - * Plain text - */ - - if (value !== '*') { - if (value === '$' || value === '^') { - value = `\\${value}`; - } - - const match = REGEX_NON_SPECIAL_CHARS.exec(remaining()); - if (match) { - value += match[0]; - state.index += match[0].length; - } - - push({ type: 'text', value }); - continue; - } - - /** - * Stars - */ - - if (prev && (prev.type === 'globstar' || prev.star === true)) { - prev.type = 'star'; - prev.star = true; - prev.value += value; - prev.output = star; - state.backtrack = true; - state.globstar = true; - consume(value); - continue; - } - - let rest = remaining(); - if (opts.noextglob !== true && /^\([^?]/.test(rest)) { - extglobOpen('star', value); - continue; - } - - if (prev.type === 'star') { - if (opts.noglobstar === true) { - consume(value); - continue; - } - - const prior = prev.prev; - const before = prior.prev; - const isStart = prior.type === 'slash' || prior.type === 'bos'; - const afterStar = before && (before.type === 'star' || before.type === 'globstar'); - - if (opts.bash === true && (!isStart || (rest[0] && rest[0] !== '/'))) { - push({ type: 'star', value, output: '' }); - continue; - } - - const isBrace = state.braces > 0 && (prior.type === 'comma' || prior.type === 'brace'); - const isExtglob = extglobs.length && (prior.type === 'pipe' || prior.type === 'paren'); - if (!isStart && prior.type !== 'paren' && !isBrace && !isExtglob) { - push({ type: 'star', value, output: '' }); - continue; - } - - // strip consecutive `/**/` - while (rest.slice(0, 3) === '/**') { - const after = input[state.index + 4]; - if (after && after !== '/') { - break; - } - rest = rest.slice(3); - consume('/**', 3); - } - - if (prior.type === 'bos' && eos()) { - prev.type = 'globstar'; - prev.value += value; - prev.output = globstar(opts); - state.output = prev.output; - state.globstar = true; - consume(value); - continue; - } - - if (prior.type === 'slash' && prior.prev.type !== 'bos' && !afterStar && eos()) { - state.output = state.output.slice(0, -(prior.output + prev.output).length); - prior.output = `(?:${prior.output}`; - - prev.type = 'globstar'; - prev.output = globstar(opts) + (opts.strictSlashes ? ')' : '|$)'); - prev.value += value; - state.globstar = true; - state.output += prior.output + prev.output; - consume(value); - continue; - } - - if (prior.type === 'slash' && prior.prev.type !== 'bos' && rest[0] === '/') { - const end = rest[1] !== void 0 ? '|$' : ''; - - state.output = state.output.slice(0, -(prior.output + prev.output).length); - prior.output = `(?:${prior.output}`; - - prev.type = 'globstar'; - prev.output = `${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`; - prev.value += value; - - state.output += prior.output + prev.output; - state.globstar = true; - - consume(value + advance()); - - push({ type: 'slash', value: '/', output: '' }); - continue; - } - - if (prior.type === 'bos' && rest[0] === '/') { - prev.type = 'globstar'; - prev.value += value; - prev.output = `(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`; - state.output = prev.output; - state.globstar = true; - consume(value + advance()); - push({ type: 'slash', value: '/', output: '' }); - continue; - } - - // remove single star from output - state.output = state.output.slice(0, -prev.output.length); - - // reset previous token to globstar - prev.type = 'globstar'; - prev.output = globstar(opts); - prev.value += value; - - // reset output with globstar - state.output += prev.output; - state.globstar = true; - consume(value); - continue; - } - - const token = { type: 'star', value, output: star }; - - if (opts.bash === true) { - token.output = '.*?'; - if (prev.type === 'bos' || prev.type === 'slash') { - token.output = nodot + token.output; - } - push(token); - continue; - } - - if (prev && (prev.type === 'bracket' || prev.type === 'paren') && opts.regex === true) { - token.output = value; - push(token); - continue; - } - - if (state.index === state.start || prev.type === 'slash' || prev.type === 'dot') { - if (prev.type === 'dot') { - state.output += NO_DOT_SLASH; - prev.output += NO_DOT_SLASH; - - } else if (opts.dot === true) { - state.output += NO_DOTS_SLASH; - prev.output += NO_DOTS_SLASH; - - } else { - state.output += nodot; - prev.output += nodot; - } - - if (peek() !== '*') { - state.output += ONE_CHAR; - prev.output += ONE_CHAR; - } - } - - push(token); - } - - while (state.brackets > 0) { - if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ']')); - state.output = utils.escapeLast(state.output, '['); - decrement('brackets'); - } - - while (state.parens > 0) { - if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ')')); - state.output = utils.escapeLast(state.output, '('); - decrement('parens'); - } - - while (state.braces > 0) { - if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', '}')); - state.output = utils.escapeLast(state.output, '{'); - decrement('braces'); - } - - if (opts.strictSlashes !== true && (prev.type === 'star' || prev.type === 'bracket')) { - push({ type: 'maybe_slash', value: '', output: `${SLASH_LITERAL}?` }); - } - - // rebuild the output if we had to backtrack at any point - if (state.backtrack === true) { - state.output = ''; - - for (const token of state.tokens) { - state.output += token.output != null ? token.output : token.value; - - if (token.suffix) { - state.output += token.suffix; - } - } - } - - return state; -}; - -/** - * Fast paths for creating regular expressions for common glob patterns. - * This can significantly speed up processing and has very little downside - * impact when none of the fast paths match. - */ - -parse.fastpaths = (input, options) => { - const opts = { ...options }; - const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; - const len = input.length; - if (len > max) { - throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`); - } - - input = REPLACEMENTS[input] || input; - const win32 = utils.isWindows(options); - - // create constants based on platform, for windows or posix - const { - DOT_LITERAL, - SLASH_LITERAL, - ONE_CHAR, - DOTS_SLASH, - NO_DOT, - NO_DOTS, - NO_DOTS_SLASH, - STAR, - START_ANCHOR - } = constants.globChars(win32); - - const nodot = opts.dot ? NO_DOTS : NO_DOT; - const slashDot = opts.dot ? NO_DOTS_SLASH : NO_DOT; - const capture = opts.capture ? '' : '?:'; - const state = { negated: false, prefix: '' }; - let star = opts.bash === true ? '.*?' : STAR; - - if (opts.capture) { - star = `(${star})`; - } - - const globstar = opts => { - if (opts.noglobstar === true) return star; - return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`; - }; - - const create = str => { - switch (str) { - case '*': - return `${nodot}${ONE_CHAR}${star}`; - - case '.*': - return `${DOT_LITERAL}${ONE_CHAR}${star}`; - - case '*.*': - return `${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`; - - case '*/*': - return `${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`; - - case '**': - return nodot + globstar(opts); - - case '**/*': - return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`; - - case '**/*.*': - return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`; - - case '**/.*': - return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`; - - default: { - const match = /^(.*?)\.(\w+)$/.exec(str); - if (!match) return; - - const source = create(match[1]); - if (!source) return; - - return source + DOT_LITERAL + match[2]; - } - } - }; - - const output = utils.removePrefix(input, state); - let source = create(output); - - if (source && opts.strictSlashes !== true) { - source += `${SLASH_LITERAL}?`; - } - - return source; -}; - -module.exports = parse; - - -/***/ }), -/* 62 */ -/***/ ((module) => { - -/*! - * normalize-path - * - * Copyright (c) 2014-2018, Jon Schlinkert. - * Released under the MIT License. - */ - -module.exports = function(path, stripTrailing) { - if (typeof path !== 'string') { - throw new TypeError('expected path to be a string'); - } - - if (path === '\\' || path === '/') return '/'; - - var len = path.length; - if (len <= 1) return path; - - // ensure that win32 namespaces has two leading slashes, so that the path is - // handled properly by the win32 version of path.parse() after being normalized - // https://msdn.microsoft.com/library/windows/desktop/aa365247(v=vs.85).aspx#namespaces - var prefix = ''; - if (len > 4 && path[3] === '\\') { - var ch = path[2]; - if ((ch === '?' || ch === '.') && path.slice(0, 2) === '\\\\') { - path = path.slice(2); - prefix = '//'; - } - } - - var segs = path.split(/[/\\]+/); - if (stripTrailing !== false && segs[segs.length - 1] === '') { - segs.pop(); - } - return prefix + segs.join('/'); -}; - - -/***/ }), -/* 63 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var path = __webpack_require__(3); -var isglob = __webpack_require__(64); -var pathDirname = __webpack_require__(66); -var isWin32 = (__webpack_require__(67).platform)() === 'win32'; - -module.exports = function globParent(str) { - // flip windows path separators - if (isWin32 && str.indexOf('/') < 0) str = str.split('\\').join('/'); - - // special case for strings ending in enclosure containing path separator - if (/[\{\[].*[\/]*.*[\}\]]$/.test(str)) str += '/'; - - // preserves full path in case of trailing path separator - str += 'a'; - - // remove path parts that are globby - do {str = pathDirname.posix(str)} - while (isglob(str) || /(^|[^\\])([\{\[]|\([^\)]+$)/.test(str)); - - // remove escape chars and return result - return str.replace(/\\([\*\?\|\[\]\(\)\{\}])/g, '$1'); -}; - - -/***/ }), -/* 64 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -/*! - * is-glob - * - * Copyright (c) 2014-2016, Jon Schlinkert. - * Licensed under the MIT License. - */ - -var isExtglob = __webpack_require__(65); - -module.exports = function isGlob(str) { - if (typeof str !== 'string' || str === '') { - return false; - } - - if (isExtglob(str)) return true; - - var regex = /(\\).|([*?]|\[.*\]|\{.*\}|\(.*\|.*\)|^!)/; - var match; - - while ((match = regex.exec(str))) { - if (match[2]) return true; - str = str.slice(match.index + match[0].length); - } - return false; -}; - - -/***/ }), -/* 65 */ -/***/ ((module) => { - -/*! - * is-extglob - * - * Copyright (c) 2014-2016, Jon Schlinkert. - * Licensed under the MIT License. - */ - -module.exports = function isExtglob(str) { - if (typeof str !== 'string' || str === '') { - return false; - } - - var match; - while ((match = /(\\).|([@?!+*]\(.*\))/g.exec(str))) { - if (match[2]) return true; - str = str.slice(match.index + match[0].length); - } - - return false; -}; - - -/***/ }), -/* 66 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var path = __webpack_require__(3); -var inspect = (__webpack_require__(17).inspect); - -function assertPath(path) { - if (typeof path !== 'string') { - throw new TypeError('Path must be a string. Received ' + inspect(path)); - } -} - -function posix(path) { - assertPath(path); - if (path.length === 0) - return '.'; - var code = path.charCodeAt(0); - var hasRoot = (code === 47/*/*/); - var end = -1; - var matchedSlash = true; - for (var i = path.length - 1; i >= 1; --i) { - code = path.charCodeAt(i); - if (code === 47/*/*/) { - if (!matchedSlash) { - end = i; - break; - } - } else { - // We saw the first non-path separator - matchedSlash = false; - } - } - - if (end === -1) - return hasRoot ? '/' : '.'; - if (hasRoot && end === 1) - return '//'; - return path.slice(0, end); -} - -function win32(path) { - assertPath(path); - var len = path.length; - if (len === 0) - return '.'; - var rootEnd = -1; - var end = -1; - var matchedSlash = true; - var offset = 0; - var code = path.charCodeAt(0); - - // Try to match a root - if (len > 1) { - if (code === 47/*/*/ || code === 92/*\*/) { - // Possible UNC root - - rootEnd = offset = 1; - - code = path.charCodeAt(1); - if (code === 47/*/*/ || code === 92/*\*/) { - // Matched double path separator at beginning - var j = 2; - var last = j; - // Match 1 or more non-path separators - for (; j < len; ++j) { - code = path.charCodeAt(j); - if (code === 47/*/*/ || code === 92/*\*/) - break; - } - if (j < len && j !== last) { - // Matched! - last = j; - // Match 1 or more path separators - for (; j < len; ++j) { - code = path.charCodeAt(j); - if (code !== 47/*/*/ && code !== 92/*\*/) - break; - } - if (j < len && j !== last) { - // Matched! - last = j; - // Match 1 or more non-path separators - for (; j < len; ++j) { - code = path.charCodeAt(j); - if (code === 47/*/*/ || code === 92/*\*/) - break; - } - if (j === len) { - // We matched a UNC root only - return path; - } - if (j !== last) { - // We matched a UNC root with leftovers - - // Offset by 1 to include the separator after the UNC root to - // treat it as a "normal root" on top of a (UNC) root - rootEnd = offset = j + 1; - } - } - } - } - } else if ((code >= 65/*A*/ && code <= 90/*Z*/) || - (code >= 97/*a*/ && code <= 122/*z*/)) { - // Possible device root - - code = path.charCodeAt(1); - if (path.charCodeAt(1) === 58/*:*/) { - rootEnd = offset = 2; - if (len > 2) { - code = path.charCodeAt(2); - if (code === 47/*/*/ || code === 92/*\*/) - rootEnd = offset = 3; - } - } - } - } else if (code === 47/*/*/ || code === 92/*\*/) { - return path[0]; - } - - for (var i = len - 1; i >= offset; --i) { - code = path.charCodeAt(i); - if (code === 47/*/*/ || code === 92/*\*/) { - if (!matchedSlash) { - end = i; - break; - } - } else { - // We saw the first non-path separator - matchedSlash = false; - } - } - - if (end === -1) { - if (rootEnd === -1) - return '.'; - else - end = rootEnd; - } - return path.slice(0, end); -} - -module.exports = process.platform === 'win32' ? win32 : posix; -module.exports.posix = posix; -module.exports.win32 = win32; - - -/***/ }), -/* 67 */ -/***/ ((module) => { - -"use strict"; -module.exports = require("os"); - -/***/ }), -/* 68 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -/*! - * is-glob - * - * Copyright (c) 2014-2017, Jon Schlinkert. - * Released under the MIT License. - */ - -var isExtglob = __webpack_require__(65); -var chars = { '{': '}', '(': ')', '[': ']'}; -var strictCheck = function(str) { - if (str[0] === '!') { - return true; - } - var index = 0; - var pipeIndex = -2; - var closeSquareIndex = -2; - var closeCurlyIndex = -2; - var closeParenIndex = -2; - var backSlashIndex = -2; - while (index < str.length) { - if (str[index] === '*') { - return true; - } - - if (str[index + 1] === '?' && /[\].+)]/.test(str[index])) { - return true; - } - - if (closeSquareIndex !== -1 && str[index] === '[' && str[index + 1] !== ']') { - if (closeSquareIndex < index) { - closeSquareIndex = str.indexOf(']', index); - } - if (closeSquareIndex > index) { - if (backSlashIndex === -1 || backSlashIndex > closeSquareIndex) { - return true; - } - backSlashIndex = str.indexOf('\\', index); - if (backSlashIndex === -1 || backSlashIndex > closeSquareIndex) { - return true; - } - } - } - - if (closeCurlyIndex !== -1 && str[index] === '{' && str[index + 1] !== '}') { - closeCurlyIndex = str.indexOf('}', index); - if (closeCurlyIndex > index) { - backSlashIndex = str.indexOf('\\', index); - if (backSlashIndex === -1 || backSlashIndex > closeCurlyIndex) { - return true; - } - } - } - - if (closeParenIndex !== -1 && str[index] === '(' && str[index + 1] === '?' && /[:!=]/.test(str[index + 2]) && str[index + 3] !== ')') { - closeParenIndex = str.indexOf(')', index); - if (closeParenIndex > index) { - backSlashIndex = str.indexOf('\\', index); - if (backSlashIndex === -1 || backSlashIndex > closeParenIndex) { - return true; - } - } - } - - if (pipeIndex !== -1 && str[index] === '(' && str[index + 1] !== '|') { - if (pipeIndex < index) { - pipeIndex = str.indexOf('|', index); - } - if (pipeIndex !== -1 && str[pipeIndex + 1] !== ')') { - closeParenIndex = str.indexOf(')', pipeIndex); - if (closeParenIndex > pipeIndex) { - backSlashIndex = str.indexOf('\\', pipeIndex); - if (backSlashIndex === -1 || backSlashIndex > closeParenIndex) { - return true; - } - } - } - } - - if (str[index] === '\\') { - var open = str[index + 1]; - index += 2; - var close = chars[open]; - - if (close) { - var n = str.indexOf(close, index); - if (n !== -1) { - index = n + 1; - } - } - - if (str[index] === '!') { - return true; - } - } else { - index++; - } - } - return false; -}; - -var relaxedCheck = function(str) { - if (str[0] === '!') { - return true; - } - var index = 0; - while (index < str.length) { - if (/[*?{}()[\]]/.test(str[index])) { - return true; - } - - if (str[index] === '\\') { - var open = str[index + 1]; - index += 2; - var close = chars[open]; - - if (close) { - var n = str.indexOf(close, index); - if (n !== -1) { - index = n + 1; - } - } - - if (str[index] === '!') { - return true; - } - } else { - index++; - } - } - return false; -}; - -module.exports = function isGlob(str, options) { - if (typeof str !== 'string' || str === '') { - return false; - } - - if (isExtglob(str)) { - return true; - } - - var check = strictCheck; - - // optionally relax check - if (options && options.strict === false) { - check = relaxedCheck; - } - - return check(str); -}; - - -/***/ }), -/* 69 */ -/***/ ((module) => { - -"use strict"; - - -function posix(path) { - return path.charAt(0) === '/'; -} - -function win32(path) { - // https://github.com/nodejs/node/blob/b3fcc245fb25539909ef1d5eaa01dbf92e168633/lib/path.js#L56 - var splitDeviceRe = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/; - var result = splitDeviceRe.exec(path); - var device = result[1] || ''; - var isUnc = Boolean(device && device.charAt(1) !== ':'); - - // UNC paths are always absolute - return Boolean(result[2] || isUnc); -} - -module.exports = process.platform === 'win32' ? win32 : posix; -module.exports.posix = posix; -module.exports.win32 = win32; - - -/***/ }), -/* 70 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -try { - var util = __webpack_require__(17); - /* istanbul ignore next */ - if (typeof util.inherits !== 'function') throw ''; - module.exports = util.inherits; -} catch (e) { - /* istanbul ignore next */ - module.exports = __webpack_require__(71); -} - - -/***/ }), -/* 71 */ -/***/ ((module) => { - -if (typeof Object.create === 'function') { - // implementation from standard node.js 'util' module - module.exports = function inherits(ctor, superCtor) { - if (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) { - if (superCtor) { - ctor.super_ = superCtor - var TempCtor = function () {} - TempCtor.prototype = superCtor.prototype - ctor.prototype = new TempCtor() - ctor.prototype.constructor = ctor - } - } -} - - -/***/ }), -/* 72 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -/** - * Module dependencies - */ - -var toRegex = __webpack_require__(73); -var unique = __webpack_require__(95); -var extend = __webpack_require__(96); - -/** - * Local dependencies - */ - -var compilers = __webpack_require__(98); -var parsers = __webpack_require__(111); -var Braces = __webpack_require__(117); -var utils = __webpack_require__(99); -var MAX_LENGTH = 1024 * 64; -var cache = {}; - -/** - * Convert the given `braces` pattern into a regex-compatible string. By default, only one string is generated for every input string. Set `options.expand` to true to return an array of patterns (similar to Bash or minimatch. Before using `options.expand`, it's recommended that you read the [performance notes](#performance)). - * - * ```js - * var braces = require('braces'); - * console.log(braces('{a,b,c}')); - * //=> ['(a|b|c)'] - * - * console.log(braces('{a,b,c}', {expand: true})); - * //=> ['a', 'b', 'c'] - * ``` - * @param {String} `str` - * @param {Object} `options` - * @return {String} - * @api public - */ - -function braces(pattern, options) { - var key = utils.createKey(String(pattern), options); - var arr = []; - - var disabled = options && options.cache === false; - if (!disabled && cache.hasOwnProperty(key)) { - return cache[key]; - } - - if (Array.isArray(pattern)) { - for (var i = 0; i < pattern.length; i++) { - arr.push.apply(arr, braces.create(pattern[i], options)); - } - } else { - arr = braces.create(pattern, options); - } - - if (options && options.nodupes === true) { - arr = unique(arr); - } - - if (!disabled) { - cache[key] = arr; - } - return arr; -} - -/** - * Expands a brace pattern into an array. This method is called by the main [braces](#braces) function when `options.expand` is true. Before using this method it's recommended that you read the [performance notes](#performance)) and advantages of using [.optimize](#optimize) instead. - * - * ```js - * var braces = require('braces'); - * console.log(braces.expand('a/{b,c}/d')); - * //=> ['a/b/d', 'a/c/d']; - * ``` - * @param {String} `pattern` Brace pattern - * @param {Object} `options` - * @return {Array} Returns an array of expanded values. - * @api public - */ - -braces.expand = function(pattern, options) { - return braces.create(pattern, extend({}, options, {expand: true})); -}; - -/** - * Expands a brace pattern into a regex-compatible, optimized string. This method is called by the main [braces](#braces) function by default. - * - * ```js - * var braces = require('braces'); - * console.log(braces.expand('a/{b,c}/d')); - * //=> ['a/(b|c)/d'] - * ``` - * @param {String} `pattern` Brace pattern - * @param {Object} `options` - * @return {Array} Returns an array of expanded values. - * @api public - */ - -braces.optimize = function(pattern, options) { - return braces.create(pattern, options); -}; - -/** - * Processes a brace pattern and returns either an expanded array (if `options.expand` is true), a highly optimized regex-compatible string. This method is called by the main [braces](#braces) function. - * - * ```js - * var braces = require('braces'); - * console.log(braces.create('user-{200..300}/project-{a,b,c}-{1..10}')) - * //=> 'user-(20[0-9]|2[1-9][0-9]|300)/project-(a|b|c)-([1-9]|10)' - * ``` - * @param {String} `pattern` Brace pattern - * @param {Object} `options` - * @return {Array} Returns an array of expanded values. - * @api public - */ - -braces.create = function(pattern, options) { - if (typeof pattern !== 'string') { - throw new TypeError('expected a string'); - } - - var maxLength = (options && options.maxLength) || MAX_LENGTH; - if (pattern.length >= maxLength) { - throw new Error('expected pattern to be less than ' + maxLength + ' characters'); - } - - function create() { - if (pattern === '' || pattern.length < 3) { - return [pattern]; - } - - if (utils.isEmptySets(pattern)) { - return []; - } - - if (utils.isQuotedString(pattern)) { - return [pattern.slice(1, -1)]; - } - - var proto = new Braces(options); - var result = !options || options.expand !== true - ? proto.optimize(pattern, options) - : proto.expand(pattern, options); - - // get the generated pattern(s) - var arr = result.output; - - // filter out empty strings if specified - if (options && options.noempty === true) { - arr = arr.filter(Boolean); - } - - // filter out duplicates if specified - if (options && options.nodupes === true) { - arr = unique(arr); - } - - Object.defineProperty(arr, 'result', { - enumerable: false, - value: result - }); - - return arr; - } - - return memoize('create', pattern, options, create); -}; - -/** - * Create a regular expression from the given string `pattern`. - * - * ```js - * var braces = require('braces'); - * - * console.log(braces.makeRe('id-{200..300}')); - * //=> /^(?:id-(20[0-9]|2[1-9][0-9]|300))$/ - * ``` - * @param {String} `pattern` The pattern to convert to regex. - * @param {Object} `options` - * @return {RegExp} - * @api public - */ - -braces.makeRe = function(pattern, options) { - if (typeof pattern !== 'string') { - throw new TypeError('expected a string'); - } - - var maxLength = (options && options.maxLength) || MAX_LENGTH; - if (pattern.length >= maxLength) { - throw new Error('expected pattern to be less than ' + maxLength + ' characters'); - } - - function makeRe() { - var arr = braces(pattern, options); - var opts = extend({strictErrors: false}, options); - return toRegex(arr, opts); - } - - return memoize('makeRe', pattern, options, makeRe); -}; - -/** - * Parse the given `str` with the given `options`. - * - * ```js - * var braces = require('braces'); - * var ast = braces.parse('a/{b,c}/d'); - * console.log(ast); - * // { type: 'root', - * // errors: [], - * // input: 'a/{b,c}/d', - * // nodes: - * // [ { type: 'bos', val: '' }, - * // { type: 'text', val: 'a/' }, - * // { type: 'brace', - * // nodes: - * // [ { type: 'brace.open', val: '{' }, - * // { type: 'text', val: 'b,c' }, - * // { type: 'brace.close', val: '}' } ] }, - * // { type: 'text', val: '/d' }, - * // { type: 'eos', val: '' } ] } - * ``` - * @param {String} `pattern` Brace pattern to parse - * @param {Object} `options` - * @return {Object} Returns an AST - * @api public - */ - -braces.parse = function(pattern, options) { - var proto = new Braces(options); - return proto.parse(pattern, options); -}; - -/** - * Compile the given `ast` or string with the given `options`. - * - * ```js - * var braces = require('braces'); - * var ast = braces.parse('a/{b,c}/d'); - * console.log(braces.compile(ast)); - * // { options: { source: 'string' }, - * // state: {}, - * // compilers: - * // { eos: [Function], - * // noop: [Function], - * // bos: [Function], - * // brace: [Function], - * // 'brace.open': [Function], - * // text: [Function], - * // 'brace.close': [Function] }, - * // output: [ 'a/(b|c)/d' ], - * // ast: - * // { ... }, - * // parsingErrors: [] } - * ``` - * @param {Object|String} `ast` AST from [.parse](#parse). If a string is passed it will be parsed first. - * @param {Object} `options` - * @return {Object} Returns an object that has an `output` property with the compiled string. - * @api public - */ - -braces.compile = function(ast, options) { - var proto = new Braces(options); - return proto.compile(ast, options); -}; - -/** - * Clear the regex cache. - * - * ```js - * braces.clearCache(); - * ``` - * @api public - */ - -braces.clearCache = function() { - cache = braces.cache = {}; -}; - -/** - * Memoize a generated regex or function. A unique key is generated - * from the method name, pattern, and user-defined options. Set - * options.memoize to false to disable. - */ - -function memoize(type, pattern, options, fn) { - var key = utils.createKey(type + ':' + pattern, options); - var disabled = options && options.cache === false; - if (disabled) { - braces.clearCache(); - return fn(pattern, options); - } - - if (cache.hasOwnProperty(key)) { - return cache[key]; - } - - var res = fn(pattern, options); - cache[key] = res; - return res; -} - -/** - * Expose `Braces` constructor and methods - * @type {Function} - */ - -braces.Braces = Braces; -braces.compilers = compilers; -braces.parsers = parsers; -braces.cache = cache; - -/** - * Expose `braces` - * @type {Function} - */ - -module.exports = braces; - - -/***/ }), -/* 73 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var safe = __webpack_require__(74); -var define = __webpack_require__(80); -var extend = __webpack_require__(88); -var not = __webpack_require__(92); -var MAX_LENGTH = 1024 * 64; - -/** - * Session cache - */ - -var cache = {}; - -/** - * Create a regular expression from the given `pattern` string. - * - * @param {String|RegExp} `pattern` Pattern can be a string or regular expression. - * @param {Object} `options` - * @return {RegExp} - * @api public - */ - -module.exports = function(patterns, options) { - if (!Array.isArray(patterns)) { - return makeRe(patterns, options); - } - return makeRe(patterns.join('|'), options); -}; - -/** - * Create a regular expression from the given `pattern` string. - * - * @param {String|RegExp} `pattern` Pattern can be a string or regular expression. - * @param {Object} `options` - * @return {RegExp} - * @api public - */ - -function makeRe(pattern, options) { - if (pattern instanceof RegExp) { - return pattern; - } - - if (typeof pattern !== 'string') { - throw new TypeError('expected a string'); - } - - if (pattern.length > MAX_LENGTH) { - throw new Error('expected pattern to be less than ' + MAX_LENGTH + ' characters'); - } - - var key = pattern; - // do this before shallow cloning options, it's a lot faster - if (!options || (options && options.cache !== false)) { - key = createKey(pattern, options); - - if (cache.hasOwnProperty(key)) { - return cache[key]; - } - } - - var opts = extend({}, options); - if (opts.contains === true) { - if (opts.negate === true) { - opts.strictNegate = false; - } else { - opts.strict = false; - } - } - - if (opts.strict === false) { - opts.strictOpen = false; - opts.strictClose = false; - } - - var open = opts.strictOpen !== false ? '^' : ''; - var close = opts.strictClose !== false ? '$' : ''; - var flags = opts.flags || ''; - var regex; - - if (opts.nocase === true && !/i/.test(flags)) { - flags += 'i'; - } - - try { - if (opts.negate || typeof opts.strictNegate === 'boolean') { - pattern = not.create(pattern, opts); - } - - var str = open + '(?:' + pattern + ')' + close; - regex = new RegExp(str, flags); - - if (opts.safe === true && safe(regex) === false) { - throw new Error('potentially unsafe regular expression: ' + regex.source); - } - - } catch (err) { - if (opts.strictErrors === true || opts.safe === true) { - err.key = key; - err.pattern = pattern; - err.originalOptions = options; - err.createdOptions = opts; - throw err; - } - - try { - regex = new RegExp('^' + pattern.replace(/(\W)/g, '\\$1') + '$'); - } catch (err) { - regex = /.^/; //<= match nothing - } - } - - if (opts.cache !== false) { - memoize(regex, key, pattern, opts); - } - return regex; -} - -/** - * Memoize generated regex. This can result in dramatic speed improvements - * and simplify debugging by adding options and pattern to the regex. It can be - * disabled by passing setting `options.cache` to false. - */ - -function memoize(regex, key, pattern, options) { - define(regex, 'cached', true); - define(regex, 'pattern', pattern); - define(regex, 'options', options); - define(regex, 'key', key); - cache[key] = regex; -} - -/** - * Create the key to use for memoization. The key is generated - * by iterating over the options and concatenating key-value pairs - * to the pattern string. - */ - -function createKey(pattern, options) { - if (!options) return pattern; - var key = pattern; - for (var prop in options) { - if (options.hasOwnProperty(prop)) { - key += ';' + prop + '=' + String(options[prop]); - } - } - return key; -} - -/** - * Expose `makeRe` - */ - -module.exports.makeRe = makeRe; - - -/***/ }), -/* 74 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(75); -var types = parse.types; - -module.exports = function (re, opts) { - if (!opts) opts = {}; - var replimit = opts.limit === undefined ? 25 : opts.limit; - - if (isRegExp(re)) re = re.source; - else if (typeof re !== 'string') re = String(re); - - try { re = parse(re) } - catch (err) { return false } - - var reps = 0; - return (function walk (node, starHeight) { - if (node.type === types.REPETITION) { - starHeight ++; - reps ++; - if (starHeight > 1) return false; - if (reps > replimit) return false; - } - - if (node.options) { - for (var i = 0, len = node.options.length; i < len; i++) { - var ok = walk({ stack: node.options[i] }, starHeight); - if (!ok) return false; - } - } - var stack = node.stack || (node.value && node.value.stack); - if (!stack) return true; - - for (var i = 0; i < stack.length; i++) { - var ok = walk(stack[i], starHeight); - if (!ok) return false; - } - - return true; - })(re, 0); -}; - -function isRegExp (x) { - return {}.toString.call(x) === '[object RegExp]'; -} - - -/***/ }), -/* 75 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var util = __webpack_require__(76); -var types = __webpack_require__(77); -var sets = __webpack_require__(78); -var positions = __webpack_require__(79); - - -module.exports = function(regexpStr) { - var i = 0, l, c, - start = { type: types.ROOT, stack: []}, - - // Keep track of last clause/group and stack. - lastGroup = start, - last = start.stack, - groupStack = []; - - - var repeatErr = function(i) { - util.error(regexpStr, 'Nothing to repeat at column ' + (i - 1)); - }; - - // Decode a few escaped characters. - var str = util.strToChars(regexpStr); - l = str.length; - - // Iterate through each character in string. - while (i < l) { - c = str[i++]; - - switch (c) { - // Handle escaped characters, inclues a few sets. - case '\\': - c = str[i++]; - - switch (c) { - case 'b': - last.push(positions.wordBoundary()); - break; - - case 'B': - last.push(positions.nonWordBoundary()); - break; - - case 'w': - last.push(sets.words()); - break; - - case 'W': - last.push(sets.notWords()); - break; - - case 'd': - last.push(sets.ints()); - break; - - case 'D': - last.push(sets.notInts()); - break; - - case 's': - last.push(sets.whitespace()); - break; - - case 'S': - last.push(sets.notWhitespace()); - break; - - default: - // Check if c is integer. - // In which case it's a reference. - if (/\d/.test(c)) { - last.push({ type: types.REFERENCE, value: parseInt(c, 10) }); - - // Escaped character. - } else { - last.push({ type: types.CHAR, value: c.charCodeAt(0) }); - } - } - - break; - - - // Positionals. - case '^': - last.push(positions.begin()); - break; - - case '$': - last.push(positions.end()); - break; - - - // Handle custom sets. - case '[': - // Check if this class is 'anti' i.e. [^abc]. - var not; - if (str[i] === '^') { - not = true; - i++; - } else { - not = false; - } - - // Get all the characters in class. - var classTokens = util.tokenizeClass(str.slice(i), regexpStr); - - // Increase index by length of class. - i += classTokens[1]; - last.push({ - type: types.SET, - set: classTokens[0], - not: not, - }); - - break; - - - // Class of any character except \n. - case '.': - last.push(sets.anyChar()); - break; - - - // Push group onto stack. - case '(': - // Create group. - var group = { - type: types.GROUP, - stack: [], - remember: true, - }; - - c = str[i]; - - // If if this is a special kind of group. - if (c === '?') { - c = str[i + 1]; - i += 2; - - // Match if followed by. - if (c === '=') { - group.followedBy = true; - - // Match if not followed by. - } else if (c === '!') { - group.notFollowedBy = true; - - } else if (c !== ':') { - util.error(regexpStr, - 'Invalid group, character \'' + c + - '\' after \'?\' at column ' + (i - 1)); - } - - group.remember = false; - } - - // Insert subgroup into current group stack. - last.push(group); - - // Remember the current group for when the group closes. - groupStack.push(lastGroup); - - // Make this new group the current group. - lastGroup = group; - last = group.stack; - break; - - - // Pop group out of stack. - case ')': - if (groupStack.length === 0) { - util.error(regexpStr, 'Unmatched ) at column ' + (i - 1)); - } - lastGroup = groupStack.pop(); - - // Check if this group has a PIPE. - // To get back the correct last stack. - last = lastGroup.options ? - lastGroup.options[lastGroup.options.length - 1] : lastGroup.stack; - break; - - - // Use pipe character to give more choices. - case '|': - // Create array where options are if this is the first PIPE - // in this clause. - if (!lastGroup.options) { - lastGroup.options = [lastGroup.stack]; - delete lastGroup.stack; - } - - // Create a new stack and add to options for rest of clause. - var stack = []; - lastGroup.options.push(stack); - last = stack; - break; - - - // Repetition. - // For every repetition, remove last element from last stack - // then insert back a RANGE object. - // This design is chosen because there could be more than - // one repetition symbols in a regex i.e. `a?+{2,3}`. - case '{': - var rs = /^(\d+)(,(\d+)?)?\}/.exec(str.slice(i)), min, max; - if (rs !== null) { - if (last.length === 0) { - repeatErr(i); - } - min = parseInt(rs[1], 10); - max = rs[2] ? rs[3] ? parseInt(rs[3], 10) : Infinity : min; - i += rs[0].length; - - last.push({ - type: types.REPETITION, - min: min, - max: max, - value: last.pop(), - }); - } else { - last.push({ - type: types.CHAR, - value: 123, - }); - } - break; - - case '?': - if (last.length === 0) { - repeatErr(i); - } - last.push({ - type: types.REPETITION, - min: 0, - max: 1, - value: last.pop(), - }); - break; - - case '+': - if (last.length === 0) { - repeatErr(i); - } - last.push({ - type: types.REPETITION, - min: 1, - max: Infinity, - value: last.pop(), - }); - break; - - case '*': - if (last.length === 0) { - repeatErr(i); - } - last.push({ - type: types.REPETITION, - min: 0, - max: Infinity, - value: last.pop(), - }); - break; - - - // Default is a character that is not `\[](){}?+*^$`. - default: - last.push({ - type: types.CHAR, - value: c.charCodeAt(0), - }); - } - - } - - // Check if any groups have not been closed. - if (groupStack.length !== 0) { - util.error(regexpStr, 'Unterminated group'); - } - - return start; -}; - -module.exports.types = types; - - -/***/ }), -/* 76 */ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -var types = __webpack_require__(77); -var sets = __webpack_require__(78); - - -// All of these are private and only used by randexp. -// It's assumed that they will always be called with the correct input. - -var CTRL = '@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^ ?'; -var SLSH = { '0': 0, 't': 9, 'n': 10, 'v': 11, 'f': 12, 'r': 13 }; - -/** - * Finds character representations in str and convert all to - * their respective characters - * - * @param {String} str - * @return {String} - */ -exports.strToChars = function(str) { - /* jshint maxlen: false */ - var chars_regex = /(\[\\b\])|(\\)?\\(?:u([A-F0-9]{4})|x([A-F0-9]{2})|(0?[0-7]{2})|c([@A-Z\[\\\]\^?])|([0tnvfr]))/g; - str = str.replace(chars_regex, function(s, b, lbs, a16, b16, c8, dctrl, eslsh) { - if (lbs) { - return s; - } - - var code = b ? 8 : - a16 ? parseInt(a16, 16) : - b16 ? parseInt(b16, 16) : - c8 ? parseInt(c8, 8) : - dctrl ? CTRL.indexOf(dctrl) : - SLSH[eslsh]; - - var c = String.fromCharCode(code); - - // Escape special regex characters. - if (/[\[\]{}\^$.|?*+()]/.test(c)) { - c = '\\' + c; - } - - return c; - }); - - return str; -}; - - -/** - * turns class into tokens - * reads str until it encounters a ] not preceeded by a \ - * - * @param {String} str - * @param {String} regexpStr - * @return {Array., Number>} - */ -exports.tokenizeClass = function(str, regexpStr) { - /* jshint maxlen: false */ - var tokens = []; - var regexp = /\\(?:(w)|(d)|(s)|(W)|(D)|(S))|((?:(?:\\)(.)|([^\]\\]))-(?:\\)?([^\]]))|(\])|(?:\\)?(.)/g; - var rs, c; - - - while ((rs = regexp.exec(str)) != null) { - if (rs[1]) { - tokens.push(sets.words()); - - } else if (rs[2]) { - tokens.push(sets.ints()); - - } else if (rs[3]) { - tokens.push(sets.whitespace()); - - } else if (rs[4]) { - tokens.push(sets.notWords()); - - } else if (rs[5]) { - tokens.push(sets.notInts()); - - } else if (rs[6]) { - tokens.push(sets.notWhitespace()); - - } else if (rs[7]) { - tokens.push({ - type: types.RANGE, - from: (rs[8] || rs[9]).charCodeAt(0), - to: rs[10].charCodeAt(0), - }); - - } else if (c = rs[12]) { - tokens.push({ - type: types.CHAR, - value: c.charCodeAt(0), - }); - - } else { - return [tokens, regexp.lastIndex]; - } - } - - exports.error(regexpStr, 'Unterminated character class'); -}; - - -/** - * Shortcut to throw errors. - * - * @param {String} regexp - * @param {String} msg - */ -exports.error = function(regexp, msg) { - throw new SyntaxError('Invalid regular expression: /' + regexp + '/: ' + msg); -}; - - -/***/ }), -/* 77 */ -/***/ ((module) => { - -module.exports = { - ROOT : 0, - GROUP : 1, - POSITION : 2, - SET : 3, - RANGE : 4, - REPETITION : 5, - REFERENCE : 6, - CHAR : 7, -}; - - -/***/ }), -/* 78 */ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -var types = __webpack_require__(77); - -var INTS = function() { - return [{ type: types.RANGE , from: 48, to: 57 }]; -}; - -var WORDS = function() { - return [ - { type: types.CHAR, value: 95 }, - { type: types.RANGE, from: 97, to: 122 }, - { type: types.RANGE, from: 65, to: 90 } - ].concat(INTS()); -}; - -var WHITESPACE = function() { - return [ - { type: types.CHAR, value: 9 }, - { type: types.CHAR, value: 10 }, - { type: types.CHAR, value: 11 }, - { type: types.CHAR, value: 12 }, - { type: types.CHAR, value: 13 }, - { type: types.CHAR, value: 32 }, - { type: types.CHAR, value: 160 }, - { type: types.CHAR, value: 5760 }, - { type: types.CHAR, value: 6158 }, - { type: types.CHAR, value: 8192 }, - { type: types.CHAR, value: 8193 }, - { type: types.CHAR, value: 8194 }, - { type: types.CHAR, value: 8195 }, - { type: types.CHAR, value: 8196 }, - { type: types.CHAR, value: 8197 }, - { type: types.CHAR, value: 8198 }, - { type: types.CHAR, value: 8199 }, - { type: types.CHAR, value: 8200 }, - { type: types.CHAR, value: 8201 }, - { type: types.CHAR, value: 8202 }, - { type: types.CHAR, value: 8232 }, - { type: types.CHAR, value: 8233 }, - { type: types.CHAR, value: 8239 }, - { type: types.CHAR, value: 8287 }, - { type: types.CHAR, value: 12288 }, - { type: types.CHAR, value: 65279 } - ]; -}; - -var NOTANYCHAR = function() { - return [ - { type: types.CHAR, value: 10 }, - { type: types.CHAR, value: 13 }, - { type: types.CHAR, value: 8232 }, - { type: types.CHAR, value: 8233 }, - ]; -}; - -// Predefined class objects. -exports.words = function() { - return { type: types.SET, set: WORDS(), not: false }; -}; - -exports.notWords = function() { - return { type: types.SET, set: WORDS(), not: true }; -}; - -exports.ints = function() { - return { type: types.SET, set: INTS(), not: false }; -}; - -exports.notInts = function() { - return { type: types.SET, set: INTS(), not: true }; -}; - -exports.whitespace = function() { - return { type: types.SET, set: WHITESPACE(), not: false }; -}; - -exports.notWhitespace = function() { - return { type: types.SET, set: WHITESPACE(), not: true }; -}; - -exports.anyChar = function() { - return { type: types.SET, set: NOTANYCHAR(), not: true }; -}; - - -/***/ }), -/* 79 */ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -var types = __webpack_require__(77); - -exports.wordBoundary = function() { - return { type: types.POSITION, value: 'b' }; -}; - -exports.nonWordBoundary = function() { - return { type: types.POSITION, value: 'B' }; -}; - -exports.begin = function() { - return { type: types.POSITION, value: '^' }; -}; - -exports.end = function() { - return { type: types.POSITION, value: '$' }; -}; - - -/***/ }), -/* 80 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -/*! - * define-property - * - * Copyright (c) 2015-2018, Jon Schlinkert. - * Released under the MIT License. - */ - - - -var isobject = __webpack_require__(81); -var isDescriptor = __webpack_require__(82); -var define = (typeof Reflect !== 'undefined' && Reflect.defineProperty) - ? Reflect.defineProperty - : Object.defineProperty; - -module.exports = function defineProperty(obj, key, val) { - if (!isobject(obj) && typeof obj !== 'function' && !Array.isArray(obj)) { - throw new TypeError('expected an object, function, or array'); - } - - if (typeof key !== 'string') { - throw new TypeError('expected "key" to be a string'); - } - - if (isDescriptor(val)) { - define(obj, key, val); - return obj; - } - - define(obj, key, { - configurable: true, - enumerable: false, - writable: true, - value: val - }); - - return obj; -}; - - -/***/ }), -/* 81 */ -/***/ ((module) => { - -"use strict"; -/*! - * isobject - * - * Copyright (c) 2014-2017, Jon Schlinkert. - * Released under the MIT License. - */ - - - -module.exports = function isObject(val) { - return val != null && typeof val === 'object' && Array.isArray(val) === false; -}; - - -/***/ }), -/* 82 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var isAccessor = __webpack_require__(83); -var isData = __webpack_require__(87); - -module.exports = function isDescriptor(obj, key) { - if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) { - return false; - } - - if ('get' in obj || 'set' in obj) { - return isAccessor(obj, key); - } - - return isData(obj, key); -}; - - -/***/ }), -/* 83 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var hasOwn = __webpack_require__(84); - -// accessor descriptor properties -var accessor = { - __proto__: null, - configurable: 'boolean', - enumerable: 'boolean', - get: 'function', - set: 'function' -}; - -module.exports = function isAccessorDescriptor(obj, prop) { - if (typeof prop === 'string') { - var val = Object.getOwnPropertyDescriptor(obj, prop); - return typeof val !== 'undefined'; - } - - if (!obj || typeof obj !== 'object') { - return false; - } - - if (hasOwn(obj, 'value') || hasOwn(obj, 'writable')) { - return false; - } - - // one of them must be a function - if ( - (!hasOwn(obj, 'get') || typeof obj.get !== 'function') - && (!hasOwn(obj, 'set') || typeof obj.set !== 'function') - ) { - return false; - } - - // both of them must be a function or undefined - if ( - (hasOwn(obj, 'get') && typeof obj.get !== 'function' && typeof obj.get !== 'undefined') - || (hasOwn(obj, 'set') && typeof obj.set !== 'function' && typeof obj.set !== 'undefined') - ) { - return false; - } - - for (var key in obj) { // eslint-disable-line no-restricted-syntax - if (hasOwn(obj, key) && hasOwn(accessor, key) && typeof obj[key] !== accessor[key] && typeof obj[key] !== 'undefined') { - return false; - } - } - return true; -}; - - -/***/ }), -/* 84 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var call = Function.prototype.call; -var $hasOwn = Object.prototype.hasOwnProperty; -var bind = __webpack_require__(85); - -/** @type {import('.')} */ -module.exports = bind.call(call, $hasOwn); - - -/***/ }), -/* 85 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var implementation = __webpack_require__(86); - -module.exports = Function.prototype.bind || implementation; - - -/***/ }), -/* 86 */ -/***/ ((module) => { - -"use strict"; - - -/* eslint no-invalid-this: 1 */ - -var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible '; -var toStr = Object.prototype.toString; -var max = Math.max; -var funcType = '[object Function]'; - -var concatty = function concatty(a, b) { - var arr = []; - - for (var i = 0; i < a.length; i += 1) { - arr[i] = a[i]; - } - for (var j = 0; j < b.length; j += 1) { - arr[j + a.length] = b[j]; - } - - return arr; -}; - -var slicy = function slicy(arrLike, offset) { - var arr = []; - for (var i = offset || 0, j = 0; i < arrLike.length; i += 1, j += 1) { - arr[j] = arrLike[i]; - } - return arr; -}; - -var joiny = function (arr, joiner) { - var str = ''; - for (var i = 0; i < arr.length; i += 1) { - str += arr[i]; - if (i + 1 < arr.length) { - str += joiner; - } - } - return str; -}; - -module.exports = function bind(that) { - var target = this; - if (typeof target !== 'function' || toStr.apply(target) !== funcType) { - throw new TypeError(ERROR_MESSAGE + target); - } - var args = slicy(arguments, 1); - - var bound; - var binder = function () { - if (this instanceof bound) { - var result = target.apply( - this, - concatty(args, arguments) - ); - if (Object(result) === result) { - return result; - } - return this; - } - return target.apply( - that, - concatty(args, arguments) - ); - - }; - - var boundLength = max(0, target.length - args.length); - var boundArgs = []; - for (var i = 0; i < boundLength; i++) { - boundArgs[i] = '$' + i; - } - - bound = Function('binder', 'return function (' + joiny(boundArgs, ',') + '){ return binder.apply(this,arguments); }')(binder); - - if (target.prototype) { - var Empty = function Empty() {}; - Empty.prototype = target.prototype; - bound.prototype = new Empty(); - Empty.prototype = null; - } - - return bound; -}; - - -/***/ }), -/* 87 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var hasOwn = __webpack_require__(84); - -// data descriptor properties -var data = { - __proto__: null, - configurable: 'boolean', - enumerable: 'boolean', - writable: 'boolean', -}; - -module.exports = function isDataDescriptor(obj, prop) { - if (!obj || typeof obj !== 'object') { - return false; - } - - if (typeof prop === 'string') { - var val = Object.getOwnPropertyDescriptor(obj, prop); - return typeof val !== 'undefined'; - } - - if ( - (!('value' in obj) && !('writable' in obj)) - || 'get' in obj - || 'set' in obj - ) { - return false; - } - - for (var key in obj) { // eslint-disable-line no-restricted-syntax - if ( - key !== 'value' - && hasOwn(obj, key) - && hasOwn(data, key) - && typeof obj[key] !== data[key] - && typeof obj[key] !== 'undefined' - ) { - return false; - } - } - return true; -}; - - -/***/ }), -/* 88 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var isExtendable = __webpack_require__(89); -var assignSymbols = __webpack_require__(91); - -module.exports = Object.assign || function(obj/*, objects*/) { - if (obj === null || typeof obj === 'undefined') { - throw new TypeError('Cannot convert undefined or null to object'); - } - if (!isObject(obj)) { - obj = {}; - } - for (var i = 1; i < arguments.length; i++) { - var val = arguments[i]; - if (isString(val)) { - val = toObject(val); - } - if (isObject(val)) { - assign(obj, val); - assignSymbols(obj, val); - } - } - return obj; -}; - -function assign(a, b) { - for (var key in b) { - if (hasOwn(b, key)) { - a[key] = b[key]; - } - } -} - -function isString(val) { - return (val && typeof val === 'string'); -} - -function toObject(str) { - var obj = {}; - for (var i in str) { - obj[i] = str[i]; - } - return obj; -} - -function isObject(val) { - return (val && typeof val === 'object') || isExtendable(val); -} - -/** - * Returns true if the given `key` is an own property of `obj`. - */ - -function hasOwn(obj, key) { - return Object.prototype.hasOwnProperty.call(obj, key); -} - -function isEnum(obj, key) { - return Object.prototype.propertyIsEnumerable.call(obj, key); -} - - -/***/ }), -/* 89 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -/*! - * is-extendable - * - * Copyright (c) 2015-2017, Jon Schlinkert. - * Released under the MIT License. - */ - - - -var isPlainObject = __webpack_require__(90); - -module.exports = function isExtendable(val) { - return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); -}; - - -/***/ }), -/* 90 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -/*! - * is-plain-object - * - * Copyright (c) 2014-2017, Jon Schlinkert. - * Released under the MIT License. - */ - - - -var isObject = __webpack_require__(81); - -function isObjectObject(o) { - return isObject(o) === true - && Object.prototype.toString.call(o) === '[object Object]'; -} - -module.exports = function isPlainObject(o) { - var ctor,prot; - - if (isObjectObject(o) === false) return false; - - // If has modified constructor - ctor = o.constructor; - if (typeof ctor !== 'function') return false; - - // If has modified prototype - prot = ctor.prototype; - if (isObjectObject(prot) === false) return false; - - // If constructor does not have an Object-specific method - if (prot.hasOwnProperty('isPrototypeOf') === false) { - return false; - } - - // Most likely a plain Object - return true; -}; - - -/***/ }), -/* 91 */ -/***/ ((module) => { - -"use strict"; -/*! - * assign-symbols - * - * Copyright (c) 2015, Jon Schlinkert. - * Licensed under the MIT License. - */ - - - -module.exports = function(receiver, objects) { - if (receiver === null || typeof receiver === 'undefined') { - throw new TypeError('expected first argument to be an object.'); - } - - if (typeof objects === 'undefined' || typeof Symbol === 'undefined') { - return receiver; - } - - if (typeof Object.getOwnPropertySymbols !== 'function') { - return receiver; - } - - var isEnumerable = Object.prototype.propertyIsEnumerable; - var target = Object(receiver); - var len = arguments.length, i = 0; - - while (++i < len) { - var provider = Object(arguments[i]); - var names = Object.getOwnPropertySymbols(provider); - - for (var j = 0; j < names.length; j++) { - var key = names[j]; - - if (isEnumerable.call(provider, key)) { - target[key] = provider[key]; - } - } - } - return target; -}; - - -/***/ }), -/* 92 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var extend = __webpack_require__(93); -var safe = __webpack_require__(74); - -/** - * The main export is a function that takes a `pattern` string and an `options` object. - * - * ```js - & var not = require('regex-not'); - & console.log(not('foo')); - & //=> /^(?:(?!^(?:foo)$).)*$/ - * ``` - * - * @param {String} `pattern` - * @param {Object} `options` - * @return {RegExp} Converts the given `pattern` to a regex using the specified `options`. - * @api public - */ - -function toRegex(pattern, options) { - return new RegExp(toRegex.create(pattern, options)); -} - -/** - * Create a regex-compatible string from the given `pattern` and `options`. - * - * ```js - & var not = require('regex-not'); - & console.log(not.create('foo')); - & //=> '^(?:(?!^(?:foo)$).)*$' - * ``` - * @param {String} `pattern` - * @param {Object} `options` - * @return {String} - * @api public - */ - -toRegex.create = function(pattern, options) { - if (typeof pattern !== 'string') { - throw new TypeError('expected a string'); - } - - var opts = extend({}, options); - if (opts.contains === true) { - opts.strictNegate = false; - } - - var open = opts.strictOpen !== false ? '^' : ''; - var close = opts.strictClose !== false ? '$' : ''; - var endChar = opts.endChar ? opts.endChar : '+'; - var str = pattern; - - if (opts.strictNegate === false) { - str = '(?:(?!(?:' + pattern + ')).)' + endChar; - } else { - str = '(?:(?!^(?:' + pattern + ')$).)' + endChar; - } - - var res = open + str + close; - if (opts.safe === true && safe(res) === false) { - throw new Error('potentially unsafe regular expression: ' + res); - } - - return res; -}; - -/** - * Expose `toRegex` - */ - -module.exports = toRegex; - - -/***/ }), -/* 93 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var isExtendable = __webpack_require__(94); -var assignSymbols = __webpack_require__(91); - -module.exports = Object.assign || function(obj/*, objects*/) { - if (obj === null || typeof obj === 'undefined') { - throw new TypeError('Cannot convert undefined or null to object'); - } - if (!isObject(obj)) { - obj = {}; - } - for (var i = 1; i < arguments.length; i++) { - var val = arguments[i]; - if (isString(val)) { - val = toObject(val); - } - if (isObject(val)) { - assign(obj, val); - assignSymbols(obj, val); - } - } - return obj; -}; - -function assign(a, b) { - for (var key in b) { - if (hasOwn(b, key)) { - a[key] = b[key]; - } - } -} - -function isString(val) { - return (val && typeof val === 'string'); -} - -function toObject(str) { - var obj = {}; - for (var i in str) { - obj[i] = str[i]; - } - return obj; -} - -function isObject(val) { - return (val && typeof val === 'object') || isExtendable(val); -} - -/** - * Returns true if the given `key` is an own property of `obj`. - */ - -function hasOwn(obj, key) { - return Object.prototype.hasOwnProperty.call(obj, key); -} - -function isEnum(obj, key) { - return Object.prototype.propertyIsEnumerable.call(obj, key); -} - - -/***/ }), -/* 94 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -/*! - * is-extendable - * - * Copyright (c) 2015-2017, Jon Schlinkert. - * Released under the MIT License. - */ - - - -var isPlainObject = __webpack_require__(90); - -module.exports = function isExtendable(val) { - return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); -}; - - -/***/ }), -/* 95 */ -/***/ ((module) => { - -"use strict"; -/*! - * array-unique - * - * Copyright (c) 2014-2015, Jon Schlinkert. - * Licensed under the MIT License. - */ - - - -module.exports = function unique(arr) { - if (!Array.isArray(arr)) { - throw new TypeError('array-unique expects an array.'); - } - - var len = arr.length; - var i = -1; - - while (i++ < len) { - var j = i + 1; - - for (; j < arr.length; ++j) { - if (arr[i] === arr[j]) { - arr.splice(j--, 1); - } - } - } - return arr; -}; - -module.exports.immutable = function uniqueImmutable(arr) { - if (!Array.isArray(arr)) { - throw new TypeError('array-unique expects an array.'); - } - - var arrLen = arr.length; - var newArr = new Array(arrLen); - - for (var i = 0; i < arrLen; i++) { - newArr[i] = arr[i]; - } - - return module.exports(newArr); -}; - - -/***/ }), -/* 96 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var isObject = __webpack_require__(97); - -module.exports = function extend(o/*, objects*/) { - if (!isObject(o)) { o = {}; } - - var len = arguments.length; - for (var i = 1; i < len; i++) { - var obj = arguments[i]; - - if (isObject(obj)) { - assign(o, obj); - } - } - return o; -}; - -function assign(a, b) { - for (var key in b) { - if (hasOwn(b, key)) { - a[key] = b[key]; - } - } -} - -/** - * Returns true if the given `key` is an own property of `obj`. - */ - -function hasOwn(obj, key) { - return Object.prototype.hasOwnProperty.call(obj, key); -} - - -/***/ }), -/* 97 */ -/***/ ((module) => { - -"use strict"; -/*! - * is-extendable - * - * Copyright (c) 2015, Jon Schlinkert. - * Licensed under the MIT License. - */ - - - -module.exports = function isExtendable(val) { - return typeof val !== 'undefined' && val !== null - && (typeof val === 'object' || typeof val === 'function'); -}; - - -/***/ }), -/* 98 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var utils = __webpack_require__(99); - -module.exports = function(braces, options) { - braces.compiler - - /** - * bos - */ - - .set('bos', function() { - if (this.output) return; - this.ast.queue = isEscaped(this.ast) ? [this.ast.val] : []; - this.ast.count = 1; - }) - - /** - * Square brackets - */ - - .set('bracket', function(node) { - var close = node.close; - var open = !node.escaped ? '[' : '\\['; - var negated = node.negated; - var inner = node.inner; - - inner = inner.replace(/\\(?=[\\\w]|$)/g, '\\\\'); - if (inner === ']-') { - inner = '\\]\\-'; - } - - if (negated && inner.indexOf('.') === -1) { - inner += '.'; - } - if (negated && inner.indexOf('/') === -1) { - inner += '/'; - } - - var val = open + negated + inner + close; - var queue = node.parent.queue; - var last = utils.arrayify(queue.pop()); - - queue.push(utils.join(last, val)); - queue.push.apply(queue, []); - }) - - /** - * Brace - */ - - .set('brace', function(node) { - node.queue = isEscaped(node) ? [node.val] : []; - node.count = 1; - return this.mapVisit(node.nodes); - }) - - /** - * Open - */ - - .set('brace.open', function(node) { - node.parent.open = node.val; - }) - - /** - * Inner - */ - - .set('text', function(node) { - var queue = node.parent.queue; - var escaped = node.escaped; - var segs = [node.val]; - - if (node.optimize === false) { - options = utils.extend({}, options, {optimize: false}); - } - - if (node.multiplier > 1) { - node.parent.count *= node.multiplier; - } - - if (options.quantifiers === true && utils.isQuantifier(node.val)) { - escaped = true; - - } else if (node.val.length > 1) { - if (isType(node.parent, 'brace') && !isEscaped(node)) { - var expanded = utils.expand(node.val, options); - segs = expanded.segs; - - if (expanded.isOptimized) { - node.parent.isOptimized = true; - } - - // if nothing was expanded, we probably have a literal brace - if (!segs.length) { - var val = (expanded.val || node.val); - if (options.unescape !== false) { - // unescape unexpanded brace sequence/set separators - val = val.replace(/\\([,.])/g, '$1'); - // strip quotes - val = val.replace(/["'`]/g, ''); - } - - segs = [val]; - escaped = true; - } - } - - } else if (node.val === ',') { - if (options.expand) { - node.parent.queue.push(['']); - segs = ['']; - } else { - segs = ['|']; - } - } else { - escaped = true; - } - - if (escaped && isType(node.parent, 'brace')) { - if (node.parent.nodes.length <= 4 && node.parent.count === 1) { - node.parent.escaped = true; - } else if (node.parent.length <= 3) { - node.parent.escaped = true; - } - } - - if (!hasQueue(node.parent)) { - node.parent.queue = segs; - return; - } - - var last = utils.arrayify(queue.pop()); - if (node.parent.count > 1 && options.expand) { - last = multiply(last, node.parent.count); - node.parent.count = 1; - } - - queue.push(utils.join(utils.flatten(last), segs.shift())); - queue.push.apply(queue, segs); - }) - - /** - * Close - */ - - .set('brace.close', function(node) { - var queue = node.parent.queue; - var prev = node.parent.parent; - var last = prev.queue.pop(); - var open = node.parent.open; - var close = node.val; - - if (open && close && isOptimized(node, options)) { - open = '('; - close = ')'; - } - - // if a close brace exists, and the previous segment is one character - // don't wrap the result in braces or parens - var ele = utils.last(queue); - if (node.parent.count > 1 && options.expand) { - ele = multiply(queue.pop(), node.parent.count); - node.parent.count = 1; - queue.push(ele); - } - - if (close && typeof ele === 'string' && ele.length === 1) { - open = ''; - close = ''; - } - - if ((isLiteralBrace(node, options) || noInner(node)) && !node.parent.hasEmpty) { - queue.push(utils.join(open, queue.pop() || '')); - queue = utils.flatten(utils.join(queue, close)); - } - - if (typeof last === 'undefined') { - prev.queue = [queue]; - } else { - prev.queue.push(utils.flatten(utils.join(last, queue))); - } - }) - - /** - * eos - */ - - .set('eos', function(node) { - if (this.input) return; - - if (options.optimize !== false) { - this.output = utils.last(utils.flatten(this.ast.queue)); - } else if (Array.isArray(utils.last(this.ast.queue))) { - this.output = utils.flatten(this.ast.queue.pop()); - } else { - this.output = utils.flatten(this.ast.queue); - } - - if (node.parent.count > 1 && options.expand) { - this.output = multiply(this.output, node.parent.count); - } - - this.output = utils.arrayify(this.output); - this.ast.queue = []; - }); - -}; - -/** - * Multiply the segments in the current brace level - */ - -function multiply(queue, n, options) { - return utils.flatten(utils.repeat(utils.arrayify(queue), n)); -} - -/** - * Return true if `node` is escaped - */ - -function isEscaped(node) { - return node.escaped === true; -} - -/** - * Returns true if regex parens should be used for sets. If the parent `type` - * is not `brace`, then we're on a root node, which means we should never - * expand segments and open/close braces should be `{}` (since this indicates - * a brace is missing from the set) - */ - -function isOptimized(node, options) { - if (node.parent.isOptimized) return true; - return isType(node.parent, 'brace') - && !isEscaped(node.parent) - && options.expand !== true; -} - -/** - * Returns true if the value in `node` should be wrapped in a literal brace. - * @return {Boolean} - */ - -function isLiteralBrace(node, options) { - return isEscaped(node.parent) || options.optimize !== false; -} - -/** - * Returns true if the given `node` does not have an inner value. - * @return {Boolean} - */ - -function noInner(node, type) { - if (node.parent.queue.length === 1) { - return true; - } - var nodes = node.parent.nodes; - return nodes.length === 3 - && isType(nodes[0], 'brace.open') - && !isType(nodes[1], 'text') - && isType(nodes[2], 'brace.close'); -} - -/** - * Returns true if the given `node` is the given `type` - * @return {Boolean} - */ - -function isType(node, type) { - return typeof node !== 'undefined' && node.type === type; -} - -/** - * Returns true if the given `node` has a non-empty queue. - * @return {Boolean} - */ - -function hasQueue(node) { - return Array.isArray(node.queue) && node.queue.length; -} - - -/***/ }), -/* 99 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var splitString = __webpack_require__(100); -var utils = module.exports; - -/** - * Module dependencies - */ - -utils.extend = __webpack_require__(96); -utils.flatten = __webpack_require__(103); -utils.isObject = __webpack_require__(81); -utils.fillRange = __webpack_require__(104); -utils.repeat = __webpack_require__(110); -utils.unique = __webpack_require__(95); - -utils.define = function(obj, key, val) { - Object.defineProperty(obj, key, { - writable: true, - configurable: true, - enumerable: false, - value: val - }); -}; - -/** - * Returns true if the given string contains only empty brace sets. - */ - -utils.isEmptySets = function(str) { - return /^(?:\{,\})+$/.test(str); -}; - -/** - * Returns true if the given string contains only empty brace sets. - */ - -utils.isQuotedString = function(str) { - var open = str.charAt(0); - if (open === '\'' || open === '"' || open === '`') { - return str.slice(-1) === open; - } - return false; -}; - -/** - * Create the key to use for memoization. The unique key is generated - * by iterating over the options and concatenating key-value pairs - * to the pattern string. - */ - -utils.createKey = function(pattern, options) { - var id = pattern; - if (typeof options === 'undefined') { - return id; - } - var keys = Object.keys(options); - for (var i = 0; i < keys.length; i++) { - var key = keys[i]; - id += ';' + key + '=' + String(options[key]); - } - return id; -}; - -/** - * Normalize options - */ - -utils.createOptions = function(options) { - var opts = utils.extend.apply(null, arguments); - if (typeof opts.expand === 'boolean') { - opts.optimize = !opts.expand; - } - if (typeof opts.optimize === 'boolean') { - opts.expand = !opts.optimize; - } - if (opts.optimize === true) { - opts.makeRe = true; - } - return opts; -}; - -/** - * Join patterns in `a` to patterns in `b` - */ - -utils.join = function(a, b, options) { - options = options || {}; - a = utils.arrayify(a); - b = utils.arrayify(b); - - if (!a.length) return b; - if (!b.length) return a; - - var len = a.length; - var idx = -1; - var arr = []; - - while (++idx < len) { - var val = a[idx]; - if (Array.isArray(val)) { - for (var i = 0; i < val.length; i++) { - val[i] = utils.join(val[i], b, options); - } - arr.push(val); - continue; - } - - for (var j = 0; j < b.length; j++) { - var bval = b[j]; - - if (Array.isArray(bval)) { - arr.push(utils.join(val, bval, options)); - } else { - arr.push(val + bval); - } - } - } - return arr; -}; - -/** - * Split the given string on `,` if not escaped. - */ - -utils.split = function(str, options) { - var opts = utils.extend({sep: ','}, options); - if (typeof opts.keepQuotes !== 'boolean') { - opts.keepQuotes = true; - } - if (opts.unescape === false) { - opts.keepEscaping = true; - } - return splitString(str, opts, utils.escapeBrackets(opts)); -}; - -/** - * Expand ranges or sets in the given `pattern`. - * - * @param {String} `str` - * @param {Object} `options` - * @return {Object} - */ - -utils.expand = function(str, options) { - var opts = utils.extend({rangeLimit: 10000}, options); - var segs = utils.split(str, opts); - var tok = { segs: segs }; - - if (utils.isQuotedString(str)) { - return tok; - } - - if (opts.rangeLimit === true) { - opts.rangeLimit = 10000; - } - - if (segs.length > 1) { - if (opts.optimize === false) { - tok.val = segs[0]; - return tok; - } - - tok.segs = utils.stringifyArray(tok.segs); - } else if (segs.length === 1) { - var arr = str.split('..'); - - if (arr.length === 1) { - tok.val = tok.segs[tok.segs.length - 1] || tok.val || str; - tok.segs = []; - return tok; - } - - if (arr.length === 2 && arr[0] === arr[1]) { - tok.escaped = true; - tok.val = arr[0]; - tok.segs = []; - return tok; - } - - if (arr.length > 1) { - if (opts.optimize !== false) { - opts.optimize = true; - delete opts.expand; - } - - if (opts.optimize !== true) { - var min = Math.min(arr[0], arr[1]); - var max = Math.max(arr[0], arr[1]); - var step = arr[2] || 1; - - if (opts.rangeLimit !== false && ((max - min) / step >= opts.rangeLimit)) { - throw new RangeError('expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.'); - } - } - - arr.push(opts); - tok.segs = utils.fillRange.apply(null, arr); - - if (!tok.segs.length) { - tok.escaped = true; - tok.val = str; - return tok; - } - - if (opts.optimize === true) { - tok.segs = utils.stringifyArray(tok.segs); - } - - if (tok.segs === '') { - tok.val = str; - } else { - tok.val = tok.segs[0]; - } - return tok; - } - } else { - tok.val = str; - } - return tok; -}; - -/** - * Ensure commas inside brackets and parens are not split. - * @param {Object} `tok` Token from the `split-string` module - * @return {undefined} - */ - -utils.escapeBrackets = function(options) { - return function(tok) { - if (tok.escaped && tok.val === 'b') { - tok.val = '\\b'; - return; - } - - if (tok.val !== '(' && tok.val !== '[') return; - var opts = utils.extend({}, options); - var brackets = []; - var parens = []; - var stack = []; - var val = tok.val; - var str = tok.str; - var i = tok.idx - 1; - - while (++i < str.length) { - var ch = str[i]; - - if (ch === '\\') { - val += (opts.keepEscaping === false ? '' : ch) + str[++i]; - continue; - } - - if (ch === '(') { - parens.push(ch); - stack.push(ch); - } - - if (ch === '[') { - brackets.push(ch); - stack.push(ch); - } - - if (ch === ')') { - parens.pop(); - stack.pop(); - if (!stack.length) { - val += ch; - break; - } - } - - if (ch === ']') { - brackets.pop(); - stack.pop(); - if (!stack.length) { - val += ch; - break; - } - } - val += ch; - } - - tok.split = false; - tok.val = val.slice(1); - tok.idx = i; - }; -}; - -/** - * Returns true if the given string looks like a regex quantifier - * @return {Boolean} - */ - -utils.isQuantifier = function(str) { - return /^(?:[0-9]?,[0-9]|[0-9],)$/.test(str); -}; - -/** - * Cast `val` to an array. - * @param {*} `val` - */ - -utils.stringifyArray = function(arr) { - return [utils.arrayify(arr).join('|')]; -}; - -/** - * Cast `val` to an array. - * @param {*} `val` - */ - -utils.arrayify = function(arr) { - if (typeof arr === 'undefined') { - return []; - } - if (typeof arr === 'string') { - return [arr]; - } - return arr; -}; - -/** - * Returns true if the given `str` is a non-empty string - * @return {Boolean} - */ - -utils.isString = function(str) { - return str != null && typeof str === 'string'; -}; - -/** - * Get the last element from `array` - * @param {Array} `array` - * @return {*} - */ - -utils.last = function(arr, n) { - return arr[arr.length - (n || 1)]; -}; - -utils.escapeRegex = function(str) { - return str.replace(/\\?([!^*?()[\]{}+?/])/g, '\\$1'); -}; - - -/***/ }), -/* 100 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -/*! - * split-string - * - * Copyright (c) 2015-2017, Jon Schlinkert. - * Released under the MIT License. - */ - - - -var extend = __webpack_require__(101); - -module.exports = function(str, options, fn) { - if (typeof str !== 'string') { - throw new TypeError('expected a string'); - } - - if (typeof options === 'function') { - fn = options; - options = null; - } - - // allow separator to be defined as a string - if (typeof options === 'string') { - options = { sep: options }; - } - - var opts = extend({sep: '.'}, options); - var quotes = opts.quotes || ['"', "'", '`']; - var brackets; - - if (opts.brackets === true) { - brackets = { - '<': '>', - '(': ')', - '[': ']', - '{': '}' - }; - } else if (opts.brackets) { - brackets = opts.brackets; - } - - var tokens = []; - var stack = []; - var arr = ['']; - var sep = opts.sep; - var len = str.length; - var idx = -1; - var closeIdx; - - function expected() { - if (brackets && stack.length) { - return brackets[stack[stack.length - 1]]; - } - } - - while (++idx < len) { - var ch = str[idx]; - var next = str[idx + 1]; - var tok = { val: ch, idx: idx, arr: arr, str: str }; - tokens.push(tok); - - if (ch === '\\') { - tok.val = keepEscaping(opts, str, idx) === true ? (ch + next) : next; - tok.escaped = true; - if (typeof fn === 'function') { - fn(tok); - } - arr[arr.length - 1] += tok.val; - idx++; - continue; - } - - if (brackets && brackets[ch]) { - stack.push(ch); - var e = expected(); - var i = idx + 1; - - if (str.indexOf(e, i + 1) !== -1) { - while (stack.length && i < len) { - var s = str[++i]; - if (s === '\\') { - s++; - continue; - } - - if (quotes.indexOf(s) !== -1) { - i = getClosingQuote(str, s, i + 1); - continue; - } - - e = expected(); - if (stack.length && str.indexOf(e, i + 1) === -1) { - break; - } - - if (brackets[s]) { - stack.push(s); - continue; - } - - if (e === s) { - stack.pop(); - } - } - } - - closeIdx = i; - if (closeIdx === -1) { - arr[arr.length - 1] += ch; - continue; - } - - ch = str.slice(idx, closeIdx + 1); - tok.val = ch; - tok.idx = idx = closeIdx; - } - - if (quotes.indexOf(ch) !== -1) { - closeIdx = getClosingQuote(str, ch, idx + 1); - if (closeIdx === -1) { - arr[arr.length - 1] += ch; - continue; - } - - if (keepQuotes(ch, opts) === true) { - ch = str.slice(idx, closeIdx + 1); - } else { - ch = str.slice(idx + 1, closeIdx); - } - - tok.val = ch; - tok.idx = idx = closeIdx; - } - - if (typeof fn === 'function') { - fn(tok, tokens); - ch = tok.val; - idx = tok.idx; - } - - if (tok.val === sep && tok.split !== false) { - arr.push(''); - continue; - } - - arr[arr.length - 1] += tok.val; - } - - return arr; -}; - -function getClosingQuote(str, ch, i, brackets) { - var idx = str.indexOf(ch, i); - if (str.charAt(idx - 1) === '\\') { - return getClosingQuote(str, ch, idx + 1); - } - return idx; -} - -function keepQuotes(ch, opts) { - if (opts.keepDoubleQuotes === true && ch === '"') return true; - if (opts.keepSingleQuotes === true && ch === "'") return true; - return opts.keepQuotes; -} - -function keepEscaping(opts, str, idx) { - if (typeof opts.keepEscaping === 'function') { - return opts.keepEscaping(str, idx); - } - return opts.keepEscaping === true || str[idx + 1] === '\\'; -} - - -/***/ }), -/* 101 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var isExtendable = __webpack_require__(102); -var assignSymbols = __webpack_require__(91); - -module.exports = Object.assign || function(obj/*, objects*/) { - if (obj === null || typeof obj === 'undefined') { - throw new TypeError('Cannot convert undefined or null to object'); - } - if (!isObject(obj)) { - obj = {}; - } - for (var i = 1; i < arguments.length; i++) { - var val = arguments[i]; - if (isString(val)) { - val = toObject(val); - } - if (isObject(val)) { - assign(obj, val); - assignSymbols(obj, val); - } - } - return obj; -}; - -function assign(a, b) { - for (var key in b) { - if (hasOwn(b, key)) { - a[key] = b[key]; - } - } -} - -function isString(val) { - return (val && typeof val === 'string'); -} - -function toObject(str) { - var obj = {}; - for (var i in str) { - obj[i] = str[i]; - } - return obj; -} - -function isObject(val) { - return (val && typeof val === 'object') || isExtendable(val); -} - -/** - * Returns true if the given `key` is an own property of `obj`. - */ - -function hasOwn(obj, key) { - return Object.prototype.hasOwnProperty.call(obj, key); -} - -function isEnum(obj, key) { - return Object.prototype.propertyIsEnumerable.call(obj, key); -} - - -/***/ }), -/* 102 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -/*! - * is-extendable - * - * Copyright (c) 2015-2017, Jon Schlinkert. - * Released under the MIT License. - */ - - - -var isPlainObject = __webpack_require__(90); - -module.exports = function isExtendable(val) { - return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); -}; - - -/***/ }), -/* 103 */ -/***/ ((module) => { - -"use strict"; -/*! - * arr-flatten - * - * Copyright (c) 2014-2017, Jon Schlinkert. - * Released under the MIT License. - */ - - - -module.exports = function (arr) { - return flat(arr, []); -}; - -function flat(arr, res) { - var i = 0, cur; - var len = arr.length; - for (; i < len; i++) { - cur = arr[i]; - Array.isArray(cur) ? flat(cur, res) : res.push(cur); - } - return res; -} - - -/***/ }), -/* 104 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -/*! - * fill-range - * - * Copyright (c) 2014-2015, 2017, Jon Schlinkert. - * Released under the MIT License. - */ - - - -var util = __webpack_require__(17); -var isNumber = __webpack_require__(105); -var extend = __webpack_require__(96); -var repeat = __webpack_require__(108); -var toRegex = __webpack_require__(109); - -/** - * Return a range of numbers or letters. - * - * @param {String} `start` Start of the range - * @param {String} `stop` End of the range - * @param {String} `step` Increment or decrement to use. - * @param {Function} `fn` Custom function to modify each element in the range. - * @return {Array} - */ - -function fillRange(start, stop, step, options) { - if (typeof start === 'undefined') { - return []; - } - - if (typeof stop === 'undefined' || start === stop) { - // special case, for handling negative zero - var isString = typeof start === 'string'; - if (isNumber(start) && !toNumber(start)) { - return [isString ? '0' : 0]; - } - return [start]; - } - - if (typeof step !== 'number' && typeof step !== 'string') { - options = step; - step = undefined; - } - - if (typeof options === 'function') { - options = { transform: options }; - } - - var opts = extend({step: step}, options); - if (opts.step && !isValidNumber(opts.step)) { - if (opts.strictRanges === true) { - throw new TypeError('expected options.step to be a number'); - } - return []; - } - - opts.isNumber = isValidNumber(start) && isValidNumber(stop); - if (!opts.isNumber && !isValid(start, stop)) { - if (opts.strictRanges === true) { - throw new RangeError('invalid range arguments: ' + util.inspect([start, stop])); - } - return []; - } - - opts.isPadded = isPadded(start) || isPadded(stop); - opts.toString = opts.stringify - || typeof opts.step === 'string' - || typeof start === 'string' - || typeof stop === 'string' - || !opts.isNumber; - - if (opts.isPadded) { - opts.maxLength = Math.max(String(start).length, String(stop).length); - } - - // support legacy minimatch/fill-range options - if (typeof opts.optimize === 'boolean') opts.toRegex = opts.optimize; - if (typeof opts.makeRe === 'boolean') opts.toRegex = opts.makeRe; - return expand(start, stop, opts); -} - -function expand(start, stop, options) { - var a = options.isNumber ? toNumber(start) : start.charCodeAt(0); - var b = options.isNumber ? toNumber(stop) : stop.charCodeAt(0); - - var step = Math.abs(toNumber(options.step)) || 1; - if (options.toRegex && step === 1) { - return toRange(a, b, start, stop, options); - } - - var zero = {greater: [], lesser: []}; - var asc = a < b; - var arr = new Array(Math.round((asc ? b - a : a - b) / step)); - var idx = 0; - - while (asc ? a <= b : a >= b) { - var val = options.isNumber ? a : String.fromCharCode(a); - if (options.toRegex && (val >= 0 || !options.isNumber)) { - zero.greater.push(val); - } else { - zero.lesser.push(Math.abs(val)); - } - - if (options.isPadded) { - val = zeros(val, options); - } - - if (options.toString) { - val = String(val); - } - - if (typeof options.transform === 'function') { - arr[idx++] = options.transform(val, a, b, step, idx, arr, options); - } else { - arr[idx++] = val; - } - - if (asc) { - a += step; - } else { - a -= step; - } - } - - if (options.toRegex === true) { - return toSequence(arr, zero, options); - } - return arr; -} - -function toRange(a, b, start, stop, options) { - if (options.isPadded) { - return toRegex(start, stop, options); - } - - if (options.isNumber) { - return toRegex(Math.min(a, b), Math.max(a, b), options); - } - - var start = String.fromCharCode(Math.min(a, b)); - var stop = String.fromCharCode(Math.max(a, b)); - return '[' + start + '-' + stop + ']'; -} - -function toSequence(arr, zeros, options) { - var greater = '', lesser = ''; - if (zeros.greater.length) { - greater = zeros.greater.join('|'); - } - if (zeros.lesser.length) { - lesser = '-(' + zeros.lesser.join('|') + ')'; - } - var res = greater && lesser - ? greater + '|' + lesser - : greater || lesser; - - if (options.capture) { - return '(' + res + ')'; - } - return res; -} - -function zeros(val, options) { - if (options.isPadded) { - var str = String(val); - var len = str.length; - var dash = ''; - if (str.charAt(0) === '-') { - dash = '-'; - str = str.slice(1); - } - var diff = options.maxLength - len; - var pad = repeat('0', diff); - val = (dash + pad + str); - } - if (options.stringify) { - return String(val); - } - return val; -} - -function toNumber(val) { - return Number(val) || 0; -} - -function isPadded(str) { - return /^-?0\d/.test(str); -} - -function isValid(min, max) { - return (isValidNumber(min) || isValidLetter(min)) - && (isValidNumber(max) || isValidLetter(max)); -} - -function isValidLetter(ch) { - return typeof ch === 'string' && ch.length === 1 && /^\w+$/.test(ch); -} - -function isValidNumber(n) { - return isNumber(n) && !/\./.test(n); -} - -/** - * Expose `fillRange` - * @type {Function} - */ - -module.exports = fillRange; - - -/***/ }), -/* 105 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -/*! - * is-number - * - * Copyright (c) 2014-2015, Jon Schlinkert. - * Licensed under the MIT License. - */ - - - -var typeOf = __webpack_require__(106); - -module.exports = function isNumber(num) { - var type = typeOf(num); - - if (type === 'string') { - if (!num.trim()) return false; - } else if (type !== 'number') { - return false; - } - - return (num - num + 1) >= 0; -}; - - -/***/ }), -/* 106 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var isBuffer = __webpack_require__(107); -var toString = Object.prototype.toString; - -/** - * Get the native `typeof` a value. - * - * @param {*} `val` - * @return {*} Native javascript type - */ - -module.exports = function kindOf(val) { - // primitivies - if (typeof val === 'undefined') { - return 'undefined'; - } - if (val === null) { - return 'null'; - } - if (val === true || val === false || val instanceof Boolean) { - return 'boolean'; - } - if (typeof val === 'string' || val instanceof String) { - return 'string'; - } - if (typeof val === 'number' || val instanceof Number) { - return 'number'; - } - - // functions - if (typeof val === 'function' || val instanceof Function) { - return 'function'; - } - - // array - if (typeof Array.isArray !== 'undefined' && Array.isArray(val)) { - return 'array'; - } - - // check for instances of RegExp and Date before calling `toString` - if (val instanceof RegExp) { - return 'regexp'; - } - if (val instanceof Date) { - return 'date'; - } - - // other objects - var type = toString.call(val); - - if (type === '[object RegExp]') { - return 'regexp'; - } - if (type === '[object Date]') { - return 'date'; - } - if (type === '[object Arguments]') { - return 'arguments'; - } - if (type === '[object Error]') { - return 'error'; - } - - // buffer - if (isBuffer(val)) { - return 'buffer'; - } - - // es6: Map, WeakMap, Set, WeakSet - if (type === '[object Set]') { - return 'set'; - } - if (type === '[object WeakSet]') { - return 'weakset'; - } - if (type === '[object Map]') { - return 'map'; - } - if (type === '[object WeakMap]') { - return 'weakmap'; - } - if (type === '[object Symbol]') { - return 'symbol'; - } - - // typed arrays - if (type === '[object Int8Array]') { - return 'int8array'; - } - if (type === '[object Uint8Array]') { - return 'uint8array'; - } - if (type === '[object Uint8ClampedArray]') { - return 'uint8clampedarray'; - } - if (type === '[object Int16Array]') { - return 'int16array'; - } - if (type === '[object Uint16Array]') { - return 'uint16array'; - } - if (type === '[object Int32Array]') { - return 'int32array'; - } - if (type === '[object Uint32Array]') { - return 'uint32array'; - } - if (type === '[object Float32Array]') { - return 'float32array'; - } - if (type === '[object Float64Array]') { - return 'float64array'; - } - - // must be a plain object - return 'object'; -}; - - -/***/ }), -/* 107 */ -/***/ ((module) => { - -/*! - * Determine if an object is a Buffer - * - * @author Feross Aboukhadijeh - * @license MIT - */ - -// The _isBuffer check is for Safari 5-7 support, because it's missing -// Object.prototype.constructor. Remove this eventually -module.exports = function (obj) { - return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer) -} - -function isBuffer (obj) { - return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) -} - -// For Node v0.10 support. Remove this eventually. -function isSlowBuffer (obj) { - return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0)) -} - - -/***/ }), -/* 108 */ -/***/ ((module) => { - -"use strict"; -/*! - * repeat-string - * - * Copyright (c) 2014-2015, Jon Schlinkert. - * Licensed under the MIT License. - */ - - - -/** - * Results cache - */ - -var res = ''; -var cache; - -/** - * Expose `repeat` - */ - -module.exports = repeat; - -/** - * Repeat the given `string` the specified `number` - * of times. - * - * **Example:** - * - * ```js - * var repeat = require('repeat-string'); - * repeat('A', 5); - * //=> AAAAA - * ``` - * - * @param {String} `string` The string to repeat - * @param {Number} `number` The number of times to repeat the string - * @return {String} Repeated string - * @api public - */ - -function repeat(str, num) { - if (typeof str !== 'string') { - throw new TypeError('expected a string'); - } - - // cover common, quick use cases - if (num === 1) return str; - if (num === 2) return str + str; - - var max = str.length * num; - if (cache !== str || typeof cache === 'undefined') { - cache = str; - res = ''; - } else if (res.length >= max) { - return res.substr(0, max); - } - - while (max > res.length && num > 1) { - if (num & 1) { - res += str; - } - - num >>= 1; - str += str; - } - - res += str; - res = res.substr(0, max); - return res; -} - - -/***/ }), -/* 109 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -/*! - * to-regex-range - * - * Copyright (c) 2015, 2017, Jon Schlinkert. - * Released under the MIT License. - */ - - - -var repeat = __webpack_require__(108); -var isNumber = __webpack_require__(105); -var cache = {}; - -function toRegexRange(min, max, options) { - if (isNumber(min) === false) { - throw new RangeError('toRegexRange: first argument is invalid.'); - } - - if (typeof max === 'undefined' || min === max) { - return String(min); - } - - if (isNumber(max) === false) { - throw new RangeError('toRegexRange: second argument is invalid.'); - } - - options = options || {}; - var relax = String(options.relaxZeros); - var shorthand = String(options.shorthand); - var capture = String(options.capture); - var key = min + ':' + max + '=' + relax + shorthand + capture; - if (cache.hasOwnProperty(key)) { - return cache[key].result; - } - - var a = Math.min(min, max); - var b = Math.max(min, max); - - if (Math.abs(a - b) === 1) { - var result = min + '|' + max; - if (options.capture) { - return '(' + result + ')'; - } - return result; - } - - var isPadded = padding(min) || padding(max); - var positives = []; - var negatives = []; - - var tok = {min: min, max: max, a: a, b: b}; - if (isPadded) { - tok.isPadded = isPadded; - tok.maxLen = String(tok.max).length; - } - - if (a < 0) { - var newMin = b < 0 ? Math.abs(b) : 1; - var newMax = Math.abs(a); - negatives = splitToPatterns(newMin, newMax, tok, options); - a = tok.a = 0; - } - - if (b >= 0) { - positives = splitToPatterns(a, b, tok, options); - } - - tok.negatives = negatives; - tok.positives = positives; - tok.result = siftPatterns(negatives, positives, options); - - if (options.capture && (positives.length + negatives.length) > 1) { - tok.result = '(' + tok.result + ')'; - } - - cache[key] = tok; - return tok.result; -} - -function siftPatterns(neg, pos, options) { - var onlyNegative = filterPatterns(neg, pos, '-', false, options) || []; - var onlyPositive = filterPatterns(pos, neg, '', false, options) || []; - var intersected = filterPatterns(neg, pos, '-?', true, options) || []; - var subpatterns = onlyNegative.concat(intersected).concat(onlyPositive); - return subpatterns.join('|'); -} - -function splitToRanges(min, max) { - min = Number(min); - max = Number(max); - - var nines = 1; - var stops = [max]; - var stop = +countNines(min, nines); - - while (min <= stop && stop <= max) { - stops = push(stops, stop); - nines += 1; - stop = +countNines(min, nines); - } - - var zeros = 1; - stop = countZeros(max + 1, zeros) - 1; - - while (min < stop && stop <= max) { - stops = push(stops, stop); - zeros += 1; - stop = countZeros(max + 1, zeros) - 1; - } - - stops.sort(compare); - return stops; -} - -/** - * Convert a range to a regex pattern - * @param {Number} `start` - * @param {Number} `stop` - * @return {String} - */ - -function rangeToPattern(start, stop, options) { - if (start === stop) { - return {pattern: String(start), digits: []}; - } - - var zipped = zip(String(start), String(stop)); - var len = zipped.length, i = -1; - - var pattern = ''; - var digits = 0; - - while (++i < len) { - var numbers = zipped[i]; - var startDigit = numbers[0]; - var stopDigit = numbers[1]; - - if (startDigit === stopDigit) { - pattern += startDigit; - - } else if (startDigit !== '0' || stopDigit !== '9') { - pattern += toCharacterClass(startDigit, stopDigit); - - } else { - digits += 1; - } - } - - if (digits) { - pattern += options.shorthand ? '\\d' : '[0-9]'; - } - - return { pattern: pattern, digits: [digits] }; -} - -function splitToPatterns(min, max, tok, options) { - var ranges = splitToRanges(min, max); - var len = ranges.length; - var idx = -1; - - var tokens = []; - var start = min; - var prev; - - while (++idx < len) { - var range = ranges[idx]; - var obj = rangeToPattern(start, range, options); - var zeros = ''; - - if (!tok.isPadded && prev && prev.pattern === obj.pattern) { - if (prev.digits.length > 1) { - prev.digits.pop(); - } - prev.digits.push(obj.digits[0]); - prev.string = prev.pattern + toQuantifier(prev.digits); - start = range + 1; - continue; - } - - if (tok.isPadded) { - zeros = padZeros(range, tok); - } - - obj.string = zeros + obj.pattern + toQuantifier(obj.digits); - tokens.push(obj); - start = range + 1; - prev = obj; - } - - return tokens; -} - -function filterPatterns(arr, comparison, prefix, intersection, options) { - var res = []; - - for (var i = 0; i < arr.length; i++) { - var tok = arr[i]; - var ele = tok.string; - - if (options.relaxZeros !== false) { - if (prefix === '-' && ele.charAt(0) === '0') { - if (ele.charAt(1) === '{') { - ele = '0*' + ele.replace(/^0\{\d+\}/, ''); - } else { - ele = '0*' + ele.slice(1); - } - } - } - - if (!intersection && !contains(comparison, 'string', ele)) { - res.push(prefix + ele); - } - - if (intersection && contains(comparison, 'string', ele)) { - res.push(prefix + ele); - } - } - return res; -} - -/** - * Zip strings (`for in` can be used on string characters) - */ - -function zip(a, b) { - var arr = []; - for (var ch in a) arr.push([a[ch], b[ch]]); - return arr; -} - -function compare(a, b) { - return a > b ? 1 : b > a ? -1 : 0; -} - -function push(arr, ele) { - if (arr.indexOf(ele) === -1) arr.push(ele); - return arr; -} - -function contains(arr, key, val) { - for (var i = 0; i < arr.length; i++) { - if (arr[i][key] === val) { - return true; - } - } - return false; -} - -function countNines(min, len) { - return String(min).slice(0, -len) + repeat('9', len); -} - -function countZeros(integer, zeros) { - return integer - (integer % Math.pow(10, zeros)); -} - -function toQuantifier(digits) { - var start = digits[0]; - var stop = digits[1] ? (',' + digits[1]) : ''; - if (!stop && (!start || start === 1)) { - return ''; - } - return '{' + start + stop + '}'; -} - -function toCharacterClass(a, b) { - return '[' + a + ((b - a === 1) ? '' : '-') + b + ']'; -} - -function padding(str) { - return /^-?(0+)\d/.exec(str); -} - -function padZeros(val, tok) { - if (tok.isPadded) { - var diff = Math.abs(tok.maxLen - String(val).length); - switch (diff) { - case 0: - return ''; - case 1: - return '0'; - default: { - return '0{' + diff + '}'; - } - } - } - return val; -} - -/** - * Expose `toRegexRange` - */ - -module.exports = toRegexRange; - - -/***/ }), -/* 110 */ -/***/ ((module) => { - -"use strict"; -/*! - * repeat-element - * - * Copyright (c) 2015-present, Jon Schlinkert. - * Licensed under the MIT license. - */ - - - -module.exports = function repeat(ele, num) { - if (Array.prototype.fill) { - return new Array(num).fill(ele); - } - - var arr = new Array(num); - - for (var i = 0; i < num; i++) { - arr[i] = ele; - } - - return arr; -}; - - -/***/ }), -/* 111 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var Node = __webpack_require__(112); -var utils = __webpack_require__(99); - -/** - * Braces parsers - */ - -module.exports = function(braces, options) { - braces.parser - .set('bos', function() { - if (!this.parsed) { - this.ast = this.nodes[0] = new Node(this.ast); - } - }) - - /** - * Character parsers - */ - - .set('escape', function() { - var pos = this.position(); - var m = this.match(/^(?:\\(.)|\$\{)/); - if (!m) return; - - var prev = this.prev(); - var last = utils.last(prev.nodes); - - var node = pos(new Node({ - type: 'text', - multiplier: 1, - val: m[0] - })); - - if (node.val === '\\\\') { - return node; - } - - if (node.val === '${') { - var str = this.input; - var idx = -1; - var ch; - - while ((ch = str[++idx])) { - this.consume(1); - node.val += ch; - if (ch === '\\') { - node.val += str[++idx]; - continue; - } - if (ch === '}') { - break; - } - } - } - - if (this.options.unescape !== false) { - node.val = node.val.replace(/\\([{}])/g, '$1'); - } - - if (last.val === '"' && this.input.charAt(0) === '"') { - last.val = node.val; - this.consume(1); - return; - } - - return concatNodes.call(this, pos, node, prev, options); - }) - - /** - * Brackets: "[...]" (basic, this is overridden by - * other parsers in more advanced implementations) - */ - - .set('bracket', function() { - var isInside = this.isInside('brace'); - var pos = this.position(); - var m = this.match(/^(?:\[([!^]?)([^\]]{2,}|\]-)(\]|[^*+?]+)|\[)/); - if (!m) return; - - var prev = this.prev(); - var val = m[0]; - var negated = m[1] ? '^' : ''; - var inner = m[2] || ''; - var close = m[3] || ''; - - if (isInside && prev.type === 'brace') { - prev.text = prev.text || ''; - prev.text += val; - } - - var esc = this.input.slice(0, 2); - if (inner === '' && esc === '\\]') { - inner += esc; - this.consume(2); - - var str = this.input; - var idx = -1; - var ch; - - while ((ch = str[++idx])) { - this.consume(1); - if (ch === ']') { - close = ch; - break; - } - inner += ch; - } - } - - return pos(new Node({ - type: 'bracket', - val: val, - escaped: close !== ']', - negated: negated, - inner: inner, - close: close - })); - }) - - /** - * Empty braces (we capture these early to - * speed up processing in the compiler) - */ - - .set('multiplier', function() { - var isInside = this.isInside('brace'); - var pos = this.position(); - var m = this.match(/^\{((?:,|\{,+\})+)\}/); - if (!m) return; - - this.multiplier = true; - var prev = this.prev(); - var val = m[0]; - - if (isInside && prev.type === 'brace') { - prev.text = prev.text || ''; - prev.text += val; - } - - var node = pos(new Node({ - type: 'text', - multiplier: 1, - match: m, - val: val - })); - - return concatNodes.call(this, pos, node, prev, options); - }) - - /** - * Open - */ - - .set('brace.open', function() { - var pos = this.position(); - var m = this.match(/^\{(?!(?:[^\\}]?|,+)\})/); - if (!m) return; - - var prev = this.prev(); - var last = utils.last(prev.nodes); - - // if the last parsed character was an extglob character - // we need to _not optimize_ the brace pattern because - // it might be mistaken for an extglob by a downstream parser - if (last && last.val && isExtglobChar(last.val.slice(-1))) { - last.optimize = false; - } - - var open = pos(new Node({ - type: 'brace.open', - val: m[0] - })); - - var node = pos(new Node({ - type: 'brace', - nodes: [] - })); - - node.push(open); - prev.push(node); - this.push('brace', node); - }) - - /** - * Close - */ - - .set('brace.close', function() { - var pos = this.position(); - var m = this.match(/^\}/); - if (!m || !m[0]) return; - - var brace = this.pop('brace'); - var node = pos(new Node({ - type: 'brace.close', - val: m[0] - })); - - if (!this.isType(brace, 'brace')) { - if (this.options.strict) { - throw new Error('missing opening "{"'); - } - node.type = 'text'; - node.multiplier = 0; - node.escaped = true; - return node; - } - - var prev = this.prev(); - var last = utils.last(prev.nodes); - if (last.text) { - var lastNode = utils.last(last.nodes); - if (lastNode.val === ')' && /[!@*?+]\(/.test(last.text)) { - var open = last.nodes[0]; - var text = last.nodes[1]; - if (open.type === 'brace.open' && text && text.type === 'text') { - text.optimize = false; - } - } - } - - if (brace.nodes.length > 2) { - var first = brace.nodes[1]; - if (first.type === 'text' && first.val === ',') { - brace.nodes.splice(1, 1); - brace.nodes.push(first); - } - } - - brace.push(node); - }) - - /** - * Capture boundary characters - */ - - .set('boundary', function() { - var pos = this.position(); - var m = this.match(/^[$^](?!\{)/); - if (!m) return; - return pos(new Node({ - type: 'text', - val: m[0] - })); - }) - - /** - * One or zero, non-comma characters wrapped in braces - */ - - .set('nobrace', function() { - var isInside = this.isInside('brace'); - var pos = this.position(); - var m = this.match(/^\{[^,]?\}/); - if (!m) return; - - var prev = this.prev(); - var val = m[0]; - - if (isInside && prev.type === 'brace') { - prev.text = prev.text || ''; - prev.text += val; - } - - return pos(new Node({ - type: 'text', - multiplier: 0, - val: val - })); - }) - - /** - * Text - */ - - .set('text', function() { - var isInside = this.isInside('brace'); - var pos = this.position(); - var m = this.match(/^((?!\\)[^${}[\]])+/); - if (!m) return; - - var prev = this.prev(); - var val = m[0]; - - if (isInside && prev.type === 'brace') { - prev.text = prev.text || ''; - prev.text += val; - } - - var node = pos(new Node({ - type: 'text', - multiplier: 1, - val: val - })); - - return concatNodes.call(this, pos, node, prev, options); - }); -}; - -/** - * Returns true if the character is an extglob character. - */ - -function isExtglobChar(ch) { - return ch === '!' || ch === '@' || ch === '*' || ch === '?' || ch === '+'; -} - -/** - * Combine text nodes, and calculate empty sets (`{,,}`) - * @param {Function} `pos` Function to calculate node position - * @param {Object} `node` AST node - * @return {Object} - */ - -function concatNodes(pos, node, parent, options) { - node.orig = node.val; - var prev = this.prev(); - var last = utils.last(prev.nodes); - var isEscaped = false; - - if (node.val.length > 1) { - var a = node.val.charAt(0); - var b = node.val.slice(-1); - - isEscaped = (a === '"' && b === '"') - || (a === "'" && b === "'") - || (a === '`' && b === '`'); - } - - if (isEscaped && options.unescape !== false) { - node.val = node.val.slice(1, node.val.length - 1); - node.escaped = true; - } - - if (node.match) { - var match = node.match[1]; - if (!match || match.indexOf('}') === -1) { - match = node.match[0]; - } - - // replace each set with a single "," - var val = match.replace(/\{/g, ',').replace(/\}/g, ''); - node.multiplier *= val.length; - node.val = ''; - } - - var simpleText = last.type === 'text' - && last.multiplier === 1 - && node.multiplier === 1 - && node.val; - - if (simpleText) { - last.val += node.val; - return; - } - - prev.push(node); -} - - -/***/ }), -/* 112 */ -/***/ ((module, exports, __webpack_require__) => { - -"use strict"; - - -var isObject = __webpack_require__(81); -var define = __webpack_require__(113); -var utils = __webpack_require__(115); -var ownNames; - -/** - * Create a new AST `Node` with the given `val` and `type`. - * - * ```js - * var node = new Node('*', 'Star'); - * var node = new Node({type: 'star', val: '*'}); - * ``` - * @name Node - * @param {String|Object} `val` Pass a matched substring, or an object to merge onto the node. - * @param {String} `type` The node type to use when `val` is a string. - * @return {Object} node instance - * @api public - */ - -function Node(val, type, parent) { - if (typeof type !== 'string') { - parent = type; - type = null; - } - - define(this, 'parent', parent); - define(this, 'isNode', true); - define(this, 'expect', null); - - if (typeof type !== 'string' && isObject(val)) { - lazyKeys(); - var keys = Object.keys(val); - for (var i = 0; i < keys.length; i++) { - var key = keys[i]; - if (ownNames.indexOf(key) === -1) { - this[key] = val[key]; - } - } - } else { - this.type = type; - this.val = val; - } -} - -/** - * Returns true if the given value is a node. - * - * ```js - * var Node = require('snapdragon-node'); - * var node = new Node({type: 'foo'}); - * console.log(Node.isNode(node)); //=> true - * console.log(Node.isNode({})); //=> false - * ``` - * @param {Object} `node` - * @returns {Boolean} - * @api public - */ - -Node.isNode = function(node) { - return utils.isNode(node); -}; - -/** - * Define a non-enumberable property on the node instance. - * Useful for adding properties that shouldn't be extended - * or visible during debugging. - * - * ```js - * var node = new Node(); - * node.define('foo', 'something non-enumerable'); - * ``` - * @param {String} `name` - * @param {any} `val` - * @return {Object} returns the node instance - * @api public - */ - -Node.prototype.define = function(name, val) { - define(this, name, val); - return this; -}; - -/** - * Returns true if `node.val` is an empty string, or `node.nodes` does - * not contain any non-empty text nodes. - * - * ```js - * var node = new Node({type: 'text'}); - * node.isEmpty(); //=> true - * node.val = 'foo'; - * node.isEmpty(); //=> false - * ``` - * @param {Function} `fn` (optional) Filter function that is called on `node` and/or child nodes. `isEmpty` will return false immediately when the filter function returns false on any nodes. - * @return {Boolean} - * @api public - */ - -Node.prototype.isEmpty = function(fn) { - return utils.isEmpty(this, fn); -}; - -/** - * Given node `foo` and node `bar`, push node `bar` onto `foo.nodes`, and - * set `foo` as `bar.parent`. - * - * ```js - * var foo = new Node({type: 'foo'}); - * var bar = new Node({type: 'bar'}); - * foo.push(bar); - * ``` - * @param {Object} `node` - * @return {Number} Returns the length of `node.nodes` - * @api public - */ - -Node.prototype.push = function(node) { - assert(Node.isNode(node), 'expected node to be an instance of Node'); - define(node, 'parent', this); - - this.nodes = this.nodes || []; - return this.nodes.push(node); -}; - -/** - * Given node `foo` and node `bar`, unshift node `bar` onto `foo.nodes`, and - * set `foo` as `bar.parent`. - * - * ```js - * var foo = new Node({type: 'foo'}); - * var bar = new Node({type: 'bar'}); - * foo.unshift(bar); - * ``` - * @param {Object} `node` - * @return {Number} Returns the length of `node.nodes` - * @api public - */ - -Node.prototype.unshift = function(node) { - assert(Node.isNode(node), 'expected node to be an instance of Node'); - define(node, 'parent', this); - - this.nodes = this.nodes || []; - return this.nodes.unshift(node); -}; - -/** - * Pop a node from `node.nodes`. - * - * ```js - * var node = new Node({type: 'foo'}); - * node.push(new Node({type: 'a'})); - * node.push(new Node({type: 'b'})); - * node.push(new Node({type: 'c'})); - * node.push(new Node({type: 'd'})); - * console.log(node.nodes.length); - * //=> 4 - * node.pop(); - * console.log(node.nodes.length); - * //=> 3 - * ``` - * @return {Number} Returns the popped `node` - * @api public - */ - -Node.prototype.pop = function() { - return this.nodes && this.nodes.pop(); -}; - -/** - * Shift a node from `node.nodes`. - * - * ```js - * var node = new Node({type: 'foo'}); - * node.push(new Node({type: 'a'})); - * node.push(new Node({type: 'b'})); - * node.push(new Node({type: 'c'})); - * node.push(new Node({type: 'd'})); - * console.log(node.nodes.length); - * //=> 4 - * node.shift(); - * console.log(node.nodes.length); - * //=> 3 - * ``` - * @return {Object} Returns the shifted `node` - * @api public - */ - -Node.prototype.shift = function() { - return this.nodes && this.nodes.shift(); -}; - -/** - * Remove `node` from `node.nodes`. - * - * ```js - * node.remove(childNode); - * ``` - * @param {Object} `node` - * @return {Object} Returns the removed node. - * @api public - */ - -Node.prototype.remove = function(node) { - assert(Node.isNode(node), 'expected node to be an instance of Node'); - this.nodes = this.nodes || []; - var idx = node.index; - if (idx !== -1) { - node.index = -1; - return this.nodes.splice(idx, 1); - } - return null; -}; - -/** - * Get the first child node from `node.nodes` that matches the given `type`. - * If `type` is a number, the child node at that index is returned. - * - * ```js - * var child = node.find(1); //<= index of the node to get - * var child = node.find('foo'); //<= node.type of a child node - * var child = node.find(/^(foo|bar)$/); //<= regex to match node.type - * var child = node.find(['foo', 'bar']); //<= array of node.type(s) - * ``` - * @param {String} `type` - * @return {Object} Returns a child node or undefined. - * @api public - */ - -Node.prototype.find = function(type) { - return utils.findNode(this.nodes, type); -}; - -/** - * Return true if the node is the given `type`. - * - * ```js - * var node = new Node({type: 'bar'}); - * cosole.log(node.isType('foo')); // false - * cosole.log(node.isType(/^(foo|bar)$/)); // true - * cosole.log(node.isType(['foo', 'bar'])); // true - * ``` - * @param {String} `type` - * @return {Boolean} - * @api public - */ - -Node.prototype.isType = function(type) { - return utils.isType(this, type); -}; - -/** - * Return true if the `node.nodes` has the given `type`. - * - * ```js - * var foo = new Node({type: 'foo'}); - * var bar = new Node({type: 'bar'}); - * foo.push(bar); - * - * cosole.log(foo.hasType('qux')); // false - * cosole.log(foo.hasType(/^(qux|bar)$/)); // true - * cosole.log(foo.hasType(['qux', 'bar'])); // true - * ``` - * @param {String} `type` - * @return {Boolean} - * @api public - */ - -Node.prototype.hasType = function(type) { - return utils.hasType(this, type); -}; - -/** - * Get the siblings array, or `null` if it doesn't exist. - * - * ```js - * var foo = new Node({type: 'foo'}); - * var bar = new Node({type: 'bar'}); - * var baz = new Node({type: 'baz'}); - * foo.push(bar); - * foo.push(baz); - * - * console.log(bar.siblings.length) // 2 - * console.log(baz.siblings.length) // 2 - * ``` - * @return {Array} - * @api public - */ - -Object.defineProperty(Node.prototype, 'siblings', { - set: function() { - throw new Error('node.siblings is a getter and cannot be defined'); - }, - get: function() { - return this.parent ? this.parent.nodes : null; - } -}); - -/** - * Get the node's current index from `node.parent.nodes`. - * This should always be correct, even when the parent adds nodes. - * - * ```js - * var foo = new Node({type: 'foo'}); - * var bar = new Node({type: 'bar'}); - * var baz = new Node({type: 'baz'}); - * var qux = new Node({type: 'qux'}); - * foo.push(bar); - * foo.push(baz); - * foo.unshift(qux); - * - * console.log(bar.index) // 1 - * console.log(baz.index) // 2 - * console.log(qux.index) // 0 - * ``` - * @return {Number} - * @api public - */ - -Object.defineProperty(Node.prototype, 'index', { - set: function(index) { - define(this, 'idx', index); - }, - get: function() { - if (!Array.isArray(this.siblings)) { - return -1; - } - var tok = this.idx !== -1 ? this.siblings[this.idx] : null; - if (tok !== this) { - this.idx = this.siblings.indexOf(this); - } - return this.idx; - } -}); - -/** - * Get the previous node from the siblings array or `null`. - * - * ```js - * var foo = new Node({type: 'foo'}); - * var bar = new Node({type: 'bar'}); - * var baz = new Node({type: 'baz'}); - * foo.push(bar); - * foo.push(baz); - * - * console.log(baz.prev.type) // 'bar' - * ``` - * @return {Object} - * @api public - */ - -Object.defineProperty(Node.prototype, 'prev', { - set: function() { - throw new Error('node.prev is a getter and cannot be defined'); - }, - get: function() { - if (Array.isArray(this.siblings)) { - return this.siblings[this.index - 1] || this.parent.prev; - } - return null; - } -}); - -/** - * Get the siblings array, or `null` if it doesn't exist. - * - * ```js - * var foo = new Node({type: 'foo'}); - * var bar = new Node({type: 'bar'}); - * var baz = new Node({type: 'baz'}); - * foo.push(bar); - * foo.push(baz); - * - * console.log(bar.siblings.length) // 2 - * console.log(baz.siblings.length) // 2 - * ``` - * @return {Object} - * @api public - */ - -Object.defineProperty(Node.prototype, 'next', { - set: function() { - throw new Error('node.next is a getter and cannot be defined'); - }, - get: function() { - if (Array.isArray(this.siblings)) { - return this.siblings[this.index + 1] || this.parent.next; - } - return null; - } -}); - -/** - * Get the first node from `node.nodes`. - * - * ```js - * var foo = new Node({type: 'foo'}); - * var bar = new Node({type: 'bar'}); - * var baz = new Node({type: 'baz'}); - * var qux = new Node({type: 'qux'}); - * foo.push(bar); - * foo.push(baz); - * foo.push(qux); - * - * console.log(foo.first.type) // 'bar' - * ``` - * @return {Object} The first node, or undefiend - * @api public - */ - -Object.defineProperty(Node.prototype, 'first', { - get: function() { - return this.nodes ? this.nodes[0] : null; - } -}); - -/** - * Get the last node from `node.nodes`. - * - * ```js - * var foo = new Node({type: 'foo'}); - * var bar = new Node({type: 'bar'}); - * var baz = new Node({type: 'baz'}); - * var qux = new Node({type: 'qux'}); - * foo.push(bar); - * foo.push(baz); - * foo.push(qux); - * - * console.log(foo.last.type) // 'qux' - * ``` - * @return {Object} The last node, or undefiend - * @api public - */ - -Object.defineProperty(Node.prototype, 'last', { - get: function() { - return this.nodes ? utils.last(this.nodes) : null; - } -}); - -/** - * Get the last node from `node.nodes`. - * - * ```js - * var foo = new Node({type: 'foo'}); - * var bar = new Node({type: 'bar'}); - * var baz = new Node({type: 'baz'}); - * var qux = new Node({type: 'qux'}); - * foo.push(bar); - * foo.push(baz); - * foo.push(qux); - * - * console.log(foo.last.type) // 'qux' - * ``` - * @return {Object} The last node, or undefiend - * @api public - */ - -Object.defineProperty(Node.prototype, 'scope', { - get: function() { - if (this.isScope !== true) { - return this.parent ? this.parent.scope : this; - } - return this; - } -}); - -/** - * Get own property names from Node prototype, but only the - * first time `Node` is instantiated - */ - -function lazyKeys() { - if (!ownNames) { - ownNames = Object.getOwnPropertyNames(Node.prototype); - } -} - -/** - * Simplified assertion. Throws an error is `val` is falsey. - */ - -function assert(val, message) { - if (!val) throw new Error(message); -} - -/** - * Expose `Node` - */ - -exports = module.exports = Node; - - -/***/ }), -/* 113 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -/*! - * define-property - * - * Copyright (c) 2015, 2017, Jon Schlinkert. - * Released under the MIT License. - */ - - - -var isDescriptor = __webpack_require__(114); - -module.exports = function defineProperty(obj, prop, val) { - if (typeof obj !== 'object' && typeof obj !== 'function') { - throw new TypeError('expected an object or function.'); - } - - if (typeof prop !== 'string') { - throw new TypeError('expected `prop` to be a string.'); - } - - if (isDescriptor(val) && ('set' in val || 'get' in val)) { - return Object.defineProperty(obj, prop, val); - } - - return Object.defineProperty(obj, prop, { - configurable: true, - enumerable: false, - writable: true, - value: val - }); -}; - - -/***/ }), -/* 114 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var isAccessor = __webpack_require__(83); -var isData = __webpack_require__(87); - -module.exports = function isDescriptor(obj, key) { - if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) { - return false; - } - - if ('get' in obj || 'set' in obj) { - return isAccessor(obj, key); - } - - return isData(obj, key); -}; - - -/***/ }), -/* 115 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var typeOf = __webpack_require__(116); -var utils = module.exports; - -/** - * Returns true if the given value is a node. - * - * ```js - * var Node = require('snapdragon-node'); - * var node = new Node({type: 'foo'}); - * console.log(utils.isNode(node)); //=> true - * console.log(utils.isNode({})); //=> false - * ``` - * @param {Object} `node` Instance of [snapdragon-node][] - * @returns {Boolean} - * @api public - */ - -utils.isNode = function(node) { - return typeOf(node) === 'object' && node.isNode === true; -}; - -/** - * Emit an empty string for the given `node`. - * - * ```js - * // do nothing for beginning-of-string - * snapdragon.compiler.set('bos', utils.noop); - * ``` - * @param {Object} `node` Instance of [snapdragon-node][] - * @returns {undefined} - * @api public - */ - -utils.noop = function(node) { - append(this, '', node); -}; - -/** - * Appdend `node.val` to `compiler.output`, exactly as it was created - * by the parser. - * - * ```js - * snapdragon.compiler.set('text', utils.identity); - * ``` - * @param {Object} `node` Instance of [snapdragon-node][] - * @returns {undefined} - * @api public - */ - -utils.identity = function(node) { - append(this, node.val, node); -}; - -/** - * Previously named `.emit`, this method appends the given `val` - * to `compiler.output` for the given node. Useful when you know - * what value should be appended advance, regardless of the actual - * value of `node.val`. - * - * ```js - * snapdragon.compiler - * .set('i', function(node) { - * this.mapVisit(node); - * }) - * .set('i.open', utils.append('')) - * .set('i.close', utils.append('')) - * ``` - * @param {Object} `node` Instance of [snapdragon-node][] - * @returns {Function} Returns a compiler middleware function. - * @api public - */ - -utils.append = function(val) { - return function(node) { - append(this, val, node); - }; -}; - -/** - * Used in compiler middleware, this onverts an AST node into - * an empty `text` node and deletes `node.nodes` if it exists. - * The advantage of this method is that, as opposed to completely - * removing the node, indices will not need to be re-calculated - * in sibling nodes, and nothing is appended to the output. - * - * ```js - * utils.toNoop(node); - * // convert `node.nodes` to the given value instead of deleting it - * utils.toNoop(node, []); - * ``` - * @param {Object} `node` Instance of [snapdragon-node][] - * @param {Array} `nodes` Optionally pass a new `nodes` value, to replace the existing `node.nodes` array. - * @api public - */ - -utils.toNoop = function(node, nodes) { - if (nodes) { - node.nodes = nodes; - } else { - delete node.nodes; - node.type = 'text'; - node.val = ''; - } -}; - -/** - * Visit `node` with the given `fn`. The built-in `.visit` method in snapdragon - * automatically calls registered compilers, this allows you to pass a visitor - * function. - * - * ```js - * snapdragon.compiler.set('i', function(node) { - * utils.visit(node, function(childNode) { - * // do stuff with "childNode" - * return childNode; - * }); - * }); - * ``` - * @param {Object} `node` Instance of [snapdragon-node][] - * @param {Function} `fn` - * @return {Object} returns the node after recursively visiting all child nodes. - * @api public - */ - -utils.visit = function(node, fn) { - assert(utils.isNode(node), 'expected node to be an instance of Node'); - assert(isFunction(fn), 'expected a visitor function'); - fn(node); - return node.nodes ? utils.mapVisit(node, fn) : node; -}; - -/** - * Map [visit](#visit) the given `fn` over `node.nodes`. This is called by - * [visit](#visit), use this method if you do not want `fn` to be called on - * the first node. - * - * ```js - * snapdragon.compiler.set('i', function(node) { - * utils.mapVisit(node, function(childNode) { - * // do stuff with "childNode" - * return childNode; - * }); - * }); - * ``` - * @param {Object} `node` Instance of [snapdragon-node][] - * @param {Object} `options` - * @param {Function} `fn` - * @return {Object} returns the node - * @api public - */ - -utils.mapVisit = function(node, fn) { - assert(utils.isNode(node), 'expected node to be an instance of Node'); - assert(isArray(node.nodes), 'expected node.nodes to be an array'); - assert(isFunction(fn), 'expected a visitor function'); - - for (var i = 0; i < node.nodes.length; i++) { - utils.visit(node.nodes[i], fn); - } - return node; -}; - -/** - * Unshift an `*.open` node onto `node.nodes`. - * - * ```js - * var Node = require('snapdragon-node'); - * snapdragon.parser.set('brace', function(node) { - * var match = this.match(/^{/); - * if (match) { - * var parent = new Node({type: 'brace'}); - * utils.addOpen(parent, Node); - * console.log(parent.nodes[0]): - * // { type: 'brace.open', val: '' }; - * - * // push the parent "brace" node onto the stack - * this.push(parent); - * - * // return the parent node, so it's also added to the AST - * return brace; - * } - * }); - * ``` - * @param {Object} `node` Instance of [snapdragon-node][] - * @param {Function} `Node` (required) Node constructor function from [snapdragon-node][]. - * @param {Function} `filter` Optionaly specify a filter function to exclude the node. - * @return {Object} Returns the created opening node. - * @api public - */ - -utils.addOpen = function(node, Node, val, filter) { - assert(utils.isNode(node), 'expected node to be an instance of Node'); - assert(isFunction(Node), 'expected Node to be a constructor function'); - - if (typeof val === 'function') { - filter = val; - val = ''; - } - - if (typeof filter === 'function' && !filter(node)) return; - var open = new Node({ type: node.type + '.open', val: val}); - var unshift = node.unshift || node.unshiftNode; - if (typeof unshift === 'function') { - unshift.call(node, open); - } else { - utils.unshiftNode(node, open); - } - return open; -}; - -/** - * Push a `*.close` node onto `node.nodes`. - * - * ```js - * var Node = require('snapdragon-node'); - * snapdragon.parser.set('brace', function(node) { - * var match = this.match(/^}/); - * if (match) { - * var parent = this.parent(); - * if (parent.type !== 'brace') { - * throw new Error('missing opening: ' + '}'); - * } - * - * utils.addClose(parent, Node); - * console.log(parent.nodes[parent.nodes.length - 1]): - * // { type: 'brace.close', val: '' }; - * - * // no need to return a node, since the parent - * // was already added to the AST - * return; - * } - * }); - * ``` - * @param {Object} `node` Instance of [snapdragon-node][] - * @param {Function} `Node` (required) Node constructor function from [snapdragon-node][]. - * @param {Function} `filter` Optionaly specify a filter function to exclude the node. - * @return {Object} Returns the created closing node. - * @api public - */ - -utils.addClose = function(node, Node, val, filter) { - assert(utils.isNode(node), 'expected node to be an instance of Node'); - assert(isFunction(Node), 'expected Node to be a constructor function'); - - if (typeof val === 'function') { - filter = val; - val = ''; - } - - if (typeof filter === 'function' && !filter(node)) return; - var close = new Node({ type: node.type + '.close', val: val}); - var push = node.push || node.pushNode; - if (typeof push === 'function') { - push.call(node, close); - } else { - utils.pushNode(node, close); - } - return close; -}; - -/** - * Wraps the given `node` with `*.open` and `*.close` nodes. - * - * @param {Object} `node` Instance of [snapdragon-node][] - * @param {Function} `Node` (required) Node constructor function from [snapdragon-node][]. - * @param {Function} `filter` Optionaly specify a filter function to exclude the node. - * @return {Object} Returns the node - * @api public - */ - -utils.wrapNodes = function(node, Node, filter) { - assert(utils.isNode(node), 'expected node to be an instance of Node'); - assert(isFunction(Node), 'expected Node to be a constructor function'); - - utils.addOpen(node, Node, filter); - utils.addClose(node, Node, filter); - return node; -}; - -/** - * Push the given `node` onto `parent.nodes`, and set `parent` as `node.parent. - * - * ```js - * var parent = new Node({type: 'foo'}); - * var node = new Node({type: 'bar'}); - * utils.pushNode(parent, node); - * console.log(parent.nodes[0].type) // 'bar' - * console.log(node.parent.type) // 'foo' - * ``` - * @param {Object} `parent` - * @param {Object} `node` Instance of [snapdragon-node][] - * @return {Object} Returns the child node - * @api public - */ - -utils.pushNode = function(parent, node) { - assert(utils.isNode(parent), 'expected parent node to be an instance of Node'); - assert(utils.isNode(node), 'expected node to be an instance of Node'); - - node.define('parent', parent); - parent.nodes = parent.nodes || []; - parent.nodes.push(node); - return node; -}; - -/** - * Unshift `node` onto `parent.nodes`, and set `parent` as `node.parent. - * - * ```js - * var parent = new Node({type: 'foo'}); - * var node = new Node({type: 'bar'}); - * utils.unshiftNode(parent, node); - * console.log(parent.nodes[0].type) // 'bar' - * console.log(node.parent.type) // 'foo' - * ``` - * @param {Object} `parent` - * @param {Object} `node` Instance of [snapdragon-node][] - * @return {undefined} - * @api public - */ - -utils.unshiftNode = function(parent, node) { - assert(utils.isNode(parent), 'expected parent node to be an instance of Node'); - assert(utils.isNode(node), 'expected node to be an instance of Node'); - - node.define('parent', parent); - parent.nodes = parent.nodes || []; - parent.nodes.unshift(node); -}; - -/** - * Pop the last `node` off of `parent.nodes`. The advantage of - * using this method is that it checks for `node.nodes` and works - * with any version of `snapdragon-node`. - * - * ```js - * var parent = new Node({type: 'foo'}); - * utils.pushNode(parent, new Node({type: 'foo'})); - * utils.pushNode(parent, new Node({type: 'bar'})); - * utils.pushNode(parent, new Node({type: 'baz'})); - * console.log(parent.nodes.length); //=> 3 - * utils.popNode(parent); - * console.log(parent.nodes.length); //=> 2 - * ``` - * @param {Object} `parent` - * @param {Object} `node` Instance of [snapdragon-node][] - * @return {Number|Undefined} Returns the length of `node.nodes` or undefined. - * @api public - */ - -utils.popNode = function(node) { - assert(utils.isNode(node), 'expected node to be an instance of Node'); - if (typeof node.pop === 'function') { - return node.pop(); - } - return node.nodes && node.nodes.pop(); -}; - -/** - * Shift the first `node` off of `parent.nodes`. The advantage of - * using this method is that it checks for `node.nodes` and works - * with any version of `snapdragon-node`. - * - * ```js - * var parent = new Node({type: 'foo'}); - * utils.pushNode(parent, new Node({type: 'foo'})); - * utils.pushNode(parent, new Node({type: 'bar'})); - * utils.pushNode(parent, new Node({type: 'baz'})); - * console.log(parent.nodes.length); //=> 3 - * utils.shiftNode(parent); - * console.log(parent.nodes.length); //=> 2 - * ``` - * @param {Object} `parent` - * @param {Object} `node` Instance of [snapdragon-node][] - * @return {Number|Undefined} Returns the length of `node.nodes` or undefined. - * @api public - */ - -utils.shiftNode = function(node) { - assert(utils.isNode(node), 'expected node to be an instance of Node'); - if (typeof node.shift === 'function') { - return node.shift(); - } - return node.nodes && node.nodes.shift(); -}; - -/** - * Remove the specified `node` from `parent.nodes`. - * - * ```js - * var parent = new Node({type: 'abc'}); - * var foo = new Node({type: 'foo'}); - * utils.pushNode(parent, foo); - * utils.pushNode(parent, new Node({type: 'bar'})); - * utils.pushNode(parent, new Node({type: 'baz'})); - * console.log(parent.nodes.length); //=> 3 - * utils.removeNode(parent, foo); - * console.log(parent.nodes.length); //=> 2 - * ``` - * @param {Object} `parent` - * @param {Object} `node` Instance of [snapdragon-node][] - * @return {Object|undefined} Returns the removed node, if successful, or undefined if it does not exist on `parent.nodes`. - * @api public - */ - -utils.removeNode = function(parent, node) { - assert(utils.isNode(parent), 'expected parent.node to be an instance of Node'); - assert(utils.isNode(node), 'expected node to be an instance of Node'); - - if (!parent.nodes) { - return null; - } - - if (typeof parent.remove === 'function') { - return parent.remove(node); - } - - var idx = parent.nodes.indexOf(node); - if (idx !== -1) { - return parent.nodes.splice(idx, 1); - } -}; - -/** - * Returns true if `node.type` matches the given `type`. Throws a - * `TypeError` if `node` is not an instance of `Node`. - * - * ```js - * var Node = require('snapdragon-node'); - * var node = new Node({type: 'foo'}); - * console.log(utils.isType(node, 'foo')); // false - * console.log(utils.isType(node, 'bar')); // true - * ``` - * @param {Object} `node` Instance of [snapdragon-node][] - * @param {String} `type` - * @return {Boolean} - * @api public - */ - -utils.isType = function(node, type) { - assert(utils.isNode(node), 'expected node to be an instance of Node'); - switch (typeOf(type)) { - case 'array': - var types = type.slice(); - for (var i = 0; i < types.length; i++) { - if (utils.isType(node, types[i])) { - return true; - } - } - return false; - case 'string': - return node.type === type; - case 'regexp': - return type.test(node.type); - default: { - throw new TypeError('expected "type" to be an array, string or regexp'); - } - } -}; - -/** - * Returns true if the given `node` has the given `type` in `node.nodes`. - * Throws a `TypeError` if `node` is not an instance of `Node`. - * - * ```js - * var Node = require('snapdragon-node'); - * var node = new Node({ - * type: 'foo', - * nodes: [ - * new Node({type: 'bar'}), - * new Node({type: 'baz'}) - * ] - * }); - * console.log(utils.hasType(node, 'xyz')); // false - * console.log(utils.hasType(node, 'baz')); // true - * ``` - * @param {Object} `node` Instance of [snapdragon-node][] - * @param {String} `type` - * @return {Boolean} - * @api public - */ - -utils.hasType = function(node, type) { - assert(utils.isNode(node), 'expected node to be an instance of Node'); - if (!Array.isArray(node.nodes)) return false; - for (var i = 0; i < node.nodes.length; i++) { - if (utils.isType(node.nodes[i], type)) { - return true; - } - } - return false; -}; - -/** - * Returns the first node from `node.nodes` of the given `type` - * - * ```js - * var node = new Node({ - * type: 'foo', - * nodes: [ - * new Node({type: 'text', val: 'abc'}), - * new Node({type: 'text', val: 'xyz'}) - * ] - * }); - * - * var textNode = utils.firstOfType(node.nodes, 'text'); - * console.log(textNode.val); - * //=> 'abc' - * ``` - * @param {Array} `nodes` - * @param {String} `type` - * @return {Object|undefined} Returns the first matching node or undefined. - * @api public - */ - -utils.firstOfType = function(nodes, type) { - for (var i = 0; i < nodes.length; i++) { - var node = nodes[i]; - if (utils.isType(node, type)) { - return node; - } - } -}; - -/** - * Returns the node at the specified index, or the first node of the - * given `type` from `node.nodes`. - * - * ```js - * var node = new Node({ - * type: 'foo', - * nodes: [ - * new Node({type: 'text', val: 'abc'}), - * new Node({type: 'text', val: 'xyz'}) - * ] - * }); - * - * var nodeOne = utils.findNode(node.nodes, 'text'); - * console.log(nodeOne.val); - * //=> 'abc' - * - * var nodeTwo = utils.findNode(node.nodes, 1); - * console.log(nodeTwo.val); - * //=> 'xyz' - * ``` - * - * @param {Array} `nodes` - * @param {String|Number} `type` Node type or index. - * @return {Object} Returns a node or undefined. - * @api public - */ - -utils.findNode = function(nodes, type) { - if (!Array.isArray(nodes)) { - return null; - } - if (typeof type === 'number') { - return nodes[type]; - } - return utils.firstOfType(nodes, type); -}; - -/** - * Returns true if the given node is an "*.open" node. - * - * ```js - * var Node = require('snapdragon-node'); - * var brace = new Node({type: 'brace'}); - * var open = new Node({type: 'brace.open'}); - * var close = new Node({type: 'brace.close'}); - * - * console.log(utils.isOpen(brace)); // false - * console.log(utils.isOpen(open)); // true - * console.log(utils.isOpen(close)); // false - * ``` - * @param {Object} `node` Instance of [snapdragon-node][] - * @return {Boolean} - * @api public - */ - -utils.isOpen = function(node) { - assert(utils.isNode(node), 'expected node to be an instance of Node'); - return node.type.slice(-5) === '.open'; -}; - -/** - * Returns true if the given node is a "*.close" node. - * - * ```js - * var Node = require('snapdragon-node'); - * var brace = new Node({type: 'brace'}); - * var open = new Node({type: 'brace.open'}); - * var close = new Node({type: 'brace.close'}); - * - * console.log(utils.isClose(brace)); // false - * console.log(utils.isClose(open)); // false - * console.log(utils.isClose(close)); // true - * ``` - * @param {Object} `node` Instance of [snapdragon-node][] - * @return {Boolean} - * @api public - */ - -utils.isClose = function(node) { - assert(utils.isNode(node), 'expected node to be an instance of Node'); - return node.type.slice(-6) === '.close'; -}; - -/** - * Returns true if `node.nodes` **has** an `.open` node - * - * ```js - * var Node = require('snapdragon-node'); - * var brace = new Node({ - * type: 'brace', - * nodes: [] - * }); - * - * var open = new Node({type: 'brace.open'}); - * console.log(utils.hasOpen(brace)); // false - * - * brace.pushNode(open); - * console.log(utils.hasOpen(brace)); // true - * ``` - * @param {Object} `node` Instance of [snapdragon-node][] - * @return {Boolean} - * @api public - */ - -utils.hasOpen = function(node) { - assert(utils.isNode(node), 'expected node to be an instance of Node'); - var first = node.first || node.nodes ? node.nodes[0] : null; - if (utils.isNode(first)) { - return first.type === node.type + '.open'; - } - return false; -}; - -/** - * Returns true if `node.nodes` **has** a `.close` node - * - * ```js - * var Node = require('snapdragon-node'); - * var brace = new Node({ - * type: 'brace', - * nodes: [] - * }); - * - * var close = new Node({type: 'brace.close'}); - * console.log(utils.hasClose(brace)); // false - * - * brace.pushNode(close); - * console.log(utils.hasClose(brace)); // true - * ``` - * @param {Object} `node` Instance of [snapdragon-node][] - * @return {Boolean} - * @api public - */ - -utils.hasClose = function(node) { - assert(utils.isNode(node), 'expected node to be an instance of Node'); - var last = node.last || node.nodes ? node.nodes[node.nodes.length - 1] : null; - if (utils.isNode(last)) { - return last.type === node.type + '.close'; - } - return false; -}; - -/** - * Returns true if `node.nodes` has both `.open` and `.close` nodes - * - * ```js - * var Node = require('snapdragon-node'); - * var brace = new Node({ - * type: 'brace', - * nodes: [] - * }); - * - * var open = new Node({type: 'brace.open'}); - * var close = new Node({type: 'brace.close'}); - * console.log(utils.hasOpen(brace)); // false - * console.log(utils.hasClose(brace)); // false - * - * brace.pushNode(open); - * brace.pushNode(close); - * console.log(utils.hasOpen(brace)); // true - * console.log(utils.hasClose(brace)); // true - * ``` - * @param {Object} `node` Instance of [snapdragon-node][] - * @return {Boolean} - * @api public - */ - -utils.hasOpenAndClose = function(node) { - return utils.hasOpen(node) && utils.hasClose(node); -}; - -/** - * Push the given `node` onto the `state.inside` array for the - * given type. This array is used as a specialized "stack" for - * only the given `node.type`. - * - * ```js - * var state = { inside: {}}; - * var node = new Node({type: 'brace'}); - * utils.addType(state, node); - * console.log(state.inside); - * //=> { brace: [{type: 'brace'}] } - * ``` - * @param {Object} `state` The `compiler.state` object or custom state object. - * @param {Object} `node` Instance of [snapdragon-node][] - * @return {Array} Returns the `state.inside` stack for the given type. - * @api public - */ - -utils.addType = function(state, node) { - assert(utils.isNode(node), 'expected node to be an instance of Node'); - assert(isObject(state), 'expected state to be an object'); - - var type = node.parent - ? node.parent.type - : node.type.replace(/\.open$/, ''); - - if (!state.hasOwnProperty('inside')) { - state.inside = {}; - } - if (!state.inside.hasOwnProperty(type)) { - state.inside[type] = []; - } - - var arr = state.inside[type]; - arr.push(node); - return arr; -}; - -/** - * Remove the given `node` from the `state.inside` array for the - * given type. This array is used as a specialized "stack" for - * only the given `node.type`. - * - * ```js - * var state = { inside: {}}; - * var node = new Node({type: 'brace'}); - * utils.addType(state, node); - * console.log(state.inside); - * //=> { brace: [{type: 'brace'}] } - * utils.removeType(state, node); - * //=> { brace: [] } - * ``` - * @param {Object} `state` The `compiler.state` object or custom state object. - * @param {Object} `node` Instance of [snapdragon-node][] - * @return {Array} Returns the `state.inside` stack for the given type. - * @api public - */ - -utils.removeType = function(state, node) { - assert(utils.isNode(node), 'expected node to be an instance of Node'); - assert(isObject(state), 'expected state to be an object'); - - var type = node.parent - ? node.parent.type - : node.type.replace(/\.close$/, ''); - - if (state.inside.hasOwnProperty(type)) { - return state.inside[type].pop(); - } -}; - -/** - * Returns true if `node.val` is an empty string, or `node.nodes` does - * not contain any non-empty text nodes. - * - * ```js - * var node = new Node({type: 'text'}); - * utils.isEmpty(node); //=> true - * node.val = 'foo'; - * utils.isEmpty(node); //=> false - * ``` - * @param {Object} `node` Instance of [snapdragon-node][] - * @param {Function} `fn` - * @return {Boolean} - * @api public - */ - -utils.isEmpty = function(node, fn) { - assert(utils.isNode(node), 'expected node to be an instance of Node'); - - if (!Array.isArray(node.nodes)) { - if (node.type !== 'text') { - return true; - } - if (typeof fn === 'function') { - return fn(node, node.parent); - } - return !utils.trim(node.val); - } - - for (var i = 0; i < node.nodes.length; i++) { - var child = node.nodes[i]; - if (utils.isOpen(child) || utils.isClose(child)) { - continue; - } - if (!utils.isEmpty(child, fn)) { - return false; - } - } - - return true; -}; - -/** - * Returns true if the `state.inside` stack for the given type exists - * and has one or more nodes on it. - * - * ```js - * var state = { inside: {}}; - * var node = new Node({type: 'brace'}); - * console.log(utils.isInsideType(state, 'brace')); //=> false - * utils.addType(state, node); - * console.log(utils.isInsideType(state, 'brace')); //=> true - * utils.removeType(state, node); - * console.log(utils.isInsideType(state, 'brace')); //=> false - * ``` - * @param {Object} `state` - * @param {String} `type` - * @return {Boolean} - * @api public - */ - -utils.isInsideType = function(state, type) { - assert(isObject(state), 'expected state to be an object'); - assert(isString(type), 'expected type to be a string'); - - if (!state.hasOwnProperty('inside')) { - return false; - } - - if (!state.inside.hasOwnProperty(type)) { - return false; - } - - return state.inside[type].length > 0; -}; - -/** - * Returns true if `node` is either a child or grand-child of the given `type`, - * or `state.inside[type]` is a non-empty array. - * - * ```js - * var state = { inside: {}}; - * var node = new Node({type: 'brace'}); - * var open = new Node({type: 'brace.open'}); - * console.log(utils.isInside(state, open, 'brace')); //=> false - * utils.pushNode(node, open); - * console.log(utils.isInside(state, open, 'brace')); //=> true - * ``` - * @param {Object} `state` Either the `compiler.state` object, if it exists, or a user-supplied state object. - * @param {Object} `node` Instance of [snapdragon-node][] - * @param {String} `type` The `node.type` to check for. - * @return {Boolean} - * @api public - */ - -utils.isInside = function(state, node, type) { - assert(utils.isNode(node), 'expected node to be an instance of Node'); - assert(isObject(state), 'expected state to be an object'); - - if (Array.isArray(type)) { - for (var i = 0; i < type.length; i++) { - if (utils.isInside(state, node, type[i])) { - return true; - } - } - return false; - } - - var parent = node.parent; - if (typeof type === 'string') { - return (parent && parent.type === type) || utils.isInsideType(state, type); - } - - if (typeOf(type) === 'regexp') { - if (parent && parent.type && type.test(parent.type)) { - return true; - } - - var keys = Object.keys(state.inside); - var len = keys.length; - var idx = -1; - while (++idx < len) { - var key = keys[idx]; - var val = state.inside[key]; - - if (Array.isArray(val) && val.length !== 0 && type.test(key)) { - return true; - } - } - } - return false; -}; - -/** - * Get the last `n` element from the given `array`. Used for getting - * a node from `node.nodes.` - * - * @param {Array} `array` - * @param {Number} `n` - * @return {undefined} - * @api public - */ - -utils.last = function(arr, n) { - return arr[arr.length - (n || 1)]; -}; - -/** - * Cast the given `val` to an array. - * - * ```js - * console.log(utils.arrayify('')); - * //=> [] - * console.log(utils.arrayify('foo')); - * //=> ['foo'] - * console.log(utils.arrayify(['foo'])); - * //=> ['foo'] - * ``` - * @param {any} `val` - * @return {Array} - * @api public - */ - -utils.arrayify = function(val) { - if (typeof val === 'string' && val !== '') { - return [val]; - } - if (!Array.isArray(val)) { - return []; - } - return val; -}; - -/** - * Convert the given `val` to a string by joining with `,`. Useful - * for creating a cheerio/CSS/DOM-style selector from a list of strings. - * - * @param {any} `val` - * @return {Array} - * @api public - */ - -utils.stringify = function(val) { - return utils.arrayify(val).join(','); -}; - -/** - * Ensure that the given value is a string and call `.trim()` on it, - * or return an empty string. - * - * @param {String} `str` - * @return {String} - * @api public - */ - -utils.trim = function(str) { - return typeof str === 'string' ? str.trim() : ''; -}; - -/** - * Return true if val is an object - */ - -function isObject(val) { - return typeOf(val) === 'object'; -} - -/** - * Return true if val is a string - */ - -function isString(val) { - return typeof val === 'string'; -} - -/** - * Return true if val is a function - */ - -function isFunction(val) { - return typeof val === 'function'; -} - -/** - * Return true if val is an array - */ - -function isArray(val) { - return Array.isArray(val); -} - -/** - * Shim to ensure the `.append` methods work with any version of snapdragon - */ - -function append(compiler, val, node) { - if (typeof compiler.append !== 'function') { - return compiler.emit(val, node); - } - return compiler.append(val, node); -} - -/** - * Simplified assertion. Throws an error is `val` is falsey. - */ - -function assert(val, message) { - if (!val) throw new Error(message); -} - - -/***/ }), -/* 116 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var isBuffer = __webpack_require__(107); -var toString = Object.prototype.toString; - -/** - * Get the native `typeof` a value. - * - * @param {*} `val` - * @return {*} Native javascript type - */ - -module.exports = function kindOf(val) { - // primitivies - if (typeof val === 'undefined') { - return 'undefined'; - } - if (val === null) { - return 'null'; - } - if (val === true || val === false || val instanceof Boolean) { - return 'boolean'; - } - if (typeof val === 'string' || val instanceof String) { - return 'string'; - } - if (typeof val === 'number' || val instanceof Number) { - return 'number'; - } - - // functions - if (typeof val === 'function' || val instanceof Function) { - return 'function'; - } - - // array - if (typeof Array.isArray !== 'undefined' && Array.isArray(val)) { - return 'array'; - } - - // check for instances of RegExp and Date before calling `toString` - if (val instanceof RegExp) { - return 'regexp'; - } - if (val instanceof Date) { - return 'date'; - } - - // other objects - var type = toString.call(val); - - if (type === '[object RegExp]') { - return 'regexp'; - } - if (type === '[object Date]') { - return 'date'; - } - if (type === '[object Arguments]') { - return 'arguments'; - } - if (type === '[object Error]') { - return 'error'; - } - - // buffer - if (isBuffer(val)) { - return 'buffer'; - } - - // es6: Map, WeakMap, Set, WeakSet - if (type === '[object Set]') { - return 'set'; - } - if (type === '[object WeakSet]') { - return 'weakset'; - } - if (type === '[object Map]') { - return 'map'; - } - if (type === '[object WeakMap]') { - return 'weakmap'; - } - if (type === '[object Symbol]') { - return 'symbol'; - } - - // typed arrays - if (type === '[object Int8Array]') { - return 'int8array'; - } - if (type === '[object Uint8Array]') { - return 'uint8array'; - } - if (type === '[object Uint8ClampedArray]') { - return 'uint8clampedarray'; - } - if (type === '[object Int16Array]') { - return 'int16array'; - } - if (type === '[object Uint16Array]') { - return 'uint16array'; - } - if (type === '[object Int32Array]') { - return 'int32array'; - } - if (type === '[object Uint32Array]') { - return 'uint32array'; - } - if (type === '[object Float32Array]') { - return 'float32array'; - } - if (type === '[object Float64Array]') { - return 'float64array'; - } - - // must be a plain object - return 'object'; -}; - - -/***/ }), -/* 117 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var extend = __webpack_require__(96); -var Snapdragon = __webpack_require__(118); -var compilers = __webpack_require__(98); -var parsers = __webpack_require__(111); -var utils = __webpack_require__(99); - -/** - * Customize Snapdragon parser and renderer - */ - -function Braces(options) { - this.options = extend({}, options); -} - -/** - * Initialize braces - */ - -Braces.prototype.init = function(options) { - if (this.isInitialized) return; - this.isInitialized = true; - var opts = utils.createOptions({}, this.options, options); - this.snapdragon = this.options.snapdragon || new Snapdragon(opts); - this.compiler = this.snapdragon.compiler; - this.parser = this.snapdragon.parser; - - compilers(this.snapdragon, opts); - parsers(this.snapdragon, opts); - - /** - * Call Snapdragon `.parse` method. When AST is returned, we check to - * see if any unclosed braces are left on the stack and, if so, we iterate - * over the stack and correct the AST so that compilers are called in the correct - * order and unbalance braces are properly escaped. - */ - - utils.define(this.snapdragon, 'parse', function(pattern, options) { - var parsed = Snapdragon.prototype.parse.apply(this, arguments); - this.parser.ast.input = pattern; - - var stack = this.parser.stack; - while (stack.length) { - addParent({type: 'brace.close', val: ''}, stack.pop()); - } - - function addParent(node, parent) { - utils.define(node, 'parent', parent); - parent.nodes.push(node); - } - - // add non-enumerable parser reference - utils.define(parsed, 'parser', this.parser); - return parsed; - }); -}; - -/** - * Decorate `.parse` method - */ - -Braces.prototype.parse = function(ast, options) { - if (ast && typeof ast === 'object' && ast.nodes) return ast; - this.init(options); - return this.snapdragon.parse(ast, options); -}; - -/** - * Decorate `.compile` method - */ - -Braces.prototype.compile = function(ast, options) { - if (typeof ast === 'string') { - ast = this.parse(ast, options); - } else { - this.init(options); - } - return this.snapdragon.compile(ast, options); -}; - -/** - * Expand - */ - -Braces.prototype.expand = function(pattern) { - var ast = this.parse(pattern, {expand: true}); - return this.compile(ast, {expand: true}); -}; - -/** - * Optimize - */ - -Braces.prototype.optimize = function(pattern) { - var ast = this.parse(pattern, {optimize: true}); - return this.compile(ast, {optimize: true}); -}; - -/** - * Expose `Braces` - */ - -module.exports = Braces; - - -/***/ }), -/* 118 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var Base = __webpack_require__(119); -var define = __webpack_require__(148); -var Compiler = __webpack_require__(154); -var Parser = __webpack_require__(184); -var utils = __webpack_require__(163); -var regexCache = {}; -var cache = {}; - -/** - * Create a new instance of `Snapdragon` with the given `options`. - * - * ```js - * var snapdragon = new Snapdragon(); - * ``` - * - * @param {Object} `options` - * @api public - */ - -function Snapdragon(options) { - Base.call(this, null, options); - this.options = utils.extend({source: 'string'}, this.options); - this.compiler = new Compiler(this.options); - this.parser = new Parser(this.options); - - Object.defineProperty(this, 'compilers', { - get: function() { - return this.compiler.compilers; - } - }); - - Object.defineProperty(this, 'parsers', { - get: function() { - return this.parser.parsers; - } - }); - - Object.defineProperty(this, 'regex', { - get: function() { - return this.parser.regex; - } - }); -} - -/** - * Inherit Base - */ - -Base.extend(Snapdragon); - -/** - * Add a parser to `snapdragon.parsers` for capturing the given `type` using - * the specified regex or parser function. A function is useful if you need - * to customize how the token is created and/or have access to the parser - * instance to check options, etc. - * - * ```js - * snapdragon - * .capture('slash', /^\//) - * .capture('dot', function() { - * var pos = this.position(); - * var m = this.match(/^\./); - * if (!m) return; - * return pos({ - * type: 'dot', - * val: m[0] - * }); - * }); - * ``` - * @param {String} `type` - * @param {RegExp|Function} `regex` - * @return {Object} Returns the parser instance for chaining - * @api public - */ - -Snapdragon.prototype.capture = function() { - return this.parser.capture.apply(this.parser, arguments); -}; - -/** - * Register a plugin `fn`. - * - * ```js - * var snapdragon = new Snapdgragon([options]); - * snapdragon.use(function() { - * console.log(this); //<= snapdragon instance - * console.log(this.parser); //<= parser instance - * console.log(this.compiler); //<= compiler instance - * }); - * ``` - * @param {Object} `fn` - * @api public - */ - -Snapdragon.prototype.use = function(fn) { - fn.call(this, this); - return this; -}; - -/** - * Parse the given `str`. - * - * ```js - * var snapdragon = new Snapdgragon([options]); - * // register parsers - * snapdragon.parser.use(function() {}); - * - * // parse - * var ast = snapdragon.parse('foo/bar'); - * console.log(ast); - * ``` - * @param {String} `str` - * @param {Object} `options` Set `options.sourcemap` to true to enable source maps. - * @return {Object} Returns an AST. - * @api public - */ - -Snapdragon.prototype.parse = function(str, options) { - this.options = utils.extend({}, this.options, options); - var parsed = this.parser.parse(str, this.options); - - // add non-enumerable parser reference - define(parsed, 'parser', this.parser); - return parsed; -}; - -/** - * Compile the given `AST`. - * - * ```js - * var snapdragon = new Snapdgragon([options]); - * // register plugins - * snapdragon.use(function() {}); - * // register parser plugins - * snapdragon.parser.use(function() {}); - * // register compiler plugins - * snapdragon.compiler.use(function() {}); - * - * // parse - * var ast = snapdragon.parse('foo/bar'); - * - * // compile - * var res = snapdragon.compile(ast); - * console.log(res.output); - * ``` - * @param {Object} `ast` - * @param {Object} `options` - * @return {Object} Returns an object with an `output` property with the rendered string. - * @api public - */ - -Snapdragon.prototype.compile = function(ast, options) { - this.options = utils.extend({}, this.options, options); - var compiled = this.compiler.compile(ast, this.options); - - // add non-enumerable compiler reference - define(compiled, 'compiler', this.compiler); - return compiled; -}; - -/** - * Expose `Snapdragon` - */ - -module.exports = Snapdragon; - -/** - * Expose `Parser` and `Compiler` - */ - -module.exports.Compiler = Compiler; -module.exports.Parser = Parser; - - -/***/ }), -/* 119 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var util = __webpack_require__(17); -var define = __webpack_require__(120); -var CacheBase = __webpack_require__(122); -var Emitter = __webpack_require__(123); -var isObject = __webpack_require__(81); -var merge = __webpack_require__(143); -var pascal = __webpack_require__(146); -var cu = __webpack_require__(147); - -/** - * Optionally define a custom `cache` namespace to use. - */ - -function namespace(name) { - var Cache = name ? CacheBase.namespace(name) : CacheBase; - var fns = []; - - /** - * Create an instance of `Base` with the given `config` and `options`. - * - * ```js - * // initialize with `config` and `options` - * var app = new Base({isApp: true}, {abc: true}); - * app.set('foo', 'bar'); - * - * // values defined with the given `config` object will be on the root of the instance - * console.log(app.baz); //=> undefined - * console.log(app.foo); //=> 'bar' - * // or use `.get` - * console.log(app.get('isApp')); //=> true - * console.log(app.get('foo')); //=> 'bar' - * - * // values defined with the given `options` object will be on `app.options - * console.log(app.options.abc); //=> true - * ``` - * - * @param {Object} `config` If supplied, this object is passed to [cache-base][] to merge onto the the instance upon instantiation. - * @param {Object} `options` If supplied, this object is used to initialize the `base.options` object. - * @api public - */ - - function Base(config, options) { - if (!(this instanceof Base)) { - return new Base(config, options); - } - Cache.call(this, config); - this.is('base'); - this.initBase(config, options); - } - - /** - * Inherit cache-base - */ - - util.inherits(Base, Cache); - - /** - * Add static emitter methods - */ - - Emitter(Base); - - /** - * Initialize `Base` defaults with the given `config` object - */ - - Base.prototype.initBase = function(config, options) { - this.options = merge({}, this.options, options); - this.cache = this.cache || {}; - this.define('registered', {}); - if (name) this[name] = {}; - - // make `app._callbacks` non-enumerable - this.define('_callbacks', this._callbacks); - if (isObject(config)) { - this.visit('set', config); - } - Base.run(this, 'use', fns); - }; - - /** - * Set the given `name` on `app._name` and `app.is*` properties. Used for doing - * lookups in plugins. - * - * ```js - * app.is('foo'); - * console.log(app._name); - * //=> 'foo' - * console.log(app.isFoo); - * //=> true - * app.is('bar'); - * console.log(app.isFoo); - * //=> true - * console.log(app.isBar); - * //=> true - * console.log(app._name); - * //=> 'bar' - * ``` - * @name .is - * @param {String} `name` - * @return {Boolean} - * @api public - */ - - Base.prototype.is = function(name) { - if (typeof name !== 'string') { - throw new TypeError('expected name to be a string'); - } - this.define('is' + pascal(name), true); - this.define('_name', name); - this.define('_appname', name); - return this; - }; - - /** - * Returns true if a plugin has already been registered on an instance. - * - * Plugin implementors are encouraged to use this first thing in a plugin - * to prevent the plugin from being called more than once on the same - * instance. - * - * ```js - * var base = new Base(); - * base.use(function(app) { - * if (app.isRegistered('myPlugin')) return; - * // do stuff to `app` - * }); - * - * // to also record the plugin as being registered - * base.use(function(app) { - * if (app.isRegistered('myPlugin', true)) return; - * // do stuff to `app` - * }); - * ``` - * @name .isRegistered - * @emits `plugin` Emits the name of the plugin being registered. Useful for unit tests, to ensure plugins are only registered once. - * @param {String} `name` The plugin name. - * @param {Boolean} `register` If the plugin if not already registered, to record it as being registered pass `true` as the second argument. - * @return {Boolean} Returns true if a plugin is already registered. - * @api public - */ - - Base.prototype.isRegistered = function(name, register) { - if (this.registered.hasOwnProperty(name)) { - return true; - } - if (register !== false) { - this.registered[name] = true; - this.emit('plugin', name); - } - return false; - }; - - /** - * Define a plugin function to be called immediately upon init. Plugins are chainable - * and expose the following arguments to the plugin function: - * - * - `app`: the current instance of `Base` - * - `base`: the [first ancestor instance](#base) of `Base` - * - * ```js - * var app = new Base() - * .use(foo) - * .use(bar) - * .use(baz) - * ``` - * @name .use - * @param {Function} `fn` plugin function to call - * @return {Object} Returns the item instance for chaining. - * @api public - */ - - Base.prototype.use = function(fn) { - fn.call(this, this); - return this; - }; - - /** - * The `.define` method is used for adding non-enumerable property on the instance. - * Dot-notation is **not supported** with `define`. - * - * ```js - * // arbitrary `render` function using lodash `template` - * app.define('render', function(str, locals) { - * return _.template(str)(locals); - * }); - * ``` - * @name .define - * @param {String} `key` The name of the property to define. - * @param {any} `value` - * @return {Object} Returns the instance for chaining. - * @api public - */ - - Base.prototype.define = function(key, val) { - if (isObject(key)) { - return this.visit('define', key); - } - define(this, key, val); - return this; - }; - - /** - * Mix property `key` onto the Base prototype. If base is inherited using - * `Base.extend` this method will be overridden by a new `mixin` method that will - * only add properties to the prototype of the inheriting application. - * - * ```js - * app.mixin('foo', function() { - * // do stuff - * }); - * ``` - * @name .mixin - * @param {String} `key` - * @param {Object|Array} `val` - * @return {Object} Returns the `base` instance for chaining. - * @api public - */ - - Base.prototype.mixin = function(key, val) { - Base.prototype[key] = val; - return this; - }; - - /** - * Non-enumberable mixin array, used by the static [Base.mixin]() method. - */ - - Base.prototype.mixins = Base.prototype.mixins || []; - - /** - * Getter/setter used when creating nested instances of `Base`, for storing a reference - * to the first ancestor instance. This works by setting an instance of `Base` on the `parent` - * property of a "child" instance. The `base` property defaults to the current instance if - * no `parent` property is defined. - * - * ```js - * // create an instance of `Base`, this is our first ("base") instance - * var first = new Base(); - * first.foo = 'bar'; // arbitrary property, to make it easier to see what's happening later - * - * // create another instance - * var second = new Base(); - * // create a reference to the first instance (`first`) - * second.parent = first; - * - * // create another instance - * var third = new Base(); - * // create a reference to the previous instance (`second`) - * // repeat this pattern every time a "child" instance is created - * third.parent = second; - * - * // we can always access the first instance using the `base` property - * console.log(first.base.foo); - * //=> 'bar' - * console.log(second.base.foo); - * //=> 'bar' - * console.log(third.base.foo); - * //=> 'bar' - * // and now you know how to get to third base ;) - * ``` - * @name .base - * @api public - */ - - Object.defineProperty(Base.prototype, 'base', { - configurable: true, - get: function() { - return this.parent ? this.parent.base : this; - } - }); - - /** - * Static method for adding global plugin functions that will - * be added to an instance when created. - * - * ```js - * Base.use(function(app) { - * app.foo = 'bar'; - * }); - * var app = new Base(); - * console.log(app.foo); - * //=> 'bar' - * ``` - * @name #use - * @param {Function} `fn` Plugin function to use on each instance. - * @return {Object} Returns the `Base` constructor for chaining - * @api public - */ - - define(Base, 'use', function(fn) { - fns.push(fn); - return Base; - }); - - /** - * Run an array of functions by passing each function - * to a method on the given object specified by the given property. - * - * @param {Object} `obj` Object containing method to use. - * @param {String} `prop` Name of the method on the object to use. - * @param {Array} `arr` Array of functions to pass to the method. - */ - - define(Base, 'run', function(obj, prop, arr) { - var len = arr.length, i = 0; - while (len--) { - obj[prop](arr[i++]); - } - return Base; - }); - - /** - * Static method for inheriting the prototype and static methods of the `Base` class. - * This method greatly simplifies the process of creating inheritance-based applications. - * See [static-extend][] for more details. - * - * ```js - * var extend = cu.extend(Parent); - * Parent.extend(Child); - * - * // optional methods - * Parent.extend(Child, { - * foo: function() {}, - * bar: function() {} - * }); - * ``` - * @name #extend - * @param {Function} `Ctor` constructor to extend - * @param {Object} `methods` Optional prototype properties to mix in. - * @return {Object} Returns the `Base` constructor for chaining - * @api public - */ - - define(Base, 'extend', cu.extend(Base, function(Ctor, Parent) { - Ctor.prototype.mixins = Ctor.prototype.mixins || []; - - define(Ctor, 'mixin', function(fn) { - var mixin = fn(Ctor.prototype, Ctor); - if (typeof mixin === 'function') { - Ctor.prototype.mixins.push(mixin); - } - return Ctor; - }); - - define(Ctor, 'mixins', function(Child) { - Base.run(Child, 'mixin', Ctor.prototype.mixins); - return Ctor; - }); - - Ctor.prototype.mixin = function(key, value) { - Ctor.prototype[key] = value; - return this; - }; - return Base; - })); - - /** - * Used for adding methods to the `Base` prototype, and/or to the prototype of child instances. - * When a mixin function returns a function, the returned function is pushed onto the `.mixins` - * array, making it available to be used on inheriting classes whenever `Base.mixins()` is - * called (e.g. `Base.mixins(Child)`). - * - * ```js - * Base.mixin(function(proto) { - * proto.foo = function(msg) { - * return 'foo ' + msg; - * }; - * }); - * ``` - * @name #mixin - * @param {Function} `fn` Function to call - * @return {Object} Returns the `Base` constructor for chaining - * @api public - */ - - define(Base, 'mixin', function(fn) { - var mixin = fn(Base.prototype, Base); - if (typeof mixin === 'function') { - Base.prototype.mixins.push(mixin); - } - return Base; - }); - - /** - * Static method for running global mixin functions against a child constructor. - * Mixins must be registered before calling this method. - * - * ```js - * Base.extend(Child); - * Base.mixins(Child); - * ``` - * @name #mixins - * @param {Function} `Child` Constructor function of a child class - * @return {Object} Returns the `Base` constructor for chaining - * @api public - */ - - define(Base, 'mixins', function(Child) { - Base.run(Child, 'mixin', Base.prototype.mixins); - return Base; - }); - - /** - * Similar to `util.inherit`, but copies all static properties, prototype properties, and - * getters/setters from `Provider` to `Receiver`. See [class-utils][]{#inherit} for more details. - * - * ```js - * Base.inherit(Foo, Bar); - * ``` - * @name #inherit - * @param {Function} `Receiver` Receiving (child) constructor - * @param {Function} `Provider` Providing (parent) constructor - * @return {Object} Returns the `Base` constructor for chaining - * @api public - */ - - define(Base, 'inherit', cu.inherit); - define(Base, 'bubble', cu.bubble); - return Base; -} - -/** - * Expose `Base` with default settings - */ - -module.exports = namespace(); - -/** - * Allow users to define a namespace - */ - -module.exports.namespace = namespace; - - -/***/ }), -/* 120 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -/*! - * define-property - * - * Copyright (c) 2015, 2017, Jon Schlinkert. - * Released under the MIT License. - */ - - - -var isDescriptor = __webpack_require__(121); - -module.exports = function defineProperty(obj, prop, val) { - if (typeof obj !== 'object' && typeof obj !== 'function') { - throw new TypeError('expected an object or function.'); - } - - if (typeof prop !== 'string') { - throw new TypeError('expected `prop` to be a string.'); - } - - if (isDescriptor(val) && ('set' in val || 'get' in val)) { - return Object.defineProperty(obj, prop, val); - } - - return Object.defineProperty(obj, prop, { - configurable: true, - enumerable: false, - writable: true, - value: val - }); -}; - - -/***/ }), -/* 121 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var isAccessor = __webpack_require__(83); -var isData = __webpack_require__(87); - -module.exports = function isDescriptor(obj, key) { - if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) { - return false; - } - - if ('get' in obj || 'set' in obj) { - return isAccessor(obj, key); - } - - return isData(obj, key); -}; - - -/***/ }), -/* 122 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var isObject = __webpack_require__(81); -var Emitter = __webpack_require__(123); -var visit = __webpack_require__(124); -var toPath = __webpack_require__(127); -var union = __webpack_require__(129); -var del = __webpack_require__(133); -var get = __webpack_require__(131); -var has = __webpack_require__(138); -var set = __webpack_require__(132); - -/** - * Create a `Cache` constructor that when instantiated will - * store values on the given `prop`. - * - * ```js - * var Cache = require('cache-base').namespace('data'); - * var cache = new Cache(); - * - * cache.set('foo', 'bar'); - * //=> {data: {foo: 'bar'}} - * ``` - * @param {String} `prop` The property name to use for storing values. - * @return {Function} Returns a custom `Cache` constructor - * @api public - */ - -function namespace(prop) { - - /** - * Create a new `Cache`. Internally the `Cache` constructor is created using - * the `namespace` function, with `cache` defined as the storage object. - * - * ```js - * var app = new Cache(); - * ``` - * @param {Object} `cache` Optionally pass an object to initialize with. - * @constructor - * @api public - */ - - function Cache(cache) { - if (prop) { - this[prop] = {}; - } - if (cache) { - this.set(cache); - } - } - - /** - * Inherit Emitter - */ - - Emitter(Cache.prototype); - - /** - * Assign `value` to `key`. Also emits `set` with - * the key and value. - * - * ```js - * app.on('set', function(key, val) { - * // do something when `set` is emitted - * }); - * - * app.set(key, value); - * - * // also takes an object or array - * app.set({name: 'Halle'}); - * app.set([{foo: 'bar'}, {baz: 'quux'}]); - * console.log(app); - * //=> {name: 'Halle', foo: 'bar', baz: 'quux'} - * ``` - * - * @name .set - * @emits `set` with `key` and `value` as arguments. - * @param {String} `key` - * @param {any} `value` - * @return {Object} Returns the instance for chaining. - * @api public - */ - - Cache.prototype.set = function(key, val) { - if (Array.isArray(key) && arguments.length === 2) { - key = toPath(key); - } - if (isObject(key) || Array.isArray(key)) { - this.visit('set', key); - } else { - set(prop ? this[prop] : this, key, val); - this.emit('set', key, val); - } - return this; - }; - - /** - * Union `array` to `key`. Also emits `set` with - * the key and value. - * - * ```js - * app.union('a.b', ['foo']); - * app.union('a.b', ['bar']); - * console.log(app.get('a')); - * //=> {b: ['foo', 'bar']} - * ``` - * @name .union - * @param {String} `key` - * @param {any} `value` - * @return {Object} Returns the instance for chaining. - * @api public - */ - - Cache.prototype.union = function(key, val) { - if (Array.isArray(key) && arguments.length === 2) { - key = toPath(key); - } - var ctx = prop ? this[prop] : this; - union(ctx, key, arrayify(val)); - this.emit('union', val); - return this; - }; - - /** - * Return the value of `key`. Dot notation may be used - * to get [nested property values][get-value]. - * - * ```js - * app.set('a.b.c', 'd'); - * app.get('a.b'); - * //=> {c: 'd'} - * - * app.get(['a', 'b']); - * //=> {c: 'd'} - * ``` - * - * @name .get - * @emits `get` with `key` and `value` as arguments. - * @param {String} `key` The name of the property to get. Dot-notation may be used. - * @return {any} Returns the value of `key` - * @api public - */ - - Cache.prototype.get = function(key) { - key = toPath(arguments); - - var ctx = prop ? this[prop] : this; - var val = get(ctx, key); - - this.emit('get', key, val); - return val; - }; - - /** - * Return true if app has a stored value for `key`, - * false only if value is `undefined`. - * - * ```js - * app.set('foo', 'bar'); - * app.has('foo'); - * //=> true - * ``` - * - * @name .has - * @emits `has` with `key` and true or false as arguments. - * @param {String} `key` - * @return {Boolean} - * @api public - */ - - Cache.prototype.has = function(key) { - key = toPath(arguments); - - var ctx = prop ? this[prop] : this; - var val = get(ctx, key); - - var has = typeof val !== 'undefined'; - this.emit('has', key, has); - return has; - }; - - /** - * Delete one or more properties from the instance. - * - * ```js - * app.del(); // delete all - * // or - * app.del('foo'); - * // or - * app.del(['foo', 'bar']); - * ``` - * @name .del - * @emits `del` with the `key` as the only argument. - * @param {String|Array} `key` Property name or array of property names. - * @return {Object} Returns the instance for chaining. - * @api public - */ - - Cache.prototype.del = function(key) { - if (Array.isArray(key)) { - this.visit('del', key); - } else { - del(prop ? this[prop] : this, key); - this.emit('del', key); - } - return this; - }; - - /** - * Reset the entire cache to an empty object. - * - * ```js - * app.clear(); - * ``` - * @api public - */ - - Cache.prototype.clear = function() { - if (prop) { - this[prop] = {}; - } - }; - - /** - * Visit `method` over the properties in the given object, or map - * visit over the object-elements in an array. - * - * @name .visit - * @param {String} `method` The name of the `base` method to call. - * @param {Object|Array} `val` The object or array to iterate over. - * @return {Object} Returns the instance for chaining. - * @api public - */ - - Cache.prototype.visit = function(method, val) { - visit(this, method, val); - return this; - }; - - return Cache; -} - -/** - * Cast val to an array - */ - -function arrayify(val) { - return val ? (Array.isArray(val) ? val : [val]) : []; -} - -/** - * Expose `Cache` - */ - -module.exports = namespace(); - -/** - * Expose `Cache.namespace` - */ - -module.exports.namespace = namespace; - - -/***/ }), -/* 123 */ -/***/ ((module) => { - - -/** - * Expose `Emitter`. - */ - -if (true) { - module.exports = Emitter; -} - -/** - * Initialize a new `Emitter`. - * - * @api public - */ - -function Emitter(obj) { - if (obj) return mixin(obj); -}; - -/** - * Mixin the emitter properties. - * - * @param {Object} obj - * @return {Object} - * @api private - */ - -function mixin(obj) { - for (var key in Emitter.prototype) { - obj[key] = Emitter.prototype[key]; - } - return obj; -} - -/** - * Listen on the given `event` with `fn`. - * - * @param {String} event - * @param {Function} fn - * @return {Emitter} - * @api public - */ - -Emitter.prototype.on = -Emitter.prototype.addEventListener = function(event, fn){ - this._callbacks = this._callbacks || {}; - (this._callbacks['$' + event] = this._callbacks['$' + event] || []) - .push(fn); - return this; -}; - -/** - * Adds an `event` listener that will be invoked a single - * time then automatically removed. - * - * @param {String} event - * @param {Function} fn - * @return {Emitter} - * @api public - */ - -Emitter.prototype.once = function(event, fn){ - function on() { - this.off(event, on); - fn.apply(this, arguments); - } - - on.fn = fn; - this.on(event, on); - return this; -}; - -/** - * Remove the given callback for `event` or all - * registered callbacks. - * - * @param {String} event - * @param {Function} fn - * @return {Emitter} - * @api public - */ - -Emitter.prototype.off = -Emitter.prototype.removeListener = -Emitter.prototype.removeAllListeners = -Emitter.prototype.removeEventListener = function(event, fn){ - this._callbacks = this._callbacks || {}; - - // all - if (0 == arguments.length) { - this._callbacks = {}; - return this; - } - - // specific event - var callbacks = this._callbacks['$' + event]; - if (!callbacks) return this; - - // remove all handlers - if (1 == arguments.length) { - delete this._callbacks['$' + event]; - return this; - } - - // remove specific handler - var cb; - for (var i = 0; i < callbacks.length; i++) { - cb = callbacks[i]; - if (cb === fn || cb.fn === fn) { - callbacks.splice(i, 1); - break; - } - } - - // Remove event specific arrays for event types that no - // one is subscribed for to avoid memory leak. - if (callbacks.length === 0) { - delete this._callbacks['$' + event]; - } - - return this; -}; - -/** - * Emit `event` with the given args. - * - * @param {String} event - * @param {Mixed} ... - * @return {Emitter} - */ - -Emitter.prototype.emit = function(event){ - this._callbacks = this._callbacks || {}; - - var args = new Array(arguments.length - 1) - , callbacks = this._callbacks['$' + event]; - - for (var i = 1; i < arguments.length; i++) { - args[i - 1] = arguments[i]; - } - - if (callbacks) { - callbacks = callbacks.slice(0); - for (var i = 0, len = callbacks.length; i < len; ++i) { - callbacks[i].apply(this, args); - } - } - - return this; -}; - -/** - * Return array of callbacks for `event`. - * - * @param {String} event - * @return {Array} - * @api public - */ - -Emitter.prototype.listeners = function(event){ - this._callbacks = this._callbacks || {}; - return this._callbacks['$' + event] || []; -}; - -/** - * Check if this emitter has `event` handlers. - * - * @param {String} event - * @return {Boolean} - * @api public - */ - -Emitter.prototype.hasListeners = function(event){ - return !! this.listeners(event).length; -}; - - -/***/ }), -/* 124 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -/*! - * collection-visit - * - * Copyright (c) 2015, 2017, Jon Schlinkert. - * Released under the MIT License. - */ - - - -var visit = __webpack_require__(125); -var mapVisit = __webpack_require__(126); - -module.exports = function(collection, method, val) { - var result; - - if (typeof val === 'string' && (method in collection)) { - var args = [].slice.call(arguments, 2); - result = collection[method].apply(collection, args); - } else if (Array.isArray(val)) { - result = mapVisit.apply(null, arguments); - } else { - result = visit.apply(null, arguments); - } - - if (typeof result !== 'undefined') { - return result; - } - - return collection; -}; - - -/***/ }), -/* 125 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -/*! - * object-visit - * - * Copyright (c) 2015, 2017, Jon Schlinkert. - * Released under the MIT License. - */ - - - -var isObject = __webpack_require__(81); - -module.exports = function visit(thisArg, method, target, val) { - if (!isObject(thisArg) && typeof thisArg !== 'function') { - throw new Error('object-visit expects `thisArg` to be an object.'); - } - - if (typeof method !== 'string') { - throw new Error('object-visit expects `method` name to be a string'); - } - - if (typeof thisArg[method] !== 'function') { - return thisArg; - } - - var args = [].slice.call(arguments, 3); - target = target || {}; - - for (var key in target) { - var arr = [key, target[key]].concat(args); - thisArg[method].apply(thisArg, arr); - } - return thisArg; -}; - - -/***/ }), -/* 126 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var util = __webpack_require__(17); -var visit = __webpack_require__(125); - -/** - * Map `visit` over an array of objects. - * - * @param {Object} `collection` The context in which to invoke `method` - * @param {String} `method` Name of the method to call on `collection` - * @param {Object} `arr` Array of objects. - */ - -module.exports = function mapVisit(collection, method, val) { - if (isObject(val)) { - return visit.apply(null, arguments); - } - - if (!Array.isArray(val)) { - throw new TypeError('expected an array: ' + util.inspect(val)); - } - - var args = [].slice.call(arguments, 3); - - for (var i = 0; i < val.length; i++) { - var ele = val[i]; - if (isObject(ele)) { - visit.apply(null, [collection, method, ele].concat(args)); - } else { - collection[method].apply(collection, [ele].concat(args)); - } - } -}; - -function isObject(val) { - return val && (typeof val === 'function' || (!Array.isArray(val) && typeof val === 'object')); -} - - -/***/ }), -/* 127 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -/*! - * to-object-path - * - * Copyright (c) 2015, Jon Schlinkert. - * Licensed under the MIT License. - */ - - - -var typeOf = __webpack_require__(128); - -module.exports = function toPath(args) { - if (typeOf(args) !== 'arguments') { - args = arguments; - } - return filter(args).join('.'); -}; - -function filter(arr) { - var len = arr.length; - var idx = -1; - var res = []; - - while (++idx < len) { - var ele = arr[idx]; - if (typeOf(ele) === 'arguments' || Array.isArray(ele)) { - res.push.apply(res, filter(ele)); - } else if (typeof ele === 'string') { - res.push(ele); - } - } - return res; -} - - -/***/ }), -/* 128 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var isBuffer = __webpack_require__(107); -var toString = Object.prototype.toString; - -/** - * Get the native `typeof` a value. - * - * @param {*} `val` - * @return {*} Native javascript type - */ - -module.exports = function kindOf(val) { - // primitivies - if (typeof val === 'undefined') { - return 'undefined'; - } - if (val === null) { - return 'null'; - } - if (val === true || val === false || val instanceof Boolean) { - return 'boolean'; - } - if (typeof val === 'string' || val instanceof String) { - return 'string'; - } - if (typeof val === 'number' || val instanceof Number) { - return 'number'; - } - - // functions - if (typeof val === 'function' || val instanceof Function) { - return 'function'; - } - - // array - if (typeof Array.isArray !== 'undefined' && Array.isArray(val)) { - return 'array'; - } - - // check for instances of RegExp and Date before calling `toString` - if (val instanceof RegExp) { - return 'regexp'; - } - if (val instanceof Date) { - return 'date'; - } - - // other objects - var type = toString.call(val); - - if (type === '[object RegExp]') { - return 'regexp'; - } - if (type === '[object Date]') { - return 'date'; - } - if (type === '[object Arguments]') { - return 'arguments'; - } - if (type === '[object Error]') { - return 'error'; - } - - // buffer - if (isBuffer(val)) { - return 'buffer'; - } - - // es6: Map, WeakMap, Set, WeakSet - if (type === '[object Set]') { - return 'set'; - } - if (type === '[object WeakSet]') { - return 'weakset'; - } - if (type === '[object Map]') { - return 'map'; - } - if (type === '[object WeakMap]') { - return 'weakmap'; - } - if (type === '[object Symbol]') { - return 'symbol'; - } - - // typed arrays - if (type === '[object Int8Array]') { - return 'int8array'; - } - if (type === '[object Uint8Array]') { - return 'uint8array'; - } - if (type === '[object Uint8ClampedArray]') { - return 'uint8clampedarray'; - } - if (type === '[object Int16Array]') { - return 'int16array'; - } - if (type === '[object Uint16Array]') { - return 'uint16array'; - } - if (type === '[object Int32Array]') { - return 'int32array'; - } - if (type === '[object Uint32Array]') { - return 'uint32array'; - } - if (type === '[object Float32Array]') { - return 'float32array'; - } - if (type === '[object Float64Array]') { - return 'float64array'; - } - - // must be a plain object - return 'object'; -}; - - -/***/ }), -/* 129 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var isObject = __webpack_require__(97); -var union = __webpack_require__(130); -var get = __webpack_require__(131); -var set = __webpack_require__(132); - -module.exports = function unionValue(obj, prop, value) { - if (!isObject(obj)) { - throw new TypeError('union-value expects the first argument to be an object.'); - } - - if (typeof prop !== 'string') { - throw new TypeError('union-value expects `prop` to be a string.'); - } - - var arr = arrayify(get(obj, prop)); - set(obj, prop, union(arr, arrayify(value))); - return obj; -}; - -function arrayify(val) { - if (val === null || typeof val === 'undefined') { - return []; - } - if (Array.isArray(val)) { - return val; - } - return [val]; -} - - -/***/ }), -/* 130 */ -/***/ ((module) => { - -"use strict"; - - -module.exports = function union(init) { - if (!Array.isArray(init)) { - throw new TypeError('arr-union expects the first argument to be an array.'); - } - - var len = arguments.length; - var i = 0; - - while (++i < len) { - var arg = arguments[i]; - if (!arg) continue; - - if (!Array.isArray(arg)) { - arg = [arg]; - } - - for (var j = 0; j < arg.length; j++) { - var ele = arg[j]; - - if (init.indexOf(ele) >= 0) { - continue; - } - init.push(ele); - } - } - return init; -}; - - -/***/ }), -/* 131 */ -/***/ ((module) => { - -/*! - * get-value - * - * Copyright (c) 2014-2015, Jon Schlinkert. - * Licensed under the MIT License. - */ - -module.exports = function(obj, prop, a, b, c) { - if (!isObject(obj) || !prop) { - return obj; - } - - prop = toString(prop); - - // allowing for multiple properties to be passed as - // a string or array, but much faster (3-4x) than doing - // `[].slice.call(arguments)` - if (a) prop += '.' + toString(a); - if (b) prop += '.' + toString(b); - if (c) prop += '.' + toString(c); - - if (prop in obj) { - return obj[prop]; - } - - var segs = prop.split('.'); - var len = segs.length; - var i = -1; - - while (obj && (++i < len)) { - var key = segs[i]; - while (key[key.length - 1] === '\\') { - key = key.slice(0, -1) + '.' + segs[++i]; - } - obj = obj[key]; - } - return obj; -}; - -function isObject(val) { - return val !== null && (typeof val === 'object' || typeof val === 'function'); -} - -function toString(val) { - if (!val) return ''; - if (Array.isArray(val)) { - return val.join('.'); - } - return val; -} - - -/***/ }), -/* 132 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -/*! - * set-value - * - * Copyright (c) 2014-2015, 2017, Jon Schlinkert. - * Released under the MIT License. - */ - - - -var split = __webpack_require__(100); -var extend = __webpack_require__(96); -var isPlainObject = __webpack_require__(90); -var isObject = __webpack_require__(97); - -module.exports = function(obj, prop, val) { - if (!isObject(obj)) { - return obj; - } - - if (Array.isArray(prop)) { - prop = [].concat.apply([], prop).join('.'); - } - - if (typeof prop !== 'string') { - return obj; - } - - var keys = split(prop, {sep: '.', brackets: true}).filter(isValidKey); - var len = keys.length; - var idx = -1; - var current = obj; - - while (++idx < len) { - var key = keys[idx]; - if (idx !== len - 1) { - if (!isObject(current[key])) { - current[key] = {}; - } - current = current[key]; - continue; - } - - if (isPlainObject(current[key]) && isPlainObject(val)) { - current[key] = extend({}, current[key], val); - } else { - current[key] = val; - } - } - - return obj; -}; - -function isValidKey(key) { - return key !== '__proto__' && key !== 'constructor' && key !== 'prototype'; -} - - -/***/ }), -/* 133 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -/*! - * unset-value - * - * Copyright (c) 2015, 2017, Jon Schlinkert. - * Released under the MIT License. - */ - - - -var isObject = __webpack_require__(81); -var has = __webpack_require__(134); - -module.exports = function unset(obj, prop) { - if (!isObject(obj)) { - throw new TypeError('expected an object.'); - } - if (obj.hasOwnProperty(prop)) { - delete obj[prop]; - return true; - } - - if (has(obj, prop)) { - var segs = prop.split('.'); - var last = segs.pop(); - while (segs.length && segs[segs.length - 1].slice(-1) === '\\') { - last = segs.pop().slice(0, -1) + '.' + last; - } - while (segs.length) obj = obj[prop = segs.shift()]; - return (delete obj[last]); - } - return true; -}; - - -/***/ }), -/* 134 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -/*! - * has-value - * - * Copyright (c) 2014-2016, Jon Schlinkert. - * Licensed under the MIT License. - */ - - - -var isObject = __webpack_require__(135); -var hasValues = __webpack_require__(137); -var get = __webpack_require__(131); - -module.exports = function(obj, prop, noZero) { - if (isObject(obj)) { - return hasValues(get(obj, prop), noZero); - } - return hasValues(obj, prop); -}; - - -/***/ }), -/* 135 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -/*! - * isobject - * - * Copyright (c) 2014-2015, Jon Schlinkert. - * Licensed under the MIT License. - */ - - - -var isArray = __webpack_require__(136); - -module.exports = function isObject(val) { - return val != null && typeof val === 'object' && isArray(val) === false; -}; - - -/***/ }), -/* 136 */ -/***/ ((module) => { - -var toString = {}.toString; - -module.exports = Array.isArray || function (arr) { - return toString.call(arr) == '[object Array]'; -}; - - -/***/ }), -/* 137 */ -/***/ ((module) => { - -"use strict"; -/*! - * has-values - * - * Copyright (c) 2014-2015, Jon Schlinkert. - * Licensed under the MIT License. - */ - - - -module.exports = function hasValue(o, noZero) { - if (o === null || o === undefined) { - return false; - } - - if (typeof o === 'boolean') { - return true; - } - - if (typeof o === 'number') { - if (o === 0 && noZero === true) { - return false; - } - return true; - } - - if (o.length !== undefined) { - return o.length !== 0; - } - - for (var key in o) { - if (o.hasOwnProperty(key)) { - return true; - } - } - return false; -}; - - -/***/ }), -/* 138 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -/*! - * has-value - * - * Copyright (c) 2014-2017, Jon Schlinkert. - * Licensed under the MIT License. - */ - - - -var isObject = __webpack_require__(81); -var hasValues = __webpack_require__(139); -var get = __webpack_require__(131); - -module.exports = function(val, prop) { - return hasValues(isObject(val) && prop ? get(val, prop) : val); -}; - - -/***/ }), -/* 139 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -/*! - * has-values - * - * Copyright (c) 2014-2015, 2017, Jon Schlinkert. - * Released under the MIT License. - */ - - - -var typeOf = __webpack_require__(140); -var isNumber = __webpack_require__(141); - -module.exports = function hasValue(val) { - // is-number checks for NaN and other edge cases - if (isNumber(val)) { - return true; - } - - switch (typeOf(val)) { - case 'null': - case 'boolean': - case 'function': - return true; - case 'string': - case 'arguments': - return val.length !== 0; - case 'error': - return val.message !== ''; - case 'array': - var len = val.length; - if (len === 0) { - return false; - } - for (var i = 0; i < len; i++) { - if (hasValue(val[i])) { - return true; - } - } - return false; - case 'file': - case 'map': - case 'set': - return val.size !== 0; - case 'object': - var keys = Object.keys(val); - if (keys.length === 0) { - return false; - } - for (var i = 0; i < keys.length; i++) { - var key = keys[i]; - if (hasValue(val[key])) { - return true; - } - } - return false; - default: { - return false; - } - } -}; - - -/***/ }), -/* 140 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var isBuffer = __webpack_require__(107); -var toString = Object.prototype.toString; - -/** - * Get the native `typeof` a value. - * - * @param {*} `val` - * @return {*} Native javascript type - */ - -module.exports = function kindOf(val) { - // primitivies - if (typeof val === 'undefined') { - return 'undefined'; - } - if (val === null) { - return 'null'; - } - if (val === true || val === false || val instanceof Boolean) { - return 'boolean'; - } - if (typeof val === 'string' || val instanceof String) { - return 'string'; - } - if (typeof val === 'number' || val instanceof Number) { - return 'number'; - } - - // functions - if (typeof val === 'function' || val instanceof Function) { - return 'function'; - } - - // array - if (typeof Array.isArray !== 'undefined' && Array.isArray(val)) { - return 'array'; - } - - // check for instances of RegExp and Date before calling `toString` - if (val instanceof RegExp) { - return 'regexp'; - } - if (val instanceof Date) { - return 'date'; - } - - // other objects - var type = toString.call(val); - - if (type === '[object RegExp]') { - return 'regexp'; - } - if (type === '[object Date]') { - return 'date'; - } - if (type === '[object Arguments]') { - return 'arguments'; - } - if (type === '[object Error]') { - return 'error'; - } - if (type === '[object Promise]') { - return 'promise'; - } - - // buffer - if (isBuffer(val)) { - return 'buffer'; - } - - // es6: Map, WeakMap, Set, WeakSet - if (type === '[object Set]') { - return 'set'; - } - if (type === '[object WeakSet]') { - return 'weakset'; - } - if (type === '[object Map]') { - return 'map'; - } - if (type === '[object WeakMap]') { - return 'weakmap'; - } - if (type === '[object Symbol]') { - return 'symbol'; - } - - // typed arrays - if (type === '[object Int8Array]') { - return 'int8array'; - } - if (type === '[object Uint8Array]') { - return 'uint8array'; - } - if (type === '[object Uint8ClampedArray]') { - return 'uint8clampedarray'; - } - if (type === '[object Int16Array]') { - return 'int16array'; - } - if (type === '[object Uint16Array]') { - return 'uint16array'; - } - if (type === '[object Int32Array]') { - return 'int32array'; - } - if (type === '[object Uint32Array]') { - return 'uint32array'; - } - if (type === '[object Float32Array]') { - return 'float32array'; - } - if (type === '[object Float64Array]') { - return 'float64array'; - } - - // must be a plain object - return 'object'; -}; - - -/***/ }), -/* 141 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -/*! - * is-number - * - * Copyright (c) 2014-2015, Jon Schlinkert. - * Licensed under the MIT License. - */ - - - -var typeOf = __webpack_require__(142); - -module.exports = function isNumber(num) { - var type = typeOf(num); - - if (type === 'string') { - if (!num.trim()) return false; - } else if (type !== 'number') { - return false; - } - - return (num - num + 1) >= 0; -}; - - -/***/ }), -/* 142 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var isBuffer = __webpack_require__(107); -var toString = Object.prototype.toString; - -/** - * Get the native `typeof` a value. - * - * @param {*} `val` - * @return {*} Native javascript type - */ - -module.exports = function kindOf(val) { - // primitivies - if (typeof val === 'undefined') { - return 'undefined'; - } - if (val === null) { - return 'null'; - } - if (val === true || val === false || val instanceof Boolean) { - return 'boolean'; - } - if (typeof val === 'string' || val instanceof String) { - return 'string'; - } - if (typeof val === 'number' || val instanceof Number) { - return 'number'; - } - - // functions - if (typeof val === 'function' || val instanceof Function) { - return 'function'; - } - - // array - if (typeof Array.isArray !== 'undefined' && Array.isArray(val)) { - return 'array'; - } - - // check for instances of RegExp and Date before calling `toString` - if (val instanceof RegExp) { - return 'regexp'; - } - if (val instanceof Date) { - return 'date'; - } - - // other objects - var type = toString.call(val); - - if (type === '[object RegExp]') { - return 'regexp'; - } - if (type === '[object Date]') { - return 'date'; - } - if (type === '[object Arguments]') { - return 'arguments'; - } - if (type === '[object Error]') { - return 'error'; - } - - // buffer - if (isBuffer(val)) { - return 'buffer'; - } - - // es6: Map, WeakMap, Set, WeakSet - if (type === '[object Set]') { - return 'set'; - } - if (type === '[object WeakSet]') { - return 'weakset'; - } - if (type === '[object Map]') { - return 'map'; - } - if (type === '[object WeakMap]') { - return 'weakmap'; - } - if (type === '[object Symbol]') { - return 'symbol'; - } - - // typed arrays - if (type === '[object Int8Array]') { - return 'int8array'; - } - if (type === '[object Uint8Array]') { - return 'uint8array'; - } - if (type === '[object Uint8ClampedArray]') { - return 'uint8clampedarray'; - } - if (type === '[object Int16Array]') { - return 'int16array'; - } - if (type === '[object Uint16Array]') { - return 'uint16array'; - } - if (type === '[object Int32Array]') { - return 'int32array'; - } - if (type === '[object Uint32Array]') { - return 'uint32array'; - } - if (type === '[object Float32Array]') { - return 'float32array'; - } - if (type === '[object Float64Array]') { - return 'float64array'; - } - - // must be a plain object - return 'object'; -}; - - -/***/ }), -/* 143 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var isExtendable = __webpack_require__(144); -var forIn = __webpack_require__(145); - -function mixinDeep(target, objects) { - var len = arguments.length, i = 0; - while (++i < len) { - var obj = arguments[i]; - if (isObject(obj)) { - forIn(obj, copy, target); - } - } - return target; -} - -/** - * Copy properties from the source object to the - * target object. - * - * @param {*} `val` - * @param {String} `key` - */ - -function copy(val, key) { - if (!isValidKey(key)) { - return; - } - - var obj = this[key]; - if (isObject(val) && isObject(obj)) { - mixinDeep(obj, val); - } else { - this[key] = val; - } -} - -/** - * Returns true if `val` is an object or function. - * - * @param {any} val - * @return {Boolean} - */ - -function isObject(val) { - return isExtendable(val) && !Array.isArray(val); -} - -/** - * Returns true if `key` is a valid key to use when extending objects. - * - * @param {String} `key` - * @return {Boolean} - */ - -function isValidKey(key) { - return key !== '__proto__' && key !== 'constructor' && key !== 'prototype'; -}; - -/** - * Expose `mixinDeep` - */ - -module.exports = mixinDeep; - - -/***/ }), -/* 144 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -/*! - * is-extendable - * - * Copyright (c) 2015-2017, Jon Schlinkert. - * Released under the MIT License. - */ - - - -var isPlainObject = __webpack_require__(90); - -module.exports = function isExtendable(val) { - return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); -}; - - -/***/ }), -/* 145 */ -/***/ ((module) => { - -"use strict"; -/*! - * for-in - * - * Copyright (c) 2014-2017, Jon Schlinkert. - * Released under the MIT License. - */ - - - -module.exports = function forIn(obj, fn, thisArg) { - for (var key in obj) { - if (fn.call(thisArg, obj[key], key, obj) === false) { - break; - } - } -}; - - -/***/ }), -/* 146 */ -/***/ ((module) => { - -/*! - * pascalcase - * - * Copyright (c) 2015, Jon Schlinkert. - * Licensed under the MIT License. - */ - -function pascalcase(str) { - if (typeof str !== 'string') { - throw new TypeError('expected a string.'); - } - str = str.replace(/([A-Z])/g, ' $1'); - if (str.length === 1) { return str.toUpperCase(); } - str = str.replace(/^[\W_]+|[\W_]+$/g, '').toLowerCase(); - str = str.charAt(0).toUpperCase() + str.slice(1); - return str.replace(/[\W_]+(\w|$)/g, function (_, ch) { - return ch.toUpperCase(); - }); -} - -module.exports = pascalcase; - - -/***/ }), -/* 147 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var util = __webpack_require__(17); -var union = __webpack_require__(130); -var define = __webpack_require__(148); -var staticExtend = __webpack_require__(150); -var isObj = __webpack_require__(81); - -/** - * Expose class utils - */ - -var cu = module.exports; - -/** - * Expose class utils: `cu` - */ - -cu.isObject = function isObject(val) { - return isObj(val) || typeof val === 'function'; -}; - -/** - * Returns true if an array has any of the given elements, or an - * object has any of the give keys. - * - * ```js - * cu.has(['a', 'b', 'c'], 'c'); - * //=> true - * - * cu.has(['a', 'b', 'c'], ['c', 'z']); - * //=> true - * - * cu.has({a: 'b', c: 'd'}, ['c', 'z']); - * //=> true - * ``` - * @param {Object} `obj` - * @param {String|Array} `val` - * @return {Boolean} - * @api public - */ - -cu.has = function has(obj, val) { - val = cu.arrayify(val); - var len = val.length; - - if (cu.isObject(obj)) { - for (var key in obj) { - if (val.indexOf(key) > -1) { - return true; - } - } - - var keys = cu.nativeKeys(obj); - return cu.has(keys, val); - } - - if (Array.isArray(obj)) { - var arr = obj; - while (len--) { - if (arr.indexOf(val[len]) > -1) { - return true; - } - } - return false; - } - - throw new TypeError('expected an array or object.'); -}; - -/** - * Returns true if an array or object has all of the given values. - * - * ```js - * cu.hasAll(['a', 'b', 'c'], 'c'); - * //=> true - * - * cu.hasAll(['a', 'b', 'c'], ['c', 'z']); - * //=> false - * - * cu.hasAll({a: 'b', c: 'd'}, ['c', 'z']); - * //=> false - * ``` - * @param {Object|Array} `val` - * @param {String|Array} `values` - * @return {Boolean} - * @api public - */ - -cu.hasAll = function hasAll(val, values) { - values = cu.arrayify(values); - var len = values.length; - while (len--) { - if (!cu.has(val, values[len])) { - return false; - } - } - return true; -}; - -/** - * Cast the given value to an array. - * - * ```js - * cu.arrayify('foo'); - * //=> ['foo'] - * - * cu.arrayify(['foo']); - * //=> ['foo'] - * ``` - * - * @param {String|Array} `val` - * @return {Array} - * @api public - */ - -cu.arrayify = function arrayify(val) { - return val ? (Array.isArray(val) ? val : [val]) : []; -}; - -/** - * Noop - */ - -cu.noop = function noop() { - return; -}; - -/** - * Returns the first argument passed to the function. - */ - -cu.identity = function identity(val) { - return val; -}; - -/** - * Returns true if a value has a `contructor` - * - * ```js - * cu.hasConstructor({}); - * //=> true - * - * cu.hasConstructor(Object.create(null)); - * //=> false - * ``` - * @param {Object} `value` - * @return {Boolean} - * @api public - */ - -cu.hasConstructor = function hasConstructor(val) { - return cu.isObject(val) && typeof val.constructor !== 'undefined'; -}; - -/** - * Get the native `ownPropertyNames` from the constructor of the - * given `object`. An empty array is returned if the object does - * not have a constructor. - * - * ```js - * cu.nativeKeys({a: 'b', b: 'c', c: 'd'}) - * //=> ['a', 'b', 'c'] - * - * cu.nativeKeys(function(){}) - * //=> ['length', 'caller'] - * ``` - * - * @param {Object} `obj` Object that has a `constructor`. - * @return {Array} Array of keys. - * @api public - */ - -cu.nativeKeys = function nativeKeys(val) { - if (!cu.hasConstructor(val)) return []; - var keys = Object.getOwnPropertyNames(val); - if ('caller' in val) keys.push('caller'); - return keys; -}; - -/** - * Returns property descriptor `key` if it's an "own" property - * of the given object. - * - * ```js - * function App() {} - * Object.defineProperty(App.prototype, 'count', { - * get: function() { - * return Object.keys(this).length; - * } - * }); - * cu.getDescriptor(App.prototype, 'count'); - * // returns: - * // { - * // get: [Function], - * // set: undefined, - * // enumerable: false, - * // configurable: false - * // } - * ``` - * - * @param {Object} `obj` - * @param {String} `key` - * @return {Object} Returns descriptor `key` - * @api public - */ - -cu.getDescriptor = function getDescriptor(obj, key) { - if (!cu.isObject(obj)) { - throw new TypeError('expected an object.'); - } - if (typeof key !== 'string') { - throw new TypeError('expected key to be a string.'); - } - return Object.getOwnPropertyDescriptor(obj, key); -}; - -/** - * Copy a descriptor from one object to another. - * - * ```js - * function App() {} - * Object.defineProperty(App.prototype, 'count', { - * get: function() { - * return Object.keys(this).length; - * } - * }); - * var obj = {}; - * cu.copyDescriptor(obj, App.prototype, 'count'); - * ``` - * @param {Object} `receiver` - * @param {Object} `provider` - * @param {String} `name` - * @return {Object} - * @api public - */ - -cu.copyDescriptor = function copyDescriptor(receiver, provider, name) { - if (!cu.isObject(receiver)) { - throw new TypeError('expected receiving object to be an object.'); - } - if (!cu.isObject(provider)) { - throw new TypeError('expected providing object to be an object.'); - } - if (typeof name !== 'string') { - throw new TypeError('expected name to be a string.'); - } - - var val = cu.getDescriptor(provider, name); - if (val) Object.defineProperty(receiver, name, val); -}; - -/** - * Copy static properties, prototype properties, and descriptors - * from one object to another. - * - * @param {Object} `receiver` - * @param {Object} `provider` - * @param {String|Array} `omit` One or more properties to omit - * @return {Object} - * @api public - */ - -cu.copy = function copy(receiver, provider, omit) { - if (!cu.isObject(receiver)) { - throw new TypeError('expected receiving object to be an object.'); - } - if (!cu.isObject(provider)) { - throw new TypeError('expected providing object to be an object.'); - } - var props = Object.getOwnPropertyNames(provider); - var keys = Object.keys(provider); - var len = props.length, - key; - omit = cu.arrayify(omit); - - while (len--) { - key = props[len]; - - if (cu.has(keys, key)) { - define(receiver, key, provider[key]); - } else if (!(key in receiver) && !cu.has(omit, key)) { - cu.copyDescriptor(receiver, provider, key); - } - } -}; - -/** - * Inherit the static properties, prototype properties, and descriptors - * from of an object. - * - * @param {Object} `receiver` - * @param {Object} `provider` - * @param {String|Array} `omit` One or more properties to omit - * @return {Object} - * @api public - */ - -cu.inherit = function inherit(receiver, provider, omit) { - if (!cu.isObject(receiver)) { - throw new TypeError('expected receiving object to be an object.'); - } - if (!cu.isObject(provider)) { - throw new TypeError('expected providing object to be an object.'); - } - - var keys = []; - for (var key in provider) { - keys.push(key); - receiver[key] = provider[key]; - } - - keys = keys.concat(cu.arrayify(omit)); - - var a = provider.prototype || provider; - var b = receiver.prototype || receiver; - cu.copy(b, a, keys); -}; - -/** - * Returns a function for extending the static properties, - * prototype properties, and descriptors from the `Parent` - * constructor onto `Child` constructors. - * - * ```js - * var extend = cu.extend(Parent); - * Parent.extend(Child); - * - * // optional methods - * Parent.extend(Child, { - * foo: function() {}, - * bar: function() {} - * }); - * ``` - * @param {Function} `Parent` Parent ctor - * @param {Function} `extend` Optional extend function to handle custom extensions. Useful when updating methods that require a specific prototype. - * @param {Function} `Child` Child ctor - * @param {Object} `proto` Optionally pass additional prototype properties to inherit. - * @return {Object} - * @api public - */ - -cu.extend = function() { - // keep it lazy, instead of assigning to `cu.extend` - return staticExtend.apply(null, arguments); -}; - -/** - * Bubble up events emitted from static methods on the Parent ctor. - * - * @param {Object} `Parent` - * @param {Array} `events` Event names to bubble up - * @api public - */ - -cu.bubble = function(Parent, events) { - events = events || []; - Parent.bubble = function(Child, arr) { - if (Array.isArray(arr)) { - events = union([], events, arr); - } - var len = events.length; - var idx = -1; - while (++idx < len) { - var name = events[idx]; - Parent.on(name, Child.emit.bind(Child, name)); - } - cu.bubble(Child, events); - }; -}; - - -/***/ }), -/* 148 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -/*! - * define-property - * - * Copyright (c) 2015, Jon Schlinkert. - * Licensed under the MIT License. - */ - - - -var isDescriptor = __webpack_require__(149); - -module.exports = function defineProperty(obj, prop, val) { - if (typeof obj !== 'object' && typeof obj !== 'function') { - throw new TypeError('expected an object or function.'); - } - - if (typeof prop !== 'string') { - throw new TypeError('expected `prop` to be a string.'); - } - - if (isDescriptor(val) && ('set' in val || 'get' in val)) { - return Object.defineProperty(obj, prop, val); - } - - return Object.defineProperty(obj, prop, { - configurable: true, - enumerable: false, - writable: true, - value: val - }); -}; - - -/***/ }), -/* 149 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var isAccessor = __webpack_require__(83); -var isData = __webpack_require__(87); - -module.exports = function isDescriptor(obj, key) { - if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) { - return false; - } - - if ('get' in obj || 'set' in obj) { - return isAccessor(obj, key); - } - - return isData(obj, key); -}; - - -/***/ }), -/* 150 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -/*! - * static-extend - * - * Copyright (c) 2016, Jon Schlinkert. - * Licensed under the MIT License. - */ - - - -var copy = __webpack_require__(151); -var define = __webpack_require__(148); -var util = __webpack_require__(17); - -/** - * Returns a function for extending the static properties, - * prototype properties, and descriptors from the `Parent` - * constructor onto `Child` constructors. - * - * ```js - * var extend = require('static-extend'); - * Parent.extend = extend(Parent); - * - * // optionally pass a custom merge function as the second arg - * Parent.extend = extend(Parent, function(Child) { - * Child.prototype.mixin = function(key, val) { - * Child.prototype[key] = val; - * }; - * }); - * - * // extend "child" constructors - * Parent.extend(Child); - * - * // optionally define prototype methods as the second arg - * Parent.extend(Child, { - * foo: function() {}, - * bar: function() {} - * }); - * ``` - * @param {Function} `Parent` Parent ctor - * @param {Function} `extendFn` Optional extend function for handling any necessary custom merging. Useful when updating methods that require a specific prototype. - * @param {Function} `Child` Child ctor - * @param {Object} `proto` Optionally pass additional prototype properties to inherit. - * @return {Object} - * @api public - */ - -function extend(Parent, extendFn) { - if (typeof Parent !== 'function') { - throw new TypeError('expected Parent to be a function.'); - } - - return function(Ctor, proto) { - if (typeof Ctor !== 'function') { - throw new TypeError('expected Ctor to be a function.'); - } - - util.inherits(Ctor, Parent); - copy(Ctor, Parent); - - // proto can be null or a plain object - if (typeof proto === 'object') { - var obj = Object.create(proto); - - for (var k in obj) { - Ctor.prototype[k] = obj[k]; - } - } - - // keep a reference to the parent prototype - define(Ctor.prototype, '_parent_', { - configurable: true, - set: function() {}, - get: function() { - return Parent.prototype; - } - }); - - if (typeof extendFn === 'function') { - extendFn(Ctor, Parent); - } - - Ctor.extend = extend(Ctor, extendFn); - }; -}; - -/** - * Expose `extend` - */ - -module.exports = extend; - - -/***/ }), -/* 151 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var typeOf = __webpack_require__(152); -var copyDescriptor = __webpack_require__(153); -var define = __webpack_require__(148); - -/** - * Copy static properties, prototype properties, and descriptors from one object to another. - * - * ```js - * function App() {} - * var proto = App.prototype; - * App.prototype.set = function() {}; - * App.prototype.get = function() {}; - * - * var obj = {}; - * copy(obj, proto); - * ``` - * @param {Object} `receiver` - * @param {Object} `provider` - * @param {String|Array} `omit` One or more properties to omit - * @return {Object} - * @api public - */ - -function copy(receiver, provider, omit) { - if (!isObject(receiver)) { - throw new TypeError('expected receiving object to be an object.'); - } - if (!isObject(provider)) { - throw new TypeError('expected providing object to be an object.'); - } - - var props = nativeKeys(provider); - var keys = Object.keys(provider); - var len = props.length; - omit = arrayify(omit); - - while (len--) { - var key = props[len]; - - if (has(keys, key)) { - define(receiver, key, provider[key]); - } else if (!(key in receiver) && !has(omit, key)) { - copyDescriptor(receiver, provider, key); - } - } -}; - -/** - * Return true if the given value is an object or function - */ - -function isObject(val) { - return typeOf(val) === 'object' || typeof val === 'function'; -} - -/** - * Returns true if an array has any of the given elements, or an - * object has any of the give keys. - * - * ```js - * has(['a', 'b', 'c'], 'c'); - * //=> true - * - * has(['a', 'b', 'c'], ['c', 'z']); - * //=> true - * - * has({a: 'b', c: 'd'}, ['c', 'z']); - * //=> true - * ``` - * @param {Object} `obj` - * @param {String|Array} `val` - * @return {Boolean} - */ - -function has(obj, val) { - val = arrayify(val); - var len = val.length; - - if (isObject(obj)) { - for (var key in obj) { - if (val.indexOf(key) > -1) { - return true; - } - } - - var keys = nativeKeys(obj); - return has(keys, val); - } - - if (Array.isArray(obj)) { - var arr = obj; - while (len--) { - if (arr.indexOf(val[len]) > -1) { - return true; - } - } - return false; - } - - throw new TypeError('expected an array or object.'); -} - -/** - * Cast the given value to an array. - * - * ```js - * arrayify('foo'); - * //=> ['foo'] - * - * arrayify(['foo']); - * //=> ['foo'] - * ``` - * - * @param {String|Array} `val` - * @return {Array} - */ - -function arrayify(val) { - return val ? (Array.isArray(val) ? val : [val]) : []; -} - -/** - * Returns true if a value has a `contructor` - * - * ```js - * hasConstructor({}); - * //=> true - * - * hasConstructor(Object.create(null)); - * //=> false - * ``` - * @param {Object} `value` - * @return {Boolean} - */ - -function hasConstructor(val) { - return isObject(val) && typeof val.constructor !== 'undefined'; -} - -/** - * Get the native `ownPropertyNames` from the constructor of the - * given `object`. An empty array is returned if the object does - * not have a constructor. - * - * ```js - * nativeKeys({a: 'b', b: 'c', c: 'd'}) - * //=> ['a', 'b', 'c'] - * - * nativeKeys(function(){}) - * //=> ['length', 'caller'] - * ``` - * - * @param {Object} `obj` Object that has a `constructor`. - * @return {Array} Array of keys. - */ - -function nativeKeys(val) { - if (!hasConstructor(val)) return []; - return Object.getOwnPropertyNames(val); -} - -/** - * Expose `copy` - */ - -module.exports = copy; - -/** - * Expose `copy.has` for tests - */ - -module.exports.has = has; - - -/***/ }), -/* 152 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var isBuffer = __webpack_require__(107); -var toString = Object.prototype.toString; - -/** - * Get the native `typeof` a value. - * - * @param {*} `val` - * @return {*} Native javascript type - */ - -module.exports = function kindOf(val) { - // primitivies - if (typeof val === 'undefined') { - return 'undefined'; - } - if (val === null) { - return 'null'; - } - if (val === true || val === false || val instanceof Boolean) { - return 'boolean'; - } - if (typeof val === 'string' || val instanceof String) { - return 'string'; - } - if (typeof val === 'number' || val instanceof Number) { - return 'number'; - } - - // functions - if (typeof val === 'function' || val instanceof Function) { - return 'function'; - } - - // array - if (typeof Array.isArray !== 'undefined' && Array.isArray(val)) { - return 'array'; - } - - // check for instances of RegExp and Date before calling `toString` - if (val instanceof RegExp) { - return 'regexp'; - } - if (val instanceof Date) { - return 'date'; - } - - // other objects - var type = toString.call(val); - - if (type === '[object RegExp]') { - return 'regexp'; - } - if (type === '[object Date]') { - return 'date'; - } - if (type === '[object Arguments]') { - return 'arguments'; - } - if (type === '[object Error]') { - return 'error'; - } - - // buffer - if (isBuffer(val)) { - return 'buffer'; - } - - // es6: Map, WeakMap, Set, WeakSet - if (type === '[object Set]') { - return 'set'; - } - if (type === '[object WeakSet]') { - return 'weakset'; - } - if (type === '[object Map]') { - return 'map'; - } - if (type === '[object WeakMap]') { - return 'weakmap'; - } - if (type === '[object Symbol]') { - return 'symbol'; - } - - // typed arrays - if (type === '[object Int8Array]') { - return 'int8array'; - } - if (type === '[object Uint8Array]') { - return 'uint8array'; - } - if (type === '[object Uint8ClampedArray]') { - return 'uint8clampedarray'; - } - if (type === '[object Int16Array]') { - return 'int16array'; - } - if (type === '[object Uint16Array]') { - return 'uint16array'; - } - if (type === '[object Int32Array]') { - return 'int32array'; - } - if (type === '[object Uint32Array]') { - return 'uint32array'; - } - if (type === '[object Float32Array]') { - return 'float32array'; - } - if (type === '[object Float64Array]') { - return 'float64array'; - } - - // must be a plain object - return 'object'; -}; - - -/***/ }), -/* 153 */ -/***/ ((module) => { - -"use strict"; -/*! - * copy-descriptor - * - * Copyright (c) 2015, Jon Schlinkert. - * Licensed under the MIT License. - */ - - - -/** - * Copy a descriptor from one object to another. - * - * ```js - * function App() { - * this.cache = {}; - * } - * App.prototype.set = function(key, val) { - * this.cache[key] = val; - * return this; - * }; - * Object.defineProperty(App.prototype, 'count', { - * get: function() { - * return Object.keys(this.cache).length; - * } - * }); - * - * copy(App.prototype, 'count', 'len'); - * - * // create an instance - * var app = new App(); - * - * app.set('a', true); - * app.set('b', true); - * app.set('c', true); - * - * console.log(app.count); - * //=> 3 - * console.log(app.len); - * //=> 3 - * ``` - * @name copy - * @param {Object} `receiver` The target object - * @param {Object} `provider` The provider object - * @param {String} `from` The key to copy on provider. - * @param {String} `to` Optionally specify a new key name to use. - * @return {Object} - * @api public - */ - -module.exports = function copyDescriptor(receiver, provider, from, to) { - if (!isObject(provider) && typeof provider !== 'function') { - to = from; - from = provider; - provider = receiver; - } - if (!isObject(receiver) && typeof receiver !== 'function') { - throw new TypeError('expected the first argument to be an object'); - } - if (!isObject(provider) && typeof provider !== 'function') { - throw new TypeError('expected provider to be an object'); - } - - if (typeof to !== 'string') { - to = from; - } - if (typeof from !== 'string') { - throw new TypeError('expected key to be a string'); - } - - if (!(from in provider)) { - throw new Error('property "' + from + '" does not exist'); - } - - var val = Object.getOwnPropertyDescriptor(provider, from); - if (val) Object.defineProperty(receiver, to, val); -}; - -function isObject(val) { - return {}.toString.call(val) === '[object Object]'; -} - - - -/***/ }), -/* 154 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var use = __webpack_require__(155); -var define = __webpack_require__(148); -var debug = __webpack_require__(156)('snapdragon:compiler'); -var utils = __webpack_require__(163); - -/** - * Create a new `Compiler` with the given `options`. - * @param {Object} `options` - */ - -function Compiler(options, state) { - debug('initializing', __filename); - this.options = utils.extend({source: 'string'}, options); - this.state = state || {}; - this.compilers = {}; - this.output = ''; - this.set('eos', function(node) { - return this.emit(node.val, node); - }); - this.set('noop', function(node) { - return this.emit(node.val, node); - }); - this.set('bos', function(node) { - return this.emit(node.val, node); - }); - use(this); -} - -/** - * Prototype methods - */ - -Compiler.prototype = { - - /** - * Throw an error message with details including the cursor position. - * @param {String} `msg` Message to use in the Error. - */ - - error: function(msg, node) { - var pos = node.position || {start: {column: 0}}; - var message = this.options.source + ' column:' + pos.start.column + ': ' + msg; - - var err = new Error(message); - err.reason = msg; - err.column = pos.start.column; - err.source = this.pattern; - - if (this.options.silent) { - this.errors.push(err); - } else { - throw err; - } - }, - - /** - * Define a non-enumberable property on the `Compiler` instance. - * - * ```js - * compiler.define('foo', 'bar'); - * ``` - * @name .define - * @param {String} `key` propery name - * @param {any} `val` property value - * @return {Object} Returns the Compiler instance for chaining. - * @api public - */ - - define: function(key, val) { - define(this, key, val); - return this; - }, - - /** - * Emit `node.val` - */ - - emit: function(str, node) { - this.output += str; - return str; - }, - - /** - * Add a compiler `fn` with the given `name` - */ - - set: function(name, fn) { - this.compilers[name] = fn; - return this; - }, - - /** - * Get compiler `name`. - */ - - get: function(name) { - return this.compilers[name]; - }, - - /** - * Get the previous AST node. - */ - - prev: function(n) { - return this.ast.nodes[this.idx - (n || 1)] || { type: 'bos', val: '' }; - }, - - /** - * Get the next AST node. - */ - - next: function(n) { - return this.ast.nodes[this.idx + (n || 1)] || { type: 'eos', val: '' }; - }, - - /** - * Visit `node`. - */ - - visit: function(node, nodes, i) { - var fn = this.compilers[node.type]; - this.idx = i; - - if (typeof fn !== 'function') { - throw this.error('compiler "' + node.type + '" is not registered', node); - } - return fn.call(this, node, nodes, i); - }, - - /** - * Map visit over array of `nodes`. - */ - - mapVisit: function(nodes) { - if (!Array.isArray(nodes)) { - throw new TypeError('expected an array'); - } - var len = nodes.length; - var idx = -1; - while (++idx < len) { - this.visit(nodes[idx], nodes, idx); - } - return this; - }, - - /** - * Compile `ast`. - */ - - compile: function(ast, options) { - var opts = utils.extend({}, this.options, options); - this.ast = ast; - this.parsingErrors = this.ast.errors; - this.output = ''; - - // source map support - if (opts.sourcemap) { - var sourcemaps = __webpack_require__(183); - sourcemaps(this); - this.mapVisit(this.ast.nodes); - this.applySourceMaps(); - this.map = opts.sourcemap === 'generator' ? this.map : this.map.toJSON(); - return this; - } - - this.mapVisit(this.ast.nodes); - return this; - } -}; - -/** - * Expose `Compiler` - */ - -module.exports = Compiler; - - -/***/ }), -/* 155 */ -/***/ ((module) => { - -"use strict"; -/*! - * use - * - * Copyright (c) 2015-2017, Jon Schlinkert. - * Released under the MIT License. - */ - - - -module.exports = function base(app, options) { - if (!isObject(app) && typeof app !== 'function') { - throw new TypeError('expected an object or function'); - } - - var opts = isObject(options) ? options : {}; - var prop = typeof opts.prop === 'string' ? opts.prop : 'fns'; - if (!Array.isArray(app[prop])) { - define(app, prop, []); - } - - /** - * Define a plugin function to be passed to use. The only - * parameter exposed to the plugin is `app`, the object or function. - * passed to `use(app)`. `app` is also exposed as `this` in plugins. - * - * Additionally, **if a plugin returns a function, the function will - * be pushed onto the `fns` array**, allowing the plugin to be - * called at a later point by the `run` method. - * - * ```js - * var use = require('use'); - * - * // define a plugin - * function foo(app) { - * // do stuff - * } - * - * var app = function(){}; - * use(app); - * - * // register plugins - * app.use(foo); - * app.use(bar); - * app.use(baz); - * ``` - * @name .use - * @param {Function} `fn` plugin function to call - * @api public - */ - - define(app, 'use', use); - - /** - * Run all plugins on `fns`. Any plugin that returns a function - * when called by `use` is pushed onto the `fns` array. - * - * ```js - * var config = {}; - * app.run(config); - * ``` - * @name .run - * @param {Object} `value` Object to be modified by plugins. - * @return {Object} Returns the object passed to `run` - * @api public - */ - - define(app, 'run', function(val) { - if (!isObject(val)) return; - - if (!val.use || !val.run) { - define(val, prop, val[prop] || []); - define(val, 'use', use); - } - - if (!val[prop] || val[prop].indexOf(base) === -1) { - val.use(base); - } - - var self = this || app; - var fns = self[prop]; - var len = fns.length; - var idx = -1; - - while (++idx < len) { - val.use(fns[idx]); - } - return val; - }); - - /** - * Call plugin `fn`. If a function is returned push it into the - * `fns` array to be called by the `run` method. - */ - - function use(type, fn, options) { - var offset = 1; - - if (typeof type === 'string' || Array.isArray(type)) { - fn = wrap(type, fn); - offset++; - } else { - options = fn; - fn = type; - } - - if (typeof fn !== 'function') { - throw new TypeError('expected a function'); - } - - var self = this || app; - var fns = self[prop]; - - var args = [].slice.call(arguments, offset); - args.unshift(self); - - if (typeof opts.hook === 'function') { - opts.hook.apply(self, args); - } - - var val = fn.apply(self, args); - if (typeof val === 'function' && fns.indexOf(val) === -1) { - fns.push(val); - } - return self; - } - - /** - * Wrap a named plugin function so that it's only called on objects of the - * given `type` - * - * @param {String} `type` - * @param {Function} `fn` Plugin function - * @return {Function} - */ - - function wrap(type, fn) { - return function plugin() { - return this.type === type ? fn.apply(this, arguments) : plugin; - }; - } - - return app; -}; - -function isObject(val) { - return val && typeof val === 'object' && !Array.isArray(val); -} - -function define(obj, key, val) { - Object.defineProperty(obj, key, { - configurable: true, - writable: true, - value: val - }); -} - - -/***/ }), -/* 156 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -/** - * Detect Electron renderer process, which is node, but we should - * treat as a browser. - */ - -if (typeof process !== 'undefined' && process.type === 'renderer') { - module.exports = __webpack_require__(157); -} else { - module.exports = __webpack_require__(160); -} - - -/***/ }), -/* 157 */ -/***/ ((module, exports, __webpack_require__) => { - -/** - * This is the web browser implementation of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = __webpack_require__(158); -exports.log = log; -exports.formatArgs = formatArgs; -exports.save = save; -exports.load = load; -exports.useColors = useColors; -exports.storage = 'undefined' != typeof chrome - && 'undefined' != typeof chrome.storage - ? chrome.storage.local - : localstorage(); - -/** - * Colors. - */ - -exports.colors = [ - 'lightseagreen', - 'forestgreen', - 'goldenrod', - 'dodgerblue', - 'darkorchid', - 'crimson' -]; - -/** - * Currently only WebKit-based Web Inspectors, Firefox >= v31, - * and the Firebug extension (any Firefox version) are known - * to support "%c" CSS customizations. - * - * TODO: add a `localStorage` variable to explicitly enable/disable colors - */ - -function useColors() { - // NB: In an Electron preload script, document will be defined but not fully - // initialized. Since we know we're in Chrome, we'll just detect this case - // explicitly - if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') { - return true; - } - - // is webkit? http://stackoverflow.com/a/16459606/376773 - // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 - return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || - // is firebug? http://stackoverflow.com/a/398120/376773 - (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) || - // is firefox >= v31? - // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages - (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) || - // double check webkit in userAgent just in case we are in a worker - (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)); -} - -/** - * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. - */ - -exports.formatters.j = function(v) { - try { - return JSON.stringify(v); - } catch (err) { - return '[UnexpectedJSONParseError]: ' + err.message; - } -}; - - -/** - * Colorize log arguments if enabled. - * - * @api public - */ - -function formatArgs(args) { - var useColors = this.useColors; - - args[0] = (useColors ? '%c' : '') - + this.namespace - + (useColors ? ' %c' : ' ') - + args[0] - + (useColors ? '%c ' : ' ') - + '+' + exports.humanize(this.diff); - - if (!useColors) return; - - var c = 'color: ' + this.color; - args.splice(1, 0, c, 'color: inherit') - - // the final "%c" is somewhat tricky, because there could be other - // arguments passed either before or after the %c, so we need to - // figure out the correct index to insert the CSS into - var index = 0; - var lastC = 0; - args[0].replace(/%[a-zA-Z%]/g, function(match) { - if ('%%' === match) return; - index++; - if ('%c' === match) { - // we only are interested in the *last* %c - // (the user may have provided their own) - lastC = index; - } - }); - - args.splice(lastC, 0, c); -} - -/** - * Invokes `console.log()` when available. - * No-op when `console.log` is not a "function". - * - * @api public - */ - -function log() { - // this hackery is required for IE8/9, where - // the `console.log` function doesn't have 'apply' - return 'object' === typeof console - && console.log - && Function.prototype.apply.call(console.log, console, arguments); -} - -/** - * Save `namespaces`. - * - * @param {String} namespaces - * @api private - */ - -function save(namespaces) { - try { - if (null == namespaces) { - exports.storage.removeItem('debug'); - } else { - exports.storage.debug = namespaces; - } - } catch(e) {} -} - -/** - * Load `namespaces`. - * - * @return {String} returns the previously persisted debug modes - * @api private - */ - -function load() { - var r; - try { - r = exports.storage.debug; - } catch(e) {} - - // If debug isn't set in LS, and we're in Electron, try to load $DEBUG - if (!r && typeof process !== 'undefined' && 'env' in process) { - r = process.env.DEBUG; - } - - return r; -} - -/** - * Enable namespaces listed in `localStorage.debug` initially. - */ - -exports.enable(load()); - -/** - * Localstorage attempts to return the localstorage. - * - * This is necessary because safari throws - * when a user disables cookies/localstorage - * and you attempt to access it. - * - * @return {LocalStorage} - * @api private - */ - -function localstorage() { - try { - return window.localStorage; - } catch (e) {} -} - - -/***/ }), -/* 158 */ -/***/ ((module, exports, __webpack_require__) => { - - -/** - * This is the common logic for both the Node.js and web browser - * implementations of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = createDebug.debug = createDebug['default'] = createDebug; -exports.coerce = coerce; -exports.disable = disable; -exports.enable = enable; -exports.enabled = enabled; -exports.humanize = __webpack_require__(159); - -/** - * The currently active debug mode names, and names to skip. - */ - -exports.names = []; -exports.skips = []; - -/** - * Map of special "%n" handling functions, for the debug "format" argument. - * - * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". - */ - -exports.formatters = {}; - -/** - * Previous log timestamp. - */ - -var prevTime; - -/** - * Select a color. - * @param {String} namespace - * @return {Number} - * @api private - */ - -function selectColor(namespace) { - var hash = 0, i; - - for (i in namespace) { - hash = ((hash << 5) - hash) + namespace.charCodeAt(i); - hash |= 0; // Convert to 32bit integer - } - - return exports.colors[Math.abs(hash) % exports.colors.length]; -} - -/** - * Create a debugger with the given `namespace`. - * - * @param {String} namespace - * @return {Function} - * @api public - */ - -function createDebug(namespace) { - - function debug() { - // disabled? - if (!debug.enabled) return; - - var self = debug; - - // set `diff` timestamp - var curr = +new Date(); - var ms = curr - (prevTime || curr); - self.diff = ms; - self.prev = prevTime; - self.curr = curr; - prevTime = curr; - - // turn the `arguments` into a proper Array - var args = new Array(arguments.length); - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i]; - } - - args[0] = exports.coerce(args[0]); - - if ('string' !== typeof args[0]) { - // anything else let's inspect with %O - args.unshift('%O'); - } - - // apply any `formatters` transformations - var index = 0; - args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) { - // if we encounter an escaped % then don't increase the array index - if (match === '%%') return match; - index++; - var formatter = exports.formatters[format]; - if ('function' === typeof formatter) { - var val = args[index]; - match = formatter.call(self, val); - - // now we need to remove `args[index]` since it's inlined in the `format` - args.splice(index, 1); - index--; - } - return match; - }); - - // apply env-specific formatting (colors, etc.) - exports.formatArgs.call(self, args); - - var logFn = debug.log || exports.log || console.log.bind(console); - logFn.apply(self, args); - } - - debug.namespace = namespace; - debug.enabled = exports.enabled(namespace); - debug.useColors = exports.useColors(); - debug.color = selectColor(namespace); - - // env-specific initialization logic for debug instances - if ('function' === typeof exports.init) { - exports.init(debug); - } - - return debug; -} - -/** - * Enables a debug mode by namespaces. This can include modes - * separated by a colon and wildcards. - * - * @param {String} namespaces - * @api public - */ - -function enable(namespaces) { - exports.save(namespaces); - - exports.names = []; - exports.skips = []; - - var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); - var len = split.length; - - for (var i = 0; i < len; i++) { - if (!split[i]) continue; // ignore empty strings - namespaces = split[i].replace(/\*/g, '.*?'); - if (namespaces[0] === '-') { - exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); - } else { - exports.names.push(new RegExp('^' + namespaces + '$')); - } - } -} - -/** - * Disable debug output. - * - * @api public - */ - -function disable() { - exports.enable(''); -} - -/** - * Returns true if the given mode name is enabled, false otherwise. - * - * @param {String} name - * @return {Boolean} - * @api public - */ - -function enabled(name) { - var i, len; - for (i = 0, len = exports.skips.length; i < len; i++) { - if (exports.skips[i].test(name)) { - return false; - } - } - for (i = 0, len = exports.names.length; i < len; i++) { - if (exports.names[i].test(name)) { - return true; - } - } - return false; -} - -/** - * Coerce `val`. - * - * @param {Mixed} val - * @return {Mixed} - * @api private - */ - -function coerce(val) { - if (val instanceof Error) return val.stack || val.message; - return val; -} - - -/***/ }), -/* 159 */ -/***/ ((module) => { - -/** - * Helpers. - */ - -var s = 1000; -var m = s * 60; -var h = m * 60; -var d = h * 24; -var y = d * 365.25; - -/** - * Parse or format the given `val`. - * - * Options: - * - * - `long` verbose formatting [false] - * - * @param {String|Number} val - * @param {Object} [options] - * @throws {Error} throw an error if val is not a non-empty string or a number - * @return {String|Number} - * @api public - */ - -module.exports = function(val, options) { - options = options || {}; - var type = typeof val; - if (type === 'string' && val.length > 0) { - return parse(val); - } else if (type === 'number' && isNaN(val) === false) { - return options.long ? fmtLong(val) : fmtShort(val); - } - throw new Error( - 'val is not a non-empty string or a valid number. val=' + - JSON.stringify(val) - ); -}; - -/** - * Parse the given `str` and return milliseconds. - * - * @param {String} str - * @return {Number} - * @api private - */ - -function parse(str) { - str = String(str); - if (str.length > 100) { - return; - } - var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec( - str - ); - if (!match) { - return; - } - var n = parseFloat(match[1]); - var type = (match[2] || 'ms').toLowerCase(); - switch (type) { - case 'years': - case 'year': - case 'yrs': - case 'yr': - case 'y': - return n * y; - case 'days': - case 'day': - case 'd': - return n * d; - case 'hours': - case 'hour': - case 'hrs': - case 'hr': - case 'h': - return n * h; - case 'minutes': - case 'minute': - case 'mins': - case 'min': - case 'm': - return n * m; - case 'seconds': - case 'second': - case 'secs': - case 'sec': - case 's': - return n * s; - case 'milliseconds': - case 'millisecond': - case 'msecs': - case 'msec': - case 'ms': - return n; - default: - return undefined; - } -} - -/** - * Short format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function fmtShort(ms) { - if (ms >= d) { - return Math.round(ms / d) + 'd'; - } - if (ms >= h) { - return Math.round(ms / h) + 'h'; - } - if (ms >= m) { - return Math.round(ms / m) + 'm'; - } - if (ms >= s) { - return Math.round(ms / s) + 's'; - } - return ms + 'ms'; -} - -/** - * Long format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function fmtLong(ms) { - return plural(ms, d, 'day') || - plural(ms, h, 'hour') || - plural(ms, m, 'minute') || - plural(ms, s, 'second') || - ms + ' ms'; -} - -/** - * Pluralization helper. - */ - -function plural(ms, n, name) { - if (ms < n) { - return; - } - if (ms < n * 1.5) { - return Math.floor(ms / n) + ' ' + name; - } - return Math.ceil(ms / n) + ' ' + name + 's'; -} - - -/***/ }), -/* 160 */ -/***/ ((module, exports, __webpack_require__) => { - -/** - * Module dependencies. - */ - -var tty = __webpack_require__(161); -var util = __webpack_require__(17); - -/** - * This is the Node.js implementation of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = __webpack_require__(158); -exports.init = init; -exports.log = log; -exports.formatArgs = formatArgs; -exports.save = save; -exports.load = load; -exports.useColors = useColors; - -/** - * Colors. - */ - -exports.colors = [6, 2, 3, 4, 5, 1]; - -/** - * Build up the default `inspectOpts` object from the environment variables. - * - * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js - */ - -exports.inspectOpts = Object.keys(process.env).filter(function (key) { - return /^debug_/i.test(key); -}).reduce(function (obj, key) { - // camel-case - var prop = key - .substring(6) - .toLowerCase() - .replace(/_([a-z])/g, function (_, k) { return k.toUpperCase() }); - - // coerce string value into JS value - var val = process.env[key]; - if (/^(yes|on|true|enabled)$/i.test(val)) val = true; - else if (/^(no|off|false|disabled)$/i.test(val)) val = false; - else if (val === 'null') val = null; - else val = Number(val); - - obj[prop] = val; - return obj; -}, {}); - -/** - * The file descriptor to write the `debug()` calls to. - * Set the `DEBUG_FD` env variable to override with another value. i.e.: - * - * $ DEBUG_FD=3 node script.js 3>debug.log - */ - -var fd = parseInt(process.env.DEBUG_FD, 10) || 2; - -if (1 !== fd && 2 !== fd) { - util.deprecate(function(){}, 'except for stderr(2) and stdout(1), any other usage of DEBUG_FD is deprecated. Override debug.log if you want to use a different log function (https://git.io/debug_fd)')() -} - -var stream = 1 === fd ? process.stdout : - 2 === fd ? process.stderr : - createWritableStdioStream(fd); - -/** - * Is stdout a TTY? Colored output is enabled when `true`. - */ - -function useColors() { - return 'colors' in exports.inspectOpts - ? Boolean(exports.inspectOpts.colors) - : tty.isatty(fd); -} - -/** - * Map %o to `util.inspect()`, all on a single line. - */ - -exports.formatters.o = function(v) { - this.inspectOpts.colors = this.useColors; - return util.inspect(v, this.inspectOpts) - .split('\n').map(function(str) { - return str.trim() - }).join(' '); -}; - -/** - * Map %o to `util.inspect()`, allowing multiple lines if needed. - */ - -exports.formatters.O = function(v) { - this.inspectOpts.colors = this.useColors; - return util.inspect(v, this.inspectOpts); -}; - -/** - * Adds ANSI color escape codes if enabled. - * - * @api public - */ - -function formatArgs(args) { - var name = this.namespace; - var useColors = this.useColors; - - if (useColors) { - var c = this.color; - var prefix = ' \u001b[3' + c + ';1m' + name + ' ' + '\u001b[0m'; - - args[0] = prefix + args[0].split('\n').join('\n' + prefix); - args.push('\u001b[3' + c + 'm+' + exports.humanize(this.diff) + '\u001b[0m'); - } else { - args[0] = new Date().toUTCString() - + ' ' + name + ' ' + args[0]; - } -} - -/** - * Invokes `util.format()` with the specified arguments and writes to `stream`. - */ - -function log() { - return stream.write(util.format.apply(util, arguments) + '\n'); -} - -/** - * Save `namespaces`. - * - * @param {String} namespaces - * @api private - */ - -function save(namespaces) { - if (null == namespaces) { - // If you set a process.env field to null or undefined, it gets cast to the - // string 'null' or 'undefined'. Just delete instead. - delete process.env.DEBUG; - } else { - process.env.DEBUG = namespaces; - } -} - -/** - * Load `namespaces`. - * - * @return {String} returns the previously persisted debug modes - * @api private - */ - -function load() { - return process.env.DEBUG; -} - -/** - * Copied from `node/src/node.js`. - * - * XXX: It's lame that node doesn't expose this API out-of-the-box. It also - * relies on the undocumented `tty_wrap.guessHandleType()` which is also lame. - */ - -function createWritableStdioStream (fd) { - var stream; - var tty_wrap = process.binding('tty_wrap'); - - // Note stream._type is used for test-module-load-list.js - - switch (tty_wrap.guessHandleType(fd)) { - case 'TTY': - stream = new tty.WriteStream(fd); - stream._type = 'tty'; - - // Hack to have stream not keep the event loop alive. - // See https://github.com/joyent/node/issues/1726 - if (stream._handle && stream._handle.unref) { - stream._handle.unref(); - } - break; - - case 'FILE': - var fs = __webpack_require__(11); - stream = new fs.SyncWriteStream(fd, { autoClose: false }); - stream._type = 'fs'; - break; - - case 'PIPE': - case 'TCP': - var net = __webpack_require__(162); - stream = new net.Socket({ - fd: fd, - readable: false, - writable: true - }); - - // FIXME Should probably have an option in net.Socket to create a - // stream from an existing fd which is writable only. But for now - // we'll just add this hack and set the `readable` member to false. - // Test: ./node test/fixtures/echo.js < /etc/passwd - stream.readable = false; - stream.read = null; - stream._type = 'pipe'; - - // FIXME Hack to have stream not keep the event loop alive. - // See https://github.com/joyent/node/issues/1726 - if (stream._handle && stream._handle.unref) { - stream._handle.unref(); - } - break; - - default: - // Probably an error on in uv_guess_handle() - throw new Error('Implement me. Unknown stream file type!'); - } - - // For supporting legacy API we put the FD here. - stream.fd = fd; - - stream._isStdio = true; - - return stream; -} - -/** - * Init logic for `debug` instances. - * - * Create a new `inspectOpts` object in case `useColors` is set - * differently for a particular `debug` instance. - */ - -function init (debug) { - debug.inspectOpts = {}; - - var keys = Object.keys(exports.inspectOpts); - for (var i = 0; i < keys.length; i++) { - debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]]; - } -} - -/** - * Enable namespaces listed in `process.env.DEBUG` initially. - */ - -exports.enable(load()); - - -/***/ }), -/* 161 */ -/***/ ((module) => { - -"use strict"; -module.exports = require("tty"); - -/***/ }), -/* 162 */ -/***/ ((module) => { - -"use strict"; -module.exports = require("net"); - -/***/ }), -/* 163 */ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - - -/** - * Module dependencies - */ - -exports.extend = __webpack_require__(96); -exports.SourceMap = __webpack_require__(164); -exports.sourceMapResolve = __webpack_require__(175); - -/** - * Convert backslash in the given string to forward slashes - */ - -exports.unixify = function(fp) { - return fp.split(/\\+/).join('/'); -}; - -/** - * Return true if `val` is a non-empty string - * - * @param {String} `str` - * @return {Boolean} - */ - -exports.isString = function(str) { - return str && typeof str === 'string'; -}; - -/** - * Cast `val` to an array - * @return {Array} - */ - -exports.arrayify = function(val) { - if (typeof val === 'string') return [val]; - return val ? (Array.isArray(val) ? val : [val]) : []; -}; - -/** - * Get the last `n` element from the given `array` - * @param {Array} `array` - * @return {*} - */ - -exports.last = function(arr, n) { - return arr[arr.length - (n || 1)]; -}; - - -/***/ }), -/* 164 */ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -/* - * Copyright 2009-2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE.txt or: - * http://opensource.org/licenses/BSD-3-Clause - */ -exports.SourceMapGenerator = __webpack_require__(165).SourceMapGenerator; -exports.SourceMapConsumer = __webpack_require__(171).SourceMapConsumer; -exports.SourceNode = __webpack_require__(174).SourceNode; - - -/***/ }), -/* 165 */ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ - -var base64VLQ = __webpack_require__(166); -var util = __webpack_require__(168); -var ArraySet = (__webpack_require__(169).ArraySet); -var MappingList = (__webpack_require__(170).MappingList); - -/** - * An instance of the SourceMapGenerator represents a source map which is - * being built incrementally. You may pass an object with the following - * properties: - * - * - file: The filename of the generated source. - * - sourceRoot: A root for all relative URLs in this source map. - */ -function SourceMapGenerator(aArgs) { - if (!aArgs) { - aArgs = {}; - } - this._file = util.getArg(aArgs, 'file', null); - this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null); - this._skipValidation = util.getArg(aArgs, 'skipValidation', false); - this._sources = new ArraySet(); - this._names = new ArraySet(); - this._mappings = new MappingList(); - this._sourcesContents = null; -} - -SourceMapGenerator.prototype._version = 3; - -/** - * Creates a new SourceMapGenerator based on a SourceMapConsumer - * - * @param aSourceMapConsumer The SourceMap. - */ -SourceMapGenerator.fromSourceMap = - function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) { - var sourceRoot = aSourceMapConsumer.sourceRoot; - var generator = new SourceMapGenerator({ - file: aSourceMapConsumer.file, - sourceRoot: sourceRoot - }); - aSourceMapConsumer.eachMapping(function (mapping) { - var newMapping = { - generated: { - line: mapping.generatedLine, - column: mapping.generatedColumn - } - }; - - if (mapping.source != null) { - newMapping.source = mapping.source; - if (sourceRoot != null) { - newMapping.source = util.relative(sourceRoot, newMapping.source); - } - - newMapping.original = { - line: mapping.originalLine, - column: mapping.originalColumn - }; - - if (mapping.name != null) { - newMapping.name = mapping.name; - } - } - - generator.addMapping(newMapping); - }); - aSourceMapConsumer.sources.forEach(function (sourceFile) { - var content = aSourceMapConsumer.sourceContentFor(sourceFile); - if (content != null) { - generator.setSourceContent(sourceFile, content); - } - }); - return generator; - }; - -/** - * Add a single mapping from original source line and column to the generated - * source's line and column for this source map being created. The mapping - * object should have the following properties: - * - * - generated: An object with the generated line and column positions. - * - original: An object with the original line and column positions. - * - source: The original source file (relative to the sourceRoot). - * - name: An optional original token name for this mapping. - */ -SourceMapGenerator.prototype.addMapping = - function SourceMapGenerator_addMapping(aArgs) { - var generated = util.getArg(aArgs, 'generated'); - var original = util.getArg(aArgs, 'original', null); - var source = util.getArg(aArgs, 'source', null); - var name = util.getArg(aArgs, 'name', null); - - if (!this._skipValidation) { - this._validateMapping(generated, original, source, name); - } - - if (source != null) { - source = String(source); - if (!this._sources.has(source)) { - this._sources.add(source); - } - } - - if (name != null) { - name = String(name); - if (!this._names.has(name)) { - this._names.add(name); - } - } - - this._mappings.add({ - generatedLine: generated.line, - generatedColumn: generated.column, - originalLine: original != null && original.line, - originalColumn: original != null && original.column, - source: source, - name: name - }); - }; - -/** - * Set the source content for a source file. - */ -SourceMapGenerator.prototype.setSourceContent = - function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) { - var source = aSourceFile; - if (this._sourceRoot != null) { - source = util.relative(this._sourceRoot, source); - } - - if (aSourceContent != null) { - // Add the source content to the _sourcesContents map. - // Create a new _sourcesContents map if the property is null. - if (!this._sourcesContents) { - this._sourcesContents = Object.create(null); - } - this._sourcesContents[util.toSetString(source)] = aSourceContent; - } else if (this._sourcesContents) { - // Remove the source file from the _sourcesContents map. - // If the _sourcesContents map is empty, set the property to null. - delete this._sourcesContents[util.toSetString(source)]; - if (Object.keys(this._sourcesContents).length === 0) { - this._sourcesContents = null; - } - } - }; - -/** - * Applies the mappings of a sub-source-map for a specific source file to the - * source map being generated. Each mapping to the supplied source file is - * rewritten using the supplied source map. Note: The resolution for the - * resulting mappings is the minimium of this map and the supplied map. - * - * @param aSourceMapConsumer The source map to be applied. - * @param aSourceFile Optional. The filename of the source file. - * If omitted, SourceMapConsumer's file property will be used. - * @param aSourceMapPath Optional. The dirname of the path to the source map - * to be applied. If relative, it is relative to the SourceMapConsumer. - * This parameter is needed when the two source maps aren't in the same - * directory, and the source map to be applied contains relative source - * paths. If so, those relative source paths need to be rewritten - * relative to the SourceMapGenerator. - */ -SourceMapGenerator.prototype.applySourceMap = - function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) { - var sourceFile = aSourceFile; - // If aSourceFile is omitted, we will use the file property of the SourceMap - if (aSourceFile == null) { - if (aSourceMapConsumer.file == null) { - throw new Error( - 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' + - 'or the source map\'s "file" property. Both were omitted.' - ); - } - sourceFile = aSourceMapConsumer.file; - } - var sourceRoot = this._sourceRoot; - // Make "sourceFile" relative if an absolute Url is passed. - if (sourceRoot != null) { - sourceFile = util.relative(sourceRoot, sourceFile); - } - // Applying the SourceMap can add and remove items from the sources and - // the names array. - var newSources = new ArraySet(); - var newNames = new ArraySet(); - - // Find mappings for the "sourceFile" - this._mappings.unsortedForEach(function (mapping) { - if (mapping.source === sourceFile && mapping.originalLine != null) { - // Check if it can be mapped by the source map, then update the mapping. - var original = aSourceMapConsumer.originalPositionFor({ - line: mapping.originalLine, - column: mapping.originalColumn - }); - if (original.source != null) { - // Copy mapping - mapping.source = original.source; - if (aSourceMapPath != null) { - mapping.source = util.join(aSourceMapPath, mapping.source) - } - if (sourceRoot != null) { - mapping.source = util.relative(sourceRoot, mapping.source); - } - mapping.originalLine = original.line; - mapping.originalColumn = original.column; - if (original.name != null) { - mapping.name = original.name; - } - } - } - - var source = mapping.source; - if (source != null && !newSources.has(source)) { - newSources.add(source); - } - - var name = mapping.name; - if (name != null && !newNames.has(name)) { - newNames.add(name); - } - - }, this); - this._sources = newSources; - this._names = newNames; - - // Copy sourcesContents of applied map. - aSourceMapConsumer.sources.forEach(function (sourceFile) { - var content = aSourceMapConsumer.sourceContentFor(sourceFile); - if (content != null) { - if (aSourceMapPath != null) { - sourceFile = util.join(aSourceMapPath, sourceFile); - } - if (sourceRoot != null) { - sourceFile = util.relative(sourceRoot, sourceFile); - } - this.setSourceContent(sourceFile, content); - } - }, this); - }; - -/** - * A mapping can have one of the three levels of data: - * - * 1. Just the generated position. - * 2. The Generated position, original position, and original source. - * 3. Generated and original position, original source, as well as a name - * token. - * - * To maintain consistency, we validate that any new mapping being added falls - * in to one of these categories. - */ -SourceMapGenerator.prototype._validateMapping = - function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource, - aName) { - // When aOriginal is truthy but has empty values for .line and .column, - // it is most likely a programmer error. In this case we throw a very - // specific error message to try to guide them the right way. - // For example: https://github.com/Polymer/polymer-bundler/pull/519 - if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') { - throw new Error( - 'original.line and original.column are not numbers -- you probably meant to omit ' + - 'the original mapping entirely and only map the generated position. If so, pass ' + - 'null for the original mapping instead of an object with empty or null values.' - ); - } - - if (aGenerated && 'line' in aGenerated && 'column' in aGenerated - && aGenerated.line > 0 && aGenerated.column >= 0 - && !aOriginal && !aSource && !aName) { - // Case 1. - return; - } - else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated - && aOriginal && 'line' in aOriginal && 'column' in aOriginal - && aGenerated.line > 0 && aGenerated.column >= 0 - && aOriginal.line > 0 && aOriginal.column >= 0 - && aSource) { - // Cases 2 and 3. - return; - } - else { - throw new Error('Invalid mapping: ' + JSON.stringify({ - generated: aGenerated, - source: aSource, - original: aOriginal, - name: aName - })); - } - }; - -/** - * Serialize the accumulated mappings in to the stream of base 64 VLQs - * specified by the source map format. - */ -SourceMapGenerator.prototype._serializeMappings = - function SourceMapGenerator_serializeMappings() { - var previousGeneratedColumn = 0; - var previousGeneratedLine = 1; - var previousOriginalColumn = 0; - var previousOriginalLine = 0; - var previousName = 0; - var previousSource = 0; - var result = ''; - var next; - var mapping; - var nameIdx; - var sourceIdx; - - var mappings = this._mappings.toArray(); - for (var i = 0, len = mappings.length; i < len; i++) { - mapping = mappings[i]; - next = '' - - if (mapping.generatedLine !== previousGeneratedLine) { - previousGeneratedColumn = 0; - while (mapping.generatedLine !== previousGeneratedLine) { - next += ';'; - previousGeneratedLine++; - } - } - else { - if (i > 0) { - if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) { - continue; - } - next += ','; - } - } - - next += base64VLQ.encode(mapping.generatedColumn - - previousGeneratedColumn); - previousGeneratedColumn = mapping.generatedColumn; - - if (mapping.source != null) { - sourceIdx = this._sources.indexOf(mapping.source); - next += base64VLQ.encode(sourceIdx - previousSource); - previousSource = sourceIdx; - - // lines are stored 0-based in SourceMap spec version 3 - next += base64VLQ.encode(mapping.originalLine - 1 - - previousOriginalLine); - previousOriginalLine = mapping.originalLine - 1; - - next += base64VLQ.encode(mapping.originalColumn - - previousOriginalColumn); - previousOriginalColumn = mapping.originalColumn; - - if (mapping.name != null) { - nameIdx = this._names.indexOf(mapping.name); - next += base64VLQ.encode(nameIdx - previousName); - previousName = nameIdx; - } - } - - result += next; - } - - return result; - }; - -SourceMapGenerator.prototype._generateSourcesContent = - function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) { - return aSources.map(function (source) { - if (!this._sourcesContents) { - return null; - } - if (aSourceRoot != null) { - source = util.relative(aSourceRoot, source); - } - var key = util.toSetString(source); - return Object.prototype.hasOwnProperty.call(this._sourcesContents, key) - ? this._sourcesContents[key] - : null; - }, this); - }; - -/** - * Externalize the source map. - */ -SourceMapGenerator.prototype.toJSON = - function SourceMapGenerator_toJSON() { - var map = { - version: this._version, - sources: this._sources.toArray(), - names: this._names.toArray(), - mappings: this._serializeMappings() - }; - if (this._file != null) { - map.file = this._file; - } - if (this._sourceRoot != null) { - map.sourceRoot = this._sourceRoot; - } - if (this._sourcesContents) { - map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot); - } - - return map; - }; - -/** - * Render the source map being generated to a string. - */ -SourceMapGenerator.prototype.toString = - function SourceMapGenerator_toString() { - return JSON.stringify(this.toJSON()); - }; - -exports.SourceMapGenerator = SourceMapGenerator; - - -/***/ }), -/* 166 */ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - * - * Based on the Base 64 VLQ implementation in Closure Compiler: - * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java - * - * Copyright 2011 The Closure Compiler Authors. All rights reserved. - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -var base64 = __webpack_require__(167); - -// A single base 64 digit can contain 6 bits of data. For the base 64 variable -// length quantities we use in the source map spec, the first bit is the sign, -// the next four bits are the actual value, and the 6th bit is the -// continuation bit. The continuation bit tells us whether there are more -// digits in this value following this digit. -// -// Continuation -// | Sign -// | | -// V V -// 101011 - -var VLQ_BASE_SHIFT = 5; - -// binary: 100000 -var VLQ_BASE = 1 << VLQ_BASE_SHIFT; - -// binary: 011111 -var VLQ_BASE_MASK = VLQ_BASE - 1; - -// binary: 100000 -var VLQ_CONTINUATION_BIT = VLQ_BASE; - -/** - * Converts from a two-complement value to a value where the sign bit is - * placed in the least significant bit. For example, as decimals: - * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary) - * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary) - */ -function toVLQSigned(aValue) { - return aValue < 0 - ? ((-aValue) << 1) + 1 - : (aValue << 1) + 0; -} - -/** - * Converts to a two-complement value from a value where the sign bit is - * placed in the least significant bit. For example, as decimals: - * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1 - * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2 - */ -function fromVLQSigned(aValue) { - var isNegative = (aValue & 1) === 1; - var shifted = aValue >> 1; - return isNegative - ? -shifted - : shifted; -} - -/** - * Returns the base 64 VLQ encoded value. - */ -exports.encode = function base64VLQ_encode(aValue) { - var encoded = ""; - var digit; - - var vlq = toVLQSigned(aValue); - - do { - digit = vlq & VLQ_BASE_MASK; - vlq >>>= VLQ_BASE_SHIFT; - if (vlq > 0) { - // There are still more digits in this value, so we must make sure the - // continuation bit is marked. - digit |= VLQ_CONTINUATION_BIT; - } - encoded += base64.encode(digit); - } while (vlq > 0); - - return encoded; -}; - -/** - * Decodes the next base 64 VLQ value from the given string and returns the - * value and the rest of the string via the out parameter. - */ -exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) { - var strLen = aStr.length; - var result = 0; - var shift = 0; - var continuation, digit; - - do { - if (aIndex >= strLen) { - throw new Error("Expected more digits in base 64 VLQ value."); - } - - digit = base64.decode(aStr.charCodeAt(aIndex++)); - if (digit === -1) { - throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1)); - } - - continuation = !!(digit & VLQ_CONTINUATION_BIT); - digit &= VLQ_BASE_MASK; - result = result + (digit << shift); - shift += VLQ_BASE_SHIFT; - } while (continuation); - - aOutParam.value = fromVLQSigned(result); - aOutParam.rest = aIndex; -}; - - -/***/ }), -/* 167 */ -/***/ ((__unused_webpack_module, exports) => { - -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ - -var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split(''); - -/** - * Encode an integer in the range of 0 to 63 to a single base 64 digit. - */ -exports.encode = function (number) { - if (0 <= number && number < intToCharMap.length) { - return intToCharMap[number]; - } - throw new TypeError("Must be between 0 and 63: " + number); -}; - -/** - * Decode a single base 64 character code digit to an integer. Returns -1 on - * failure. - */ -exports.decode = function (charCode) { - var bigA = 65; // 'A' - var bigZ = 90; // 'Z' - - var littleA = 97; // 'a' - var littleZ = 122; // 'z' - - var zero = 48; // '0' - var nine = 57; // '9' - - var plus = 43; // '+' - var slash = 47; // '/' - - var littleOffset = 26; - var numberOffset = 52; - - // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ - if (bigA <= charCode && charCode <= bigZ) { - return (charCode - bigA); - } - - // 26 - 51: abcdefghijklmnopqrstuvwxyz - if (littleA <= charCode && charCode <= littleZ) { - return (charCode - littleA + littleOffset); - } - - // 52 - 61: 0123456789 - if (zero <= charCode && charCode <= nine) { - return (charCode - zero + numberOffset); - } - - // 62: + - if (charCode == plus) { - return 62; - } - - // 63: / - if (charCode == slash) { - return 63; - } - - // Invalid base64 digit. - return -1; -}; - - -/***/ }), -/* 168 */ -/***/ ((__unused_webpack_module, exports) => { - -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ - -/** - * This is a helper function for getting values from parameter/options - * objects. - * - * @param args The object we are extracting values from - * @param name The name of the property we are getting. - * @param defaultValue An optional value to return if the property is missing - * from the object. If this is not specified and the property is missing, an - * error will be thrown. - */ -function getArg(aArgs, aName, aDefaultValue) { - if (aName in aArgs) { - return aArgs[aName]; - } else if (arguments.length === 3) { - return aDefaultValue; - } else { - throw new Error('"' + aName + '" is a required argument.'); - } -} -exports.getArg = getArg; - -var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.]*)(?::(\d+))?(\S*)$/; -var dataUrlRegexp = /^data:.+\,.+$/; - -function urlParse(aUrl) { - var match = aUrl.match(urlRegexp); - if (!match) { - return null; - } - return { - scheme: match[1], - auth: match[2], - host: match[3], - port: match[4], - path: match[5] - }; -} -exports.urlParse = urlParse; - -function urlGenerate(aParsedUrl) { - var url = ''; - if (aParsedUrl.scheme) { - url += aParsedUrl.scheme + ':'; - } - url += '//'; - if (aParsedUrl.auth) { - url += aParsedUrl.auth + '@'; - } - if (aParsedUrl.host) { - url += aParsedUrl.host; - } - if (aParsedUrl.port) { - url += ":" + aParsedUrl.port - } - if (aParsedUrl.path) { - url += aParsedUrl.path; - } - return url; -} -exports.urlGenerate = urlGenerate; - -/** - * Normalizes a path, or the path portion of a URL: - * - * - Replaces consecutive slashes with one slash. - * - Removes unnecessary '.' parts. - * - Removes unnecessary '/..' parts. - * - * Based on code in the Node.js 'path' core module. - * - * @param aPath The path or url to normalize. - */ -function normalize(aPath) { - var path = aPath; - var url = urlParse(aPath); - if (url) { - if (!url.path) { - return aPath; - } - path = url.path; - } - var isAbsolute = exports.isAbsolute(path); - - var parts = path.split(/\/+/); - for (var part, up = 0, i = parts.length - 1; i >= 0; i--) { - part = parts[i]; - if (part === '.') { - parts.splice(i, 1); - } else if (part === '..') { - up++; - } else if (up > 0) { - if (part === '') { - // The first part is blank if the path is absolute. Trying to go - // above the root is a no-op. Therefore we can remove all '..' parts - // directly after the root. - parts.splice(i + 1, up); - up = 0; - } else { - parts.splice(i, 2); - up--; - } - } - } - path = parts.join('/'); - - if (path === '') { - path = isAbsolute ? '/' : '.'; - } - - if (url) { - url.path = path; - return urlGenerate(url); - } - return path; -} -exports.normalize = normalize; - -/** - * Joins two paths/URLs. - * - * @param aRoot The root path or URL. - * @param aPath The path or URL to be joined with the root. - * - * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a - * scheme-relative URL: Then the scheme of aRoot, if any, is prepended - * first. - * - Otherwise aPath is a path. If aRoot is a URL, then its path portion - * is updated with the result and aRoot is returned. Otherwise the result - * is returned. - * - If aPath is absolute, the result is aPath. - * - Otherwise the two paths are joined with a slash. - * - Joining for example 'http://' and 'www.example.com' is also supported. - */ -function join(aRoot, aPath) { - if (aRoot === "") { - aRoot = "."; - } - if (aPath === "") { - aPath = "."; - } - var aPathUrl = urlParse(aPath); - var aRootUrl = urlParse(aRoot); - if (aRootUrl) { - aRoot = aRootUrl.path || '/'; - } - - // `join(foo, '//www.example.org')` - if (aPathUrl && !aPathUrl.scheme) { - if (aRootUrl) { - aPathUrl.scheme = aRootUrl.scheme; - } - return urlGenerate(aPathUrl); - } - - if (aPathUrl || aPath.match(dataUrlRegexp)) { - return aPath; - } - - // `join('http://', 'www.example.com')` - if (aRootUrl && !aRootUrl.host && !aRootUrl.path) { - aRootUrl.host = aPath; - return urlGenerate(aRootUrl); - } - - var joined = aPath.charAt(0) === '/' - ? aPath - : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath); - - if (aRootUrl) { - aRootUrl.path = joined; - return urlGenerate(aRootUrl); - } - return joined; -} -exports.join = join; - -exports.isAbsolute = function (aPath) { - return aPath.charAt(0) === '/' || !!aPath.match(urlRegexp); -}; - -/** - * Make a path relative to a URL or another path. - * - * @param aRoot The root path or URL. - * @param aPath The path or URL to be made relative to aRoot. - */ -function relative(aRoot, aPath) { - if (aRoot === "") { - aRoot = "."; - } - - aRoot = aRoot.replace(/\/$/, ''); - - // It is possible for the path to be above the root. In this case, simply - // checking whether the root is a prefix of the path won't work. Instead, we - // need to remove components from the root one by one, until either we find - // a prefix that fits, or we run out of components to remove. - var level = 0; - while (aPath.indexOf(aRoot + '/') !== 0) { - var index = aRoot.lastIndexOf("/"); - if (index < 0) { - return aPath; - } - - // If the only part of the root that is left is the scheme (i.e. http://, - // file:///, etc.), one or more slashes (/), or simply nothing at all, we - // have exhausted all components, so the path is not relative to the root. - aRoot = aRoot.slice(0, index); - if (aRoot.match(/^([^\/]+:\/)?\/*$/)) { - return aPath; - } - - ++level; - } - - // Make sure we add a "../" for each component we removed from the root. - return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1); -} -exports.relative = relative; - -var supportsNullProto = (function () { - var obj = Object.create(null); - return !('__proto__' in obj); -}()); - -function identity (s) { - return s; -} - -/** - * Because behavior goes wacky when you set `__proto__` on objects, we - * have to prefix all the strings in our set with an arbitrary character. - * - * See https://github.com/mozilla/source-map/pull/31 and - * https://github.com/mozilla/source-map/issues/30 - * - * @param String aStr - */ -function toSetString(aStr) { - if (isProtoString(aStr)) { - return '$' + aStr; - } - - return aStr; -} -exports.toSetString = supportsNullProto ? identity : toSetString; - -function fromSetString(aStr) { - if (isProtoString(aStr)) { - return aStr.slice(1); - } - - return aStr; -} -exports.fromSetString = supportsNullProto ? identity : fromSetString; - -function isProtoString(s) { - if (!s) { - return false; - } - - var length = s.length; - - if (length < 9 /* "__proto__".length */) { - return false; - } - - if (s.charCodeAt(length - 1) !== 95 /* '_' */ || - s.charCodeAt(length - 2) !== 95 /* '_' */ || - s.charCodeAt(length - 3) !== 111 /* 'o' */ || - s.charCodeAt(length - 4) !== 116 /* 't' */ || - s.charCodeAt(length - 5) !== 111 /* 'o' */ || - s.charCodeAt(length - 6) !== 114 /* 'r' */ || - s.charCodeAt(length - 7) !== 112 /* 'p' */ || - s.charCodeAt(length - 8) !== 95 /* '_' */ || - s.charCodeAt(length - 9) !== 95 /* '_' */) { - return false; - } - - for (var i = length - 10; i >= 0; i--) { - if (s.charCodeAt(i) !== 36 /* '$' */) { - return false; - } - } - - return true; -} - -/** - * Comparator between two mappings where the original positions are compared. - * - * Optionally pass in `true` as `onlyCompareGenerated` to consider two - * mappings with the same original source/line/column, but different generated - * line and column the same. Useful when searching for a mapping with a - * stubbed out mapping. - */ -function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) { - var cmp = mappingA.source - mappingB.source; - if (cmp !== 0) { - return cmp; - } - - cmp = mappingA.originalLine - mappingB.originalLine; - if (cmp !== 0) { - return cmp; - } - - cmp = mappingA.originalColumn - mappingB.originalColumn; - if (cmp !== 0 || onlyCompareOriginal) { - return cmp; - } - - cmp = mappingA.generatedColumn - mappingB.generatedColumn; - if (cmp !== 0) { - return cmp; - } - - cmp = mappingA.generatedLine - mappingB.generatedLine; - if (cmp !== 0) { - return cmp; - } - - return mappingA.name - mappingB.name; -} -exports.compareByOriginalPositions = compareByOriginalPositions; - -/** - * Comparator between two mappings with deflated source and name indices where - * the generated positions are compared. - * - * Optionally pass in `true` as `onlyCompareGenerated` to consider two - * mappings with the same generated line and column, but different - * source/name/original line and column the same. Useful when searching for a - * mapping with a stubbed out mapping. - */ -function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) { - var cmp = mappingA.generatedLine - mappingB.generatedLine; - if (cmp !== 0) { - return cmp; - } - - cmp = mappingA.generatedColumn - mappingB.generatedColumn; - if (cmp !== 0 || onlyCompareGenerated) { - return cmp; - } - - cmp = mappingA.source - mappingB.source; - if (cmp !== 0) { - return cmp; - } - - cmp = mappingA.originalLine - mappingB.originalLine; - if (cmp !== 0) { - return cmp; - } - - cmp = mappingA.originalColumn - mappingB.originalColumn; - if (cmp !== 0) { - return cmp; - } - - return mappingA.name - mappingB.name; -} -exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated; - -function strcmp(aStr1, aStr2) { - if (aStr1 === aStr2) { - return 0; - } - - if (aStr1 > aStr2) { - return 1; - } - - return -1; -} - -/** - * Comparator between two mappings with inflated source and name strings where - * the generated positions are compared. - */ -function compareByGeneratedPositionsInflated(mappingA, mappingB) { - var cmp = mappingA.generatedLine - mappingB.generatedLine; - if (cmp !== 0) { - return cmp; - } - - cmp = mappingA.generatedColumn - mappingB.generatedColumn; - if (cmp !== 0) { - return cmp; - } - - cmp = strcmp(mappingA.source, mappingB.source); - if (cmp !== 0) { - return cmp; - } - - cmp = mappingA.originalLine - mappingB.originalLine; - if (cmp !== 0) { - return cmp; - } - - cmp = mappingA.originalColumn - mappingB.originalColumn; - if (cmp !== 0) { - return cmp; - } - - return strcmp(mappingA.name, mappingB.name); -} -exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated; - - -/***/ }), -/* 169 */ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ - -var util = __webpack_require__(168); -var has = Object.prototype.hasOwnProperty; -var hasNativeMap = typeof Map !== "undefined"; - -/** - * A data structure which is a combination of an array and a set. Adding a new - * member is O(1), testing for membership is O(1), and finding the index of an - * element is O(1). Removing elements from the set is not supported. Only - * strings are supported for membership. - */ -function ArraySet() { - this._array = []; - this._set = hasNativeMap ? new Map() : Object.create(null); -} - -/** - * Static method for creating ArraySet instances from an existing array. - */ -ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) { - var set = new ArraySet(); - for (var i = 0, len = aArray.length; i < len; i++) { - set.add(aArray[i], aAllowDuplicates); - } - return set; -}; - -/** - * Return how many unique items are in this ArraySet. If duplicates have been - * added, than those do not count towards the size. - * - * @returns Number - */ -ArraySet.prototype.size = function ArraySet_size() { - return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length; -}; - -/** - * Add the given string to this set. - * - * @param String aStr - */ -ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) { - var sStr = hasNativeMap ? aStr : util.toSetString(aStr); - var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr); - var idx = this._array.length; - if (!isDuplicate || aAllowDuplicates) { - this._array.push(aStr); - } - if (!isDuplicate) { - if (hasNativeMap) { - this._set.set(aStr, idx); - } else { - this._set[sStr] = idx; - } - } -}; - -/** - * Is the given string a member of this set? - * - * @param String aStr - */ -ArraySet.prototype.has = function ArraySet_has(aStr) { - if (hasNativeMap) { - return this._set.has(aStr); - } else { - var sStr = util.toSetString(aStr); - return has.call(this._set, sStr); - } -}; - -/** - * What is the index of the given string in the array? - * - * @param String aStr - */ -ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) { - if (hasNativeMap) { - var idx = this._set.get(aStr); - if (idx >= 0) { - return idx; - } - } else { - var sStr = util.toSetString(aStr); - if (has.call(this._set, sStr)) { - return this._set[sStr]; - } - } - - throw new Error('"' + aStr + '" is not in the set.'); -}; - -/** - * What is the element at the given index? - * - * @param Number aIdx - */ -ArraySet.prototype.at = function ArraySet_at(aIdx) { - if (aIdx >= 0 && aIdx < this._array.length) { - return this._array[aIdx]; - } - throw new Error('No element indexed by ' + aIdx); -}; - -/** - * Returns the array representation of this set (which has the proper indices - * indicated by indexOf). Note that this is a copy of the internal array used - * for storing the members so that no one can mess with internal state. - */ -ArraySet.prototype.toArray = function ArraySet_toArray() { - return this._array.slice(); -}; - -exports.ArraySet = ArraySet; - - -/***/ }), -/* 170 */ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2014 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ - -var util = __webpack_require__(168); - -/** - * Determine whether mappingB is after mappingA with respect to generated - * position. - */ -function generatedPositionAfter(mappingA, mappingB) { - // Optimized for most common case - var lineA = mappingA.generatedLine; - var lineB = mappingB.generatedLine; - var columnA = mappingA.generatedColumn; - var columnB = mappingB.generatedColumn; - return lineB > lineA || lineB == lineA && columnB >= columnA || - util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0; -} - -/** - * A data structure to provide a sorted view of accumulated mappings in a - * performance conscious manner. It trades a neglibable overhead in general - * case for a large speedup in case of mappings being added in order. - */ -function MappingList() { - this._array = []; - this._sorted = true; - // Serves as infimum - this._last = {generatedLine: -1, generatedColumn: 0}; -} - -/** - * Iterate through internal items. This method takes the same arguments that - * `Array.prototype.forEach` takes. - * - * NOTE: The order of the mappings is NOT guaranteed. - */ -MappingList.prototype.unsortedForEach = - function MappingList_forEach(aCallback, aThisArg) { - this._array.forEach(aCallback, aThisArg); - }; - -/** - * Add the given source mapping. - * - * @param Object aMapping - */ -MappingList.prototype.add = function MappingList_add(aMapping) { - if (generatedPositionAfter(this._last, aMapping)) { - this._last = aMapping; - this._array.push(aMapping); - } else { - this._sorted = false; - this._array.push(aMapping); - } -}; - -/** - * Returns the flat, sorted array of mappings. The mappings are sorted by - * generated position. - * - * WARNING: This method returns internal data without copying, for - * performance. The return value must NOT be mutated, and should be treated as - * an immutable borrow. If you want to take ownership, you must make your own - * copy. - */ -MappingList.prototype.toArray = function MappingList_toArray() { - if (!this._sorted) { - this._array.sort(util.compareByGeneratedPositionsInflated); - this._sorted = true; - } - return this._array; -}; - -exports.MappingList = MappingList; - - -/***/ }), -/* 171 */ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ - -var util = __webpack_require__(168); -var binarySearch = __webpack_require__(172); -var ArraySet = (__webpack_require__(169).ArraySet); -var base64VLQ = __webpack_require__(166); -var quickSort = (__webpack_require__(173).quickSort); - -function SourceMapConsumer(aSourceMap) { - var sourceMap = aSourceMap; - if (typeof aSourceMap === 'string') { - sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); - } - - return sourceMap.sections != null - ? new IndexedSourceMapConsumer(sourceMap) - : new BasicSourceMapConsumer(sourceMap); -} - -SourceMapConsumer.fromSourceMap = function(aSourceMap) { - return BasicSourceMapConsumer.fromSourceMap(aSourceMap); -} - -/** - * The version of the source mapping spec that we are consuming. - */ -SourceMapConsumer.prototype._version = 3; - -// `__generatedMappings` and `__originalMappings` are arrays that hold the -// parsed mapping coordinates from the source map's "mappings" attribute. They -// are lazily instantiated, accessed via the `_generatedMappings` and -// `_originalMappings` getters respectively, and we only parse the mappings -// and create these arrays once queried for a source location. We jump through -// these hoops because there can be many thousands of mappings, and parsing -// them is expensive, so we only want to do it if we must. -// -// Each object in the arrays is of the form: -// -// { -// generatedLine: The line number in the generated code, -// generatedColumn: The column number in the generated code, -// source: The path to the original source file that generated this -// chunk of code, -// originalLine: The line number in the original source that -// corresponds to this chunk of generated code, -// originalColumn: The column number in the original source that -// corresponds to this chunk of generated code, -// name: The name of the original symbol which generated this chunk of -// code. -// } -// -// All properties except for `generatedLine` and `generatedColumn` can be -// `null`. -// -// `_generatedMappings` is ordered by the generated positions. -// -// `_originalMappings` is ordered by the original positions. - -SourceMapConsumer.prototype.__generatedMappings = null; -Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', { - get: function () { - if (!this.__generatedMappings) { - this._parseMappings(this._mappings, this.sourceRoot); - } - - return this.__generatedMappings; - } -}); - -SourceMapConsumer.prototype.__originalMappings = null; -Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', { - get: function () { - if (!this.__originalMappings) { - this._parseMappings(this._mappings, this.sourceRoot); - } - - return this.__originalMappings; - } -}); - -SourceMapConsumer.prototype._charIsMappingSeparator = - function SourceMapConsumer_charIsMappingSeparator(aStr, index) { - var c = aStr.charAt(index); - return c === ";" || c === ","; - }; - -/** - * Parse the mappings in a string in to a data structure which we can easily - * query (the ordered arrays in the `this.__generatedMappings` and - * `this.__originalMappings` properties). - */ -SourceMapConsumer.prototype._parseMappings = - function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { - throw new Error("Subclasses must implement _parseMappings"); - }; - -SourceMapConsumer.GENERATED_ORDER = 1; -SourceMapConsumer.ORIGINAL_ORDER = 2; - -SourceMapConsumer.GREATEST_LOWER_BOUND = 1; -SourceMapConsumer.LEAST_UPPER_BOUND = 2; - -/** - * Iterate over each mapping between an original source/line/column and a - * generated line/column in this source map. - * - * @param Function aCallback - * The function that is called with each mapping. - * @param Object aContext - * Optional. If specified, this object will be the value of `this` every - * time that `aCallback` is called. - * @param aOrder - * Either `SourceMapConsumer.GENERATED_ORDER` or - * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to - * iterate over the mappings sorted by the generated file's line/column - * order or the original's source/line/column order, respectively. Defaults to - * `SourceMapConsumer.GENERATED_ORDER`. - */ -SourceMapConsumer.prototype.eachMapping = - function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) { - var context = aContext || null; - var order = aOrder || SourceMapConsumer.GENERATED_ORDER; - - var mappings; - switch (order) { - case SourceMapConsumer.GENERATED_ORDER: - mappings = this._generatedMappings; - break; - case SourceMapConsumer.ORIGINAL_ORDER: - mappings = this._originalMappings; - break; - default: - throw new Error("Unknown order of iteration."); - } - - var sourceRoot = this.sourceRoot; - mappings.map(function (mapping) { - var source = mapping.source === null ? null : this._sources.at(mapping.source); - if (source != null && sourceRoot != null) { - source = util.join(sourceRoot, source); - } - return { - source: source, - generatedLine: mapping.generatedLine, - generatedColumn: mapping.generatedColumn, - originalLine: mapping.originalLine, - originalColumn: mapping.originalColumn, - name: mapping.name === null ? null : this._names.at(mapping.name) - }; - }, this).forEach(aCallback, context); - }; - -/** - * Returns all generated line and column information for the original source, - * line, and column provided. If no column is provided, returns all mappings - * corresponding to a either the line we are searching for or the next - * closest line that has any mappings. Otherwise, returns all mappings - * corresponding to the given line and either the column we are searching for - * or the next closest column that has any offsets. - * - * The only argument is an object with the following properties: - * - * - source: The filename of the original source. - * - line: The line number in the original source. - * - column: Optional. the column number in the original source. - * - * and an array of objects is returned, each with the following properties: - * - * - line: The line number in the generated source, or null. - * - column: The column number in the generated source, or null. - */ -SourceMapConsumer.prototype.allGeneratedPositionsFor = - function SourceMapConsumer_allGeneratedPositionsFor(aArgs) { - var line = util.getArg(aArgs, 'line'); - - // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping - // returns the index of the closest mapping less than the needle. By - // setting needle.originalColumn to 0, we thus find the last mapping for - // the given line, provided such a mapping exists. - var needle = { - source: util.getArg(aArgs, 'source'), - originalLine: line, - originalColumn: util.getArg(aArgs, 'column', 0) - }; - - if (this.sourceRoot != null) { - needle.source = util.relative(this.sourceRoot, needle.source); - } - if (!this._sources.has(needle.source)) { - return []; - } - needle.source = this._sources.indexOf(needle.source); - - var mappings = []; - - var index = this._findMapping(needle, - this._originalMappings, - "originalLine", - "originalColumn", - util.compareByOriginalPositions, - binarySearch.LEAST_UPPER_BOUND); - if (index >= 0) { - var mapping = this._originalMappings[index]; - - if (aArgs.column === undefined) { - var originalLine = mapping.originalLine; - - // Iterate until either we run out of mappings, or we run into - // a mapping for a different line than the one we found. Since - // mappings are sorted, this is guaranteed to find all mappings for - // the line we found. - while (mapping && mapping.originalLine === originalLine) { - mappings.push({ - line: util.getArg(mapping, 'generatedLine', null), - column: util.getArg(mapping, 'generatedColumn', null), - lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) - }); - - mapping = this._originalMappings[++index]; - } - } else { - var originalColumn = mapping.originalColumn; - - // Iterate until either we run out of mappings, or we run into - // a mapping for a different line than the one we were searching for. - // Since mappings are sorted, this is guaranteed to find all mappings for - // the line we are searching for. - while (mapping && - mapping.originalLine === line && - mapping.originalColumn == originalColumn) { - mappings.push({ - line: util.getArg(mapping, 'generatedLine', null), - column: util.getArg(mapping, 'generatedColumn', null), - lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) - }); - - mapping = this._originalMappings[++index]; - } - } - } - - return mappings; - }; - -exports.SourceMapConsumer = SourceMapConsumer; - -/** - * A BasicSourceMapConsumer instance represents a parsed source map which we can - * query for information about the original file positions by giving it a file - * position in the generated source. - * - * The only parameter is the raw source map (either as a JSON string, or - * already parsed to an object). According to the spec, source maps have the - * following attributes: - * - * - version: Which version of the source map spec this map is following. - * - sources: An array of URLs to the original source files. - * - names: An array of identifiers which can be referrenced by individual mappings. - * - sourceRoot: Optional. The URL root from which all sources are relative. - * - sourcesContent: Optional. An array of contents of the original source files. - * - mappings: A string of base64 VLQs which contain the actual mappings. - * - file: Optional. The generated file this source map is associated with. - * - * Here is an example source map, taken from the source map spec[0]: - * - * { - * version : 3, - * file: "out.js", - * sourceRoot : "", - * sources: ["foo.js", "bar.js"], - * names: ["src", "maps", "are", "fun"], - * mappings: "AA,AB;;ABCDE;" - * } - * - * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1# - */ -function BasicSourceMapConsumer(aSourceMap) { - var sourceMap = aSourceMap; - if (typeof aSourceMap === 'string') { - sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); - } - - var version = util.getArg(sourceMap, 'version'); - var sources = util.getArg(sourceMap, 'sources'); - // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which - // requires the array) to play nice here. - var names = util.getArg(sourceMap, 'names', []); - var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null); - var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null); - var mappings = util.getArg(sourceMap, 'mappings'); - var file = util.getArg(sourceMap, 'file', null); - - // Once again, Sass deviates from the spec and supplies the version as a - // string rather than a number, so we use loose equality checking here. - if (version != this._version) { - throw new Error('Unsupported version: ' + version); - } - - sources = sources - .map(String) - // Some source maps produce relative source paths like "./foo.js" instead of - // "foo.js". Normalize these first so that future comparisons will succeed. - // See bugzil.la/1090768. - .map(util.normalize) - // Always ensure that absolute sources are internally stored relative to - // the source root, if the source root is absolute. Not doing this would - // be particularly problematic when the source root is a prefix of the - // source (valid, but why??). See github issue #199 and bugzil.la/1188982. - .map(function (source) { - return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source) - ? util.relative(sourceRoot, source) - : source; - }); - - // Pass `true` below to allow duplicate names and sources. While source maps - // are intended to be compressed and deduplicated, the TypeScript compiler - // sometimes generates source maps with duplicates in them. See Github issue - // #72 and bugzil.la/889492. - this._names = ArraySet.fromArray(names.map(String), true); - this._sources = ArraySet.fromArray(sources, true); - - this.sourceRoot = sourceRoot; - this.sourcesContent = sourcesContent; - this._mappings = mappings; - this.file = file; -} - -BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); -BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer; - -/** - * Create a BasicSourceMapConsumer from a SourceMapGenerator. - * - * @param SourceMapGenerator aSourceMap - * The source map that will be consumed. - * @returns BasicSourceMapConsumer - */ -BasicSourceMapConsumer.fromSourceMap = - function SourceMapConsumer_fromSourceMap(aSourceMap) { - var smc = Object.create(BasicSourceMapConsumer.prototype); - - var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true); - var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true); - smc.sourceRoot = aSourceMap._sourceRoot; - smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(), - smc.sourceRoot); - smc.file = aSourceMap._file; - - // Because we are modifying the entries (by converting string sources and - // names to indices into the sources and names ArraySets), we have to make - // a copy of the entry or else bad things happen. Shared mutable state - // strikes again! See github issue #191. - - var generatedMappings = aSourceMap._mappings.toArray().slice(); - var destGeneratedMappings = smc.__generatedMappings = []; - var destOriginalMappings = smc.__originalMappings = []; - - for (var i = 0, length = generatedMappings.length; i < length; i++) { - var srcMapping = generatedMappings[i]; - var destMapping = new Mapping; - destMapping.generatedLine = srcMapping.generatedLine; - destMapping.generatedColumn = srcMapping.generatedColumn; - - if (srcMapping.source) { - destMapping.source = sources.indexOf(srcMapping.source); - destMapping.originalLine = srcMapping.originalLine; - destMapping.originalColumn = srcMapping.originalColumn; - - if (srcMapping.name) { - destMapping.name = names.indexOf(srcMapping.name); - } - - destOriginalMappings.push(destMapping); - } - - destGeneratedMappings.push(destMapping); - } - - quickSort(smc.__originalMappings, util.compareByOriginalPositions); - - return smc; - }; - -/** - * The version of the source mapping spec that we are consuming. - */ -BasicSourceMapConsumer.prototype._version = 3; - -/** - * The list of original sources. - */ -Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', { - get: function () { - return this._sources.toArray().map(function (s) { - return this.sourceRoot != null ? util.join(this.sourceRoot, s) : s; - }, this); - } -}); - -/** - * Provide the JIT with a nice shape / hidden class. - */ -function Mapping() { - this.generatedLine = 0; - this.generatedColumn = 0; - this.source = null; - this.originalLine = null; - this.originalColumn = null; - this.name = null; -} - -/** - * Parse the mappings in a string in to a data structure which we can easily - * query (the ordered arrays in the `this.__generatedMappings` and - * `this.__originalMappings` properties). - */ -BasicSourceMapConsumer.prototype._parseMappings = - function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { - var generatedLine = 1; - var previousGeneratedColumn = 0; - var previousOriginalLine = 0; - var previousOriginalColumn = 0; - var previousSource = 0; - var previousName = 0; - var length = aStr.length; - var index = 0; - var cachedSegments = {}; - var temp = {}; - var originalMappings = []; - var generatedMappings = []; - var mapping, str, segment, end, value; - - while (index < length) { - if (aStr.charAt(index) === ';') { - generatedLine++; - index++; - previousGeneratedColumn = 0; - } - else if (aStr.charAt(index) === ',') { - index++; - } - else { - mapping = new Mapping(); - mapping.generatedLine = generatedLine; - - // Because each offset is encoded relative to the previous one, - // many segments often have the same encoding. We can exploit this - // fact by caching the parsed variable length fields of each segment, - // allowing us to avoid a second parse if we encounter the same - // segment again. - for (end = index; end < length; end++) { - if (this._charIsMappingSeparator(aStr, end)) { - break; - } - } - str = aStr.slice(index, end); - - segment = cachedSegments[str]; - if (segment) { - index += str.length; - } else { - segment = []; - while (index < end) { - base64VLQ.decode(aStr, index, temp); - value = temp.value; - index = temp.rest; - segment.push(value); - } - - if (segment.length === 2) { - throw new Error('Found a source, but no line and column'); - } - - if (segment.length === 3) { - throw new Error('Found a source and line, but no column'); - } - - cachedSegments[str] = segment; - } - - // Generated column. - mapping.generatedColumn = previousGeneratedColumn + segment[0]; - previousGeneratedColumn = mapping.generatedColumn; - - if (segment.length > 1) { - // Original source. - mapping.source = previousSource + segment[1]; - previousSource += segment[1]; - - // Original line. - mapping.originalLine = previousOriginalLine + segment[2]; - previousOriginalLine = mapping.originalLine; - // Lines are stored 0-based - mapping.originalLine += 1; - - // Original column. - mapping.originalColumn = previousOriginalColumn + segment[3]; - previousOriginalColumn = mapping.originalColumn; - - if (segment.length > 4) { - // Original name. - mapping.name = previousName + segment[4]; - previousName += segment[4]; - } - } - - generatedMappings.push(mapping); - if (typeof mapping.originalLine === 'number') { - originalMappings.push(mapping); - } - } - } - - quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated); - this.__generatedMappings = generatedMappings; - - quickSort(originalMappings, util.compareByOriginalPositions); - this.__originalMappings = originalMappings; - }; - -/** - * Find the mapping that best matches the hypothetical "needle" mapping that - * we are searching for in the given "haystack" of mappings. - */ -BasicSourceMapConsumer.prototype._findMapping = - function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName, - aColumnName, aComparator, aBias) { - // To return the position we are searching for, we must first find the - // mapping for the given position and then return the opposite position it - // points to. Because the mappings are sorted, we can use binary search to - // find the best mapping. - - if (aNeedle[aLineName] <= 0) { - throw new TypeError('Line must be greater than or equal to 1, got ' - + aNeedle[aLineName]); - } - if (aNeedle[aColumnName] < 0) { - throw new TypeError('Column must be greater than or equal to 0, got ' - + aNeedle[aColumnName]); - } - - return binarySearch.search(aNeedle, aMappings, aComparator, aBias); - }; - -/** - * Compute the last column for each generated mapping. The last column is - * inclusive. - */ -BasicSourceMapConsumer.prototype.computeColumnSpans = - function SourceMapConsumer_computeColumnSpans() { - for (var index = 0; index < this._generatedMappings.length; ++index) { - var mapping = this._generatedMappings[index]; - - // Mappings do not contain a field for the last generated columnt. We - // can come up with an optimistic estimate, however, by assuming that - // mappings are contiguous (i.e. given two consecutive mappings, the - // first mapping ends where the second one starts). - if (index + 1 < this._generatedMappings.length) { - var nextMapping = this._generatedMappings[index + 1]; - - if (mapping.generatedLine === nextMapping.generatedLine) { - mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1; - continue; - } - } - - // The last mapping for each line spans the entire line. - mapping.lastGeneratedColumn = Infinity; - } - }; - -/** - * Returns the original source, line, and column information for the generated - * source's line and column positions provided. The only argument is an object - * with the following properties: - * - * - line: The line number in the generated source. - * - column: The column number in the generated source. - * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or - * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the - * closest element that is smaller than or greater than the one we are - * searching for, respectively, if the exact element cannot be found. - * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. - * - * and an object is returned with the following properties: - * - * - source: The original source file, or null. - * - line: The line number in the original source, or null. - * - column: The column number in the original source, or null. - * - name: The original identifier, or null. - */ -BasicSourceMapConsumer.prototype.originalPositionFor = - function SourceMapConsumer_originalPositionFor(aArgs) { - var needle = { - generatedLine: util.getArg(aArgs, 'line'), - generatedColumn: util.getArg(aArgs, 'column') - }; - - var index = this._findMapping( - needle, - this._generatedMappings, - "generatedLine", - "generatedColumn", - util.compareByGeneratedPositionsDeflated, - util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND) - ); - - if (index >= 0) { - var mapping = this._generatedMappings[index]; - - if (mapping.generatedLine === needle.generatedLine) { - var source = util.getArg(mapping, 'source', null); - if (source !== null) { - source = this._sources.at(source); - if (this.sourceRoot != null) { - source = util.join(this.sourceRoot, source); - } - } - var name = util.getArg(mapping, 'name', null); - if (name !== null) { - name = this._names.at(name); - } - return { - source: source, - line: util.getArg(mapping, 'originalLine', null), - column: util.getArg(mapping, 'originalColumn', null), - name: name - }; - } - } - - return { - source: null, - line: null, - column: null, - name: null - }; - }; - -/** - * Return true if we have the source content for every source in the source - * map, false otherwise. - */ -BasicSourceMapConsumer.prototype.hasContentsOfAllSources = - function BasicSourceMapConsumer_hasContentsOfAllSources() { - if (!this.sourcesContent) { - return false; - } - return this.sourcesContent.length >= this._sources.size() && - !this.sourcesContent.some(function (sc) { return sc == null; }); - }; - -/** - * Returns the original source content. The only argument is the url of the - * original source file. Returns null if no original source content is - * available. - */ -BasicSourceMapConsumer.prototype.sourceContentFor = - function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { - if (!this.sourcesContent) { - return null; - } - - if (this.sourceRoot != null) { - aSource = util.relative(this.sourceRoot, aSource); - } - - if (this._sources.has(aSource)) { - return this.sourcesContent[this._sources.indexOf(aSource)]; - } - - var url; - if (this.sourceRoot != null - && (url = util.urlParse(this.sourceRoot))) { - // XXX: file:// URIs and absolute paths lead to unexpected behavior for - // many users. We can help them out when they expect file:// URIs to - // behave like it would if they were running a local HTTP server. See - // https://bugzilla.mozilla.org/show_bug.cgi?id=885597. - var fileUriAbsPath = aSource.replace(/^file:\/\//, ""); - if (url.scheme == "file" - && this._sources.has(fileUriAbsPath)) { - return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)] - } - - if ((!url.path || url.path == "/") - && this._sources.has("/" + aSource)) { - return this.sourcesContent[this._sources.indexOf("/" + aSource)]; - } - } - - // This function is used recursively from - // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we - // don't want to throw if we can't find the source - we just want to - // return null, so we provide a flag to exit gracefully. - if (nullOnMissing) { - return null; - } - else { - throw new Error('"' + aSource + '" is not in the SourceMap.'); - } - }; - -/** - * Returns the generated line and column information for the original source, - * line, and column positions provided. The only argument is an object with - * the following properties: - * - * - source: The filename of the original source. - * - line: The line number in the original source. - * - column: The column number in the original source. - * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or - * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the - * closest element that is smaller than or greater than the one we are - * searching for, respectively, if the exact element cannot be found. - * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. - * - * and an object is returned with the following properties: - * - * - line: The line number in the generated source, or null. - * - column: The column number in the generated source, or null. - */ -BasicSourceMapConsumer.prototype.generatedPositionFor = - function SourceMapConsumer_generatedPositionFor(aArgs) { - var source = util.getArg(aArgs, 'source'); - if (this.sourceRoot != null) { - source = util.relative(this.sourceRoot, source); - } - if (!this._sources.has(source)) { - return { - line: null, - column: null, - lastColumn: null - }; - } - source = this._sources.indexOf(source); - - var needle = { - source: source, - originalLine: util.getArg(aArgs, 'line'), - originalColumn: util.getArg(aArgs, 'column') - }; - - var index = this._findMapping( - needle, - this._originalMappings, - "originalLine", - "originalColumn", - util.compareByOriginalPositions, - util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND) - ); - - if (index >= 0) { - var mapping = this._originalMappings[index]; - - if (mapping.source === needle.source) { - return { - line: util.getArg(mapping, 'generatedLine', null), - column: util.getArg(mapping, 'generatedColumn', null), - lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) - }; - } - } - - return { - line: null, - column: null, - lastColumn: null - }; - }; - -exports.BasicSourceMapConsumer = BasicSourceMapConsumer; - -/** - * An IndexedSourceMapConsumer instance represents a parsed source map which - * we can query for information. It differs from BasicSourceMapConsumer in - * that it takes "indexed" source maps (i.e. ones with a "sections" field) as - * input. - * - * The only parameter is a raw source map (either as a JSON string, or already - * parsed to an object). According to the spec for indexed source maps, they - * have the following attributes: - * - * - version: Which version of the source map spec this map is following. - * - file: Optional. The generated file this source map is associated with. - * - sections: A list of section definitions. - * - * Each value under the "sections" field has two fields: - * - offset: The offset into the original specified at which this section - * begins to apply, defined as an object with a "line" and "column" - * field. - * - map: A source map definition. This source map could also be indexed, - * but doesn't have to be. - * - * Instead of the "map" field, it's also possible to have a "url" field - * specifying a URL to retrieve a source map from, but that's currently - * unsupported. - * - * Here's an example source map, taken from the source map spec[0], but - * modified to omit a section which uses the "url" field. - * - * { - * version : 3, - * file: "app.js", - * sections: [{ - * offset: {line:100, column:10}, - * map: { - * version : 3, - * file: "section.js", - * sources: ["foo.js", "bar.js"], - * names: ["src", "maps", "are", "fun"], - * mappings: "AAAA,E;;ABCDE;" - * } - * }], - * } - * - * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt - */ -function IndexedSourceMapConsumer(aSourceMap) { - var sourceMap = aSourceMap; - if (typeof aSourceMap === 'string') { - sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); - } - - var version = util.getArg(sourceMap, 'version'); - var sections = util.getArg(sourceMap, 'sections'); - - if (version != this._version) { - throw new Error('Unsupported version: ' + version); - } - - this._sources = new ArraySet(); - this._names = new ArraySet(); - - var lastOffset = { - line: -1, - column: 0 - }; - this._sections = sections.map(function (s) { - if (s.url) { - // The url field will require support for asynchronicity. - // See https://github.com/mozilla/source-map/issues/16 - throw new Error('Support for url field in sections not implemented.'); - } - var offset = util.getArg(s, 'offset'); - var offsetLine = util.getArg(offset, 'line'); - var offsetColumn = util.getArg(offset, 'column'); - - if (offsetLine < lastOffset.line || - (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) { - throw new Error('Section offsets must be ordered and non-overlapping.'); - } - lastOffset = offset; - - return { - generatedOffset: { - // The offset fields are 0-based, but we use 1-based indices when - // encoding/decoding from VLQ. - generatedLine: offsetLine + 1, - generatedColumn: offsetColumn + 1 - }, - consumer: new SourceMapConsumer(util.getArg(s, 'map')) - } - }); -} - -IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); -IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer; - -/** - * The version of the source mapping spec that we are consuming. - */ -IndexedSourceMapConsumer.prototype._version = 3; - -/** - * The list of original sources. - */ -Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', { - get: function () { - var sources = []; - for (var i = 0; i < this._sections.length; i++) { - for (var j = 0; j < this._sections[i].consumer.sources.length; j++) { - sources.push(this._sections[i].consumer.sources[j]); - } - } - return sources; - } -}); - -/** - * Returns the original source, line, and column information for the generated - * source's line and column positions provided. The only argument is an object - * with the following properties: - * - * - line: The line number in the generated source. - * - column: The column number in the generated source. - * - * and an object is returned with the following properties: - * - * - source: The original source file, or null. - * - line: The line number in the original source, or null. - * - column: The column number in the original source, or null. - * - name: The original identifier, or null. - */ -IndexedSourceMapConsumer.prototype.originalPositionFor = - function IndexedSourceMapConsumer_originalPositionFor(aArgs) { - var needle = { - generatedLine: util.getArg(aArgs, 'line'), - generatedColumn: util.getArg(aArgs, 'column') - }; - - // Find the section containing the generated position we're trying to map - // to an original position. - var sectionIndex = binarySearch.search(needle, this._sections, - function(needle, section) { - var cmp = needle.generatedLine - section.generatedOffset.generatedLine; - if (cmp) { - return cmp; - } - - return (needle.generatedColumn - - section.generatedOffset.generatedColumn); - }); - var section = this._sections[sectionIndex]; - - if (!section) { - return { - source: null, - line: null, - column: null, - name: null - }; - } - - return section.consumer.originalPositionFor({ - line: needle.generatedLine - - (section.generatedOffset.generatedLine - 1), - column: needle.generatedColumn - - (section.generatedOffset.generatedLine === needle.generatedLine - ? section.generatedOffset.generatedColumn - 1 - : 0), - bias: aArgs.bias - }); - }; - -/** - * Return true if we have the source content for every source in the source - * map, false otherwise. - */ -IndexedSourceMapConsumer.prototype.hasContentsOfAllSources = - function IndexedSourceMapConsumer_hasContentsOfAllSources() { - return this._sections.every(function (s) { - return s.consumer.hasContentsOfAllSources(); - }); - }; - -/** - * Returns the original source content. The only argument is the url of the - * original source file. Returns null if no original source content is - * available. - */ -IndexedSourceMapConsumer.prototype.sourceContentFor = - function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { - for (var i = 0; i < this._sections.length; i++) { - var section = this._sections[i]; - - var content = section.consumer.sourceContentFor(aSource, true); - if (content) { - return content; - } - } - if (nullOnMissing) { - return null; - } - else { - throw new Error('"' + aSource + '" is not in the SourceMap.'); - } - }; - -/** - * Returns the generated line and column information for the original source, - * line, and column positions provided. The only argument is an object with - * the following properties: - * - * - source: The filename of the original source. - * - line: The line number in the original source. - * - column: The column number in the original source. - * - * and an object is returned with the following properties: - * - * - line: The line number in the generated source, or null. - * - column: The column number in the generated source, or null. - */ -IndexedSourceMapConsumer.prototype.generatedPositionFor = - function IndexedSourceMapConsumer_generatedPositionFor(aArgs) { - for (var i = 0; i < this._sections.length; i++) { - var section = this._sections[i]; - - // Only consider this section if the requested source is in the list of - // sources of the consumer. - if (section.consumer.sources.indexOf(util.getArg(aArgs, 'source')) === -1) { - continue; - } - var generatedPosition = section.consumer.generatedPositionFor(aArgs); - if (generatedPosition) { - var ret = { - line: generatedPosition.line + - (section.generatedOffset.generatedLine - 1), - column: generatedPosition.column + - (section.generatedOffset.generatedLine === generatedPosition.line - ? section.generatedOffset.generatedColumn - 1 - : 0) - }; - return ret; - } - } - - return { - line: null, - column: null - }; - }; - -/** - * Parse the mappings in a string in to a data structure which we can easily - * query (the ordered arrays in the `this.__generatedMappings` and - * `this.__originalMappings` properties). - */ -IndexedSourceMapConsumer.prototype._parseMappings = - function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) { - this.__generatedMappings = []; - this.__originalMappings = []; - for (var i = 0; i < this._sections.length; i++) { - var section = this._sections[i]; - var sectionMappings = section.consumer._generatedMappings; - for (var j = 0; j < sectionMappings.length; j++) { - var mapping = sectionMappings[j]; - - var source = section.consumer._sources.at(mapping.source); - if (section.consumer.sourceRoot !== null) { - source = util.join(section.consumer.sourceRoot, source); - } - this._sources.add(source); - source = this._sources.indexOf(source); - - var name = section.consumer._names.at(mapping.name); - this._names.add(name); - name = this._names.indexOf(name); - - // The mappings coming from the consumer for the section have - // generated positions relative to the start of the section, so we - // need to offset them to be relative to the start of the concatenated - // generated file. - var adjustedMapping = { - source: source, - generatedLine: mapping.generatedLine + - (section.generatedOffset.generatedLine - 1), - generatedColumn: mapping.generatedColumn + - (section.generatedOffset.generatedLine === mapping.generatedLine - ? section.generatedOffset.generatedColumn - 1 - : 0), - originalLine: mapping.originalLine, - originalColumn: mapping.originalColumn, - name: name - }; - - this.__generatedMappings.push(adjustedMapping); - if (typeof adjustedMapping.originalLine === 'number') { - this.__originalMappings.push(adjustedMapping); - } - } - } - - quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated); - quickSort(this.__originalMappings, util.compareByOriginalPositions); - }; - -exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer; - - -/***/ }), -/* 172 */ -/***/ ((__unused_webpack_module, exports) => { - -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ - -exports.GREATEST_LOWER_BOUND = 1; -exports.LEAST_UPPER_BOUND = 2; - -/** - * Recursive implementation of binary search. - * - * @param aLow Indices here and lower do not contain the needle. - * @param aHigh Indices here and higher do not contain the needle. - * @param aNeedle The element being searched for. - * @param aHaystack The non-empty array being searched. - * @param aCompare Function which takes two elements and returns -1, 0, or 1. - * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or - * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the - * closest element that is smaller than or greater than the one we are - * searching for, respectively, if the exact element cannot be found. - */ -function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) { - // This function terminates when one of the following is true: - // - // 1. We find the exact element we are looking for. - // - // 2. We did not find the exact element, but we can return the index of - // the next-closest element. - // - // 3. We did not find the exact element, and there is no next-closest - // element than the one we are searching for, so we return -1. - var mid = Math.floor((aHigh - aLow) / 2) + aLow; - var cmp = aCompare(aNeedle, aHaystack[mid], true); - if (cmp === 0) { - // Found the element we are looking for. - return mid; - } - else if (cmp > 0) { - // Our needle is greater than aHaystack[mid]. - if (aHigh - mid > 1) { - // The element is in the upper half. - return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias); - } - - // The exact needle element was not found in this haystack. Determine if - // we are in termination case (3) or (2) and return the appropriate thing. - if (aBias == exports.LEAST_UPPER_BOUND) { - return aHigh < aHaystack.length ? aHigh : -1; - } else { - return mid; - } - } - else { - // Our needle is less than aHaystack[mid]. - if (mid - aLow > 1) { - // The element is in the lower half. - return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias); - } - - // we are in termination case (3) or (2) and return the appropriate thing. - if (aBias == exports.LEAST_UPPER_BOUND) { - return mid; - } else { - return aLow < 0 ? -1 : aLow; - } - } -} - -/** - * This is an implementation of binary search which will always try and return - * the index of the closest element if there is no exact hit. This is because - * mappings between original and generated line/col pairs are single points, - * and there is an implicit region between each of them, so a miss just means - * that you aren't on the very start of a region. - * - * @param aNeedle The element you are looking for. - * @param aHaystack The array that is being searched. - * @param aCompare A function which takes the needle and an element in the - * array and returns -1, 0, or 1 depending on whether the needle is less - * than, equal to, or greater than the element, respectively. - * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or - * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the - * closest element that is smaller than or greater than the one we are - * searching for, respectively, if the exact element cannot be found. - * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'. - */ -exports.search = function search(aNeedle, aHaystack, aCompare, aBias) { - if (aHaystack.length === 0) { - return -1; - } - - var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack, - aCompare, aBias || exports.GREATEST_LOWER_BOUND); - if (index < 0) { - return -1; - } - - // We have found either the exact element, or the next-closest element than - // the one we are searching for. However, there may be more than one such - // element. Make sure we always return the smallest of these. - while (index - 1 >= 0) { - if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) { - break; - } - --index; - } - - return index; -}; - - -/***/ }), -/* 173 */ -/***/ ((__unused_webpack_module, exports) => { - -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ - -// It turns out that some (most?) JavaScript engines don't self-host -// `Array.prototype.sort`. This makes sense because C++ will likely remain -// faster than JS when doing raw CPU-intensive sorting. However, when using a -// custom comparator function, calling back and forth between the VM's C++ and -// JIT'd JS is rather slow *and* loses JIT type information, resulting in -// worse generated code for the comparator function than would be optimal. In -// fact, when sorting with a comparator, these costs outweigh the benefits of -// sorting in C++. By using our own JS-implemented Quick Sort (below), we get -// a ~3500ms mean speed-up in `bench/bench.html`. - -/** - * Swap the elements indexed by `x` and `y` in the array `ary`. - * - * @param {Array} ary - * The array. - * @param {Number} x - * The index of the first item. - * @param {Number} y - * The index of the second item. - */ -function swap(ary, x, y) { - var temp = ary[x]; - ary[x] = ary[y]; - ary[y] = temp; -} - -/** - * Returns a random integer within the range `low .. high` inclusive. - * - * @param {Number} low - * The lower bound on the range. - * @param {Number} high - * The upper bound on the range. - */ -function randomIntInRange(low, high) { - return Math.round(low + (Math.random() * (high - low))); -} - -/** - * The Quick Sort algorithm. - * - * @param {Array} ary - * An array to sort. - * @param {function} comparator - * Function to use to compare two items. - * @param {Number} p - * Start index of the array - * @param {Number} r - * End index of the array - */ -function doQuickSort(ary, comparator, p, r) { - // If our lower bound is less than our upper bound, we (1) partition the - // array into two pieces and (2) recurse on each half. If it is not, this is - // the empty array and our base case. - - if (p < r) { - // (1) Partitioning. - // - // The partitioning chooses a pivot between `p` and `r` and moves all - // elements that are less than or equal to the pivot to the before it, and - // all the elements that are greater than it after it. The effect is that - // once partition is done, the pivot is in the exact place it will be when - // the array is put in sorted order, and it will not need to be moved - // again. This runs in O(n) time. - - // Always choose a random pivot so that an input array which is reverse - // sorted does not cause O(n^2) running time. - var pivotIndex = randomIntInRange(p, r); - var i = p - 1; - - swap(ary, pivotIndex, r); - var pivot = ary[r]; - - // Immediately after `j` is incremented in this loop, the following hold - // true: - // - // * Every element in `ary[p .. i]` is less than or equal to the pivot. - // - // * Every element in `ary[i+1 .. j-1]` is greater than the pivot. - for (var j = p; j < r; j++) { - if (comparator(ary[j], pivot) <= 0) { - i += 1; - swap(ary, i, j); - } - } - - swap(ary, i + 1, j); - var q = i + 1; - - // (2) Recurse on each half. - - doQuickSort(ary, comparator, p, q - 1); - doQuickSort(ary, comparator, q + 1, r); - } -} - -/** - * Sort the given array in-place with the given comparator function. - * - * @param {Array} ary - * An array to sort. - * @param {function} comparator - * Function to use to compare two items. - */ -exports.quickSort = function (ary, comparator) { - doQuickSort(ary, comparator, 0, ary.length - 1); -}; - - -/***/ }), -/* 174 */ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ - -var SourceMapGenerator = (__webpack_require__(165).SourceMapGenerator); -var util = __webpack_require__(168); - -// Matches a Windows-style `\r\n` newline or a `\n` newline used by all other -// operating systems these days (capturing the result). -var REGEX_NEWLINE = /(\r?\n)/; - -// Newline character code for charCodeAt() comparisons -var NEWLINE_CODE = 10; - -// Private symbol for identifying `SourceNode`s when multiple versions of -// the source-map library are loaded. This MUST NOT CHANGE across -// versions! -var isSourceNode = "$$$isSourceNode$$$"; - -/** - * SourceNodes provide a way to abstract over interpolating/concatenating - * snippets of generated JavaScript source code while maintaining the line and - * column information associated with the original source code. - * - * @param aLine The original line number. - * @param aColumn The original column number. - * @param aSource The original source's filename. - * @param aChunks Optional. An array of strings which are snippets of - * generated JS, or other SourceNodes. - * @param aName The original identifier. - */ -function SourceNode(aLine, aColumn, aSource, aChunks, aName) { - this.children = []; - this.sourceContents = {}; - this.line = aLine == null ? null : aLine; - this.column = aColumn == null ? null : aColumn; - this.source = aSource == null ? null : aSource; - this.name = aName == null ? null : aName; - this[isSourceNode] = true; - if (aChunks != null) this.add(aChunks); -} - -/** - * Creates a SourceNode from generated code and a SourceMapConsumer. - * - * @param aGeneratedCode The generated code - * @param aSourceMapConsumer The SourceMap for the generated code - * @param aRelativePath Optional. The path that relative sources in the - * SourceMapConsumer should be relative to. - */ -SourceNode.fromStringWithSourceMap = - function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) { - // The SourceNode we want to fill with the generated code - // and the SourceMap - var node = new SourceNode(); - - // All even indices of this array are one line of the generated code, - // while all odd indices are the newlines between two adjacent lines - // (since `REGEX_NEWLINE` captures its match). - // Processed fragments are accessed by calling `shiftNextLine`. - var remainingLines = aGeneratedCode.split(REGEX_NEWLINE); - var remainingLinesIndex = 0; - var shiftNextLine = function() { - var lineContents = getNextLine(); - // The last line of a file might not have a newline. - var newLine = getNextLine() || ""; - return lineContents + newLine; - - function getNextLine() { - return remainingLinesIndex < remainingLines.length ? - remainingLines[remainingLinesIndex++] : undefined; - } - }; - - // We need to remember the position of "remainingLines" - var lastGeneratedLine = 1, lastGeneratedColumn = 0; - - // The generate SourceNodes we need a code range. - // To extract it current and last mapping is used. - // Here we store the last mapping. - var lastMapping = null; - - aSourceMapConsumer.eachMapping(function (mapping) { - if (lastMapping !== null) { - // We add the code from "lastMapping" to "mapping": - // First check if there is a new line in between. - if (lastGeneratedLine < mapping.generatedLine) { - // Associate first line with "lastMapping" - addMappingWithCode(lastMapping, shiftNextLine()); - lastGeneratedLine++; - lastGeneratedColumn = 0; - // The remaining code is added without mapping - } else { - // There is no new line in between. - // Associate the code between "lastGeneratedColumn" and - // "mapping.generatedColumn" with "lastMapping" - var nextLine = remainingLines[remainingLinesIndex]; - var code = nextLine.substr(0, mapping.generatedColumn - - lastGeneratedColumn); - remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn - - lastGeneratedColumn); - lastGeneratedColumn = mapping.generatedColumn; - addMappingWithCode(lastMapping, code); - // No more remaining code, continue - lastMapping = mapping; - return; - } - } - // We add the generated code until the first mapping - // to the SourceNode without any mapping. - // Each line is added as separate string. - while (lastGeneratedLine < mapping.generatedLine) { - node.add(shiftNextLine()); - lastGeneratedLine++; - } - if (lastGeneratedColumn < mapping.generatedColumn) { - var nextLine = remainingLines[remainingLinesIndex]; - node.add(nextLine.substr(0, mapping.generatedColumn)); - remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn); - lastGeneratedColumn = mapping.generatedColumn; - } - lastMapping = mapping; - }, this); - // We have processed all mappings. - if (remainingLinesIndex < remainingLines.length) { - if (lastMapping) { - // Associate the remaining code in the current line with "lastMapping" - addMappingWithCode(lastMapping, shiftNextLine()); - } - // and add the remaining lines without any mapping - node.add(remainingLines.splice(remainingLinesIndex).join("")); - } - - // Copy sourcesContent into SourceNode - aSourceMapConsumer.sources.forEach(function (sourceFile) { - var content = aSourceMapConsumer.sourceContentFor(sourceFile); - if (content != null) { - if (aRelativePath != null) { - sourceFile = util.join(aRelativePath, sourceFile); - } - node.setSourceContent(sourceFile, content); - } - }); - - return node; - - function addMappingWithCode(mapping, code) { - if (mapping === null || mapping.source === undefined) { - node.add(code); - } else { - var source = aRelativePath - ? util.join(aRelativePath, mapping.source) - : mapping.source; - node.add(new SourceNode(mapping.originalLine, - mapping.originalColumn, - source, - code, - mapping.name)); - } - } - }; - -/** - * Add a chunk of generated JS to this source node. - * - * @param aChunk A string snippet of generated JS code, another instance of - * SourceNode, or an array where each member is one of those things. - */ -SourceNode.prototype.add = function SourceNode_add(aChunk) { - if (Array.isArray(aChunk)) { - aChunk.forEach(function (chunk) { - this.add(chunk); - }, this); - } - else if (aChunk[isSourceNode] || typeof aChunk === "string") { - if (aChunk) { - this.children.push(aChunk); - } - } - else { - throw new TypeError( - "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk - ); - } - return this; -}; - -/** - * Add a chunk of generated JS to the beginning of this source node. - * - * @param aChunk A string snippet of generated JS code, another instance of - * SourceNode, or an array where each member is one of those things. - */ -SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) { - if (Array.isArray(aChunk)) { - for (var i = aChunk.length-1; i >= 0; i--) { - this.prepend(aChunk[i]); - } - } - else if (aChunk[isSourceNode] || typeof aChunk === "string") { - this.children.unshift(aChunk); - } - else { - throw new TypeError( - "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk - ); - } - return this; -}; - -/** - * Walk over the tree of JS snippets in this node and its children. The - * walking function is called once for each snippet of JS and is passed that - * snippet and the its original associated source's line/column location. - * - * @param aFn The traversal function. - */ -SourceNode.prototype.walk = function SourceNode_walk(aFn) { - var chunk; - for (var i = 0, len = this.children.length; i < len; i++) { - chunk = this.children[i]; - if (chunk[isSourceNode]) { - chunk.walk(aFn); - } - else { - if (chunk !== '') { - aFn(chunk, { source: this.source, - line: this.line, - column: this.column, - name: this.name }); - } - } - } -}; - -/** - * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between - * each of `this.children`. - * - * @param aSep The separator. - */ -SourceNode.prototype.join = function SourceNode_join(aSep) { - var newChildren; - var i; - var len = this.children.length; - if (len > 0) { - newChildren = []; - for (i = 0; i < len-1; i++) { - newChildren.push(this.children[i]); - newChildren.push(aSep); - } - newChildren.push(this.children[i]); - this.children = newChildren; - } - return this; -}; - -/** - * Call String.prototype.replace on the very right-most source snippet. Useful - * for trimming whitespace from the end of a source node, etc. - * - * @param aPattern The pattern to replace. - * @param aReplacement The thing to replace the pattern with. - */ -SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) { - var lastChild = this.children[this.children.length - 1]; - if (lastChild[isSourceNode]) { - lastChild.replaceRight(aPattern, aReplacement); - } - else if (typeof lastChild === 'string') { - this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement); - } - else { - this.children.push(''.replace(aPattern, aReplacement)); - } - return this; -}; - -/** - * Set the source content for a source file. This will be added to the SourceMapGenerator - * in the sourcesContent field. - * - * @param aSourceFile The filename of the source file - * @param aSourceContent The content of the source file - */ -SourceNode.prototype.setSourceContent = - function SourceNode_setSourceContent(aSourceFile, aSourceContent) { - this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent; - }; - -/** - * Walk over the tree of SourceNodes. The walking function is called for each - * source file content and is passed the filename and source content. - * - * @param aFn The traversal function. - */ -SourceNode.prototype.walkSourceContents = - function SourceNode_walkSourceContents(aFn) { - for (var i = 0, len = this.children.length; i < len; i++) { - if (this.children[i][isSourceNode]) { - this.children[i].walkSourceContents(aFn); - } - } - - var sources = Object.keys(this.sourceContents); - for (var i = 0, len = sources.length; i < len; i++) { - aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]); - } - }; - -/** - * Return the string representation of this source node. Walks over the tree - * and concatenates all the various snippets together to one string. - */ -SourceNode.prototype.toString = function SourceNode_toString() { - var str = ""; - this.walk(function (chunk) { - str += chunk; - }); - return str; -}; - -/** - * Returns the string representation of this source node along with a source - * map. - */ -SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) { - var generated = { - code: "", - line: 1, - column: 0 - }; - var map = new SourceMapGenerator(aArgs); - var sourceMappingActive = false; - var lastOriginalSource = null; - var lastOriginalLine = null; - var lastOriginalColumn = null; - var lastOriginalName = null; - this.walk(function (chunk, original) { - generated.code += chunk; - if (original.source !== null - && original.line !== null - && original.column !== null) { - if(lastOriginalSource !== original.source - || lastOriginalLine !== original.line - || lastOriginalColumn !== original.column - || lastOriginalName !== original.name) { - map.addMapping({ - source: original.source, - original: { - line: original.line, - column: original.column - }, - generated: { - line: generated.line, - column: generated.column - }, - name: original.name - }); - } - lastOriginalSource = original.source; - lastOriginalLine = original.line; - lastOriginalColumn = original.column; - lastOriginalName = original.name; - sourceMappingActive = true; - } else if (sourceMappingActive) { - map.addMapping({ - generated: { - line: generated.line, - column: generated.column - } - }); - lastOriginalSource = null; - sourceMappingActive = false; - } - for (var idx = 0, length = chunk.length; idx < length; idx++) { - if (chunk.charCodeAt(idx) === NEWLINE_CODE) { - generated.line++; - generated.column = 0; - // Mappings end at eol - if (idx + 1 === length) { - lastOriginalSource = null; - sourceMappingActive = false; - } else if (sourceMappingActive) { - map.addMapping({ - source: original.source, - original: { - line: original.line, - column: original.column - }, - generated: { - line: generated.line, - column: generated.column - }, - name: original.name - }); - } - } else { - generated.column++; - } - } - }); - this.walkSourceContents(function (sourceFile, sourceContent) { - map.setSourceContent(sourceFile, sourceContent); - }); - - return { code: generated.code, map: map }; -}; - -exports.SourceNode = SourceNode; - - -/***/ }), -/* 175 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var sourceMappingURL = __webpack_require__(176) - -var resolveUrl = __webpack_require__(177) -var decodeUriComponent = __webpack_require__(179) -var urix = __webpack_require__(181) -var atob = __webpack_require__(182) - - - -function callbackAsync(callback, error, result) { - setImmediate(function() { callback(error, result) }) -} - -function parseMapToJSON(string, data) { - try { - return JSON.parse(string.replace(/^\)\]\}'/, "")) - } catch (error) { - error.sourceMapData = data - throw error - } -} - -function readSync(read, url, data) { - var readUrl = decodeUriComponent(url) - try { - return String(read(readUrl)) - } catch (error) { - error.sourceMapData = data - throw error - } -} - - - -function resolveSourceMap(code, codeUrl, read, callback) { - var mapData - try { - mapData = resolveSourceMapHelper(code, codeUrl) - } catch (error) { - return callbackAsync(callback, error) - } - if (!mapData || mapData.map) { - return callbackAsync(callback, null, mapData) - } - var readUrl = decodeUriComponent(mapData.url) - read(readUrl, function(error, result) { - if (error) { - error.sourceMapData = mapData - return callback(error) - } - mapData.map = String(result) - try { - mapData.map = parseMapToJSON(mapData.map, mapData) - } catch (error) { - return callback(error) - } - callback(null, mapData) - }) -} - -function resolveSourceMapSync(code, codeUrl, read) { - var mapData = resolveSourceMapHelper(code, codeUrl) - if (!mapData || mapData.map) { - return mapData - } - mapData.map = readSync(read, mapData.url, mapData) - mapData.map = parseMapToJSON(mapData.map, mapData) - return mapData -} - -var dataUriRegex = /^data:([^,;]*)(;[^,;]*)*(?:,(.*))?$/ - -/** - * The media type for JSON text is application/json. - * - * {@link https://tools.ietf.org/html/rfc8259#section-11 | IANA Considerations } - * - * `text/json` is non-standard media type - */ -var jsonMimeTypeRegex = /^(?:application|text)\/json$/ - -/** - * JSON text exchanged between systems that are not part of a closed ecosystem - * MUST be encoded using UTF-8. - * - * {@link https://tools.ietf.org/html/rfc8259#section-8.1 | Character Encoding} - */ -var jsonCharacterEncoding = "utf-8" - -function base64ToBuf(b64) { - var binStr = atob(b64) - var len = binStr.length - var arr = new Uint8Array(len) - for (var i = 0; i < len; i++) { - arr[i] = binStr.charCodeAt(i) - } - return arr -} - -function decodeBase64String(b64) { - if (typeof TextDecoder === "undefined" || typeof Uint8Array === "undefined") { - return atob(b64) - } - var buf = base64ToBuf(b64); - // Note: `decoder.decode` method will throw a `DOMException` with the - // `"EncodingError"` value when an coding error is found. - var decoder = new TextDecoder(jsonCharacterEncoding, {fatal: true}) - return decoder.decode(buf); -} - -function resolveSourceMapHelper(code, codeUrl) { - codeUrl = urix(codeUrl) - - var url = sourceMappingURL.getFrom(code) - if (!url) { - return null - } - - var dataUri = url.match(dataUriRegex) - if (dataUri) { - var mimeType = dataUri[1] || "text/plain" - var lastParameter = dataUri[2] || "" - var encoded = dataUri[3] || "" - var data = { - sourceMappingURL: url, - url: null, - sourcesRelativeTo: codeUrl, - map: encoded - } - if (!jsonMimeTypeRegex.test(mimeType)) { - var error = new Error("Unuseful data uri mime type: " + mimeType) - error.sourceMapData = data - throw error - } - try { - data.map = parseMapToJSON( - lastParameter === ";base64" ? decodeBase64String(encoded) : decodeURIComponent(encoded), - data - ) - } catch (error) { - error.sourceMapData = data - throw error - } - return data - } - - var mapUrl = resolveUrl(codeUrl, url) - return { - sourceMappingURL: url, - url: mapUrl, - sourcesRelativeTo: mapUrl, - map: null - } -} - - - -function resolveSources(map, mapUrl, read, options, callback) { - if (typeof options === "function") { - callback = options - options = {} - } - var pending = map.sources ? map.sources.length : 0 - var result = { - sourcesResolved: [], - sourcesContent: [] - } - - if (pending === 0) { - callbackAsync(callback, null, result) - return - } - - var done = function() { - pending-- - if (pending === 0) { - callback(null, result) - } - } - - resolveSourcesHelper(map, mapUrl, options, function(fullUrl, sourceContent, index) { - result.sourcesResolved[index] = fullUrl - if (typeof sourceContent === "string") { - result.sourcesContent[index] = sourceContent - callbackAsync(done, null) - } else { - var readUrl = decodeUriComponent(fullUrl) - read(readUrl, function(error, source) { - result.sourcesContent[index] = error ? error : String(source) - done() - }) - } - }) -} - -function resolveSourcesSync(map, mapUrl, read, options) { - var result = { - sourcesResolved: [], - sourcesContent: [] - } - - if (!map.sources || map.sources.length === 0) { - return result - } - - resolveSourcesHelper(map, mapUrl, options, function(fullUrl, sourceContent, index) { - result.sourcesResolved[index] = fullUrl - if (read !== null) { - if (typeof sourceContent === "string") { - result.sourcesContent[index] = sourceContent - } else { - var readUrl = decodeUriComponent(fullUrl) - try { - result.sourcesContent[index] = String(read(readUrl)) - } catch (error) { - result.sourcesContent[index] = error - } - } - } - }) - - return result -} - -var endingSlash = /\/?$/ - -function resolveSourcesHelper(map, mapUrl, options, fn) { - options = options || {} - mapUrl = urix(mapUrl) - var fullUrl - var sourceContent - var sourceRoot - for (var index = 0, len = map.sources.length; index < len; index++) { - sourceRoot = null - if (typeof options.sourceRoot === "string") { - sourceRoot = options.sourceRoot - } else if (typeof map.sourceRoot === "string" && options.sourceRoot !== false) { - sourceRoot = map.sourceRoot - } - // If the sourceRoot is the empty string, it is equivalent to not setting - // the property at all. - if (sourceRoot === null || sourceRoot === '') { - fullUrl = resolveUrl(mapUrl, map.sources[index]) - } else { - // Make sure that the sourceRoot ends with a slash, so that `/scripts/subdir` becomes - // `/scripts/subdir/`, not `/scripts/`. Pointing to a file as source root - // does not make sense. - fullUrl = resolveUrl(mapUrl, sourceRoot.replace(endingSlash, "/"), map.sources[index]) - } - sourceContent = (map.sourcesContent || [])[index] - fn(fullUrl, sourceContent, index) - } -} - - - -function resolve(code, codeUrl, read, options, callback) { - if (typeof options === "function") { - callback = options - options = {} - } - if (code === null) { - var mapUrl = codeUrl - var data = { - sourceMappingURL: null, - url: mapUrl, - sourcesRelativeTo: mapUrl, - map: null - } - var readUrl = decodeUriComponent(mapUrl) - read(readUrl, function(error, result) { - if (error) { - error.sourceMapData = data - return callback(error) - } - data.map = String(result) - try { - data.map = parseMapToJSON(data.map, data) - } catch (error) { - return callback(error) - } - _resolveSources(data) - }) - } else { - resolveSourceMap(code, codeUrl, read, function(error, mapData) { - if (error) { - return callback(error) - } - if (!mapData) { - return callback(null, null) - } - _resolveSources(mapData) - }) - } - - function _resolveSources(mapData) { - resolveSources(mapData.map, mapData.sourcesRelativeTo, read, options, function(error, result) { - if (error) { - return callback(error) - } - mapData.sourcesResolved = result.sourcesResolved - mapData.sourcesContent = result.sourcesContent - callback(null, mapData) - }) - } -} - -function resolveSync(code, codeUrl, read, options) { - var mapData - if (code === null) { - var mapUrl = codeUrl - mapData = { - sourceMappingURL: null, - url: mapUrl, - sourcesRelativeTo: mapUrl, - map: null - } - mapData.map = readSync(read, mapUrl, mapData) - mapData.map = parseMapToJSON(mapData.map, mapData) - } else { - mapData = resolveSourceMapSync(code, codeUrl, read) - if (!mapData) { - return null - } - } - var result = resolveSourcesSync(mapData.map, mapData.sourcesRelativeTo, read, options) - mapData.sourcesResolved = result.sourcesResolved - mapData.sourcesContent = result.sourcesContent - return mapData -} - - - -module.exports = { - resolveSourceMap: resolveSourceMap, - resolveSourceMapSync: resolveSourceMapSync, - resolveSources: resolveSources, - resolveSourcesSync: resolveSourcesSync, - resolve: resolve, - resolveSync: resolveSync, - parseMapToJSON: parseMapToJSON -} - - -/***/ }), -/* 176 */ -/***/ (function(module, exports, __webpack_require__) { - -var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;// Copyright 2014 Simon Lydell -// X11 (“MIT”) Licensed. (See LICENSE.) - -void (function(root, factory) { - if (true) { - !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory), - __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? - (__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) : - __WEBPACK_AMD_DEFINE_FACTORY__), - __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) - } else {} -}(this, function() { - - var innerRegex = /[#@] sourceMappingURL=([^\s'"]*)/ - - var regex = RegExp( - "(?:" + - "/\\*" + - "(?:\\s*\r?\n(?://)?)?" + - "(?:" + innerRegex.source + ")" + - "\\s*" + - "\\*/" + - "|" + - "//(?:" + innerRegex.source + ")" + - ")" + - "\\s*" - ) - - return { - - regex: regex, - _innerRegex: innerRegex, - - getFrom: function(code) { - var match = code.match(regex) - return (match ? match[1] || match[2] || "" : null) - }, - - existsIn: function(code) { - return regex.test(code) - }, - - removeFrom: function(code) { - return code.replace(regex, "") - }, - - insertBefore: function(code, string) { - var match = code.match(regex) - if (match) { - return code.slice(0, match.index) + string + code.slice(match.index) - } else { - return code + string - } - } - } - -})); - - -/***/ }), -/* 177 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var url = __webpack_require__(178) - -function resolveUrl(/* ...urls */) { - return Array.prototype.reduce.call(arguments, function(resolved, nextUrl) { - return url.resolve(resolved, nextUrl) - }) -} - -module.exports = resolveUrl - - -/***/ }), -/* 178 */ -/***/ ((module) => { - -"use strict"; -module.exports = require("url"); - -/***/ }), -/* 179 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var decodeUriComponent = __webpack_require__(180) - -function customDecodeUriComponent(string) { - // `decodeUriComponent` turns `+` into ` `, but that's not wanted. - return decodeUriComponent(string.replace(/\+/g, "%2B")) -} - -module.exports = customDecodeUriComponent - - -/***/ }), -/* 180 */ -/***/ ((module) => { - -"use strict"; - -var token = '%[a-f0-9]{2}'; -var singleMatcher = new RegExp('(' + token + ')|([^%]+?)', 'gi'); -var multiMatcher = new RegExp('(' + token + ')+', 'gi'); - -function decodeComponents(components, split) { - try { - // Try to decode the entire string first - return [decodeURIComponent(components.join(''))]; - } catch (err) { - // Do nothing - } - - if (components.length === 1) { - return components; - } - - split = split || 1; - - // Split the array in 2 parts - var left = components.slice(0, split); - var right = components.slice(split); - - return Array.prototype.concat.call([], decodeComponents(left), decodeComponents(right)); -} - -function decode(input) { - try { - return decodeURIComponent(input); - } catch (err) { - var tokens = input.match(singleMatcher) || []; - - for (var i = 1; i < tokens.length; i++) { - input = decodeComponents(tokens, i).join(''); - - tokens = input.match(singleMatcher) || []; - } - - return input; - } -} - -function customDecodeURIComponent(input) { - // Keep track of all the replacements and prefill the map with the `BOM` - var replaceMap = { - '%FE%FF': '\uFFFD\uFFFD', - '%FF%FE': '\uFFFD\uFFFD' - }; - - var match = multiMatcher.exec(input); - while (match) { - try { - // Decode as big chunks as possible - replaceMap[match[0]] = decodeURIComponent(match[0]); - } catch (err) { - var result = decode(match[0]); - - if (result !== match[0]) { - replaceMap[match[0]] = result; - } - } - - match = multiMatcher.exec(input); - } - - // Add `%C2` at the end of the map to make sure it does not replace the combinator before everything else - replaceMap['%C2'] = '\uFFFD'; - - var entries = Object.keys(replaceMap); - - for (var i = 0; i < entries.length; i++) { - // Replace all decoded components - var key = entries[i]; - input = input.replace(new RegExp(key, 'g'), replaceMap[key]); - } - - return input; -} - -module.exports = function (encodedURI) { - if (typeof encodedURI !== 'string') { - throw new TypeError('Expected `encodedURI` to be of type `string`, got `' + typeof encodedURI + '`'); - } - - try { - encodedURI = encodedURI.replace(/\+/g, ' '); - - // Try the built in decoder first - return decodeURIComponent(encodedURI); - } catch (err) { - // Fallback to a more advanced decoder - return customDecodeURIComponent(encodedURI); - } -}; - - -/***/ }), -/* 181 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -// Copyright 2014 Simon Lydell -// X11 (“MIT”) Licensed. (See LICENSE.) - -var path = __webpack_require__(3) - -"use strict" - -function urix(aPath) { - if (path.sep === "\\") { - return aPath - .replace(/\\/g, "/") - .replace(/^[a-z]:\/?/i, "/") - } - return aPath -} - -module.exports = urix - - -/***/ }), -/* 182 */ -/***/ ((module) => { - -"use strict"; - - -function atob(str) { - return Buffer.from(str, 'base64').toString('binary'); -} - -module.exports = atob.atob = atob; - - -/***/ }), -/* 183 */ -/***/ ((module, exports, __webpack_require__) => { - -"use strict"; - - -var fs = __webpack_require__(11); -var path = __webpack_require__(3); -var define = __webpack_require__(148); -var utils = __webpack_require__(163); - -/** - * Expose `mixin()`. - * This code is based on `source-maps-support.js` in reworkcss/css - * https://github.com/reworkcss/css/blob/master/lib/stringify/source-map-support.js - * Copyright (c) 2012 TJ Holowaychuk - */ - -module.exports = mixin; - -/** - * Mixin source map support into `compiler`. - * - * @param {Object} `compiler` - * @api public - */ - -function mixin(compiler) { - define(compiler, '_comment', compiler.comment); - compiler.map = new utils.SourceMap.SourceMapGenerator(); - compiler.position = { line: 1, column: 1 }; - compiler.content = {}; - compiler.files = {}; - - for (var key in exports) { - define(compiler, key, exports[key]); - } -} - -/** - * Update position. - * - * @param {String} str - */ - -exports.updatePosition = function(str) { - var lines = str.match(/\n/g); - if (lines) this.position.line += lines.length; - var i = str.lastIndexOf('\n'); - this.position.column = ~i ? str.length - i : this.position.column + str.length; -}; - -/** - * Emit `str` with `position`. - * - * @param {String} str - * @param {Object} [pos] - * @return {String} - */ - -exports.emit = function(str, node) { - var position = node.position || {}; - var source = position.source; - if (source) { - if (position.filepath) { - source = utils.unixify(position.filepath); - } - - this.map.addMapping({ - source: source, - generated: { - line: this.position.line, - column: Math.max(this.position.column - 1, 0) - }, - original: { - line: position.start.line, - column: position.start.column - 1 - } - }); - - if (position.content) { - this.addContent(source, position); - } - if (position.filepath) { - this.addFile(source, position); - } - - this.updatePosition(str); - this.output += str; - } - return str; -}; - -/** - * Adds a file to the source map output if it has not already been added - * @param {String} `file` - * @param {Object} `pos` - */ - -exports.addFile = function(file, position) { - if (typeof position.content !== 'string') return; - if (Object.prototype.hasOwnProperty.call(this.files, file)) return; - this.files[file] = position.content; -}; - -/** - * Adds a content source to the source map output if it has not already been added - * @param {String} `source` - * @param {Object} `position` - */ - -exports.addContent = function(source, position) { - if (typeof position.content !== 'string') return; - if (Object.prototype.hasOwnProperty.call(this.content, source)) return; - this.map.setSourceContent(source, position.content); -}; - -/** - * Applies any original source maps to the output and embeds the source file - * contents in the source map. - */ - -exports.applySourceMaps = function() { - Object.keys(this.files).forEach(function(file) { - var content = this.files[file]; - this.map.setSourceContent(file, content); - - if (this.options.inputSourcemaps === true) { - var originalMap = utils.sourceMapResolve.resolveSync(content, file, fs.readFileSync); - if (originalMap) { - var map = new utils.SourceMap.SourceMapConsumer(originalMap.map); - var relativeTo = originalMap.sourcesRelativeTo; - this.map.applySourceMap(map, file, utils.unixify(path.dirname(relativeTo))); - } - } - }, this); -}; - -/** - * Process comments, drops sourceMap comments. - * @param {Object} node - */ - -exports.comment = function(node) { - if (/^# sourceMappingURL=/.test(node.comment)) { - return this.emit('', node.position); - } - return this._comment(node); -}; - - -/***/ }), -/* 184 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var use = __webpack_require__(155); -var util = __webpack_require__(17); -var Cache = __webpack_require__(185); -var define = __webpack_require__(148); -var debug = __webpack_require__(156)('snapdragon:parser'); -var Position = __webpack_require__(186); -var utils = __webpack_require__(163); - -/** - * Create a new `Parser` with the given `input` and `options`. - * @param {String} `input` - * @param {Object} `options` - * @api public - */ - -function Parser(options) { - debug('initializing', __filename); - this.options = utils.extend({source: 'string'}, options); - this.init(this.options); - use(this); -} - -/** - * Prototype methods - */ - -Parser.prototype = { - constructor: Parser, - - init: function(options) { - this.orig = ''; - this.input = ''; - this.parsed = ''; - - this.column = 1; - this.line = 1; - - this.regex = new Cache(); - this.errors = this.errors || []; - this.parsers = this.parsers || {}; - this.types = this.types || []; - this.sets = this.sets || {}; - this.fns = this.fns || []; - this.currentType = 'root'; - - var pos = this.position(); - this.bos = pos({type: 'bos', val: ''}); - - this.ast = { - type: 'root', - errors: this.errors, - nodes: [this.bos] - }; - - define(this.bos, 'parent', this.ast); - this.nodes = [this.ast]; - - this.count = 0; - this.setCount = 0; - this.stack = []; - }, - - /** - * Throw a formatted error with the cursor column and `msg`. - * @param {String} `msg` Message to use in the Error. - */ - - error: function(msg, node) { - var pos = node.position || {start: {column: 0, line: 0}}; - var line = pos.start.line; - var column = pos.start.column; - var source = this.options.source; - - var message = source + ' : ' + msg; - var err = new Error(message); - err.source = source; - err.reason = msg; - err.pos = pos; - - if (this.options.silent) { - this.errors.push(err); - } else { - throw err; - } - }, - - /** - * Define a non-enumberable property on the `Parser` instance. - * - * ```js - * parser.define('foo', 'bar'); - * ``` - * @name .define - * @param {String} `key` propery name - * @param {any} `val` property value - * @return {Object} Returns the Parser instance for chaining. - * @api public - */ - - define: function(key, val) { - define(this, key, val); - return this; - }, - - /** - * Mark position and patch `node.position`. - */ - - position: function() { - var start = { line: this.line, column: this.column }; - var self = this; - - return function(node) { - define(node, 'position', new Position(start, self)); - return node; - }; - }, - - /** - * Set parser `name` with the given `fn` - * @param {String} `name` - * @param {Function} `fn` - * @api public - */ - - set: function(type, fn) { - if (this.types.indexOf(type) === -1) { - this.types.push(type); - } - this.parsers[type] = fn.bind(this); - return this; - }, - - /** - * Get parser `name` - * @param {String} `name` - * @api public - */ - - get: function(name) { - return this.parsers[name]; - }, - - /** - * Push a `token` onto the `type` stack. - * - * @param {String} `type` - * @return {Object} `token` - * @api public - */ - - push: function(type, token) { - this.sets[type] = this.sets[type] || []; - this.count++; - this.stack.push(token); - return this.sets[type].push(token); - }, - - /** - * Pop a token off of the `type` stack - * @param {String} `type` - * @returns {Object} Returns a token - * @api public - */ - - pop: function(type) { - this.sets[type] = this.sets[type] || []; - this.count--; - this.stack.pop(); - return this.sets[type].pop(); - }, - - /** - * Return true if inside a `stack` node. Types are `braces`, `parens` or `brackets`. - * - * @param {String} `type` - * @return {Boolean} - * @api public - */ - - isInside: function(type) { - this.sets[type] = this.sets[type] || []; - return this.sets[type].length > 0; - }, - - /** - * Return true if `node` is the given `type`. - * - * ```js - * parser.isType(node, 'brace'); - * ``` - * @param {Object} `node` - * @param {String} `type` - * @return {Boolean} - * @api public - */ - - isType: function(node, type) { - return node && node.type === type; - }, - - /** - * Get the previous AST node - * @return {Object} - */ - - prev: function(n) { - return this.stack.length > 0 - ? utils.last(this.stack, n) - : utils.last(this.nodes, n); - }, - - /** - * Update line and column based on `str`. - */ - - consume: function(len) { - this.input = this.input.substr(len); - }, - - /** - * Update column based on `str`. - */ - - updatePosition: function(str, len) { - var lines = str.match(/\n/g); - if (lines) this.line += lines.length; - var i = str.lastIndexOf('\n'); - this.column = ~i ? len - i : this.column + len; - this.parsed += str; - this.consume(len); - }, - - /** - * Match `regex`, return captures, and update the cursor position by `match[0]` length. - * @param {RegExp} `regex` - * @return {Object} - */ - - match: function(regex) { - var m = regex.exec(this.input); - if (m) { - this.updatePosition(m[0], m[0].length); - return m; - } - }, - - /** - * Capture `type` with the given regex. - * @param {String} `type` - * @param {RegExp} `regex` - * @return {Function} - */ - - capture: function(type, regex) { - if (typeof regex === 'function') { - return this.set.apply(this, arguments); - } - - this.regex.set(type, regex); - this.set(type, function() { - var parsed = this.parsed; - var pos = this.position(); - var m = this.match(regex); - if (!m || !m[0]) return; - - var prev = this.prev(); - var node = pos({ - type: type, - val: m[0], - parsed: parsed, - rest: this.input - }); - - if (m[1]) { - node.inner = m[1]; - } - - define(node, 'inside', this.stack.length > 0); - define(node, 'parent', prev); - prev.nodes.push(node); - }.bind(this)); - return this; - }, - - /** - * Create a parser with open and close for parens, - * brackets or braces - */ - - capturePair: function(type, openRegex, closeRegex, fn) { - this.sets[type] = this.sets[type] || []; - - /** - * Open - */ - - this.set(type + '.open', function() { - var parsed = this.parsed; - var pos = this.position(); - var m = this.match(openRegex); - if (!m || !m[0]) return; - - var val = m[0]; - this.setCount++; - this.specialChars = true; - var open = pos({ - type: type + '.open', - val: val, - rest: this.input - }); - - if (typeof m[1] !== 'undefined') { - open.inner = m[1]; - } - - var prev = this.prev(); - var node = pos({ - type: type, - nodes: [open] - }); - - define(node, 'rest', this.input); - define(node, 'parsed', parsed); - define(node, 'prefix', m[1]); - define(node, 'parent', prev); - define(open, 'parent', node); - - if (typeof fn === 'function') { - fn.call(this, open, node); - } - - this.push(type, node); - prev.nodes.push(node); - }); - - /** - * Close - */ - - this.set(type + '.close', function() { - var pos = this.position(); - var m = this.match(closeRegex); - if (!m || !m[0]) return; - - var parent = this.pop(type); - var node = pos({ - type: type + '.close', - rest: this.input, - suffix: m[1], - val: m[0] - }); - - if (!this.isType(parent, type)) { - if (this.options.strict) { - throw new Error('missing opening "' + type + '"'); - } - - this.setCount--; - node.escaped = true; - return node; - } - - if (node.suffix === '\\') { - parent.escaped = true; - node.escaped = true; - } - - parent.nodes.push(node); - define(node, 'parent', parent); - }); - - return this; - }, - - /** - * Capture end-of-string - */ - - eos: function() { - var pos = this.position(); - if (this.input) return; - var prev = this.prev(); - - while (prev.type !== 'root' && !prev.visited) { - if (this.options.strict === true) { - throw new SyntaxError('invalid syntax:' + util.inspect(prev, null, 2)); - } - - if (!hasDelims(prev)) { - prev.parent.escaped = true; - prev.escaped = true; - } - - visit(prev, function(node) { - if (!hasDelims(node.parent)) { - node.parent.escaped = true; - node.escaped = true; - } - }); - - prev = prev.parent; - } - - var tok = pos({ - type: 'eos', - val: this.append || '' - }); - - define(tok, 'parent', this.ast); - return tok; - }, - - /** - * Run parsers to advance the cursor position - */ - - next: function() { - var parsed = this.parsed; - var len = this.types.length; - var idx = -1; - var tok; - - while (++idx < len) { - if ((tok = this.parsers[this.types[idx]].call(this))) { - define(tok, 'rest', this.input); - define(tok, 'parsed', parsed); - this.last = tok; - return tok; - } - } - }, - - /** - * Parse the given string. - * @return {Array} - */ - - parse: function(input) { - if (typeof input !== 'string') { - throw new TypeError('expected a string'); - } - - this.init(this.options); - this.orig = input; - this.input = input; - var self = this; - - function parse() { - // check input before calling `.next()` - input = self.input; - - // get the next AST ndoe - var node = self.next(); - if (node) { - var prev = self.prev(); - if (prev) { - define(node, 'parent', prev); - if (prev.nodes) { - prev.nodes.push(node); - } - } - - if (self.sets.hasOwnProperty(prev.type)) { - self.currentType = prev.type; - } - } - - // if we got here but input is not changed, throw an error - if (self.input && input === self.input) { - throw new Error('no parsers registered for: "' + self.input.slice(0, 5) + '"'); - } - } - - while (this.input) parse(); - if (this.stack.length && this.options.strict) { - var node = this.stack.pop(); - throw this.error('missing opening ' + node.type + ': "' + this.orig + '"'); - } - - var eos = this.eos(); - var tok = this.prev(); - if (tok.type !== 'eos') { - this.ast.nodes.push(eos); - } - - return this.ast; - } -}; - -/** - * Visit `node` with the given `fn` - */ - -function visit(node, fn) { - if (!node.visited) { - define(node, 'visited', true); - return node.nodes ? mapVisit(node.nodes, fn) : fn(node); - } - return node; -} - -/** - * Map visit over array of `nodes`. - */ - -function mapVisit(nodes, fn) { - var len = nodes.length; - var idx = -1; - while (++idx < len) { - visit(nodes[idx], fn); - } -} - -function hasOpen(node) { - return node.nodes && node.nodes[0].type === (node.type + '.open'); -} - -function hasClose(node) { - return node.nodes && utils.last(node.nodes).type === (node.type + '.close'); -} - -function hasDelims(node) { - return hasOpen(node) && hasClose(node); -} - -/** - * Expose `Parser` - */ - -module.exports = Parser; - - -/***/ }), -/* 185 */ -/***/ ((module) => { - -"use strict"; -/*! - * map-cache - * - * Copyright (c) 2015, Jon Schlinkert. - * Licensed under the MIT License. - */ - - - -var hasOwn = Object.prototype.hasOwnProperty; - -/** - * Expose `MapCache` - */ - -module.exports = MapCache; - -/** - * Creates a cache object to store key/value pairs. - * - * ```js - * var cache = new MapCache(); - * ``` - * - * @api public - */ - -function MapCache(data) { - this.__data__ = data || {}; -} - -/** - * Adds `value` to `key` on the cache. - * - * ```js - * cache.set('foo', 'bar'); - * ``` - * - * @param {String} `key` The key of the value to cache. - * @param {*} `value` The value to cache. - * @returns {Object} Returns the `Cache` object for chaining. - * @api public - */ - -MapCache.prototype.set = function mapSet(key, value) { - if (key !== '__proto__') { - this.__data__[key] = value; - } - return this; -}; - -/** - * Gets the cached value for `key`. - * - * ```js - * cache.get('foo'); - * //=> 'bar' - * ``` - * - * @param {String} `key` The key of the value to get. - * @returns {*} Returns the cached value. - * @api public - */ - -MapCache.prototype.get = function mapGet(key) { - return key === '__proto__' ? undefined : this.__data__[key]; -}; - -/** - * Checks if a cached value for `key` exists. - * - * ```js - * cache.has('foo'); - * //=> true - * ``` - * - * @param {String} `key` The key of the entry to check. - * @returns {Boolean} Returns `true` if an entry for `key` exists, else `false`. - * @api public - */ - -MapCache.prototype.has = function mapHas(key) { - return key !== '__proto__' && hasOwn.call(this.__data__, key); -}; - -/** - * Removes `key` and its value from the cache. - * - * ```js - * cache.del('foo'); - * ``` - * @title .del - * @param {String} `key` The key of the value to remove. - * @returns {Boolean} Returns `true` if the entry was removed successfully, else `false`. - * @api public - */ - -MapCache.prototype.del = function mapDelete(key) { - return this.has(key) && delete this.__data__[key]; -}; - - -/***/ }), -/* 186 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var define = __webpack_require__(148); - -/** - * Store position for a node - */ - -module.exports = function Position(start, parser) { - this.start = start; - this.end = { line: parser.line, column: parser.column }; - define(this, 'content', parser.orig); - define(this, 'source', parser.options.source); -}; - - -/***/ }), -/* 187 */ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -/** -* upath http://github.com/anodynos/upath/ -* -* A proxy to `path`, replacing `\` with `/` for all results & new methods to normalize & join keeping leading `./` and add, change, default, trim file extensions. -* Version 1.2.0 - Compiled on 2019-09-02 23:33:57 -* Repository git://github.com/anodynos/upath -* Copyright(c) 2019 Angelos Pikoulas -* License MIT -*/ - -// Generated by uRequire v0.7.0-beta.33 target: 'lib' template: 'nodejs' - - -var VERSION = '1.2.0'; // injected by urequire-rc-inject-version - -var extraFn, extraFunctions, isFunction, isString, isValidExt, name, path, propName, propValue, toUnix, upath, slice = [].slice, indexOf = [].indexOf || function (item) { - for (var i = 0, l = this.length; i < l; i++) { - if (i in this && this[i] === item) - return i; - } - return -1; - }, hasProp = {}.hasOwnProperty; -path = __webpack_require__(3); -isFunction = function (val) { - return val instanceof Function; -}; -isString = function (val) { - return typeof val === "string" || !!val && typeof val === "object" && Object.prototype.toString.call(val) === "[object String]"; -}; -upath = exports; -upath.VERSION = typeof VERSION !== "undefined" && VERSION !== null ? VERSION : "NO-VERSION"; -toUnix = function (p) { - var double; - p = p.replace(/\\/g, "/"); - double = /\/\//; - while (p.match(double)) { - p = p.replace(double, "/"); - } - return p; -}; -for (propName in path) { - propValue = path[propName]; - if (isFunction(propValue)) { - upath[propName] = function (propName) { - return function () { - var args, result; - args = 1 <= arguments.length ? slice.call(arguments, 0) : []; - args = args.map(function (p) { - if (isString(p)) { - return toUnix(p); - } else { - return p; - } - }); - result = path[propName].apply(path, args); - if (isString(result)) { - return toUnix(result); - } else { - return result; - } - }; - }(propName); - } else { - upath[propName] = propValue; - } -} -upath.sep = "/"; -extraFunctions = { - toUnix: toUnix, - normalizeSafe: function (p) { - p = toUnix(p); - if (p.startsWith("./")) { - if (p.startsWith("./..") || p === "./") { - return upath.normalize(p); - } else { - return "./" + upath.normalize(p); - } - } else { - return upath.normalize(p); - } - }, - normalizeTrim: function (p) { - p = upath.normalizeSafe(p); - if (p.endsWith("/")) { - return p.slice(0, +(p.length - 2) + 1 || 9000000000); - } else { - return p; - } - }, - joinSafe: function () { - var p, result; - p = 1 <= arguments.length ? slice.call(arguments, 0) : []; - result = upath.join.apply(null, p); - if (p[0].startsWith("./") && !result.startsWith("./")) { - result = "./" + result; - } - return result; - }, - addExt: function (file, ext) { - if (!ext) { - return file; - } else { - if (ext[0] !== ".") { - ext = "." + ext; - } - return file + (file.endsWith(ext) ? "" : ext); - } - }, - trimExt: function (filename, ignoreExts, maxSize) { - var oldExt; - if (maxSize == null) { - maxSize = 7; - } - oldExt = upath.extname(filename); - if (isValidExt(oldExt, ignoreExts, maxSize)) { - return filename.slice(0, +(filename.length - oldExt.length - 1) + 1 || 9000000000); - } else { - return filename; - } - }, - removeExt: function (filename, ext) { - if (!ext) { - return filename; - } else { - ext = ext[0] === "." ? ext : "." + ext; - if (upath.extname(filename) === ext) { - return upath.trimExt(filename); - } else { - return filename; - } - } - }, - changeExt: function (filename, ext, ignoreExts, maxSize) { - if (maxSize == null) { - maxSize = 7; - } - return upath.trimExt(filename, ignoreExts, maxSize) + (!ext ? "" : ext[0] === "." ? ext : "." + ext); - }, - defaultExt: function (filename, ext, ignoreExts, maxSize) { - var oldExt; - if (maxSize == null) { - maxSize = 7; - } - oldExt = upath.extname(filename); - if (isValidExt(oldExt, ignoreExts, maxSize)) { - return filename; - } else { - return upath.addExt(filename, ext); - } - } -}; -isValidExt = function (ext, ignoreExts, maxSize) { - if (ignoreExts == null) { - ignoreExts = []; - } - return ext && ext.length <= maxSize && indexOf.call(ignoreExts.map(function (e) { - return (e && e[0] !== "." ? "." : "") + e; - }), ext) < 0; -}; -for (name in extraFunctions) { - if (!hasProp.call(extraFunctions, name)) - continue; - extraFn = extraFunctions[name]; - if (upath[name] !== void 0) { - throw new Error("path." + name + " already exists."); - } else { - upath[name] = extraFn; - } -} - -; - -/***/ }), -/* 188 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var fs = __webpack_require__(11); -var sysPath = __webpack_require__(3); -var readdirp = __webpack_require__(189); -var isBinaryPath = __webpack_require__(247); - -// fs.watch helpers - -// object to hold per-process fs.watch instances -// (may be shared across chokidar FSWatcher instances) -var FsWatchInstances = Object.create(null); - - -// Private function: Instantiates the fs.watch interface - -// * path - string, path to be watched -// * options - object, options to be passed to fs.watch -// * listener - function, main event handler -// * errHandler - function, handler which emits info about errors -// * emitRaw - function, handler which emits raw event data - -// Returns new fsevents instance -function createFsWatchInstance(path, options, listener, errHandler, emitRaw) { - var handleEvent = function(rawEvent, evPath) { - listener(path); - emitRaw(rawEvent, evPath, {watchedPath: path}); - - // emit based on events occurring for files from a directory's watcher in - // case the file's watcher misses it (and rely on throttling to de-dupe) - if (evPath && path !== evPath) { - fsWatchBroadcast( - sysPath.resolve(path, evPath), 'listeners', sysPath.join(path, evPath) - ); - } - }; - try { - return fs.watch(path, options, handleEvent); - } catch (error) { - errHandler(error); - } -} - -// Private function: Helper for passing fs.watch event data to a -// collection of listeners - -// * fullPath - string, absolute path bound to the fs.watch instance -// * type - string, listener type -// * val[1..3] - arguments to be passed to listeners - -// Returns nothing -function fsWatchBroadcast(fullPath, type, val1, val2, val3) { - if (!FsWatchInstances[fullPath]) return; - FsWatchInstances[fullPath][type].forEach(function(listener) { - listener(val1, val2, val3); - }); -} - -// Private function: Instantiates the fs.watch interface or binds listeners -// to an existing one covering the same file system entry - -// * path - string, path to be watched -// * fullPath - string, absolute path -// * options - object, options to be passed to fs.watch -// * handlers - object, container for event listener functions - -// Returns close function -function setFsWatchListener(path, fullPath, options, handlers) { - var listener = handlers.listener; - var errHandler = handlers.errHandler; - var rawEmitter = handlers.rawEmitter; - var container = FsWatchInstances[fullPath]; - var watcher; - if (!options.persistent) { - watcher = createFsWatchInstance( - path, options, listener, errHandler, rawEmitter - ); - return watcher.close.bind(watcher); - } - if (!container) { - watcher = createFsWatchInstance( - path, - options, - fsWatchBroadcast.bind(null, fullPath, 'listeners'), - errHandler, // no need to use broadcast here - fsWatchBroadcast.bind(null, fullPath, 'rawEmitters') - ); - if (!watcher) return; - var broadcastErr = fsWatchBroadcast.bind(null, fullPath, 'errHandlers'); - watcher.on('error', function(error) { - container.watcherUnusable = true; // documented since Node 10.4.1 - // Workaround for https://github.com/joyent/node/issues/4337 - if (process.platform === 'win32' && error.code === 'EPERM') { - fs.open(path, 'r', function(err, fd) { - if (!err) fs.close(fd, function(err) { - if (!err) broadcastErr(error); - }); - }); - } else { - broadcastErr(error); - } - }); - container = FsWatchInstances[fullPath] = { - listeners: [listener], - errHandlers: [errHandler], - rawEmitters: [rawEmitter], - watcher: watcher - }; - } else { - container.listeners.push(listener); - container.errHandlers.push(errHandler); - container.rawEmitters.push(rawEmitter); - } - var listenerIndex = container.listeners.length - 1; - - // removes this instance's listeners and closes the underlying fs.watch - // instance if there are no more listeners left - return function close() { - delete container.listeners[listenerIndex]; - delete container.errHandlers[listenerIndex]; - delete container.rawEmitters[listenerIndex]; - if (!Object.keys(container.listeners).length) { - if (!container.watcherUnusable) { // check to protect against issue #730 - container.watcher.close(); - } - delete FsWatchInstances[fullPath]; - } - }; -} - -// fs.watchFile helpers - -// object to hold per-process fs.watchFile instances -// (may be shared across chokidar FSWatcher instances) -var FsWatchFileInstances = Object.create(null); - -// Private function: Instantiates the fs.watchFile interface or binds listeners -// to an existing one covering the same file system entry - -// * path - string, path to be watched -// * fullPath - string, absolute path -// * options - object, options to be passed to fs.watchFile -// * handlers - object, container for event listener functions - -// Returns close function -function setFsWatchFileListener(path, fullPath, options, handlers) { - var listener = handlers.listener; - var rawEmitter = handlers.rawEmitter; - var container = FsWatchFileInstances[fullPath]; - var listeners = []; - var rawEmitters = []; - if ( - container && ( - container.options.persistent < options.persistent || - container.options.interval > options.interval - ) - ) { - // "Upgrade" the watcher to persistence or a quicker interval. - // This creates some unlikely edge case issues if the user mixes - // settings in a very weird way, but solving for those cases - // doesn't seem worthwhile for the added complexity. - listeners = container.listeners; - rawEmitters = container.rawEmitters; - fs.unwatchFile(fullPath); - container = false; - } - if (!container) { - listeners.push(listener); - rawEmitters.push(rawEmitter); - container = FsWatchFileInstances[fullPath] = { - listeners: listeners, - rawEmitters: rawEmitters, - options: options, - watcher: fs.watchFile(fullPath, options, function(curr, prev) { - container.rawEmitters.forEach(function(rawEmitter) { - rawEmitter('change', fullPath, {curr: curr, prev: prev}); - }); - var currmtime = curr.mtime.getTime(); - if (curr.size !== prev.size || currmtime > prev.mtime.getTime() || currmtime === 0) { - container.listeners.forEach(function(listener) { - listener(path, curr); - }); - } - }) - }; - } else { - container.listeners.push(listener); - container.rawEmitters.push(rawEmitter); - } - var listenerIndex = container.listeners.length - 1; - - // removes this instance's listeners and closes the underlying fs.watchFile - // instance if there are no more listeners left - return function close() { - delete container.listeners[listenerIndex]; - delete container.rawEmitters[listenerIndex]; - if (!Object.keys(container.listeners).length) { - fs.unwatchFile(fullPath); - delete FsWatchFileInstances[fullPath]; - } - }; -} - -// fake constructor for attaching nodefs-specific prototype methods that -// will be copied to FSWatcher's prototype -function NodeFsHandler() {} - -// Private method: Watch file for changes with fs.watchFile or fs.watch. - -// * path - string, path to file or directory. -// * listener - function, to be executed on fs change. - -// Returns close function for the watcher instance -NodeFsHandler.prototype._watchWithNodeFs = -function(path, listener) { - var directory = sysPath.dirname(path); - var basename = sysPath.basename(path); - var parent = this._getWatchedDir(directory); - parent.add(basename); - var absolutePath = sysPath.resolve(path); - var options = {persistent: this.options.persistent}; - if (!listener) listener = Function.prototype; // empty function - - var closer; - if (this.options.usePolling) { - options.interval = this.enableBinaryInterval && isBinaryPath(basename) ? - this.options.binaryInterval : this.options.interval; - closer = setFsWatchFileListener(path, absolutePath, options, { - listener: listener, - rawEmitter: this.emit.bind(this, 'raw') - }); - } else { - closer = setFsWatchListener(path, absolutePath, options, { - listener: listener, - errHandler: this._handleError.bind(this), - rawEmitter: this.emit.bind(this, 'raw') - }); - } - return closer; -}; - -// Private method: Watch a file and emit add event if warranted - -// * file - string, the file's path -// * stats - object, result of fs.stat -// * initialAdd - boolean, was the file added at watch instantiation? -// * callback - function, called when done processing as a newly seen file - -// Returns close function for the watcher instance -NodeFsHandler.prototype._handleFile = -function(file, stats, initialAdd, callback) { - var dirname = sysPath.dirname(file); - var basename = sysPath.basename(file); - var parent = this._getWatchedDir(dirname); - // stats is always present - var prevStats = stats; - - // if the file is already being watched, do nothing - if (parent.has(basename)) return callback(); - - // kick off the watcher - var closer = this._watchWithNodeFs(file, function(path, newStats) { - if (!this._throttle('watch', file, 5)) return; - if (!newStats || newStats && newStats.mtime.getTime() === 0) { - fs.stat(file, function(error, newStats) { - // Fix issues where mtime is null but file is still present - if (error) { - this._remove(dirname, basename); - } else { - // Check that change event was not fired because of changed only accessTime. - var at = newStats.atime.getTime(); - var mt = newStats.mtime.getTime(); - if (!at || at <= mt || mt !== prevStats.mtime.getTime()) { - this._emit('change', file, newStats); - } - prevStats = newStats; - } - }.bind(this)); - // add is about to be emitted if file not already tracked in parent - } else if (parent.has(basename)) { - // Check that change event was not fired because of changed only accessTime. - var at = newStats.atime.getTime(); - var mt = newStats.mtime.getTime(); - if (!at || at <= mt || mt !== prevStats.mtime.getTime()) { - this._emit('change', file, newStats); - } - prevStats = newStats; - } - }.bind(this)); - - // emit an add event if we're supposed to - if (!(initialAdd && this.options.ignoreInitial)) { - if (!this._throttle('add', file, 0)) return; - this._emit('add', file, stats); - } - - if (callback) callback(); - return closer; -}; - -// Private method: Handle symlinks encountered while reading a dir - -// * entry - object, entry object returned by readdirp -// * directory - string, path of the directory being read -// * path - string, path of this item -// * item - string, basename of this item - -// Returns true if no more processing is needed for this entry. -NodeFsHandler.prototype._handleSymlink = -function(entry, directory, path, item) { - var full = entry.fullPath; - var dir = this._getWatchedDir(directory); - - if (!this.options.followSymlinks) { - // watch symlink directly (don't follow) and detect changes - this._readyCount++; - fs.realpath(path, function(error, linkPath) { - if (dir.has(item)) { - if (this._symlinkPaths[full] !== linkPath) { - this._symlinkPaths[full] = linkPath; - this._emit('change', path, entry.stat); - } - } else { - dir.add(item); - this._symlinkPaths[full] = linkPath; - this._emit('add', path, entry.stat); - } - this._emitReady(); - }.bind(this)); - return true; - } - - // don't follow the same symlink more than once - if (this._symlinkPaths[full]) return true; - else this._symlinkPaths[full] = true; -}; - -// Private method: Read directory to add / remove files from `@watched` list -// and re-read it on change. - -// * dir - string, fs path. -// * stats - object, result of fs.stat -// * initialAdd - boolean, was the file added at watch instantiation? -// * depth - int, depth relative to user-supplied path -// * target - string, child path actually targeted for watch -// * wh - object, common watch helpers for this path -// * callback - function, called when dir scan is complete - -// Returns close function for the watcher instance -NodeFsHandler.prototype._handleDir = -function(dir, stats, initialAdd, depth, target, wh, callback) { - var parentDir = this._getWatchedDir(sysPath.dirname(dir)); - var tracked = parentDir.has(sysPath.basename(dir)); - if (!(initialAdd && this.options.ignoreInitial) && !target && !tracked) { - if (!wh.hasGlob || wh.globFilter(dir)) this._emit('addDir', dir, stats); - } - - // ensure dir is tracked (harmless if redundant) - parentDir.add(sysPath.basename(dir)); - this._getWatchedDir(dir); - - var read = function(directory, initialAdd, done) { - // Normalize the directory name on Windows - directory = sysPath.join(directory, ''); - - if (!wh.hasGlob) { - var throttler = this._throttle('readdir', directory, 1000); - if (!throttler) return; - } - - var previous = this._getWatchedDir(wh.path); - var current = []; - - readdirp({ - root: directory, - entryType: 'all', - fileFilter: wh.filterPath, - directoryFilter: wh.filterDir, - depth: 0, - lstat: true - }).on('data', function(entry) { - var item = entry.path; - var path = sysPath.join(directory, item); - current.push(item); - - if (entry.stat.isSymbolicLink() && - this._handleSymlink(entry, directory, path, item)) return; - - // Files that present in current directory snapshot - // but absent in previous are added to watch list and - // emit `add` event. - if (item === target || !target && !previous.has(item)) { - this._readyCount++; - - // ensure relativeness of path is preserved in case of watcher reuse - path = sysPath.join(dir, sysPath.relative(dir, path)); - - this._addToNodeFs(path, initialAdd, wh, depth + 1); - } - }.bind(this)).on('end', function() { - var wasThrottled = throttler ? throttler.clear() : false; - if (done) done(); - - // Files that absent in current directory snapshot - // but present in previous emit `remove` event - // and are removed from @watched[directory]. - previous.children().filter(function(item) { - return item !== directory && - current.indexOf(item) === -1 && - // in case of intersecting globs; - // a path may have been filtered out of this readdir, but - // shouldn't be removed because it matches a different glob - (!wh.hasGlob || wh.filterPath({ - fullPath: sysPath.resolve(directory, item) - })); - }).forEach(function(item) { - this._remove(directory, item); - }, this); - - // one more time for any missed in case changes came in extremely quickly - if (wasThrottled) read(directory, false); - }.bind(this)).on('error', this._handleError.bind(this)); - }.bind(this); - - var closer; - - if (this.options.depth == null || depth <= this.options.depth) { - if (!target) read(dir, initialAdd, callback); - closer = this._watchWithNodeFs(dir, function(dirPath, stats) { - // if current directory is removed, do nothing - if (stats && stats.mtime.getTime() === 0) return; - - read(dirPath, false); - }); - } else { - callback(); - } - return closer; -}; - -// Private method: Handle added file, directory, or glob pattern. -// Delegates call to _handleFile / _handleDir after checks. - -// * path - string, path to file or directory. -// * initialAdd - boolean, was the file added at watch instantiation? -// * depth - int, depth relative to user-supplied path -// * target - string, child path actually targeted for watch -// * callback - function, indicates whether the path was found or not - -// Returns nothing -NodeFsHandler.prototype._addToNodeFs = -function(path, initialAdd, priorWh, depth, target, callback) { - if (!callback) callback = Function.prototype; - var ready = this._emitReady; - if (this._isIgnored(path) || this.closed) { - ready(); - return callback(null, false); - } - - var wh = this._getWatchHelpers(path, depth); - if (!wh.hasGlob && priorWh) { - wh.hasGlob = priorWh.hasGlob; - wh.globFilter = priorWh.globFilter; - wh.filterPath = priorWh.filterPath; - wh.filterDir = priorWh.filterDir; - } - - // evaluate what is at the path we're being asked to watch - fs[wh.statMethod](wh.watchPath, function(error, stats) { - if (this._handleError(error)) return callback(null, path); - if (this._isIgnored(wh.watchPath, stats)) { - ready(); - return callback(null, false); - } - - var initDir = function(dir, target) { - return this._handleDir(dir, stats, initialAdd, depth, target, wh, ready); - }.bind(this); - - var closer; - if (stats.isDirectory()) { - closer = initDir(wh.watchPath, target); - } else if (stats.isSymbolicLink()) { - var parent = sysPath.dirname(wh.watchPath); - this._getWatchedDir(parent).add(wh.watchPath); - this._emit('add', wh.watchPath, stats); - closer = initDir(parent, path); - - // preserve this symlink's target path - fs.realpath(path, function(error, targetPath) { - this._symlinkPaths[sysPath.resolve(path)] = targetPath; - ready(); - }.bind(this)); - } else { - closer = this._handleFile(wh.watchPath, stats, initialAdd, ready); - } - - if (closer) { - this._closers[path] = this._closers[path] || []; - this._closers[path].push(closer); - } - callback(null, false); - }.bind(this)); -}; - -module.exports = NodeFsHandler; - - -/***/ }), -/* 189 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var fs = __webpack_require__(10) - , path = __webpack_require__(3) - , micromatch = (__webpack_require__(190).isMatch) - , toString = Object.prototype.toString - ; - - -// Standard helpers -function isFunction (obj) { - return toString.call(obj) === '[object Function]'; -} - -function isString (obj) { - return toString.call(obj) === '[object String]'; -} - -function isUndefined (obj) { - return obj === void 0; -} - -/** - * Main function which ends up calling readdirRec and reads all files and directories in given root recursively. - * @param { Object } opts Options to specify root (start directory), filters and recursion depth - * @param { function } callback1 When callback2 is given calls back for each processed file - function (fileInfo) { ... }, - * when callback2 is not given, it behaves like explained in callback2 - * @param { function } callback2 Calls back once all files have been processed with an array of errors and file infos - * function (err, fileInfos) { ... } - */ -function readdir(opts, callback1, callback2) { - var stream - , handleError - , handleFatalError - , errors = [] - , readdirResult = { - directories: [] - , files: [] - } - , fileProcessed - , allProcessed - , realRoot - , aborted = false - , paused = false - ; - - // If no callbacks were given we will use a streaming interface - if (isUndefined(callback1)) { - var api = __webpack_require__(231)(); - stream = api.stream; - callback1 = api.processEntry; - callback2 = api.done; - handleError = api.handleError; - handleFatalError = api.handleFatalError; - - stream.on('close', function () { aborted = true; }); - stream.on('pause', function () { paused = true; }); - stream.on('resume', function () { paused = false; }); - } else { - handleError = function (err) { errors.push(err); }; - handleFatalError = function (err) { - handleError(err); - allProcessed(errors, null); - }; - } - - if (isUndefined(opts)){ - handleFatalError(new Error ( - 'Need to pass at least one argument: opts! \n' + - 'https://github.com/paulmillr/readdirp#options' - ) - ); - return stream; - } - - opts.root = opts.root || '.'; - opts.fileFilter = opts.fileFilter || function() { return true; }; - opts.directoryFilter = opts.directoryFilter || function() { return true; }; - opts.depth = typeof opts.depth === 'undefined' ? 999999999 : opts.depth; - opts.entryType = opts.entryType || 'files'; - - var statfn = opts.lstat === true ? fs.lstat.bind(fs) : fs.stat.bind(fs); - - if (isUndefined(callback2)) { - fileProcessed = function() { }; - allProcessed = callback1; - } else { - fileProcessed = callback1; - allProcessed = callback2; - } - - function normalizeFilter (filter) { - - if (isUndefined(filter)) return undefined; - - function isNegated (filters) { - - function negated(f) { - return f.indexOf('!') === 0; - } - - var some = filters.some(negated); - if (!some) { - return false; - } else { - if (filters.every(negated)) { - return true; - } else { - // if we detect illegal filters, bail out immediately - throw new Error( - 'Cannot mix negated with non negated glob filters: ' + filters + '\n' + - 'https://github.com/paulmillr/readdirp#filters' - ); - } - } - } - - // Turn all filters into a function - if (isFunction(filter)) { - - return filter; - - } else if (isString(filter)) { - - return function (entryInfo) { - return micromatch(entryInfo.name, filter.trim()); - }; - - } else if (filter && Array.isArray(filter)) { - - if (filter) filter = filter.map(function (f) { - return f.trim(); - }); - - return isNegated(filter) ? - // use AND to concat multiple negated filters - function (entryInfo) { - return filter.every(function (f) { - return micromatch(entryInfo.name, f); - }); - } - : - // use OR to concat multiple inclusive filters - function (entryInfo) { - return filter.some(function (f) { - return micromatch(entryInfo.name, f); - }); - }; - } - } - - function processDir(currentDir, entries, callProcessed) { - if (aborted) return; - var total = entries.length - , processed = 0 - , entryInfos = [] - ; - - fs.realpath(currentDir, function(err, realCurrentDir) { - if (aborted) return; - if (err) { - handleError(err); - callProcessed(entryInfos); - return; - } - - var relDir = path.relative(realRoot, realCurrentDir); - - if (entries.length === 0) { - callProcessed([]); - } else { - entries.forEach(function (entry) { - - var fullPath = path.join(realCurrentDir, entry) - , relPath = path.join(relDir, entry); - - statfn(fullPath, function (err, stat) { - if (err) { - handleError(err); - } else { - entryInfos.push({ - name : entry - , path : relPath // relative to root - , fullPath : fullPath - - , parentDir : relDir // relative to root - , fullParentDir : realCurrentDir - - , stat : stat - }); - } - processed++; - if (processed === total) callProcessed(entryInfos); - }); - }); - } - }); - } - - function readdirRec(currentDir, depth, callCurrentDirProcessed) { - var args = arguments; - if (aborted) return; - if (paused) { - setImmediate(function () { - readdirRec.apply(null, args); - }) - return; - } - - fs.readdir(currentDir, function (err, entries) { - if (err) { - handleError(err); - callCurrentDirProcessed(); - return; - } - - processDir(currentDir, entries, function(entryInfos) { - - var subdirs = entryInfos - .filter(function (ei) { return ei.stat.isDirectory() && opts.directoryFilter(ei); }); - - subdirs.forEach(function (di) { - if(opts.entryType === 'directories' || opts.entryType === 'both' || opts.entryType === 'all') { - fileProcessed(di); - } - readdirResult.directories.push(di); - }); - - entryInfos - .filter(function(ei) { - var isCorrectType = opts.entryType === 'all' ? - !ei.stat.isDirectory() : ei.stat.isFile() || ei.stat.isSymbolicLink(); - return isCorrectType && opts.fileFilter(ei); - }) - .forEach(function (fi) { - if(opts.entryType === 'files' || opts.entryType === 'both' || opts.entryType === 'all') { - fileProcessed(fi); - } - readdirResult.files.push(fi); - }); - - var pendingSubdirs = subdirs.length; - - // Be done if no more subfolders exist or we reached the maximum desired depth - if(pendingSubdirs === 0 || depth === opts.depth) { - callCurrentDirProcessed(); - } else { - // recurse into subdirs, keeping track of which ones are done - // and call back once all are processed - subdirs.forEach(function (subdir) { - readdirRec(subdir.fullPath, depth + 1, function () { - pendingSubdirs = pendingSubdirs - 1; - if(pendingSubdirs === 0) { - callCurrentDirProcessed(); - } - }); - }); - } - }); - }); - } - - // Validate and normalize filters - try { - opts.fileFilter = normalizeFilter(opts.fileFilter); - opts.directoryFilter = normalizeFilter(opts.directoryFilter); - } catch (err) { - // if we detect illegal filters, bail out immediately - handleFatalError(err); - return stream; - } - - // If filters were valid get on with the show - fs.realpath(opts.root, function(err, res) { - if (err) { - handleFatalError(err); - return stream; - } - - realRoot = res; - readdirRec(opts.root, 0, function () { - // All errors are collected into the errors array - if (errors.length > 0) { - allProcessed(errors, readdirResult); - } else { - allProcessed(null, readdirResult); - } - }); - }); - - return stream; -} - -module.exports = readdir; - - -/***/ }), -/* 190 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -/** - * Module dependencies - */ - -var util = __webpack_require__(17); -var braces = __webpack_require__(72); -var toRegex = __webpack_require__(73); -var extend = __webpack_require__(191); - -/** - * Local dependencies - */ - -var compilers = __webpack_require__(193); -var parsers = __webpack_require__(225); -var cache = __webpack_require__(226); -var utils = __webpack_require__(227); -var MAX_LENGTH = 1024 * 64; - -/** - * The main function takes a list of strings and one or more - * glob patterns to use for matching. - * - * ```js - * var mm = require('micromatch'); - * mm(list, patterns[, options]); - * - * console.log(mm(['a.js', 'a.txt'], ['*.js'])); - * //=> [ 'a.js' ] - * ``` - * @param {Array} `list` A list of strings to match - * @param {String|Array} `patterns` One or more glob patterns to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Array} Returns an array of matches - * @summary false - * @api public - */ - -function micromatch(list, patterns, options) { - patterns = utils.arrayify(patterns); - list = utils.arrayify(list); - - var len = patterns.length; - if (list.length === 0 || len === 0) { - return []; - } - - if (len === 1) { - return micromatch.match(list, patterns[0], options); - } - - var omit = []; - var keep = []; - var idx = -1; - - while (++idx < len) { - var pattern = patterns[idx]; - - if (typeof pattern === 'string' && pattern.charCodeAt(0) === 33 /* ! */) { - omit.push.apply(omit, micromatch.match(list, pattern.slice(1), options)); - } else { - keep.push.apply(keep, micromatch.match(list, pattern, options)); - } - } - - var matches = utils.diff(keep, omit); - if (!options || options.nodupes !== false) { - return utils.unique(matches); - } - - return matches; -} - -/** - * Similar to the main function, but `pattern` must be a string. - * - * ```js - * var mm = require('micromatch'); - * mm.match(list, pattern[, options]); - * - * console.log(mm.match(['a.a', 'a.aa', 'a.b', 'a.c'], '*.a')); - * //=> ['a.a', 'a.aa'] - * ``` - * @param {Array} `list` Array of strings to match - * @param {String} `pattern` Glob pattern to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Array} Returns an array of matches - * @api public - */ - -micromatch.match = function(list, pattern, options) { - if (Array.isArray(pattern)) { - throw new TypeError('expected pattern to be a string'); - } - - var unixify = utils.unixify(options); - var isMatch = memoize('match', pattern, options, micromatch.matcher); - var matches = []; - - list = utils.arrayify(list); - var len = list.length; - var idx = -1; - - while (++idx < len) { - var ele = list[idx]; - if (ele === pattern || isMatch(ele)) { - matches.push(utils.value(ele, unixify, options)); - } - } - - // if no options were passed, uniquify results and return - if (typeof options === 'undefined') { - return utils.unique(matches); - } - - if (matches.length === 0) { - if (options.failglob === true) { - throw new Error('no matches found for "' + pattern + '"'); - } - if (options.nonull === true || options.nullglob === true) { - return [options.unescape ? utils.unescape(pattern) : pattern]; - } - } - - // if `opts.ignore` was defined, diff ignored list - if (options.ignore) { - matches = micromatch.not(matches, options.ignore, options); - } - - return options.nodupes !== false ? utils.unique(matches) : matches; -}; - -/** - * Returns true if the specified `string` matches the given glob `pattern`. - * - * ```js - * var mm = require('micromatch'); - * mm.isMatch(string, pattern[, options]); - * - * console.log(mm.isMatch('a.a', '*.a')); - * //=> true - * console.log(mm.isMatch('a.b', '*.a')); - * //=> false - * ``` - * @param {String} `string` String to match - * @param {String} `pattern` Glob pattern to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Boolean} Returns true if the string matches the glob pattern. - * @api public - */ - -micromatch.isMatch = function(str, pattern, options) { - if (typeof str !== 'string') { - throw new TypeError('expected a string: "' + util.inspect(str) + '"'); - } - - if (isEmptyString(str) || isEmptyString(pattern)) { - return false; - } - - var equals = utils.equalsPattern(options); - if (equals(str)) { - return true; - } - - var isMatch = memoize('isMatch', pattern, options, micromatch.matcher); - return isMatch(str); -}; - -/** - * Returns true if some of the strings in the given `list` match any of the - * given glob `patterns`. - * - * ```js - * var mm = require('micromatch'); - * mm.some(list, patterns[, options]); - * - * console.log(mm.some(['foo.js', 'bar.js'], ['*.js', '!foo.js'])); - * // true - * console.log(mm.some(['foo.js'], ['*.js', '!foo.js'])); - * // false - * ``` - * @param {String|Array} `list` The string or array of strings to test. Returns as soon as the first match is found. - * @param {String|Array} `patterns` One or more glob patterns to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Boolean} Returns true if any patterns match `str` - * @api public - */ - -micromatch.some = function(list, patterns, options) { - if (typeof list === 'string') { - list = [list]; - } - for (var i = 0; i < list.length; i++) { - if (micromatch(list[i], patterns, options).length === 1) { - return true; - } - } - return false; -}; - -/** - * Returns true if every string in the given `list` matches - * any of the given glob `patterns`. - * - * ```js - * var mm = require('micromatch'); - * mm.every(list, patterns[, options]); - * - * console.log(mm.every('foo.js', ['foo.js'])); - * // true - * console.log(mm.every(['foo.js', 'bar.js'], ['*.js'])); - * // true - * console.log(mm.every(['foo.js', 'bar.js'], ['*.js', '!foo.js'])); - * // false - * console.log(mm.every(['foo.js'], ['*.js', '!foo.js'])); - * // false - * ``` - * @param {String|Array} `list` The string or array of strings to test. - * @param {String|Array} `patterns` One or more glob patterns to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Boolean} Returns true if any patterns match `str` - * @api public - */ - -micromatch.every = function(list, patterns, options) { - if (typeof list === 'string') { - list = [list]; - } - for (var i = 0; i < list.length; i++) { - if (micromatch(list[i], patterns, options).length !== 1) { - return false; - } - } - return true; -}; - -/** - * Returns true if **any** of the given glob `patterns` - * match the specified `string`. - * - * ```js - * var mm = require('micromatch'); - * mm.any(string, patterns[, options]); - * - * console.log(mm.any('a.a', ['b.*', '*.a'])); - * //=> true - * console.log(mm.any('a.a', 'b.*')); - * //=> false - * ``` - * @param {String|Array} `str` The string to test. - * @param {String|Array} `patterns` One or more glob patterns to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Boolean} Returns true if any patterns match `str` - * @api public - */ - -micromatch.any = function(str, patterns, options) { - if (typeof str !== 'string') { - throw new TypeError('expected a string: "' + util.inspect(str) + '"'); - } - - if (isEmptyString(str) || isEmptyString(patterns)) { - return false; - } - - if (typeof patterns === 'string') { - patterns = [patterns]; - } - - for (var i = 0; i < patterns.length; i++) { - if (micromatch.isMatch(str, patterns[i], options)) { - return true; - } - } - return false; -}; - -/** - * Returns true if **all** of the given `patterns` match - * the specified string. - * - * ```js - * var mm = require('micromatch'); - * mm.all(string, patterns[, options]); - * - * console.log(mm.all('foo.js', ['foo.js'])); - * // true - * - * console.log(mm.all('foo.js', ['*.js', '!foo.js'])); - * // false - * - * console.log(mm.all('foo.js', ['*.js', 'foo.js'])); - * // true - * - * console.log(mm.all('foo.js', ['*.js', 'f*', '*o*', '*o.js'])); - * // true - * ``` - * @param {String|Array} `str` The string to test. - * @param {String|Array} `patterns` One or more glob patterns to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Boolean} Returns true if any patterns match `str` - * @api public - */ - -micromatch.all = function(str, patterns, options) { - if (typeof str !== 'string') { - throw new TypeError('expected a string: "' + util.inspect(str) + '"'); - } - if (typeof patterns === 'string') { - patterns = [patterns]; - } - for (var i = 0; i < patterns.length; i++) { - if (!micromatch.isMatch(str, patterns[i], options)) { - return false; - } - } - return true; -}; - -/** - * Returns a list of strings that _**do not match any**_ of the given `patterns`. - * - * ```js - * var mm = require('micromatch'); - * mm.not(list, patterns[, options]); - * - * console.log(mm.not(['a.a', 'b.b', 'c.c'], '*.a')); - * //=> ['b.b', 'c.c'] - * ``` - * @param {Array} `list` Array of strings to match. - * @param {String|Array} `patterns` One or more glob pattern to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Array} Returns an array of strings that **do not match** the given patterns. - * @api public - */ - -micromatch.not = function(list, patterns, options) { - var opts = extend({}, options); - var ignore = opts.ignore; - delete opts.ignore; - - var unixify = utils.unixify(opts); - list = utils.arrayify(list).map(unixify); - - var matches = utils.diff(list, micromatch(list, patterns, opts)); - if (ignore) { - matches = utils.diff(matches, micromatch(list, ignore)); - } - - return opts.nodupes !== false ? utils.unique(matches) : matches; -}; - -/** - * Returns true if the given `string` contains the given pattern. Similar - * to [.isMatch](#isMatch) but the pattern can match any part of the string. - * - * ```js - * var mm = require('micromatch'); - * mm.contains(string, pattern[, options]); - * - * console.log(mm.contains('aa/bb/cc', '*b')); - * //=> true - * console.log(mm.contains('aa/bb/cc', '*d')); - * //=> false - * ``` - * @param {String} `str` The string to match. - * @param {String|Array} `patterns` Glob pattern to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Boolean} Returns true if the patter matches any part of `str`. - * @api public - */ - -micromatch.contains = function(str, patterns, options) { - if (typeof str !== 'string') { - throw new TypeError('expected a string: "' + util.inspect(str) + '"'); - } - - if (typeof patterns === 'string') { - if (isEmptyString(str) || isEmptyString(patterns)) { - return false; - } - - var equals = utils.equalsPattern(patterns, options); - if (equals(str)) { - return true; - } - var contains = utils.containsPattern(patterns, options); - if (contains(str)) { - return true; - } - } - - var opts = extend({}, options, {contains: true}); - return micromatch.any(str, patterns, opts); -}; - -/** - * Returns true if the given pattern and options should enable - * the `matchBase` option. - * @return {Boolean} - * @api private - */ - -micromatch.matchBase = function(pattern, options) { - if (pattern && pattern.indexOf('/') !== -1 || !options) return false; - return options.basename === true || options.matchBase === true; -}; - -/** - * Filter the keys of the given object with the given `glob` pattern - * and `options`. Does not attempt to match nested keys. If you need this feature, - * use [glob-object][] instead. - * - * ```js - * var mm = require('micromatch'); - * mm.matchKeys(object, patterns[, options]); - * - * var obj = { aa: 'a', ab: 'b', ac: 'c' }; - * console.log(mm.matchKeys(obj, '*b')); - * //=> { ab: 'b' } - * ``` - * @param {Object} `object` The object with keys to filter. - * @param {String|Array} `patterns` One or more glob patterns to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Object} Returns an object with only keys that match the given patterns. - * @api public - */ - -micromatch.matchKeys = function(obj, patterns, options) { - if (!utils.isObject(obj)) { - throw new TypeError('expected the first argument to be an object'); - } - var keys = micromatch(Object.keys(obj), patterns, options); - return utils.pick(obj, keys); -}; - -/** - * Returns a memoized matcher function from the given glob `pattern` and `options`. - * The returned function takes a string to match as its only argument and returns - * true if the string is a match. - * - * ```js - * var mm = require('micromatch'); - * mm.matcher(pattern[, options]); - * - * var isMatch = mm.matcher('*.!(*a)'); - * console.log(isMatch('a.a')); - * //=> false - * console.log(isMatch('a.b')); - * //=> true - * ``` - * @param {String} `pattern` Glob pattern - * @param {Object} `options` See available [options](#options) for changing how matches are performed. - * @return {Function} Returns a matcher function. - * @api public - */ - -micromatch.matcher = function matcher(pattern, options) { - if (Array.isArray(pattern)) { - return compose(pattern, options, matcher); - } - - // if pattern is a regex - if (pattern instanceof RegExp) { - return test(pattern); - } - - // if pattern is invalid - if (!utils.isString(pattern)) { - throw new TypeError('expected pattern to be an array, string or regex'); - } - - // if pattern is a non-glob string - if (!utils.hasSpecialChars(pattern)) { - if (options && options.nocase === true) { - pattern = pattern.toLowerCase(); - } - return utils.matchPath(pattern, options); - } - - // if pattern is a glob string - var re = micromatch.makeRe(pattern, options); - - // if `options.matchBase` or `options.basename` is defined - if (micromatch.matchBase(pattern, options)) { - return utils.matchBasename(re, options); - } - - function test(regex) { - var equals = utils.equalsPattern(options); - var unixify = utils.unixify(options); - - return function(str) { - if (equals(str)) { - return true; - } - - if (regex.test(unixify(str))) { - return true; - } - return false; - }; - } - - var fn = test(re); - Object.defineProperty(fn, 'result', { - configurable: true, - enumerable: false, - value: re.result - }); - return fn; -}; - -/** - * Returns an array of matches captured by `pattern` in `string, or `null` if the pattern did not match. - * - * ```js - * var mm = require('micromatch'); - * mm.capture(pattern, string[, options]); - * - * console.log(mm.capture('test/*.js', 'test/foo.js')); - * //=> ['foo'] - * console.log(mm.capture('test/*.js', 'foo/bar.css')); - * //=> null - * ``` - * @param {String} `pattern` Glob pattern to use for matching. - * @param {String} `string` String to match - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Boolean} Returns an array of captures if the string matches the glob pattern, otherwise `null`. - * @api public - */ - -micromatch.capture = function(pattern, str, options) { - var re = micromatch.makeRe(pattern, extend({capture: true}, options)); - var unixify = utils.unixify(options); - - function match() { - return function(string) { - var match = re.exec(unixify(string)); - if (!match) { - return null; - } - - return match.slice(1); - }; - } - - var capture = memoize('capture', pattern, options, match); - return capture(str); -}; - -/** - * Create a regular expression from the given glob `pattern`. - * - * ```js - * var mm = require('micromatch'); - * mm.makeRe(pattern[, options]); - * - * console.log(mm.makeRe('*.js')); - * //=> /^(?:(\.[\\\/])?(?!\.)(?=.)[^\/]*?\.js)$/ - * ``` - * @param {String} `pattern` A glob pattern to convert to regex. - * @param {Object} `options` See available [options](#options) for changing how matches are performed. - * @return {RegExp} Returns a regex created from the given pattern. - * @api public - */ - -micromatch.makeRe = function(pattern, options) { - if (typeof pattern !== 'string') { - throw new TypeError('expected pattern to be a string'); - } - - if (pattern.length > MAX_LENGTH) { - throw new Error('expected pattern to be less than ' + MAX_LENGTH + ' characters'); - } - - function makeRe() { - var result = micromatch.create(pattern, options); - var ast_array = []; - var output = result.map(function(obj) { - obj.ast.state = obj.state; - ast_array.push(obj.ast); - return obj.output; - }); - - var regex = toRegex(output.join('|'), options); - Object.defineProperty(regex, 'result', { - configurable: true, - enumerable: false, - value: ast_array - }); - return regex; - } - - return memoize('makeRe', pattern, options, makeRe); -}; - -/** - * Expand the given brace `pattern`. - * - * ```js - * var mm = require('micromatch'); - * console.log(mm.braces('foo/{a,b}/bar')); - * //=> ['foo/(a|b)/bar'] - * - * console.log(mm.braces('foo/{a,b}/bar', {expand: true})); - * //=> ['foo/(a|b)/bar'] - * ``` - * @param {String} `pattern` String with brace pattern to expand. - * @param {Object} `options` Any [options](#options) to change how expansion is performed. See the [braces][] library for all available options. - * @return {Array} - * @api public - */ - -micromatch.braces = function(pattern, options) { - if (typeof pattern !== 'string' && !Array.isArray(pattern)) { - throw new TypeError('expected pattern to be an array or string'); - } - - function expand() { - if (options && options.nobrace === true || !/\{.*\}/.test(pattern)) { - return utils.arrayify(pattern); - } - return braces(pattern, options); - } - - return memoize('braces', pattern, options, expand); -}; - -/** - * Proxy to the [micromatch.braces](#method), for parity with - * minimatch. - */ - -micromatch.braceExpand = function(pattern, options) { - var opts = extend({}, options, {expand: true}); - return micromatch.braces(pattern, opts); -}; - -/** - * Parses the given glob `pattern` and returns an array of abstract syntax - * trees (ASTs), with the compiled `output` and optional source `map` on - * each AST. - * - * ```js - * var mm = require('micromatch'); - * mm.create(pattern[, options]); - * - * console.log(mm.create('abc/*.js')); - * // [{ options: { source: 'string', sourcemap: true }, - * // state: {}, - * // compilers: - * // { ... }, - * // output: '(\\.[\\\\\\/])?abc\\/(?!\\.)(?=.)[^\\/]*?\\.js', - * // ast: - * // { type: 'root', - * // errors: [], - * // nodes: - * // [ ... ], - * // dot: false, - * // input: 'abc/*.js' }, - * // parsingErrors: [], - * // map: - * // { version: 3, - * // sources: [ 'string' ], - * // names: [], - * // mappings: 'AAAA,GAAG,EAAC,kBAAC,EAAC,EAAE', - * // sourcesContent: [ 'abc/*.js' ] }, - * // position: { line: 1, column: 28 }, - * // content: {}, - * // files: {}, - * // idx: 6 }] - * ``` - * @param {String} `pattern` Glob pattern to parse and compile. - * @param {Object} `options` Any [options](#options) to change how parsing and compiling is performed. - * @return {Object} Returns an object with the parsed AST, compiled string and optional source map. - * @api public - */ - -micromatch.create = function(pattern, options) { - return memoize('create', pattern, options, function() { - function create(str, opts) { - return micromatch.compile(micromatch.parse(str, opts), opts); - } - - pattern = micromatch.braces(pattern, options); - var len = pattern.length; - var idx = -1; - var res = []; - - while (++idx < len) { - res.push(create(pattern[idx], options)); - } - return res; - }); -}; - -/** - * Parse the given `str` with the given `options`. - * - * ```js - * var mm = require('micromatch'); - * mm.parse(pattern[, options]); - * - * var ast = mm.parse('a/{b,c}/d'); - * console.log(ast); - * // { type: 'root', - * // errors: [], - * // input: 'a/{b,c}/d', - * // nodes: - * // [ { type: 'bos', val: '' }, - * // { type: 'text', val: 'a/' }, - * // { type: 'brace', - * // nodes: - * // [ { type: 'brace.open', val: '{' }, - * // { type: 'text', val: 'b,c' }, - * // { type: 'brace.close', val: '}' } ] }, - * // { type: 'text', val: '/d' }, - * // { type: 'eos', val: '' } ] } - * ``` - * @param {String} `str` - * @param {Object} `options` - * @return {Object} Returns an AST - * @api public - */ - -micromatch.parse = function(pattern, options) { - if (typeof pattern !== 'string') { - throw new TypeError('expected a string'); - } - - function parse() { - var snapdragon = utils.instantiate(null, options); - parsers(snapdragon, options); - - var ast = snapdragon.parse(pattern, options); - utils.define(ast, 'snapdragon', snapdragon); - ast.input = pattern; - return ast; - } - - return memoize('parse', pattern, options, parse); -}; - -/** - * Compile the given `ast` or string with the given `options`. - * - * ```js - * var mm = require('micromatch'); - * mm.compile(ast[, options]); - * - * var ast = mm.parse('a/{b,c}/d'); - * console.log(mm.compile(ast)); - * // { options: { source: 'string' }, - * // state: {}, - * // compilers: - * // { eos: [Function], - * // noop: [Function], - * // bos: [Function], - * // brace: [Function], - * // 'brace.open': [Function], - * // text: [Function], - * // 'brace.close': [Function] }, - * // output: [ 'a/(b|c)/d' ], - * // ast: - * // { ... }, - * // parsingErrors: [] } - * ``` - * @param {Object|String} `ast` - * @param {Object} `options` - * @return {Object} Returns an object that has an `output` property with the compiled string. - * @api public - */ - -micromatch.compile = function(ast, options) { - if (typeof ast === 'string') { - ast = micromatch.parse(ast, options); - } - - return memoize('compile', ast.input, options, function() { - var snapdragon = utils.instantiate(ast, options); - compilers(snapdragon, options); - return snapdragon.compile(ast, options); - }); -}; - -/** - * Clear the regex cache. - * - * ```js - * mm.clearCache(); - * ``` - * @api public - */ - -micromatch.clearCache = function() { - micromatch.cache.caches = {}; -}; - -/** - * Returns true if the given value is effectively an empty string - */ - -function isEmptyString(val) { - return String(val) === '' || String(val) === './'; -} - -/** - * Compose a matcher function with the given patterns. - * This allows matcher functions to be compiled once and - * called multiple times. - */ - -function compose(patterns, options, matcher) { - var matchers; - - return memoize('compose', String(patterns), options, function() { - return function(file) { - // delay composition until it's invoked the first time, - // after that it won't be called again - if (!matchers) { - matchers = []; - for (var i = 0; i < patterns.length; i++) { - matchers.push(matcher(patterns[i], options)); - } - } - - var len = matchers.length; - while (len--) { - if (matchers[len](file) === true) { - return true; - } - } - return false; - }; - }); -} - -/** - * Memoize a generated regex or function. A unique key is generated - * from the `type` (usually method name), the `pattern`, and - * user-defined options. - */ - -function memoize(type, pattern, options, fn) { - var key = utils.createKey(type + '=' + pattern, options); - - if (options && options.cache === false) { - return fn(pattern, options); - } - - if (cache.has(type, key)) { - return cache.get(type, key); - } - - var val = fn(pattern, options); - cache.set(type, key, val); - return val; -} - -/** - * Expose compiler, parser and cache on `micromatch` - */ - -micromatch.compilers = compilers; -micromatch.parsers = parsers; -micromatch.caches = cache.caches; - -/** - * Expose `micromatch` - * @type {Function} - */ - -module.exports = micromatch; - - -/***/ }), -/* 191 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var isExtendable = __webpack_require__(192); -var assignSymbols = __webpack_require__(91); - -module.exports = Object.assign || function(obj/*, objects*/) { - if (obj === null || typeof obj === 'undefined') { - throw new TypeError('Cannot convert undefined or null to object'); - } - if (!isObject(obj)) { - obj = {}; - } - for (var i = 1; i < arguments.length; i++) { - var val = arguments[i]; - if (isString(val)) { - val = toObject(val); - } - if (isObject(val)) { - assign(obj, val); - assignSymbols(obj, val); - } - } - return obj; -}; - -function assign(a, b) { - for (var key in b) { - if (hasOwn(b, key)) { - a[key] = b[key]; - } - } -} - -function isString(val) { - return (val && typeof val === 'string'); -} - -function toObject(str) { - var obj = {}; - for (var i in str) { - obj[i] = str[i]; - } - return obj; -} - -function isObject(val) { - return (val && typeof val === 'object') || isExtendable(val); -} - -/** - * Returns true if the given `key` is an own property of `obj`. - */ - -function hasOwn(obj, key) { - return Object.prototype.hasOwnProperty.call(obj, key); -} - -function isEnum(obj, key) { - return Object.prototype.propertyIsEnumerable.call(obj, key); -} - - -/***/ }), -/* 192 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -/*! - * is-extendable - * - * Copyright (c) 2015-2017, Jon Schlinkert. - * Released under the MIT License. - */ - - - -var isPlainObject = __webpack_require__(90); - -module.exports = function isExtendable(val) { - return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); -}; - - -/***/ }), -/* 193 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var nanomatch = __webpack_require__(194); -var extglob = __webpack_require__(208); - -module.exports = function(snapdragon) { - var compilers = snapdragon.compiler.compilers; - var opts = snapdragon.options; - - // register nanomatch compilers - snapdragon.use(nanomatch.compilers); - - // get references to some specific nanomatch compilers before they - // are overridden by the extglob and/or custom compilers - var escape = compilers.escape; - var qmark = compilers.qmark; - var slash = compilers.slash; - var star = compilers.star; - var text = compilers.text; - var plus = compilers.plus; - var dot = compilers.dot; - - // register extglob compilers or escape exglobs if disabled - if (opts.extglob === false || opts.noext === true) { - snapdragon.compiler.use(escapeExtglobs); - } else { - snapdragon.use(extglob.compilers); - } - - snapdragon.use(function() { - this.options.star = this.options.star || function(/*node*/) { - return '[^\\\\/]*?'; - }; - }); - - // custom micromatch compilers - snapdragon.compiler - - // reset referenced compiler - .set('dot', dot) - .set('escape', escape) - .set('plus', plus) - .set('slash', slash) - .set('qmark', qmark) - .set('star', star) - .set('text', text); -}; - -function escapeExtglobs(compiler) { - compiler.set('paren', function(node) { - var val = ''; - visit(node, function(tok) { - if (tok.val) val += (/^\W/.test(tok.val) ? '\\' : '') + tok.val; - }); - return this.emit(val, node); - }); - - /** - * Visit `node` with the given `fn` - */ - - function visit(node, fn) { - return node.nodes ? mapVisit(node.nodes, fn) : fn(node); - } - - /** - * Map visit over array of `nodes`. - */ - - function mapVisit(nodes, fn) { - var len = nodes.length; - var idx = -1; - while (++idx < len) { - visit(nodes[idx], fn); - } - } -} - - -/***/ }), -/* 194 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -/** - * Module dependencies - */ - -var util = __webpack_require__(17); -var toRegex = __webpack_require__(73); -var extend = __webpack_require__(195); - -/** - * Local dependencies - */ - -var compilers = __webpack_require__(197); -var parsers = __webpack_require__(198); -var cache = __webpack_require__(199); -var utils = __webpack_require__(201); -var MAX_LENGTH = 1024 * 64; - -/** - * The main function takes a list of strings and one or more - * glob patterns to use for matching. - * - * ```js - * var nm = require('nanomatch'); - * nm(list, patterns[, options]); - * - * console.log(nm(['a.js', 'a.txt'], ['*.js'])); - * //=> [ 'a.js' ] - * ``` - * @param {Array} `list` A list of strings to match - * @param {String|Array} `patterns` One or more glob patterns to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Array} Returns an array of matches - * @summary false - * @api public - */ - -function nanomatch(list, patterns, options) { - patterns = utils.arrayify(patterns); - list = utils.arrayify(list); - - var len = patterns.length; - if (list.length === 0 || len === 0) { - return []; - } - - if (len === 1) { - return nanomatch.match(list, patterns[0], options); - } - - var negated = false; - var omit = []; - var keep = []; - var idx = -1; - - while (++idx < len) { - var pattern = patterns[idx]; - - if (typeof pattern === 'string' && pattern.charCodeAt(0) === 33 /* ! */) { - omit.push.apply(omit, nanomatch.match(list, pattern.slice(1), options)); - negated = true; - } else { - keep.push.apply(keep, nanomatch.match(list, pattern, options)); - } - } - - // minimatch.match parity - if (negated && keep.length === 0) { - if (options && options.unixify === false) { - keep = list.slice(); - } else { - var unixify = utils.unixify(options); - for (var i = 0; i < list.length; i++) { - keep.push(unixify(list[i])); - } - } - } - - var matches = utils.diff(keep, omit); - if (!options || options.nodupes !== false) { - return utils.unique(matches); - } - - return matches; -} - -/** - * Similar to the main function, but `pattern` must be a string. - * - * ```js - * var nm = require('nanomatch'); - * nm.match(list, pattern[, options]); - * - * console.log(nm.match(['a.a', 'a.aa', 'a.b', 'a.c'], '*.a')); - * //=> ['a.a', 'a.aa'] - * ``` - * @param {Array} `list` Array of strings to match - * @param {String} `pattern` Glob pattern to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Array} Returns an array of matches - * @api public - */ - -nanomatch.match = function(list, pattern, options) { - if (Array.isArray(pattern)) { - throw new TypeError('expected pattern to be a string'); - } - - var unixify = utils.unixify(options); - var isMatch = memoize('match', pattern, options, nanomatch.matcher); - var matches = []; - - list = utils.arrayify(list); - var len = list.length; - var idx = -1; - - while (++idx < len) { - var ele = list[idx]; - if (ele === pattern || isMatch(ele)) { - matches.push(utils.value(ele, unixify, options)); - } - } - - // if no options were passed, uniquify results and return - if (typeof options === 'undefined') { - return utils.unique(matches); - } - - if (matches.length === 0) { - if (options.failglob === true) { - throw new Error('no matches found for "' + pattern + '"'); - } - if (options.nonull === true || options.nullglob === true) { - return [options.unescape ? utils.unescape(pattern) : pattern]; - } - } - - // if `opts.ignore` was defined, diff ignored list - if (options.ignore) { - matches = nanomatch.not(matches, options.ignore, options); - } - - return options.nodupes !== false ? utils.unique(matches) : matches; -}; - -/** - * Returns true if the specified `string` matches the given glob `pattern`. - * - * ```js - * var nm = require('nanomatch'); - * nm.isMatch(string, pattern[, options]); - * - * console.log(nm.isMatch('a.a', '*.a')); - * //=> true - * console.log(nm.isMatch('a.b', '*.a')); - * //=> false - * ``` - * @param {String} `string` String to match - * @param {String} `pattern` Glob pattern to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Boolean} Returns true if the string matches the glob pattern. - * @api public - */ - -nanomatch.isMatch = function(str, pattern, options) { - if (typeof str !== 'string') { - throw new TypeError('expected a string: "' + util.inspect(str) + '"'); - } - - if (utils.isEmptyString(str) || utils.isEmptyString(pattern)) { - return false; - } - - var equals = utils.equalsPattern(options); - if (equals(str)) { - return true; - } - - var isMatch = memoize('isMatch', pattern, options, nanomatch.matcher); - return isMatch(str); -}; - -/** - * Returns true if some of the elements in the given `list` match any of the - * given glob `patterns`. - * - * ```js - * var nm = require('nanomatch'); - * nm.some(list, patterns[, options]); - * - * console.log(nm.some(['foo.js', 'bar.js'], ['*.js', '!foo.js'])); - * // true - * console.log(nm.some(['foo.js'], ['*.js', '!foo.js'])); - * // false - * ``` - * @param {String|Array} `list` The string or array of strings to test. Returns as soon as the first match is found. - * @param {String|Array} `patterns` One or more glob patterns to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Boolean} Returns true if any patterns match `str` - * @api public - */ - -nanomatch.some = function(list, patterns, options) { - if (typeof list === 'string') { - list = [list]; - } - - for (var i = 0; i < list.length; i++) { - if (nanomatch(list[i], patterns, options).length === 1) { - return true; - } - } - - return false; -}; - -/** - * Returns true if every element in the given `list` matches - * at least one of the given glob `patterns`. - * - * ```js - * var nm = require('nanomatch'); - * nm.every(list, patterns[, options]); - * - * console.log(nm.every('foo.js', ['foo.js'])); - * // true - * console.log(nm.every(['foo.js', 'bar.js'], ['*.js'])); - * // true - * console.log(nm.every(['foo.js', 'bar.js'], ['*.js', '!foo.js'])); - * // false - * console.log(nm.every(['foo.js'], ['*.js', '!foo.js'])); - * // false - * ``` - * @param {String|Array} `list` The string or array of strings to test. - * @param {String|Array} `patterns` One or more glob patterns to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Boolean} Returns true if any patterns match `str` - * @api public - */ - -nanomatch.every = function(list, patterns, options) { - if (typeof list === 'string') { - list = [list]; - } - - for (var i = 0; i < list.length; i++) { - if (nanomatch(list[i], patterns, options).length !== 1) { - return false; - } - } - - return true; -}; - -/** - * Returns true if **any** of the given glob `patterns` - * match the specified `string`. - * - * ```js - * var nm = require('nanomatch'); - * nm.any(string, patterns[, options]); - * - * console.log(nm.any('a.a', ['b.*', '*.a'])); - * //=> true - * console.log(nm.any('a.a', 'b.*')); - * //=> false - * ``` - * @param {String|Array} `str` The string to test. - * @param {String|Array} `patterns` One or more glob patterns to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Boolean} Returns true if any patterns match `str` - * @api public - */ - -nanomatch.any = function(str, patterns, options) { - if (typeof str !== 'string') { - throw new TypeError('expected a string: "' + util.inspect(str) + '"'); - } - - if (utils.isEmptyString(str) || utils.isEmptyString(patterns)) { - return false; - } - - if (typeof patterns === 'string') { - patterns = [patterns]; - } - - for (var i = 0; i < patterns.length; i++) { - if (nanomatch.isMatch(str, patterns[i], options)) { - return true; - } - } - return false; -}; - -/** - * Returns true if **all** of the given `patterns` - * match the specified string. - * - * ```js - * var nm = require('nanomatch'); - * nm.all(string, patterns[, options]); - * - * console.log(nm.all('foo.js', ['foo.js'])); - * // true - * - * console.log(nm.all('foo.js', ['*.js', '!foo.js'])); - * // false - * - * console.log(nm.all('foo.js', ['*.js', 'foo.js'])); - * // true - * - * console.log(nm.all('foo.js', ['*.js', 'f*', '*o*', '*o.js'])); - * // true - * ``` - * @param {String|Array} `str` The string to test. - * @param {String|Array} `patterns` One or more glob patterns to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Boolean} Returns true if any patterns match `str` - * @api public - */ - -nanomatch.all = function(str, patterns, options) { - if (typeof str !== 'string') { - throw new TypeError('expected a string: "' + util.inspect(str) + '"'); - } - - if (typeof patterns === 'string') { - patterns = [patterns]; - } - - for (var i = 0; i < patterns.length; i++) { - if (!nanomatch.isMatch(str, patterns[i], options)) { - return false; - } - } - return true; -}; - -/** - * Returns a list of strings that _**do not match any**_ of the given `patterns`. - * - * ```js - * var nm = require('nanomatch'); - * nm.not(list, patterns[, options]); - * - * console.log(nm.not(['a.a', 'b.b', 'c.c'], '*.a')); - * //=> ['b.b', 'c.c'] - * ``` - * @param {Array} `list` Array of strings to match. - * @param {String|Array} `patterns` One or more glob pattern to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Array} Returns an array of strings that **do not match** the given patterns. - * @api public - */ - -nanomatch.not = function(list, patterns, options) { - var opts = extend({}, options); - var ignore = opts.ignore; - delete opts.ignore; - - list = utils.arrayify(list); - - var matches = utils.diff(list, nanomatch(list, patterns, opts)); - if (ignore) { - matches = utils.diff(matches, nanomatch(list, ignore)); - } - - return opts.nodupes !== false ? utils.unique(matches) : matches; -}; - -/** - * Returns true if the given `string` contains the given pattern. Similar - * to [.isMatch](#isMatch) but the pattern can match any part of the string. - * - * ```js - * var nm = require('nanomatch'); - * nm.contains(string, pattern[, options]); - * - * console.log(nm.contains('aa/bb/cc', '*b')); - * //=> true - * console.log(nm.contains('aa/bb/cc', '*d')); - * //=> false - * ``` - * @param {String} `str` The string to match. - * @param {String|Array} `patterns` Glob pattern to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Boolean} Returns true if the patter matches any part of `str`. - * @api public - */ - -nanomatch.contains = function(str, patterns, options) { - if (typeof str !== 'string') { - throw new TypeError('expected a string: "' + util.inspect(str) + '"'); - } - - if (typeof patterns === 'string') { - if (utils.isEmptyString(str) || utils.isEmptyString(patterns)) { - return false; - } - - var equals = utils.equalsPattern(patterns, options); - if (equals(str)) { - return true; - } - var contains = utils.containsPattern(patterns, options); - if (contains(str)) { - return true; - } - } - - var opts = extend({}, options, {contains: true}); - return nanomatch.any(str, patterns, opts); -}; - -/** - * Returns true if the given pattern and options should enable - * the `matchBase` option. - * @return {Boolean} - * @api private - */ - -nanomatch.matchBase = function(pattern, options) { - if (pattern && pattern.indexOf('/') !== -1 || !options) return false; - return options.basename === true || options.matchBase === true; -}; - -/** - * Filter the keys of the given object with the given `glob` pattern - * and `options`. Does not attempt to match nested keys. If you need this feature, - * use [glob-object][] instead. - * - * ```js - * var nm = require('nanomatch'); - * nm.matchKeys(object, patterns[, options]); - * - * var obj = { aa: 'a', ab: 'b', ac: 'c' }; - * console.log(nm.matchKeys(obj, '*b')); - * //=> { ab: 'b' } - * ``` - * @param {Object} `object` The object with keys to filter. - * @param {String|Array} `patterns` One or more glob patterns to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Object} Returns an object with only keys that match the given patterns. - * @api public - */ - -nanomatch.matchKeys = function(obj, patterns, options) { - if (!utils.isObject(obj)) { - throw new TypeError('expected the first argument to be an object'); - } - var keys = nanomatch(Object.keys(obj), patterns, options); - return utils.pick(obj, keys); -}; - -/** - * Returns a memoized matcher function from the given glob `pattern` and `options`. - * The returned function takes a string to match as its only argument and returns - * true if the string is a match. - * - * ```js - * var nm = require('nanomatch'); - * nm.matcher(pattern[, options]); - * - * var isMatch = nm.matcher('*.!(*a)'); - * console.log(isMatch('a.a')); - * //=> false - * console.log(isMatch('a.b')); - * //=> true - * ``` - * @param {String} `pattern` Glob pattern - * @param {Object} `options` See available [options](#options) for changing how matches are performed. - * @return {Function} Returns a matcher function. - * @api public - */ - -nanomatch.matcher = function matcher(pattern, options) { - if (utils.isEmptyString(pattern)) { - return function() { - return false; - }; - } - - if (Array.isArray(pattern)) { - return compose(pattern, options, matcher); - } - - // if pattern is a regex - if (pattern instanceof RegExp) { - return test(pattern); - } - - // if pattern is invalid - if (!utils.isString(pattern)) { - throw new TypeError('expected pattern to be an array, string or regex'); - } - - // if pattern is a non-glob string - if (!utils.hasSpecialChars(pattern)) { - if (options && options.nocase === true) { - pattern = pattern.toLowerCase(); - } - return utils.matchPath(pattern, options); - } - - // if pattern is a glob string - var re = nanomatch.makeRe(pattern, options); - - // if `options.matchBase` or `options.basename` is defined - if (nanomatch.matchBase(pattern, options)) { - return utils.matchBasename(re, options); - } - - function test(regex) { - var equals = utils.equalsPattern(options); - var unixify = utils.unixify(options); - - return function(str) { - if (equals(str)) { - return true; - } - - if (regex.test(unixify(str))) { - return true; - } - return false; - }; - } - - // create matcher function - var matcherFn = test(re); - // set result object from compiler on matcher function, - // as a non-enumerable property. useful for debugging - utils.define(matcherFn, 'result', re.result); - return matcherFn; -}; - -/** - * Returns an array of matches captured by `pattern` in `string, or - * `null` if the pattern did not match. - * - * ```js - * var nm = require('nanomatch'); - * nm.capture(pattern, string[, options]); - * - * console.log(nm.capture('test/*.js', 'test/foo.js')); - * //=> ['foo'] - * console.log(nm.capture('test/*.js', 'foo/bar.css')); - * //=> null - * ``` - * @param {String} `pattern` Glob pattern to use for matching. - * @param {String} `string` String to match - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Boolean} Returns an array of captures if the string matches the glob pattern, otherwise `null`. - * @api public - */ - -nanomatch.capture = function(pattern, str, options) { - var re = nanomatch.makeRe(pattern, extend({capture: true}, options)); - var unixify = utils.unixify(options); - - function match() { - return function(string) { - var match = re.exec(unixify(string)); - if (!match) { - return null; - } - - return match.slice(1); - }; - } - - var capture = memoize('capture', pattern, options, match); - return capture(str); -}; - -/** - * Create a regular expression from the given glob `pattern`. - * - * ```js - * var nm = require('nanomatch'); - * nm.makeRe(pattern[, options]); - * - * console.log(nm.makeRe('*.js')); - * //=> /^(?:(\.[\\\/])?(?!\.)(?=.)[^\/]*?\.js)$/ - * ``` - * @param {String} `pattern` A glob pattern to convert to regex. - * @param {Object} `options` See available [options](#options) for changing how matches are performed. - * @return {RegExp} Returns a regex created from the given pattern. - * @api public - */ - -nanomatch.makeRe = function(pattern, options) { - if (pattern instanceof RegExp) { - return pattern; - } - - if (typeof pattern !== 'string') { - throw new TypeError('expected pattern to be a string'); - } - - if (pattern.length > MAX_LENGTH) { - throw new Error('expected pattern to be less than ' + MAX_LENGTH + ' characters'); - } - - function makeRe() { - var opts = utils.extend({wrap: false}, options); - var result = nanomatch.create(pattern, opts); - var regex = toRegex(result.output, opts); - utils.define(regex, 'result', result); - return regex; - } - - return memoize('makeRe', pattern, options, makeRe); -}; - -/** - * Parses the given glob `pattern` and returns an object with the compiled `output` - * and optional source `map`. - * - * ```js - * var nm = require('nanomatch'); - * nm.create(pattern[, options]); - * - * console.log(nm.create('abc/*.js')); - * // { options: { source: 'string', sourcemap: true }, - * // state: {}, - * // compilers: - * // { ... }, - * // output: '(\\.[\\\\\\/])?abc\\/(?!\\.)(?=.)[^\\/]*?\\.js', - * // ast: - * // { type: 'root', - * // errors: [], - * // nodes: - * // [ ... ], - * // dot: false, - * // input: 'abc/*.js' }, - * // parsingErrors: [], - * // map: - * // { version: 3, - * // sources: [ 'string' ], - * // names: [], - * // mappings: 'AAAA,GAAG,EAAC,kBAAC,EAAC,EAAE', - * // sourcesContent: [ 'abc/*.js' ] }, - * // position: { line: 1, column: 28 }, - * // content: {}, - * // files: {}, - * // idx: 6 } - * ``` - * @param {String} `pattern` Glob pattern to parse and compile. - * @param {Object} `options` Any [options](#options) to change how parsing and compiling is performed. - * @return {Object} Returns an object with the parsed AST, compiled string and optional source map. - * @api public - */ - -nanomatch.create = function(pattern, options) { - if (typeof pattern !== 'string') { - throw new TypeError('expected a string'); - } - function create() { - return nanomatch.compile(nanomatch.parse(pattern, options), options); - } - return memoize('create', pattern, options, create); -}; - -/** - * Parse the given `str` with the given `options`. - * - * ```js - * var nm = require('nanomatch'); - * nm.parse(pattern[, options]); - * - * var ast = nm.parse('a/{b,c}/d'); - * console.log(ast); - * // { type: 'root', - * // errors: [], - * // input: 'a/{b,c}/d', - * // nodes: - * // [ { type: 'bos', val: '' }, - * // { type: 'text', val: 'a/' }, - * // { type: 'brace', - * // nodes: - * // [ { type: 'brace.open', val: '{' }, - * // { type: 'text', val: 'b,c' }, - * // { type: 'brace.close', val: '}' } ] }, - * // { type: 'text', val: '/d' }, - * // { type: 'eos', val: '' } ] } - * ``` - * @param {String} `str` - * @param {Object} `options` - * @return {Object} Returns an AST - * @api public - */ - -nanomatch.parse = function(pattern, options) { - if (typeof pattern !== 'string') { - throw new TypeError('expected a string'); - } - - function parse() { - var snapdragon = utils.instantiate(null, options); - parsers(snapdragon, options); - - var ast = snapdragon.parse(pattern, options); - utils.define(ast, 'snapdragon', snapdragon); - ast.input = pattern; - return ast; - } - - return memoize('parse', pattern, options, parse); -}; - -/** - * Compile the given `ast` or string with the given `options`. - * - * ```js - * var nm = require('nanomatch'); - * nm.compile(ast[, options]); - * - * var ast = nm.parse('a/{b,c}/d'); - * console.log(nm.compile(ast)); - * // { options: { source: 'string' }, - * // state: {}, - * // compilers: - * // { eos: [Function], - * // noop: [Function], - * // bos: [Function], - * // brace: [Function], - * // 'brace.open': [Function], - * // text: [Function], - * // 'brace.close': [Function] }, - * // output: [ 'a/(b|c)/d' ], - * // ast: - * // { ... }, - * // parsingErrors: [] } - * ``` - * @param {Object|String} `ast` - * @param {Object} `options` - * @return {Object} Returns an object that has an `output` property with the compiled string. - * @api public - */ - -nanomatch.compile = function(ast, options) { - if (typeof ast === 'string') { - ast = nanomatch.parse(ast, options); - } - - function compile() { - var snapdragon = utils.instantiate(ast, options); - compilers(snapdragon, options); - return snapdragon.compile(ast, options); - } - - return memoize('compile', ast.input, options, compile); -}; - -/** - * Clear the regex cache. - * - * ```js - * nm.clearCache(); - * ``` - * @api public - */ - -nanomatch.clearCache = function() { - nanomatch.cache.__data__ = {}; -}; - -/** - * Compose a matcher function with the given patterns. - * This allows matcher functions to be compiled once and - * called multiple times. - */ - -function compose(patterns, options, matcher) { - var matchers; - - return memoize('compose', String(patterns), options, function() { - return function(file) { - // delay composition until it's invoked the first time, - // after that it won't be called again - if (!matchers) { - matchers = []; - for (var i = 0; i < patterns.length; i++) { - matchers.push(matcher(patterns[i], options)); - } - } - - var len = matchers.length; - while (len--) { - if (matchers[len](file) === true) { - return true; - } - } - return false; - }; - }); -} - -/** - * Memoize a generated regex or function. A unique key is generated - * from the `type` (usually method name), the `pattern`, and - * user-defined options. - */ - -function memoize(type, pattern, options, fn) { - var key = utils.createKey(type + '=' + pattern, options); - - if (options && options.cache === false) { - return fn(pattern, options); - } - - if (cache.has(type, key)) { - return cache.get(type, key); - } - - var val = fn(pattern, options); - cache.set(type, key, val); - return val; -} - -/** - * Expose compiler, parser and cache on `nanomatch` - */ - -nanomatch.compilers = compilers; -nanomatch.parsers = parsers; -nanomatch.cache = cache; - -/** - * Expose `nanomatch` - * @type {Function} - */ - -module.exports = nanomatch; - - -/***/ }), -/* 195 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var isExtendable = __webpack_require__(196); -var assignSymbols = __webpack_require__(91); - -module.exports = Object.assign || function(obj/*, objects*/) { - if (obj === null || typeof obj === 'undefined') { - throw new TypeError('Cannot convert undefined or null to object'); - } - if (!isObject(obj)) { - obj = {}; - } - for (var i = 1; i < arguments.length; i++) { - var val = arguments[i]; - if (isString(val)) { - val = toObject(val); - } - if (isObject(val)) { - assign(obj, val); - assignSymbols(obj, val); - } - } - return obj; -}; - -function assign(a, b) { - for (var key in b) { - if (hasOwn(b, key)) { - a[key] = b[key]; - } - } -} - -function isString(val) { - return (val && typeof val === 'string'); -} - -function toObject(str) { - var obj = {}; - for (var i in str) { - obj[i] = str[i]; - } - return obj; -} - -function isObject(val) { - return (val && typeof val === 'object') || isExtendable(val); -} - -/** - * Returns true if the given `key` is an own property of `obj`. - */ - -function hasOwn(obj, key) { - return Object.prototype.hasOwnProperty.call(obj, key); -} - -function isEnum(obj, key) { - return Object.prototype.propertyIsEnumerable.call(obj, key); -} - - -/***/ }), -/* 196 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -/*! - * is-extendable - * - * Copyright (c) 2015-2017, Jon Schlinkert. - * Released under the MIT License. - */ - - - -var isPlainObject = __webpack_require__(90); - -module.exports = function isExtendable(val) { - return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); -}; - - -/***/ }), -/* 197 */ -/***/ ((module) => { - -"use strict"; - - -/** -* Nanomatch compilers -*/ - -module.exports = function(nanomatch, options) { - function slash() { - if (options && typeof options.slash === 'string') { - return options.slash; - } - if (options && typeof options.slash === 'function') { - return options.slash.call(nanomatch); - } - return '\\\\/'; - } - - function star() { - if (options && typeof options.star === 'string') { - return options.star; - } - if (options && typeof options.star === 'function') { - return options.star.call(nanomatch); - } - return '[^' + slash() + ']*?'; - } - - var ast = nanomatch.ast = nanomatch.parser.ast; - ast.state = nanomatch.parser.state; - nanomatch.compiler.state = ast.state; - nanomatch.compiler - - /** - * Negation / escaping - */ - - .set('not', function(node) { - var prev = this.prev(); - if (this.options.nonegate === true || prev.type !== 'bos') { - return this.emit('\\' + node.val, node); - } - return this.emit(node.val, node); - }) - .set('escape', function(node) { - if (this.options.unescape && /^[-\w_.]/.test(node.val)) { - return this.emit(node.val, node); - } - return this.emit('\\' + node.val, node); - }) - .set('quoted', function(node) { - return this.emit(node.val, node); - }) - - /** - * Regex - */ - - .set('dollar', function(node) { - if (node.parent.type === 'bracket') { - return this.emit(node.val, node); - } - return this.emit('\\' + node.val, node); - }) - - /** - * Dot: "." - */ - - .set('dot', function(node) { - if (node.dotfiles === true) this.dotfiles = true; - return this.emit('\\' + node.val, node); - }) - - /** - * Slashes: "/" and "\" - */ - - .set('backslash', function(node) { - return this.emit(node.val, node); - }) - .set('slash', function(node, nodes, i) { - var val = '[' + slash() + ']'; - var parent = node.parent; - var prev = this.prev(); - - // set "node.hasSlash" to true on all ancestor parens nodes - while (parent.type === 'paren' && !parent.hasSlash) { - parent.hasSlash = true; - parent = parent.parent; - } - - if (prev.addQmark) { - val += '?'; - } - - // word boundary - if (node.rest.slice(0, 2) === '\\b') { - return this.emit(val, node); - } - - // globstars - if (node.parsed === '**' || node.parsed === './**') { - this.output = '(?:' + this.output; - return this.emit(val + ')?', node); - } - - // negation - if (node.parsed === '!**' && this.options.nonegate !== true) { - return this.emit(val + '?\\b', node); - } - return this.emit(val, node); - }) - - /** - * Square brackets - */ - - .set('bracket', function(node) { - var close = node.close; - var open = !node.escaped ? '[' : '\\['; - var negated = node.negated; - var inner = node.inner; - var val = node.val; - - if (node.escaped === true) { - inner = inner.replace(/\\?(\W)/g, '\\$1'); - negated = ''; - } - - if (inner === ']-') { - inner = '\\]\\-'; - } - - if (negated && inner.indexOf('.') === -1) { - inner += '.'; - } - if (negated && inner.indexOf('/') === -1) { - inner += '/'; - } - - val = open + negated + inner + close; - return this.emit(val, node); - }) - - /** - * Square: "[.]" (only matches a single character in brackets) - */ - - .set('square', function(node) { - var val = (/^\W/.test(node.val) ? '\\' : '') + node.val; - return this.emit(val, node); - }) - - /** - * Question mark: "?" - */ - - .set('qmark', function(node) { - var prev = this.prev(); - // don't use "slash" variable so that we always avoid - // matching backslashes and slashes with a qmark - var val = '[^.\\\\/]'; - if (this.options.dot || (prev.type !== 'bos' && prev.type !== 'slash')) { - val = '[^\\\\/]'; - } - - if (node.parsed.slice(-1) === '(') { - var ch = node.rest.charAt(0); - if (ch === '!' || ch === '=' || ch === ':') { - return this.emit(node.val, node); - } - } - - if (node.val.length > 1) { - val += '{' + node.val.length + '}'; - } - return this.emit(val, node); - }) - - /** - * Plus - */ - - .set('plus', function(node) { - var prev = node.parsed.slice(-1); - if (prev === ']' || prev === ')') { - return this.emit(node.val, node); - } - if (!this.output || (/[?*+]/.test(ch) && node.parent.type !== 'bracket')) { - return this.emit('\\+', node); - } - var ch = this.output.slice(-1); - if (/\w/.test(ch) && !node.inside) { - return this.emit('+\\+?', node); - } - return this.emit('+', node); - }) - - /** - * globstar: '**' - */ - - .set('globstar', function(node, nodes, i) { - if (!this.output) { - this.state.leadingGlobstar = true; - } - - var prev = this.prev(); - var before = this.prev(2); - var next = this.next(); - var after = this.next(2); - var type = prev.type; - var val = node.val; - - if (prev.type === 'slash' && next.type === 'slash') { - if (before.type === 'text') { - this.output += '?'; - - if (after.type !== 'text') { - this.output += '\\b'; - } - } - } - - var parsed = node.parsed; - if (parsed.charAt(0) === '!') { - parsed = parsed.slice(1); - } - - var isInside = node.isInside.paren || node.isInside.brace; - if (parsed && type !== 'slash' && type !== 'bos' && !isInside) { - val = star(); - } else { - val = this.options.dot !== true - ? '(?:(?!(?:[' + slash() + ']|^)\\.).)*?' - : '(?:(?!(?:[' + slash() + ']|^)(?:\\.{1,2})($|[' + slash() + ']))(?!\\.{2}).)*?'; - } - - if ((type === 'slash' || type === 'bos') && this.options.dot !== true) { - val = '(?!\\.)' + val; - } - - if (prev.type === 'slash' && next.type === 'slash' && before.type !== 'text') { - if (after.type === 'text' || after.type === 'star') { - node.addQmark = true; - } - } - - if (this.options.capture) { - val = '(' + val + ')'; - } - - return this.emit(val, node); - }) - - /** - * Star: "*" - */ - - .set('star', function(node, nodes, i) { - var prior = nodes[i - 2] || {}; - var prev = this.prev(); - var next = this.next(); - var type = prev.type; - - function isStart(n) { - return n.type === 'bos' || n.type === 'slash'; - } - - if (this.output === '' && this.options.contains !== true) { - this.output = '(?![' + slash() + '])'; - } - - if (type === 'bracket' && this.options.bash === false) { - var str = next && next.type === 'bracket' ? star() : '*?'; - if (!prev.nodes || prev.nodes[1].type !== 'posix') { - return this.emit(str, node); - } - } - - var prefix = !this.dotfiles && type !== 'text' && type !== 'escape' - ? (this.options.dot ? '(?!(?:^|[' + slash() + '])\\.{1,2}(?:$|[' + slash() + ']))' : '(?!\\.)') - : ''; - - if (isStart(prev) || (isStart(prior) && type === 'not')) { - if (prefix !== '(?!\\.)') { - prefix += '(?!(\\.{2}|\\.[' + slash() + ']))(?=.)'; - } else { - prefix += '(?=.)'; - } - } else if (prefix === '(?!\\.)') { - prefix = ''; - } - - if (prev.type === 'not' && prior.type === 'bos' && this.options.dot === true) { - this.output = '(?!\\.)' + this.output; - } - - var output = prefix + star(); - if (this.options.capture) { - output = '(' + output + ')'; - } - - return this.emit(output, node); - }) - - /** - * Text - */ - - .set('text', function(node) { - return this.emit(node.val, node); - }) - - /** - * End-of-string - */ - - .set('eos', function(node) { - var prev = this.prev(); - var val = node.val; - - this.output = '(?:\\.[' + slash() + '](?=.))?' + this.output; - if (this.state.metachar && prev.type !== 'qmark' && prev.type !== 'slash') { - val += (this.options.contains ? '[' + slash() + ']?' : '(?:[' + slash() + ']|$)'); - } - - return this.emit(val, node); - }); - - /** - * Allow custom compilers to be passed on options - */ - - if (options && typeof options.compilers === 'function') { - options.compilers(nanomatch.compiler); - } -}; - - - -/***/ }), -/* 198 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var regexNot = __webpack_require__(92); -var toRegex = __webpack_require__(73); - -/** - * Characters to use in negation regex (we want to "not" match - * characters that are matched by other parsers) - */ - -var cached; -var NOT_REGEX = '[\\[!*+?$^"\'.\\\\/]+'; -var not = createTextRegex(NOT_REGEX); - -/** - * Nanomatch parsers - */ - -module.exports = function(nanomatch, options) { - var parser = nanomatch.parser; - var opts = parser.options; - - parser.state = { - slashes: 0, - paths: [] - }; - - parser.ast.state = parser.state; - parser - - /** - * Beginning-of-string - */ - - .capture('prefix', function() { - if (this.parsed) return; - var m = this.match(/^\.[\\/]/); - if (!m) return; - this.state.strictOpen = !!this.options.strictOpen; - this.state.addPrefix = true; - }) - - /** - * Escape: "\\." - */ - - .capture('escape', function() { - if (this.isInside('bracket')) return; - var pos = this.position(); - var m = this.match(/^(?:\\(.)|([$^]))/); - if (!m) return; - - return pos({ - type: 'escape', - val: m[2] || m[1] - }); - }) - - /** - * Quoted strings - */ - - .capture('quoted', function() { - var pos = this.position(); - var m = this.match(/^["']/); - if (!m) return; - - var quote = m[0]; - if (this.input.indexOf(quote) === -1) { - return pos({ - type: 'escape', - val: quote - }); - } - - var tok = advanceTo(this.input, quote); - this.consume(tok.len); - - return pos({ - type: 'quoted', - val: tok.esc - }); - }) - - /** - * Negations: "!" - */ - - .capture('not', function() { - var parsed = this.parsed; - var pos = this.position(); - var m = this.match(this.notRegex || /^!+/); - if (!m) return; - var val = m[0]; - - var isNegated = (val.length % 2) === 1; - if (parsed === '' && !isNegated) { - val = ''; - } - - // if nothing has been parsed, we know `!` is at the start, - // so we need to wrap the result in a negation regex - if (parsed === '' && isNegated && this.options.nonegate !== true) { - this.bos.val = '(?!^(?:'; - this.append = ')$).*'; - val = ''; - } - return pos({ - type: 'not', - val: val - }); - }) - - /** - * Dot: "." - */ - - .capture('dot', function() { - var parsed = this.parsed; - var pos = this.position(); - var m = this.match(/^\.+/); - if (!m) return; - - var val = m[0]; - this.state.dot = val === '.' && (parsed === '' || parsed.slice(-1) === '/'); - - return pos({ - type: 'dot', - dotfiles: this.state.dot, - val: val - }); - }) - - /** - * Plus: "+" - */ - - .capture('plus', /^\+(?!\()/) - - /** - * Question mark: "?" - */ - - .capture('qmark', function() { - var parsed = this.parsed; - var pos = this.position(); - var m = this.match(/^\?+(?!\()/); - if (!m) return; - - this.state.metachar = true; - this.state.qmark = true; - - return pos({ - type: 'qmark', - parsed: parsed, - val: m[0] - }); - }) - - /** - * Globstar: "**" - */ - - .capture('globstar', function() { - var parsed = this.parsed; - var pos = this.position(); - var m = this.match(/^\*{2}(?![*(])(?=[,)/]|$)/); - if (!m) return; - - var type = opts.noglobstar !== true ? 'globstar' : 'star'; - var node = pos({type: type, parsed: parsed}); - this.state.metachar = true; - - while (this.input.slice(0, 4) === '/**/') { - this.input = this.input.slice(3); - } - - node.isInside = { - brace: this.isInside('brace'), - paren: this.isInside('paren') - }; - - if (type === 'globstar') { - this.state.globstar = true; - node.val = '**'; - - } else { - this.state.star = true; - node.val = '*'; - } - - return node; - }) - - /** - * Star: "*" - */ - - .capture('star', function() { - var pos = this.position(); - var starRe = /^(?:\*(?![*(])|[*]{3,}(?!\()|[*]{2}(?![(/]|$)|\*(?=\*\())/; - var m = this.match(starRe); - if (!m) return; - - this.state.metachar = true; - this.state.star = true; - return pos({ - type: 'star', - val: m[0] - }); - }) - - /** - * Slash: "/" - */ - - .capture('slash', function() { - var pos = this.position(); - var m = this.match(/^\//); - if (!m) return; - - this.state.slashes++; - return pos({ - type: 'slash', - val: m[0] - }); - }) - - /** - * Backslash: "\\" - */ - - .capture('backslash', function() { - var pos = this.position(); - var m = this.match(/^\\(?![*+?(){}[\]'"])/); - if (!m) return; - - var val = m[0]; - - if (this.isInside('bracket')) { - val = '\\'; - } else if (val.length > 1) { - val = '\\\\'; - } - - return pos({ - type: 'backslash', - val: val - }); - }) - - /** - * Square: "[.]" - */ - - .capture('square', function() { - if (this.isInside('bracket')) return; - var pos = this.position(); - var m = this.match(/^\[([^!^\\])\]/); - if (!m) return; - - return pos({ - type: 'square', - val: m[1] - }); - }) - - /** - * Brackets: "[...]" (basic, this can be overridden by other parsers) - */ - - .capture('bracket', function() { - var pos = this.position(); - var m = this.match(/^(?:\[([!^]?)([^\]]+|\]-)(\]|[^*+?]+)|\[)/); - if (!m) return; - - var val = m[0]; - var negated = m[1] ? '^' : ''; - var inner = (m[2] || '').replace(/\\\\+/, '\\\\'); - var close = m[3] || ''; - - if (m[2] && inner.length < m[2].length) { - val = val.replace(/\\\\+/, '\\\\'); - } - - var esc = this.input.slice(0, 2); - if (inner === '' && esc === '\\]') { - inner += esc; - this.consume(2); - - var str = this.input; - var idx = -1; - var ch; - - while ((ch = str[++idx])) { - this.consume(1); - if (ch === ']') { - close = ch; - break; - } - inner += ch; - } - } - - return pos({ - type: 'bracket', - val: val, - escaped: close !== ']', - negated: negated, - inner: inner, - close: close - }); - }) - - /** - * Text - */ - - .capture('text', function() { - if (this.isInside('bracket')) return; - var pos = this.position(); - var m = this.match(not); - if (!m || !m[0]) return; - - return pos({ - type: 'text', - val: m[0] - }); - }); - - /** - * Allow custom parsers to be passed on options - */ - - if (options && typeof options.parsers === 'function') { - options.parsers(nanomatch.parser); - } -}; - -/** - * Advance to the next non-escaped character - */ - -function advanceTo(input, endChar) { - var ch = input.charAt(0); - var tok = { len: 1, val: '', esc: '' }; - var idx = 0; - - function advance() { - if (ch !== '\\') { - tok.esc += '\\' + ch; - tok.val += ch; - } - - ch = input.charAt(++idx); - tok.len++; - - if (ch === '\\') { - advance(); - advance(); - } - } - - while (ch && ch !== endChar) { - advance(); - } - return tok; -} - -/** - * Create text regex - */ - -function createTextRegex(pattern) { - if (cached) return cached; - var opts = {contains: true, strictClose: false}; - var not = regexNot.create(pattern, opts); - var re = toRegex('^(?:[*]\\((?=.)|' + not + ')', opts); - return (cached = re); -} - -/** - * Expose negation string - */ - -module.exports.not = NOT_REGEX; - - -/***/ }), -/* 199 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -module.exports = new (__webpack_require__(200))(); - - -/***/ }), -/* 200 */ -/***/ ((module, exports, __webpack_require__) => { - -"use strict"; -/*! - * fragment-cache - * - * Copyright (c) 2016-2017, Jon Schlinkert. - * Released under the MIT License. - */ - - - -var MapCache = __webpack_require__(185); - -/** - * Create a new `FragmentCache` with an optional object to use for `caches`. - * - * ```js - * var fragment = new FragmentCache(); - * ``` - * @name FragmentCache - * @param {String} `cacheName` - * @return {Object} Returns the [map-cache][] instance. - * @api public - */ - -function FragmentCache(caches) { - this.caches = caches || {}; -} - -/** - * Prototype - */ - -FragmentCache.prototype = { - - /** - * Get cache `name` from the `fragment.caches` object. Creates a new - * `MapCache` if it doesn't already exist. - * - * ```js - * var cache = fragment.cache('files'); - * console.log(fragment.caches.hasOwnProperty('files')); - * //=> true - * ``` - * @name .cache - * @param {String} `cacheName` - * @return {Object} Returns the [map-cache][] instance. - * @api public - */ - - cache: function(cacheName) { - return this.caches[cacheName] || (this.caches[cacheName] = new MapCache()); - }, - - /** - * Set a value for property `key` on cache `name` - * - * ```js - * fragment.set('files', 'somefile.js', new File({path: 'somefile.js'})); - * ``` - * @name .set - * @param {String} `name` - * @param {String} `key` Property name to set - * @param {any} `val` The value of `key` - * @return {Object} The cache instance for chaining - * @api public - */ - - set: function(cacheName, key, val) { - var cache = this.cache(cacheName); - cache.set(key, val); - return cache; - }, - - /** - * Returns true if a non-undefined value is set for `key` on fragment cache `name`. - * - * ```js - * var cache = fragment.cache('files'); - * cache.set('somefile.js'); - * - * console.log(cache.has('somefile.js')); - * //=> true - * - * console.log(cache.has('some-other-file.js')); - * //=> false - * ``` - * @name .has - * @param {String} `name` Cache name - * @param {String} `key` Optionally specify a property to check for on cache `name` - * @return {Boolean} - * @api public - */ - - has: function(cacheName, key) { - return typeof this.get(cacheName, key) !== 'undefined'; - }, - - /** - * Get `name`, or if specified, the value of `key`. Invokes the [cache]() method, - * so that cache `name` will be created it doesn't already exist. If `key` is not passed, - * the entire cache (`name`) is returned. - * - * ```js - * var Vinyl = require('vinyl'); - * var cache = fragment.cache('files'); - * cache.set('somefile.js', new Vinyl({path: 'somefile.js'})); - * console.log(cache.get('somefile.js')); - * //=> - * ``` - * @name .get - * @param {String} `name` - * @return {Object} Returns cache `name`, or the value of `key` if specified - * @api public - */ - - get: function(name, key) { - var cache = this.cache(name); - if (typeof key === 'string') { - return cache.get(key); - } - return cache; - } -}; - -/** - * Expose `FragmentCache` - */ - -exports = module.exports = FragmentCache; - - -/***/ }), -/* 201 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var utils = module.exports; -var path = __webpack_require__(3); - -/** - * Module dependencies - */ - -var isWindows = __webpack_require__(202)(); -var Snapdragon = __webpack_require__(118); -utils.define = __webpack_require__(203); -utils.diff = __webpack_require__(205); -utils.extend = __webpack_require__(195); -utils.pick = __webpack_require__(206); -utils.typeOf = __webpack_require__(207); -utils.unique = __webpack_require__(95); - -/** - * Returns true if the given value is effectively an empty string - */ - -utils.isEmptyString = function(val) { - return String(val) === '' || String(val) === './'; -}; - -/** - * Returns true if the platform is windows, or `path.sep` is `\\`. - * This is defined as a function to allow `path.sep` to be set in unit tests, - * or by the user, if there is a reason to do so. - * @return {Boolean} - */ - -utils.isWindows = function() { - return path.sep === '\\' || isWindows === true; -}; - -/** - * Return the last element from an array - */ - -utils.last = function(arr, n) { - return arr[arr.length - (n || 1)]; -}; - -/** - * Get the `Snapdragon` instance to use - */ - -utils.instantiate = function(ast, options) { - var snapdragon; - // if an instance was created by `.parse`, use that instance - if (utils.typeOf(ast) === 'object' && ast.snapdragon) { - snapdragon = ast.snapdragon; - // if the user supplies an instance on options, use that instance - } else if (utils.typeOf(options) === 'object' && options.snapdragon) { - snapdragon = options.snapdragon; - // create a new instance - } else { - snapdragon = new Snapdragon(options); - } - - utils.define(snapdragon, 'parse', function(str, options) { - var parsed = Snapdragon.prototype.parse.call(this, str, options); - parsed.input = str; - - // escape unmatched brace/bracket/parens - var last = this.parser.stack.pop(); - if (last && this.options.strictErrors !== true) { - var open = last.nodes[0]; - var inner = last.nodes[1]; - if (last.type === 'bracket') { - if (inner.val.charAt(0) === '[') { - inner.val = '\\' + inner.val; - } - - } else { - open.val = '\\' + open.val; - var sibling = open.parent.nodes[1]; - if (sibling.type === 'star') { - sibling.loose = true; - } - } - } - - // add non-enumerable parser reference - utils.define(parsed, 'parser', this.parser); - return parsed; - }); - - return snapdragon; -}; - -/** - * Create the key to use for memoization. The key is generated - * by iterating over the options and concatenating key-value pairs - * to the pattern string. - */ - -utils.createKey = function(pattern, options) { - if (typeof options === 'undefined') { - return pattern; - } - var key = pattern; - for (var prop in options) { - if (options.hasOwnProperty(prop)) { - key += ';' + prop + '=' + String(options[prop]); - } - } - return key; -}; - -/** - * Cast `val` to an array - * @return {Array} - */ - -utils.arrayify = function(val) { - if (typeof val === 'string') return [val]; - return val ? (Array.isArray(val) ? val : [val]) : []; -}; - -/** - * Return true if `val` is a non-empty string - */ - -utils.isString = function(val) { - return typeof val === 'string'; -}; - -/** - * Return true if `val` is a non-empty string - */ - -utils.isRegex = function(val) { - return utils.typeOf(val) === 'regexp'; -}; - -/** - * Return true if `val` is a non-empty string - */ - -utils.isObject = function(val) { - return utils.typeOf(val) === 'object'; -}; - -/** - * Escape regex characters in the given string - */ - -utils.escapeRegex = function(str) { - return str.replace(/[-[\]{}()^$|*+?.\\/\s]/g, '\\$&'); -}; - -/** - * Combines duplicate characters in the provided `input` string. - * @param {String} `input` - * @returns {String} - */ - -utils.combineDupes = function(input, patterns) { - patterns = utils.arrayify(patterns).join('|').split('|'); - patterns = patterns.map(function(s) { - return s.replace(/\\?([+*\\/])/g, '\\$1'); - }); - var substr = patterns.join('|'); - var regex = new RegExp('(' + substr + ')(?=\\1)', 'g'); - return input.replace(regex, ''); -}; - -/** - * Returns true if the given `str` has special characters - */ - -utils.hasSpecialChars = function(str) { - return /(?:(?:(^|\/)[!.])|[*?+()|[\]{}]|[+@]\()/.test(str); -}; - -/** - * Normalize slashes in the given filepath. - * - * @param {String} `filepath` - * @return {String} - */ - -utils.toPosixPath = function(str) { - return str.replace(/\\+/g, '/'); -}; - -/** - * Strip backslashes before special characters in a string. - * - * @param {String} `str` - * @return {String} - */ - -utils.unescape = function(str) { - return utils.toPosixPath(str.replace(/\\(?=[*+?!.])/g, '')); -}; - -/** - * Strip the drive letter from a windows filepath - * @param {String} `fp` - * @return {String} - */ - -utils.stripDrive = function(fp) { - return utils.isWindows() ? fp.replace(/^[a-z]:[\\/]+?/i, '/') : fp; -}; - -/** - * Strip the prefix from a filepath - * @param {String} `fp` - * @return {String} - */ - -utils.stripPrefix = function(str) { - if (str.charAt(0) === '.' && (str.charAt(1) === '/' || str.charAt(1) === '\\')) { - return str.slice(2); - } - return str; -}; - -/** - * Returns true if `str` is a common character that doesn't need - * to be processed to be used for matching. - * @param {String} `str` - * @return {Boolean} - */ - -utils.isSimpleChar = function(str) { - return str.trim() === '' || str === '.'; -}; - -/** - * Returns true if the given str is an escaped or - * unescaped path character - */ - -utils.isSlash = function(str) { - return str === '/' || str === '\\/' || str === '\\' || str === '\\\\'; -}; - -/** - * Returns a function that returns true if the given - * pattern matches or contains a `filepath` - * - * @param {String} `pattern` - * @return {Function} - */ - -utils.matchPath = function(pattern, options) { - return (options && options.contains) - ? utils.containsPattern(pattern, options) - : utils.equalsPattern(pattern, options); -}; - -/** - * Returns true if the given (original) filepath or unixified path are equal - * to the given pattern. - */ - -utils._equals = function(filepath, unixPath, pattern) { - return pattern === filepath || pattern === unixPath; -}; - -/** - * Returns true if the given (original) filepath or unixified path contain - * the given pattern. - */ - -utils._contains = function(filepath, unixPath, pattern) { - return filepath.indexOf(pattern) !== -1 || unixPath.indexOf(pattern) !== -1; -}; - -/** - * Returns a function that returns true if the given - * pattern is the same as a given `filepath` - * - * @param {String} `pattern` - * @return {Function} - */ - -utils.equalsPattern = function(pattern, options) { - var unixify = utils.unixify(options); - options = options || {}; - - return function fn(filepath) { - var equal = utils._equals(filepath, unixify(filepath), pattern); - if (equal === true || options.nocase !== true) { - return equal; - } - var lower = filepath.toLowerCase(); - return utils._equals(lower, unixify(lower), pattern); - }; -}; - -/** - * Returns a function that returns true if the given - * pattern contains a `filepath` - * - * @param {String} `pattern` - * @return {Function} - */ - -utils.containsPattern = function(pattern, options) { - var unixify = utils.unixify(options); - options = options || {}; - - return function(filepath) { - var contains = utils._contains(filepath, unixify(filepath), pattern); - if (contains === true || options.nocase !== true) { - return contains; - } - var lower = filepath.toLowerCase(); - return utils._contains(lower, unixify(lower), pattern); - }; -}; - -/** - * Returns a function that returns true if the given - * regex matches the `filename` of a file path. - * - * @param {RegExp} `re` Matching regex - * @return {Function} - */ - -utils.matchBasename = function(re) { - return function(filepath) { - return re.test(filepath) || re.test(path.basename(filepath)); - }; -}; - -/** - * Returns the given value unchanced. - * @return {any} - */ - -utils.identity = function(val) { - return val; -}; - -/** - * Determines the filepath to return based on the provided options. - * @return {any} - */ - -utils.value = function(str, unixify, options) { - if (options && options.unixify === false) { - return str; - } - if (options && typeof options.unixify === 'function') { - return options.unixify(str); - } - return unixify(str); -}; - -/** - * Returns a function that normalizes slashes in a string to forward - * slashes, strips `./` from beginning of paths, and optionally unescapes - * special characters. - * @return {Function} - */ - -utils.unixify = function(options) { - var opts = options || {}; - return function(filepath) { - if (opts.stripPrefix !== false) { - filepath = utils.stripPrefix(filepath); - } - if (opts.unescape === true) { - filepath = utils.unescape(filepath); - } - if (opts.unixify === true || utils.isWindows()) { - filepath = utils.toPosixPath(filepath); - } - return filepath; - }; -}; - - -/***/ }), -/* 202 */ -/***/ ((module, exports) => { - -var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! - * is-windows - * - * Copyright © 2015-2018, Jon Schlinkert. - * Released under the MIT License. - */ - -(function(factory) { - if (exports && typeof exports === 'object' && "object" !== 'undefined') { - module.exports = factory(); - } else if (true) { - !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), - __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? - (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), - __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); - } else {} -})(function() { - 'use strict'; - return function isWindows() { - return process && (process.platform === 'win32' || /^(msys|cygwin)$/.test(process.env.OSTYPE)); - }; -}); - - -/***/ }), -/* 203 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -/*! - * define-property - * - * Copyright (c) 2015-2018, Jon Schlinkert. - * Released under the MIT License. - */ - - - -var isobject = __webpack_require__(81); -var isDescriptor = __webpack_require__(204); -var define = (typeof Reflect !== 'undefined' && Reflect.defineProperty) - ? Reflect.defineProperty - : Object.defineProperty; - -module.exports = function defineProperty(obj, key, val) { - if (!isobject(obj) && typeof obj !== 'function' && !Array.isArray(obj)) { - throw new TypeError('expected an object, function, or array'); - } - - if (typeof key !== 'string') { - throw new TypeError('expected "key" to be a string'); - } - - if (isDescriptor(val)) { - define(obj, key, val); - return obj; - } - - define(obj, key, { - configurable: true, - enumerable: false, - writable: true, - value: val - }); - - return obj; -}; - - -/***/ }), -/* 204 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var isAccessor = __webpack_require__(83); -var isData = __webpack_require__(87); - -module.exports = function isDescriptor(obj, key) { - if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) { - return false; - } - - if ('get' in obj || 'set' in obj) { - return isAccessor(obj, key); - } - - return isData(obj, key); -}; - - -/***/ }), -/* 205 */ -/***/ ((module) => { - -"use strict"; -/*! - * arr-diff - * - * Copyright (c) 2014-2017, Jon Schlinkert. - * Released under the MIT License. - */ - - - -module.exports = function diff(arr/*, arrays*/) { - var len = arguments.length; - var idx = 0; - while (++idx < len) { - arr = diffArray(arr, arguments[idx]); - } - return arr; -}; - -function diffArray(one, two) { - if (!Array.isArray(two)) { - return one.slice(); - } - - var tlen = two.length - var olen = one.length; - var idx = -1; - var arr = []; - - while (++idx < olen) { - var ele = one[idx]; - - var hasEle = false; - for (var i = 0; i < tlen; i++) { - var val = two[i]; - - if (ele === val) { - hasEle = true; - break; - } - } - - if (hasEle === false) { - arr.push(ele); - } - } - return arr; -} - - -/***/ }), -/* 206 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -/*! - * object.pick - * - * Copyright (c) 2014-2015 Jon Schlinkert, contributors. - * Licensed under the MIT License - */ - - - -var isObject = __webpack_require__(81); - -module.exports = function pick(obj, keys) { - if (!isObject(obj) && typeof obj !== 'function') { - return {}; - } - - var res = {}; - if (typeof keys === 'string') { - if (keys in obj) { - res[keys] = obj[keys]; - } - return res; - } - - var len = keys.length; - var idx = -1; - - while (++idx < len) { - var key = keys[idx]; - if (key in obj) { - res[key] = obj[key]; - } - } - return res; -}; - - -/***/ }), -/* 207 */ -/***/ ((module) => { - -var toString = Object.prototype.toString; - -module.exports = function kindOf(val) { - if (val === void 0) return 'undefined'; - if (val === null) return 'null'; - - var type = typeof val; - if (type === 'boolean') return 'boolean'; - if (type === 'string') return 'string'; - if (type === 'number') return 'number'; - if (type === 'symbol') return 'symbol'; - if (type === 'function') { - return isGeneratorFn(val) ? 'generatorfunction' : 'function'; - } - - if (isArray(val)) return 'array'; - if (isBuffer(val)) return 'buffer'; - if (isArguments(val)) return 'arguments'; - if (isDate(val)) return 'date'; - if (isError(val)) return 'error'; - if (isRegexp(val)) return 'regexp'; - - switch (ctorName(val)) { - case 'Symbol': return 'symbol'; - case 'Promise': return 'promise'; - - // Set, Map, WeakSet, WeakMap - case 'WeakMap': return 'weakmap'; - case 'WeakSet': return 'weakset'; - case 'Map': return 'map'; - case 'Set': return 'set'; - - // 8-bit typed arrays - case 'Int8Array': return 'int8array'; - case 'Uint8Array': return 'uint8array'; - case 'Uint8ClampedArray': return 'uint8clampedarray'; - - // 16-bit typed arrays - case 'Int16Array': return 'int16array'; - case 'Uint16Array': return 'uint16array'; - - // 32-bit typed arrays - case 'Int32Array': return 'int32array'; - case 'Uint32Array': return 'uint32array'; - case 'Float32Array': return 'float32array'; - case 'Float64Array': return 'float64array'; - } - - if (isGeneratorObj(val)) { - return 'generator'; - } - - // Non-plain objects - type = toString.call(val); - switch (type) { - case '[object Object]': return 'object'; - // iterators - case '[object Map Iterator]': return 'mapiterator'; - case '[object Set Iterator]': return 'setiterator'; - case '[object String Iterator]': return 'stringiterator'; - case '[object Array Iterator]': return 'arrayiterator'; - } - - // other - return type.slice(8, -1).toLowerCase().replace(/\s/g, ''); -}; - -function ctorName(val) { - return typeof val.constructor === 'function' ? val.constructor.name : null; -} - -function isArray(val) { - if (Array.isArray) return Array.isArray(val); - return val instanceof Array; -} - -function isError(val) { - return val instanceof Error || (typeof val.message === 'string' && val.constructor && typeof val.constructor.stackTraceLimit === 'number'); -} - -function isDate(val) { - if (val instanceof Date) return true; - return typeof val.toDateString === 'function' - && typeof val.getDate === 'function' - && typeof val.setDate === 'function'; -} - -function isRegexp(val) { - if (val instanceof RegExp) return true; - return typeof val.flags === 'string' - && typeof val.ignoreCase === 'boolean' - && typeof val.multiline === 'boolean' - && typeof val.global === 'boolean'; -} - -function isGeneratorFn(name, val) { - return ctorName(name) === 'GeneratorFunction'; -} - -function isGeneratorObj(val) { - return typeof val.throw === 'function' - && typeof val.return === 'function' - && typeof val.next === 'function'; -} - -function isArguments(val) { - try { - if (typeof val.length === 'number' && typeof val.callee === 'function') { - return true; - } - } catch (err) { - if (err.message.indexOf('callee') !== -1) { - return true; - } - } - return false; -} - -/** - * If you need to support Safari 5-7 (8-10 yr-old browser), - * take a look at https://github.com/feross/is-buffer - */ - -function isBuffer(val) { - if (val.constructor && typeof val.constructor.isBuffer === 'function') { - return val.constructor.isBuffer(val); - } - return false; -} - - -/***/ }), -/* 208 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -/** - * Module dependencies - */ - -var extend = __webpack_require__(96); -var unique = __webpack_require__(95); -var toRegex = __webpack_require__(73); - -/** - * Local dependencies - */ - -var compilers = __webpack_require__(209); -var parsers = __webpack_require__(220); -var Extglob = __webpack_require__(224); -var utils = __webpack_require__(223); -var MAX_LENGTH = 1024 * 64; - -/** - * Convert the given `extglob` pattern into a regex-compatible string. Returns - * an object with the compiled result and the parsed AST. - * - * ```js - * var extglob = require('extglob'); - * console.log(extglob('*.!(*a)')); - * //=> '(?!\\.)[^/]*?\\.(?!(?!\\.)[^/]*?a\\b).*?' - * ``` - * @param {String} `pattern` - * @param {Object} `options` - * @return {String} - * @api public - */ - -function extglob(pattern, options) { - return extglob.create(pattern, options).output; -} - -/** - * Takes an array of strings and an extglob pattern and returns a new - * array that contains only the strings that match the pattern. - * - * ```js - * var extglob = require('extglob'); - * console.log(extglob.match(['a.a', 'a.b', 'a.c'], '*.!(*a)')); - * //=> ['a.b', 'a.c'] - * ``` - * @param {Array} `list` Array of strings to match - * @param {String} `pattern` Extglob pattern - * @param {Object} `options` - * @return {Array} Returns an array of matches - * @api public - */ - -extglob.match = function(list, pattern, options) { - if (typeof pattern !== 'string') { - throw new TypeError('expected pattern to be a string'); - } - - list = utils.arrayify(list); - var isMatch = extglob.matcher(pattern, options); - var len = list.length; - var idx = -1; - var matches = []; - - while (++idx < len) { - var ele = list[idx]; - - if (isMatch(ele)) { - matches.push(ele); - } - } - - // if no options were passed, uniquify results and return - if (typeof options === 'undefined') { - return unique(matches); - } - - if (matches.length === 0) { - if (options.failglob === true) { - throw new Error('no matches found for "' + pattern + '"'); - } - if (options.nonull === true || options.nullglob === true) { - return [pattern.split('\\').join('')]; - } - } - - return options.nodupes !== false ? unique(matches) : matches; -}; - -/** - * Returns true if the specified `string` matches the given - * extglob `pattern`. - * - * ```js - * var extglob = require('extglob'); - * - * console.log(extglob.isMatch('a.a', '*.!(*a)')); - * //=> false - * console.log(extglob.isMatch('a.b', '*.!(*a)')); - * //=> true - * ``` - * @param {String} `string` String to match - * @param {String} `pattern` Extglob pattern - * @param {String} `options` - * @return {Boolean} - * @api public - */ - -extglob.isMatch = function(str, pattern, options) { - if (typeof pattern !== 'string') { - throw new TypeError('expected pattern to be a string'); - } - - if (typeof str !== 'string') { - throw new TypeError('expected a string'); - } - - if (pattern === str) { - return true; - } - - if (pattern === '' || pattern === ' ' || pattern === '.') { - return pattern === str; - } - - var isMatch = utils.memoize('isMatch', pattern, options, extglob.matcher); - return isMatch(str); -}; - -/** - * Returns true if the given `string` contains the given pattern. Similar to `.isMatch` but - * the pattern can match any part of the string. - * - * ```js - * var extglob = require('extglob'); - * console.log(extglob.contains('aa/bb/cc', '*b')); - * //=> true - * console.log(extglob.contains('aa/bb/cc', '*d')); - * //=> false - * ``` - * @param {String} `str` The string to match. - * @param {String} `pattern` Glob pattern to use for matching. - * @param {Object} `options` - * @return {Boolean} Returns true if the patter matches any part of `str`. - * @api public - */ - -extglob.contains = function(str, pattern, options) { - if (typeof str !== 'string') { - throw new TypeError('expected a string'); - } - - if (pattern === '' || pattern === ' ' || pattern === '.') { - return pattern === str; - } - - var opts = extend({}, options, {contains: true}); - opts.strictClose = false; - opts.strictOpen = false; - return extglob.isMatch(str, pattern, opts); -}; - -/** - * Takes an extglob pattern and returns a matcher function. The returned - * function takes the string to match as its only argument. - * - * ```js - * var extglob = require('extglob'); - * var isMatch = extglob.matcher('*.!(*a)'); - * - * console.log(isMatch('a.a')); - * //=> false - * console.log(isMatch('a.b')); - * //=> true - * ``` - * @param {String} `pattern` Extglob pattern - * @param {String} `options` - * @return {Boolean} - * @api public - */ - -extglob.matcher = function(pattern, options) { - if (typeof pattern !== 'string') { - throw new TypeError('expected pattern to be a string'); - } - - function matcher() { - var re = extglob.makeRe(pattern, options); - return function(str) { - return re.test(str); - }; - } - - return utils.memoize('matcher', pattern, options, matcher); -}; - -/** - * Convert the given `extglob` pattern into a regex-compatible string. Returns - * an object with the compiled result and the parsed AST. - * - * ```js - * var extglob = require('extglob'); - * console.log(extglob.create('*.!(*a)').output); - * //=> '(?!\\.)[^/]*?\\.(?!(?!\\.)[^/]*?a\\b).*?' - * ``` - * @param {String} `str` - * @param {Object} `options` - * @return {String} - * @api public - */ - -extglob.create = function(pattern, options) { - if (typeof pattern !== 'string') { - throw new TypeError('expected pattern to be a string'); - } - - function create() { - var ext = new Extglob(options); - var ast = ext.parse(pattern, options); - return ext.compile(ast, options); - } - - return utils.memoize('create', pattern, options, create); -}; - -/** - * Returns an array of matches captured by `pattern` in `string`, or `null` - * if the pattern did not match. - * - * ```js - * var extglob = require('extglob'); - * extglob.capture(pattern, string[, options]); - * - * console.log(extglob.capture('test/*.js', 'test/foo.js')); - * //=> ['foo'] - * console.log(extglob.capture('test/*.js', 'foo/bar.css')); - * //=> null - * ``` - * @param {String} `pattern` Glob pattern to use for matching. - * @param {String} `string` String to match - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Boolean} Returns an array of captures if the string matches the glob pattern, otherwise `null`. - * @api public - */ - -extglob.capture = function(pattern, str, options) { - var re = extglob.makeRe(pattern, extend({capture: true}, options)); - - function match() { - return function(string) { - var match = re.exec(string); - if (!match) { - return null; - } - - return match.slice(1); - }; - } - - var capture = utils.memoize('capture', pattern, options, match); - return capture(str); -}; - -/** - * Create a regular expression from the given `pattern` and `options`. - * - * ```js - * var extglob = require('extglob'); - * var re = extglob.makeRe('*.!(*a)'); - * console.log(re); - * //=> /^[^\/]*?\.(?![^\/]*?a)[^\/]*?$/ - * ``` - * @param {String} `pattern` The pattern to convert to regex. - * @param {Object} `options` - * @return {RegExp} - * @api public - */ - -extglob.makeRe = function(pattern, options) { - if (pattern instanceof RegExp) { - return pattern; - } - - if (typeof pattern !== 'string') { - throw new TypeError('expected pattern to be a string'); - } - - if (pattern.length > MAX_LENGTH) { - throw new Error('expected pattern to be less than ' + MAX_LENGTH + ' characters'); - } - - function makeRe() { - var opts = extend({strictErrors: false}, options); - if (opts.strictErrors === true) opts.strict = true; - var res = extglob.create(pattern, opts); - return toRegex(res.output, opts); - } - - var regex = utils.memoize('makeRe', pattern, options, makeRe); - if (regex.source.length > MAX_LENGTH) { - throw new SyntaxError('potentially malicious regex detected'); - } - - return regex; -}; - -/** - * Cache - */ - -extglob.cache = utils.cache; -extglob.clearCache = function() { - extglob.cache.__data__ = {}; -}; - -/** - * Expose `Extglob` constructor, parsers and compilers - */ - -extglob.Extglob = Extglob; -extglob.compilers = compilers; -extglob.parsers = parsers; - -/** - * Expose `extglob` - * @type {Function} - */ - -module.exports = extglob; - - -/***/ }), -/* 209 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var brackets = __webpack_require__(210); - -/** - * Extglob compilers - */ - -module.exports = function(extglob) { - function star() { - if (typeof extglob.options.star === 'function') { - return extglob.options.star.apply(this, arguments); - } - if (typeof extglob.options.star === 'string') { - return extglob.options.star; - } - return '.*?'; - } - - /** - * Use `expand-brackets` compilers - */ - - extglob.use(brackets.compilers); - extglob.compiler - - /** - * Escaped: "\\*" - */ - - .set('escape', function(node) { - return this.emit(node.val, node); - }) - - /** - * Dot: "." - */ - - .set('dot', function(node) { - return this.emit('\\' + node.val, node); - }) - - /** - * Question mark: "?" - */ - - .set('qmark', function(node) { - var val = '[^\\\\/.]'; - var prev = this.prev(); - - if (node.parsed.slice(-1) === '(') { - var ch = node.rest.charAt(0); - if (ch !== '!' && ch !== '=' && ch !== ':') { - return this.emit(val, node); - } - return this.emit(node.val, node); - } - - if (prev.type === 'text' && prev.val) { - return this.emit(val, node); - } - - if (node.val.length > 1) { - val += '{' + node.val.length + '}'; - } - return this.emit(val, node); - }) - - /** - * Plus: "+" - */ - - .set('plus', function(node) { - var prev = node.parsed.slice(-1); - if (prev === ']' || prev === ')') { - return this.emit(node.val, node); - } - var ch = this.output.slice(-1); - if (!this.output || (/[?*+]/.test(ch) && node.parent.type !== 'bracket')) { - return this.emit('\\+', node); - } - if (/\w/.test(ch) && !node.inside) { - return this.emit('+\\+?', node); - } - return this.emit('+', node); - }) - - /** - * Star: "*" - */ - - .set('star', function(node) { - var prev = this.prev(); - var prefix = prev.type !== 'text' && prev.type !== 'escape' - ? '(?!\\.)' - : ''; - - return this.emit(prefix + star.call(this, node), node); - }) - - /** - * Parens - */ - - .set('paren', function(node) { - return this.mapVisit(node.nodes); - }) - .set('paren.open', function(node) { - var capture = this.options.capture ? '(' : ''; - - switch (node.parent.prefix) { - case '!': - case '^': - return this.emit(capture + '(?:(?!(?:', node); - case '*': - case '+': - case '?': - case '@': - return this.emit(capture + '(?:', node); - default: { - var val = node.val; - if (this.options.bash === true) { - val = '\\' + val; - } else if (!this.options.capture && val === '(' && node.parent.rest[0] !== '?') { - val += '?:'; - } - - return this.emit(val, node); - } - } - }) - .set('paren.close', function(node) { - var capture = this.options.capture ? ')' : ''; - - switch (node.prefix) { - case '!': - case '^': - var prefix = /^(\)|$)/.test(node.rest) ? '$' : ''; - var str = star.call(this, node); - - // if the extglob has a slash explicitly defined, we know the user wants - // to match slashes, so we need to ensure the "star" regex allows for it - if (node.parent.hasSlash && !this.options.star && this.options.slash !== false) { - str = '.*?'; - } - - return this.emit(prefix + ('))' + str + ')') + capture, node); - case '*': - case '+': - case '?': - return this.emit(')' + node.prefix + capture, node); - case '@': - return this.emit(')' + capture, node); - default: { - var val = (this.options.bash === true ? '\\' : '') + ')'; - return this.emit(val, node); - } - } - }) - - /** - * Text - */ - - .set('text', function(node) { - var val = node.val.replace(/[\[\]]/g, '\\$&'); - return this.emit(val, node); - }); -}; - - -/***/ }), -/* 210 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -/** - * Local dependencies - */ - -var compilers = __webpack_require__(211); -var parsers = __webpack_require__(213); - -/** - * Module dependencies - */ - -var debug = __webpack_require__(215)('expand-brackets'); -var extend = __webpack_require__(96); -var Snapdragon = __webpack_require__(118); -var toRegex = __webpack_require__(73); - -/** - * Parses the given POSIX character class `pattern` and returns a - * string that can be used for creating regular expressions for matching. - * - * @param {String} `pattern` - * @param {Object} `options` - * @return {Object} - * @api public - */ - -function brackets(pattern, options) { - debug('initializing from <%s>', __filename); - var res = brackets.create(pattern, options); - return res.output; -} - -/** - * Takes an array of strings and a POSIX character class pattern, and returns a new - * array with only the strings that matched the pattern. - * - * ```js - * var brackets = require('expand-brackets'); - * console.log(brackets.match(['1', 'a', 'ab'], '[[:alpha:]]')); - * //=> ['a'] - * - * console.log(brackets.match(['1', 'a', 'ab'], '[[:alpha:]]+')); - * //=> ['a', 'ab'] - * ``` - * @param {Array} `arr` Array of strings to match - * @param {String} `pattern` POSIX character class pattern(s) - * @param {Object} `options` - * @return {Array} - * @api public - */ - -brackets.match = function(arr, pattern, options) { - arr = [].concat(arr); - var opts = extend({}, options); - var isMatch = brackets.matcher(pattern, opts); - var len = arr.length; - var idx = -1; - var res = []; - - while (++idx < len) { - var ele = arr[idx]; - if (isMatch(ele)) { - res.push(ele); - } - } - - if (res.length === 0) { - if (opts.failglob === true) { - throw new Error('no matches found for "' + pattern + '"'); - } - - if (opts.nonull === true || opts.nullglob === true) { - return [pattern.split('\\').join('')]; - } - } - return res; -}; - -/** - * Returns true if the specified `string` matches the given - * brackets `pattern`. - * - * ```js - * var brackets = require('expand-brackets'); - * - * console.log(brackets.isMatch('a.a', '[[:alpha:]].[[:alpha:]]')); - * //=> true - * console.log(brackets.isMatch('1.2', '[[:alpha:]].[[:alpha:]]')); - * //=> false - * ``` - * @param {String} `string` String to match - * @param {String} `pattern` Poxis pattern - * @param {String} `options` - * @return {Boolean} - * @api public - */ - -brackets.isMatch = function(str, pattern, options) { - return brackets.matcher(pattern, options)(str); -}; - -/** - * Takes a POSIX character class pattern and returns a matcher function. The returned - * function takes the string to match as its only argument. - * - * ```js - * var brackets = require('expand-brackets'); - * var isMatch = brackets.matcher('[[:lower:]].[[:upper:]]'); - * - * console.log(isMatch('a.a')); - * //=> false - * console.log(isMatch('a.A')); - * //=> true - * ``` - * @param {String} `pattern` Poxis pattern - * @param {String} `options` - * @return {Boolean} - * @api public - */ - -brackets.matcher = function(pattern, options) { - var re = brackets.makeRe(pattern, options); - return function(str) { - return re.test(str); - }; -}; - -/** - * Create a regular expression from the given `pattern`. - * - * ```js - * var brackets = require('expand-brackets'); - * var re = brackets.makeRe('[[:alpha:]]'); - * console.log(re); - * //=> /^(?:[a-zA-Z])$/ - * ``` - * @param {String} `pattern` The pattern to convert to regex. - * @param {Object} `options` - * @return {RegExp} - * @api public - */ - -brackets.makeRe = function(pattern, options) { - var res = brackets.create(pattern, options); - var opts = extend({strictErrors: false}, options); - return toRegex(res.output, opts); -}; - -/** - * Parses the given POSIX character class `pattern` and returns an object - * with the compiled `output` and optional source `map`. - * - * ```js - * var brackets = require('expand-brackets'); - * console.log(brackets('[[:alpha:]]')); - * // { options: { source: 'string' }, - * // input: '[[:alpha:]]', - * // state: {}, - * // compilers: - * // { eos: [Function], - * // noop: [Function], - * // bos: [Function], - * // not: [Function], - * // escape: [Function], - * // text: [Function], - * // posix: [Function], - * // bracket: [Function], - * // 'bracket.open': [Function], - * // 'bracket.inner': [Function], - * // 'bracket.literal': [Function], - * // 'bracket.close': [Function] }, - * // output: '[a-zA-Z]', - * // ast: - * // { type: 'root', - * // errors: [], - * // nodes: [ [Object], [Object], [Object] ] }, - * // parsingErrors: [] } - * ``` - * @param {String} `pattern` - * @param {Object} `options` - * @return {Object} - * @api public - */ - -brackets.create = function(pattern, options) { - var snapdragon = (options && options.snapdragon) || new Snapdragon(options); - compilers(snapdragon); - parsers(snapdragon); - - var ast = snapdragon.parse(pattern, options); - ast.input = pattern; - var res = snapdragon.compile(ast, options); - res.input = pattern; - return res; -}; - -/** - * Expose `brackets` constructor, parsers and compilers - */ - -brackets.compilers = compilers; -brackets.parsers = parsers; - -/** - * Expose `brackets` - * @type {Function} - */ - -module.exports = brackets; - - -/***/ }), -/* 211 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var posix = __webpack_require__(212); - -module.exports = function(brackets) { - brackets.compiler - - /** - * Escaped characters - */ - - .set('escape', function(node) { - return this.emit('\\' + node.val.replace(/^\\/, ''), node); - }) - - /** - * Text - */ - - .set('text', function(node) { - return this.emit(node.val.replace(/([{}])/g, '\\$1'), node); - }) - - /** - * POSIX character classes - */ - - .set('posix', function(node) { - if (node.val === '[::]') { - return this.emit('\\[::\\]', node); - } - - var val = posix[node.inner]; - if (typeof val === 'undefined') { - val = '[' + node.inner + ']'; - } - return this.emit(val, node); - }) - - /** - * Non-posix brackets - */ - - .set('bracket', function(node) { - return this.mapVisit(node.nodes); - }) - .set('bracket.open', function(node) { - return this.emit(node.val, node); - }) - .set('bracket.inner', function(node) { - var inner = node.val; - - if (inner === '[' || inner === ']') { - return this.emit('\\' + node.val, node); - } - if (inner === '^]') { - return this.emit('^\\]', node); - } - if (inner === '^') { - return this.emit('^', node); - } - - if (/-/.test(inner) && !/(\d-\d|\w-\w)/.test(inner)) { - inner = inner.split('-').join('\\-'); - } - - var isNegated = inner.charAt(0) === '^'; - // add slashes to negated brackets, per spec - if (isNegated && inner.indexOf('/') === -1) { - inner += '/'; - } - if (isNegated && inner.indexOf('.') === -1) { - inner += '.'; - } - - // don't unescape `0` (octal literal) - inner = inner.replace(/\\([1-9])/g, '$1'); - return this.emit(inner, node); - }) - .set('bracket.close', function(node) { - var val = node.val.replace(/^\\/, ''); - if (node.parent.escaped === true) { - return this.emit('\\' + val, node); - } - return this.emit(val, node); - }); -}; - - -/***/ }), -/* 212 */ -/***/ ((module) => { - -"use strict"; - - -/** - * POSIX character classes - */ - -module.exports = { - alnum: 'a-zA-Z0-9', - alpha: 'a-zA-Z', - ascii: '\\x00-\\x7F', - blank: ' \\t', - cntrl: '\\x00-\\x1F\\x7F', - digit: '0-9', - graph: '\\x21-\\x7E', - lower: 'a-z', - print: '\\x20-\\x7E ', - punct: '\\-!"#$%&\'()\\*+,./:;<=>?@[\\]^_`{|}~', - space: ' \\t\\r\\n\\v\\f', - upper: 'A-Z', - word: 'A-Za-z0-9_', - xdigit: 'A-Fa-f0-9' -}; - - -/***/ }), -/* 213 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var utils = __webpack_require__(214); -var define = __webpack_require__(148); - -/** - * Text regex - */ - -var TEXT_REGEX = '(\\[(?=.*\\])|\\])+'; -var not = utils.createRegex(TEXT_REGEX); - -/** - * Brackets parsers - */ - -function parsers(brackets) { - brackets.state = brackets.state || {}; - brackets.parser.sets.bracket = brackets.parser.sets.bracket || []; - brackets.parser - - .capture('escape', function() { - if (this.isInside('bracket')) return; - var pos = this.position(); - var m = this.match(/^\\(.)/); - if (!m) return; - - return pos({ - type: 'escape', - val: m[0] - }); - }) - - /** - * Text parser - */ - - .capture('text', function() { - if (this.isInside('bracket')) return; - var pos = this.position(); - var m = this.match(not); - if (!m || !m[0]) return; - - return pos({ - type: 'text', - val: m[0] - }); - }) - - /** - * POSIX character classes: "[[:alpha:][:digits:]]" - */ - - .capture('posix', function() { - var pos = this.position(); - var m = this.match(/^\[:(.*?):\](?=.*\])/); - if (!m) return; - - var inside = this.isInside('bracket'); - if (inside) { - brackets.posix++; - } - - return pos({ - type: 'posix', - insideBracket: inside, - inner: m[1], - val: m[0] - }); - }) - - /** - * Bracket (noop) - */ - - .capture('bracket', function() {}) - - /** - * Open: '[' - */ - - .capture('bracket.open', function() { - var parsed = this.parsed; - var pos = this.position(); - var m = this.match(/^\[(?=.*\])/); - if (!m) return; - - var prev = this.prev(); - var last = utils.last(prev.nodes); - - if (parsed.slice(-1) === '\\' && !this.isInside('bracket')) { - last.val = last.val.slice(0, last.val.length - 1); - return pos({ - type: 'escape', - val: m[0] - }); - } - - var open = pos({ - type: 'bracket.open', - val: m[0] - }); - - if (last.type === 'bracket.open' || this.isInside('bracket')) { - open.val = '\\' + open.val; - open.type = 'bracket.inner'; - open.escaped = true; - return open; - } - - var node = pos({ - type: 'bracket', - nodes: [open] - }); - - define(node, 'parent', prev); - define(open, 'parent', node); - this.push('bracket', node); - prev.nodes.push(node); - }) - - /** - * Bracket text - */ - - .capture('bracket.inner', function() { - if (!this.isInside('bracket')) return; - var pos = this.position(); - var m = this.match(not); - if (!m || !m[0]) return; - - var next = this.input.charAt(0); - var val = m[0]; - - var node = pos({ - type: 'bracket.inner', - val: val - }); - - if (val === '\\\\') { - return node; - } - - var first = val.charAt(0); - var last = val.slice(-1); - - if (first === '!') { - val = '^' + val.slice(1); - } - - if (last === '\\' || (val === '^' && next === ']')) { - val += this.input[0]; - this.consume(1); - } - - node.val = val; - return node; - }) - - /** - * Close: ']' - */ - - .capture('bracket.close', function() { - var parsed = this.parsed; - var pos = this.position(); - var m = this.match(/^\]/); - if (!m) return; - - var prev = this.prev(); - var last = utils.last(prev.nodes); - - if (parsed.slice(-1) === '\\' && !this.isInside('bracket')) { - last.val = last.val.slice(0, last.val.length - 1); - - return pos({ - type: 'escape', - val: m[0] - }); - } - - var node = pos({ - type: 'bracket.close', - rest: this.input, - val: m[0] - }); - - if (last.type === 'bracket.open') { - node.type = 'bracket.inner'; - node.escaped = true; - return node; - } - - var bracket = this.pop('bracket'); - if (!this.isType(bracket, 'bracket')) { - if (this.options.strict) { - throw new Error('missing opening "["'); - } - node.type = 'bracket.inner'; - node.escaped = true; - return node; - } - - bracket.nodes.push(node); - define(node, 'parent', bracket); - }); -} - -/** - * Brackets parsers - */ - -module.exports = parsers; - -/** - * Expose text regex - */ - -module.exports.TEXT_REGEX = TEXT_REGEX; - - -/***/ }), -/* 214 */ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - - -var toRegex = __webpack_require__(73); -var regexNot = __webpack_require__(92); -var cached; - -/** - * Get the last element from `array` - * @param {Array} `array` - * @return {*} - */ - -exports.last = function(arr) { - return arr[arr.length - 1]; -}; - -/** - * Create and cache regex to use for text nodes - */ - -exports.createRegex = function(pattern, include) { - if (cached) return cached; - var opts = {contains: true, strictClose: false}; - var not = regexNot.create(pattern, opts); - var re; - - if (typeof include === 'string') { - re = toRegex('^(?:' + include + '|' + not + ')', opts); - } else { - re = toRegex(not, opts); - } - - return (cached = re); -}; - - -/***/ }), -/* 215 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -/** - * Detect Electron renderer process, which is node, but we should - * treat as a browser. - */ - -if (typeof process !== 'undefined' && process.type === 'renderer') { - module.exports = __webpack_require__(216); -} else { - module.exports = __webpack_require__(219); -} - - -/***/ }), -/* 216 */ -/***/ ((module, exports, __webpack_require__) => { - -/** - * This is the web browser implementation of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = __webpack_require__(217); -exports.log = log; -exports.formatArgs = formatArgs; -exports.save = save; -exports.load = load; -exports.useColors = useColors; -exports.storage = 'undefined' != typeof chrome - && 'undefined' != typeof chrome.storage - ? chrome.storage.local - : localstorage(); - -/** - * Colors. - */ - -exports.colors = [ - 'lightseagreen', - 'forestgreen', - 'goldenrod', - 'dodgerblue', - 'darkorchid', - 'crimson' -]; - -/** - * Currently only WebKit-based Web Inspectors, Firefox >= v31, - * and the Firebug extension (any Firefox version) are known - * to support "%c" CSS customizations. - * - * TODO: add a `localStorage` variable to explicitly enable/disable colors - */ - -function useColors() { - // NB: In an Electron preload script, document will be defined but not fully - // initialized. Since we know we're in Chrome, we'll just detect this case - // explicitly - if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') { - return true; - } - - // is webkit? http://stackoverflow.com/a/16459606/376773 - // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 - return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || - // is firebug? http://stackoverflow.com/a/398120/376773 - (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) || - // is firefox >= v31? - // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages - (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) || - // double check webkit in userAgent just in case we are in a worker - (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)); -} - -/** - * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. - */ - -exports.formatters.j = function(v) { - try { - return JSON.stringify(v); - } catch (err) { - return '[UnexpectedJSONParseError]: ' + err.message; - } -}; - - -/** - * Colorize log arguments if enabled. - * - * @api public - */ - -function formatArgs(args) { - var useColors = this.useColors; - - args[0] = (useColors ? '%c' : '') - + this.namespace - + (useColors ? ' %c' : ' ') - + args[0] - + (useColors ? '%c ' : ' ') - + '+' + exports.humanize(this.diff); - - if (!useColors) return; - - var c = 'color: ' + this.color; - args.splice(1, 0, c, 'color: inherit') - - // the final "%c" is somewhat tricky, because there could be other - // arguments passed either before or after the %c, so we need to - // figure out the correct index to insert the CSS into - var index = 0; - var lastC = 0; - args[0].replace(/%[a-zA-Z%]/g, function(match) { - if ('%%' === match) return; - index++; - if ('%c' === match) { - // we only are interested in the *last* %c - // (the user may have provided their own) - lastC = index; - } - }); - - args.splice(lastC, 0, c); -} - -/** - * Invokes `console.log()` when available. - * No-op when `console.log` is not a "function". - * - * @api public - */ - -function log() { - // this hackery is required for IE8/9, where - // the `console.log` function doesn't have 'apply' - return 'object' === typeof console - && console.log - && Function.prototype.apply.call(console.log, console, arguments); -} - -/** - * Save `namespaces`. - * - * @param {String} namespaces - * @api private - */ - -function save(namespaces) { - try { - if (null == namespaces) { - exports.storage.removeItem('debug'); - } else { - exports.storage.debug = namespaces; - } - } catch(e) {} -} - -/** - * Load `namespaces`. - * - * @return {String} returns the previously persisted debug modes - * @api private - */ - -function load() { - var r; - try { - r = exports.storage.debug; - } catch(e) {} - - // If debug isn't set in LS, and we're in Electron, try to load $DEBUG - if (!r && typeof process !== 'undefined' && 'env' in process) { - r = process.env.DEBUG; - } - - return r; -} - -/** - * Enable namespaces listed in `localStorage.debug` initially. - */ - -exports.enable(load()); - -/** - * Localstorage attempts to return the localstorage. - * - * This is necessary because safari throws - * when a user disables cookies/localstorage - * and you attempt to access it. - * - * @return {LocalStorage} - * @api private - */ - -function localstorage() { - try { - return window.localStorage; - } catch (e) {} -} - - -/***/ }), -/* 217 */ -/***/ ((module, exports, __webpack_require__) => { - - -/** - * This is the common logic for both the Node.js and web browser - * implementations of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = createDebug.debug = createDebug['default'] = createDebug; -exports.coerce = coerce; -exports.disable = disable; -exports.enable = enable; -exports.enabled = enabled; -exports.humanize = __webpack_require__(218); - -/** - * The currently active debug mode names, and names to skip. - */ - -exports.names = []; -exports.skips = []; - -/** - * Map of special "%n" handling functions, for the debug "format" argument. - * - * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". - */ - -exports.formatters = {}; - -/** - * Previous log timestamp. - */ - -var prevTime; - -/** - * Select a color. - * @param {String} namespace - * @return {Number} - * @api private - */ - -function selectColor(namespace) { - var hash = 0, i; - - for (i in namespace) { - hash = ((hash << 5) - hash) + namespace.charCodeAt(i); - hash |= 0; // Convert to 32bit integer - } - - return exports.colors[Math.abs(hash) % exports.colors.length]; -} - -/** - * Create a debugger with the given `namespace`. - * - * @param {String} namespace - * @return {Function} - * @api public - */ - -function createDebug(namespace) { - - function debug() { - // disabled? - if (!debug.enabled) return; - - var self = debug; - - // set `diff` timestamp - var curr = +new Date(); - var ms = curr - (prevTime || curr); - self.diff = ms; - self.prev = prevTime; - self.curr = curr; - prevTime = curr; - - // turn the `arguments` into a proper Array - var args = new Array(arguments.length); - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i]; - } - - args[0] = exports.coerce(args[0]); - - if ('string' !== typeof args[0]) { - // anything else let's inspect with %O - args.unshift('%O'); - } - - // apply any `formatters` transformations - var index = 0; - args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) { - // if we encounter an escaped % then don't increase the array index - if (match === '%%') return match; - index++; - var formatter = exports.formatters[format]; - if ('function' === typeof formatter) { - var val = args[index]; - match = formatter.call(self, val); - - // now we need to remove `args[index]` since it's inlined in the `format` - args.splice(index, 1); - index--; - } - return match; - }); - - // apply env-specific formatting (colors, etc.) - exports.formatArgs.call(self, args); - - var logFn = debug.log || exports.log || console.log.bind(console); - logFn.apply(self, args); - } - - debug.namespace = namespace; - debug.enabled = exports.enabled(namespace); - debug.useColors = exports.useColors(); - debug.color = selectColor(namespace); - - // env-specific initialization logic for debug instances - if ('function' === typeof exports.init) { - exports.init(debug); - } - - return debug; -} - -/** - * Enables a debug mode by namespaces. This can include modes - * separated by a colon and wildcards. - * - * @param {String} namespaces - * @api public - */ - -function enable(namespaces) { - exports.save(namespaces); - - exports.names = []; - exports.skips = []; - - var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); - var len = split.length; - - for (var i = 0; i < len; i++) { - if (!split[i]) continue; // ignore empty strings - namespaces = split[i].replace(/\*/g, '.*?'); - if (namespaces[0] === '-') { - exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); - } else { - exports.names.push(new RegExp('^' + namespaces + '$')); - } - } -} - -/** - * Disable debug output. - * - * @api public - */ - -function disable() { - exports.enable(''); -} - -/** - * Returns true if the given mode name is enabled, false otherwise. - * - * @param {String} name - * @return {Boolean} - * @api public - */ - -function enabled(name) { - var i, len; - for (i = 0, len = exports.skips.length; i < len; i++) { - if (exports.skips[i].test(name)) { - return false; - } - } - for (i = 0, len = exports.names.length; i < len; i++) { - if (exports.names[i].test(name)) { - return true; - } - } - return false; -} - -/** - * Coerce `val`. - * - * @param {Mixed} val - * @return {Mixed} - * @api private - */ - -function coerce(val) { - if (val instanceof Error) return val.stack || val.message; - return val; -} - - -/***/ }), -/* 218 */ -/***/ ((module) => { - -/** - * Helpers. - */ - -var s = 1000; -var m = s * 60; -var h = m * 60; -var d = h * 24; -var y = d * 365.25; - -/** - * Parse or format the given `val`. - * - * Options: - * - * - `long` verbose formatting [false] - * - * @param {String|Number} val - * @param {Object} [options] - * @throws {Error} throw an error if val is not a non-empty string or a number - * @return {String|Number} - * @api public - */ - -module.exports = function(val, options) { - options = options || {}; - var type = typeof val; - if (type === 'string' && val.length > 0) { - return parse(val); - } else if (type === 'number' && isNaN(val) === false) { - return options.long ? fmtLong(val) : fmtShort(val); - } - throw new Error( - 'val is not a non-empty string or a valid number. val=' + - JSON.stringify(val) - ); -}; - -/** - * Parse the given `str` and return milliseconds. - * - * @param {String} str - * @return {Number} - * @api private - */ - -function parse(str) { - str = String(str); - if (str.length > 100) { - return; - } - var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec( - str - ); - if (!match) { - return; - } - var n = parseFloat(match[1]); - var type = (match[2] || 'ms').toLowerCase(); - switch (type) { - case 'years': - case 'year': - case 'yrs': - case 'yr': - case 'y': - return n * y; - case 'days': - case 'day': - case 'd': - return n * d; - case 'hours': - case 'hour': - case 'hrs': - case 'hr': - case 'h': - return n * h; - case 'minutes': - case 'minute': - case 'mins': - case 'min': - case 'm': - return n * m; - case 'seconds': - case 'second': - case 'secs': - case 'sec': - case 's': - return n * s; - case 'milliseconds': - case 'millisecond': - case 'msecs': - case 'msec': - case 'ms': - return n; - default: - return undefined; - } -} - -/** - * Short format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function fmtShort(ms) { - if (ms >= d) { - return Math.round(ms / d) + 'd'; - } - if (ms >= h) { - return Math.round(ms / h) + 'h'; - } - if (ms >= m) { - return Math.round(ms / m) + 'm'; - } - if (ms >= s) { - return Math.round(ms / s) + 's'; - } - return ms + 'ms'; -} - -/** - * Long format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function fmtLong(ms) { - return plural(ms, d, 'day') || - plural(ms, h, 'hour') || - plural(ms, m, 'minute') || - plural(ms, s, 'second') || - ms + ' ms'; -} - -/** - * Pluralization helper. - */ - -function plural(ms, n, name) { - if (ms < n) { - return; - } - if (ms < n * 1.5) { - return Math.floor(ms / n) + ' ' + name; - } - return Math.ceil(ms / n) + ' ' + name + 's'; -} - - -/***/ }), -/* 219 */ -/***/ ((module, exports, __webpack_require__) => { - -/** - * Module dependencies. - */ - -var tty = __webpack_require__(161); -var util = __webpack_require__(17); - -/** - * This is the Node.js implementation of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = __webpack_require__(217); -exports.init = init; -exports.log = log; -exports.formatArgs = formatArgs; -exports.save = save; -exports.load = load; -exports.useColors = useColors; - -/** - * Colors. - */ - -exports.colors = [6, 2, 3, 4, 5, 1]; - -/** - * Build up the default `inspectOpts` object from the environment variables. - * - * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js - */ - -exports.inspectOpts = Object.keys(process.env).filter(function (key) { - return /^debug_/i.test(key); -}).reduce(function (obj, key) { - // camel-case - var prop = key - .substring(6) - .toLowerCase() - .replace(/_([a-z])/g, function (_, k) { return k.toUpperCase() }); - - // coerce string value into JS value - var val = process.env[key]; - if (/^(yes|on|true|enabled)$/i.test(val)) val = true; - else if (/^(no|off|false|disabled)$/i.test(val)) val = false; - else if (val === 'null') val = null; - else val = Number(val); - - obj[prop] = val; - return obj; -}, {}); - -/** - * The file descriptor to write the `debug()` calls to. - * Set the `DEBUG_FD` env variable to override with another value. i.e.: - * - * $ DEBUG_FD=3 node script.js 3>debug.log - */ - -var fd = parseInt(process.env.DEBUG_FD, 10) || 2; - -if (1 !== fd && 2 !== fd) { - util.deprecate(function(){}, 'except for stderr(2) and stdout(1), any other usage of DEBUG_FD is deprecated. Override debug.log if you want to use a different log function (https://git.io/debug_fd)')() -} - -var stream = 1 === fd ? process.stdout : - 2 === fd ? process.stderr : - createWritableStdioStream(fd); - -/** - * Is stdout a TTY? Colored output is enabled when `true`. - */ - -function useColors() { - return 'colors' in exports.inspectOpts - ? Boolean(exports.inspectOpts.colors) - : tty.isatty(fd); -} - -/** - * Map %o to `util.inspect()`, all on a single line. - */ - -exports.formatters.o = function(v) { - this.inspectOpts.colors = this.useColors; - return util.inspect(v, this.inspectOpts) - .split('\n').map(function(str) { - return str.trim() - }).join(' '); -}; - -/** - * Map %o to `util.inspect()`, allowing multiple lines if needed. - */ - -exports.formatters.O = function(v) { - this.inspectOpts.colors = this.useColors; - return util.inspect(v, this.inspectOpts); -}; - -/** - * Adds ANSI color escape codes if enabled. - * - * @api public - */ - -function formatArgs(args) { - var name = this.namespace; - var useColors = this.useColors; - - if (useColors) { - var c = this.color; - var prefix = ' \u001b[3' + c + ';1m' + name + ' ' + '\u001b[0m'; - - args[0] = prefix + args[0].split('\n').join('\n' + prefix); - args.push('\u001b[3' + c + 'm+' + exports.humanize(this.diff) + '\u001b[0m'); - } else { - args[0] = new Date().toUTCString() - + ' ' + name + ' ' + args[0]; - } -} - -/** - * Invokes `util.format()` with the specified arguments and writes to `stream`. - */ - -function log() { - return stream.write(util.format.apply(util, arguments) + '\n'); -} - -/** - * Save `namespaces`. - * - * @param {String} namespaces - * @api private - */ - -function save(namespaces) { - if (null == namespaces) { - // If you set a process.env field to null or undefined, it gets cast to the - // string 'null' or 'undefined'. Just delete instead. - delete process.env.DEBUG; - } else { - process.env.DEBUG = namespaces; - } -} - -/** - * Load `namespaces`. - * - * @return {String} returns the previously persisted debug modes - * @api private - */ - -function load() { - return process.env.DEBUG; -} - -/** - * Copied from `node/src/node.js`. - * - * XXX: It's lame that node doesn't expose this API out-of-the-box. It also - * relies on the undocumented `tty_wrap.guessHandleType()` which is also lame. - */ - -function createWritableStdioStream (fd) { - var stream; - var tty_wrap = process.binding('tty_wrap'); - - // Note stream._type is used for test-module-load-list.js - - switch (tty_wrap.guessHandleType(fd)) { - case 'TTY': - stream = new tty.WriteStream(fd); - stream._type = 'tty'; - - // Hack to have stream not keep the event loop alive. - // See https://github.com/joyent/node/issues/1726 - if (stream._handle && stream._handle.unref) { - stream._handle.unref(); - } - break; - - case 'FILE': - var fs = __webpack_require__(11); - stream = new fs.SyncWriteStream(fd, { autoClose: false }); - stream._type = 'fs'; - break; - - case 'PIPE': - case 'TCP': - var net = __webpack_require__(162); - stream = new net.Socket({ - fd: fd, - readable: false, - writable: true - }); - - // FIXME Should probably have an option in net.Socket to create a - // stream from an existing fd which is writable only. But for now - // we'll just add this hack and set the `readable` member to false. - // Test: ./node test/fixtures/echo.js < /etc/passwd - stream.readable = false; - stream.read = null; - stream._type = 'pipe'; - - // FIXME Hack to have stream not keep the event loop alive. - // See https://github.com/joyent/node/issues/1726 - if (stream._handle && stream._handle.unref) { - stream._handle.unref(); - } - break; - - default: - // Probably an error on in uv_guess_handle() - throw new Error('Implement me. Unknown stream file type!'); - } - - // For supporting legacy API we put the FD here. - stream.fd = fd; - - stream._isStdio = true; - - return stream; -} - -/** - * Init logic for `debug` instances. - * - * Create a new `inspectOpts` object in case `useColors` is set - * differently for a particular `debug` instance. - */ - -function init (debug) { - debug.inspectOpts = {}; - - var keys = Object.keys(exports.inspectOpts); - for (var i = 0; i < keys.length; i++) { - debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]]; - } -} - -/** - * Enable namespaces listed in `process.env.DEBUG` initially. - */ - -exports.enable(load()); - - -/***/ }), -/* 220 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var brackets = __webpack_require__(210); -var define = __webpack_require__(221); -var utils = __webpack_require__(223); - -/** - * Characters to use in text regex (we want to "not" match - * characters that are matched by other parsers) - */ - -var TEXT_REGEX = '([!@*?+]?\\(|\\)|[*?.+\\\\]|\\[:?(?=.*\\])|:?\\])+'; -var not = utils.createRegex(TEXT_REGEX); - -/** - * Extglob parsers - */ - -function parsers(extglob) { - extglob.state = extglob.state || {}; - - /** - * Use `expand-brackets` parsers - */ - - extglob.use(brackets.parsers); - extglob.parser.sets.paren = extglob.parser.sets.paren || []; - extglob.parser - - /** - * Extglob open: "*(" - */ - - .capture('paren.open', function() { - var parsed = this.parsed; - var pos = this.position(); - var m = this.match(/^([!@*?+])?\(/); - if (!m) return; - - var prev = this.prev(); - var prefix = m[1]; - var val = m[0]; - - var open = pos({ - type: 'paren.open', - parsed: parsed, - val: val - }); - - var node = pos({ - type: 'paren', - prefix: prefix, - nodes: [open] - }); - - // if nested negation extglobs, just cancel them out to simplify - if (prefix === '!' && prev.type === 'paren' && prev.prefix === '!') { - prev.prefix = '@'; - node.prefix = '@'; - } - - define(node, 'rest', this.input); - define(node, 'parsed', parsed); - define(node, 'parent', prev); - define(open, 'parent', node); - - this.push('paren', node); - prev.nodes.push(node); - }) - - /** - * Extglob close: ")" - */ - - .capture('paren.close', function() { - var parsed = this.parsed; - var pos = this.position(); - var m = this.match(/^\)/); - if (!m) return; - - var parent = this.pop('paren'); - var node = pos({ - type: 'paren.close', - rest: this.input, - parsed: parsed, - val: m[0] - }); - - if (!this.isType(parent, 'paren')) { - if (this.options.strict) { - throw new Error('missing opening paren: "("'); - } - node.escaped = true; - return node; - } - - node.prefix = parent.prefix; - parent.nodes.push(node); - define(node, 'parent', parent); - }) - - /** - * Escape: "\\." - */ - - .capture('escape', function() { - var pos = this.position(); - var m = this.match(/^\\(.)/); - if (!m) return; - - return pos({ - type: 'escape', - val: m[0], - ch: m[1] - }); - }) - - /** - * Question marks: "?" - */ - - .capture('qmark', function() { - var parsed = this.parsed; - var pos = this.position(); - var m = this.match(/^\?+(?!\()/); - if (!m) return; - extglob.state.metachar = true; - return pos({ - type: 'qmark', - rest: this.input, - parsed: parsed, - val: m[0] - }); - }) - - /** - * Character parsers - */ - - .capture('star', /^\*(?!\()/) - .capture('plus', /^\+(?!\()/) - .capture('dot', /^\./) - .capture('text', not); -}; - -/** - * Expose text regex string - */ - -module.exports.TEXT_REGEX = TEXT_REGEX; - -/** - * Extglob parsers - */ - -module.exports = parsers; - - -/***/ }), -/* 221 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -/*! - * define-property - * - * Copyright (c) 2015, 2017, Jon Schlinkert. - * Released under the MIT License. - */ - - - -var isDescriptor = __webpack_require__(222); - -module.exports = function defineProperty(obj, prop, val) { - if (typeof obj !== 'object' && typeof obj !== 'function') { - throw new TypeError('expected an object or function.'); - } - - if (typeof prop !== 'string') { - throw new TypeError('expected `prop` to be a string.'); - } - - if (isDescriptor(val) && ('set' in val || 'get' in val)) { - return Object.defineProperty(obj, prop, val); - } - - return Object.defineProperty(obj, prop, { - configurable: true, - enumerable: false, - writable: true, - value: val - }); -}; - - -/***/ }), -/* 222 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var isAccessor = __webpack_require__(83); -var isData = __webpack_require__(87); - -module.exports = function isDescriptor(obj, key) { - if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) { - return false; - } - - if ('get' in obj || 'set' in obj) { - return isAccessor(obj, key); - } - - return isData(obj, key); -}; - - -/***/ }), -/* 223 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var regex = __webpack_require__(92); -var Cache = __webpack_require__(200); - -/** - * Utils - */ - -var utils = module.exports; -var cache = utils.cache = new Cache(); - -/** - * Cast `val` to an array - * @return {Array} - */ - -utils.arrayify = function(val) { - if (!Array.isArray(val)) { - return [val]; - } - return val; -}; - -/** - * Memoize a generated regex or function - */ - -utils.memoize = function(type, pattern, options, fn) { - var key = utils.createKey(type + pattern, options); - - if (cache.has(type, key)) { - return cache.get(type, key); - } - - var val = fn(pattern, options); - if (options && options.cache === false) { - return val; - } - - cache.set(type, key, val); - return val; -}; - -/** - * Create the key to use for memoization. The key is generated - * by iterating over the options and concatenating key-value pairs - * to the pattern string. - */ - -utils.createKey = function(pattern, options) { - var key = pattern; - if (typeof options === 'undefined') { - return key; - } - for (var prop in options) { - key += ';' + prop + '=' + String(options[prop]); - } - return key; -}; - -/** - * Create the regex to use for matching text - */ - -utils.createRegex = function(str) { - var opts = {contains: true, strictClose: false}; - return regex(str, opts); -}; - - -/***/ }), -/* 224 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -/** - * Module dependencies - */ - -var Snapdragon = __webpack_require__(118); -var define = __webpack_require__(221); -var extend = __webpack_require__(96); - -/** - * Local dependencies - */ - -var compilers = __webpack_require__(209); -var parsers = __webpack_require__(220); - -/** - * Customize Snapdragon parser and renderer - */ - -function Extglob(options) { - this.options = extend({source: 'extglob'}, options); - this.snapdragon = this.options.snapdragon || new Snapdragon(this.options); - this.snapdragon.patterns = this.snapdragon.patterns || {}; - this.compiler = this.snapdragon.compiler; - this.parser = this.snapdragon.parser; - - compilers(this.snapdragon); - parsers(this.snapdragon); - - /** - * Override Snapdragon `.parse` method - */ - - define(this.snapdragon, 'parse', function(str, options) { - var parsed = Snapdragon.prototype.parse.apply(this, arguments); - parsed.input = str; - - // escape unmatched brace/bracket/parens - var last = this.parser.stack.pop(); - if (last && this.options.strict !== true) { - var node = last.nodes[0]; - node.val = '\\' + node.val; - var sibling = node.parent.nodes[1]; - if (sibling.type === 'star') { - sibling.loose = true; - } - } - - // add non-enumerable parser reference - define(parsed, 'parser', this.parser); - return parsed; - }); - - /** - * Decorate `.parse` method - */ - - define(this, 'parse', function(ast, options) { - return this.snapdragon.parse.apply(this.snapdragon, arguments); - }); - - /** - * Decorate `.compile` method - */ - - define(this, 'compile', function(ast, options) { - return this.snapdragon.compile.apply(this.snapdragon, arguments); - }); - -} - -/** - * Expose `Extglob` - */ - -module.exports = Extglob; - - -/***/ }), -/* 225 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var extglob = __webpack_require__(208); -var nanomatch = __webpack_require__(194); -var regexNot = __webpack_require__(92); -var toRegex = __webpack_require__(73); -var not; - -/** - * Characters to use in negation regex (we want to "not" match - * characters that are matched by other parsers) - */ - -var TEXT = '([!@*?+]?\\(|\\)|\\[:?(?=.*?:?\\])|:?\\]|[*+?!^$.\\\\/])+'; -var createNotRegex = function(opts) { - return not || (not = textRegex(TEXT)); -}; - -/** - * Parsers - */ - -module.exports = function(snapdragon) { - var parsers = snapdragon.parser.parsers; - - // register nanomatch parsers - snapdragon.use(nanomatch.parsers); - - // get references to some specific nanomatch parsers before they - // are overridden by the extglob and/or parsers - var escape = parsers.escape; - var slash = parsers.slash; - var qmark = parsers.qmark; - var plus = parsers.plus; - var star = parsers.star; - var dot = parsers.dot; - - // register extglob parsers - snapdragon.use(extglob.parsers); - - // custom micromatch parsers - snapdragon.parser - .use(function() { - // override "notRegex" created in nanomatch parser - this.notRegex = /^\!+(?!\()/; - }) - // reset the referenced parsers - .capture('escape', escape) - .capture('slash', slash) - .capture('qmark', qmark) - .capture('star', star) - .capture('plus', plus) - .capture('dot', dot) - - /** - * Override `text` parser - */ - - .capture('text', function() { - if (this.isInside('bracket')) return; - var pos = this.position(); - var m = this.match(createNotRegex(this.options)); - if (!m || !m[0]) return; - - // escape regex boundary characters and simple brackets - var val = m[0].replace(/([[\]^$])/g, '\\$1'); - - return pos({ - type: 'text', - val: val - }); - }); -}; - -/** - * Create text regex - */ - -function textRegex(pattern) { - var notStr = regexNot.create(pattern, {contains: true, strictClose: false}); - var prefix = '(?:[\\^]|\\\\|'; - return toRegex(prefix + notStr + ')', {strictClose: false}); -} - - -/***/ }), -/* 226 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -module.exports = new (__webpack_require__(200))(); - - -/***/ }), -/* 227 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var utils = module.exports; -var path = __webpack_require__(3); - -/** - * Module dependencies - */ - -var Snapdragon = __webpack_require__(118); -utils.define = __webpack_require__(228); -utils.diff = __webpack_require__(205); -utils.extend = __webpack_require__(191); -utils.pick = __webpack_require__(206); -utils.typeOf = __webpack_require__(230); -utils.unique = __webpack_require__(95); - -/** - * Returns true if the platform is windows, or `path.sep` is `\\`. - * This is defined as a function to allow `path.sep` to be set in unit tests, - * or by the user, if there is a reason to do so. - * @return {Boolean} - */ - -utils.isWindows = function() { - return path.sep === '\\' || process.platform === 'win32'; -}; - -/** - * Get the `Snapdragon` instance to use - */ - -utils.instantiate = function(ast, options) { - var snapdragon; - // if an instance was created by `.parse`, use that instance - if (utils.typeOf(ast) === 'object' && ast.snapdragon) { - snapdragon = ast.snapdragon; - // if the user supplies an instance on options, use that instance - } else if (utils.typeOf(options) === 'object' && options.snapdragon) { - snapdragon = options.snapdragon; - // create a new instance - } else { - snapdragon = new Snapdragon(options); - } - - utils.define(snapdragon, 'parse', function(str, options) { - var parsed = Snapdragon.prototype.parse.apply(this, arguments); - parsed.input = str; - - // escape unmatched brace/bracket/parens - var last = this.parser.stack.pop(); - if (last && this.options.strictErrors !== true) { - var open = last.nodes[0]; - var inner = last.nodes[1]; - if (last.type === 'bracket') { - if (inner.val.charAt(0) === '[') { - inner.val = '\\' + inner.val; - } - - } else { - open.val = '\\' + open.val; - var sibling = open.parent.nodes[1]; - if (sibling.type === 'star') { - sibling.loose = true; - } - } - } - - // add non-enumerable parser reference - utils.define(parsed, 'parser', this.parser); - return parsed; - }); - - return snapdragon; -}; - -/** - * Create the key to use for memoization. The key is generated - * by iterating over the options and concatenating key-value pairs - * to the pattern string. - */ - -utils.createKey = function(pattern, options) { - if (utils.typeOf(options) !== 'object') { - return pattern; - } - var val = pattern; - var keys = Object.keys(options); - for (var i = 0; i < keys.length; i++) { - var key = keys[i]; - val += ';' + key + '=' + String(options[key]); - } - return val; -}; - -/** - * Cast `val` to an array - * @return {Array} - */ - -utils.arrayify = function(val) { - if (typeof val === 'string') return [val]; - return val ? (Array.isArray(val) ? val : [val]) : []; -}; - -/** - * Return true if `val` is a non-empty string - */ - -utils.isString = function(val) { - return typeof val === 'string'; -}; - -/** - * Return true if `val` is a non-empty string - */ - -utils.isObject = function(val) { - return utils.typeOf(val) === 'object'; -}; - -/** - * Returns true if the given `str` has special characters - */ - -utils.hasSpecialChars = function(str) { - return /(?:(?:(^|\/)[!.])|[*?+()|\[\]{}]|[+@]\()/.test(str); -}; - -/** - * Escape regex characters in the given string - */ - -utils.escapeRegex = function(str) { - return str.replace(/[-[\]{}()^$|*+?.\\\/\s]/g, '\\$&'); -}; - -/** - * Normalize slashes in the given filepath. - * - * @param {String} `filepath` - * @return {String} - */ - -utils.toPosixPath = function(str) { - return str.replace(/\\+/g, '/'); -}; - -/** - * Strip backslashes before special characters in a string. - * - * @param {String} `str` - * @return {String} - */ - -utils.unescape = function(str) { - return utils.toPosixPath(str.replace(/\\(?=[*+?!.])/g, '')); -}; - -/** - * Strip the prefix from a filepath - * @param {String} `fp` - * @return {String} - */ - -utils.stripPrefix = function(str) { - if (str.charAt(0) !== '.') { - return str; - } - var ch = str.charAt(1); - if (utils.isSlash(ch)) { - return str.slice(2); - } - return str; -}; - -/** - * Returns true if the given str is an escaped or - * unescaped path character - */ - -utils.isSlash = function(str) { - return str === '/' || str === '\\/' || str === '\\' || str === '\\\\'; -}; - -/** - * Returns a function that returns true if the given - * pattern matches or contains a `filepath` - * - * @param {String} `pattern` - * @return {Function} - */ - -utils.matchPath = function(pattern, options) { - return (options && options.contains) - ? utils.containsPattern(pattern, options) - : utils.equalsPattern(pattern, options); -}; - -/** - * Returns true if the given (original) filepath or unixified path are equal - * to the given pattern. - */ - -utils._equals = function(filepath, unixPath, pattern) { - return pattern === filepath || pattern === unixPath; -}; - -/** - * Returns true if the given (original) filepath or unixified path contain - * the given pattern. - */ - -utils._contains = function(filepath, unixPath, pattern) { - return filepath.indexOf(pattern) !== -1 || unixPath.indexOf(pattern) !== -1; -}; - -/** - * Returns a function that returns true if the given - * pattern is the same as a given `filepath` - * - * @param {String} `pattern` - * @return {Function} - */ - -utils.equalsPattern = function(pattern, options) { - var unixify = utils.unixify(options); - options = options || {}; - - return function fn(filepath) { - var equal = utils._equals(filepath, unixify(filepath), pattern); - if (equal === true || options.nocase !== true) { - return equal; - } - var lower = filepath.toLowerCase(); - return utils._equals(lower, unixify(lower), pattern); - }; -}; - -/** - * Returns a function that returns true if the given - * pattern contains a `filepath` - * - * @param {String} `pattern` - * @return {Function} - */ - -utils.containsPattern = function(pattern, options) { - var unixify = utils.unixify(options); - options = options || {}; - - return function(filepath) { - var contains = utils._contains(filepath, unixify(filepath), pattern); - if (contains === true || options.nocase !== true) { - return contains; - } - var lower = filepath.toLowerCase(); - return utils._contains(lower, unixify(lower), pattern); - }; -}; - -/** - * Returns a function that returns true if the given - * regex matches the `filename` of a file path. - * - * @param {RegExp} `re` Matching regex - * @return {Function} - */ - -utils.matchBasename = function(re) { - return function(filepath) { - return re.test(path.basename(filepath)); - }; -}; - -/** - * Determines the filepath to return based on the provided options. - * @return {any} - */ - -utils.value = function(str, unixify, options) { - if (options && options.unixify === false) { - return str; - } - return unixify(str); -}; - -/** - * Returns a function that normalizes slashes in a string to forward - * slashes, strips `./` from beginning of paths, and optionally unescapes - * special characters. - * @return {Function} - */ - -utils.unixify = function(options) { - options = options || {}; - return function(filepath) { - if (utils.isWindows() || options.unixify === true) { - filepath = utils.toPosixPath(filepath); - } - if (options.stripPrefix !== false) { - filepath = utils.stripPrefix(filepath); - } - if (options.unescape === true) { - filepath = utils.unescape(filepath); - } - return filepath; - }; -}; - - -/***/ }), -/* 228 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -/*! - * define-property - * - * Copyright (c) 2015-2018, Jon Schlinkert. - * Released under the MIT License. - */ - - - -var isobject = __webpack_require__(81); -var isDescriptor = __webpack_require__(229); -var define = (typeof Reflect !== 'undefined' && Reflect.defineProperty) - ? Reflect.defineProperty - : Object.defineProperty; - -module.exports = function defineProperty(obj, key, val) { - if (!isobject(obj) && typeof obj !== 'function' && !Array.isArray(obj)) { - throw new TypeError('expected an object, function, or array'); - } - - if (typeof key !== 'string') { - throw new TypeError('expected "key" to be a string'); - } - - if (isDescriptor(val)) { - define(obj, key, val); - return obj; - } - - define(obj, key, { - configurable: true, - enumerable: false, - writable: true, - value: val - }); - - return obj; -}; - - -/***/ }), -/* 229 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var isAccessor = __webpack_require__(83); -var isData = __webpack_require__(87); - -module.exports = function isDescriptor(obj, key) { - if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) { - return false; - } - - if ('get' in obj || 'set' in obj) { - return isAccessor(obj, key); - } - - return isData(obj, key); -}; - - -/***/ }), -/* 230 */ -/***/ ((module) => { - -var toString = Object.prototype.toString; - -module.exports = function kindOf(val) { - if (val === void 0) return 'undefined'; - if (val === null) return 'null'; - - var type = typeof val; - if (type === 'boolean') return 'boolean'; - if (type === 'string') return 'string'; - if (type === 'number') return 'number'; - if (type === 'symbol') return 'symbol'; - if (type === 'function') { - return isGeneratorFn(val) ? 'generatorfunction' : 'function'; - } - - if (isArray(val)) return 'array'; - if (isBuffer(val)) return 'buffer'; - if (isArguments(val)) return 'arguments'; - if (isDate(val)) return 'date'; - if (isError(val)) return 'error'; - if (isRegexp(val)) return 'regexp'; - - switch (ctorName(val)) { - case 'Symbol': return 'symbol'; - case 'Promise': return 'promise'; - - // Set, Map, WeakSet, WeakMap - case 'WeakMap': return 'weakmap'; - case 'WeakSet': return 'weakset'; - case 'Map': return 'map'; - case 'Set': return 'set'; - - // 8-bit typed arrays - case 'Int8Array': return 'int8array'; - case 'Uint8Array': return 'uint8array'; - case 'Uint8ClampedArray': return 'uint8clampedarray'; - - // 16-bit typed arrays - case 'Int16Array': return 'int16array'; - case 'Uint16Array': return 'uint16array'; - - // 32-bit typed arrays - case 'Int32Array': return 'int32array'; - case 'Uint32Array': return 'uint32array'; - case 'Float32Array': return 'float32array'; - case 'Float64Array': return 'float64array'; - } - - if (isGeneratorObj(val)) { - return 'generator'; - } - - // Non-plain objects - type = toString.call(val); - switch (type) { - case '[object Object]': return 'object'; - // iterators - case '[object Map Iterator]': return 'mapiterator'; - case '[object Set Iterator]': return 'setiterator'; - case '[object String Iterator]': return 'stringiterator'; - case '[object Array Iterator]': return 'arrayiterator'; - } - - // other - return type.slice(8, -1).toLowerCase().replace(/\s/g, ''); -}; - -function ctorName(val) { - return typeof val.constructor === 'function' ? val.constructor.name : null; -} - -function isArray(val) { - if (Array.isArray) return Array.isArray(val); - return val instanceof Array; -} - -function isError(val) { - return val instanceof Error || (typeof val.message === 'string' && val.constructor && typeof val.constructor.stackTraceLimit === 'number'); -} - -function isDate(val) { - if (val instanceof Date) return true; - return typeof val.toDateString === 'function' - && typeof val.getDate === 'function' - && typeof val.setDate === 'function'; -} - -function isRegexp(val) { - if (val instanceof RegExp) return true; - return typeof val.flags === 'string' - && typeof val.ignoreCase === 'boolean' - && typeof val.multiline === 'boolean' - && typeof val.global === 'boolean'; -} - -function isGeneratorFn(name, val) { - return ctorName(name) === 'GeneratorFunction'; -} - -function isGeneratorObj(val) { - return typeof val.throw === 'function' - && typeof val.return === 'function' - && typeof val.next === 'function'; -} - -function isArguments(val) { - try { - if (typeof val.length === 'number' && typeof val.callee === 'function') { - return true; - } - } catch (err) { - if (err.message.indexOf('callee') !== -1) { - return true; - } - } - return false; -} - -/** - * If you need to support Safari 5-7 (8-10 yr-old browser), - * take a look at https://github.com/feross/is-buffer - */ - -function isBuffer(val) { - if (val.constructor && typeof val.constructor.isBuffer === 'function') { - return val.constructor.isBuffer(val); - } - return false; -} - - -/***/ }), -/* 231 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var stream = __webpack_require__(232); -var util = __webpack_require__(17); - -var Readable = stream.Readable; - -module.exports = ReaddirpReadable; - -util.inherits(ReaddirpReadable, Readable); - -function ReaddirpReadable (opts) { - if (!(this instanceof ReaddirpReadable)) return new ReaddirpReadable(opts); - - opts = opts || {}; - - opts.objectMode = true; - Readable.call(this, opts); - - // backpressure not implemented at this point - this.highWaterMark = Infinity; - - this._destroyed = false; - this._paused = false; - this._warnings = []; - this._errors = []; - - this._pauseResumeErrors(); -} - -var proto = ReaddirpReadable.prototype; - -proto._pauseResumeErrors = function () { - var self = this; - self.on('pause', function () { self._paused = true }); - self.on('resume', function () { - if (self._destroyed) return; - self._paused = false; - - self._warnings.forEach(function (err) { self.emit('warn', err) }); - self._warnings.length = 0; - - self._errors.forEach(function (err) { self.emit('error', err) }); - self._errors.length = 0; - }) -} - -// called for each entry -proto._processEntry = function (entry) { - if (this._destroyed) return; - this.push(entry); -} - -proto._read = function () { } - -proto.destroy = function () { - // when stream is destroyed it will emit nothing further, not even errors or warnings - this.push(null); - this.readable = false; - this._destroyed = true; - this.emit('close'); -} - -proto._done = function () { - this.push(null); -} - -// we emit errors and warnings async since we may handle errors like invalid args -// within the initial event loop before any event listeners subscribed -proto._handleError = function (err) { - var self = this; - setImmediate(function () { - if (self._paused) return self._warnings.push(err); - if (!self._destroyed) self.emit('warn', err); - }); -} - -proto._handleFatalError = function (err) { - var self = this; - setImmediate(function () { - if (self._paused) return self._errors.push(err); - if (!self._destroyed) self.emit('error', err); - }); -} - -function createStreamAPI () { - var stream = new ReaddirpReadable(); - - return { - stream : stream - , processEntry : stream._processEntry.bind(stream) - , done : stream._done.bind(stream) - , handleError : stream._handleError.bind(stream) - , handleFatalError : stream._handleFatalError.bind(stream) - }; -} - -module.exports = createStreamAPI; - - -/***/ }), -/* 232 */ -/***/ ((module, exports, __webpack_require__) => { - -var Stream = __webpack_require__(15); -if (process.env.READABLE_STREAM === 'disable' && Stream) { - module.exports = Stream; - exports = module.exports = Stream.Readable; - exports.Readable = Stream.Readable; - exports.Writable = Stream.Writable; - exports.Duplex = Stream.Duplex; - exports.Transform = Stream.Transform; - exports.PassThrough = Stream.PassThrough; - exports.Stream = Stream; -} else { - exports = module.exports = __webpack_require__(233); - exports.Stream = Stream || exports; - exports.Readable = exports; - exports.Writable = __webpack_require__(242); - exports.Duplex = __webpack_require__(241); - exports.Transform = __webpack_require__(245); - exports.PassThrough = __webpack_require__(246); -} - - -/***/ }), -/* 233 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// 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 pna = __webpack_require__(234); -/**/ - -module.exports = Readable; - -/**/ -var isArray = __webpack_require__(136); -/**/ - -/**/ -var Duplex; -/**/ - -Readable.ReadableState = ReadableState; - -/**/ -var EE = (__webpack_require__(53).EventEmitter); - -var EElistenerCount = function (emitter, type) { - return emitter.listeners(type).length; -}; -/**/ - -/**/ -var Stream = __webpack_require__(235); -/**/ - -/**/ - -var Buffer = (__webpack_require__(236).Buffer); -var OurUint8Array = (typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}).Uint8Array || function () {}; -function _uint8ArrayToBuffer(chunk) { - return Buffer.from(chunk); -} -function _isUint8Array(obj) { - return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; -} - -/**/ - -/**/ -var util = Object.create(__webpack_require__(238)); -util.inherits = __webpack_require__(70); -/**/ - -/**/ -var debugUtil = __webpack_require__(17); -var debug = void 0; -if (debugUtil && debugUtil.debuglog) { - debug = debugUtil.debuglog('stream'); -} else { - debug = function () {}; -} -/**/ - -var BufferList = __webpack_require__(239); -var destroyImpl = __webpack_require__(240); -var StringDecoder; - -util.inherits(Readable, Stream); - -var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; - -function prependListener(emitter, event, fn) { - // Sadly this is not cacheable as some libraries bundle their own - // event emitter implementation with them. - if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); - - // This is a hack to make sure that our error handler is attached before any - // userland ones. NEVER DO THIS. This is here only because this code needs - // to continue to work with older versions of Node.js that do not include - // the prependListener() method. The goal is to eventually remove this hack. - if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; -} - -function ReadableState(options, stream) { - Duplex = Duplex || __webpack_require__(241); - - options = options || {}; - - // Duplex streams are both readable and writable, but share - // the same options object. - // However, some cases require setting options to different - // values for the readable and the writable sides of the duplex stream. - // These options can be provided separately as readableXXX and writableXXX. - var isDuplex = stream instanceof Duplex; - - // 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 (isDuplex) 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 readableHwm = options.readableHighWaterMark; - var defaultHwm = this.objectMode ? 16 : 16 * 1024; - - if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm; - - // cast to ints. - this.highWaterMark = Math.floor(this.highWaterMark); - - // A linked list is used to store data chunks instead of an array because the - // linked list can remove elements from the beginning faster than - // array.shift() - this.buffer = new BufferList(); - 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 event 'readable'/'data' is emitted - // 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 read 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; - this.resumeScheduled = false; - - // has it been destroyed - this.destroyed = 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'; - - // 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 = (__webpack_require__(244).StringDecoder); - this.decoder = new StringDecoder(options.encoding); - this.encoding = options.encoding; - } -} - -function Readable(options) { - Duplex = Duplex || __webpack_require__(241); - - if (!(this instanceof Readable)) return new Readable(options); - - this._readableState = new ReadableState(options, this); - - // legacy - this.readable = true; - - if (options) { - if (typeof options.read === 'function') this._read = options.read; - - if (typeof options.destroy === 'function') this._destroy = options.destroy; - } - - Stream.call(this); -} - -Object.defineProperty(Readable.prototype, 'destroyed', { - get: function () { - if (this._readableState === undefined) { - return false; - } - return this._readableState.destroyed; - }, - set: function (value) { - // we ignore the value if the stream - // has not been initialized yet - if (!this._readableState) { - return; - } - - // backward compatibility, the user is explicitly - // managing destroyed - this._readableState.destroyed = value; - } -}); - -Readable.prototype.destroy = destroyImpl.destroy; -Readable.prototype._undestroy = destroyImpl.undestroy; -Readable.prototype._destroy = function (err, cb) { - this.push(null); - cb(err); -}; - -// 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; - var skipChunkCheck; - - if (!state.objectMode) { - if (typeof chunk === 'string') { - encoding = encoding || state.defaultEncoding; - if (encoding !== state.encoding) { - chunk = Buffer.from(chunk, encoding); - encoding = ''; - } - skipChunkCheck = true; - } - } else { - skipChunkCheck = true; - } - - return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); -}; - -// Unshift should *always* be something directly out of read() -Readable.prototype.unshift = function (chunk) { - return readableAddChunk(this, chunk, null, true, false); -}; - -function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { - var state = stream._readableState; - if (chunk === null) { - state.reading = false; - onEofChunk(stream, state); - } else { - var er; - if (!skipChunkCheck) er = chunkInvalid(state, chunk); - if (er) { - stream.emit('error', er); - } else if (state.objectMode || chunk && chunk.length > 0) { - if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { - chunk = _uint8ArrayToBuffer(chunk); - } - - if (addToFront) { - if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true); - } else if (state.ended) { - stream.emit('error', new Error('stream.push() after EOF')); - } else { - state.reading = false; - if (state.decoder && !encoding) { - chunk = state.decoder.write(chunk); - if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); - } else { - addChunk(stream, state, chunk, false); - } - } - } else if (!addToFront) { - state.reading = false; - } - } - - return needMoreData(state); -} - -function addChunk(stream, state, chunk, addToFront) { - 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); -} - -function chunkInvalid(state, chunk) { - var er; - if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { - er = new TypeError('Invalid non-string/buffer chunk'); - } - return er; -} - -// 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); -} - -Readable.prototype.isPaused = function () { - return this._readableState.flowing === false; -}; - -// backwards compatibility. -Readable.prototype.setEncoding = function (enc) { - if (!StringDecoder) StringDecoder = (__webpack_require__(244).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 to prevent increasing hwm excessively in - // tiny amounts - n--; - n |= n >>> 1; - n |= n >>> 2; - n |= n >>> 4; - n |= n >>> 8; - n |= n >>> 16; - n++; - } - return n; -} - -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function howMuchToRead(n, state) { - if (n <= 0 || state.length === 0 && state.ended) return 0; - if (state.objectMode) return 1; - if (n !== n) { - // Only flow one buffer at a time - if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; - } - // If we're asking for more than the current hwm, then raise the hwm. - if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); - if (n <= state.length) return n; - // Don't have enough - if (!state.ended) { - state.needReadable = true; - return 0; - } - return state.length; -} - -// you can override either this method, or the async _read(n) below. -Readable.prototype.read = function (n) { - debug('read', n); - n = parseInt(n, 10); - var state = this._readableState; - var nOrig = n; - - if (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); - } else 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 (!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; - } else { - state.length -= n; - } - - if (state.length === 0) { - // If we have nothing in the buffer, then we want to know - // as soon as we *do* get something into the buffer. - if (!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) endReadable(this); - } - - if (ret !== null) this.emit('data', ret); - - return ret; -}; - -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) pna.nextTick(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; - pna.nextTick(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('_read() is 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 : unpipe; - if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn); - - dest.on('unpipe', onunpipe); - function onunpipe(readable, unpipeInfo) { - debug('onunpipe'); - if (readable === src) { - if (unpipeInfo && unpipeInfo.hasUnpiped === false) { - unpipeInfo.hasUnpiped = true; - 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); - - var cleanedUp = false; - 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', unpipe); - src.removeListener('data', ondata); - - cleanedUp = true; - - // 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(); - } - - // If the user pushes more data while we're writing to dest then we'll end up - // in ondata again. However, we only want to increase awaitDrain once because - // dest will only emit one 'drain' event for the multiple writes. - // => Introduce a guard on increasing awaitDrain. - var increasedAwaitDrain = false; - src.on('data', ondata); - function ondata(chunk) { - debug('ondata'); - increasedAwaitDrain = false; - var ret = dest.write(chunk); - if (false === ret && !increasedAwaitDrain) { - // If the user unpiped during `dest.write()`, it is possible - // to get stuck in a permanently paused state if that write - // also returned false. - // => Check whether `dest` is still a piping destination. - if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { - debug('false write response, pause', state.awaitDrain); - state.awaitDrain++; - increasedAwaitDrain = true; - } - 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); - } - - // Make sure our error handler is attached before userland ones. - prependListener(dest, 'error', onerror); - - // 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; - var unpipeInfo = { hasUnpiped: false }; - - // 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, unpipeInfo); - 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, { hasUnpiped: false }); - }return this; - } - - // try to find the right one. - var index = indexOf(state.pipes, dest); - if (index === -1) return this; - - state.pipes.splice(index, 1); - state.pipesCount -= 1; - if (state.pipesCount === 1) state.pipes = state.pipes[0]; - - dest.emit('unpipe', this, unpipeInfo); - - 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 (ev === 'data') { - // Start flowing on next tick if stream isn't explicitly paused - if (this._readableState.flowing !== false) this.resume(); - } else if (ev === 'readable') { - var state = this._readableState; - if (!state.endEmitted && !state.readableListening) { - state.readableListening = state.needReadable = true; - state.emittedReadable = false; - if (!state.reading) { - pna.nextTick(nReadingNextTick, this); - } else if (state.length) { - emitReadable(this); - } - } - } - - 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; - pna.nextTick(resume_, stream, state); - } -} - -function resume_(stream, state) { - if (!state.reading) { - debug('resume read 0'); - stream.read(0); - } - - state.resumeScheduled = false; - state.awaitDrain = 0; - 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); - while (state.flowing && stream.read() !== null) {} -} - -// 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 _this = this; - - var state = this._readableState; - var paused = false; - - stream.on('end', function () { - debug('wrapped end'); - if (state.decoder && !state.ended) { - var chunk = state.decoder.end(); - if (chunk && chunk.length) _this.push(chunk); - } - - _this.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 = _this.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. - for (var n = 0; n < kProxyEvents.length; n++) { - stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); - } - - // when we try to consume some more bytes, simply unpause the - // underlying stream. - this._read = function (n) { - debug('wrapped _read', n); - if (paused) { - paused = false; - stream.resume(); - } - }; - - return this; -}; - -Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { - // making it explicit this property is not enumerable - // because otherwise some prototype manipulation in - // userland will fail - enumerable: false, - get: function () { - return this._readableState.highWaterMark; - } -}); - -// 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. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function fromList(n, state) { - // nothing buffered - if (state.length === 0) return null; - - var ret; - if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { - // read it all, truncate the list - if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); - state.buffer.clear(); - } else { - // read part of list - ret = fromListPartial(n, state.buffer, state.decoder); - } - - return ret; -} - -// Extracts only enough buffered data to satisfy the amount requested. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function fromListPartial(n, list, hasStrings) { - var ret; - if (n < list.head.data.length) { - // slice is the same for buffers and strings - ret = list.head.data.slice(0, n); - list.head.data = list.head.data.slice(n); - } else if (n === list.head.data.length) { - // first chunk is a perfect match - ret = list.shift(); - } else { - // result spans more than one buffer - ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); - } - return ret; -} - -// Copies a specified amount of characters from the list of buffered data -// chunks. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function copyFromBufferString(n, list) { - var p = list.head; - var c = 1; - var ret = p.data; - n -= ret.length; - while (p = p.next) { - var str = p.data; - var nb = n > str.length ? str.length : n; - if (nb === str.length) ret += str;else ret += str.slice(0, n); - n -= nb; - if (n === 0) { - if (nb === str.length) { - ++c; - if (p.next) list.head = p.next;else list.head = list.tail = null; - } else { - list.head = p; - p.data = str.slice(nb); - } - break; - } - ++c; - } - list.length -= c; - return ret; -} - -// Copies a specified amount of bytes from the list of buffered data chunks. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function copyFromBuffer(n, list) { - var ret = Buffer.allocUnsafe(n); - var p = list.head; - var c = 1; - p.data.copy(ret); - n -= p.data.length; - while (p = p.next) { - var buf = p.data; - var nb = n > buf.length ? buf.length : n; - buf.copy(ret, ret.length - n, 0, nb); - n -= nb; - if (n === 0) { - if (nb === buf.length) { - ++c; - if (p.next) list.head = p.next;else list.head = list.tail = null; - } else { - list.head = p; - p.data = buf.slice(nb); - } - break; - } - ++c; - } - list.length -= c; - 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; - pna.nextTick(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 indexOf(xs, x) { - for (var i = 0, l = xs.length; i < l; i++) { - if (xs[i] === x) return i; - } - return -1; -} - -/***/ }), -/* 234 */ -/***/ ((module) => { - -"use strict"; - - -if (typeof process === 'undefined' || - !process.version || - process.version.indexOf('v0.') === 0 || - process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) { - module.exports = { nextTick: nextTick }; -} else { - module.exports = process -} - -function nextTick(fn, arg1, arg2, arg3) { - if (typeof fn !== 'function') { - throw new TypeError('"callback" argument must be a function'); - } - var len = arguments.length; - var args, i; - switch (len) { - case 0: - case 1: - return process.nextTick(fn); - case 2: - return process.nextTick(function afterTickOne() { - fn.call(null, arg1); - }); - case 3: - return process.nextTick(function afterTickTwo() { - fn.call(null, arg1, arg2); - }); - case 4: - return process.nextTick(function afterTickThree() { - fn.call(null, arg1, arg2, arg3); - }); - default: - args = new Array(len - 1); - i = 0; - while (i < args.length) { - args[i++] = arguments[i]; - } - return process.nextTick(function afterTick() { - fn.apply(null, args); - }); - } -} - - - -/***/ }), -/* 235 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -module.exports = __webpack_require__(15); - - -/***/ }), -/* 236 */ -/***/ ((module, exports, __webpack_require__) => { - -/* eslint-disable node/no-deprecated-api */ -var buffer = __webpack_require__(237) -var Buffer = buffer.Buffer - -// alternative to using Object.keys for old browsers -function copyProps (src, dst) { - for (var key in src) { - dst[key] = src[key] - } -} -if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) { - module.exports = buffer -} else { - // Copy properties from require('buffer') - copyProps(buffer, exports) - exports.Buffer = SafeBuffer -} - -function SafeBuffer (arg, encodingOrOffset, length) { - return Buffer(arg, encodingOrOffset, length) -} - -// Copy static methods from Buffer -copyProps(Buffer, SafeBuffer) - -SafeBuffer.from = function (arg, encodingOrOffset, length) { - if (typeof arg === 'number') { - throw new TypeError('Argument must not be a number') - } - return Buffer(arg, encodingOrOffset, length) -} - -SafeBuffer.alloc = function (size, fill, encoding) { - if (typeof size !== 'number') { - throw new TypeError('Argument must be a number') - } - var buf = Buffer(size) - if (fill !== undefined) { - if (typeof encoding === 'string') { - buf.fill(fill, encoding) - } else { - buf.fill(fill) - } - } else { - buf.fill(0) - } - return buf -} - -SafeBuffer.allocUnsafe = function (size) { - if (typeof size !== 'number') { - throw new TypeError('Argument must be a number') - } - return Buffer(size) -} - -SafeBuffer.allocUnsafeSlow = function (size) { - if (typeof size !== 'number') { - throw new TypeError('Argument must be a number') - } - return buffer.SlowBuffer(size) -} - - -/***/ }), -/* 237 */ -/***/ ((module) => { - -"use strict"; -module.exports = require("buffer"); - -/***/ }), -/* 238 */ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -// 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(arg) { - if (Array.isArray) { - return Array.isArray(arg); - } - return objectToString(arg) === '[object Array]'; -} -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 objectToString(re) === '[object RegExp]'; -} -exports.isRegExp = isRegExp; - -function isObject(arg) { - return typeof arg === 'object' && arg !== null; -} -exports.isObject = isObject; - -function isDate(d) { - return objectToString(d) === '[object Date]'; -} -exports.isDate = isDate; - -function isError(e) { - return (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 = __webpack_require__(237).Buffer.isBuffer; - -function objectToString(o) { - return Object.prototype.toString.call(o); -} - - -/***/ }), -/* 239 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var Buffer = (__webpack_require__(236).Buffer); -var util = __webpack_require__(17); - -function copyBuffer(src, target, offset) { - src.copy(target, offset); -} - -module.exports = function () { - function BufferList() { - _classCallCheck(this, BufferList); - - this.head = null; - this.tail = null; - this.length = 0; - } - - BufferList.prototype.push = function push(v) { - var entry = { data: v, next: null }; - if (this.length > 0) this.tail.next = entry;else this.head = entry; - this.tail = entry; - ++this.length; - }; - - BufferList.prototype.unshift = function unshift(v) { - var entry = { data: v, next: this.head }; - if (this.length === 0) this.tail = entry; - this.head = entry; - ++this.length; - }; - - BufferList.prototype.shift = function shift() { - if (this.length === 0) return; - var ret = this.head.data; - if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; - --this.length; - return ret; - }; - - BufferList.prototype.clear = function clear() { - this.head = this.tail = null; - this.length = 0; - }; - - BufferList.prototype.join = function join(s) { - if (this.length === 0) return ''; - var p = this.head; - var ret = '' + p.data; - while (p = p.next) { - ret += s + p.data; - }return ret; - }; - - BufferList.prototype.concat = function concat(n) { - if (this.length === 0) return Buffer.alloc(0); - var ret = Buffer.allocUnsafe(n >>> 0); - var p = this.head; - var i = 0; - while (p) { - copyBuffer(p.data, ret, i); - i += p.data.length; - p = p.next; - } - return ret; - }; - - return BufferList; -}(); - -if (util && util.inspect && util.inspect.custom) { - module.exports.prototype[util.inspect.custom] = function () { - var obj = util.inspect({ length: this.length }); - return this.constructor.name + ' ' + obj; - }; -} - -/***/ }), -/* 240 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -/**/ - -var pna = __webpack_require__(234); -/**/ - -// undocumented cb() API, needed for core, not for public API -function destroy(err, cb) { - var _this = this; - - var readableDestroyed = this._readableState && this._readableState.destroyed; - var writableDestroyed = this._writableState && this._writableState.destroyed; - - if (readableDestroyed || writableDestroyed) { - if (cb) { - cb(err); - } else if (err) { - if (!this._writableState) { - pna.nextTick(emitErrorNT, this, err); - } else if (!this._writableState.errorEmitted) { - this._writableState.errorEmitted = true; - pna.nextTick(emitErrorNT, this, err); - } - } - - return this; - } - - // we set destroyed to true before firing error callbacks in order - // to make it re-entrance safe in case destroy() is called within callbacks - - if (this._readableState) { - this._readableState.destroyed = true; - } - - // if this is a duplex stream mark the writable part as destroyed as well - if (this._writableState) { - this._writableState.destroyed = true; - } - - this._destroy(err || null, function (err) { - if (!cb && err) { - if (!_this._writableState) { - pna.nextTick(emitErrorNT, _this, err); - } else if (!_this._writableState.errorEmitted) { - _this._writableState.errorEmitted = true; - pna.nextTick(emitErrorNT, _this, err); - } - } else if (cb) { - cb(err); - } - }); - - return this; -} - -function undestroy() { - if (this._readableState) { - this._readableState.destroyed = false; - this._readableState.reading = false; - this._readableState.ended = false; - this._readableState.endEmitted = false; - } - - if (this._writableState) { - this._writableState.destroyed = false; - this._writableState.ended = false; - this._writableState.ending = false; - this._writableState.finalCalled = false; - this._writableState.prefinished = false; - this._writableState.finished = false; - this._writableState.errorEmitted = false; - } -} - -function emitErrorNT(self, err) { - self.emit('error', err); -} - -module.exports = { - destroy: destroy, - undestroy: undestroy -}; - -/***/ }), -/* 241 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// 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. - -// 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. - - - -/**/ - -var pna = __webpack_require__(234); -/**/ - -/**/ -var objectKeys = Object.keys || function (obj) { - var keys = []; - for (var key in obj) { - keys.push(key); - }return keys; -}; -/**/ - -module.exports = Duplex; - -/**/ -var util = Object.create(__webpack_require__(238)); -util.inherits = __webpack_require__(70); -/**/ - -var Readable = __webpack_require__(233); -var Writable = __webpack_require__(242); - -util.inherits(Duplex, Readable); - -{ - // avoid scope creep, the keys array can then be collected - 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); -} - -Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { - // making it explicit this property is not enumerable - // because otherwise some prototype manipulation in - // userland will fail - enumerable: false, - get: function () { - return this._writableState.highWaterMark; - } -}); - -// 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. - pna.nextTick(onEndNT, this); -} - -function onEndNT(self) { - self.end(); -} - -Object.defineProperty(Duplex.prototype, 'destroyed', { - get: function () { - if (this._readableState === undefined || this._writableState === undefined) { - return false; - } - return this._readableState.destroyed && this._writableState.destroyed; - }, - set: function (value) { - // we ignore the value if the stream - // has not been initialized yet - if (this._readableState === undefined || this._writableState === undefined) { - return; - } - - // backward compatibility, the user is explicitly - // managing destroyed - this._readableState.destroyed = value; - this._writableState.destroyed = value; - } -}); - -Duplex.prototype._destroy = function (err, cb) { - this.push(null); - this.end(); - - pna.nextTick(cb, err); -}; - -/***/ }), -/* 242 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// 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. - -// A bit simpler than readable streams. -// Implement an async ._write(chunk, encoding, cb), and it'll handle all -// the drain event emission and buffering. - - - -/**/ - -var pna = __webpack_require__(234); -/**/ - -module.exports = Writable; - -/* */ -function WriteReq(chunk, encoding, cb) { - this.chunk = chunk; - this.encoding = encoding; - this.callback = cb; - this.next = null; -} - -// It seems a linked list but it is not -// there will be only 2 of these for each stream -function CorkedRequest(state) { - var _this = this; - - this.next = null; - this.entry = null; - this.finish = function () { - onCorkedFinish(_this, state); - }; -} -/* */ - -/**/ -var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick; -/**/ - -/**/ -var Duplex; -/**/ - -Writable.WritableState = WritableState; - -/**/ -var util = Object.create(__webpack_require__(238)); -util.inherits = __webpack_require__(70); -/**/ - -/**/ -var internalUtil = { - deprecate: __webpack_require__(243) -}; -/**/ - -/**/ -var Stream = __webpack_require__(235); -/**/ - -/**/ - -var Buffer = (__webpack_require__(236).Buffer); -var OurUint8Array = (typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}).Uint8Array || function () {}; -function _uint8ArrayToBuffer(chunk) { - return Buffer.from(chunk); -} -function _isUint8Array(obj) { - return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; -} - -/**/ - -var destroyImpl = __webpack_require__(240); - -util.inherits(Writable, Stream); - -function nop() {} - -function WritableState(options, stream) { - Duplex = Duplex || __webpack_require__(241); - - options = options || {}; - - // Duplex streams are both readable and writable, but share - // the same options object. - // However, some cases require setting options to different - // values for the readable and the writable sides of the duplex stream. - // These options can be provided separately as readableXXX and writableXXX. - var isDuplex = stream instanceof Duplex; - - // object stream flag to indicate whether or not this stream - // contains buffers or objects. - this.objectMode = !!options.objectMode; - - if (isDuplex) 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 writableHwm = options.writableHighWaterMark; - var defaultHwm = this.objectMode ? 16 : 16 * 1024; - - if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm; - - // cast to ints. - this.highWaterMark = Math.floor(this.highWaterMark); - - // if _final has been called - this.finalCalled = false; - - // drain event flag. - 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; - - // has it been destroyed - this.destroyed = 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; - - // count buffered requests - this.bufferedRequestCount = 0; - - // allocate the first CorkedRequest, there is always - // one allocated and free to use, and we maintain at most two - this.corkedRequestsFree = new CorkedRequest(this); -} - -WritableState.prototype.getBuffer = function getBuffer() { - 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.', 'DEP0003') - }); - } catch (_) {} -})(); - -// Test _writableState for inheritance to account for Duplex streams, -// whose prototype chain only points to Readable. -var realHasInstance; -if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { - realHasInstance = Function.prototype[Symbol.hasInstance]; - Object.defineProperty(Writable, Symbol.hasInstance, { - value: function (object) { - if (realHasInstance.call(this, object)) return true; - if (this !== Writable) return false; - - return object && object._writableState instanceof WritableState; - } - }); -} else { - realHasInstance = function (object) { - return object instanceof this; - }; -} - -function Writable(options) { - Duplex = Duplex || __webpack_require__(241); - - // Writable ctor is applied to Duplexes, too. - // `realHasInstance` is necessary because using plain `instanceof` - // would return false, as no `_writableState` property is attached. - - // Trying to use the custom `instanceof` for Writable here will also break the - // Node.js LazyTransform implementation, which has a non-trivial getter for - // `_writableState` that would lead to infinite recursion. - if (!realHasInstance.call(Writable, this) && !(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; - - if (typeof options.destroy === 'function') this._destroy = options.destroy; - - if (typeof options.final === 'function') this._final = options.final; - } - - 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); - pna.nextTick(cb, er); -} - -// Checks that a user-supplied chunk is valid, especially for the particular -// mode the stream is in. Currently this means that `null` is never accepted -// and undefined/non-string values are only allowed in object mode. -function validChunk(stream, state, chunk, cb) { - var valid = true; - var er = false; - - if (chunk === null) { - er = new TypeError('May not write null values to stream'); - } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { - er = new TypeError('Invalid non-string/buffer chunk'); - } - if (er) { - stream.emit('error', er); - pna.nextTick(cb, er); - valid = false; - } - return valid; -} - -Writable.prototype.write = function (chunk, encoding, cb) { - var state = this._writableState; - var ret = false; - var isBuf = !state.objectMode && _isUint8Array(chunk); - - if (isBuf && !Buffer.isBuffer(chunk)) { - chunk = _uint8ArrayToBuffer(chunk); - } - - if (typeof encoding === 'function') { - cb = encoding; - encoding = null; - } - - if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; - - if (typeof cb !== 'function') cb = nop; - - if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { - state.pendingcb++; - ret = writeOrBuffer(this, state, isBuf, 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.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; - return this; -}; - -function decodeChunk(state, chunk, encoding) { - if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { - chunk = Buffer.from(chunk, encoding); - } - return chunk; -} - -Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { - // making it explicit this property is not enumerable - // because otherwise some prototype manipulation in - // userland will fail - enumerable: false, - get: function () { - return this._writableState.highWaterMark; - } -}); - -// 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, isBuf, chunk, encoding, cb) { - if (!isBuf) { - var newChunk = decodeChunk(state, chunk, encoding); - if (chunk !== newChunk) { - isBuf = true; - encoding = 'buffer'; - chunk = newChunk; - } - } - 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 = { - chunk: chunk, - encoding: encoding, - isBuf: isBuf, - callback: cb, - next: null - }; - if (last) { - last.next = state.lastBufferedRequest; - } else { - state.bufferedRequest = state.lastBufferedRequest; - } - state.bufferedRequestCount += 1; - } 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) { - // defer the callback if we are being called synchronously - // to avoid piling up things on the stack - pna.nextTick(cb, er); - // this can emit finish, and it will always happen - // after error - pna.nextTick(finishMaybe, stream, state); - stream._writableState.errorEmitted = true; - stream.emit('error', er); - } else { - // the caller expect this to happen before if - // it is async - cb(er); - stream._writableState.errorEmitted = true; - stream.emit('error', er); - // this can emit finish, but finish must - // always follow error - finishMaybe(stream, state); - } -} - -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) { - /**/ - asyncWrite(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 l = state.bufferedRequestCount; - var buffer = new Array(l); - var holder = state.corkedRequestsFree; - holder.entry = entry; - - var count = 0; - var allBuffers = true; - while (entry) { - buffer[count] = entry; - if (!entry.isBuf) allBuffers = false; - entry = entry.next; - count += 1; - } - buffer.allBuffers = allBuffers; - - doWrite(stream, state, true, state.length, buffer, '', holder.finish); - - // doWrite is almost always async, defer these to save a bit of time - // as the hot path ends with doWrite - state.pendingcb++; - state.lastBufferedRequest = null; - if (holder.next) { - state.corkedRequestsFree = holder.next; - holder.next = null; - } else { - state.corkedRequestsFree = new CorkedRequest(state); - } - state.bufferedRequestCount = 0; - } 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; - state.bufferedRequestCount--; - // 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('_write() is 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) endWritable(this, state, cb); -}; - -function needFinish(state) { - return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; -} -function callFinal(stream, state) { - stream._final(function (err) { - state.pendingcb--; - if (err) { - stream.emit('error', err); - } - state.prefinished = true; - stream.emit('prefinish'); - finishMaybe(stream, state); - }); -} -function prefinish(stream, state) { - if (!state.prefinished && !state.finalCalled) { - if (typeof stream._final === 'function') { - state.pendingcb++; - state.finalCalled = true; - pna.nextTick(callFinal, stream, state); - } else { - state.prefinished = true; - stream.emit('prefinish'); - } - } -} - -function finishMaybe(stream, state) { - var need = needFinish(state); - if (need) { - prefinish(stream, state); - if (state.pendingcb === 0) { - state.finished = true; - stream.emit('finish'); - } - } - return need; -} - -function endWritable(stream, state, cb) { - state.ending = true; - finishMaybe(stream, state); - if (cb) { - if (state.finished) pna.nextTick(cb);else stream.once('finish', cb); - } - state.ended = true; - stream.writable = false; -} - -function onCorkedFinish(corkReq, state, err) { - var entry = corkReq.entry; - corkReq.entry = null; - while (entry) { - var cb = entry.callback; - state.pendingcb--; - cb(err); - entry = entry.next; - } - - // reuse the free corkReq. - state.corkedRequestsFree.next = corkReq; -} - -Object.defineProperty(Writable.prototype, 'destroyed', { - get: function () { - if (this._writableState === undefined) { - return false; - } - return this._writableState.destroyed; - }, - set: function (value) { - // we ignore the value if the stream - // has not been initialized yet - if (!this._writableState) { - return; - } - - // backward compatibility, the user is explicitly - // managing destroyed - this._writableState.destroyed = value; - } -}); - -Writable.prototype.destroy = destroyImpl.destroy; -Writable.prototype._undestroy = destroyImpl.undestroy; -Writable.prototype._destroy = function (err, cb) { - this.end(); - cb(err); -}; - -/***/ }), -/* 243 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - - -/** - * For Node.js, simply re-export the core `util.deprecate` function. - */ - -module.exports = __webpack_require__(17).deprecate; - - -/***/ }), -/* 244 */ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; -// 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 = (__webpack_require__(236).Buffer); -/**/ - -var isEncoding = Buffer.isEncoding || function (encoding) { - encoding = '' + 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 _normalizeEncoding(enc) { - if (!enc) return 'utf8'; - var retried; - while (true) { - switch (enc) { - case 'utf8': - case 'utf-8': - return 'utf8'; - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return 'utf16le'; - case 'latin1': - case 'binary': - return 'latin1'; - case 'base64': - case 'ascii': - case 'hex': - return enc; - default: - if (retried) return; // undefined - enc = ('' + enc).toLowerCase(); - retried = true; - } - } -}; - -// Do not cache `Buffer.isEncoding` when checking encoding names as some -// modules monkey-patch it to support additional encodings -function normalizeEncoding(enc) { - var nenc = _normalizeEncoding(enc); - if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc); - return nenc || enc; -} - -// StringDecoder provides an interface for efficiently splitting a series of -// buffers into a series of JS strings without breaking apart multi-byte -// characters. -exports.StringDecoder = StringDecoder; -function StringDecoder(encoding) { - this.encoding = normalizeEncoding(encoding); - var nb; - switch (this.encoding) { - case 'utf16le': - this.text = utf16Text; - this.end = utf16End; - nb = 4; - break; - case 'utf8': - this.fillLast = utf8FillLast; - nb = 4; - break; - case 'base64': - this.text = base64Text; - this.end = base64End; - nb = 3; - break; - default: - this.write = simpleWrite; - this.end = simpleEnd; - return; - } - this.lastNeed = 0; - this.lastTotal = 0; - this.lastChar = Buffer.allocUnsafe(nb); -} - -StringDecoder.prototype.write = function (buf) { - if (buf.length === 0) return ''; - var r; - var i; - if (this.lastNeed) { - r = this.fillLast(buf); - if (r === undefined) return ''; - i = this.lastNeed; - this.lastNeed = 0; - } else { - i = 0; - } - if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i); - return r || ''; -}; - -StringDecoder.prototype.end = utf8End; - -// Returns only complete characters in a Buffer -StringDecoder.prototype.text = utf8Text; - -// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer -StringDecoder.prototype.fillLast = function (buf) { - if (this.lastNeed <= buf.length) { - buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed); - return this.lastChar.toString(this.encoding, 0, this.lastTotal); - } - buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length); - this.lastNeed -= buf.length; -}; - -// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a -// continuation byte. If an invalid byte is detected, -2 is returned. -function utf8CheckByte(byte) { - if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4; - return byte >> 6 === 0x02 ? -1 : -2; -} - -// Checks at most 3 bytes at the end of a Buffer in order to detect an -// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4) -// needed to complete the UTF-8 character (if applicable) are returned. -function utf8CheckIncomplete(self, buf, i) { - var j = buf.length - 1; - if (j < i) return 0; - var nb = utf8CheckByte(buf[j]); - if (nb >= 0) { - if (nb > 0) self.lastNeed = nb - 1; - return nb; - } - if (--j < i || nb === -2) return 0; - nb = utf8CheckByte(buf[j]); - if (nb >= 0) { - if (nb > 0) self.lastNeed = nb - 2; - return nb; - } - if (--j < i || nb === -2) return 0; - nb = utf8CheckByte(buf[j]); - if (nb >= 0) { - if (nb > 0) { - if (nb === 2) nb = 0;else self.lastNeed = nb - 3; - } - return nb; - } - return 0; -} - -// Validates as many continuation bytes for a multi-byte UTF-8 character as -// needed or are available. If we see a non-continuation byte where we expect -// one, we "replace" the validated continuation bytes we've seen so far with -// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding -// behavior. The continuation byte check is included three times in the case -// where all of the continuation bytes for a character exist in the same buffer. -// It is also done this way as a slight performance increase instead of using a -// loop. -function utf8CheckExtraBytes(self, buf, p) { - if ((buf[0] & 0xC0) !== 0x80) { - self.lastNeed = 0; - return '\ufffd'; - } - if (self.lastNeed > 1 && buf.length > 1) { - if ((buf[1] & 0xC0) !== 0x80) { - self.lastNeed = 1; - return '\ufffd'; - } - if (self.lastNeed > 2 && buf.length > 2) { - if ((buf[2] & 0xC0) !== 0x80) { - self.lastNeed = 2; - return '\ufffd'; - } - } - } -} - -// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer. -function utf8FillLast(buf) { - var p = this.lastTotal - this.lastNeed; - var r = utf8CheckExtraBytes(this, buf, p); - if (r !== undefined) return r; - if (this.lastNeed <= buf.length) { - buf.copy(this.lastChar, p, 0, this.lastNeed); - return this.lastChar.toString(this.encoding, 0, this.lastTotal); - } - buf.copy(this.lastChar, p, 0, buf.length); - this.lastNeed -= buf.length; -} - -// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a -// partial character, the character's bytes are buffered until the required -// number of bytes are available. -function utf8Text(buf, i) { - var total = utf8CheckIncomplete(this, buf, i); - if (!this.lastNeed) return buf.toString('utf8', i); - this.lastTotal = total; - var end = buf.length - (total - this.lastNeed); - buf.copy(this.lastChar, 0, end); - return buf.toString('utf8', i, end); -} - -// For UTF-8, a replacement character is added when ending on a partial -// character. -function utf8End(buf) { - var r = buf && buf.length ? this.write(buf) : ''; - if (this.lastNeed) return r + '\ufffd'; - return r; -} - -// UTF-16LE typically needs two bytes per character, but even if we have an even -// number of bytes available, we need to check if we end on a leading/high -// surrogate. In that case, we need to wait for the next two bytes in order to -// decode the last character properly. -function utf16Text(buf, i) { - if ((buf.length - i) % 2 === 0) { - var r = buf.toString('utf16le', i); - if (r) { - var c = r.charCodeAt(r.length - 1); - if (c >= 0xD800 && c <= 0xDBFF) { - this.lastNeed = 2; - this.lastTotal = 4; - this.lastChar[0] = buf[buf.length - 2]; - this.lastChar[1] = buf[buf.length - 1]; - return r.slice(0, -1); - } - } - return r; - } - this.lastNeed = 1; - this.lastTotal = 2; - this.lastChar[0] = buf[buf.length - 1]; - return buf.toString('utf16le', i, buf.length - 1); -} - -// For UTF-16LE we do not explicitly append special replacement characters if we -// end on a partial character, we simply let v8 handle that. -function utf16End(buf) { - var r = buf && buf.length ? this.write(buf) : ''; - if (this.lastNeed) { - var end = this.lastTotal - this.lastNeed; - return r + this.lastChar.toString('utf16le', 0, end); - } - return r; -} - -function base64Text(buf, i) { - var n = (buf.length - i) % 3; - if (n === 0) return buf.toString('base64', i); - this.lastNeed = 3 - n; - this.lastTotal = 3; - if (n === 1) { - this.lastChar[0] = buf[buf.length - 1]; - } else { - this.lastChar[0] = buf[buf.length - 2]; - this.lastChar[1] = buf[buf.length - 1]; - } - return buf.toString('base64', i, buf.length - n); -} - -function base64End(buf) { - var r = buf && buf.length ? this.write(buf) : ''; - if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed); - return r; -} - -// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex) -function simpleWrite(buf) { - return buf.toString(this.encoding); -} - -function simpleEnd(buf) { - return buf && buf.length ? this.write(buf) : ''; -} - -/***/ }), -/* 245 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// 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. - -// 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. - - - -module.exports = Transform; - -var Duplex = __webpack_require__(241); - -/**/ -var util = Object.create(__webpack_require__(238)); -util.inherits = __webpack_require__(70); -/**/ - -util.inherits(Transform, Duplex); - -function afterTransform(er, data) { - var ts = this._transformState; - ts.transforming = false; - - var cb = ts.writecb; - - if (!cb) { - return this.emit('error', new Error('write callback called multiple times')); - } - - ts.writechunk = null; - ts.writecb = null; - - if (data != null) // single equals check for both `null` and `undefined` - this.push(data); - - cb(er); - - var rs = this._readableState; - rs.reading = false; - if (rs.needReadable || rs.length < rs.highWaterMark) { - this._read(rs.highWaterMark); - } -} - -function Transform(options) { - if (!(this instanceof Transform)) return new Transform(options); - - Duplex.call(this, options); - - this._transformState = { - afterTransform: afterTransform.bind(this), - needTransform: false, - transforming: false, - writecb: null, - writechunk: null, - writeencoding: null - }; - - // 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; - } - - // When the writable side finishes, then flush out anything remaining. - this.on('prefinish', prefinish); -} - -function prefinish() { - var _this = this; - - if (typeof this._flush === 'function') { - this._flush(function (er, data) { - done(_this, er, data); - }); - } else { - done(this, null, null); - } -} - -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('_transform() is 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; - } -}; - -Transform.prototype._destroy = function (err, cb) { - var _this2 = this; - - Duplex.prototype._destroy.call(this, err, function (err2) { - cb(err2); - _this2.emit('close'); - }); -}; - -function done(stream, er, data) { - if (er) return stream.emit('error', er); - - if (data != null) // single equals check for both `null` and `undefined` - stream.push(data); - - // if there's nothing in the write buffer, then that means - // that nothing more will ever be provided - if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0'); - - if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming'); - - return stream.push(null); -} - -/***/ }), -/* 246 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// 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. - -// a passthrough stream. -// basically just the most minimal sort of Transform stream. -// Every written chunk gets output as-is. - - - -module.exports = PassThrough; - -var Transform = __webpack_require__(245); - -/**/ -var util = Object.create(__webpack_require__(238)); -util.inherits = __webpack_require__(70); -/**/ - -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); -}; - -/***/ }), -/* 247 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - -var path = __webpack_require__(3); -var binaryExtensions = __webpack_require__(248); -var exts = Object.create(null); - -binaryExtensions.forEach(function (el) { - exts[el] = true; -}); - -module.exports = function (filepath) { - return path.extname(filepath).slice(1).toLowerCase() in exts; -}; - - -/***/ }), -/* 248 */ -/***/ ((module) => { - -"use strict"; -module.exports = /*#__PURE__*/JSON.parse('["3dm","3ds","3g2","3gp","7z","a","aac","adp","ai","aif","aiff","alz","ape","apk","ar","arj","asf","au","avi","bak","baml","bh","bin","bk","bmp","btif","bz2","bzip2","cab","caf","cgm","class","cmx","cpio","cr2","cur","dat","dcm","deb","dex","djvu","dll","dmg","dng","doc","docm","docx","dot","dotm","dra","DS_Store","dsk","dts","dtshd","dvb","dwg","dxf","ecelp4800","ecelp7470","ecelp9600","egg","eol","eot","epub","exe","f4v","fbs","fh","fla","flac","fli","flv","fpx","fst","fvt","g3","gh","gif","graffle","gz","gzip","h261","h263","h264","icns","ico","ief","img","ipa","iso","jar","jpeg","jpg","jpgv","jpm","jxr","key","ktx","lha","lib","lvp","lz","lzh","lzma","lzo","m3u","m4a","m4v","mar","mdi","mht","mid","midi","mj2","mka","mkv","mmr","mng","mobi","mov","movie","mp3","mp4","mp4a","mpeg","mpg","mpga","mxu","nef","npx","numbers","nupkg","o","oga","ogg","ogv","otf","pages","pbm","pcx","pdb","pdf","pea","pgm","pic","png","pnm","pot","potm","potx","ppa","ppam","ppm","pps","ppsm","ppsx","ppt","pptm","pptx","psd","pya","pyc","pyo","pyv","qt","rar","ras","raw","resources","rgb","rip","rlc","rmf","rmvb","rtf","rz","s3m","s7z","scpt","sgi","shar","sil","sketch","slk","smv","snk","so","stl","suo","sub","swf","tar","tbz","tbz2","tga","tgz","thmx","tif","tiff","tlz","ttc","ttf","txz","udf","uvh","uvi","uvm","uvp","uvs","uvu","viv","vob","war","wav","wax","wbmp","wdp","weba","webm","webp","whl","wim","wm","wma","wmv","wmx","woff","woff2","wrm","wvx","xbm","xif","xla","xlam","xls","xlsb","xlsm","xlsx","xlt","xltm","xltx","xm","xmind","xpi","xpm","xwd","xz","z","zip","zipx"]'); - -/***/ }), -/* 249 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var fs = __webpack_require__(11); -var sysPath = __webpack_require__(3); -var readdirp = __webpack_require__(189); -var fsevents; -try { fsevents = __webpack_require__(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'vscode-fsevents'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); } catch (error) { - if (process.env.CHOKIDAR_PRINT_FSEVENTS_REQUIRE_ERROR) console.error(error) -} - -// fsevents instance helper functions - -// object to hold per-process fsevents instances -// (may be shared across chokidar FSWatcher instances) -var FSEventsWatchers = Object.create(null); - -// Threshold of duplicate path prefixes at which to start -// consolidating going forward -var consolidateThreshhold = 10; - -// Private function: Instantiates the fsevents interface - -// * path - string, path to be watched -// * callback - function, called when fsevents is bound and ready - -// Returns new fsevents instance -function createFSEventsInstance(path, callback) { - return (new fsevents(path)).on('fsevent', callback).start(); -} - -// Private function: Instantiates the fsevents interface or binds listeners -// to an existing one covering the same file tree - -// * path - string, path to be watched -// * realPath - string, real path (in case of symlinks) -// * listener - function, called when fsevents emits events -// * rawEmitter - function, passes data to listeners of the 'raw' event - -// Returns close function -function setFSEventsListener(path, realPath, listener, rawEmitter) { - var watchPath = sysPath.extname(path) ? sysPath.dirname(path) : path; - var watchContainer; - var parentPath = sysPath.dirname(watchPath); - - // If we've accumulated a substantial number of paths that - // could have been consolidated by watching one directory - // above the current one, create a watcher on the parent - // path instead, so that we do consolidate going forward. - if (couldConsolidate(parentPath)) { - watchPath = parentPath; - } - - var resolvedPath = sysPath.resolve(path); - var hasSymlink = resolvedPath !== realPath; - function filteredListener(fullPath, flags, info) { - if (hasSymlink) fullPath = fullPath.replace(realPath, resolvedPath); - if ( - fullPath === resolvedPath || - !fullPath.indexOf(resolvedPath + sysPath.sep) - ) listener(fullPath, flags, info); - } - - // check if there is already a watcher on a parent path - // modifies `watchPath` to the parent path when it finds a match - function watchedParent() { - return Object.keys(FSEventsWatchers).some(function(watchedPath) { - // condition is met when indexOf returns 0 - if (!realPath.indexOf(sysPath.resolve(watchedPath) + sysPath.sep)) { - watchPath = watchedPath; - return true; - } - }); - } - - if (watchPath in FSEventsWatchers || watchedParent()) { - watchContainer = FSEventsWatchers[watchPath]; - watchContainer.listeners.push(filteredListener); - } else { - watchContainer = FSEventsWatchers[watchPath] = { - listeners: [filteredListener], - rawEmitters: [rawEmitter], - watcher: createFSEventsInstance(watchPath, function(fullPath, flags) { - var info = fsevents.getInfo(fullPath, flags); - watchContainer.listeners.forEach(function(listener) { - listener(fullPath, flags, info); - }); - watchContainer.rawEmitters.forEach(function(emitter) { - emitter(info.event, fullPath, info); - }); - }) - }; - } - var listenerIndex = watchContainer.listeners.length - 1; - - // removes this instance's listeners and closes the underlying fsevents - // instance if there are no more listeners left - return function close() { - delete watchContainer.listeners[listenerIndex]; - delete watchContainer.rawEmitters[listenerIndex]; - if (!Object.keys(watchContainer.listeners).length) { - watchContainer.watcher.stop(); - delete FSEventsWatchers[watchPath]; - } - }; -} - -// Decide whether or not we should start a new higher-level -// parent watcher -function couldConsolidate(path) { - var keys = Object.keys(FSEventsWatchers); - var count = 0; - - for (var i = 0, len = keys.length; i < len; ++i) { - var watchPath = keys[i]; - if (watchPath.indexOf(path) === 0) { - count++; - if (count >= consolidateThreshhold) { - return true; - } - } - } - - return false; -} - -// returns boolean indicating whether fsevents can be used -function canUse() { - return fsevents && Object.keys(FSEventsWatchers).length < 128; -} - -// determines subdirectory traversal levels from root to path -function depth(path, root) { - var i = 0; - while (!path.indexOf(root) && (path = sysPath.dirname(path)) !== root) i++; - return i; -} - -// fake constructor for attaching fsevents-specific prototype methods that -// will be copied to FSWatcher's prototype -function FsEventsHandler() {} - -// Private method: Handle symlinks encountered during directory scan - -// * watchPath - string, file/dir path to be watched with fsevents -// * realPath - string, real path (in case of symlinks) -// * transform - function, path transformer -// * globFilter - function, path filter in case a glob pattern was provided - -// Returns close function for the watcher instance -FsEventsHandler.prototype._watchWithFsEvents = -function(watchPath, realPath, transform, globFilter) { - if (this._isIgnored(watchPath)) return; - var watchCallback = function(fullPath, flags, info) { - if ( - this.options.depth !== undefined && - depth(fullPath, realPath) > this.options.depth - ) return; - var path = transform(sysPath.join( - watchPath, sysPath.relative(watchPath, fullPath) - )); - if (globFilter && !globFilter(path)) return; - // ensure directories are tracked - var parent = sysPath.dirname(path); - var item = sysPath.basename(path); - var watchedDir = this._getWatchedDir( - info.type === 'directory' ? path : parent - ); - var checkIgnored = function(stats) { - if (this._isIgnored(path, stats)) { - this._ignoredPaths[path] = true; - if (stats && stats.isDirectory()) { - this._ignoredPaths[path + '/**/*'] = true; - } - return true; - } else { - delete this._ignoredPaths[path]; - delete this._ignoredPaths[path + '/**/*']; - } - }.bind(this); - - var handleEvent = function(event) { - if (checkIgnored()) return; - - if (event === 'unlink') { - // suppress unlink events on never before seen files - if (info.type === 'directory' || watchedDir.has(item)) { - this._remove(parent, item); - } - } else { - if (event === 'add') { - // track new directories - if (info.type === 'directory') this._getWatchedDir(path); - - if (info.type === 'symlink' && this.options.followSymlinks) { - // push symlinks back to the top of the stack to get handled - var curDepth = this.options.depth === undefined ? - undefined : depth(fullPath, realPath) + 1; - return this._addToFsEvents(path, false, true, curDepth); - } else { - // track new paths - // (other than symlinks being followed, which will be tracked soon) - this._getWatchedDir(parent).add(item); - } - } - var eventName = info.type === 'directory' ? event + 'Dir' : event; - this._emit(eventName, path); - if (eventName === 'addDir') this._addToFsEvents(path, false, true); - } - }.bind(this); - - function addOrChange() { - handleEvent(watchedDir.has(item) ? 'change' : 'add'); - } - function checkFd() { - fs.open(path, 'r', function(error, fd) { - if (error) { - error.code !== 'EACCES' ? - handleEvent('unlink') : addOrChange(); - } else { - fs.close(fd, function(err) { - err && err.code !== 'EACCES' ? - handleEvent('unlink') : addOrChange(); - }); - } - }); - } - // correct for wrong events emitted - var wrongEventFlags = [ - 69888, 70400, 71424, 72704, 73472, 131328, 131840, 262912 - ]; - if (wrongEventFlags.indexOf(flags) !== -1 || info.event === 'unknown') { - if (typeof this.options.ignored === 'function') { - fs.stat(path, function(error, stats) { - if (checkIgnored(stats)) return; - stats ? addOrChange() : handleEvent('unlink'); - }); - } else { - checkFd(); - } - } else { - switch (info.event) { - case 'created': - case 'modified': - return addOrChange(); - case 'deleted': - case 'moved': - return checkFd(); - } - } - }.bind(this); - - var closer = setFSEventsListener( - watchPath, - realPath, - watchCallback, - this.emit.bind(this, 'raw') - ); - - this._emitReady(); - return closer; -}; - -// Private method: Handle symlinks encountered during directory scan - -// * linkPath - string, path to symlink -// * fullPath - string, absolute path to the symlink -// * transform - function, pre-existing path transformer -// * curDepth - int, level of subdirectories traversed to where symlink is - -// Returns nothing -FsEventsHandler.prototype._handleFsEventsSymlink = -function(linkPath, fullPath, transform, curDepth) { - // don't follow the same symlink more than once - if (this._symlinkPaths[fullPath]) return; - else this._symlinkPaths[fullPath] = true; - - this._readyCount++; - - fs.realpath(linkPath, function(error, linkTarget) { - if (this._handleError(error) || this._isIgnored(linkTarget)) { - return this._emitReady(); - } - - this._readyCount++; - - // add the linkTarget for watching with a wrapper for transform - // that causes emitted paths to incorporate the link's path - this._addToFsEvents(linkTarget || linkPath, function(path) { - var dotSlash = '.' + sysPath.sep; - var aliasedPath = linkPath; - if (linkTarget && linkTarget !== dotSlash) { - aliasedPath = path.replace(linkTarget, linkPath); - } else if (path !== dotSlash) { - aliasedPath = sysPath.join(linkPath, path); - } - return transform(aliasedPath); - }, false, curDepth); - }.bind(this)); -}; - -// Private method: Handle added path with fsevents - -// * path - string, file/directory path or glob pattern -// * transform - function, converts working path to what the user expects -// * forceAdd - boolean, ensure add is emitted -// * priorDepth - int, level of subdirectories already traversed - -// Returns nothing -FsEventsHandler.prototype._addToFsEvents = -function(path, transform, forceAdd, priorDepth) { - - // applies transform if provided, otherwise returns same value - var processPath = typeof transform === 'function' ? - transform : function(val) { return val; }; - - var emitAdd = function(newPath, stats) { - var pp = processPath(newPath); - var isDir = stats.isDirectory(); - var dirObj = this._getWatchedDir(sysPath.dirname(pp)); - var base = sysPath.basename(pp); - - // ensure empty dirs get tracked - if (isDir) this._getWatchedDir(pp); - - if (dirObj.has(base)) return; - dirObj.add(base); - - if (!this.options.ignoreInitial || forceAdd === true) { - this._emit(isDir ? 'addDir' : 'add', pp, stats); - } - }.bind(this); - - var wh = this._getWatchHelpers(path); - - // evaluate what is at the path we're being asked to watch - fs[wh.statMethod](wh.watchPath, function(error, stats) { - if (this._handleError(error) || this._isIgnored(wh.watchPath, stats)) { - this._emitReady(); - return this._emitReady(); - } - - if (stats.isDirectory()) { - // emit addDir unless this is a glob parent - if (!wh.globFilter) emitAdd(processPath(path), stats); - - // don't recurse further if it would exceed depth setting - if (priorDepth && priorDepth > this.options.depth) return; - - // scan the contents of the dir - readdirp({ - root: wh.watchPath, - entryType: 'all', - fileFilter: wh.filterPath, - directoryFilter: wh.filterDir, - lstat: true, - depth: this.options.depth - (priorDepth || 0) - }).on('data', function(entry) { - // need to check filterPath on dirs b/c filterDir is less restrictive - if (entry.stat.isDirectory() && !wh.filterPath(entry)) return; - - var joinedPath = sysPath.join(wh.watchPath, entry.path); - var fullPath = entry.fullPath; - - if (wh.followSymlinks && entry.stat.isSymbolicLink()) { - // preserve the current depth here since it can't be derived from - // real paths past the symlink - var curDepth = this.options.depth === undefined ? - undefined : depth(joinedPath, sysPath.resolve(wh.watchPath)) + 1; - - this._handleFsEventsSymlink(joinedPath, fullPath, processPath, curDepth); - } else { - emitAdd(joinedPath, entry.stat); - } - }.bind(this)).on('error', function() { - // Ignore readdirp errors - }).on('end', this._emitReady); - } else { - emitAdd(wh.watchPath, stats); - this._emitReady(); - } - }.bind(this)); - - if (this.options.persistent && forceAdd !== true) { - var initWatch = function(error, realPath) { - if (this.closed) return; - var closer = this._watchWithFsEvents( - wh.watchPath, - sysPath.resolve(realPath || wh.watchPath), - processPath, - wh.globFilter - ); - if (closer) { - this._closers[path] = this._closers[path] || []; - this._closers[path].push(closer); - } - }.bind(this); - - if (typeof transform === 'function') { - // realpath has already been resolved - initWatch(); - } else { - fs.realpath(wh.watchPath, initWatch); - } - } -}; - -module.exports = FsEventsHandler; -module.exports.canUse = canUse; - - -/***/ }), -/* 250 */ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - -"use strict"; - -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Check = Check; -exports.Lock = Lock; -exports.Unlock = Unlock; -const lockfile = __importStar(__webpack_require__(251)); -const util_1 = __webpack_require__(254); -exports["default"] = { - Check, - Lock, - Unlock -}; -function Check(filepath, options = {}) { - return util_1.Util.promisify(lockfile.check)(filepath, options); -} -function Lock(filepath, options = {}) { - return util_1.Util.promisify(lockfile.lock)(filepath, options); -} -function Unlock(filepath) { - return util_1.Util.promisify(lockfile.unlock)(filepath); -} - - -/***/ }), -/* 251 */ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -var fs = __webpack_require__(11) - -var wx = 'wx' -if (process.version.match(/^v0\.[0-6]/)) { - var c = __webpack_require__(13) - wx = c.O_TRUNC | c.O_CREAT | c.O_WRONLY | c.O_EXCL -} - -var os = __webpack_require__(67) -exports.filetime = 'ctime' -if (os.platform() == "win32") { - exports.filetime = 'mtime' -} - -var debug -var util = __webpack_require__(17) -if (util.debuglog) - debug = util.debuglog('LOCKFILE') -else if (/\blockfile\b/i.test(process.env.NODE_DEBUG)) - debug = function() { - var msg = util.format.apply(util, arguments) - console.error('LOCKFILE %d %s', process.pid, msg) - } -else - debug = function() {} - -var locks = {} - -function hasOwnProperty (obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop) -} - -var onExit = __webpack_require__(252) -onExit(function () { - debug('exit listener') - // cleanup - Object.keys(locks).forEach(exports.unlockSync) -}) - -// XXX https://github.com/joyent/node/issues/3555 -// Remove when node 0.8 is deprecated. -if (/^v0\.[0-8]\./.test(process.version)) { - debug('uncaughtException, version = %s', process.version) - process.on('uncaughtException', function H (er) { - debug('uncaughtException') - var l = process.listeners('uncaughtException').filter(function (h) { - return h !== H - }) - if (!l.length) { - // cleanup - try { Object.keys(locks).forEach(exports.unlockSync) } catch (e) {} - process.removeListener('uncaughtException', H) - throw er - } - }) -} - -exports.unlock = function (path, cb) { - debug('unlock', path) - // best-effort. unlocking an already-unlocked lock is a noop - delete locks[path] - fs.unlink(path, function (unlinkEr) { cb && cb() }) -} - -exports.unlockSync = function (path) { - debug('unlockSync', path) - // best-effort. unlocking an already-unlocked lock is a noop - try { fs.unlinkSync(path) } catch (er) {} - delete locks[path] -} - - -// if the file can be opened in readonly mode, then it's there. -// if the error is something other than ENOENT, then it's not. -exports.check = function (path, opts, cb) { - if (typeof opts === 'function') cb = opts, opts = {} - debug('check', path, opts) - fs.open(path, 'r', function (er, fd) { - if (er) { - if (er.code !== 'ENOENT') return cb(er) - return cb(null, false) - } - - if (!opts.stale) { - return fs.close(fd, function (er) { - return cb(er, true) - }) - } - - fs.fstat(fd, function (er, st) { - if (er) return fs.close(fd, function (er2) { - return cb(er) - }) - - fs.close(fd, function (er) { - var age = Date.now() - st[exports.filetime].getTime() - return cb(er, age <= opts.stale) - }) - }) - }) -} - -exports.checkSync = function (path, opts) { - opts = opts || {} - debug('checkSync', path, opts) - if (opts.wait) { - throw new Error('opts.wait not supported sync for obvious reasons') - } - - try { - var fd = fs.openSync(path, 'r') - } catch (er) { - if (er.code !== 'ENOENT') throw er - return false - } - - if (!opts.stale) { - try { fs.closeSync(fd) } catch (er) {} - return true - } - - // file exists. however, might be stale - if (opts.stale) { - try { - var st = fs.fstatSync(fd) - } finally { - fs.closeSync(fd) - } - var age = Date.now() - st[exports.filetime].getTime() - return (age <= opts.stale) - } -} - - - -var req = 1 -exports.lock = function (path, opts, cb) { - if (typeof opts === 'function') cb = opts, opts = {} - opts.req = opts.req || req++ - debug('lock', path, opts) - opts.start = opts.start || Date.now() - - if (typeof opts.retries === 'number' && opts.retries > 0) { - debug('has retries', opts.retries) - var retries = opts.retries - opts.retries = 0 - cb = (function (orig) { return function cb (er, fd) { - debug('retry-mutated callback') - retries -= 1 - if (!er || retries < 0) return orig(er, fd) - - debug('lock retry', path, opts) - - if (opts.retryWait) setTimeout(retry, opts.retryWait) - else retry() - - function retry () { - opts.start = Date.now() - debug('retrying', opts.start) - exports.lock(path, opts, cb) - } - }})(cb) - } - - // try to engage the lock. - // if this succeeds, then we're in business. - fs.open(path, wx, function (er, fd) { - if (!er) { - debug('locked', path, fd) - locks[path] = fd - return fs.close(fd, function () { - return cb() - }) - } - - debug('failed to acquire lock', er) - - // something other than "currently locked" - // maybe eperm or something. - if (er.code !== 'EEXIST') { - debug('not EEXIST error', er) - return cb(er) - } - - // someone's got this one. see if it's valid. - if (!opts.stale) return notStale(er, path, opts, cb) - - return maybeStale(er, path, opts, false, cb) - }) - debug('lock return') -} - - -// Staleness checking algorithm -// 1. acquire $lock, fail -// 2. stat $lock, find that it is stale -// 3. acquire $lock.STALE -// 4. stat $lock, assert that it is still stale -// 5. unlink $lock -// 6. link $lock.STALE $lock -// 7. unlink $lock.STALE -// On any failure, clean up whatever we've done, and raise the error. -function maybeStale (originalEr, path, opts, hasStaleLock, cb) { - fs.stat(path, function (statEr, st) { - if (statEr) { - if (statEr.code === 'ENOENT') { - // expired already! - opts.stale = false - debug('lock stale enoent retry', path, opts) - exports.lock(path, opts, cb) - return - } - return cb(statEr) - } - - var age = Date.now() - st[exports.filetime].getTime() - if (age <= opts.stale) return notStale(originalEr, path, opts, cb) - - debug('lock stale', path, opts) - if (hasStaleLock) { - exports.unlock(path, function (er) { - if (er) return cb(er) - debug('lock stale retry', path, opts) - fs.link(path + '.STALE', path, function (er) { - fs.unlink(path + '.STALE', function () { - // best effort. if the unlink fails, oh well. - cb(er) - }) - }) - }) - } else { - debug('acquire .STALE file lock', opts) - exports.lock(path + '.STALE', opts, function (er) { - if (er) return cb(er) - maybeStale(originalEr, path, opts, true, cb) - }) - } - }) -} - -function notStale (er, path, opts, cb) { - debug('notStale', path, opts) - - // if we can't wait, then just call it a failure - if (typeof opts.wait !== 'number' || opts.wait <= 0) { - debug('notStale, wait is not a number') - return cb(er) - } - - // poll for some ms for the lock to clear - var now = Date.now() - var start = opts.start || now - var end = start + opts.wait - - if (end <= now) - return cb(er) - - debug('now=%d, wait until %d (delta=%d)', start, end, end-start) - var wait = Math.min(end - start, opts.pollPeriod || 100) - var timer = setTimeout(poll, wait) - - function poll () { - debug('notStale, polling', path, opts) - exports.lock(path, opts, cb) - } -} - -exports.lockSync = function (path, opts) { - opts = opts || {} - opts.req = opts.req || req++ - debug('lockSync', path, opts) - if (opts.wait || opts.retryWait) { - throw new Error('opts.wait not supported sync for obvious reasons') - } - - try { - var fd = fs.openSync(path, wx) - locks[path] = fd - try { fs.closeSync(fd) } catch (er) {} - debug('locked sync!', path, fd) - return - } catch (er) { - if (er.code !== 'EEXIST') return retryThrow(path, opts, er) - - if (opts.stale) { - var st = fs.statSync(path) - var ct = st[exports.filetime].getTime() - if (!(ct % 1000) && (opts.stale % 1000)) { - // probably don't have subsecond resolution. - // round up the staleness indicator. - // Yes, this will be wrong 1/1000 times on platforms - // with subsecond stat precision, but that's acceptable - // in exchange for not mistakenly removing locks on - // most other systems. - opts.stale = 1000 * Math.ceil(opts.stale / 1000) - } - var age = Date.now() - ct - if (age > opts.stale) { - debug('lockSync stale', path, opts, age) - exports.unlockSync(path) - return exports.lockSync(path, opts) - } - } - - // failed to lock! - debug('failed to lock', path, opts, er) - return retryThrow(path, opts, er) - } -} - -function retryThrow (path, opts, er) { - if (typeof opts.retries === 'number' && opts.retries > 0) { - var newRT = opts.retries - 1 - debug('retryThrow', path, opts, newRT) - opts.retries = newRT - return exports.lockSync(path, opts) - } - throw er -} - - - -/***/ }), -/* 252 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -// Note: since nyc uses this module to output coverage, any lines -// that are in the direct sync flow of nyc's outputCoverage are -// ignored, since we can never get coverage for them. -// grab a reference to node's real process object right away -var process = global.process - -const processOk = function (process) { - return process && - typeof process === 'object' && - typeof process.removeListener === 'function' && - typeof process.emit === 'function' && - typeof process.reallyExit === 'function' && - typeof process.listeners === 'function' && - typeof process.kill === 'function' && - typeof process.pid === 'number' && - typeof process.on === 'function' -} - -// some kind of non-node environment, just no-op -/* istanbul ignore if */ -if (!processOk(process)) { - module.exports = function () { - return function () {} - } -} else { - var assert = __webpack_require__(18) - var signals = __webpack_require__(253) - var isWin = /^win/i.test(process.platform) - - var EE = __webpack_require__(53) - /* istanbul ignore if */ - if (typeof EE !== 'function') { - EE = EE.EventEmitter - } - - var emitter - if (process.__signal_exit_emitter__) { - emitter = process.__signal_exit_emitter__ - } else { - emitter = process.__signal_exit_emitter__ = new EE() - emitter.count = 0 - emitter.emitted = {} - } - - // Because this emitter is a global, we have to check to see if a - // previous version of this library failed to enable infinite listeners. - // I know what you're about to say. But literally everything about - // signal-exit is a compromise with evil. Get used to it. - if (!emitter.infinite) { - emitter.setMaxListeners(Infinity) - emitter.infinite = true - } - - module.exports = function (cb, opts) { - /* istanbul ignore if */ - if (!processOk(global.process)) { - return function () {} - } - assert.equal(typeof cb, 'function', 'a callback must be provided for exit handler') - - if (loaded === false) { - load() - } - - var ev = 'exit' - if (opts && opts.alwaysLast) { - ev = 'afterexit' - } - - var remove = function () { - emitter.removeListener(ev, cb) - if (emitter.listeners('exit').length === 0 && - emitter.listeners('afterexit').length === 0) { - unload() - } - } - emitter.on(ev, cb) - - return remove - } - - var unload = function unload () { - if (!loaded || !processOk(global.process)) { - return - } - loaded = false - - signals.forEach(function (sig) { - try { - process.removeListener(sig, sigListeners[sig]) - } catch (er) {} - }) - process.emit = originalProcessEmit - process.reallyExit = originalProcessReallyExit - emitter.count -= 1 - } - module.exports.unload = unload - - var emit = function emit (event, code, signal) { - /* istanbul ignore if */ - if (emitter.emitted[event]) { - return - } - emitter.emitted[event] = true - emitter.emit(event, code, signal) - } - - // { : , ... } - var sigListeners = {} - signals.forEach(function (sig) { - sigListeners[sig] = function listener () { - /* istanbul ignore if */ - if (!processOk(global.process)) { - return - } - // If there are no other listeners, an exit is coming! - // Simplest way: remove us and then re-send the signal. - // We know that this will kill the process, so we can - // safely emit now. - var listeners = process.listeners(sig) - if (listeners.length === emitter.count) { - unload() - emit('exit', null, sig) - /* istanbul ignore next */ - emit('afterexit', null, sig) - /* istanbul ignore next */ - if (isWin && sig === 'SIGHUP') { - // "SIGHUP" throws an `ENOSYS` error on Windows, - // so use a supported signal instead - sig = 'SIGINT' - } - /* istanbul ignore next */ - process.kill(process.pid, sig) - } - } - }) - - module.exports.signals = function () { - return signals - } - - var loaded = false - - var load = function load () { - if (loaded || !processOk(global.process)) { - return - } - loaded = true - - // This is the number of onSignalExit's that are in play. - // It's important so that we can count the correct number of - // listeners on signals, and don't wait for the other one to - // handle it instead of us. - emitter.count += 1 - - signals = signals.filter(function (sig) { - try { - process.on(sig, sigListeners[sig]) - return true - } catch (er) { - return false - } - }) - - process.emit = processEmit - process.reallyExit = processReallyExit - } - module.exports.load = load - - var originalProcessReallyExit = process.reallyExit - var processReallyExit = function processReallyExit (code) { - /* istanbul ignore if */ - if (!processOk(global.process)) { - return - } - process.exitCode = code || /* istanbul ignore next */ 0 - emit('exit', process.exitCode, null) - /* istanbul ignore next */ - emit('afterexit', process.exitCode, null) - /* istanbul ignore next */ - originalProcessReallyExit.call(process, process.exitCode) - } - - var originalProcessEmit = process.emit - var processEmit = function processEmit (ev, arg) { - if (ev === 'exit' && processOk(global.process)) { - /* istanbul ignore else */ - if (arg !== undefined) { - process.exitCode = arg - } - var ret = originalProcessEmit.apply(this, arguments) - /* istanbul ignore next */ - emit('exit', process.exitCode, null) - /* istanbul ignore next */ - emit('afterexit', process.exitCode, null) - /* istanbul ignore next */ - return ret - } else { - return originalProcessEmit.apply(this, arguments) - } - } -} - - -/***/ }), -/* 253 */ -/***/ ((module) => { - -// This is not the set of all possible signals. -// -// It IS, however, the set of all signals that trigger -// an exit on either Linux or BSD systems. Linux is a -// superset of the signal names supported on BSD, and -// the unknown signals just fail to register, so we can -// catch that easily enough. -// -// Don't bother with SIGKILL. It's uncatchable, which -// means that we can't fire any callbacks anyway. -// -// If a user does happen to register a handler on a non- -// fatal signal like SIGWINCH or something, and then -// exit, it'll end up firing `process.emit('exit')`, so -// the handler will be fired anyway. -// -// SIGBUS, SIGFPE, SIGSEGV and SIGILL, when not raised -// artificially, inherently leave the process in a -// state from which it is not safe to try and enter JS -// listeners. -module.exports = [ - 'SIGABRT', - 'SIGALRM', - 'SIGHUP', - 'SIGINT', - 'SIGTERM' -] - -if (process.platform !== 'win32') { - module.exports.push( - 'SIGVTALRM', - 'SIGXCPU', - 'SIGXFSZ', - 'SIGUSR2', - 'SIGTRAP', - 'SIGSYS', - 'SIGQUIT', - 'SIGIOT' - // should detect profiler and enable/disable accordingly. - // see #21 - // 'SIGPROF' - ) -} - -if (process.platform === 'linux') { - module.exports.push( - 'SIGIO', - 'SIGPOLL', - 'SIGPWR', - 'SIGSTKFLT', - 'SIGUNUSED' - ) -} - - -/***/ }), -/* 254 */ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Util = void 0; -class Util { - static async Sleep(ms) { - return new Promise(resolve => { - setTimeout(() => { - resolve(ms); - }, ms); - }); - } - /** - * promisify the function - * it will be remove when vscode use node@^8.0 - * @param fn - */ - static promisify(fn) { - return function (...argv) { - return new Promise((resolve, reject) => { - fn.call(this, ...argv, (err, data) => { - if (err) { - reject(err); - } - else { - resolve(data); - } - }); - }); - }; - } -} -exports.Util = Util; - - -/***/ }), -/* 255 */ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - -"use strict"; - -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.FileService = exports.File = void 0; -const fs = __importStar(__webpack_require__(7)); -const path = __importStar(__webpack_require__(3)); -const recursiveRead = __importStar(__webpack_require__(256)); -class File { - fileName; - content; - filePath; - gistName; - constructor(fileName, content, filePath, gistName) { - this.fileName = fileName; - this.content = content; - this.filePath = filePath; - this.gistName = gistName; - } -} -exports.File = File; -class FileService { - static CUSTOMIZED_SYNC_PREFIX = "|customized_sync|"; - static async ReadFile(filePath) { - try { - const data = await fs.readFile(filePath, { encoding: "utf8" }); - return data; - } - catch (err) { - console.error(err); - throw err; - } - } - static async IsDirectory(filepath) { - try { - const stat = await fs.lstat(filepath); - return stat.isDirectory(); - } - catch (err) { - return false; - } - } - static async GetFile(filePath, fileName) { - const fileExists = await FileService.FileExists(filePath); - if (!fileExists) { - return null; - } - const content = await FileService.ReadFile(filePath); - if (content === null) { - return null; - } - const pathFromUser = filePath.substring(filePath.lastIndexOf("User") + 5, filePath.length); - const arr = pathFromUser.indexOf("/") - ? pathFromUser.split("/") - : pathFromUser.split(path.sep); - let gistName = ""; - arr.forEach((element, index) => { - if (index < arr.length - 1) { - gistName += element + "|"; - } - else { - gistName += element; - } - }); - const file = new File(fileName, content, filePath, gistName); - return file; - } - static async WriteFile(filePath, data) { - if (!data) { - console.error(new Error("Unable to write file. FilePath :" + filePath + " Data :" + data)); - return false; - } - try { - await fs.writeFile(filePath, data); - return true; - } - catch (err) { - console.error(err); - return false; - } - } - static async ListFiles(directory, customSettings) { - function folderMatcher(file, stats) { - if (stats.isDirectory()) { - return customSettings.ignoreUploadFolders.some(fold => { - return file.split(path.sep).includes(fold); - }); - } - return false; - } - function fileExtensionMatcher(file, stats) { - if (stats.isDirectory()) { - return false; - } - const ext = path.extname(file).slice(1); - if (!customSettings.supportedFileExtensions.includes(ext)) { - return true; - } - return false; - } - const files = await recursiveRead(directory, [ - ...customSettings.ignoreUploadFiles, - folderMatcher, - fileExtensionMatcher - ]); - return Promise.all(files.map(file => { - return FileService.GetFile(file, path.basename(file)); - })); - } - static async CreateDirTree(userFolder, fileName) { - let fullPath = userFolder; - let result; - let paths = null; - if (fileName.indexOf("|") > -1) { - paths = fileName.split("|"); - } - else if (fileName.indexOf("//") > -1) { - paths = fileName.split("//"); - } - else if (fileName.indexOf("\\") > -1) { - paths = fileName.split("\\"); - } - if (paths != null) { - for (let i = 0; i < paths.length - 1; i++) { - const element = paths[i]; - fullPath += element + path.sep; - await FileService.CreateDirectory(fullPath); - } - result = fullPath + paths[paths.length - 1]; - return result; - } - else { - result = fullPath + fileName; - return result; - } - } - static async DeleteFile(filePath) { - try { - const stat = await FileService.FileExists(filePath); - if (stat) { - await fs.unlink(filePath); - } - return true; - } - catch (err) { - console.error("Unable to delete file. File Path is :" + filePath); - return false; - } - } - static async FileExists(filePath) { - try { - await fs.access(filePath, fs.constants.F_OK); - return true; - } - catch (err) { - return false; - } - } - static async CreateDirectory(name) { - try { - await fs.mkdir(name); - return true; - } - catch (err) { - if (err.code === "EEXIST") { - return false; - } - throw err; - } - } - static async GetCustomFile(filePath, fileName) { - const fileExists = await FileService.FileExists(filePath); - if (!fileExists) { - return null; - } - const content = await FileService.ReadFile(filePath); - if (content === null) { - return null; - } - // for identifing Customized Sync file - const gistName = FileService.CUSTOMIZED_SYNC_PREFIX + fileName; - const file = new File(fileName, content, filePath, gistName); - return file; - } - static async CreateCustomDirTree(filePath) { - const dir = path.dirname(filePath); - const fileExists = await FileService.FileExists(dir); - if (!fileExists) { - // mkdir recursively - await fs.mkdirs(dir); - } - return filePath; - } - static ExtractFileName(fullPath) { - return path.basename(fullPath); - } - static ConcatPath(...filePaths) { - return filePaths.join(path.sep); - } -} -exports.FileService = FileService; - - -/***/ }), -/* 256 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var fs = __webpack_require__(11); -var p = __webpack_require__(3); -var minimatch = __webpack_require__(257); - -function patternMatcher(pattern) { - return function(path, stats) { - var minimatcher = new minimatch.Minimatch(pattern, { matchBase: true }); - return (!minimatcher.negate || stats.isFile()) && minimatcher.match(path); - }; -} - -function toMatcherFunction(ignoreEntry) { - if (typeof ignoreEntry == "function") { - return ignoreEntry; - } else { - return patternMatcher(ignoreEntry); - } -} - -function readdir(path, ignores, callback) { - if (typeof ignores == "function") { - callback = ignores; - ignores = []; - } - - if (!callback) { - return new Promise(function(resolve, reject) { - readdir(path, ignores || [], function(err, data) { - if (err) { - reject(err); - } else { - resolve(data); - } - }); - }); - } - - ignores = ignores.map(toMatcherFunction); - - var list = []; - - fs.readdir(path, function(err, files) { - if (err) { - return callback(err); - } - - var pending = files.length; - if (!pending) { - // we are done, woop woop - return callback(null, list); - } - - files.forEach(function(file) { - var filePath = p.join(path, file); - fs.stat(filePath, function(_err, stats) { - if (_err) { - return callback(_err); - } - - if ( - ignores.some(function(matcher) { - return matcher(filePath, stats); - }) - ) { - pending -= 1; - if (!pending) { - return callback(null, list); - } - return null; - } - - if (stats.isDirectory()) { - readdir(filePath, ignores, function(__err, res) { - if (__err) { - return callback(__err); - } - - list = list.concat(res); - pending -= 1; - if (!pending) { - return callback(null, list); - } - }); - } else { - list.push(filePath); - pending -= 1; - if (!pending) { - return callback(null, list); - } - } - }); - }); - }); -} - -module.exports = readdir; - - -/***/ }), -/* 257 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -module.exports = minimatch -minimatch.Minimatch = Minimatch - -var path = (function () { try { return __webpack_require__(3) } catch (e) {}}()) || { - sep: '/' -} -minimatch.sep = path.sep - -var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {} -var expand = __webpack_require__(258) - -var plTypes = { - '!': { open: '(?:(?!(?:', close: '))[^/]*?)'}, - '?': { open: '(?:', close: ')?' }, - '+': { open: '(?:', close: ')+' }, - '*': { open: '(?:', close: ')*' }, - '@': { open: '(?:', close: ')' } -} - -// any single thing other than / -// don't need to escape / when using new RegExp() -var qmark = '[^/]' - -// * => any number of characters -var star = qmark + '*?' - -// ** when dots are allowed. Anything goes, except .. and . -// not (^ or / followed by one or two dots followed by $ or /), -// followed by anything, any number of times. -var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?' - -// not a ^ or / followed by a dot, -// followed by anything, any number of times. -var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?' - -// characters that need to be escaped in RegExp. -var reSpecials = charSet('().*{}+?[]^$\\!') - -// "abc" -> { a:true, b:true, c:true } -function charSet (s) { - return s.split('').reduce(function (set, c) { - set[c] = true - return set - }, {}) -} - -// normalizes slashes. -var slashSplit = /\/+/ - -minimatch.filter = filter -function filter (pattern, options) { - options = options || {} - return function (p, i, list) { - return minimatch(p, pattern, options) - } -} - -function ext (a, b) { - b = b || {} - var t = {} - Object.keys(a).forEach(function (k) { - t[k] = a[k] - }) - Object.keys(b).forEach(function (k) { - t[k] = b[k] - }) - return t -} - -minimatch.defaults = function (def) { - if (!def || typeof def !== 'object' || !Object.keys(def).length) { - return minimatch - } - - var orig = minimatch - - var m = function minimatch (p, pattern, options) { - return orig(p, pattern, ext(def, options)) - } - - m.Minimatch = function Minimatch (pattern, options) { - return new orig.Minimatch(pattern, ext(def, options)) - } - m.Minimatch.defaults = function defaults (options) { - return orig.defaults(ext(def, options)).Minimatch - } - - m.filter = function filter (pattern, options) { - return orig.filter(pattern, ext(def, options)) - } - - m.defaults = function defaults (options) { - return orig.defaults(ext(def, options)) - } - - m.makeRe = function makeRe (pattern, options) { - return orig.makeRe(pattern, ext(def, options)) - } - - m.braceExpand = function braceExpand (pattern, options) { - return orig.braceExpand(pattern, ext(def, options)) - } - - m.match = function (list, pattern, options) { - return orig.match(list, pattern, ext(def, options)) - } - - return m -} - -Minimatch.defaults = function (def) { - return minimatch.defaults(def).Minimatch -} - -function minimatch (p, pattern, options) { - assertValidPattern(pattern) - - if (!options) options = {} - - // shortcut: comments match nothing. - if (!options.nocomment && pattern.charAt(0) === '#') { - return false - } - - return new Minimatch(pattern, options).match(p) -} - -function Minimatch (pattern, options) { - if (!(this instanceof Minimatch)) { - return new Minimatch(pattern, options) - } - - assertValidPattern(pattern) - - if (!options) options = {} - - pattern = pattern.trim() - - // windows support: need to use /, not \ - if (!options.allowWindowsEscape && path.sep !== '/') { - pattern = pattern.split(path.sep).join('/') - } - - this.options = options - this.set = [] - this.pattern = pattern - this.regexp = null - this.negate = false - this.comment = false - this.empty = false - this.partial = !!options.partial - - // make the set of regexps etc. - this.make() -} - -Minimatch.prototype.debug = function () {} - -Minimatch.prototype.make = make -function make () { - var pattern = this.pattern - var options = this.options - - // empty patterns and comments match nothing. - if (!options.nocomment && pattern.charAt(0) === '#') { - this.comment = true - return - } - if (!pattern) { - this.empty = true - return - } - - // step 1: figure out negation, etc. - this.parseNegate() - - // step 2: expand braces - var set = this.globSet = this.braceExpand() - - if (options.debug) this.debug = function debug() { console.error.apply(console, arguments) } - - this.debug(this.pattern, set) - - // step 3: now we have a set, so turn each one into a series of path-portion - // matching patterns. - // These will be regexps, except in the case of "**", which is - // set to the GLOBSTAR object for globstar behavior, - // and will not contain any / characters - set = this.globParts = set.map(function (s) { - return s.split(slashSplit) - }) - - this.debug(this.pattern, set) - - // glob --> regexps - set = set.map(function (s, si, set) { - return s.map(this.parse, this) - }, this) - - this.debug(this.pattern, set) - - // filter out everything that didn't compile properly. - set = set.filter(function (s) { - return s.indexOf(false) === -1 - }) - - this.debug(this.pattern, set) - - this.set = set -} - -Minimatch.prototype.parseNegate = parseNegate -function parseNegate () { - var pattern = this.pattern - var negate = false - var options = this.options - var negateOffset = 0 - - if (options.nonegate) return - - for (var i = 0, l = pattern.length - ; i < l && pattern.charAt(i) === '!' - ; i++) { - negate = !negate - negateOffset++ - } - - if (negateOffset) this.pattern = pattern.substr(negateOffset) - this.negate = negate -} - -// Brace expansion: -// a{b,c}d -> abd acd -// a{b,}c -> abc ac -// a{0..3}d -> a0d a1d a2d a3d -// a{b,c{d,e}f}g -> abg acdfg acefg -// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg -// -// Invalid sets are not expanded. -// a{2..}b -> a{2..}b -// a{b}c -> a{b}c -minimatch.braceExpand = function (pattern, options) { - return braceExpand(pattern, options) -} - -Minimatch.prototype.braceExpand = braceExpand - -function braceExpand (pattern, options) { - if (!options) { - if (this instanceof Minimatch) { - options = this.options - } else { - options = {} - } - } - - pattern = typeof pattern === 'undefined' - ? this.pattern : pattern - - assertValidPattern(pattern) - - // Thanks to Yeting Li for - // improving this regexp to avoid a ReDOS vulnerability. - if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) { - // shortcut. no need to expand. - return [pattern] - } - - return expand(pattern) -} - -var MAX_PATTERN_LENGTH = 1024 * 64 -var assertValidPattern = function (pattern) { - if (typeof pattern !== 'string') { - throw new TypeError('invalid pattern') - } - - if (pattern.length > MAX_PATTERN_LENGTH) { - throw new TypeError('pattern is too long') - } -} - -// parse a component of the expanded set. -// At this point, no pattern may contain "/" in it -// so we're going to return a 2d array, where each entry is the full -// pattern, split on '/', and then turned into a regular expression. -// A regexp is made at the end which joins each array with an -// escaped /, and another full one which joins each regexp with |. -// -// Following the lead of Bash 4.1, note that "**" only has special meaning -// when it is the *only* thing in a path portion. Otherwise, any series -// of * is equivalent to a single *. Globstar behavior is enabled by -// default, and can be disabled by setting options.noglobstar. -Minimatch.prototype.parse = parse -var SUBPARSE = {} -function parse (pattern, isSub) { - assertValidPattern(pattern) - - var options = this.options - - // shortcuts - if (pattern === '**') { - if (!options.noglobstar) - return GLOBSTAR - else - pattern = '*' - } - if (pattern === '') return '' - - var re = '' - var hasMagic = !!options.nocase - var escaping = false - // ? => one single character - var patternListStack = [] - var negativeLists = [] - var stateChar - var inClass = false - var reClassStart = -1 - var classStart = -1 - // . and .. never match anything that doesn't start with ., - // even when options.dot is set. - var patternStart = pattern.charAt(0) === '.' ? '' // anything - // not (start or / followed by . or .. followed by / or end) - : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))' - : '(?!\\.)' - var self = this - - function clearStateChar () { - if (stateChar) { - // we had some state-tracking character - // that wasn't consumed by this pass. - switch (stateChar) { - case '*': - re += star - hasMagic = true - break - case '?': - re += qmark - hasMagic = true - break - default: - re += '\\' + stateChar - break - } - self.debug('clearStateChar %j %j', stateChar, re) - stateChar = false - } - } - - for (var i = 0, len = pattern.length, c - ; (i < len) && (c = pattern.charAt(i)) - ; i++) { - this.debug('%s\t%s %s %j', pattern, i, re, c) - - // skip over any that are escaped. - if (escaping && reSpecials[c]) { - re += '\\' + c - escaping = false - continue - } - - switch (c) { - /* istanbul ignore next */ - case '/': { - // completely not allowed, even escaped. - // Should already be path-split by now. - return false - } - - case '\\': - clearStateChar() - escaping = true - continue - - // the various stateChar values - // for the "extglob" stuff. - case '?': - case '*': - case '+': - case '@': - case '!': - this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c) - - // all of those are literals inside a class, except that - // the glob [!a] means [^a] in regexp - if (inClass) { - this.debug(' in class') - if (c === '!' && i === classStart + 1) c = '^' - re += c - continue - } - - // if we already have a stateChar, then it means - // that there was something like ** or +? in there. - // Handle the stateChar, then proceed with this one. - self.debug('call clearStateChar %j', stateChar) - clearStateChar() - stateChar = c - // if extglob is disabled, then +(asdf|foo) isn't a thing. - // just clear the statechar *now*, rather than even diving into - // the patternList stuff. - if (options.noext) clearStateChar() - continue - - case '(': - if (inClass) { - re += '(' - continue - } - - if (!stateChar) { - re += '\\(' - continue - } - - patternListStack.push({ - type: stateChar, - start: i - 1, - reStart: re.length, - open: plTypes[stateChar].open, - close: plTypes[stateChar].close - }) - // negation is (?:(?!js)[^/]*) - re += stateChar === '!' ? '(?:(?!(?:' : '(?:' - this.debug('plType %j %j', stateChar, re) - stateChar = false - continue - - case ')': - if (inClass || !patternListStack.length) { - re += '\\)' - continue - } - - clearStateChar() - hasMagic = true - var pl = patternListStack.pop() - // negation is (?:(?!js)[^/]*) - // The others are (?:) - re += pl.close - if (pl.type === '!') { - negativeLists.push(pl) - } - pl.reEnd = re.length - continue - - case '|': - if (inClass || !patternListStack.length || escaping) { - re += '\\|' - escaping = false - continue - } - - clearStateChar() - re += '|' - continue - - // these are mostly the same in regexp and glob - case '[': - // swallow any state-tracking char before the [ - clearStateChar() - - if (inClass) { - re += '\\' + c - continue - } - - inClass = true - classStart = i - reClassStart = re.length - re += c - continue - - case ']': - // a right bracket shall lose its special - // meaning and represent itself in - // a bracket expression if it occurs - // first in the list. -- POSIX.2 2.8.3.2 - if (i === classStart + 1 || !inClass) { - re += '\\' + c - escaping = false - continue - } - - // handle the case where we left a class open. - // "[z-a]" is valid, equivalent to "\[z-a\]" - // split where the last [ was, make sure we don't have - // an invalid re. if so, re-walk the contents of the - // would-be class to re-translate any characters that - // were passed through as-is - // TODO: It would probably be faster to determine this - // without a try/catch and a new RegExp, but it's tricky - // to do safely. For now, this is safe and works. - var cs = pattern.substring(classStart + 1, i) - try { - RegExp('[' + cs + ']') - } catch (er) { - // not a valid class! - var sp = this.parse(cs, SUBPARSE) - re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]' - hasMagic = hasMagic || sp[1] - inClass = false - continue - } - - // finish up the class. - hasMagic = true - inClass = false - re += c - continue - - default: - // swallow any state char that wasn't consumed - clearStateChar() - - if (escaping) { - // no need - escaping = false - } else if (reSpecials[c] - && !(c === '^' && inClass)) { - re += '\\' - } - - re += c - - } // switch - } // for - - // handle the case where we left a class open. - // "[abc" is valid, equivalent to "\[abc" - if (inClass) { - // split where the last [ was, and escape it - // this is a huge pita. We now have to re-walk - // the contents of the would-be class to re-translate - // any characters that were passed through as-is - cs = pattern.substr(classStart + 1) - sp = this.parse(cs, SUBPARSE) - re = re.substr(0, reClassStart) + '\\[' + sp[0] - hasMagic = hasMagic || sp[1] - } - - // handle the case where we had a +( thing at the *end* - // of the pattern. - // each pattern list stack adds 3 chars, and we need to go through - // and escape any | chars that were passed through as-is for the regexp. - // Go through and escape them, taking care not to double-escape any - // | chars that were already escaped. - for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) { - var tail = re.slice(pl.reStart + pl.open.length) - this.debug('setting tail', re, pl) - // maybe some even number of \, then maybe 1 \, followed by a | - tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) { - if (!$2) { - // the | isn't already escaped, so escape it. - $2 = '\\' - } - - // need to escape all those slashes *again*, without escaping the - // one that we need for escaping the | character. As it works out, - // escaping an even number of slashes can be done by simply repeating - // it exactly after itself. That's why this trick works. - // - // I am sorry that you have to see this. - return $1 + $1 + $2 + '|' - }) - - this.debug('tail=%j\n %s', tail, tail, pl, re) - var t = pl.type === '*' ? star - : pl.type === '?' ? qmark - : '\\' + pl.type - - hasMagic = true - re = re.slice(0, pl.reStart) + t + '\\(' + tail - } - - // handle trailing things that only matter at the very end. - clearStateChar() - if (escaping) { - // trailing \\ - re += '\\\\' - } - - // only need to apply the nodot start if the re starts with - // something that could conceivably capture a dot - var addPatternStart = false - switch (re.charAt(0)) { - case '[': case '.': case '(': addPatternStart = true - } - - // Hack to work around lack of negative lookbehind in JS - // A pattern like: *.!(x).!(y|z) needs to ensure that a name - // like 'a.xyz.yz' doesn't match. So, the first negative - // lookahead, has to look ALL the way ahead, to the end of - // the pattern. - for (var n = negativeLists.length - 1; n > -1; n--) { - var nl = negativeLists[n] - - var nlBefore = re.slice(0, nl.reStart) - var nlFirst = re.slice(nl.reStart, nl.reEnd - 8) - var nlLast = re.slice(nl.reEnd - 8, nl.reEnd) - var nlAfter = re.slice(nl.reEnd) - - nlLast += nlAfter - - // Handle nested stuff like *(*.js|!(*.json)), where open parens - // mean that we should *not* include the ) in the bit that is considered - // "after" the negated section. - var openParensBefore = nlBefore.split('(').length - 1 - var cleanAfter = nlAfter - for (i = 0; i < openParensBefore; i++) { - cleanAfter = cleanAfter.replace(/\)[+*?]?/, '') - } - nlAfter = cleanAfter - - var dollar = '' - if (nlAfter === '' && isSub !== SUBPARSE) { - dollar = '$' - } - var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast - re = newRe - } - - // if the re is not "" at this point, then we need to make sure - // it doesn't match against an empty path part. - // Otherwise a/* will match a/, which it should not. - if (re !== '' && hasMagic) { - re = '(?=.)' + re - } - - if (addPatternStart) { - re = patternStart + re - } - - // parsing just a piece of a larger pattern. - if (isSub === SUBPARSE) { - return [re, hasMagic] - } - - // skip the regexp for non-magical patterns - // unescape anything in it, though, so that it'll be - // an exact match against a file etc. - if (!hasMagic) { - return globUnescape(pattern) - } - - var flags = options.nocase ? 'i' : '' - try { - var regExp = new RegExp('^' + re + '$', flags) - } catch (er) /* istanbul ignore next - should be impossible */ { - // If it was an invalid regular expression, then it can't match - // anything. This trick looks for a character after the end of - // the string, which is of course impossible, except in multi-line - // mode, but it's not a /m regex. - return new RegExp('$.') - } - - regExp._glob = pattern - regExp._src = re - - return regExp -} - -minimatch.makeRe = function (pattern, options) { - return new Minimatch(pattern, options || {}).makeRe() -} - -Minimatch.prototype.makeRe = makeRe -function makeRe () { - if (this.regexp || this.regexp === false) return this.regexp - - // at this point, this.set is a 2d array of partial - // pattern strings, or "**". - // - // It's better to use .match(). This function shouldn't - // be used, really, but it's pretty convenient sometimes, - // when you just want to work with a regex. - var set = this.set - - if (!set.length) { - this.regexp = false - return this.regexp - } - var options = this.options - - var twoStar = options.noglobstar ? star - : options.dot ? twoStarDot - : twoStarNoDot - var flags = options.nocase ? 'i' : '' - - var re = set.map(function (pattern) { - return pattern.map(function (p) { - return (p === GLOBSTAR) ? twoStar - : (typeof p === 'string') ? regExpEscape(p) - : p._src - }).join('\\\/') - }).join('|') - - // must match entire pattern - // ending in a * or ** will make it less strict. - re = '^(?:' + re + ')$' - - // can match anything, as long as it's not this. - if (this.negate) re = '^(?!' + re + ').*$' - - try { - this.regexp = new RegExp(re, flags) - } catch (ex) /* istanbul ignore next - should be impossible */ { - this.regexp = false - } - return this.regexp -} - -minimatch.match = function (list, pattern, options) { - options = options || {} - var mm = new Minimatch(pattern, options) - list = list.filter(function (f) { - return mm.match(f) - }) - if (mm.options.nonull && !list.length) { - list.push(pattern) - } - return list -} - -Minimatch.prototype.match = function match (f, partial) { - if (typeof partial === 'undefined') partial = this.partial - this.debug('match', f, this.pattern) - // short-circuit in the case of busted things. - // comments, etc. - if (this.comment) return false - if (this.empty) return f === '' - - if (f === '/' && partial) return true - - var options = this.options - - // windows: need to use /, not \ - if (path.sep !== '/') { - f = f.split(path.sep).join('/') - } - - // treat the test path as a set of pathparts. - f = f.split(slashSplit) - this.debug(this.pattern, 'split', f) - - // just ONE of the pattern sets in this.set needs to match - // in order for it to be valid. If negating, then just one - // match means that we have failed. - // Either way, return on the first hit. - - var set = this.set - this.debug(this.pattern, 'set', set) - - // Find the basename of the path by looking for the last non-empty segment - var filename - var i - for (i = f.length - 1; i >= 0; i--) { - filename = f[i] - if (filename) break - } - - for (i = 0; i < set.length; i++) { - var pattern = set[i] - var file = f - if (options.matchBase && pattern.length === 1) { - file = [filename] - } - var hit = this.matchOne(file, pattern, partial) - if (hit) { - if (options.flipNegate) return true - return !this.negate - } - } - - // didn't get any hits. this is success if it's a negative - // pattern, failure otherwise. - if (options.flipNegate) return false - return this.negate -} - -// set partial to true to test if, for example, -// "/a/b" matches the start of "/*/b/*/d" -// Partial means, if you run out of file before you run -// out of pattern, then that's fine, as long as all -// the parts match. -Minimatch.prototype.matchOne = function (file, pattern, partial) { - var options = this.options - - this.debug('matchOne', - { 'this': this, file: file, pattern: pattern }) - - this.debug('matchOne', file.length, pattern.length) - - for (var fi = 0, - pi = 0, - fl = file.length, - pl = pattern.length - ; (fi < fl) && (pi < pl) - ; fi++, pi++) { - this.debug('matchOne loop') - var p = pattern[pi] - var f = file[fi] - - this.debug(pattern, p, f) - - // should be impossible. - // some invalid regexp stuff in the set. - /* istanbul ignore if */ - if (p === false) return false - - if (p === GLOBSTAR) { - this.debug('GLOBSTAR', [pattern, p, f]) - - // "**" - // a/**/b/**/c would match the following: - // a/b/x/y/z/c - // a/x/y/z/b/c - // a/b/x/b/x/c - // a/b/c - // To do this, take the rest of the pattern after - // the **, and see if it would match the file remainder. - // If so, return success. - // If not, the ** "swallows" a segment, and try again. - // This is recursively awful. - // - // a/**/b/**/c matching a/b/x/y/z/c - // - a matches a - // - doublestar - // - matchOne(b/x/y/z/c, b/**/c) - // - b matches b - // - doublestar - // - matchOne(x/y/z/c, c) -> no - // - matchOne(y/z/c, c) -> no - // - matchOne(z/c, c) -> no - // - matchOne(c, c) yes, hit - var fr = fi - var pr = pi + 1 - if (pr === pl) { - this.debug('** at the end') - // a ** at the end will just swallow the rest. - // We have found a match. - // however, it will not swallow /.x, unless - // options.dot is set. - // . and .. are *never* matched by **, for explosively - // exponential reasons. - for (; fi < fl; fi++) { - if (file[fi] === '.' || file[fi] === '..' || - (!options.dot && file[fi].charAt(0) === '.')) return false - } - return true - } - - // ok, let's see if we can swallow whatever we can. - while (fr < fl) { - var swallowee = file[fr] - - this.debug('\nglobstar while', file, fr, pattern, pr, swallowee) - - // XXX remove this slice. Just pass the start index. - if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { - this.debug('globstar found match!', fr, fl, swallowee) - // found a match. - return true - } else { - // can't swallow "." or ".." ever. - // can only swallow ".foo" when explicitly asked. - if (swallowee === '.' || swallowee === '..' || - (!options.dot && swallowee.charAt(0) === '.')) { - this.debug('dot detected!', file, fr, pattern, pr) - break - } - - // ** swallows a segment, and continue. - this.debug('globstar swallow a segment, and continue') - fr++ - } - } - - // no match was found. - // However, in partial mode, we can't say this is necessarily over. - // If there's more *pattern* left, then - /* istanbul ignore if */ - if (partial) { - // ran out of file - this.debug('\n>>> no match, partial?', file, fr, pattern, pr) - if (fr === fl) return true - } - return false - } - - // something other than ** - // non-magic patterns just have to match exactly - // patterns with magic have been turned into regexps. - var hit - if (typeof p === 'string') { - hit = f === p - this.debug('string match', p, f, hit) - } else { - hit = f.match(p) - this.debug('pattern match', p, f, hit) - } - - if (!hit) return false - } - - // Note: ending in / means that we'll get a final "" - // at the end of the pattern. This can only match a - // corresponding "" at the end of the file. - // If the file ends in /, then it can only match a - // a pattern that ends in /, unless the pattern just - // doesn't have any more for it. But, a/b/ should *not* - // match "a/b/*", even though "" matches against the - // [^/]*? pattern, except in partial mode, where it might - // simply not be reached yet. - // However, a/b/ should still satisfy a/* - - // now either we fell off the end of the pattern, or we're done. - if (fi === fl && pi === pl) { - // ran out of pattern and filename at the same time. - // an exact hit! - return true - } else if (fi === fl) { - // ran out of file, but still had pattern left. - // this is ok if we're doing the match as part of - // a glob fs traversal. - return partial - } else /* istanbul ignore else */ if (pi === pl) { - // ran out of pattern, still have file left. - // this is only acceptable if we're on the very last - // empty segment of a file with a trailing slash. - // a/* should match a/b/ - return (fi === fl - 1) && (file[fi] === '') - } - - // should be unreachable. - /* istanbul ignore next */ - throw new Error('wtf?') -} - -// replace stuff like \* with * -function globUnescape (s) { - return s.replace(/\\(.)/g, '$1') -} - -function regExpEscape (s) { - return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') -} - - -/***/ }), -/* 258 */ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var concatMap = __webpack_require__(259); -var balanced = __webpack_require__(260); - -module.exports = expandTop; - -var escSlash = '\0SLASH'+Math.random()+'\0'; -var escOpen = '\0OPEN'+Math.random()+'\0'; -var escClose = '\0CLOSE'+Math.random()+'\0'; -var escComma = '\0COMMA'+Math.random()+'\0'; -var escPeriod = '\0PERIOD'+Math.random()+'\0'; - -function numeric(str) { - return parseInt(str, 10) == str - ? parseInt(str, 10) - : str.charCodeAt(0); -} - -function escapeBraces(str) { - return str.split('\\\\').join(escSlash) - .split('\\{').join(escOpen) - .split('\\}').join(escClose) - .split('\\,').join(escComma) - .split('\\.').join(escPeriod); -} - -function unescapeBraces(str) { - return str.split(escSlash).join('\\') - .split(escOpen).join('{') - .split(escClose).join('}') - .split(escComma).join(',') - .split(escPeriod).join('.'); -} - - -// Basically just str.split(","), but handling cases -// where we have nested braced sections, which should be -// treated as individual members, like {a,{b,c},d} -function parseCommaParts(str) { - if (!str) - return ['']; - - var parts = []; - var m = balanced('{', '}', str); - - if (!m) - return str.split(','); - - var pre = m.pre; - var body = m.body; - var post = m.post; - var p = pre.split(','); - - p[p.length-1] += '{' + body + '}'; - var postParts = parseCommaParts(post); - if (post.length) { - p[p.length-1] += postParts.shift(); - p.push.apply(p, postParts); - } - - parts.push.apply(parts, p); - - return parts; -} - -function expandTop(str) { - if (!str) - return []; - - // I don't know why Bash 4.3 does this, but it does. - // Anything starting with {} will have the first two bytes preserved - // but *only* at the top level, so {},a}b will not expand to anything, - // but a{},b}c will be expanded to [a}c,abc]. - // One could argue that this is a bug in Bash, but since the goal of - // this module is to match Bash's rules, we escape a leading {} - if (str.substr(0, 2) === '{}') { - str = '\\{\\}' + str.substr(2); - } - - return expand(escapeBraces(str), true).map(unescapeBraces); -} - -function identity(e) { - return e; -} - -function embrace(str) { - return '{' + str + '}'; -} -function isPadded(el) { - return /^-?0\d/.test(el); -} - -function lte(i, y) { - return i <= y; -} -function gte(i, y) { - return i >= y; -} - -function expand(str, isTop) { - var expansions = []; - - var m = balanced('{', '}', str); - if (!m || /\$$/.test(m.pre)) return [str]; - - var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); - var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); - var isSequence = isNumericSequence || isAlphaSequence; - var isOptions = m.body.indexOf(',') >= 0; - if (!isSequence && !isOptions) { - // {a},b} - if (m.post.match(/,.*\}/)) { - str = m.pre + '{' + m.body + escClose + m.post; - return expand(str); - } - return [str]; - } - - var n; - if (isSequence) { - n = m.body.split(/\.\./); - } else { - n = parseCommaParts(m.body); - if (n.length === 1) { - // x{{a,b}}y ==> x{a}y x{b}y - n = expand(n[0], false).map(embrace); - if (n.length === 1) { - var post = m.post.length - ? expand(m.post, false) - : ['']; - return post.map(function(p) { - return m.pre + n[0] + p; - }); - } - } - } - - // at this point, n is the parts, and we know it's not a comma set - // with a single entry. - - // no need to expand pre, since it is guaranteed to be free of brace-sets - var pre = m.pre; - var post = m.post.length - ? expand(m.post, false) - : ['']; - - var N; - - if (isSequence) { - var x = numeric(n[0]); - var y = numeric(n[1]); - var width = Math.max(n[0].length, n[1].length) - var incr = n.length == 3 - ? Math.abs(numeric(n[2])) - : 1; - var test = lte; - var reverse = y < x; - if (reverse) { - incr *= -1; - test = gte; - } - var pad = n.some(isPadded); - - N = []; - - for (var i = x; test(i, y); i += incr) { - var c; - if (isAlphaSequence) { - c = String.fromCharCode(i); - if (c === '\\') - c = ''; - } else { - c = String(i); - if (pad) { - var need = width - c.length; - if (need > 0) { - var z = new Array(need + 1).join('0'); - if (i < 0) - c = '-' + z + c.slice(1); - else - c = z + c; - } - } - } - N.push(c); - } - } else { - N = concatMap(n, function(el) { return expand(el, false) }); - } - - for (var j = 0; j < N.length; j++) { - for (var k = 0; k < post.length; k++) { - var expansion = pre + N[j] + post[k]; - if (!isTop || isSequence || expansion) - expansions.push(expansion); - } - } - - return expansions; -} - - - -/***/ }), -/* 259 */ -/***/ ((module) => { - -module.exports = function (xs, fn) { - var res = []; - for (var i = 0; i < xs.length; i++) { - var x = fn(xs[i], i); - if (isArray(x)) res.push.apply(res, x); - else res.push(x); - } - return res; -}; - -var isArray = Array.isArray || function (xs) { - return Object.prototype.toString.call(xs) === '[object Array]'; -}; - - -/***/ }), -/* 260 */ -/***/ ((module) => { - -"use strict"; - -module.exports = balanced; -function balanced(a, b, str) { - if (a instanceof RegExp) a = maybeMatch(a, str); - if (b instanceof RegExp) b = maybeMatch(b, str); - - var r = range(a, b, str); - - return r && { - start: r[0], - end: r[1], - pre: str.slice(0, r[0]), - body: str.slice(r[0] + a.length, r[1]), - post: str.slice(r[1] + b.length) - }; -} - -function maybeMatch(reg, str) { - var m = str.match(reg); - return m ? m[0] : null; -} - -balanced.range = range; -function range(a, b, str) { - var begs, beg, left, right, result; - var ai = str.indexOf(a); - var bi = str.indexOf(b, ai + 1); - var i = ai; - - if (ai >= 0 && bi > 0) { - if(a===b) { - return [ai, bi]; - } - begs = []; - left = str.length; - - while (i >= 0 && !result) { - if (i == ai) { - begs.push(i); - ai = str.indexOf(a, i + 1); - } else if (begs.length == 1) { - result = [ begs.pop(), bi ]; - } else { - beg = begs.pop(); - if (beg < left) { - left = beg; - right = bi; - } - - bi = str.indexOf(b, i + 1); - } - - i = ai < bi && ai >= 0 ? ai : bi; - } - - if (begs.length) { - result = [ left, right ]; - } - } - - return result; -} - - -/***/ }), -/* 261 */ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - -"use strict"; - -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.WebviewService = void 0; -const fs_extra_1 = __webpack_require__(7); -const lodash_1 = __webpack_require__(262); -const url_1 = __webpack_require__(178); -const vscode = __importStar(__webpack_require__(1)); -const commons_1 = __importDefault(__webpack_require__(46)); -const localize_1 = __importDefault(__webpack_require__(47)); -const settingType_model_1 = __webpack_require__(263); -const state_1 = __webpack_require__(5); -const github_oauth_service_1 = __webpack_require__(264); -class WebviewService { - globalSettings = [ - { - name: (0, localize_1.default)("ext.globalConfig.token.name"), - placeholder: (0, localize_1.default)("ext.globalConfig.token.placeholder"), - type: settingType_model_1.UISettingType.TextInput, - correspondingSetting: "token" - }, - { - name: (0, localize_1.default)("ext.globalConfig.githubEnterpriseUrl.name"), - placeholder: (0, localize_1.default)("ext.globalConfig.githubEnterpriseUrl.placeholder"), - type: settingType_model_1.UISettingType.TextInput, - correspondingSetting: "githubEnterpriseUrl" - }, - { - name: (0, localize_1.default)("ext.globalConfig.ignoreUploadFolders.name"), - placeholder: (0, localize_1.default)("ext.globalConfig.ignoreUploadFolders.placeholder"), - type: settingType_model_1.UISettingType.TextArea, - correspondingSetting: "ignoreUploadFolders" - }, - { - name: (0, localize_1.default)("ext.globalConfig.ignoreExtensions.name"), - placeholder: (0, localize_1.default)("ext.globalConfig.ignoreExtensions.placeholder"), - type: settingType_model_1.UISettingType.TextArea, - correspondingSetting: "ignoreExtensions" - }, - { - name: (0, localize_1.default)("ext.globalConfig.hostName.name"), - placeholder: (0, localize_1.default)("ext.globalConfig.hostName.placeholder"), - type: settingType_model_1.UISettingType.TextInput, - correspondingSetting: "hostName" - }, - { - name: (0, localize_1.default)("ext.globalConfig.ignoreUploadFiles.name"), - placeholder: (0, localize_1.default)("ext.globalConfig.ignoreUploadFiles.placeholder"), - type: settingType_model_1.UISettingType.TextArea, - correspondingSetting: "ignoreUploadFiles" - }, - { - name: (0, localize_1.default)("ext.globalConfig.supportedFileExtensions.name"), - placeholder: (0, localize_1.default)("ext.globalConfig.supportedFileExtensions.placeholder"), - type: settingType_model_1.UISettingType.TextArea, - correspondingSetting: "supportedFileExtensions" - }, - { - name: (0, localize_1.default)("ext.globalConfig.gistDescription.name"), - placeholder: (0, localize_1.default)("ext.globalConfig.gistDescription.placeholder"), - type: settingType_model_1.UISettingType.TextInput, - correspondingSetting: "gistDescription" - }, - { - name: (0, localize_1.default)("ext.globalConfig.autoUploadDelay.name"), - placeholder: (0, localize_1.default)("ext.globalConfig.autoUploadDelay.placeholder"), - type: settingType_model_1.UISettingType.NumberInput, - correspondingSetting: "autoUploadDelay" - }, - { - name: (0, localize_1.default)("ext.globalConfig.askGistDescription.name"), - placeholder: "", - type: settingType_model_1.UISettingType.Checkbox, - correspondingSetting: "askGistDescription" - }, - { - name: (0, localize_1.default)("ext.globalConfig.downloadPublicGist.name"), - placeholder: "", - type: settingType_model_1.UISettingType.Checkbox, - correspondingSetting: "downloadPublicGist" - }, - { - name: (0, localize_1.default)("ext.globalConfig.openTokenLink.name"), - placeholder: "", - type: settingType_model_1.UISettingType.Checkbox, - correspondingSetting: "openTokenLink" - } - ]; - environmentSettings = [ - { - name: (0, localize_1.default)("ext.config.gist.name"), - placeholder: (0, localize_1.default)("ext.config.gist.placeholder"), - type: settingType_model_1.UISettingType.TextInput, - correspondingSetting: "gist", - tooltip: (0, localize_1.default)("ext.config.gist") - }, - { - name: (0, localize_1.default)("ext.config.autoDownload.name"), - placeholder: "", - type: settingType_model_1.UISettingType.Checkbox, - correspondingSetting: "autoDownload", - tooltip: (0, localize_1.default)("ext.config.autoDownload") - }, - { - name: (0, localize_1.default)("ext.config.autoUpload.name"), - placeholder: "", - type: settingType_model_1.UISettingType.Checkbox, - correspondingSetting: "autoUpload", - tooltip: (0, localize_1.default)("ext.config.autoUpload") - }, - { - name: (0, localize_1.default)("ext.config.forceDownload.name"), - placeholder: "", - type: settingType_model_1.UISettingType.Checkbox, - correspondingSetting: "forceDownload", - tooltip: (0, localize_1.default)("ext.config.forceDownload") - }, - { - name: (0, localize_1.default)("ext.config.forceUpload.name"), - placeholder: "", - type: settingType_model_1.UISettingType.Checkbox, - correspondingSetting: "forceUpload", - tooltip: (0, localize_1.default)("ext.config.forceUpload") - }, - { - name: (0, localize_1.default)("ext.config.quietSync.name"), - placeholder: "", - type: settingType_model_1.UISettingType.Checkbox, - correspondingSetting: "quietSync", - tooltip: (0, localize_1.default)("ext.config.quietSync") - }, - { - name: (0, localize_1.default)("ext.config.removeExtensions.name"), - placeholder: "", - type: settingType_model_1.UISettingType.Checkbox, - correspondingSetting: "removeExtensions", - tooltip: (0, localize_1.default)("ext.config.removeExtensions") - }, - { - name: (0, localize_1.default)("ext.config.syncExtensions.name"), - placeholder: "", - type: settingType_model_1.UISettingType.Checkbox, - correspondingSetting: "syncExtensions", - tooltip: (0, localize_1.default)("ext.config.syncExtensions") - } - ]; - webviews = [ - { - name: "landing-page", - htmlPath: "landing-page.html", - replaceables: [ - { - find: "@RELEASE_NOTES", - replace: "releaseNotes" - }, - { - find: "@CHECKED", - replace: "checked" - } - ] - }, - { - name: "settings", - htmlPath: "settings.html", - replaceables: [ - { - find: "@GLOBAL_DATA", - replace: "customSettings" - }, - { - find: "@ENV_DATA", - replace: "extSettings" - }, - { - find: "@GLOBAL_MAP", - replace: this.globalSettings - }, - { - find: "@ENV_MAP", - replace: this.environmentSettings - } - ] - }, - { - name: "gist-selection", - htmlPath: "gist-selection.html", - replaceables: [ - { - find: "@GISTS", - replace: "gists" - }, - { - find: "@SKIP", - replace: "skip" - } - ] - } - ]; - constructor() { - this.webviews = this.webviews.map(view => { - return { - ...view, - htmlContent: (0, fs_extra_1.readFileSync)(`${state_1.state.context.extensionPath}/ui/${view.name}/${view.htmlPath}`, "utf-8") - }; - }); - } - OpenSettingsPage(customSettings, extSettings) { - const webview = this.webviews[1]; - const content = this.GenerateContent({ - content: webview.htmlContent, - items: webview.replaceables, - customSettings, - extSettings - }); - if (webview.webview) { - webview.webview.webview.html = content; - webview.webview.reveal(); - return webview.webview; - } - const settingsPanel = vscode.window.createWebviewPanel("syncSettings", "Sync Settings", vscode.ViewColumn.One, { - retainContextWhenHidden: true, - enableScripts: true - }); - settingsPanel.webview.html = content; - settingsPanel.webview.onDidReceiveMessage(async (message) => { - if (message === "openGist") { - const [customConfig, extConfig] = await Promise.all([ - state_1.state.commons.GetCustomSettings(), - state_1.state.commons.GetSettings() - ]); - const host = customConfig.githubEnterpriseUrl - ? new url_1.URL(customConfig.githubEnterpriseUrl) - : new url_1.URL("https://github.com"); - const username = await new github_oauth_service_1.GitHubOAuthService(0).getUser(customConfig.token, host); - if (!username) { - return commons_1.default.LogException(null, "Sync: Invalid Access Token.", true); - } - vscode.env.openExternal(vscode.Uri.parse(`https://gist.${host.hostname}/${username}/${extConfig.gist}`)); - return; - } - this.ReceiveSettingChange(message, customSettings, extSettings); - }); - webview.webview = settingsPanel; - settingsPanel.onDidDispose(() => (webview.webview = null)); - return settingsPanel; - } - UpdateSettingsPage(customSettings, extSettings) { - const webview = this.webviews[1]; - if (webview.webview) { - webview.webview.webview.html = this.GenerateContent({ - content: webview.htmlContent, - items: webview.replaceables, - customSettings, - extSettings - }); - } - } - ReceiveSettingChange(message, customSettings, extSettings) { - let value = message.text; - if (message.text === "true" || message.text === "false") { - value = message.text === "true"; - } - if (message.type === "global") { - if ((0, lodash_1.has)(customSettings, message.command)) { - (0, lodash_1.set)(customSettings, message.command, value); - state_1.state.commons.SetCustomSettings(customSettings); - } - } - else { - extSettings[message.command] = value; - state_1.state.commons.SaveSettings(extSettings); - } - } - IsLandingPageEnabled() { - return !state_1.state.context.globalState.get("landingPage.dontShowThisAgain"); - } - OpenLandingPage(cmd) { - const webview = this.webviews[0]; - const releaseNotes = __webpack_require__(Object(function webpackMissingModule() { var e = new Error("Cannot find module '../../release-notes.json'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); - const content = this.GenerateContent({ - content: webview.htmlContent, - items: webview.replaceables, - releaseNotes, - checked: this.IsLandingPageEnabled() - }); - if (webview.webview) { - webview.webview.webview.html = content; - webview.webview.reveal(); - return webview.webview; - } - const landingPanel = vscode.window.createWebviewPanel("landingPage", "Welcome to Settings Sync", vscode.ViewColumn.One, { - retainContextWhenHidden: true, - enableScripts: true - }); - landingPanel.webview.onDidReceiveMessage(async (message) => { - switch (message.command) { - case "loginWithGitHub": - new github_oauth_service_1.GitHubOAuthService(54321).StartProcess(cmd); - const customSettings = await state_1.state.commons.GetCustomSettings(); - const host = customSettings.githubEnterpriseUrl - ? new url_1.URL(customSettings.githubEnterpriseUrl) - : new url_1.URL("https://github.com"); - vscode.commands.executeCommand("vscode.open", vscode.Uri.parse(`https://${host.hostname}/login/oauth/authorize?scope=gist%20read:user&client_id=cfd96460d8b110e2351b&redirect_uri=http://localhost:54321/callback`)); - break; - case "editConfiguration": - this.OpenSettingsPage(await state_1.state.commons.GetCustomSettings(), await state_1.state.commons.GetSettings()); - break; - case "downloadPublicGist": - const [extConfig, customConfig] = await Promise.all([ - state_1.state.commons.GetSettings(), - state_1.state.commons.GetCustomSettings() - ]); - const publicGist = await vscode.window.showInputBox({ - placeHolder: (0, localize_1.default)("common.placeholder.enterGistId"), - ignoreFocusOut: true - }); - if (!publicGist) { - break; - } - await state_1.state.commons.SetCustomSettings({ - ...customConfig, - downloadPublicGist: true - }); - await state_1.state.commons.SaveSettings({ - ...extConfig, - gist: publicGist - }); - vscode.window.showInformationMessage((0, localize_1.default)("cmd.otherOptions.warning.tokenNotRequire")); - vscode.commands.executeCommand("extension.downloadSettings"); - break; - case "dontShowThisAgain": - await state_1.state.context.globalState.update("landingPage.dontShowThisAgain", message.data); - break; - } - }); - landingPanel.webview.html = content; - webview.webview = landingPanel; - landingPanel.onDidDispose(() => (webview.webview = null)); - return landingPanel; - } - OpenGistSelectionpage(gists, cmd) { - const webview = this.webviews[2]; - const content = this.GenerateContent({ - content: webview.htmlContent, - items: webview.replaceables, - gists, - skip: cmd !== "extension.downloadSettings" - ? `Skip (new one will be created upon first upload)` - : "" - }); - if (webview.webview) { - webview.webview.webview.html = content; - webview.webview.reveal(); - return webview.webview; - } - const gistSelectionPanel = vscode.window.createWebviewPanel("selectGist", "Select Your Existing Gist", vscode.ViewColumn.One, { - retainContextWhenHidden: true, - enableScripts: true - }); - gistSelectionPanel.webview.html = content; - gistSelectionPanel.webview.onDidReceiveMessage(async (message) => { - if (!message.close) { - const extSettings = await state_1.state.commons.GetSettings(); - extSettings.gist = message.id; - state_1.state.commons.SaveSettings(extSettings); - } - else { - gistSelectionPanel.dispose(); - } - }); - webview.webview = gistSelectionPanel; - gistSelectionPanel.onDidDispose(() => { - webview.webview = null; - if (cmd) { - vscode.commands.executeCommand(cmd); - } - }); - return gistSelectionPanel; - } - GenerateContent(options) { - const toReplace = []; - options.items.forEach(option => { - if (typeof option.replace === "string") { - toReplace.push({ - ...option, - replace: JSON.stringify(options[option.replace]) - }); - } - else { - toReplace.push({ - find: option.find, - replace: JSON.stringify(option.replace) - }); - } - }); - return toReplace - .reduce((acc, cur) => acc.replace(new RegExp(cur.find, "g"), cur.replace), options.content) - .replace(new RegExp("@PWD", "g"), vscode.Uri.file(state_1.state.context.extensionPath) - .with({ - scheme: "vscode-resource" - }) - .toString()); - } -} -exports.WebviewService = WebviewService; - - -/***/ }), -/* 262 */ -/***/ (function(module, exports, __webpack_require__) { - -/* module decorator */ module = __webpack_require__.nmd(module); -var __WEBPACK_AMD_DEFINE_RESULT__;/** - * @license - * Lodash - * Copyright OpenJS Foundation and other contributors - * Released under MIT license - * Based on Underscore.js 1.8.3 - * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - */ -;(function() { - - /** Used as a safe reference for `undefined` in pre-ES5 environments. */ - var undefined; - - /** Used as the semantic version number. */ - var VERSION = '4.17.21'; - - /** Used as the size to enable large array optimizations. */ - var LARGE_ARRAY_SIZE = 200; - - /** Error message constants. */ - var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.', - FUNC_ERROR_TEXT = 'Expected a function', - INVALID_TEMPL_VAR_ERROR_TEXT = 'Invalid `variable` option passed into `_.template`'; - - /** Used to stand-in for `undefined` hash values. */ - var HASH_UNDEFINED = '__lodash_hash_undefined__'; - - /** Used as the maximum memoize cache size. */ - var MAX_MEMOIZE_SIZE = 500; - - /** Used as the internal argument placeholder. */ - var PLACEHOLDER = '__lodash_placeholder__'; - - /** Used to compose bitmasks for cloning. */ - var CLONE_DEEP_FLAG = 1, - CLONE_FLAT_FLAG = 2, - CLONE_SYMBOLS_FLAG = 4; - - /** Used to compose bitmasks for value comparisons. */ - var COMPARE_PARTIAL_FLAG = 1, - COMPARE_UNORDERED_FLAG = 2; - - /** Used to compose bitmasks for function metadata. */ - var WRAP_BIND_FLAG = 1, - WRAP_BIND_KEY_FLAG = 2, - WRAP_CURRY_BOUND_FLAG = 4, - WRAP_CURRY_FLAG = 8, - WRAP_CURRY_RIGHT_FLAG = 16, - WRAP_PARTIAL_FLAG = 32, - WRAP_PARTIAL_RIGHT_FLAG = 64, - WRAP_ARY_FLAG = 128, - WRAP_REARG_FLAG = 256, - WRAP_FLIP_FLAG = 512; - - /** Used as default options for `_.truncate`. */ - var DEFAULT_TRUNC_LENGTH = 30, - DEFAULT_TRUNC_OMISSION = '...'; - - /** Used to detect hot functions by number of calls within a span of milliseconds. */ - var HOT_COUNT = 800, - HOT_SPAN = 16; - - /** Used to indicate the type of lazy iteratees. */ - var LAZY_FILTER_FLAG = 1, - LAZY_MAP_FLAG = 2, - LAZY_WHILE_FLAG = 3; - - /** Used as references for various `Number` constants. */ - var INFINITY = 1 / 0, - MAX_SAFE_INTEGER = 9007199254740991, - MAX_INTEGER = 1.7976931348623157e+308, - NAN = 0 / 0; - - /** Used as references for the maximum length and index of an array. */ - var MAX_ARRAY_LENGTH = 4294967295, - MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1, - HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1; - - /** Used to associate wrap methods with their bit flags. */ - var wrapFlags = [ - ['ary', WRAP_ARY_FLAG], - ['bind', WRAP_BIND_FLAG], - ['bindKey', WRAP_BIND_KEY_FLAG], - ['curry', WRAP_CURRY_FLAG], - ['curryRight', WRAP_CURRY_RIGHT_FLAG], - ['flip', WRAP_FLIP_FLAG], - ['partial', WRAP_PARTIAL_FLAG], - ['partialRight', WRAP_PARTIAL_RIGHT_FLAG], - ['rearg', WRAP_REARG_FLAG] - ]; - - /** `Object#toString` result references. */ - var argsTag = '[object Arguments]', - arrayTag = '[object Array]', - asyncTag = '[object AsyncFunction]', - boolTag = '[object Boolean]', - dateTag = '[object Date]', - domExcTag = '[object DOMException]', - errorTag = '[object Error]', - funcTag = '[object Function]', - genTag = '[object GeneratorFunction]', - mapTag = '[object Map]', - numberTag = '[object Number]', - nullTag = '[object Null]', - objectTag = '[object Object]', - promiseTag = '[object Promise]', - proxyTag = '[object Proxy]', - regexpTag = '[object RegExp]', - setTag = '[object Set]', - stringTag = '[object String]', - symbolTag = '[object Symbol]', - undefinedTag = '[object Undefined]', - weakMapTag = '[object WeakMap]', - weakSetTag = '[object WeakSet]'; - - var arrayBufferTag = '[object ArrayBuffer]', - dataViewTag = '[object DataView]', - float32Tag = '[object Float32Array]', - float64Tag = '[object Float64Array]', - int8Tag = '[object Int8Array]', - int16Tag = '[object Int16Array]', - int32Tag = '[object Int32Array]', - uint8Tag = '[object Uint8Array]', - uint8ClampedTag = '[object Uint8ClampedArray]', - uint16Tag = '[object Uint16Array]', - uint32Tag = '[object Uint32Array]'; - - /** Used to match empty string literals in compiled template source. */ - var reEmptyStringLeading = /\b__p \+= '';/g, - reEmptyStringMiddle = /\b(__p \+=) '' \+/g, - reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g; - - /** Used to match HTML entities and HTML characters. */ - var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g, - reUnescapedHtml = /[&<>"']/g, - reHasEscapedHtml = RegExp(reEscapedHtml.source), - reHasUnescapedHtml = RegExp(reUnescapedHtml.source); - - /** Used to match template delimiters. */ - var reEscape = /<%-([\s\S]+?)%>/g, - reEvaluate = /<%([\s\S]+?)%>/g, - reInterpolate = /<%=([\s\S]+?)%>/g; - - /** Used to match property names within property paths. */ - var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, - reIsPlainProp = /^\w*$/, - rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; - - /** - * Used to match `RegExp` - * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). - */ - var reRegExpChar = /[\\^$.*+?()[\]{}|]/g, - reHasRegExpChar = RegExp(reRegExpChar.source); - - /** Used to match leading whitespace. */ - var reTrimStart = /^\s+/; - - /** Used to match a single whitespace character. */ - var reWhitespace = /\s/; - - /** Used to match wrap detail comments. */ - var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/, - reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/, - reSplitDetails = /,? & /; - - /** Used to match words composed of alphanumeric characters. */ - var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g; - - /** - * Used to validate the `validate` option in `_.template` variable. - * - * Forbids characters which could potentially change the meaning of the function argument definition: - * - "()," (modification of function parameters) - * - "=" (default value) - * - "[]{}" (destructuring of function parameters) - * - "/" (beginning of a comment) - * - whitespace - */ - var reForbiddenIdentifierChars = /[()=,{}\[\]\/\s]/; - - /** Used to match backslashes in property paths. */ - var reEscapeChar = /\\(\\)?/g; - - /** - * Used to match - * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components). - */ - var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g; - - /** Used to match `RegExp` flags from their coerced string values. */ - var reFlags = /\w*$/; - - /** Used to detect bad signed hexadecimal string values. */ - var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; - - /** Used to detect binary string values. */ - var reIsBinary = /^0b[01]+$/i; - - /** Used to detect host constructors (Safari). */ - var reIsHostCtor = /^\[object .+?Constructor\]$/; - - /** Used to detect octal string values. */ - var reIsOctal = /^0o[0-7]+$/i; - - /** Used to detect unsigned integer values. */ - var reIsUint = /^(?:0|[1-9]\d*)$/; - - /** Used to match Latin Unicode letters (excluding mathematical operators). */ - var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g; - - /** Used to ensure capturing order of template delimiters. */ - var reNoMatch = /($^)/; - - /** Used to match unescaped characters in compiled string literals. */ - var reUnescapedString = /['\n\r\u2028\u2029\\]/g; - - /** Used to compose unicode character classes. */ - var rsAstralRange = '\\ud800-\\udfff', - rsComboMarksRange = '\\u0300-\\u036f', - reComboHalfMarksRange = '\\ufe20-\\ufe2f', - rsComboSymbolsRange = '\\u20d0-\\u20ff', - rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, - rsDingbatRange = '\\u2700-\\u27bf', - rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff', - rsMathOpRange = '\\xac\\xb1\\xd7\\xf7', - rsNonCharRange = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf', - rsPunctuationRange = '\\u2000-\\u206f', - rsSpaceRange = ' \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000', - rsUpperRange = 'A-Z\\xc0-\\xd6\\xd8-\\xde', - rsVarRange = '\\ufe0e\\ufe0f', - rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange; - - /** Used to compose unicode capture groups. */ - var rsApos = "['\u2019]", - rsAstral = '[' + rsAstralRange + ']', - rsBreak = '[' + rsBreakRange + ']', - rsCombo = '[' + rsComboRange + ']', - rsDigits = '\\d+', - rsDingbat = '[' + rsDingbatRange + ']', - rsLower = '[' + rsLowerRange + ']', - rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']', - rsFitz = '\\ud83c[\\udffb-\\udfff]', - rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')', - rsNonAstral = '[^' + rsAstralRange + ']', - rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}', - rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]', - rsUpper = '[' + rsUpperRange + ']', - rsZWJ = '\\u200d'; - - /** Used to compose unicode regexes. */ - var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')', - rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')', - rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?', - rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?', - reOptMod = rsModifier + '?', - rsOptVar = '[' + rsVarRange + ']?', - rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*', - rsOrdLower = '\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])', - rsOrdUpper = '\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])', - rsSeq = rsOptVar + reOptMod + rsOptJoin, - rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq, - rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')'; - - /** Used to match apostrophes. */ - var reApos = RegExp(rsApos, 'g'); - - /** - * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and - * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols). - */ - var reComboMark = RegExp(rsCombo, 'g'); - - /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */ - var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g'); - - /** Used to match complex or compound words. */ - var reUnicodeWord = RegExp([ - rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')', - rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')', - rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower, - rsUpper + '+' + rsOptContrUpper, - rsOrdUpper, - rsOrdLower, - rsDigits, - rsEmoji - ].join('|'), 'g'); - - /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */ - var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']'); - - /** Used to detect strings that need a more robust regexp to match words. */ - var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/; - - /** Used to assign default `context` object properties. */ - var contextProps = [ - 'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array', - 'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object', - 'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array', - 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap', - '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout' - ]; - - /** Used to make template sourceURLs easier to identify. */ - var templateCounter = -1; - - /** Used to identify `toStringTag` values of typed arrays. */ - var typedArrayTags = {}; - typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = - typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = - typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = - typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = - typedArrayTags[uint32Tag] = true; - typedArrayTags[argsTag] = typedArrayTags[arrayTag] = - typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = - typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = - typedArrayTags[errorTag] = typedArrayTags[funcTag] = - typedArrayTags[mapTag] = typedArrayTags[numberTag] = - typedArrayTags[objectTag] = typedArrayTags[regexpTag] = - typedArrayTags[setTag] = typedArrayTags[stringTag] = - typedArrayTags[weakMapTag] = false; - - /** Used to identify `toStringTag` values supported by `_.clone`. */ - var cloneableTags = {}; - cloneableTags[argsTag] = cloneableTags[arrayTag] = - cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] = - cloneableTags[boolTag] = cloneableTags[dateTag] = - cloneableTags[float32Tag] = cloneableTags[float64Tag] = - cloneableTags[int8Tag] = cloneableTags[int16Tag] = - cloneableTags[int32Tag] = cloneableTags[mapTag] = - cloneableTags[numberTag] = cloneableTags[objectTag] = - cloneableTags[regexpTag] = cloneableTags[setTag] = - cloneableTags[stringTag] = cloneableTags[symbolTag] = - cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = - cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true; - cloneableTags[errorTag] = cloneableTags[funcTag] = - cloneableTags[weakMapTag] = false; - - /** Used to map Latin Unicode letters to basic Latin letters. */ - var deburredLetters = { - // Latin-1 Supplement block. - '\xc0': 'A', '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A', - '\xe0': 'a', '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a', - '\xc7': 'C', '\xe7': 'c', - '\xd0': 'D', '\xf0': 'd', - '\xc8': 'E', '\xc9': 'E', '\xca': 'E', '\xcb': 'E', - '\xe8': 'e', '\xe9': 'e', '\xea': 'e', '\xeb': 'e', - '\xcc': 'I', '\xcd': 'I', '\xce': 'I', '\xcf': 'I', - '\xec': 'i', '\xed': 'i', '\xee': 'i', '\xef': 'i', - '\xd1': 'N', '\xf1': 'n', - '\xd2': 'O', '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O', - '\xf2': 'o', '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o', - '\xd9': 'U', '\xda': 'U', '\xdb': 'U', '\xdc': 'U', - '\xf9': 'u', '\xfa': 'u', '\xfb': 'u', '\xfc': 'u', - '\xdd': 'Y', '\xfd': 'y', '\xff': 'y', - '\xc6': 'Ae', '\xe6': 'ae', - '\xde': 'Th', '\xfe': 'th', - '\xdf': 'ss', - // Latin Extended-A block. - '\u0100': 'A', '\u0102': 'A', '\u0104': 'A', - '\u0101': 'a', '\u0103': 'a', '\u0105': 'a', - '\u0106': 'C', '\u0108': 'C', '\u010a': 'C', '\u010c': 'C', - '\u0107': 'c', '\u0109': 'c', '\u010b': 'c', '\u010d': 'c', - '\u010e': 'D', '\u0110': 'D', '\u010f': 'd', '\u0111': 'd', - '\u0112': 'E', '\u0114': 'E', '\u0116': 'E', '\u0118': 'E', '\u011a': 'E', - '\u0113': 'e', '\u0115': 'e', '\u0117': 'e', '\u0119': 'e', '\u011b': 'e', - '\u011c': 'G', '\u011e': 'G', '\u0120': 'G', '\u0122': 'G', - '\u011d': 'g', '\u011f': 'g', '\u0121': 'g', '\u0123': 'g', - '\u0124': 'H', '\u0126': 'H', '\u0125': 'h', '\u0127': 'h', - '\u0128': 'I', '\u012a': 'I', '\u012c': 'I', '\u012e': 'I', '\u0130': 'I', - '\u0129': 'i', '\u012b': 'i', '\u012d': 'i', '\u012f': 'i', '\u0131': 'i', - '\u0134': 'J', '\u0135': 'j', - '\u0136': 'K', '\u0137': 'k', '\u0138': 'k', - '\u0139': 'L', '\u013b': 'L', '\u013d': 'L', '\u013f': 'L', '\u0141': 'L', - '\u013a': 'l', '\u013c': 'l', '\u013e': 'l', '\u0140': 'l', '\u0142': 'l', - '\u0143': 'N', '\u0145': 'N', '\u0147': 'N', '\u014a': 'N', - '\u0144': 'n', '\u0146': 'n', '\u0148': 'n', '\u014b': 'n', - '\u014c': 'O', '\u014e': 'O', '\u0150': 'O', - '\u014d': 'o', '\u014f': 'o', '\u0151': 'o', - '\u0154': 'R', '\u0156': 'R', '\u0158': 'R', - '\u0155': 'r', '\u0157': 'r', '\u0159': 'r', - '\u015a': 'S', '\u015c': 'S', '\u015e': 'S', '\u0160': 'S', - '\u015b': 's', '\u015d': 's', '\u015f': 's', '\u0161': 's', - '\u0162': 'T', '\u0164': 'T', '\u0166': 'T', - '\u0163': 't', '\u0165': 't', '\u0167': 't', - '\u0168': 'U', '\u016a': 'U', '\u016c': 'U', '\u016e': 'U', '\u0170': 'U', '\u0172': 'U', - '\u0169': 'u', '\u016b': 'u', '\u016d': 'u', '\u016f': 'u', '\u0171': 'u', '\u0173': 'u', - '\u0174': 'W', '\u0175': 'w', - '\u0176': 'Y', '\u0177': 'y', '\u0178': 'Y', - '\u0179': 'Z', '\u017b': 'Z', '\u017d': 'Z', - '\u017a': 'z', '\u017c': 'z', '\u017e': 'z', - '\u0132': 'IJ', '\u0133': 'ij', - '\u0152': 'Oe', '\u0153': 'oe', - '\u0149': "'n", '\u017f': 's' - }; - - /** Used to map characters to HTML entities. */ - var htmlEscapes = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''' - }; - - /** Used to map HTML entities to characters. */ - var htmlUnescapes = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - ''': "'" - }; - - /** Used to escape characters for inclusion in compiled string literals. */ - var stringEscapes = { - '\\': '\\', - "'": "'", - '\n': 'n', - '\r': 'r', - '\u2028': 'u2028', - '\u2029': 'u2029' - }; - - /** Built-in method references without a dependency on `root`. */ - var freeParseFloat = parseFloat, - freeParseInt = parseInt; - - /** Detect free variable `global` from Node.js. */ - var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; - - /** Detect free variable `self`. */ - var freeSelf = typeof self == 'object' && self && self.Object === Object && self; - - /** Used as a reference to the global object. */ - var root = freeGlobal || freeSelf || Function('return this')(); - - /** Detect free variable `exports`. */ - var freeExports = true && exports && !exports.nodeType && exports; - - /** Detect free variable `module`. */ - var freeModule = freeExports && "object" == 'object' && module && !module.nodeType && module; - - /** Detect the popular CommonJS extension `module.exports`. */ - var moduleExports = freeModule && freeModule.exports === freeExports; - - /** Detect free variable `process` from Node.js. */ - var freeProcess = moduleExports && freeGlobal.process; - - /** Used to access faster Node.js helpers. */ - var nodeUtil = (function() { - try { - // Use `util.types` for Node.js 10+. - var types = freeModule && freeModule.require && freeModule.require('util').types; - - if (types) { - return types; - } - - // Legacy `process.binding('util')` for Node.js < 10. - return freeProcess && freeProcess.binding && freeProcess.binding('util'); - } catch (e) {} - }()); - - /* Node.js helper references. */ - var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer, - nodeIsDate = nodeUtil && nodeUtil.isDate, - nodeIsMap = nodeUtil && nodeUtil.isMap, - nodeIsRegExp = nodeUtil && nodeUtil.isRegExp, - nodeIsSet = nodeUtil && nodeUtil.isSet, - nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray; - - /*--------------------------------------------------------------------------*/ - - /** - * A faster alternative to `Function#apply`, this function invokes `func` - * with the `this` binding of `thisArg` and the arguments of `args`. - * - * @private - * @param {Function} func The function to invoke. - * @param {*} thisArg The `this` binding of `func`. - * @param {Array} args The arguments to invoke `func` with. - * @returns {*} Returns the result of `func`. - */ - function apply(func, thisArg, args) { - switch (args.length) { - case 0: return func.call(thisArg); - case 1: return func.call(thisArg, args[0]); - case 2: return func.call(thisArg, args[0], args[1]); - case 3: return func.call(thisArg, args[0], args[1], args[2]); - } - return func.apply(thisArg, args); - } - - /** - * A specialized version of `baseAggregator` for arrays. - * - * @private - * @param {Array} [array] The array to iterate over. - * @param {Function} setter The function to set `accumulator` values. - * @param {Function} iteratee The iteratee to transform keys. - * @param {Object} accumulator The initial aggregated object. - * @returns {Function} Returns `accumulator`. - */ - function arrayAggregator(array, setter, iteratee, accumulator) { - var index = -1, - length = array == null ? 0 : array.length; - - while (++index < length) { - var value = array[index]; - setter(accumulator, value, iteratee(value), array); - } - return accumulator; - } - - /** - * A specialized version of `_.forEach` for arrays without support for - * iteratee shorthands. - * - * @private - * @param {Array} [array] The array to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Array} Returns `array`. - */ - function arrayEach(array, iteratee) { - var index = -1, - length = array == null ? 0 : array.length; - - while (++index < length) { - if (iteratee(array[index], index, array) === false) { - break; - } - } - return array; - } - - /** - * A specialized version of `_.forEachRight` for arrays without support for - * iteratee shorthands. - * - * @private - * @param {Array} [array] The array to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Array} Returns `array`. - */ - function arrayEachRight(array, iteratee) { - var length = array == null ? 0 : array.length; - - while (length--) { - if (iteratee(array[length], length, array) === false) { - break; - } - } - return array; - } - - /** - * A specialized version of `_.every` for arrays without support for - * iteratee shorthands. - * - * @private - * @param {Array} [array] The array to iterate over. - * @param {Function} predicate The function invoked per iteration. - * @returns {boolean} Returns `true` if all elements pass the predicate check, - * else `false`. - */ - function arrayEvery(array, predicate) { - var index = -1, - length = array == null ? 0 : array.length; - - while (++index < length) { - if (!predicate(array[index], index, array)) { - return false; - } - } - return true; - } - - /** - * A specialized version of `_.filter` for arrays without support for - * iteratee shorthands. - * - * @private - * @param {Array} [array] The array to iterate over. - * @param {Function} predicate The function invoked per iteration. - * @returns {Array} Returns the new filtered array. - */ - function arrayFilter(array, predicate) { - var index = -1, - length = array == null ? 0 : array.length, - resIndex = 0, - result = []; - - while (++index < length) { - var value = array[index]; - if (predicate(value, index, array)) { - result[resIndex++] = value; - } - } - return result; - } - - /** - * A specialized version of `_.includes` for arrays without support for - * specifying an index to search from. - * - * @private - * @param {Array} [array] The array to inspect. - * @param {*} target The value to search for. - * @returns {boolean} Returns `true` if `target` is found, else `false`. - */ - function arrayIncludes(array, value) { - var length = array == null ? 0 : array.length; - return !!length && baseIndexOf(array, value, 0) > -1; - } - - /** - * This function is like `arrayIncludes` except that it accepts a comparator. - * - * @private - * @param {Array} [array] The array to inspect. - * @param {*} target The value to search for. - * @param {Function} comparator The comparator invoked per element. - * @returns {boolean} Returns `true` if `target` is found, else `false`. - */ - function arrayIncludesWith(array, value, comparator) { - var index = -1, - length = array == null ? 0 : array.length; - - while (++index < length) { - if (comparator(value, array[index])) { - return true; - } - } - return false; - } - - /** - * A specialized version of `_.map` for arrays without support for iteratee - * shorthands. - * - * @private - * @param {Array} [array] The array to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Array} Returns the new mapped array. - */ - function arrayMap(array, iteratee) { - var index = -1, - length = array == null ? 0 : array.length, - result = Array(length); - - while (++index < length) { - result[index] = iteratee(array[index], index, array); - } - return result; - } - - /** - * Appends the elements of `values` to `array`. - * - * @private - * @param {Array} array The array to modify. - * @param {Array} values The values to append. - * @returns {Array} Returns `array`. - */ - function arrayPush(array, values) { - var index = -1, - length = values.length, - offset = array.length; - - while (++index < length) { - array[offset + index] = values[index]; - } - return array; - } - - /** - * A specialized version of `_.reduce` for arrays without support for - * iteratee shorthands. - * - * @private - * @param {Array} [array] The array to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @param {*} [accumulator] The initial value. - * @param {boolean} [initAccum] Specify using the first element of `array` as - * the initial value. - * @returns {*} Returns the accumulated value. - */ - function arrayReduce(array, iteratee, accumulator, initAccum) { - var index = -1, - length = array == null ? 0 : array.length; - - if (initAccum && length) { - accumulator = array[++index]; - } - while (++index < length) { - accumulator = iteratee(accumulator, array[index], index, array); - } - return accumulator; - } - - /** - * A specialized version of `_.reduceRight` for arrays without support for - * iteratee shorthands. - * - * @private - * @param {Array} [array] The array to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @param {*} [accumulator] The initial value. - * @param {boolean} [initAccum] Specify using the last element of `array` as - * the initial value. - * @returns {*} Returns the accumulated value. - */ - function arrayReduceRight(array, iteratee, accumulator, initAccum) { - var length = array == null ? 0 : array.length; - if (initAccum && length) { - accumulator = array[--length]; - } - while (length--) { - accumulator = iteratee(accumulator, array[length], length, array); - } - return accumulator; - } - - /** - * A specialized version of `_.some` for arrays without support for iteratee - * shorthands. - * - * @private - * @param {Array} [array] The array to iterate over. - * @param {Function} predicate The function invoked per iteration. - * @returns {boolean} Returns `true` if any element passes the predicate check, - * else `false`. - */ - function arraySome(array, predicate) { - var index = -1, - length = array == null ? 0 : array.length; - - while (++index < length) { - if (predicate(array[index], index, array)) { - return true; - } - } - return false; - } - - /** - * Gets the size of an ASCII `string`. - * - * @private - * @param {string} string The string inspect. - * @returns {number} Returns the string size. - */ - var asciiSize = baseProperty('length'); - - /** - * Converts an ASCII `string` to an array. - * - * @private - * @param {string} string The string to convert. - * @returns {Array} Returns the converted array. - */ - function asciiToArray(string) { - return string.split(''); - } - - /** - * Splits an ASCII `string` into an array of its words. - * - * @private - * @param {string} The string to inspect. - * @returns {Array} Returns the words of `string`. - */ - function asciiWords(string) { - return string.match(reAsciiWord) || []; - } - - /** - * The base implementation of methods like `_.findKey` and `_.findLastKey`, - * without support for iteratee shorthands, which iterates over `collection` - * using `eachFunc`. - * - * @private - * @param {Array|Object} collection The collection to inspect. - * @param {Function} predicate The function invoked per iteration. - * @param {Function} eachFunc The function to iterate over `collection`. - * @returns {*} Returns the found element or its key, else `undefined`. - */ - function baseFindKey(collection, predicate, eachFunc) { - var result; - eachFunc(collection, function(value, key, collection) { - if (predicate(value, key, collection)) { - result = key; - return false; - } - }); - return result; - } - - /** - * The base implementation of `_.findIndex` and `_.findLastIndex` without - * support for iteratee shorthands. - * - * @private - * @param {Array} array The array to inspect. - * @param {Function} predicate The function invoked per iteration. - * @param {number} fromIndex The index to search from. - * @param {boolean} [fromRight] Specify iterating from right to left. - * @returns {number} Returns the index of the matched value, else `-1`. - */ - function baseFindIndex(array, predicate, fromIndex, fromRight) { - var length = array.length, - index = fromIndex + (fromRight ? 1 : -1); - - while ((fromRight ? index-- : ++index < length)) { - if (predicate(array[index], index, array)) { - return index; - } - } - return -1; - } - - /** - * The base implementation of `_.indexOf` without `fromIndex` bounds checks. - * - * @private - * @param {Array} array The array to inspect. - * @param {*} value The value to search for. - * @param {number} fromIndex The index to search from. - * @returns {number} Returns the index of the matched value, else `-1`. - */ - function baseIndexOf(array, value, fromIndex) { - return value === value - ? strictIndexOf(array, value, fromIndex) - : baseFindIndex(array, baseIsNaN, fromIndex); - } - - /** - * This function is like `baseIndexOf` except that it accepts a comparator. - * - * @private - * @param {Array} array The array to inspect. - * @param {*} value The value to search for. - * @param {number} fromIndex The index to search from. - * @param {Function} comparator The comparator invoked per element. - * @returns {number} Returns the index of the matched value, else `-1`. - */ - function baseIndexOfWith(array, value, fromIndex, comparator) { - var index = fromIndex - 1, - length = array.length; - - while (++index < length) { - if (comparator(array[index], value)) { - return index; - } - } - return -1; - } - - /** - * The base implementation of `_.isNaN` without support for number objects. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. - */ - function baseIsNaN(value) { - return value !== value; - } - - /** - * The base implementation of `_.mean` and `_.meanBy` without support for - * iteratee shorthands. - * - * @private - * @param {Array} array The array to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {number} Returns the mean. - */ - function baseMean(array, iteratee) { - var length = array == null ? 0 : array.length; - return length ? (baseSum(array, iteratee) / length) : NAN; - } - - /** - * The base implementation of `_.property` without support for deep paths. - * - * @private - * @param {string} key The key of the property to get. - * @returns {Function} Returns the new accessor function. - */ - function baseProperty(key) { - return function(object) { - return object == null ? undefined : object[key]; - }; - } - - /** - * The base implementation of `_.propertyOf` without support for deep paths. - * - * @private - * @param {Object} object The object to query. - * @returns {Function} Returns the new accessor function. - */ - function basePropertyOf(object) { - return function(key) { - return object == null ? undefined : object[key]; - }; - } - - /** - * The base implementation of `_.reduce` and `_.reduceRight`, without support - * for iteratee shorthands, which iterates over `collection` using `eachFunc`. - * - * @private - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @param {*} accumulator The initial value. - * @param {boolean} initAccum Specify using the first or last element of - * `collection` as the initial value. - * @param {Function} eachFunc The function to iterate over `collection`. - * @returns {*} Returns the accumulated value. - */ - function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) { - eachFunc(collection, function(value, index, collection) { - accumulator = initAccum - ? (initAccum = false, value) - : iteratee(accumulator, value, index, collection); - }); - return accumulator; - } - - /** - * The base implementation of `_.sortBy` which uses `comparer` to define the - * sort order of `array` and replaces criteria objects with their corresponding - * values. - * - * @private - * @param {Array} array The array to sort. - * @param {Function} comparer The function to define sort order. - * @returns {Array} Returns `array`. - */ - function baseSortBy(array, comparer) { - var length = array.length; - - array.sort(comparer); - while (length--) { - array[length] = array[length].value; - } - return array; - } - - /** - * The base implementation of `_.sum` and `_.sumBy` without support for - * iteratee shorthands. - * - * @private - * @param {Array} array The array to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {number} Returns the sum. - */ - function baseSum(array, iteratee) { - var result, - index = -1, - length = array.length; - - while (++index < length) { - var current = iteratee(array[index]); - if (current !== undefined) { - result = result === undefined ? current : (result + current); - } - } - return result; - } - - /** - * The base implementation of `_.times` without support for iteratee shorthands - * or max array length checks. - * - * @private - * @param {number} n The number of times to invoke `iteratee`. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Array} Returns the array of results. - */ - function baseTimes(n, iteratee) { - var index = -1, - result = Array(n); - - while (++index < n) { - result[index] = iteratee(index); - } - return result; - } - - /** - * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array - * of key-value pairs for `object` corresponding to the property names of `props`. - * - * @private - * @param {Object} object The object to query. - * @param {Array} props The property names to get values for. - * @returns {Object} Returns the key-value pairs. - */ - function baseToPairs(object, props) { - return arrayMap(props, function(key) { - return [key, object[key]]; - }); - } - - /** - * The base implementation of `_.trim`. - * - * @private - * @param {string} string The string to trim. - * @returns {string} Returns the trimmed string. - */ - function baseTrim(string) { - return string - ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '') - : string; - } - - /** - * The base implementation of `_.unary` without support for storing metadata. - * - * @private - * @param {Function} func The function to cap arguments for. - * @returns {Function} Returns the new capped function. - */ - function baseUnary(func) { - return function(value) { - return func(value); - }; - } - - /** - * The base implementation of `_.values` and `_.valuesIn` which creates an - * array of `object` property values corresponding to the property names - * of `props`. - * - * @private - * @param {Object} object The object to query. - * @param {Array} props The property names to get values for. - * @returns {Object} Returns the array of property values. - */ - function baseValues(object, props) { - return arrayMap(props, function(key) { - return object[key]; - }); - } - - /** - * Checks if a `cache` value for `key` exists. - * - * @private - * @param {Object} cache The cache to query. - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ - function cacheHas(cache, key) { - return cache.has(key); - } - - /** - * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol - * that is not found in the character symbols. - * - * @private - * @param {Array} strSymbols The string symbols to inspect. - * @param {Array} chrSymbols The character symbols to find. - * @returns {number} Returns the index of the first unmatched string symbol. - */ - function charsStartIndex(strSymbols, chrSymbols) { - var index = -1, - length = strSymbols.length; - - while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {} - return index; - } - - /** - * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol - * that is not found in the character symbols. - * - * @private - * @param {Array} strSymbols The string symbols to inspect. - * @param {Array} chrSymbols The character symbols to find. - * @returns {number} Returns the index of the last unmatched string symbol. - */ - function charsEndIndex(strSymbols, chrSymbols) { - var index = strSymbols.length; - - while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {} - return index; - } - - /** - * Gets the number of `placeholder` occurrences in `array`. - * - * @private - * @param {Array} array The array to inspect. - * @param {*} placeholder The placeholder to search for. - * @returns {number} Returns the placeholder count. - */ - function countHolders(array, placeholder) { - var length = array.length, - result = 0; - - while (length--) { - if (array[length] === placeholder) { - ++result; - } - } - return result; - } - - /** - * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A - * letters to basic Latin letters. - * - * @private - * @param {string} letter The matched letter to deburr. - * @returns {string} Returns the deburred letter. - */ - var deburrLetter = basePropertyOf(deburredLetters); - - /** - * Used by `_.escape` to convert characters to HTML entities. - * - * @private - * @param {string} chr The matched character to escape. - * @returns {string} Returns the escaped character. - */ - var escapeHtmlChar = basePropertyOf(htmlEscapes); - - /** - * Used by `_.template` to escape characters for inclusion in compiled string literals. - * - * @private - * @param {string} chr The matched character to escape. - * @returns {string} Returns the escaped character. - */ - function escapeStringChar(chr) { - return '\\' + stringEscapes[chr]; - } - - /** - * Gets the value at `key` of `object`. - * - * @private - * @param {Object} [object] The object to query. - * @param {string} key The key of the property to get. - * @returns {*} Returns the property value. - */ - function getValue(object, key) { - return object == null ? undefined : object[key]; - } - - /** - * Checks if `string` contains Unicode symbols. - * - * @private - * @param {string} string The string to inspect. - * @returns {boolean} Returns `true` if a symbol is found, else `false`. - */ - function hasUnicode(string) { - return reHasUnicode.test(string); - } - - /** - * Checks if `string` contains a word composed of Unicode symbols. - * - * @private - * @param {string} string The string to inspect. - * @returns {boolean} Returns `true` if a word is found, else `false`. - */ - function hasUnicodeWord(string) { - return reHasUnicodeWord.test(string); - } - - /** - * Converts `iterator` to an array. - * - * @private - * @param {Object} iterator The iterator to convert. - * @returns {Array} Returns the converted array. - */ - function iteratorToArray(iterator) { - var data, - result = []; - - while (!(data = iterator.next()).done) { - result.push(data.value); - } - return result; - } - - /** - * Converts `map` to its key-value pairs. - * - * @private - * @param {Object} map The map to convert. - * @returns {Array} Returns the key-value pairs. - */ - function mapToArray(map) { - var index = -1, - result = Array(map.size); - - map.forEach(function(value, key) { - result[++index] = [key, value]; - }); - return result; - } - - /** - * Creates a unary function that invokes `func` with its argument transformed. - * - * @private - * @param {Function} func The function to wrap. - * @param {Function} transform The argument transform. - * @returns {Function} Returns the new function. - */ - function overArg(func, transform) { - return function(arg) { - return func(transform(arg)); - }; - } - - /** - * Replaces all `placeholder` elements in `array` with an internal placeholder - * and returns an array of their indexes. - * - * @private - * @param {Array} array The array to modify. - * @param {*} placeholder The placeholder to replace. - * @returns {Array} Returns the new array of placeholder indexes. - */ - function replaceHolders(array, placeholder) { - var index = -1, - length = array.length, - resIndex = 0, - result = []; - - while (++index < length) { - var value = array[index]; - if (value === placeholder || value === PLACEHOLDER) { - array[index] = PLACEHOLDER; - result[resIndex++] = index; - } - } - return result; - } - - /** - * Converts `set` to an array of its values. - * - * @private - * @param {Object} set The set to convert. - * @returns {Array} Returns the values. - */ - function setToArray(set) { - var index = -1, - result = Array(set.size); - - set.forEach(function(value) { - result[++index] = value; - }); - return result; - } - - /** - * Converts `set` to its value-value pairs. - * - * @private - * @param {Object} set The set to convert. - * @returns {Array} Returns the value-value pairs. - */ - function setToPairs(set) { - var index = -1, - result = Array(set.size); - - set.forEach(function(value) { - result[++index] = [value, value]; - }); - return result; - } - - /** - * A specialized version of `_.indexOf` which performs strict equality - * comparisons of values, i.e. `===`. - * - * @private - * @param {Array} array The array to inspect. - * @param {*} value The value to search for. - * @param {number} fromIndex The index to search from. - * @returns {number} Returns the index of the matched value, else `-1`. - */ - function strictIndexOf(array, value, fromIndex) { - var index = fromIndex - 1, - length = array.length; - - while (++index < length) { - if (array[index] === value) { - return index; - } - } - return -1; - } - - /** - * A specialized version of `_.lastIndexOf` which performs strict equality - * comparisons of values, i.e. `===`. - * - * @private - * @param {Array} array The array to inspect. - * @param {*} value The value to search for. - * @param {number} fromIndex The index to search from. - * @returns {number} Returns the index of the matched value, else `-1`. - */ - function strictLastIndexOf(array, value, fromIndex) { - var index = fromIndex + 1; - while (index--) { - if (array[index] === value) { - return index; - } - } - return index; - } - - /** - * Gets the number of symbols in `string`. - * - * @private - * @param {string} string The string to inspect. - * @returns {number} Returns the string size. - */ - function stringSize(string) { - return hasUnicode(string) - ? unicodeSize(string) - : asciiSize(string); - } - - /** - * Converts `string` to an array. - * - * @private - * @param {string} string The string to convert. - * @returns {Array} Returns the converted array. - */ - function stringToArray(string) { - return hasUnicode(string) - ? unicodeToArray(string) - : asciiToArray(string); - } - - /** - * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace - * character of `string`. - * - * @private - * @param {string} string The string to inspect. - * @returns {number} Returns the index of the last non-whitespace character. - */ - function trimmedEndIndex(string) { - var index = string.length; - - while (index-- && reWhitespace.test(string.charAt(index))) {} - return index; - } - - /** - * Used by `_.unescape` to convert HTML entities to characters. - * - * @private - * @param {string} chr The matched character to unescape. - * @returns {string} Returns the unescaped character. - */ - var unescapeHtmlChar = basePropertyOf(htmlUnescapes); - - /** - * Gets the size of a Unicode `string`. - * - * @private - * @param {string} string The string inspect. - * @returns {number} Returns the string size. - */ - function unicodeSize(string) { - var result = reUnicode.lastIndex = 0; - while (reUnicode.test(string)) { - ++result; - } - return result; - } - - /** - * Converts a Unicode `string` to an array. - * - * @private - * @param {string} string The string to convert. - * @returns {Array} Returns the converted array. - */ - function unicodeToArray(string) { - return string.match(reUnicode) || []; - } - - /** - * Splits a Unicode `string` into an array of its words. - * - * @private - * @param {string} The string to inspect. - * @returns {Array} Returns the words of `string`. - */ - function unicodeWords(string) { - return string.match(reUnicodeWord) || []; - } - - /*--------------------------------------------------------------------------*/ - - /** - * Create a new pristine `lodash` function using the `context` object. - * - * @static - * @memberOf _ - * @since 1.1.0 - * @category Util - * @param {Object} [context=root] The context object. - * @returns {Function} Returns a new `lodash` function. - * @example - * - * _.mixin({ 'foo': _.constant('foo') }); - * - * var lodash = _.runInContext(); - * lodash.mixin({ 'bar': lodash.constant('bar') }); - * - * _.isFunction(_.foo); - * // => true - * _.isFunction(_.bar); - * // => false - * - * lodash.isFunction(lodash.foo); - * // => false - * lodash.isFunction(lodash.bar); - * // => true - * - * // Create a suped-up `defer` in Node.js. - * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer; - */ - var runInContext = (function runInContext(context) { - context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps)); - - /** Built-in constructor references. */ - var Array = context.Array, - Date = context.Date, - Error = context.Error, - Function = context.Function, - Math = context.Math, - Object = context.Object, - RegExp = context.RegExp, - String = context.String, - TypeError = context.TypeError; - - /** Used for built-in method references. */ - var arrayProto = Array.prototype, - funcProto = Function.prototype, - objectProto = Object.prototype; - - /** Used to detect overreaching core-js shims. */ - var coreJsData = context['__core-js_shared__']; - - /** Used to resolve the decompiled source of functions. */ - var funcToString = funcProto.toString; - - /** Used to check objects for own properties. */ - var hasOwnProperty = objectProto.hasOwnProperty; - - /** Used to generate unique IDs. */ - var idCounter = 0; - - /** Used to detect methods masquerading as native. */ - var maskSrcKey = (function() { - var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); - return uid ? ('Symbol(src)_1.' + uid) : ''; - }()); - - /** - * Used to resolve the - * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) - * of values. - */ - var nativeObjectToString = objectProto.toString; - - /** Used to infer the `Object` constructor. */ - var objectCtorString = funcToString.call(Object); - - /** Used to restore the original `_` reference in `_.noConflict`. */ - var oldDash = root._; - - /** Used to detect if a method is native. */ - var reIsNative = RegExp('^' + - funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') - .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' - ); - - /** Built-in value references. */ - var Buffer = moduleExports ? context.Buffer : undefined, - Symbol = context.Symbol, - Uint8Array = context.Uint8Array, - allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined, - getPrototype = overArg(Object.getPrototypeOf, Object), - objectCreate = Object.create, - propertyIsEnumerable = objectProto.propertyIsEnumerable, - splice = arrayProto.splice, - spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined, - symIterator = Symbol ? Symbol.iterator : undefined, - symToStringTag = Symbol ? Symbol.toStringTag : undefined; - - var defineProperty = (function() { - try { - var func = getNative(Object, 'defineProperty'); - func({}, '', {}); - return func; - } catch (e) {} - }()); - - /** Mocked built-ins. */ - var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout, - ctxNow = Date && Date.now !== root.Date.now && Date.now, - ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout; - - /* Built-in method references for those with the same name as other `lodash` methods. */ - var nativeCeil = Math.ceil, - nativeFloor = Math.floor, - nativeGetSymbols = Object.getOwnPropertySymbols, - nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined, - nativeIsFinite = context.isFinite, - nativeJoin = arrayProto.join, - nativeKeys = overArg(Object.keys, Object), - nativeMax = Math.max, - nativeMin = Math.min, - nativeNow = Date.now, - nativeParseInt = context.parseInt, - nativeRandom = Math.random, - nativeReverse = arrayProto.reverse; - - /* Built-in method references that are verified to be native. */ - var DataView = getNative(context, 'DataView'), - Map = getNative(context, 'Map'), - Promise = getNative(context, 'Promise'), - Set = getNative(context, 'Set'), - WeakMap = getNative(context, 'WeakMap'), - nativeCreate = getNative(Object, 'create'); - - /** Used to store function metadata. */ - var metaMap = WeakMap && new WeakMap; - - /** Used to lookup unminified function names. */ - var realNames = {}; - - /** Used to detect maps, sets, and weakmaps. */ - var dataViewCtorString = toSource(DataView), - mapCtorString = toSource(Map), - promiseCtorString = toSource(Promise), - setCtorString = toSource(Set), - weakMapCtorString = toSource(WeakMap); - - /** Used to convert symbols to primitives and strings. */ - var symbolProto = Symbol ? Symbol.prototype : undefined, - symbolValueOf = symbolProto ? symbolProto.valueOf : undefined, - symbolToString = symbolProto ? symbolProto.toString : undefined; - - /*------------------------------------------------------------------------*/ - - /** - * Creates a `lodash` object which wraps `value` to enable implicit method - * chain sequences. Methods that operate on and return arrays, collections, - * and functions can be chained together. Methods that retrieve a single value - * or may return a primitive value will automatically end the chain sequence - * and return the unwrapped value. Otherwise, the value must be unwrapped - * with `_#value`. - * - * Explicit chain sequences, which must be unwrapped with `_#value`, may be - * enabled using `_.chain`. - * - * The execution of chained methods is lazy, that is, it's deferred until - * `_#value` is implicitly or explicitly called. - * - * Lazy evaluation allows several methods to support shortcut fusion. - * Shortcut fusion is an optimization to merge iteratee calls; this avoids - * the creation of intermediate arrays and can greatly reduce the number of - * iteratee executions. Sections of a chain sequence qualify for shortcut - * fusion if the section is applied to an array and iteratees accept only - * one argument. The heuristic for whether a section qualifies for shortcut - * fusion is subject to change. - * - * Chaining is supported in custom builds as long as the `_#value` method is - * directly or indirectly included in the build. - * - * In addition to lodash methods, wrappers have `Array` and `String` methods. - * - * The wrapper `Array` methods are: - * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift` - * - * The wrapper `String` methods are: - * `replace` and `split` - * - * The wrapper methods that support shortcut fusion are: - * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`, - * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`, - * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray` - * - * The chainable wrapper methods are: - * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`, - * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`, - * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`, - * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`, - * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`, - * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`, - * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`, - * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`, - * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`, - * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`, - * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`, - * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`, - * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`, - * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`, - * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`, - * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`, - * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`, - * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`, - * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`, - * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`, - * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`, - * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`, - * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`, - * `zipObject`, `zipObjectDeep`, and `zipWith` - * - * The wrapper methods that are **not** chainable by default are: - * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`, - * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`, - * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`, - * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`, - * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`, - * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`, - * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`, - * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`, - * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`, - * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`, - * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`, - * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`, - * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`, - * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`, - * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`, - * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`, - * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`, - * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`, - * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`, - * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`, - * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`, - * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`, - * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`, - * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`, - * `upperFirst`, `value`, and `words` - * - * @name _ - * @constructor - * @category Seq - * @param {*} value The value to wrap in a `lodash` instance. - * @returns {Object} Returns the new `lodash` wrapper instance. - * @example - * - * function square(n) { - * return n * n; - * } - * - * var wrapped = _([1, 2, 3]); - * - * // Returns an unwrapped value. - * wrapped.reduce(_.add); - * // => 6 - * - * // Returns a wrapped value. - * var squares = wrapped.map(square); - * - * _.isArray(squares); - * // => false - * - * _.isArray(squares.value()); - * // => true - */ - function lodash(value) { - if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) { - if (value instanceof LodashWrapper) { - return value; - } - if (hasOwnProperty.call(value, '__wrapped__')) { - return wrapperClone(value); - } - } - return new LodashWrapper(value); - } - - /** - * The base implementation of `_.create` without support for assigning - * properties to the created object. - * - * @private - * @param {Object} proto The object to inherit from. - * @returns {Object} Returns the new object. - */ - var baseCreate = (function() { - function object() {} - return function(proto) { - if (!isObject(proto)) { - return {}; - } - if (objectCreate) { - return objectCreate(proto); - } - object.prototype = proto; - var result = new object; - object.prototype = undefined; - return result; - }; - }()); - - /** - * The function whose prototype chain sequence wrappers inherit from. - * - * @private - */ - function baseLodash() { - // No operation performed. - } - - /** - * The base constructor for creating `lodash` wrapper objects. - * - * @private - * @param {*} value The value to wrap. - * @param {boolean} [chainAll] Enable explicit method chain sequences. - */ - function LodashWrapper(value, chainAll) { - this.__wrapped__ = value; - this.__actions__ = []; - this.__chain__ = !!chainAll; - this.__index__ = 0; - this.__values__ = undefined; - } - - /** - * By default, the template delimiters used by lodash are like those in - * embedded Ruby (ERB) as well as ES2015 template strings. Change the - * following template settings to use alternative delimiters. - * - * @static - * @memberOf _ - * @type {Object} - */ - lodash.templateSettings = { - - /** - * Used to detect `data` property values to be HTML-escaped. - * - * @memberOf _.templateSettings - * @type {RegExp} - */ - 'escape': reEscape, - - /** - * Used to detect code to be evaluated. - * - * @memberOf _.templateSettings - * @type {RegExp} - */ - 'evaluate': reEvaluate, - - /** - * Used to detect `data` property values to inject. - * - * @memberOf _.templateSettings - * @type {RegExp} - */ - 'interpolate': reInterpolate, - - /** - * Used to reference the data object in the template text. - * - * @memberOf _.templateSettings - * @type {string} - */ - 'variable': '', - - /** - * Used to import variables into the compiled template. - * - * @memberOf _.templateSettings - * @type {Object} - */ - 'imports': { - - /** - * A reference to the `lodash` function. - * - * @memberOf _.templateSettings.imports - * @type {Function} - */ - '_': lodash - } - }; - - // Ensure wrappers are instances of `baseLodash`. - lodash.prototype = baseLodash.prototype; - lodash.prototype.constructor = lodash; - - LodashWrapper.prototype = baseCreate(baseLodash.prototype); - LodashWrapper.prototype.constructor = LodashWrapper; - - /*------------------------------------------------------------------------*/ - - /** - * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation. - * - * @private - * @constructor - * @param {*} value The value to wrap. - */ - function LazyWrapper(value) { - this.__wrapped__ = value; - this.__actions__ = []; - this.__dir__ = 1; - this.__filtered__ = false; - this.__iteratees__ = []; - this.__takeCount__ = MAX_ARRAY_LENGTH; - this.__views__ = []; - } - - /** - * Creates a clone of the lazy wrapper object. - * - * @private - * @name clone - * @memberOf LazyWrapper - * @returns {Object} Returns the cloned `LazyWrapper` object. - */ - function lazyClone() { - var result = new LazyWrapper(this.__wrapped__); - result.__actions__ = copyArray(this.__actions__); - result.__dir__ = this.__dir__; - result.__filtered__ = this.__filtered__; - result.__iteratees__ = copyArray(this.__iteratees__); - result.__takeCount__ = this.__takeCount__; - result.__views__ = copyArray(this.__views__); - return result; - } - - /** - * Reverses the direction of lazy iteration. - * - * @private - * @name reverse - * @memberOf LazyWrapper - * @returns {Object} Returns the new reversed `LazyWrapper` object. - */ - function lazyReverse() { - if (this.__filtered__) { - var result = new LazyWrapper(this); - result.__dir__ = -1; - result.__filtered__ = true; - } else { - result = this.clone(); - result.__dir__ *= -1; - } - return result; - } - - /** - * Extracts the unwrapped value from its lazy wrapper. - * - * @private - * @name value - * @memberOf LazyWrapper - * @returns {*} Returns the unwrapped value. - */ - function lazyValue() { - var array = this.__wrapped__.value(), - dir = this.__dir__, - isArr = isArray(array), - isRight = dir < 0, - arrLength = isArr ? array.length : 0, - view = getView(0, arrLength, this.__views__), - start = view.start, - end = view.end, - length = end - start, - index = isRight ? end : (start - 1), - iteratees = this.__iteratees__, - iterLength = iteratees.length, - resIndex = 0, - takeCount = nativeMin(length, this.__takeCount__); - - if (!isArr || (!isRight && arrLength == length && takeCount == length)) { - return baseWrapperValue(array, this.__actions__); - } - var result = []; - - outer: - while (length-- && resIndex < takeCount) { - index += dir; - - var iterIndex = -1, - value = array[index]; - - while (++iterIndex < iterLength) { - var data = iteratees[iterIndex], - iteratee = data.iteratee, - type = data.type, - computed = iteratee(value); - - if (type == LAZY_MAP_FLAG) { - value = computed; - } else if (!computed) { - if (type == LAZY_FILTER_FLAG) { - continue outer; - } else { - break outer; - } - } - } - result[resIndex++] = value; - } - return result; - } - - // Ensure `LazyWrapper` is an instance of `baseLodash`. - LazyWrapper.prototype = baseCreate(baseLodash.prototype); - LazyWrapper.prototype.constructor = LazyWrapper; - - /*------------------------------------------------------------------------*/ - - /** - * Creates a hash object. - * - * @private - * @constructor - * @param {Array} [entries] The key-value pairs to cache. - */ - function Hash(entries) { - var index = -1, - length = entries == null ? 0 : entries.length; - - this.clear(); - while (++index < length) { - var entry = entries[index]; - this.set(entry[0], entry[1]); - } - } - - /** - * Removes all key-value entries from the hash. - * - * @private - * @name clear - * @memberOf Hash - */ - function hashClear() { - this.__data__ = nativeCreate ? nativeCreate(null) : {}; - this.size = 0; - } - - /** - * Removes `key` and its value from the hash. - * - * @private - * @name delete - * @memberOf Hash - * @param {Object} hash The hash to modify. - * @param {string} key The key of the value to remove. - * @returns {boolean} Returns `true` if the entry was removed, else `false`. - */ - function hashDelete(key) { - var result = this.has(key) && delete this.__data__[key]; - this.size -= result ? 1 : 0; - return result; - } - - /** - * Gets the hash value for `key`. - * - * @private - * @name get - * @memberOf Hash - * @param {string} key The key of the value to get. - * @returns {*} Returns the entry value. - */ - function hashGet(key) { - var data = this.__data__; - if (nativeCreate) { - var result = data[key]; - return result === HASH_UNDEFINED ? undefined : result; - } - return hasOwnProperty.call(data, key) ? data[key] : undefined; - } - - /** - * Checks if a hash value for `key` exists. - * - * @private - * @name has - * @memberOf Hash - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ - function hashHas(key) { - var data = this.__data__; - return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key); - } - - /** - * Sets the hash `key` to `value`. - * - * @private - * @name set - * @memberOf Hash - * @param {string} key The key of the value to set. - * @param {*} value The value to set. - * @returns {Object} Returns the hash instance. - */ - function hashSet(key, value) { - var data = this.__data__; - this.size += this.has(key) ? 0 : 1; - data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; - return this; - } - - // Add methods to `Hash`. - Hash.prototype.clear = hashClear; - Hash.prototype['delete'] = hashDelete; - Hash.prototype.get = hashGet; - Hash.prototype.has = hashHas; - Hash.prototype.set = hashSet; - - /*------------------------------------------------------------------------*/ - - /** - * Creates an list cache object. - * - * @private - * @constructor - * @param {Array} [entries] The key-value pairs to cache. - */ - function ListCache(entries) { - var index = -1, - length = entries == null ? 0 : entries.length; - - this.clear(); - while (++index < length) { - var entry = entries[index]; - this.set(entry[0], entry[1]); - } - } - - /** - * Removes all key-value entries from the list cache. - * - * @private - * @name clear - * @memberOf ListCache - */ - function listCacheClear() { - this.__data__ = []; - this.size = 0; - } - - /** - * Removes `key` and its value from the list cache. - * - * @private - * @name delete - * @memberOf ListCache - * @param {string} key The key of the value to remove. - * @returns {boolean} Returns `true` if the entry was removed, else `false`. - */ - function listCacheDelete(key) { - var data = this.__data__, - index = assocIndexOf(data, key); - - if (index < 0) { - return false; - } - var lastIndex = data.length - 1; - if (index == lastIndex) { - data.pop(); - } else { - splice.call(data, index, 1); - } - --this.size; - return true; - } - - /** - * Gets the list cache value for `key`. - * - * @private - * @name get - * @memberOf ListCache - * @param {string} key The key of the value to get. - * @returns {*} Returns the entry value. - */ - function listCacheGet(key) { - var data = this.__data__, - index = assocIndexOf(data, key); - - return index < 0 ? undefined : data[index][1]; - } - - /** - * Checks if a list cache value for `key` exists. - * - * @private - * @name has - * @memberOf ListCache - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ - function listCacheHas(key) { - return assocIndexOf(this.__data__, key) > -1; - } - - /** - * Sets the list cache `key` to `value`. - * - * @private - * @name set - * @memberOf ListCache - * @param {string} key The key of the value to set. - * @param {*} value The value to set. - * @returns {Object} Returns the list cache instance. - */ - function listCacheSet(key, value) { - var data = this.__data__, - index = assocIndexOf(data, key); - - if (index < 0) { - ++this.size; - data.push([key, value]); - } else { - data[index][1] = value; - } - return this; - } - - // Add methods to `ListCache`. - ListCache.prototype.clear = listCacheClear; - ListCache.prototype['delete'] = listCacheDelete; - ListCache.prototype.get = listCacheGet; - ListCache.prototype.has = listCacheHas; - ListCache.prototype.set = listCacheSet; - - /*------------------------------------------------------------------------*/ - - /** - * Creates a map cache object to store key-value pairs. - * - * @private - * @constructor - * @param {Array} [entries] The key-value pairs to cache. - */ - function MapCache(entries) { - var index = -1, - length = entries == null ? 0 : entries.length; - - this.clear(); - while (++index < length) { - var entry = entries[index]; - this.set(entry[0], entry[1]); - } - } - - /** - * Removes all key-value entries from the map. - * - * @private - * @name clear - * @memberOf MapCache - */ - function mapCacheClear() { - this.size = 0; - this.__data__ = { - 'hash': new Hash, - 'map': new (Map || ListCache), - 'string': new Hash - }; - } - - /** - * Removes `key` and its value from the map. - * - * @private - * @name delete - * @memberOf MapCache - * @param {string} key The key of the value to remove. - * @returns {boolean} Returns `true` if the entry was removed, else `false`. - */ - function mapCacheDelete(key) { - var result = getMapData(this, key)['delete'](key); - this.size -= result ? 1 : 0; - return result; - } - - /** - * Gets the map value for `key`. - * - * @private - * @name get - * @memberOf MapCache - * @param {string} key The key of the value to get. - * @returns {*} Returns the entry value. - */ - function mapCacheGet(key) { - return getMapData(this, key).get(key); - } - - /** - * Checks if a map value for `key` exists. - * - * @private - * @name has - * @memberOf MapCache - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ - function mapCacheHas(key) { - return getMapData(this, key).has(key); - } - - /** - * Sets the map `key` to `value`. - * - * @private - * @name set - * @memberOf MapCache - * @param {string} key The key of the value to set. - * @param {*} value The value to set. - * @returns {Object} Returns the map cache instance. - */ - function mapCacheSet(key, value) { - var data = getMapData(this, key), - size = data.size; - - data.set(key, value); - this.size += data.size == size ? 0 : 1; - return this; - } - - // Add methods to `MapCache`. - MapCache.prototype.clear = mapCacheClear; - MapCache.prototype['delete'] = mapCacheDelete; - MapCache.prototype.get = mapCacheGet; - MapCache.prototype.has = mapCacheHas; - MapCache.prototype.set = mapCacheSet; - - /*------------------------------------------------------------------------*/ - - /** - * - * Creates an array cache object to store unique values. - * - * @private - * @constructor - * @param {Array} [values] The values to cache. - */ - function SetCache(values) { - var index = -1, - length = values == null ? 0 : values.length; - - this.__data__ = new MapCache; - while (++index < length) { - this.add(values[index]); - } - } - - /** - * Adds `value` to the array cache. - * - * @private - * @name add - * @memberOf SetCache - * @alias push - * @param {*} value The value to cache. - * @returns {Object} Returns the cache instance. - */ - function setCacheAdd(value) { - this.__data__.set(value, HASH_UNDEFINED); - return this; - } - - /** - * Checks if `value` is in the array cache. - * - * @private - * @name has - * @memberOf SetCache - * @param {*} value The value to search for. - * @returns {number} Returns `true` if `value` is found, else `false`. - */ - function setCacheHas(value) { - return this.__data__.has(value); - } - - // Add methods to `SetCache`. - SetCache.prototype.add = SetCache.prototype.push = setCacheAdd; - SetCache.prototype.has = setCacheHas; - - /*------------------------------------------------------------------------*/ - - /** - * Creates a stack cache object to store key-value pairs. - * - * @private - * @constructor - * @param {Array} [entries] The key-value pairs to cache. - */ - function Stack(entries) { - var data = this.__data__ = new ListCache(entries); - this.size = data.size; - } - - /** - * Removes all key-value entries from the stack. - * - * @private - * @name clear - * @memberOf Stack - */ - function stackClear() { - this.__data__ = new ListCache; - this.size = 0; - } - - /** - * Removes `key` and its value from the stack. - * - * @private - * @name delete - * @memberOf Stack - * @param {string} key The key of the value to remove. - * @returns {boolean} Returns `true` if the entry was removed, else `false`. - */ - function stackDelete(key) { - var data = this.__data__, - result = data['delete'](key); - - this.size = data.size; - return result; - } - - /** - * Gets the stack value for `key`. - * - * @private - * @name get - * @memberOf Stack - * @param {string} key The key of the value to get. - * @returns {*} Returns the entry value. - */ - function stackGet(key) { - return this.__data__.get(key); - } - - /** - * Checks if a stack value for `key` exists. - * - * @private - * @name has - * @memberOf Stack - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ - function stackHas(key) { - return this.__data__.has(key); - } - - /** - * Sets the stack `key` to `value`. - * - * @private - * @name set - * @memberOf Stack - * @param {string} key The key of the value to set. - * @param {*} value The value to set. - * @returns {Object} Returns the stack cache instance. - */ - function stackSet(key, value) { - var data = this.__data__; - if (data instanceof ListCache) { - var pairs = data.__data__; - if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) { - pairs.push([key, value]); - this.size = ++data.size; - return this; - } - data = this.__data__ = new MapCache(pairs); - } - data.set(key, value); - this.size = data.size; - return this; - } - - // Add methods to `Stack`. - Stack.prototype.clear = stackClear; - Stack.prototype['delete'] = stackDelete; - Stack.prototype.get = stackGet; - Stack.prototype.has = stackHas; - Stack.prototype.set = stackSet; - - /*------------------------------------------------------------------------*/ - - /** - * Creates an array of the enumerable property names of the array-like `value`. - * - * @private - * @param {*} value The value to query. - * @param {boolean} inherited Specify returning inherited property names. - * @returns {Array} Returns the array of property names. - */ - function arrayLikeKeys(value, inherited) { - var isArr = isArray(value), - isArg = !isArr && isArguments(value), - isBuff = !isArr && !isArg && isBuffer(value), - isType = !isArr && !isArg && !isBuff && isTypedArray(value), - skipIndexes = isArr || isArg || isBuff || isType, - result = skipIndexes ? baseTimes(value.length, String) : [], - length = result.length; - - for (var key in value) { - if ((inherited || hasOwnProperty.call(value, key)) && - !(skipIndexes && ( - // Safari 9 has enumerable `arguments.length` in strict mode. - key == 'length' || - // Node.js 0.10 has enumerable non-index properties on buffers. - (isBuff && (key == 'offset' || key == 'parent')) || - // PhantomJS 2 has enumerable non-index properties on typed arrays. - (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) || - // Skip index properties. - isIndex(key, length) - ))) { - result.push(key); - } - } - return result; - } - - /** - * A specialized version of `_.sample` for arrays. - * - * @private - * @param {Array} array The array to sample. - * @returns {*} Returns the random element. - */ - function arraySample(array) { - var length = array.length; - return length ? array[baseRandom(0, length - 1)] : undefined; - } - - /** - * A specialized version of `_.sampleSize` for arrays. - * - * @private - * @param {Array} array The array to sample. - * @param {number} n The number of elements to sample. - * @returns {Array} Returns the random elements. - */ - function arraySampleSize(array, n) { - return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length)); - } - - /** - * A specialized version of `_.shuffle` for arrays. - * - * @private - * @param {Array} array The array to shuffle. - * @returns {Array} Returns the new shuffled array. - */ - function arrayShuffle(array) { - return shuffleSelf(copyArray(array)); - } - - /** - * This function is like `assignValue` except that it doesn't assign - * `undefined` values. - * - * @private - * @param {Object} object The object to modify. - * @param {string} key The key of the property to assign. - * @param {*} value The value to assign. - */ - function assignMergeValue(object, key, value) { - if ((value !== undefined && !eq(object[key], value)) || - (value === undefined && !(key in object))) { - baseAssignValue(object, key, value); - } - } - - /** - * Assigns `value` to `key` of `object` if the existing value is not equivalent - * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * for equality comparisons. - * - * @private - * @param {Object} object The object to modify. - * @param {string} key The key of the property to assign. - * @param {*} value The value to assign. - */ - function assignValue(object, key, value) { - var objValue = object[key]; - if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) || - (value === undefined && !(key in object))) { - baseAssignValue(object, key, value); - } - } - - /** - * Gets the index at which the `key` is found in `array` of key-value pairs. - * - * @private - * @param {Array} array The array to inspect. - * @param {*} key The key to search for. - * @returns {number} Returns the index of the matched value, else `-1`. - */ - function assocIndexOf(array, key) { - var length = array.length; - while (length--) { - if (eq(array[length][0], key)) { - return length; - } - } - return -1; - } - - /** - * Aggregates elements of `collection` on `accumulator` with keys transformed - * by `iteratee` and values set by `setter`. - * - * @private - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} setter The function to set `accumulator` values. - * @param {Function} iteratee The iteratee to transform keys. - * @param {Object} accumulator The initial aggregated object. - * @returns {Function} Returns `accumulator`. - */ - function baseAggregator(collection, setter, iteratee, accumulator) { - baseEach(collection, function(value, key, collection) { - setter(accumulator, value, iteratee(value), collection); - }); - return accumulator; - } - - /** - * The base implementation of `_.assign` without support for multiple sources - * or `customizer` functions. - * - * @private - * @param {Object} object The destination object. - * @param {Object} source The source object. - * @returns {Object} Returns `object`. - */ - function baseAssign(object, source) { - return object && copyObject(source, keys(source), object); - } - - /** - * The base implementation of `_.assignIn` without support for multiple sources - * or `customizer` functions. - * - * @private - * @param {Object} object The destination object. - * @param {Object} source The source object. - * @returns {Object} Returns `object`. - */ - function baseAssignIn(object, source) { - return object && copyObject(source, keysIn(source), object); - } - - /** - * The base implementation of `assignValue` and `assignMergeValue` without - * value checks. - * - * @private - * @param {Object} object The object to modify. - * @param {string} key The key of the property to assign. - * @param {*} value The value to assign. - */ - function baseAssignValue(object, key, value) { - if (key == '__proto__' && defineProperty) { - defineProperty(object, key, { - 'configurable': true, - 'enumerable': true, - 'value': value, - 'writable': true - }); - } else { - object[key] = value; - } - } - - /** - * The base implementation of `_.at` without support for individual paths. - * - * @private - * @param {Object} object The object to iterate over. - * @param {string[]} paths The property paths to pick. - * @returns {Array} Returns the picked elements. - */ - function baseAt(object, paths) { - var index = -1, - length = paths.length, - result = Array(length), - skip = object == null; - - while (++index < length) { - result[index] = skip ? undefined : get(object, paths[index]); - } - return result; - } - - /** - * The base implementation of `_.clamp` which doesn't coerce arguments. - * - * @private - * @param {number} number The number to clamp. - * @param {number} [lower] The lower bound. - * @param {number} upper The upper bound. - * @returns {number} Returns the clamped number. - */ - function baseClamp(number, lower, upper) { - if (number === number) { - if (upper !== undefined) { - number = number <= upper ? number : upper; - } - if (lower !== undefined) { - number = number >= lower ? number : lower; - } - } - return number; - } - - /** - * The base implementation of `_.clone` and `_.cloneDeep` which tracks - * traversed objects. - * - * @private - * @param {*} value The value to clone. - * @param {boolean} bitmask The bitmask flags. - * 1 - Deep clone - * 2 - Flatten inherited properties - * 4 - Clone symbols - * @param {Function} [customizer] The function to customize cloning. - * @param {string} [key] The key of `value`. - * @param {Object} [object] The parent object of `value`. - * @param {Object} [stack] Tracks traversed objects and their clone counterparts. - * @returns {*} Returns the cloned value. - */ - function baseClone(value, bitmask, customizer, key, object, stack) { - var result, - isDeep = bitmask & CLONE_DEEP_FLAG, - isFlat = bitmask & CLONE_FLAT_FLAG, - isFull = bitmask & CLONE_SYMBOLS_FLAG; - - if (customizer) { - result = object ? customizer(value, key, object, stack) : customizer(value); - } - if (result !== undefined) { - return result; - } - if (!isObject(value)) { - return value; - } - var isArr = isArray(value); - if (isArr) { - result = initCloneArray(value); - if (!isDeep) { - return copyArray(value, result); - } - } else { - var tag = getTag(value), - isFunc = tag == funcTag || tag == genTag; - - if (isBuffer(value)) { - return cloneBuffer(value, isDeep); - } - if (tag == objectTag || tag == argsTag || (isFunc && !object)) { - result = (isFlat || isFunc) ? {} : initCloneObject(value); - if (!isDeep) { - return isFlat - ? copySymbolsIn(value, baseAssignIn(result, value)) - : copySymbols(value, baseAssign(result, value)); - } - } else { - if (!cloneableTags[tag]) { - return object ? value : {}; - } - result = initCloneByTag(value, tag, isDeep); - } - } - // Check for circular references and return its corresponding clone. - stack || (stack = new Stack); - var stacked = stack.get(value); - if (stacked) { - return stacked; - } - stack.set(value, result); - - if (isSet(value)) { - value.forEach(function(subValue) { - result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack)); - }); - } else if (isMap(value)) { - value.forEach(function(subValue, key) { - result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack)); - }); - } - - var keysFunc = isFull - ? (isFlat ? getAllKeysIn : getAllKeys) - : (isFlat ? keysIn : keys); - - var props = isArr ? undefined : keysFunc(value); - arrayEach(props || value, function(subValue, key) { - if (props) { - key = subValue; - subValue = value[key]; - } - // Recursively populate clone (susceptible to call stack limits). - assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack)); - }); - return result; - } - - /** - * The base implementation of `_.conforms` which doesn't clone `source`. - * - * @private - * @param {Object} source The object of property predicates to conform to. - * @returns {Function} Returns the new spec function. - */ - function baseConforms(source) { - var props = keys(source); - return function(object) { - return baseConformsTo(object, source, props); - }; - } - - /** - * The base implementation of `_.conformsTo` which accepts `props` to check. - * - * @private - * @param {Object} object The object to inspect. - * @param {Object} source The object of property predicates to conform to. - * @returns {boolean} Returns `true` if `object` conforms, else `false`. - */ - function baseConformsTo(object, source, props) { - var length = props.length; - if (object == null) { - return !length; - } - object = Object(object); - while (length--) { - var key = props[length], - predicate = source[key], - value = object[key]; - - if ((value === undefined && !(key in object)) || !predicate(value)) { - return false; - } - } - return true; - } - - /** - * The base implementation of `_.delay` and `_.defer` which accepts `args` - * to provide to `func`. - * - * @private - * @param {Function} func The function to delay. - * @param {number} wait The number of milliseconds to delay invocation. - * @param {Array} args The arguments to provide to `func`. - * @returns {number|Object} Returns the timer id or timeout object. - */ - function baseDelay(func, wait, args) { - if (typeof func != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - return setTimeout(function() { func.apply(undefined, args); }, wait); - } - - /** - * The base implementation of methods like `_.difference` without support - * for excluding multiple arrays or iteratee shorthands. - * - * @private - * @param {Array} array The array to inspect. - * @param {Array} values The values to exclude. - * @param {Function} [iteratee] The iteratee invoked per element. - * @param {Function} [comparator] The comparator invoked per element. - * @returns {Array} Returns the new array of filtered values. - */ - function baseDifference(array, values, iteratee, comparator) { - var index = -1, - includes = arrayIncludes, - isCommon = true, - length = array.length, - result = [], - valuesLength = values.length; - - if (!length) { - return result; - } - if (iteratee) { - values = arrayMap(values, baseUnary(iteratee)); - } - if (comparator) { - includes = arrayIncludesWith; - isCommon = false; - } - else if (values.length >= LARGE_ARRAY_SIZE) { - includes = cacheHas; - isCommon = false; - values = new SetCache(values); - } - outer: - while (++index < length) { - var value = array[index], - computed = iteratee == null ? value : iteratee(value); - - value = (comparator || value !== 0) ? value : 0; - if (isCommon && computed === computed) { - var valuesIndex = valuesLength; - while (valuesIndex--) { - if (values[valuesIndex] === computed) { - continue outer; - } - } - result.push(value); - } - else if (!includes(values, computed, comparator)) { - result.push(value); - } - } - return result; - } - - /** - * The base implementation of `_.forEach` without support for iteratee shorthands. - * - * @private - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Array|Object} Returns `collection`. - */ - var baseEach = createBaseEach(baseForOwn); - - /** - * The base implementation of `_.forEachRight` without support for iteratee shorthands. - * - * @private - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Array|Object} Returns `collection`. - */ - var baseEachRight = createBaseEach(baseForOwnRight, true); - - /** - * The base implementation of `_.every` without support for iteratee shorthands. - * - * @private - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} predicate The function invoked per iteration. - * @returns {boolean} Returns `true` if all elements pass the predicate check, - * else `false` - */ - function baseEvery(collection, predicate) { - var result = true; - baseEach(collection, function(value, index, collection) { - result = !!predicate(value, index, collection); - return result; - }); - return result; - } - - /** - * The base implementation of methods like `_.max` and `_.min` which accepts a - * `comparator` to determine the extremum value. - * - * @private - * @param {Array} array The array to iterate over. - * @param {Function} iteratee The iteratee invoked per iteration. - * @param {Function} comparator The comparator used to compare values. - * @returns {*} Returns the extremum value. - */ - function baseExtremum(array, iteratee, comparator) { - var index = -1, - length = array.length; - - while (++index < length) { - var value = array[index], - current = iteratee(value); - - if (current != null && (computed === undefined - ? (current === current && !isSymbol(current)) - : comparator(current, computed) - )) { - var computed = current, - result = value; - } - } - return result; - } - - /** - * The base implementation of `_.fill` without an iteratee call guard. - * - * @private - * @param {Array} array The array to fill. - * @param {*} value The value to fill `array` with. - * @param {number} [start=0] The start position. - * @param {number} [end=array.length] The end position. - * @returns {Array} Returns `array`. - */ - function baseFill(array, value, start, end) { - var length = array.length; - - start = toInteger(start); - if (start < 0) { - start = -start > length ? 0 : (length + start); - } - end = (end === undefined || end > length) ? length : toInteger(end); - if (end < 0) { - end += length; - } - end = start > end ? 0 : toLength(end); - while (start < end) { - array[start++] = value; - } - return array; - } - - /** - * The base implementation of `_.filter` without support for iteratee shorthands. - * - * @private - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} predicate The function invoked per iteration. - * @returns {Array} Returns the new filtered array. - */ - function baseFilter(collection, predicate) { - var result = []; - baseEach(collection, function(value, index, collection) { - if (predicate(value, index, collection)) { - result.push(value); - } - }); - return result; - } - - /** - * The base implementation of `_.flatten` with support for restricting flattening. - * - * @private - * @param {Array} array The array to flatten. - * @param {number} depth The maximum recursion depth. - * @param {boolean} [predicate=isFlattenable] The function invoked per iteration. - * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks. - * @param {Array} [result=[]] The initial result value. - * @returns {Array} Returns the new flattened array. - */ - function baseFlatten(array, depth, predicate, isStrict, result) { - var index = -1, - length = array.length; - - predicate || (predicate = isFlattenable); - result || (result = []); - - while (++index < length) { - var value = array[index]; - if (depth > 0 && predicate(value)) { - if (depth > 1) { - // Recursively flatten arrays (susceptible to call stack limits). - baseFlatten(value, depth - 1, predicate, isStrict, result); - } else { - arrayPush(result, value); - } - } else if (!isStrict) { - result[result.length] = value; - } - } - return result; - } - - /** - * The base implementation of `baseForOwn` which iterates over `object` - * properties returned by `keysFunc` and invokes `iteratee` for each property. - * Iteratee functions may exit iteration early by explicitly returning `false`. - * - * @private - * @param {Object} object The object to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @param {Function} keysFunc The function to get the keys of `object`. - * @returns {Object} Returns `object`. - */ - var baseFor = createBaseFor(); - - /** - * This function is like `baseFor` except that it iterates over properties - * in the opposite order. - * - * @private - * @param {Object} object The object to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @param {Function} keysFunc The function to get the keys of `object`. - * @returns {Object} Returns `object`. - */ - var baseForRight = createBaseFor(true); - - /** - * The base implementation of `_.forOwn` without support for iteratee shorthands. - * - * @private - * @param {Object} object The object to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Object} Returns `object`. - */ - function baseForOwn(object, iteratee) { - return object && baseFor(object, iteratee, keys); - } - - /** - * The base implementation of `_.forOwnRight` without support for iteratee shorthands. - * - * @private - * @param {Object} object The object to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Object} Returns `object`. - */ - function baseForOwnRight(object, iteratee) { - return object && baseForRight(object, iteratee, keys); - } - - /** - * The base implementation of `_.functions` which creates an array of - * `object` function property names filtered from `props`. - * - * @private - * @param {Object} object The object to inspect. - * @param {Array} props The property names to filter. - * @returns {Array} Returns the function names. - */ - function baseFunctions(object, props) { - return arrayFilter(props, function(key) { - return isFunction(object[key]); - }); - } - - /** - * The base implementation of `_.get` without support for default values. - * - * @private - * @param {Object} object The object to query. - * @param {Array|string} path The path of the property to get. - * @returns {*} Returns the resolved value. - */ - function baseGet(object, path) { - path = castPath(path, object); - - var index = 0, - length = path.length; - - while (object != null && index < length) { - object = object[toKey(path[index++])]; - } - return (index && index == length) ? object : undefined; - } - - /** - * The base implementation of `getAllKeys` and `getAllKeysIn` which uses - * `keysFunc` and `symbolsFunc` to get the enumerable property names and - * symbols of `object`. - * - * @private - * @param {Object} object The object to query. - * @param {Function} keysFunc The function to get the keys of `object`. - * @param {Function} symbolsFunc The function to get the symbols of `object`. - * @returns {Array} Returns the array of property names and symbols. - */ - function baseGetAllKeys(object, keysFunc, symbolsFunc) { - var result = keysFunc(object); - return isArray(object) ? result : arrayPush(result, symbolsFunc(object)); - } - - /** - * The base implementation of `getTag` without fallbacks for buggy environments. - * - * @private - * @param {*} value The value to query. - * @returns {string} Returns the `toStringTag`. - */ - function baseGetTag(value) { - if (value == null) { - return value === undefined ? undefinedTag : nullTag; - } - return (symToStringTag && symToStringTag in Object(value)) - ? getRawTag(value) - : objectToString(value); - } - - /** - * The base implementation of `_.gt` which doesn't coerce arguments. - * - * @private - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @returns {boolean} Returns `true` if `value` is greater than `other`, - * else `false`. - */ - function baseGt(value, other) { - return value > other; - } - - /** - * The base implementation of `_.has` without support for deep paths. - * - * @private - * @param {Object} [object] The object to query. - * @param {Array|string} key The key to check. - * @returns {boolean} Returns `true` if `key` exists, else `false`. - */ - function baseHas(object, key) { - return object != null && hasOwnProperty.call(object, key); - } - - /** - * The base implementation of `_.hasIn` without support for deep paths. - * - * @private - * @param {Object} [object] The object to query. - * @param {Array|string} key The key to check. - * @returns {boolean} Returns `true` if `key` exists, else `false`. - */ - function baseHasIn(object, key) { - return object != null && key in Object(object); - } - - /** - * The base implementation of `_.inRange` which doesn't coerce arguments. - * - * @private - * @param {number} number The number to check. - * @param {number} start The start of the range. - * @param {number} end The end of the range. - * @returns {boolean} Returns `true` if `number` is in the range, else `false`. - */ - function baseInRange(number, start, end) { - return number >= nativeMin(start, end) && number < nativeMax(start, end); - } - - /** - * The base implementation of methods like `_.intersection`, without support - * for iteratee shorthands, that accepts an array of arrays to inspect. - * - * @private - * @param {Array} arrays The arrays to inspect. - * @param {Function} [iteratee] The iteratee invoked per element. - * @param {Function} [comparator] The comparator invoked per element. - * @returns {Array} Returns the new array of shared values. - */ - function baseIntersection(arrays, iteratee, comparator) { - var includes = comparator ? arrayIncludesWith : arrayIncludes, - length = arrays[0].length, - othLength = arrays.length, - othIndex = othLength, - caches = Array(othLength), - maxLength = Infinity, - result = []; - - while (othIndex--) { - var array = arrays[othIndex]; - if (othIndex && iteratee) { - array = arrayMap(array, baseUnary(iteratee)); - } - maxLength = nativeMin(array.length, maxLength); - caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120)) - ? new SetCache(othIndex && array) - : undefined; - } - array = arrays[0]; - - var index = -1, - seen = caches[0]; - - outer: - while (++index < length && result.length < maxLength) { - var value = array[index], - computed = iteratee ? iteratee(value) : value; - - value = (comparator || value !== 0) ? value : 0; - if (!(seen - ? cacheHas(seen, computed) - : includes(result, computed, comparator) - )) { - othIndex = othLength; - while (--othIndex) { - var cache = caches[othIndex]; - if (!(cache - ? cacheHas(cache, computed) - : includes(arrays[othIndex], computed, comparator)) - ) { - continue outer; - } - } - if (seen) { - seen.push(computed); - } - result.push(value); - } - } - return result; - } - - /** - * The base implementation of `_.invert` and `_.invertBy` which inverts - * `object` with values transformed by `iteratee` and set by `setter`. - * - * @private - * @param {Object} object The object to iterate over. - * @param {Function} setter The function to set `accumulator` values. - * @param {Function} iteratee The iteratee to transform values. - * @param {Object} accumulator The initial inverted object. - * @returns {Function} Returns `accumulator`. - */ - function baseInverter(object, setter, iteratee, accumulator) { - baseForOwn(object, function(value, key, object) { - setter(accumulator, iteratee(value), key, object); - }); - return accumulator; - } - - /** - * The base implementation of `_.invoke` without support for individual - * method arguments. - * - * @private - * @param {Object} object The object to query. - * @param {Array|string} path The path of the method to invoke. - * @param {Array} args The arguments to invoke the method with. - * @returns {*} Returns the result of the invoked method. - */ - function baseInvoke(object, path, args) { - path = castPath(path, object); - object = parent(object, path); - var func = object == null ? object : object[toKey(last(path))]; - return func == null ? undefined : apply(func, object, args); - } - - /** - * The base implementation of `_.isArguments`. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an `arguments` object, - */ - function baseIsArguments(value) { - return isObjectLike(value) && baseGetTag(value) == argsTag; - } - - /** - * The base implementation of `_.isArrayBuffer` without Node.js optimizations. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`. - */ - function baseIsArrayBuffer(value) { - return isObjectLike(value) && baseGetTag(value) == arrayBufferTag; - } - - /** - * The base implementation of `_.isDate` without Node.js optimizations. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a date object, else `false`. - */ - function baseIsDate(value) { - return isObjectLike(value) && baseGetTag(value) == dateTag; - } - - /** - * The base implementation of `_.isEqual` which supports partial comparisons - * and tracks traversed objects. - * - * @private - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @param {boolean} bitmask The bitmask flags. - * 1 - Unordered comparison - * 2 - Partial comparison - * @param {Function} [customizer] The function to customize comparisons. - * @param {Object} [stack] Tracks traversed `value` and `other` objects. - * @returns {boolean} Returns `true` if the values are equivalent, else `false`. - */ - function baseIsEqual(value, other, bitmask, customizer, stack) { - if (value === other) { - return true; - } - if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) { - return value !== value && other !== other; - } - return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack); - } - - /** - * A specialized version of `baseIsEqual` for arrays and objects which performs - * deep comparisons and tracks traversed objects enabling objects with circular - * references to be compared. - * - * @private - * @param {Object} object The object to compare. - * @param {Object} other The other object to compare. - * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. - * @param {Function} customizer The function to customize comparisons. - * @param {Function} equalFunc The function to determine equivalents of values. - * @param {Object} [stack] Tracks traversed `object` and `other` objects. - * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. - */ - function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { - var objIsArr = isArray(object), - othIsArr = isArray(other), - objTag = objIsArr ? arrayTag : getTag(object), - othTag = othIsArr ? arrayTag : getTag(other); - - objTag = objTag == argsTag ? objectTag : objTag; - othTag = othTag == argsTag ? objectTag : othTag; - - var objIsObj = objTag == objectTag, - othIsObj = othTag == objectTag, - isSameTag = objTag == othTag; - - if (isSameTag && isBuffer(object)) { - if (!isBuffer(other)) { - return false; - } - objIsArr = true; - objIsObj = false; - } - if (isSameTag && !objIsObj) { - stack || (stack = new Stack); - return (objIsArr || isTypedArray(object)) - ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) - : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack); - } - if (!(bitmask & COMPARE_PARTIAL_FLAG)) { - var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), - othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); - - if (objIsWrapped || othIsWrapped) { - var objUnwrapped = objIsWrapped ? object.value() : object, - othUnwrapped = othIsWrapped ? other.value() : other; - - stack || (stack = new Stack); - return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack); - } - } - if (!isSameTag) { - return false; - } - stack || (stack = new Stack); - return equalObjects(object, other, bitmask, customizer, equalFunc, stack); - } - - /** - * The base implementation of `_.isMap` without Node.js optimizations. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a map, else `false`. - */ - function baseIsMap(value) { - return isObjectLike(value) && getTag(value) == mapTag; - } - - /** - * The base implementation of `_.isMatch` without support for iteratee shorthands. - * - * @private - * @param {Object} object The object to inspect. - * @param {Object} source The object of property values to match. - * @param {Array} matchData The property names, values, and compare flags to match. - * @param {Function} [customizer] The function to customize comparisons. - * @returns {boolean} Returns `true` if `object` is a match, else `false`. - */ - function baseIsMatch(object, source, matchData, customizer) { - var index = matchData.length, - length = index, - noCustomizer = !customizer; - - if (object == null) { - return !length; - } - object = Object(object); - while (index--) { - var data = matchData[index]; - if ((noCustomizer && data[2]) - ? data[1] !== object[data[0]] - : !(data[0] in object) - ) { - return false; - } - } - while (++index < length) { - data = matchData[index]; - var key = data[0], - objValue = object[key], - srcValue = data[1]; - - if (noCustomizer && data[2]) { - if (objValue === undefined && !(key in object)) { - return false; - } - } else { - var stack = new Stack; - if (customizer) { - var result = customizer(objValue, srcValue, key, object, source, stack); - } - if (!(result === undefined - ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack) - : result - )) { - return false; - } - } - } - return true; - } - - /** - * The base implementation of `_.isNative` without bad shim checks. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a native function, - * else `false`. - */ - function baseIsNative(value) { - if (!isObject(value) || isMasked(value)) { - return false; - } - var pattern = isFunction(value) ? reIsNative : reIsHostCtor; - return pattern.test(toSource(value)); - } - - /** - * The base implementation of `_.isRegExp` without Node.js optimizations. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a regexp, else `false`. - */ - function baseIsRegExp(value) { - return isObjectLike(value) && baseGetTag(value) == regexpTag; - } - - /** - * The base implementation of `_.isSet` without Node.js optimizations. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a set, else `false`. - */ - function baseIsSet(value) { - return isObjectLike(value) && getTag(value) == setTag; - } - - /** - * The base implementation of `_.isTypedArray` without Node.js optimizations. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. - */ - function baseIsTypedArray(value) { - return isObjectLike(value) && - isLength(value.length) && !!typedArrayTags[baseGetTag(value)]; - } - - /** - * The base implementation of `_.iteratee`. - * - * @private - * @param {*} [value=_.identity] The value to convert to an iteratee. - * @returns {Function} Returns the iteratee. - */ - function baseIteratee(value) { - // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9. - // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details. - if (typeof value == 'function') { - return value; - } - if (value == null) { - return identity; - } - if (typeof value == 'object') { - return isArray(value) - ? baseMatchesProperty(value[0], value[1]) - : baseMatches(value); - } - return property(value); - } - - /** - * The base implementation of `_.keys` which doesn't treat sparse arrays as dense. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names. - */ - function baseKeys(object) { - if (!isPrototype(object)) { - return nativeKeys(object); - } - var result = []; - for (var key in Object(object)) { - if (hasOwnProperty.call(object, key) && key != 'constructor') { - result.push(key); - } - } - return result; - } - - /** - * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names. - */ - function baseKeysIn(object) { - if (!isObject(object)) { - return nativeKeysIn(object); - } - var isProto = isPrototype(object), - result = []; - - for (var key in object) { - if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) { - result.push(key); - } - } - return result; - } - - /** - * The base implementation of `_.lt` which doesn't coerce arguments. - * - * @private - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @returns {boolean} Returns `true` if `value` is less than `other`, - * else `false`. - */ - function baseLt(value, other) { - return value < other; - } - - /** - * The base implementation of `_.map` without support for iteratee shorthands. - * - * @private - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Array} Returns the new mapped array. - */ - function baseMap(collection, iteratee) { - var index = -1, - result = isArrayLike(collection) ? Array(collection.length) : []; - - baseEach(collection, function(value, key, collection) { - result[++index] = iteratee(value, key, collection); - }); - return result; - } - - /** - * The base implementation of `_.matches` which doesn't clone `source`. - * - * @private - * @param {Object} source The object of property values to match. - * @returns {Function} Returns the new spec function. - */ - function baseMatches(source) { - var matchData = getMatchData(source); - if (matchData.length == 1 && matchData[0][2]) { - return matchesStrictComparable(matchData[0][0], matchData[0][1]); - } - return function(object) { - return object === source || baseIsMatch(object, source, matchData); - }; - } - - /** - * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`. - * - * @private - * @param {string} path The path of the property to get. - * @param {*} srcValue The value to match. - * @returns {Function} Returns the new spec function. - */ - function baseMatchesProperty(path, srcValue) { - if (isKey(path) && isStrictComparable(srcValue)) { - return matchesStrictComparable(toKey(path), srcValue); - } - return function(object) { - var objValue = get(object, path); - return (objValue === undefined && objValue === srcValue) - ? hasIn(object, path) - : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG); - }; - } - - /** - * The base implementation of `_.merge` without support for multiple sources. - * - * @private - * @param {Object} object The destination object. - * @param {Object} source The source object. - * @param {number} srcIndex The index of `source`. - * @param {Function} [customizer] The function to customize merged values. - * @param {Object} [stack] Tracks traversed source values and their merged - * counterparts. - */ - function baseMerge(object, source, srcIndex, customizer, stack) { - if (object === source) { - return; - } - baseFor(source, function(srcValue, key) { - stack || (stack = new Stack); - if (isObject(srcValue)) { - baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack); - } - else { - var newValue = customizer - ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack) - : undefined; - - if (newValue === undefined) { - newValue = srcValue; - } - assignMergeValue(object, key, newValue); - } - }, keysIn); - } - - /** - * A specialized version of `baseMerge` for arrays and objects which performs - * deep merges and tracks traversed objects enabling objects with circular - * references to be merged. - * - * @private - * @param {Object} object The destination object. - * @param {Object} source The source object. - * @param {string} key The key of the value to merge. - * @param {number} srcIndex The index of `source`. - * @param {Function} mergeFunc The function to merge values. - * @param {Function} [customizer] The function to customize assigned values. - * @param {Object} [stack] Tracks traversed source values and their merged - * counterparts. - */ - function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) { - var objValue = safeGet(object, key), - srcValue = safeGet(source, key), - stacked = stack.get(srcValue); - - if (stacked) { - assignMergeValue(object, key, stacked); - return; - } - var newValue = customizer - ? customizer(objValue, srcValue, (key + ''), object, source, stack) - : undefined; - - var isCommon = newValue === undefined; - - if (isCommon) { - var isArr = isArray(srcValue), - isBuff = !isArr && isBuffer(srcValue), - isTyped = !isArr && !isBuff && isTypedArray(srcValue); - - newValue = srcValue; - if (isArr || isBuff || isTyped) { - if (isArray(objValue)) { - newValue = objValue; - } - else if (isArrayLikeObject(objValue)) { - newValue = copyArray(objValue); - } - else if (isBuff) { - isCommon = false; - newValue = cloneBuffer(srcValue, true); - } - else if (isTyped) { - isCommon = false; - newValue = cloneTypedArray(srcValue, true); - } - else { - newValue = []; - } - } - else if (isPlainObject(srcValue) || isArguments(srcValue)) { - newValue = objValue; - if (isArguments(objValue)) { - newValue = toPlainObject(objValue); - } - else if (!isObject(objValue) || isFunction(objValue)) { - newValue = initCloneObject(srcValue); - } - } - else { - isCommon = false; - } - } - if (isCommon) { - // Recursively merge objects and arrays (susceptible to call stack limits). - stack.set(srcValue, newValue); - mergeFunc(newValue, srcValue, srcIndex, customizer, stack); - stack['delete'](srcValue); - } - assignMergeValue(object, key, newValue); - } - - /** - * The base implementation of `_.nth` which doesn't coerce arguments. - * - * @private - * @param {Array} array The array to query. - * @param {number} n The index of the element to return. - * @returns {*} Returns the nth element of `array`. - */ - function baseNth(array, n) { - var length = array.length; - if (!length) { - return; - } - n += n < 0 ? length : 0; - return isIndex(n, length) ? array[n] : undefined; - } - - /** - * The base implementation of `_.orderBy` without param guards. - * - * @private - * @param {Array|Object} collection The collection to iterate over. - * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by. - * @param {string[]} orders The sort orders of `iteratees`. - * @returns {Array} Returns the new sorted array. - */ - function baseOrderBy(collection, iteratees, orders) { - if (iteratees.length) { - iteratees = arrayMap(iteratees, function(iteratee) { - if (isArray(iteratee)) { - return function(value) { - return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee); - } - } - return iteratee; - }); - } else { - iteratees = [identity]; - } - - var index = -1; - iteratees = arrayMap(iteratees, baseUnary(getIteratee())); - - var result = baseMap(collection, function(value, key, collection) { - var criteria = arrayMap(iteratees, function(iteratee) { - return iteratee(value); - }); - return { 'criteria': criteria, 'index': ++index, 'value': value }; - }); - - return baseSortBy(result, function(object, other) { - return compareMultiple(object, other, orders); - }); - } - - /** - * The base implementation of `_.pick` without support for individual - * property identifiers. - * - * @private - * @param {Object} object The source object. - * @param {string[]} paths The property paths to pick. - * @returns {Object} Returns the new object. - */ - function basePick(object, paths) { - return basePickBy(object, paths, function(value, path) { - return hasIn(object, path); - }); - } - - /** - * The base implementation of `_.pickBy` without support for iteratee shorthands. - * - * @private - * @param {Object} object The source object. - * @param {string[]} paths The property paths to pick. - * @param {Function} predicate The function invoked per property. - * @returns {Object} Returns the new object. - */ - function basePickBy(object, paths, predicate) { - var index = -1, - length = paths.length, - result = {}; - - while (++index < length) { - var path = paths[index], - value = baseGet(object, path); - - if (predicate(value, path)) { - baseSet(result, castPath(path, object), value); - } - } - return result; - } - - /** - * A specialized version of `baseProperty` which supports deep paths. - * - * @private - * @param {Array|string} path The path of the property to get. - * @returns {Function} Returns the new accessor function. - */ - function basePropertyDeep(path) { - return function(object) { - return baseGet(object, path); - }; - } - - /** - * The base implementation of `_.pullAllBy` without support for iteratee - * shorthands. - * - * @private - * @param {Array} array The array to modify. - * @param {Array} values The values to remove. - * @param {Function} [iteratee] The iteratee invoked per element. - * @param {Function} [comparator] The comparator invoked per element. - * @returns {Array} Returns `array`. - */ - function basePullAll(array, values, iteratee, comparator) { - var indexOf = comparator ? baseIndexOfWith : baseIndexOf, - index = -1, - length = values.length, - seen = array; - - if (array === values) { - values = copyArray(values); - } - if (iteratee) { - seen = arrayMap(array, baseUnary(iteratee)); - } - while (++index < length) { - var fromIndex = 0, - value = values[index], - computed = iteratee ? iteratee(value) : value; - - while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) { - if (seen !== array) { - splice.call(seen, fromIndex, 1); - } - splice.call(array, fromIndex, 1); - } - } - return array; - } - - /** - * The base implementation of `_.pullAt` without support for individual - * indexes or capturing the removed elements. - * - * @private - * @param {Array} array The array to modify. - * @param {number[]} indexes The indexes of elements to remove. - * @returns {Array} Returns `array`. - */ - function basePullAt(array, indexes) { - var length = array ? indexes.length : 0, - lastIndex = length - 1; - - while (length--) { - var index = indexes[length]; - if (length == lastIndex || index !== previous) { - var previous = index; - if (isIndex(index)) { - splice.call(array, index, 1); - } else { - baseUnset(array, index); - } - } - } - return array; - } - - /** - * The base implementation of `_.random` without support for returning - * floating-point numbers. - * - * @private - * @param {number} lower The lower bound. - * @param {number} upper The upper bound. - * @returns {number} Returns the random number. - */ - function baseRandom(lower, upper) { - return lower + nativeFloor(nativeRandom() * (upper - lower + 1)); - } - - /** - * The base implementation of `_.range` and `_.rangeRight` which doesn't - * coerce arguments. - * - * @private - * @param {number} start The start of the range. - * @param {number} end The end of the range. - * @param {number} step The value to increment or decrement by. - * @param {boolean} [fromRight] Specify iterating from right to left. - * @returns {Array} Returns the range of numbers. - */ - function baseRange(start, end, step, fromRight) { - var index = -1, - length = nativeMax(nativeCeil((end - start) / (step || 1)), 0), - result = Array(length); - - while (length--) { - result[fromRight ? length : ++index] = start; - start += step; - } - return result; - } - - /** - * The base implementation of `_.repeat` which doesn't coerce arguments. - * - * @private - * @param {string} string The string to repeat. - * @param {number} n The number of times to repeat the string. - * @returns {string} Returns the repeated string. - */ - function baseRepeat(string, n) { - var result = ''; - if (!string || n < 1 || n > MAX_SAFE_INTEGER) { - return result; - } - // Leverage the exponentiation by squaring algorithm for a faster repeat. - // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details. - do { - if (n % 2) { - result += string; - } - n = nativeFloor(n / 2); - if (n) { - string += string; - } - } while (n); - - return result; - } - - /** - * The base implementation of `_.rest` which doesn't validate or coerce arguments. - * - * @private - * @param {Function} func The function to apply a rest parameter to. - * @param {number} [start=func.length-1] The start position of the rest parameter. - * @returns {Function} Returns the new function. - */ - function baseRest(func, start) { - return setToString(overRest(func, start, identity), func + ''); - } - - /** - * The base implementation of `_.sample`. - * - * @private - * @param {Array|Object} collection The collection to sample. - * @returns {*} Returns the random element. - */ - function baseSample(collection) { - return arraySample(values(collection)); - } - - /** - * The base implementation of `_.sampleSize` without param guards. - * - * @private - * @param {Array|Object} collection The collection to sample. - * @param {number} n The number of elements to sample. - * @returns {Array} Returns the random elements. - */ - function baseSampleSize(collection, n) { - var array = values(collection); - return shuffleSelf(array, baseClamp(n, 0, array.length)); - } - - /** - * The base implementation of `_.set`. - * - * @private - * @param {Object} object The object to modify. - * @param {Array|string} path The path of the property to set. - * @param {*} value The value to set. - * @param {Function} [customizer] The function to customize path creation. - * @returns {Object} Returns `object`. - */ - function baseSet(object, path, value, customizer) { - if (!isObject(object)) { - return object; - } - path = castPath(path, object); - - var index = -1, - length = path.length, - lastIndex = length - 1, - nested = object; - - while (nested != null && ++index < length) { - var key = toKey(path[index]), - newValue = value; - - if (key === '__proto__' || key === 'constructor' || key === 'prototype') { - return object; - } - - if (index != lastIndex) { - var objValue = nested[key]; - newValue = customizer ? customizer(objValue, key, nested) : undefined; - if (newValue === undefined) { - newValue = isObject(objValue) - ? objValue - : (isIndex(path[index + 1]) ? [] : {}); - } - } - assignValue(nested, key, newValue); - nested = nested[key]; - } - return object; - } - - /** - * The base implementation of `setData` without support for hot loop shorting. - * - * @private - * @param {Function} func The function to associate metadata with. - * @param {*} data The metadata. - * @returns {Function} Returns `func`. - */ - var baseSetData = !metaMap ? identity : function(func, data) { - metaMap.set(func, data); - return func; - }; - - /** - * The base implementation of `setToString` without support for hot loop shorting. - * - * @private - * @param {Function} func The function to modify. - * @param {Function} string The `toString` result. - * @returns {Function} Returns `func`. - */ - var baseSetToString = !defineProperty ? identity : function(func, string) { - return defineProperty(func, 'toString', { - 'configurable': true, - 'enumerable': false, - 'value': constant(string), - 'writable': true - }); - }; - - /** - * The base implementation of `_.shuffle`. - * - * @private - * @param {Array|Object} collection The collection to shuffle. - * @returns {Array} Returns the new shuffled array. - */ - function baseShuffle(collection) { - return shuffleSelf(values(collection)); - } - - /** - * The base implementation of `_.slice` without an iteratee call guard. - * - * @private - * @param {Array} array The array to slice. - * @param {number} [start=0] The start position. - * @param {number} [end=array.length] The end position. - * @returns {Array} Returns the slice of `array`. - */ - function baseSlice(array, start, end) { - var index = -1, - length = array.length; - - if (start < 0) { - start = -start > length ? 0 : (length + start); - } - end = end > length ? length : end; - if (end < 0) { - end += length; - } - length = start > end ? 0 : ((end - start) >>> 0); - start >>>= 0; - - var result = Array(length); - while (++index < length) { - result[index] = array[index + start]; - } - return result; - } - - /** - * The base implementation of `_.some` without support for iteratee shorthands. - * - * @private - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} predicate The function invoked per iteration. - * @returns {boolean} Returns `true` if any element passes the predicate check, - * else `false`. - */ - function baseSome(collection, predicate) { - var result; - - baseEach(collection, function(value, index, collection) { - result = predicate(value, index, collection); - return !result; - }); - return !!result; - } - - /** - * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which - * performs a binary search of `array` to determine the index at which `value` - * should be inserted into `array` in order to maintain its sort order. - * - * @private - * @param {Array} array The sorted array to inspect. - * @param {*} value The value to evaluate. - * @param {boolean} [retHighest] Specify returning the highest qualified index. - * @returns {number} Returns the index at which `value` should be inserted - * into `array`. - */ - function baseSortedIndex(array, value, retHighest) { - var low = 0, - high = array == null ? low : array.length; - - if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) { - while (low < high) { - var mid = (low + high) >>> 1, - computed = array[mid]; - - if (computed !== null && !isSymbol(computed) && - (retHighest ? (computed <= value) : (computed < value))) { - low = mid + 1; - } else { - high = mid; - } - } - return high; - } - return baseSortedIndexBy(array, value, identity, retHighest); - } - - /** - * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy` - * which invokes `iteratee` for `value` and each element of `array` to compute - * their sort ranking. The iteratee is invoked with one argument; (value). - * - * @private - * @param {Array} array The sorted array to inspect. - * @param {*} value The value to evaluate. - * @param {Function} iteratee The iteratee invoked per element. - * @param {boolean} [retHighest] Specify returning the highest qualified index. - * @returns {number} Returns the index at which `value` should be inserted - * into `array`. - */ - function baseSortedIndexBy(array, value, iteratee, retHighest) { - var low = 0, - high = array == null ? 0 : array.length; - if (high === 0) { - return 0; - } - - value = iteratee(value); - var valIsNaN = value !== value, - valIsNull = value === null, - valIsSymbol = isSymbol(value), - valIsUndefined = value === undefined; - - while (low < high) { - var mid = nativeFloor((low + high) / 2), - computed = iteratee(array[mid]), - othIsDefined = computed !== undefined, - othIsNull = computed === null, - othIsReflexive = computed === computed, - othIsSymbol = isSymbol(computed); - - if (valIsNaN) { - var setLow = retHighest || othIsReflexive; - } else if (valIsUndefined) { - setLow = othIsReflexive && (retHighest || othIsDefined); - } else if (valIsNull) { - setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull); - } else if (valIsSymbol) { - setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol); - } else if (othIsNull || othIsSymbol) { - setLow = false; - } else { - setLow = retHighest ? (computed <= value) : (computed < value); - } - if (setLow) { - low = mid + 1; - } else { - high = mid; - } - } - return nativeMin(high, MAX_ARRAY_INDEX); - } - - /** - * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without - * support for iteratee shorthands. - * - * @private - * @param {Array} array The array to inspect. - * @param {Function} [iteratee] The iteratee invoked per element. - * @returns {Array} Returns the new duplicate free array. - */ - function baseSortedUniq(array, iteratee) { - var index = -1, - length = array.length, - resIndex = 0, - result = []; - - while (++index < length) { - var value = array[index], - computed = iteratee ? iteratee(value) : value; - - if (!index || !eq(computed, seen)) { - var seen = computed; - result[resIndex++] = value === 0 ? 0 : value; - } - } - return result; - } - - /** - * The base implementation of `_.toNumber` which doesn't ensure correct - * conversions of binary, hexadecimal, or octal string values. - * - * @private - * @param {*} value The value to process. - * @returns {number} Returns the number. - */ - function baseToNumber(value) { - if (typeof value == 'number') { - return value; - } - if (isSymbol(value)) { - return NAN; - } - return +value; - } - - /** - * The base implementation of `_.toString` which doesn't convert nullish - * values to empty strings. - * - * @private - * @param {*} value The value to process. - * @returns {string} Returns the string. - */ - function baseToString(value) { - // Exit early for strings to avoid a performance hit in some environments. - if (typeof value == 'string') { - return value; - } - if (isArray(value)) { - // Recursively convert values (susceptible to call stack limits). - return arrayMap(value, baseToString) + ''; - } - if (isSymbol(value)) { - return symbolToString ? symbolToString.call(value) : ''; - } - var result = (value + ''); - return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; - } - - /** - * The base implementation of `_.uniqBy` without support for iteratee shorthands. - * - * @private - * @param {Array} array The array to inspect. - * @param {Function} [iteratee] The iteratee invoked per element. - * @param {Function} [comparator] The comparator invoked per element. - * @returns {Array} Returns the new duplicate free array. - */ - function baseUniq(array, iteratee, comparator) { - var index = -1, - includes = arrayIncludes, - length = array.length, - isCommon = true, - result = [], - seen = result; - - if (comparator) { - isCommon = false; - includes = arrayIncludesWith; - } - else if (length >= LARGE_ARRAY_SIZE) { - var set = iteratee ? null : createSet(array); - if (set) { - return setToArray(set); - } - isCommon = false; - includes = cacheHas; - seen = new SetCache; - } - else { - seen = iteratee ? [] : result; - } - outer: - while (++index < length) { - var value = array[index], - computed = iteratee ? iteratee(value) : value; - - value = (comparator || value !== 0) ? value : 0; - if (isCommon && computed === computed) { - var seenIndex = seen.length; - while (seenIndex--) { - if (seen[seenIndex] === computed) { - continue outer; - } - } - if (iteratee) { - seen.push(computed); - } - result.push(value); - } - else if (!includes(seen, computed, comparator)) { - if (seen !== result) { - seen.push(computed); - } - result.push(value); - } - } - return result; - } - - /** - * The base implementation of `_.unset`. - * - * @private - * @param {Object} object The object to modify. - * @param {Array|string} path The property path to unset. - * @returns {boolean} Returns `true` if the property is deleted, else `false`. - */ - function baseUnset(object, path) { - path = castPath(path, object); - object = parent(object, path); - return object == null || delete object[toKey(last(path))]; - } - - /** - * The base implementation of `_.update`. - * - * @private - * @param {Object} object The object to modify. - * @param {Array|string} path The path of the property to update. - * @param {Function} updater The function to produce the updated value. - * @param {Function} [customizer] The function to customize path creation. - * @returns {Object} Returns `object`. - */ - function baseUpdate(object, path, updater, customizer) { - return baseSet(object, path, updater(baseGet(object, path)), customizer); - } - - /** - * The base implementation of methods like `_.dropWhile` and `_.takeWhile` - * without support for iteratee shorthands. - * - * @private - * @param {Array} array The array to query. - * @param {Function} predicate The function invoked per iteration. - * @param {boolean} [isDrop] Specify dropping elements instead of taking them. - * @param {boolean} [fromRight] Specify iterating from right to left. - * @returns {Array} Returns the slice of `array`. - */ - function baseWhile(array, predicate, isDrop, fromRight) { - var length = array.length, - index = fromRight ? length : -1; - - while ((fromRight ? index-- : ++index < length) && - predicate(array[index], index, array)) {} - - return isDrop - ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length)) - : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index)); - } - - /** - * The base implementation of `wrapperValue` which returns the result of - * performing a sequence of actions on the unwrapped `value`, where each - * successive action is supplied the return value of the previous. - * - * @private - * @param {*} value The unwrapped value. - * @param {Array} actions Actions to perform to resolve the unwrapped value. - * @returns {*} Returns the resolved value. - */ - function baseWrapperValue(value, actions) { - var result = value; - if (result instanceof LazyWrapper) { - result = result.value(); - } - return arrayReduce(actions, function(result, action) { - return action.func.apply(action.thisArg, arrayPush([result], action.args)); - }, result); - } - - /** - * The base implementation of methods like `_.xor`, without support for - * iteratee shorthands, that accepts an array of arrays to inspect. - * - * @private - * @param {Array} arrays The arrays to inspect. - * @param {Function} [iteratee] The iteratee invoked per element. - * @param {Function} [comparator] The comparator invoked per element. - * @returns {Array} Returns the new array of values. - */ - function baseXor(arrays, iteratee, comparator) { - var length = arrays.length; - if (length < 2) { - return length ? baseUniq(arrays[0]) : []; - } - var index = -1, - result = Array(length); - - while (++index < length) { - var array = arrays[index], - othIndex = -1; - - while (++othIndex < length) { - if (othIndex != index) { - result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator); - } - } - } - return baseUniq(baseFlatten(result, 1), iteratee, comparator); - } - - /** - * This base implementation of `_.zipObject` which assigns values using `assignFunc`. - * - * @private - * @param {Array} props The property identifiers. - * @param {Array} values The property values. - * @param {Function} assignFunc The function to assign values. - * @returns {Object} Returns the new object. - */ - function baseZipObject(props, values, assignFunc) { - var index = -1, - length = props.length, - valsLength = values.length, - result = {}; - - while (++index < length) { - var value = index < valsLength ? values[index] : undefined; - assignFunc(result, props[index], value); - } - return result; - } - - /** - * Casts `value` to an empty array if it's not an array like object. - * - * @private - * @param {*} value The value to inspect. - * @returns {Array|Object} Returns the cast array-like object. - */ - function castArrayLikeObject(value) { - return isArrayLikeObject(value) ? value : []; - } - - /** - * Casts `value` to `identity` if it's not a function. - * - * @private - * @param {*} value The value to inspect. - * @returns {Function} Returns cast function. - */ - function castFunction(value) { - return typeof value == 'function' ? value : identity; - } - - /** - * Casts `value` to a path array if it's not one. - * - * @private - * @param {*} value The value to inspect. - * @param {Object} [object] The object to query keys on. - * @returns {Array} Returns the cast property path array. - */ - function castPath(value, object) { - if (isArray(value)) { - return value; - } - return isKey(value, object) ? [value] : stringToPath(toString(value)); - } - - /** - * A `baseRest` alias which can be replaced with `identity` by module - * replacement plugins. - * - * @private - * @type {Function} - * @param {Function} func The function to apply a rest parameter to. - * @returns {Function} Returns the new function. - */ - var castRest = baseRest; - - /** - * Casts `array` to a slice if it's needed. - * - * @private - * @param {Array} array The array to inspect. - * @param {number} start The start position. - * @param {number} [end=array.length] The end position. - * @returns {Array} Returns the cast slice. - */ - function castSlice(array, start, end) { - var length = array.length; - end = end === undefined ? length : end; - return (!start && end >= length) ? array : baseSlice(array, start, end); - } - - /** - * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout). - * - * @private - * @param {number|Object} id The timer id or timeout object of the timer to clear. - */ - var clearTimeout = ctxClearTimeout || function(id) { - return root.clearTimeout(id); - }; - - /** - * Creates a clone of `buffer`. - * - * @private - * @param {Buffer} buffer The buffer to clone. - * @param {boolean} [isDeep] Specify a deep clone. - * @returns {Buffer} Returns the cloned buffer. - */ - function cloneBuffer(buffer, isDeep) { - if (isDeep) { - return buffer.slice(); - } - var length = buffer.length, - result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length); - - buffer.copy(result); - return result; - } - - /** - * Creates a clone of `arrayBuffer`. - * - * @private - * @param {ArrayBuffer} arrayBuffer The array buffer to clone. - * @returns {ArrayBuffer} Returns the cloned array buffer. - */ - function cloneArrayBuffer(arrayBuffer) { - var result = new arrayBuffer.constructor(arrayBuffer.byteLength); - new Uint8Array(result).set(new Uint8Array(arrayBuffer)); - return result; - } - - /** - * Creates a clone of `dataView`. - * - * @private - * @param {Object} dataView The data view to clone. - * @param {boolean} [isDeep] Specify a deep clone. - * @returns {Object} Returns the cloned data view. - */ - function cloneDataView(dataView, isDeep) { - var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer; - return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength); - } - - /** - * Creates a clone of `regexp`. - * - * @private - * @param {Object} regexp The regexp to clone. - * @returns {Object} Returns the cloned regexp. - */ - function cloneRegExp(regexp) { - var result = new regexp.constructor(regexp.source, reFlags.exec(regexp)); - result.lastIndex = regexp.lastIndex; - return result; - } - - /** - * Creates a clone of the `symbol` object. - * - * @private - * @param {Object} symbol The symbol object to clone. - * @returns {Object} Returns the cloned symbol object. - */ - function cloneSymbol(symbol) { - return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {}; - } - - /** - * Creates a clone of `typedArray`. - * - * @private - * @param {Object} typedArray The typed array to clone. - * @param {boolean} [isDeep] Specify a deep clone. - * @returns {Object} Returns the cloned typed array. - */ - function cloneTypedArray(typedArray, isDeep) { - var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer; - return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length); - } - - /** - * Compares values to sort them in ascending order. - * - * @private - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @returns {number} Returns the sort order indicator for `value`. - */ - function compareAscending(value, other) { - if (value !== other) { - var valIsDefined = value !== undefined, - valIsNull = value === null, - valIsReflexive = value === value, - valIsSymbol = isSymbol(value); - - var othIsDefined = other !== undefined, - othIsNull = other === null, - othIsReflexive = other === other, - othIsSymbol = isSymbol(other); - - if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) || - (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) || - (valIsNull && othIsDefined && othIsReflexive) || - (!valIsDefined && othIsReflexive) || - !valIsReflexive) { - return 1; - } - if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) || - (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) || - (othIsNull && valIsDefined && valIsReflexive) || - (!othIsDefined && valIsReflexive) || - !othIsReflexive) { - return -1; - } - } - return 0; - } - - /** - * Used by `_.orderBy` to compare multiple properties of a value to another - * and stable sort them. - * - * If `orders` is unspecified, all values are sorted in ascending order. Otherwise, - * specify an order of "desc" for descending or "asc" for ascending sort order - * of corresponding values. - * - * @private - * @param {Object} object The object to compare. - * @param {Object} other The other object to compare. - * @param {boolean[]|string[]} orders The order to sort by for each property. - * @returns {number} Returns the sort order indicator for `object`. - */ - function compareMultiple(object, other, orders) { - var index = -1, - objCriteria = object.criteria, - othCriteria = other.criteria, - length = objCriteria.length, - ordersLength = orders.length; - - while (++index < length) { - var result = compareAscending(objCriteria[index], othCriteria[index]); - if (result) { - if (index >= ordersLength) { - return result; - } - var order = orders[index]; - return result * (order == 'desc' ? -1 : 1); - } - } - // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications - // that causes it, under certain circumstances, to provide the same value for - // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247 - // for more details. - // - // This also ensures a stable sort in V8 and other engines. - // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details. - return object.index - other.index; - } - - /** - * Creates an array that is the composition of partially applied arguments, - * placeholders, and provided arguments into a single array of arguments. - * - * @private - * @param {Array} args The provided arguments. - * @param {Array} partials The arguments to prepend to those provided. - * @param {Array} holders The `partials` placeholder indexes. - * @params {boolean} [isCurried] Specify composing for a curried function. - * @returns {Array} Returns the new array of composed arguments. - */ - function composeArgs(args, partials, holders, isCurried) { - var argsIndex = -1, - argsLength = args.length, - holdersLength = holders.length, - leftIndex = -1, - leftLength = partials.length, - rangeLength = nativeMax(argsLength - holdersLength, 0), - result = Array(leftLength + rangeLength), - isUncurried = !isCurried; - - while (++leftIndex < leftLength) { - result[leftIndex] = partials[leftIndex]; - } - while (++argsIndex < holdersLength) { - if (isUncurried || argsIndex < argsLength) { - result[holders[argsIndex]] = args[argsIndex]; - } - } - while (rangeLength--) { - result[leftIndex++] = args[argsIndex++]; - } - return result; - } - - /** - * This function is like `composeArgs` except that the arguments composition - * is tailored for `_.partialRight`. - * - * @private - * @param {Array} args The provided arguments. - * @param {Array} partials The arguments to append to those provided. - * @param {Array} holders The `partials` placeholder indexes. - * @params {boolean} [isCurried] Specify composing for a curried function. - * @returns {Array} Returns the new array of composed arguments. - */ - function composeArgsRight(args, partials, holders, isCurried) { - var argsIndex = -1, - argsLength = args.length, - holdersIndex = -1, - holdersLength = holders.length, - rightIndex = -1, - rightLength = partials.length, - rangeLength = nativeMax(argsLength - holdersLength, 0), - result = Array(rangeLength + rightLength), - isUncurried = !isCurried; - - while (++argsIndex < rangeLength) { - result[argsIndex] = args[argsIndex]; - } - var offset = argsIndex; - while (++rightIndex < rightLength) { - result[offset + rightIndex] = partials[rightIndex]; - } - while (++holdersIndex < holdersLength) { - if (isUncurried || argsIndex < argsLength) { - result[offset + holders[holdersIndex]] = args[argsIndex++]; - } - } - return result; - } - - /** - * Copies the values of `source` to `array`. - * - * @private - * @param {Array} source The array to copy values from. - * @param {Array} [array=[]] The array to copy values to. - * @returns {Array} Returns `array`. - */ - function copyArray(source, array) { - var index = -1, - length = source.length; - - array || (array = Array(length)); - while (++index < length) { - array[index] = source[index]; - } - return array; - } - - /** - * Copies properties of `source` to `object`. - * - * @private - * @param {Object} source The object to copy properties from. - * @param {Array} props The property identifiers to copy. - * @param {Object} [object={}] The object to copy properties to. - * @param {Function} [customizer] The function to customize copied values. - * @returns {Object} Returns `object`. - */ - function copyObject(source, props, object, customizer) { - var isNew = !object; - object || (object = {}); - - var index = -1, - length = props.length; - - while (++index < length) { - var key = props[index]; - - var newValue = customizer - ? customizer(object[key], source[key], key, object, source) - : undefined; - - if (newValue === undefined) { - newValue = source[key]; - } - if (isNew) { - baseAssignValue(object, key, newValue); - } else { - assignValue(object, key, newValue); - } - } - return object; - } - - /** - * Copies own symbols of `source` to `object`. - * - * @private - * @param {Object} source The object to copy symbols from. - * @param {Object} [object={}] The object to copy symbols to. - * @returns {Object} Returns `object`. - */ - function copySymbols(source, object) { - return copyObject(source, getSymbols(source), object); - } - - /** - * Copies own and inherited symbols of `source` to `object`. - * - * @private - * @param {Object} source The object to copy symbols from. - * @param {Object} [object={}] The object to copy symbols to. - * @returns {Object} Returns `object`. - */ - function copySymbolsIn(source, object) { - return copyObject(source, getSymbolsIn(source), object); - } - - /** - * Creates a function like `_.groupBy`. - * - * @private - * @param {Function} setter The function to set accumulator values. - * @param {Function} [initializer] The accumulator object initializer. - * @returns {Function} Returns the new aggregator function. - */ - function createAggregator(setter, initializer) { - return function(collection, iteratee) { - var func = isArray(collection) ? arrayAggregator : baseAggregator, - accumulator = initializer ? initializer() : {}; - - return func(collection, setter, getIteratee(iteratee, 2), accumulator); - }; - } - - /** - * Creates a function like `_.assign`. - * - * @private - * @param {Function} assigner The function to assign values. - * @returns {Function} Returns the new assigner function. - */ - function createAssigner(assigner) { - return baseRest(function(object, sources) { - var index = -1, - length = sources.length, - customizer = length > 1 ? sources[length - 1] : undefined, - guard = length > 2 ? sources[2] : undefined; - - customizer = (assigner.length > 3 && typeof customizer == 'function') - ? (length--, customizer) - : undefined; - - if (guard && isIterateeCall(sources[0], sources[1], guard)) { - customizer = length < 3 ? undefined : customizer; - length = 1; - } - object = Object(object); - while (++index < length) { - var source = sources[index]; - if (source) { - assigner(object, source, index, customizer); - } - } - return object; - }); - } - - /** - * Creates a `baseEach` or `baseEachRight` function. - * - * @private - * @param {Function} eachFunc The function to iterate over a collection. - * @param {boolean} [fromRight] Specify iterating from right to left. - * @returns {Function} Returns the new base function. - */ - function createBaseEach(eachFunc, fromRight) { - return function(collection, iteratee) { - if (collection == null) { - return collection; - } - if (!isArrayLike(collection)) { - return eachFunc(collection, iteratee); - } - var length = collection.length, - index = fromRight ? length : -1, - iterable = Object(collection); - - while ((fromRight ? index-- : ++index < length)) { - if (iteratee(iterable[index], index, iterable) === false) { - break; - } - } - return collection; - }; - } - - /** - * Creates a base function for methods like `_.forIn` and `_.forOwn`. - * - * @private - * @param {boolean} [fromRight] Specify iterating from right to left. - * @returns {Function} Returns the new base function. - */ - function createBaseFor(fromRight) { - return function(object, iteratee, keysFunc) { - var index = -1, - iterable = Object(object), - props = keysFunc(object), - length = props.length; - - while (length--) { - var key = props[fromRight ? length : ++index]; - if (iteratee(iterable[key], key, iterable) === false) { - break; - } - } - return object; - }; - } - - /** - * Creates a function that wraps `func` to invoke it with the optional `this` - * binding of `thisArg`. - * - * @private - * @param {Function} func The function to wrap. - * @param {number} bitmask The bitmask flags. See `createWrap` for more details. - * @param {*} [thisArg] The `this` binding of `func`. - * @returns {Function} Returns the new wrapped function. - */ - function createBind(func, bitmask, thisArg) { - var isBind = bitmask & WRAP_BIND_FLAG, - Ctor = createCtor(func); - - function wrapper() { - var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; - return fn.apply(isBind ? thisArg : this, arguments); - } - return wrapper; - } - - /** - * Creates a function like `_.lowerFirst`. - * - * @private - * @param {string} methodName The name of the `String` case method to use. - * @returns {Function} Returns the new case function. - */ - function createCaseFirst(methodName) { - return function(string) { - string = toString(string); - - var strSymbols = hasUnicode(string) - ? stringToArray(string) - : undefined; - - var chr = strSymbols - ? strSymbols[0] - : string.charAt(0); - - var trailing = strSymbols - ? castSlice(strSymbols, 1).join('') - : string.slice(1); - - return chr[methodName]() + trailing; - }; - } - - /** - * Creates a function like `_.camelCase`. - * - * @private - * @param {Function} callback The function to combine each word. - * @returns {Function} Returns the new compounder function. - */ - function createCompounder(callback) { - return function(string) { - return arrayReduce(words(deburr(string).replace(reApos, '')), callback, ''); - }; - } - - /** - * Creates a function that produces an instance of `Ctor` regardless of - * whether it was invoked as part of a `new` expression or by `call` or `apply`. - * - * @private - * @param {Function} Ctor The constructor to wrap. - * @returns {Function} Returns the new wrapped function. - */ - function createCtor(Ctor) { - return function() { - // Use a `switch` statement to work with class constructors. See - // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist - // for more details. - var args = arguments; - switch (args.length) { - case 0: return new Ctor; - case 1: return new Ctor(args[0]); - case 2: return new Ctor(args[0], args[1]); - case 3: return new Ctor(args[0], args[1], args[2]); - case 4: return new Ctor(args[0], args[1], args[2], args[3]); - case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]); - case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]); - case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); - } - var thisBinding = baseCreate(Ctor.prototype), - result = Ctor.apply(thisBinding, args); - - // Mimic the constructor's `return` behavior. - // See https://es5.github.io/#x13.2.2 for more details. - return isObject(result) ? result : thisBinding; - }; - } - - /** - * Creates a function that wraps `func` to enable currying. - * - * @private - * @param {Function} func The function to wrap. - * @param {number} bitmask The bitmask flags. See `createWrap` for more details. - * @param {number} arity The arity of `func`. - * @returns {Function} Returns the new wrapped function. - */ - function createCurry(func, bitmask, arity) { - var Ctor = createCtor(func); - - function wrapper() { - var length = arguments.length, - args = Array(length), - index = length, - placeholder = getHolder(wrapper); - - while (index--) { - args[index] = arguments[index]; - } - var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder) - ? [] - : replaceHolders(args, placeholder); - - length -= holders.length; - if (length < arity) { - return createRecurry( - func, bitmask, createHybrid, wrapper.placeholder, undefined, - args, holders, undefined, undefined, arity - length); - } - var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; - return apply(fn, this, args); - } - return wrapper; - } - - /** - * Creates a `_.find` or `_.findLast` function. - * - * @private - * @param {Function} findIndexFunc The function to find the collection index. - * @returns {Function} Returns the new find function. - */ - function createFind(findIndexFunc) { - return function(collection, predicate, fromIndex) { - var iterable = Object(collection); - if (!isArrayLike(collection)) { - var iteratee = getIteratee(predicate, 3); - collection = keys(collection); - predicate = function(key) { return iteratee(iterable[key], key, iterable); }; - } - var index = findIndexFunc(collection, predicate, fromIndex); - return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined; - }; - } - - /** - * Creates a `_.flow` or `_.flowRight` function. - * - * @private - * @param {boolean} [fromRight] Specify iterating from right to left. - * @returns {Function} Returns the new flow function. - */ - function createFlow(fromRight) { - return flatRest(function(funcs) { - var length = funcs.length, - index = length, - prereq = LodashWrapper.prototype.thru; - - if (fromRight) { - funcs.reverse(); - } - while (index--) { - var func = funcs[index]; - if (typeof func != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - if (prereq && !wrapper && getFuncName(func) == 'wrapper') { - var wrapper = new LodashWrapper([], true); - } - } - index = wrapper ? index : length; - while (++index < length) { - func = funcs[index]; - - var funcName = getFuncName(func), - data = funcName == 'wrapper' ? getData(func) : undefined; - - if (data && isLaziable(data[0]) && - data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) && - !data[4].length && data[9] == 1 - ) { - wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]); - } else { - wrapper = (func.length == 1 && isLaziable(func)) - ? wrapper[funcName]() - : wrapper.thru(func); - } - } - return function() { - var args = arguments, - value = args[0]; - - if (wrapper && args.length == 1 && isArray(value)) { - return wrapper.plant(value).value(); - } - var index = 0, - result = length ? funcs[index].apply(this, args) : value; - - while (++index < length) { - result = funcs[index].call(this, result); - } - return result; - }; - }); - } - - /** - * Creates a function that wraps `func` to invoke it with optional `this` - * binding of `thisArg`, partial application, and currying. - * - * @private - * @param {Function|string} func The function or method name to wrap. - * @param {number} bitmask The bitmask flags. See `createWrap` for more details. - * @param {*} [thisArg] The `this` binding of `func`. - * @param {Array} [partials] The arguments to prepend to those provided to - * the new function. - * @param {Array} [holders] The `partials` placeholder indexes. - * @param {Array} [partialsRight] The arguments to append to those provided - * to the new function. - * @param {Array} [holdersRight] The `partialsRight` placeholder indexes. - * @param {Array} [argPos] The argument positions of the new function. - * @param {number} [ary] The arity cap of `func`. - * @param {number} [arity] The arity of `func`. - * @returns {Function} Returns the new wrapped function. - */ - function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) { - var isAry = bitmask & WRAP_ARY_FLAG, - isBind = bitmask & WRAP_BIND_FLAG, - isBindKey = bitmask & WRAP_BIND_KEY_FLAG, - isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG), - isFlip = bitmask & WRAP_FLIP_FLAG, - Ctor = isBindKey ? undefined : createCtor(func); - - function wrapper() { - var length = arguments.length, - args = Array(length), - index = length; - - while (index--) { - args[index] = arguments[index]; - } - if (isCurried) { - var placeholder = getHolder(wrapper), - holdersCount = countHolders(args, placeholder); - } - if (partials) { - args = composeArgs(args, partials, holders, isCurried); - } - if (partialsRight) { - args = composeArgsRight(args, partialsRight, holdersRight, isCurried); - } - length -= holdersCount; - if (isCurried && length < arity) { - var newHolders = replaceHolders(args, placeholder); - return createRecurry( - func, bitmask, createHybrid, wrapper.placeholder, thisArg, - args, newHolders, argPos, ary, arity - length - ); - } - var thisBinding = isBind ? thisArg : this, - fn = isBindKey ? thisBinding[func] : func; - - length = args.length; - if (argPos) { - args = reorder(args, argPos); - } else if (isFlip && length > 1) { - args.reverse(); - } - if (isAry && ary < length) { - args.length = ary; - } - if (this && this !== root && this instanceof wrapper) { - fn = Ctor || createCtor(fn); - } - return fn.apply(thisBinding, args); - } - return wrapper; - } - - /** - * Creates a function like `_.invertBy`. - * - * @private - * @param {Function} setter The function to set accumulator values. - * @param {Function} toIteratee The function to resolve iteratees. - * @returns {Function} Returns the new inverter function. - */ - function createInverter(setter, toIteratee) { - return function(object, iteratee) { - return baseInverter(object, setter, toIteratee(iteratee), {}); - }; - } - - /** - * Creates a function that performs a mathematical operation on two values. - * - * @private - * @param {Function} operator The function to perform the operation. - * @param {number} [defaultValue] The value used for `undefined` arguments. - * @returns {Function} Returns the new mathematical operation function. - */ - function createMathOperation(operator, defaultValue) { - return function(value, other) { - var result; - if (value === undefined && other === undefined) { - return defaultValue; - } - if (value !== undefined) { - result = value; - } - if (other !== undefined) { - if (result === undefined) { - return other; - } - if (typeof value == 'string' || typeof other == 'string') { - value = baseToString(value); - other = baseToString(other); - } else { - value = baseToNumber(value); - other = baseToNumber(other); - } - result = operator(value, other); - } - return result; - }; - } - - /** - * Creates a function like `_.over`. - * - * @private - * @param {Function} arrayFunc The function to iterate over iteratees. - * @returns {Function} Returns the new over function. - */ - function createOver(arrayFunc) { - return flatRest(function(iteratees) { - iteratees = arrayMap(iteratees, baseUnary(getIteratee())); - return baseRest(function(args) { - var thisArg = this; - return arrayFunc(iteratees, function(iteratee) { - return apply(iteratee, thisArg, args); - }); - }); - }); - } - - /** - * Creates the padding for `string` based on `length`. The `chars` string - * is truncated if the number of characters exceeds `length`. - * - * @private - * @param {number} length The padding length. - * @param {string} [chars=' '] The string used as padding. - * @returns {string} Returns the padding for `string`. - */ - function createPadding(length, chars) { - chars = chars === undefined ? ' ' : baseToString(chars); - - var charsLength = chars.length; - if (charsLength < 2) { - return charsLength ? baseRepeat(chars, length) : chars; - } - var result = baseRepeat(chars, nativeCeil(length / stringSize(chars))); - return hasUnicode(chars) - ? castSlice(stringToArray(result), 0, length).join('') - : result.slice(0, length); - } - - /** - * Creates a function that wraps `func` to invoke it with the `this` binding - * of `thisArg` and `partials` prepended to the arguments it receives. - * - * @private - * @param {Function} func The function to wrap. - * @param {number} bitmask The bitmask flags. See `createWrap` for more details. - * @param {*} thisArg The `this` binding of `func`. - * @param {Array} partials The arguments to prepend to those provided to - * the new function. - * @returns {Function} Returns the new wrapped function. - */ - function createPartial(func, bitmask, thisArg, partials) { - var isBind = bitmask & WRAP_BIND_FLAG, - Ctor = createCtor(func); - - function wrapper() { - var argsIndex = -1, - argsLength = arguments.length, - leftIndex = -1, - leftLength = partials.length, - args = Array(leftLength + argsLength), - fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; - - while (++leftIndex < leftLength) { - args[leftIndex] = partials[leftIndex]; - } - while (argsLength--) { - args[leftIndex++] = arguments[++argsIndex]; - } - return apply(fn, isBind ? thisArg : this, args); - } - return wrapper; - } - - /** - * Creates a `_.range` or `_.rangeRight` function. - * - * @private - * @param {boolean} [fromRight] Specify iterating from right to left. - * @returns {Function} Returns the new range function. - */ - function createRange(fromRight) { - return function(start, end, step) { - if (step && typeof step != 'number' && isIterateeCall(start, end, step)) { - end = step = undefined; - } - // Ensure the sign of `-0` is preserved. - start = toFinite(start); - if (end === undefined) { - end = start; - start = 0; - } else { - end = toFinite(end); - } - step = step === undefined ? (start < end ? 1 : -1) : toFinite(step); - return baseRange(start, end, step, fromRight); - }; - } - - /** - * Creates a function that performs a relational operation on two values. - * - * @private - * @param {Function} operator The function to perform the operation. - * @returns {Function} Returns the new relational operation function. - */ - function createRelationalOperation(operator) { - return function(value, other) { - if (!(typeof value == 'string' && typeof other == 'string')) { - value = toNumber(value); - other = toNumber(other); - } - return operator(value, other); - }; - } - - /** - * Creates a function that wraps `func` to continue currying. - * - * @private - * @param {Function} func The function to wrap. - * @param {number} bitmask The bitmask flags. See `createWrap` for more details. - * @param {Function} wrapFunc The function to create the `func` wrapper. - * @param {*} placeholder The placeholder value. - * @param {*} [thisArg] The `this` binding of `func`. - * @param {Array} [partials] The arguments to prepend to those provided to - * the new function. - * @param {Array} [holders] The `partials` placeholder indexes. - * @param {Array} [argPos] The argument positions of the new function. - * @param {number} [ary] The arity cap of `func`. - * @param {number} [arity] The arity of `func`. - * @returns {Function} Returns the new wrapped function. - */ - function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) { - var isCurry = bitmask & WRAP_CURRY_FLAG, - newHolders = isCurry ? holders : undefined, - newHoldersRight = isCurry ? undefined : holders, - newPartials = isCurry ? partials : undefined, - newPartialsRight = isCurry ? undefined : partials; - - bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG); - bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG); - - if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) { - bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG); - } - var newData = [ - func, bitmask, thisArg, newPartials, newHolders, newPartialsRight, - newHoldersRight, argPos, ary, arity - ]; - - var result = wrapFunc.apply(undefined, newData); - if (isLaziable(func)) { - setData(result, newData); - } - result.placeholder = placeholder; - return setWrapToString(result, func, bitmask); - } - - /** - * Creates a function like `_.round`. - * - * @private - * @param {string} methodName The name of the `Math` method to use when rounding. - * @returns {Function} Returns the new round function. - */ - function createRound(methodName) { - var func = Math[methodName]; - return function(number, precision) { - number = toNumber(number); - precision = precision == null ? 0 : nativeMin(toInteger(precision), 292); - if (precision && nativeIsFinite(number)) { - // Shift with exponential notation to avoid floating-point issues. - // See [MDN](https://mdn.io/round#Examples) for more details. - var pair = (toString(number) + 'e').split('e'), - value = func(pair[0] + 'e' + (+pair[1] + precision)); - - pair = (toString(value) + 'e').split('e'); - return +(pair[0] + 'e' + (+pair[1] - precision)); - } - return func(number); - }; - } - - /** - * Creates a set object of `values`. - * - * @private - * @param {Array} values The values to add to the set. - * @returns {Object} Returns the new set. - */ - var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) { - return new Set(values); - }; - - /** - * Creates a `_.toPairs` or `_.toPairsIn` function. - * - * @private - * @param {Function} keysFunc The function to get the keys of a given object. - * @returns {Function} Returns the new pairs function. - */ - function createToPairs(keysFunc) { - return function(object) { - var tag = getTag(object); - if (tag == mapTag) { - return mapToArray(object); - } - if (tag == setTag) { - return setToPairs(object); - } - return baseToPairs(object, keysFunc(object)); - }; - } - - /** - * Creates a function that either curries or invokes `func` with optional - * `this` binding and partially applied arguments. - * - * @private - * @param {Function|string} func The function or method name to wrap. - * @param {number} bitmask The bitmask flags. - * 1 - `_.bind` - * 2 - `_.bindKey` - * 4 - `_.curry` or `_.curryRight` of a bound function - * 8 - `_.curry` - * 16 - `_.curryRight` - * 32 - `_.partial` - * 64 - `_.partialRight` - * 128 - `_.rearg` - * 256 - `_.ary` - * 512 - `_.flip` - * @param {*} [thisArg] The `this` binding of `func`. - * @param {Array} [partials] The arguments to be partially applied. - * @param {Array} [holders] The `partials` placeholder indexes. - * @param {Array} [argPos] The argument positions of the new function. - * @param {number} [ary] The arity cap of `func`. - * @param {number} [arity] The arity of `func`. - * @returns {Function} Returns the new wrapped function. - */ - function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) { - var isBindKey = bitmask & WRAP_BIND_KEY_FLAG; - if (!isBindKey && typeof func != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - var length = partials ? partials.length : 0; - if (!length) { - bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG); - partials = holders = undefined; - } - ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0); - arity = arity === undefined ? arity : toInteger(arity); - length -= holders ? holders.length : 0; - - if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) { - var partialsRight = partials, - holdersRight = holders; - - partials = holders = undefined; - } - var data = isBindKey ? undefined : getData(func); - - var newData = [ - func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, - argPos, ary, arity - ]; - - if (data) { - mergeData(newData, data); - } - func = newData[0]; - bitmask = newData[1]; - thisArg = newData[2]; - partials = newData[3]; - holders = newData[4]; - arity = newData[9] = newData[9] === undefined - ? (isBindKey ? 0 : func.length) - : nativeMax(newData[9] - length, 0); - - if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) { - bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG); - } - if (!bitmask || bitmask == WRAP_BIND_FLAG) { - var result = createBind(func, bitmask, thisArg); - } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) { - result = createCurry(func, bitmask, arity); - } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) { - result = createPartial(func, bitmask, thisArg, partials); - } else { - result = createHybrid.apply(undefined, newData); - } - var setter = data ? baseSetData : setData; - return setWrapToString(setter(result, newData), func, bitmask); - } - - /** - * Used by `_.defaults` to customize its `_.assignIn` use to assign properties - * of source objects to the destination object for all destination properties - * that resolve to `undefined`. - * - * @private - * @param {*} objValue The destination value. - * @param {*} srcValue The source value. - * @param {string} key The key of the property to assign. - * @param {Object} object The parent object of `objValue`. - * @returns {*} Returns the value to assign. - */ - function customDefaultsAssignIn(objValue, srcValue, key, object) { - if (objValue === undefined || - (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) { - return srcValue; - } - return objValue; - } - - /** - * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source - * objects into destination objects that are passed thru. - * - * @private - * @param {*} objValue The destination value. - * @param {*} srcValue The source value. - * @param {string} key The key of the property to merge. - * @param {Object} object The parent object of `objValue`. - * @param {Object} source The parent object of `srcValue`. - * @param {Object} [stack] Tracks traversed source values and their merged - * counterparts. - * @returns {*} Returns the value to assign. - */ - function customDefaultsMerge(objValue, srcValue, key, object, source, stack) { - if (isObject(objValue) && isObject(srcValue)) { - // Recursively merge objects and arrays (susceptible to call stack limits). - stack.set(srcValue, objValue); - baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack); - stack['delete'](srcValue); - } - return objValue; - } - - /** - * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain - * objects. - * - * @private - * @param {*} value The value to inspect. - * @param {string} key The key of the property to inspect. - * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`. - */ - function customOmitClone(value) { - return isPlainObject(value) ? undefined : value; - } - - /** - * A specialized version of `baseIsEqualDeep` for arrays with support for - * partial deep comparisons. - * - * @private - * @param {Array} array The array to compare. - * @param {Array} other The other array to compare. - * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. - * @param {Function} customizer The function to customize comparisons. - * @param {Function} equalFunc The function to determine equivalents of values. - * @param {Object} stack Tracks traversed `array` and `other` objects. - * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. - */ - function equalArrays(array, other, bitmask, customizer, equalFunc, stack) { - var isPartial = bitmask & COMPARE_PARTIAL_FLAG, - arrLength = array.length, - othLength = other.length; - - if (arrLength != othLength && !(isPartial && othLength > arrLength)) { - return false; - } - // Check that cyclic values are equal. - var arrStacked = stack.get(array); - var othStacked = stack.get(other); - if (arrStacked && othStacked) { - return arrStacked == other && othStacked == array; - } - var index = -1, - result = true, - seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined; - - stack.set(array, other); - stack.set(other, array); - - // Ignore non-index properties. - while (++index < arrLength) { - var arrValue = array[index], - othValue = other[index]; - - if (customizer) { - var compared = isPartial - ? customizer(othValue, arrValue, index, other, array, stack) - : customizer(arrValue, othValue, index, array, other, stack); - } - if (compared !== undefined) { - if (compared) { - continue; - } - result = false; - break; - } - // Recursively compare arrays (susceptible to call stack limits). - if (seen) { - if (!arraySome(other, function(othValue, othIndex) { - if (!cacheHas(seen, othIndex) && - (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) { - return seen.push(othIndex); - } - })) { - result = false; - break; - } - } else if (!( - arrValue === othValue || - equalFunc(arrValue, othValue, bitmask, customizer, stack) - )) { - result = false; - break; - } - } - stack['delete'](array); - stack['delete'](other); - return result; - } - - /** - * A specialized version of `baseIsEqualDeep` for comparing objects of - * the same `toStringTag`. - * - * **Note:** This function only supports comparing values with tags of - * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. - * - * @private - * @param {Object} object The object to compare. - * @param {Object} other The other object to compare. - * @param {string} tag The `toStringTag` of the objects to compare. - * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. - * @param {Function} customizer The function to customize comparisons. - * @param {Function} equalFunc The function to determine equivalents of values. - * @param {Object} stack Tracks traversed `object` and `other` objects. - * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. - */ - function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) { - switch (tag) { - case dataViewTag: - if ((object.byteLength != other.byteLength) || - (object.byteOffset != other.byteOffset)) { - return false; - } - object = object.buffer; - other = other.buffer; - - case arrayBufferTag: - if ((object.byteLength != other.byteLength) || - !equalFunc(new Uint8Array(object), new Uint8Array(other))) { - return false; - } - return true; - - case boolTag: - case dateTag: - case numberTag: - // Coerce booleans to `1` or `0` and dates to milliseconds. - // Invalid dates are coerced to `NaN`. - return eq(+object, +other); - - case errorTag: - return object.name == other.name && object.message == other.message; - - case regexpTag: - case stringTag: - // Coerce regexes to strings and treat strings, primitives and objects, - // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring - // for more details. - return object == (other + ''); - - case mapTag: - var convert = mapToArray; - - case setTag: - var isPartial = bitmask & COMPARE_PARTIAL_FLAG; - convert || (convert = setToArray); - - if (object.size != other.size && !isPartial) { - return false; - } - // Assume cyclic values are equal. - var stacked = stack.get(object); - if (stacked) { - return stacked == other; - } - bitmask |= COMPARE_UNORDERED_FLAG; - - // Recursively compare objects (susceptible to call stack limits). - stack.set(object, other); - var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack); - stack['delete'](object); - return result; - - case symbolTag: - if (symbolValueOf) { - return symbolValueOf.call(object) == symbolValueOf.call(other); - } - } - return false; - } - - /** - * A specialized version of `baseIsEqualDeep` for objects with support for - * partial deep comparisons. - * - * @private - * @param {Object} object The object to compare. - * @param {Object} other The other object to compare. - * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. - * @param {Function} customizer The function to customize comparisons. - * @param {Function} equalFunc The function to determine equivalents of values. - * @param {Object} stack Tracks traversed `object` and `other` objects. - * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. - */ - function equalObjects(object, other, bitmask, customizer, equalFunc, stack) { - var isPartial = bitmask & COMPARE_PARTIAL_FLAG, - objProps = getAllKeys(object), - objLength = objProps.length, - othProps = getAllKeys(other), - othLength = othProps.length; - - if (objLength != othLength && !isPartial) { - return false; - } - var index = objLength; - while (index--) { - var key = objProps[index]; - if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) { - return false; - } - } - // Check that cyclic values are equal. - var objStacked = stack.get(object); - var othStacked = stack.get(other); - if (objStacked && othStacked) { - return objStacked == other && othStacked == object; - } - var result = true; - stack.set(object, other); - stack.set(other, object); - - var skipCtor = isPartial; - while (++index < objLength) { - key = objProps[index]; - var objValue = object[key], - othValue = other[key]; - - if (customizer) { - var compared = isPartial - ? customizer(othValue, objValue, key, other, object, stack) - : customizer(objValue, othValue, key, object, other, stack); - } - // Recursively compare objects (susceptible to call stack limits). - if (!(compared === undefined - ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack)) - : compared - )) { - result = false; - break; - } - skipCtor || (skipCtor = key == 'constructor'); - } - if (result && !skipCtor) { - var objCtor = object.constructor, - othCtor = other.constructor; - - // Non `Object` object instances with different constructors are not equal. - if (objCtor != othCtor && - ('constructor' in object && 'constructor' in other) && - !(typeof objCtor == 'function' && objCtor instanceof objCtor && - typeof othCtor == 'function' && othCtor instanceof othCtor)) { - result = false; - } - } - stack['delete'](object); - stack['delete'](other); - return result; - } - - /** - * A specialized version of `baseRest` which flattens the rest array. - * - * @private - * @param {Function} func The function to apply a rest parameter to. - * @returns {Function} Returns the new function. - */ - function flatRest(func) { - return setToString(overRest(func, undefined, flatten), func + ''); - } - - /** - * Creates an array of own enumerable property names and symbols of `object`. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names and symbols. - */ - function getAllKeys(object) { - return baseGetAllKeys(object, keys, getSymbols); - } - - /** - * Creates an array of own and inherited enumerable property names and - * symbols of `object`. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names and symbols. - */ - function getAllKeysIn(object) { - return baseGetAllKeys(object, keysIn, getSymbolsIn); - } - - /** - * Gets metadata for `func`. - * - * @private - * @param {Function} func The function to query. - * @returns {*} Returns the metadata for `func`. - */ - var getData = !metaMap ? noop : function(func) { - return metaMap.get(func); - }; - - /** - * Gets the name of `func`. - * - * @private - * @param {Function} func The function to query. - * @returns {string} Returns the function name. - */ - function getFuncName(func) { - var result = (func.name + ''), - array = realNames[result], - length = hasOwnProperty.call(realNames, result) ? array.length : 0; - - while (length--) { - var data = array[length], - otherFunc = data.func; - if (otherFunc == null || otherFunc == func) { - return data.name; - } - } - return result; - } - - /** - * Gets the argument placeholder value for `func`. - * - * @private - * @param {Function} func The function to inspect. - * @returns {*} Returns the placeholder value. - */ - function getHolder(func) { - var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func; - return object.placeholder; - } - - /** - * Gets the appropriate "iteratee" function. If `_.iteratee` is customized, - * this function returns the custom method, otherwise it returns `baseIteratee`. - * If arguments are provided, the chosen function is invoked with them and - * its result is returned. - * - * @private - * @param {*} [value] The value to convert to an iteratee. - * @param {number} [arity] The arity of the created iteratee. - * @returns {Function} Returns the chosen function or its result. - */ - function getIteratee() { - var result = lodash.iteratee || iteratee; - result = result === iteratee ? baseIteratee : result; - return arguments.length ? result(arguments[0], arguments[1]) : result; - } - - /** - * Gets the data for `map`. - * - * @private - * @param {Object} map The map to query. - * @param {string} key The reference key. - * @returns {*} Returns the map data. - */ - function getMapData(map, key) { - var data = map.__data__; - return isKeyable(key) - ? data[typeof key == 'string' ? 'string' : 'hash'] - : data.map; - } - - /** - * Gets the property names, values, and compare flags of `object`. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the match data of `object`. - */ - function getMatchData(object) { - var result = keys(object), - length = result.length; - - while (length--) { - var key = result[length], - value = object[key]; - - result[length] = [key, value, isStrictComparable(value)]; - } - return result; - } - - /** - * Gets the native function at `key` of `object`. - * - * @private - * @param {Object} object The object to query. - * @param {string} key The key of the method to get. - * @returns {*} Returns the function if it's native, else `undefined`. - */ - function getNative(object, key) { - var value = getValue(object, key); - return baseIsNative(value) ? value : undefined; - } - - /** - * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. - * - * @private - * @param {*} value The value to query. - * @returns {string} Returns the raw `toStringTag`. - */ - function getRawTag(value) { - var isOwn = hasOwnProperty.call(value, symToStringTag), - tag = value[symToStringTag]; - - try { - value[symToStringTag] = undefined; - var unmasked = true; - } catch (e) {} - - var result = nativeObjectToString.call(value); - if (unmasked) { - if (isOwn) { - value[symToStringTag] = tag; - } else { - delete value[symToStringTag]; - } - } - return result; - } - - /** - * Creates an array of the own enumerable symbols of `object`. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the array of symbols. - */ - var getSymbols = !nativeGetSymbols ? stubArray : function(object) { - if (object == null) { - return []; - } - object = Object(object); - return arrayFilter(nativeGetSymbols(object), function(symbol) { - return propertyIsEnumerable.call(object, symbol); - }); - }; - - /** - * Creates an array of the own and inherited enumerable symbols of `object`. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the array of symbols. - */ - var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) { - var result = []; - while (object) { - arrayPush(result, getSymbols(object)); - object = getPrototype(object); - } - return result; - }; - - /** - * Gets the `toStringTag` of `value`. - * - * @private - * @param {*} value The value to query. - * @returns {string} Returns the `toStringTag`. - */ - var getTag = baseGetTag; - - // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6. - if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) || - (Map && getTag(new Map) != mapTag) || - (Promise && getTag(Promise.resolve()) != promiseTag) || - (Set && getTag(new Set) != setTag) || - (WeakMap && getTag(new WeakMap) != weakMapTag)) { - getTag = function(value) { - var result = baseGetTag(value), - Ctor = result == objectTag ? value.constructor : undefined, - ctorString = Ctor ? toSource(Ctor) : ''; - - if (ctorString) { - switch (ctorString) { - case dataViewCtorString: return dataViewTag; - case mapCtorString: return mapTag; - case promiseCtorString: return promiseTag; - case setCtorString: return setTag; - case weakMapCtorString: return weakMapTag; - } - } - return result; - }; - } - - /** - * Gets the view, applying any `transforms` to the `start` and `end` positions. - * - * @private - * @param {number} start The start of the view. - * @param {number} end The end of the view. - * @param {Array} transforms The transformations to apply to the view. - * @returns {Object} Returns an object containing the `start` and `end` - * positions of the view. - */ - function getView(start, end, transforms) { - var index = -1, - length = transforms.length; - - while (++index < length) { - var data = transforms[index], - size = data.size; - - switch (data.type) { - case 'drop': start += size; break; - case 'dropRight': end -= size; break; - case 'take': end = nativeMin(end, start + size); break; - case 'takeRight': start = nativeMax(start, end - size); break; - } - } - return { 'start': start, 'end': end }; - } - - /** - * Extracts wrapper details from the `source` body comment. - * - * @private - * @param {string} source The source to inspect. - * @returns {Array} Returns the wrapper details. - */ - function getWrapDetails(source) { - var match = source.match(reWrapDetails); - return match ? match[1].split(reSplitDetails) : []; - } - - /** - * Checks if `path` exists on `object`. - * - * @private - * @param {Object} object The object to query. - * @param {Array|string} path The path to check. - * @param {Function} hasFunc The function to check properties. - * @returns {boolean} Returns `true` if `path` exists, else `false`. - */ - function hasPath(object, path, hasFunc) { - path = castPath(path, object); - - var index = -1, - length = path.length, - result = false; - - while (++index < length) { - var key = toKey(path[index]); - if (!(result = object != null && hasFunc(object, key))) { - break; - } - object = object[key]; - } - if (result || ++index != length) { - return result; - } - length = object == null ? 0 : object.length; - return !!length && isLength(length) && isIndex(key, length) && - (isArray(object) || isArguments(object)); - } - - /** - * Initializes an array clone. - * - * @private - * @param {Array} array The array to clone. - * @returns {Array} Returns the initialized clone. - */ - function initCloneArray(array) { - var length = array.length, - result = new array.constructor(length); - - // Add properties assigned by `RegExp#exec`. - if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) { - result.index = array.index; - result.input = array.input; - } - return result; - } - - /** - * Initializes an object clone. - * - * @private - * @param {Object} object The object to clone. - * @returns {Object} Returns the initialized clone. - */ - function initCloneObject(object) { - return (typeof object.constructor == 'function' && !isPrototype(object)) - ? baseCreate(getPrototype(object)) - : {}; - } - - /** - * Initializes an object clone based on its `toStringTag`. - * - * **Note:** This function only supports cloning values with tags of - * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`. - * - * @private - * @param {Object} object The object to clone. - * @param {string} tag The `toStringTag` of the object to clone. - * @param {boolean} [isDeep] Specify a deep clone. - * @returns {Object} Returns the initialized clone. - */ - function initCloneByTag(object, tag, isDeep) { - var Ctor = object.constructor; - switch (tag) { - case arrayBufferTag: - return cloneArrayBuffer(object); - - case boolTag: - case dateTag: - return new Ctor(+object); - - case dataViewTag: - return cloneDataView(object, isDeep); - - case float32Tag: case float64Tag: - case int8Tag: case int16Tag: case int32Tag: - case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag: - return cloneTypedArray(object, isDeep); - - case mapTag: - return new Ctor; - - case numberTag: - case stringTag: - return new Ctor(object); - - case regexpTag: - return cloneRegExp(object); - - case setTag: - return new Ctor; - - case symbolTag: - return cloneSymbol(object); - } - } - - /** - * Inserts wrapper `details` in a comment at the top of the `source` body. - * - * @private - * @param {string} source The source to modify. - * @returns {Array} details The details to insert. - * @returns {string} Returns the modified source. - */ - function insertWrapDetails(source, details) { - var length = details.length; - if (!length) { - return source; - } - var lastIndex = length - 1; - details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex]; - details = details.join(length > 2 ? ', ' : ' '); - return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n'); - } - - /** - * Checks if `value` is a flattenable `arguments` object or array. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is flattenable, else `false`. - */ - function isFlattenable(value) { - return isArray(value) || isArguments(value) || - !!(spreadableSymbol && value && value[spreadableSymbol]); - } - - /** - * Checks if `value` is a valid array-like index. - * - * @private - * @param {*} value The value to check. - * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. - * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. - */ - function isIndex(value, length) { - var type = typeof value; - length = length == null ? MAX_SAFE_INTEGER : length; - - return !!length && - (type == 'number' || - (type != 'symbol' && reIsUint.test(value))) && - (value > -1 && value % 1 == 0 && value < length); - } - - /** - * Checks if the given arguments are from an iteratee call. - * - * @private - * @param {*} value The potential iteratee value argument. - * @param {*} index The potential iteratee index or key argument. - * @param {*} object The potential iteratee object argument. - * @returns {boolean} Returns `true` if the arguments are from an iteratee call, - * else `false`. - */ - function isIterateeCall(value, index, object) { - if (!isObject(object)) { - return false; - } - var type = typeof index; - if (type == 'number' - ? (isArrayLike(object) && isIndex(index, object.length)) - : (type == 'string' && index in object) - ) { - return eq(object[index], value); - } - return false; - } - - /** - * Checks if `value` is a property name and not a property path. - * - * @private - * @param {*} value The value to check. - * @param {Object} [object] The object to query keys on. - * @returns {boolean} Returns `true` if `value` is a property name, else `false`. - */ - function isKey(value, object) { - if (isArray(value)) { - return false; - } - var type = typeof value; - if (type == 'number' || type == 'symbol' || type == 'boolean' || - value == null || isSymbol(value)) { - return true; - } - return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || - (object != null && value in Object(object)); - } - - /** - * Checks if `value` is suitable for use as unique object key. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is suitable, else `false`. - */ - function isKeyable(value) { - var type = typeof value; - return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') - ? (value !== '__proto__') - : (value === null); - } - - /** - * Checks if `func` has a lazy counterpart. - * - * @private - * @param {Function} func The function to check. - * @returns {boolean} Returns `true` if `func` has a lazy counterpart, - * else `false`. - */ - function isLaziable(func) { - var funcName = getFuncName(func), - other = lodash[funcName]; - - if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) { - return false; - } - if (func === other) { - return true; - } - var data = getData(other); - return !!data && func === data[0]; - } - - /** - * Checks if `func` has its source masked. - * - * @private - * @param {Function} func The function to check. - * @returns {boolean} Returns `true` if `func` is masked, else `false`. - */ - function isMasked(func) { - return !!maskSrcKey && (maskSrcKey in func); - } - - /** - * Checks if `func` is capable of being masked. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `func` is maskable, else `false`. - */ - var isMaskable = coreJsData ? isFunction : stubFalse; - - /** - * Checks if `value` is likely a prototype object. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. - */ - function isPrototype(value) { - var Ctor = value && value.constructor, - proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto; - - return value === proto; - } - - /** - * Checks if `value` is suitable for strict equality comparisons, i.e. `===`. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` if suitable for strict - * equality comparisons, else `false`. - */ - function isStrictComparable(value) { - return value === value && !isObject(value); - } - - /** - * A specialized version of `matchesProperty` for source values suitable - * for strict equality comparisons, i.e. `===`. - * - * @private - * @param {string} key The key of the property to get. - * @param {*} srcValue The value to match. - * @returns {Function} Returns the new spec function. - */ - function matchesStrictComparable(key, srcValue) { - return function(object) { - if (object == null) { - return false; - } - return object[key] === srcValue && - (srcValue !== undefined || (key in Object(object))); - }; - } - - /** - * A specialized version of `_.memoize` which clears the memoized function's - * cache when it exceeds `MAX_MEMOIZE_SIZE`. - * - * @private - * @param {Function} func The function to have its output memoized. - * @returns {Function} Returns the new memoized function. - */ - function memoizeCapped(func) { - var result = memoize(func, function(key) { - if (cache.size === MAX_MEMOIZE_SIZE) { - cache.clear(); - } - return key; - }); - - var cache = result.cache; - return result; - } - - /** - * Merges the function metadata of `source` into `data`. - * - * Merging metadata reduces the number of wrappers used to invoke a function. - * This is possible because methods like `_.bind`, `_.curry`, and `_.partial` - * may be applied regardless of execution order. Methods like `_.ary` and - * `_.rearg` modify function arguments, making the order in which they are - * executed important, preventing the merging of metadata. However, we make - * an exception for a safe combined case where curried functions have `_.ary` - * and or `_.rearg` applied. - * - * @private - * @param {Array} data The destination metadata. - * @param {Array} source The source metadata. - * @returns {Array} Returns `data`. - */ - function mergeData(data, source) { - var bitmask = data[1], - srcBitmask = source[1], - newBitmask = bitmask | srcBitmask, - isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG); - - var isCombo = - ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) || - ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) || - ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG)); - - // Exit early if metadata can't be merged. - if (!(isCommon || isCombo)) { - return data; - } - // Use source `thisArg` if available. - if (srcBitmask & WRAP_BIND_FLAG) { - data[2] = source[2]; - // Set when currying a bound function. - newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG; - } - // Compose partial arguments. - var value = source[3]; - if (value) { - var partials = data[3]; - data[3] = partials ? composeArgs(partials, value, source[4]) : value; - data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4]; - } - // Compose partial right arguments. - value = source[5]; - if (value) { - partials = data[5]; - data[5] = partials ? composeArgsRight(partials, value, source[6]) : value; - data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6]; - } - // Use source `argPos` if available. - value = source[7]; - if (value) { - data[7] = value; - } - // Use source `ary` if it's smaller. - if (srcBitmask & WRAP_ARY_FLAG) { - data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]); - } - // Use source `arity` if one is not provided. - if (data[9] == null) { - data[9] = source[9]; - } - // Use source `func` and merge bitmasks. - data[0] = source[0]; - data[1] = newBitmask; - - return data; - } - - /** - * This function is like - * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) - * except that it includes inherited enumerable properties. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names. - */ - function nativeKeysIn(object) { - var result = []; - if (object != null) { - for (var key in Object(object)) { - result.push(key); - } - } - return result; - } - - /** - * Converts `value` to a string using `Object.prototype.toString`. - * - * @private - * @param {*} value The value to convert. - * @returns {string} Returns the converted string. - */ - function objectToString(value) { - return nativeObjectToString.call(value); - } - - /** - * A specialized version of `baseRest` which transforms the rest array. - * - * @private - * @param {Function} func The function to apply a rest parameter to. - * @param {number} [start=func.length-1] The start position of the rest parameter. - * @param {Function} transform The rest array transform. - * @returns {Function} Returns the new function. - */ - function overRest(func, start, transform) { - start = nativeMax(start === undefined ? (func.length - 1) : start, 0); - return function() { - var args = arguments, - index = -1, - length = nativeMax(args.length - start, 0), - array = Array(length); - - while (++index < length) { - array[index] = args[start + index]; - } - index = -1; - var otherArgs = Array(start + 1); - while (++index < start) { - otherArgs[index] = args[index]; - } - otherArgs[start] = transform(array); - return apply(func, this, otherArgs); - }; - } - - /** - * Gets the parent value at `path` of `object`. - * - * @private - * @param {Object} object The object to query. - * @param {Array} path The path to get the parent value of. - * @returns {*} Returns the parent value. - */ - function parent(object, path) { - return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1)); - } - - /** - * Reorder `array` according to the specified indexes where the element at - * the first index is assigned as the first element, the element at - * the second index is assigned as the second element, and so on. - * - * @private - * @param {Array} array The array to reorder. - * @param {Array} indexes The arranged array indexes. - * @returns {Array} Returns `array`. - */ - function reorder(array, indexes) { - var arrLength = array.length, - length = nativeMin(indexes.length, arrLength), - oldArray = copyArray(array); - - while (length--) { - var index = indexes[length]; - array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined; - } - return array; - } - - /** - * Gets the value at `key`, unless `key` is "__proto__" or "constructor". - * - * @private - * @param {Object} object The object to query. - * @param {string} key The key of the property to get. - * @returns {*} Returns the property value. - */ - function safeGet(object, key) { - if (key === 'constructor' && typeof object[key] === 'function') { - return; - } - - if (key == '__proto__') { - return; - } - - return object[key]; - } - - /** - * Sets metadata for `func`. - * - * **Note:** If this function becomes hot, i.e. is invoked a lot in a short - * period of time, it will trip its breaker and transition to an identity - * function to avoid garbage collection pauses in V8. See - * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070) - * for more details. - * - * @private - * @param {Function} func The function to associate metadata with. - * @param {*} data The metadata. - * @returns {Function} Returns `func`. - */ - var setData = shortOut(baseSetData); - - /** - * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout). - * - * @private - * @param {Function} func The function to delay. - * @param {number} wait The number of milliseconds to delay invocation. - * @returns {number|Object} Returns the timer id or timeout object. - */ - var setTimeout = ctxSetTimeout || function(func, wait) { - return root.setTimeout(func, wait); - }; - - /** - * Sets the `toString` method of `func` to return `string`. - * - * @private - * @param {Function} func The function to modify. - * @param {Function} string The `toString` result. - * @returns {Function} Returns `func`. - */ - var setToString = shortOut(baseSetToString); - - /** - * Sets the `toString` method of `wrapper` to mimic the source of `reference` - * with wrapper details in a comment at the top of the source body. - * - * @private - * @param {Function} wrapper The function to modify. - * @param {Function} reference The reference function. - * @param {number} bitmask The bitmask flags. See `createWrap` for more details. - * @returns {Function} Returns `wrapper`. - */ - function setWrapToString(wrapper, reference, bitmask) { - var source = (reference + ''); - return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask))); - } - - /** - * Creates a function that'll short out and invoke `identity` instead - * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN` - * milliseconds. - * - * @private - * @param {Function} func The function to restrict. - * @returns {Function} Returns the new shortable function. - */ - function shortOut(func) { - var count = 0, - lastCalled = 0; - - return function() { - var stamp = nativeNow(), - remaining = HOT_SPAN - (stamp - lastCalled); - - lastCalled = stamp; - if (remaining > 0) { - if (++count >= HOT_COUNT) { - return arguments[0]; - } - } else { - count = 0; - } - return func.apply(undefined, arguments); - }; - } - - /** - * A specialized version of `_.shuffle` which mutates and sets the size of `array`. - * - * @private - * @param {Array} array The array to shuffle. - * @param {number} [size=array.length] The size of `array`. - * @returns {Array} Returns `array`. - */ - function shuffleSelf(array, size) { - var index = -1, - length = array.length, - lastIndex = length - 1; - - size = size === undefined ? length : size; - while (++index < size) { - var rand = baseRandom(index, lastIndex), - value = array[rand]; - - array[rand] = array[index]; - array[index] = value; - } - array.length = size; - return array; - } - - /** - * Converts `string` to a property path array. - * - * @private - * @param {string} string The string to convert. - * @returns {Array} Returns the property path array. - */ - var stringToPath = memoizeCapped(function(string) { - var result = []; - if (string.charCodeAt(0) === 46 /* . */) { - result.push(''); - } - string.replace(rePropName, function(match, number, quote, subString) { - result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match)); - }); - return result; - }); - - /** - * Converts `value` to a string key if it's not a string or symbol. - * - * @private - * @param {*} value The value to inspect. - * @returns {string|symbol} Returns the key. - */ - function toKey(value) { - if (typeof value == 'string' || isSymbol(value)) { - return value; - } - var result = (value + ''); - return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; - } - - /** - * Converts `func` to its source code. - * - * @private - * @param {Function} func The function to convert. - * @returns {string} Returns the source code. - */ - function toSource(func) { - if (func != null) { - try { - return funcToString.call(func); - } catch (e) {} - try { - return (func + ''); - } catch (e) {} - } - return ''; - } - - /** - * Updates wrapper `details` based on `bitmask` flags. - * - * @private - * @returns {Array} details The details to modify. - * @param {number} bitmask The bitmask flags. See `createWrap` for more details. - * @returns {Array} Returns `details`. - */ - function updateWrapDetails(details, bitmask) { - arrayEach(wrapFlags, function(pair) { - var value = '_.' + pair[0]; - if ((bitmask & pair[1]) && !arrayIncludes(details, value)) { - details.push(value); - } - }); - return details.sort(); - } - - /** - * Creates a clone of `wrapper`. - * - * @private - * @param {Object} wrapper The wrapper to clone. - * @returns {Object} Returns the cloned wrapper. - */ - function wrapperClone(wrapper) { - if (wrapper instanceof LazyWrapper) { - return wrapper.clone(); - } - var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__); - result.__actions__ = copyArray(wrapper.__actions__); - result.__index__ = wrapper.__index__; - result.__values__ = wrapper.__values__; - return result; - } - - /*------------------------------------------------------------------------*/ - - /** - * Creates an array of elements split into groups the length of `size`. - * If `array` can't be split evenly, the final chunk will be the remaining - * elements. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Array - * @param {Array} array The array to process. - * @param {number} [size=1] The length of each chunk - * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. - * @returns {Array} Returns the new array of chunks. - * @example - * - * _.chunk(['a', 'b', 'c', 'd'], 2); - * // => [['a', 'b'], ['c', 'd']] - * - * _.chunk(['a', 'b', 'c', 'd'], 3); - * // => [['a', 'b', 'c'], ['d']] - */ - function chunk(array, size, guard) { - if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) { - size = 1; - } else { - size = nativeMax(toInteger(size), 0); - } - var length = array == null ? 0 : array.length; - if (!length || size < 1) { - return []; - } - var index = 0, - resIndex = 0, - result = Array(nativeCeil(length / size)); - - while (index < length) { - result[resIndex++] = baseSlice(array, index, (index += size)); - } - return result; - } - - /** - * Creates an array with all falsey values removed. The values `false`, `null`, - * `0`, `""`, `undefined`, and `NaN` are falsey. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Array - * @param {Array} array The array to compact. - * @returns {Array} Returns the new array of filtered values. - * @example - * - * _.compact([0, 1, false, 2, '', 3]); - * // => [1, 2, 3] - */ - function compact(array) { - var index = -1, - length = array == null ? 0 : array.length, - resIndex = 0, - result = []; - - while (++index < length) { - var value = array[index]; - if (value) { - result[resIndex++] = value; - } - } - return result; - } - - /** - * Creates a new array concatenating `array` with any additional arrays - * and/or values. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {Array} array The array to concatenate. - * @param {...*} [values] The values to concatenate. - * @returns {Array} Returns the new concatenated array. - * @example - * - * var array = [1]; - * var other = _.concat(array, 2, [3], [[4]]); - * - * console.log(other); - * // => [1, 2, 3, [4]] - * - * console.log(array); - * // => [1] - */ - function concat() { - var length = arguments.length; - if (!length) { - return []; - } - var args = Array(length - 1), - array = arguments[0], - index = length; - - while (index--) { - args[index - 1] = arguments[index]; - } - return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1)); - } - - /** - * Creates an array of `array` values not included in the other given arrays - * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * for equality comparisons. The order and references of result values are - * determined by the first array. - * - * **Note:** Unlike `_.pullAll`, this method returns a new array. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Array - * @param {Array} array The array to inspect. - * @param {...Array} [values] The values to exclude. - * @returns {Array} Returns the new array of filtered values. - * @see _.without, _.xor - * @example - * - * _.difference([2, 1], [2, 3]); - * // => [1] - */ - var difference = baseRest(function(array, values) { - return isArrayLikeObject(array) - ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true)) - : []; - }); - - /** - * This method is like `_.difference` except that it accepts `iteratee` which - * is invoked for each element of `array` and `values` to generate the criterion - * by which they're compared. The order and references of result values are - * determined by the first array. The iteratee is invoked with one argument: - * (value). - * - * **Note:** Unlike `_.pullAllBy`, this method returns a new array. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {Array} array The array to inspect. - * @param {...Array} [values] The values to exclude. - * @param {Function} [iteratee=_.identity] The iteratee invoked per element. - * @returns {Array} Returns the new array of filtered values. - * @example - * - * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor); - * // => [1.2] - * - * // The `_.property` iteratee shorthand. - * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x'); - * // => [{ 'x': 2 }] - */ - var differenceBy = baseRest(function(array, values) { - var iteratee = last(values); - if (isArrayLikeObject(iteratee)) { - iteratee = undefined; - } - return isArrayLikeObject(array) - ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2)) - : []; - }); - - /** - * This method is like `_.difference` except that it accepts `comparator` - * which is invoked to compare elements of `array` to `values`. The order and - * references of result values are determined by the first array. The comparator - * is invoked with two arguments: (arrVal, othVal). - * - * **Note:** Unlike `_.pullAllWith`, this method returns a new array. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {Array} array The array to inspect. - * @param {...Array} [values] The values to exclude. - * @param {Function} [comparator] The comparator invoked per element. - * @returns {Array} Returns the new array of filtered values. - * @example - * - * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; - * - * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual); - * // => [{ 'x': 2, 'y': 1 }] - */ - var differenceWith = baseRest(function(array, values) { - var comparator = last(values); - if (isArrayLikeObject(comparator)) { - comparator = undefined; - } - return isArrayLikeObject(array) - ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator) - : []; - }); - - /** - * Creates a slice of `array` with `n` elements dropped from the beginning. - * - * @static - * @memberOf _ - * @since 0.5.0 - * @category Array - * @param {Array} array The array to query. - * @param {number} [n=1] The number of elements to drop. - * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. - * @returns {Array} Returns the slice of `array`. - * @example - * - * _.drop([1, 2, 3]); - * // => [2, 3] - * - * _.drop([1, 2, 3], 2); - * // => [3] - * - * _.drop([1, 2, 3], 5); - * // => [] - * - * _.drop([1, 2, 3], 0); - * // => [1, 2, 3] - */ - function drop(array, n, guard) { - var length = array == null ? 0 : array.length; - if (!length) { - return []; - } - n = (guard || n === undefined) ? 1 : toInteger(n); - return baseSlice(array, n < 0 ? 0 : n, length); - } - - /** - * Creates a slice of `array` with `n` elements dropped from the end. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Array - * @param {Array} array The array to query. - * @param {number} [n=1] The number of elements to drop. - * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. - * @returns {Array} Returns the slice of `array`. - * @example - * - * _.dropRight([1, 2, 3]); - * // => [1, 2] - * - * _.dropRight([1, 2, 3], 2); - * // => [1] - * - * _.dropRight([1, 2, 3], 5); - * // => [] - * - * _.dropRight([1, 2, 3], 0); - * // => [1, 2, 3] - */ - function dropRight(array, n, guard) { - var length = array == null ? 0 : array.length; - if (!length) { - return []; - } - n = (guard || n === undefined) ? 1 : toInteger(n); - n = length - n; - return baseSlice(array, 0, n < 0 ? 0 : n); - } - - /** - * Creates a slice of `array` excluding elements dropped from the end. - * Elements are dropped until `predicate` returns falsey. The predicate is - * invoked with three arguments: (value, index, array). - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Array - * @param {Array} array The array to query. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @returns {Array} Returns the slice of `array`. - * @example - * - * var users = [ - * { 'user': 'barney', 'active': true }, - * { 'user': 'fred', 'active': false }, - * { 'user': 'pebbles', 'active': false } - * ]; - * - * _.dropRightWhile(users, function(o) { return !o.active; }); - * // => objects for ['barney'] - * - * // The `_.matches` iteratee shorthand. - * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false }); - * // => objects for ['barney', 'fred'] - * - * // The `_.matchesProperty` iteratee shorthand. - * _.dropRightWhile(users, ['active', false]); - * // => objects for ['barney'] - * - * // The `_.property` iteratee shorthand. - * _.dropRightWhile(users, 'active'); - * // => objects for ['barney', 'fred', 'pebbles'] - */ - function dropRightWhile(array, predicate) { - return (array && array.length) - ? baseWhile(array, getIteratee(predicate, 3), true, true) - : []; - } - - /** - * Creates a slice of `array` excluding elements dropped from the beginning. - * Elements are dropped until `predicate` returns falsey. The predicate is - * invoked with three arguments: (value, index, array). - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Array - * @param {Array} array The array to query. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @returns {Array} Returns the slice of `array`. - * @example - * - * var users = [ - * { 'user': 'barney', 'active': false }, - * { 'user': 'fred', 'active': false }, - * { 'user': 'pebbles', 'active': true } - * ]; - * - * _.dropWhile(users, function(o) { return !o.active; }); - * // => objects for ['pebbles'] - * - * // The `_.matches` iteratee shorthand. - * _.dropWhile(users, { 'user': 'barney', 'active': false }); - * // => objects for ['fred', 'pebbles'] - * - * // The `_.matchesProperty` iteratee shorthand. - * _.dropWhile(users, ['active', false]); - * // => objects for ['pebbles'] - * - * // The `_.property` iteratee shorthand. - * _.dropWhile(users, 'active'); - * // => objects for ['barney', 'fred', 'pebbles'] - */ - function dropWhile(array, predicate) { - return (array && array.length) - ? baseWhile(array, getIteratee(predicate, 3), true) - : []; - } - - /** - * Fills elements of `array` with `value` from `start` up to, but not - * including, `end`. - * - * **Note:** This method mutates `array`. - * - * @static - * @memberOf _ - * @since 3.2.0 - * @category Array - * @param {Array} array The array to fill. - * @param {*} value The value to fill `array` with. - * @param {number} [start=0] The start position. - * @param {number} [end=array.length] The end position. - * @returns {Array} Returns `array`. - * @example - * - * var array = [1, 2, 3]; - * - * _.fill(array, 'a'); - * console.log(array); - * // => ['a', 'a', 'a'] - * - * _.fill(Array(3), 2); - * // => [2, 2, 2] - * - * _.fill([4, 6, 8, 10], '*', 1, 3); - * // => [4, '*', '*', 10] - */ - function fill(array, value, start, end) { - var length = array == null ? 0 : array.length; - if (!length) { - return []; - } - if (start && typeof start != 'number' && isIterateeCall(array, value, start)) { - start = 0; - end = length; - } - return baseFill(array, value, start, end); - } - - /** - * This method is like `_.find` except that it returns the index of the first - * element `predicate` returns truthy for instead of the element itself. - * - * @static - * @memberOf _ - * @since 1.1.0 - * @category Array - * @param {Array} array The array to inspect. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @param {number} [fromIndex=0] The index to search from. - * @returns {number} Returns the index of the found element, else `-1`. - * @example - * - * var users = [ - * { 'user': 'barney', 'active': false }, - * { 'user': 'fred', 'active': false }, - * { 'user': 'pebbles', 'active': true } - * ]; - * - * _.findIndex(users, function(o) { return o.user == 'barney'; }); - * // => 0 - * - * // The `_.matches` iteratee shorthand. - * _.findIndex(users, { 'user': 'fred', 'active': false }); - * // => 1 - * - * // The `_.matchesProperty` iteratee shorthand. - * _.findIndex(users, ['active', false]); - * // => 0 - * - * // The `_.property` iteratee shorthand. - * _.findIndex(users, 'active'); - * // => 2 - */ - function findIndex(array, predicate, fromIndex) { - var length = array == null ? 0 : array.length; - if (!length) { - return -1; - } - var index = fromIndex == null ? 0 : toInteger(fromIndex); - if (index < 0) { - index = nativeMax(length + index, 0); - } - return baseFindIndex(array, getIteratee(predicate, 3), index); - } - - /** - * This method is like `_.findIndex` except that it iterates over elements - * of `collection` from right to left. - * - * @static - * @memberOf _ - * @since 2.0.0 - * @category Array - * @param {Array} array The array to inspect. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @param {number} [fromIndex=array.length-1] The index to search from. - * @returns {number} Returns the index of the found element, else `-1`. - * @example - * - * var users = [ - * { 'user': 'barney', 'active': true }, - * { 'user': 'fred', 'active': false }, - * { 'user': 'pebbles', 'active': false } - * ]; - * - * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; }); - * // => 2 - * - * // The `_.matches` iteratee shorthand. - * _.findLastIndex(users, { 'user': 'barney', 'active': true }); - * // => 0 - * - * // The `_.matchesProperty` iteratee shorthand. - * _.findLastIndex(users, ['active', false]); - * // => 2 - * - * // The `_.property` iteratee shorthand. - * _.findLastIndex(users, 'active'); - * // => 0 - */ - function findLastIndex(array, predicate, fromIndex) { - var length = array == null ? 0 : array.length; - if (!length) { - return -1; - } - var index = length - 1; - if (fromIndex !== undefined) { - index = toInteger(fromIndex); - index = fromIndex < 0 - ? nativeMax(length + index, 0) - : nativeMin(index, length - 1); - } - return baseFindIndex(array, getIteratee(predicate, 3), index, true); - } - - /** - * Flattens `array` a single level deep. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Array - * @param {Array} array The array to flatten. - * @returns {Array} Returns the new flattened array. - * @example - * - * _.flatten([1, [2, [3, [4]], 5]]); - * // => [1, 2, [3, [4]], 5] - */ - function flatten(array) { - var length = array == null ? 0 : array.length; - return length ? baseFlatten(array, 1) : []; - } - - /** - * Recursively flattens `array`. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Array - * @param {Array} array The array to flatten. - * @returns {Array} Returns the new flattened array. - * @example - * - * _.flattenDeep([1, [2, [3, [4]], 5]]); - * // => [1, 2, 3, 4, 5] - */ - function flattenDeep(array) { - var length = array == null ? 0 : array.length; - return length ? baseFlatten(array, INFINITY) : []; - } - - /** - * Recursively flatten `array` up to `depth` times. - * - * @static - * @memberOf _ - * @since 4.4.0 - * @category Array - * @param {Array} array The array to flatten. - * @param {number} [depth=1] The maximum recursion depth. - * @returns {Array} Returns the new flattened array. - * @example - * - * var array = [1, [2, [3, [4]], 5]]; - * - * _.flattenDepth(array, 1); - * // => [1, 2, [3, [4]], 5] - * - * _.flattenDepth(array, 2); - * // => [1, 2, 3, [4], 5] - */ - function flattenDepth(array, depth) { - var length = array == null ? 0 : array.length; - if (!length) { - return []; - } - depth = depth === undefined ? 1 : toInteger(depth); - return baseFlatten(array, depth); - } - - /** - * The inverse of `_.toPairs`; this method returns an object composed - * from key-value `pairs`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {Array} pairs The key-value pairs. - * @returns {Object} Returns the new object. - * @example - * - * _.fromPairs([['a', 1], ['b', 2]]); - * // => { 'a': 1, 'b': 2 } - */ - function fromPairs(pairs) { - var index = -1, - length = pairs == null ? 0 : pairs.length, - result = {}; - - while (++index < length) { - var pair = pairs[index]; - result[pair[0]] = pair[1]; - } - return result; - } - - /** - * Gets the first element of `array`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @alias first - * @category Array - * @param {Array} array The array to query. - * @returns {*} Returns the first element of `array`. - * @example - * - * _.head([1, 2, 3]); - * // => 1 - * - * _.head([]); - * // => undefined - */ - function head(array) { - return (array && array.length) ? array[0] : undefined; - } - - /** - * Gets the index at which the first occurrence of `value` is found in `array` - * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * for equality comparisons. If `fromIndex` is negative, it's used as the - * offset from the end of `array`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Array - * @param {Array} array The array to inspect. - * @param {*} value The value to search for. - * @param {number} [fromIndex=0] The index to search from. - * @returns {number} Returns the index of the matched value, else `-1`. - * @example - * - * _.indexOf([1, 2, 1, 2], 2); - * // => 1 - * - * // Search from the `fromIndex`. - * _.indexOf([1, 2, 1, 2], 2, 2); - * // => 3 - */ - function indexOf(array, value, fromIndex) { - var length = array == null ? 0 : array.length; - if (!length) { - return -1; - } - var index = fromIndex == null ? 0 : toInteger(fromIndex); - if (index < 0) { - index = nativeMax(length + index, 0); - } - return baseIndexOf(array, value, index); - } - - /** - * Gets all but the last element of `array`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Array - * @param {Array} array The array to query. - * @returns {Array} Returns the slice of `array`. - * @example - * - * _.initial([1, 2, 3]); - * // => [1, 2] - */ - function initial(array) { - var length = array == null ? 0 : array.length; - return length ? baseSlice(array, 0, -1) : []; - } - - /** - * Creates an array of unique values that are included in all given arrays - * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * for equality comparisons. The order and references of result values are - * determined by the first array. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Array - * @param {...Array} [arrays] The arrays to inspect. - * @returns {Array} Returns the new array of intersecting values. - * @example - * - * _.intersection([2, 1], [2, 3]); - * // => [2] - */ - var intersection = baseRest(function(arrays) { - var mapped = arrayMap(arrays, castArrayLikeObject); - return (mapped.length && mapped[0] === arrays[0]) - ? baseIntersection(mapped) - : []; - }); - - /** - * This method is like `_.intersection` except that it accepts `iteratee` - * which is invoked for each element of each `arrays` to generate the criterion - * by which they're compared. The order and references of result values are - * determined by the first array. The iteratee is invoked with one argument: - * (value). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {...Array} [arrays] The arrays to inspect. - * @param {Function} [iteratee=_.identity] The iteratee invoked per element. - * @returns {Array} Returns the new array of intersecting values. - * @example - * - * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor); - * // => [2.1] - * - * // The `_.property` iteratee shorthand. - * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); - * // => [{ 'x': 1 }] - */ - var intersectionBy = baseRest(function(arrays) { - var iteratee = last(arrays), - mapped = arrayMap(arrays, castArrayLikeObject); - - if (iteratee === last(mapped)) { - iteratee = undefined; - } else { - mapped.pop(); - } - return (mapped.length && mapped[0] === arrays[0]) - ? baseIntersection(mapped, getIteratee(iteratee, 2)) - : []; - }); - - /** - * This method is like `_.intersection` except that it accepts `comparator` - * which is invoked to compare elements of `arrays`. The order and references - * of result values are determined by the first array. The comparator is - * invoked with two arguments: (arrVal, othVal). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {...Array} [arrays] The arrays to inspect. - * @param {Function} [comparator] The comparator invoked per element. - * @returns {Array} Returns the new array of intersecting values. - * @example - * - * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; - * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; - * - * _.intersectionWith(objects, others, _.isEqual); - * // => [{ 'x': 1, 'y': 2 }] - */ - var intersectionWith = baseRest(function(arrays) { - var comparator = last(arrays), - mapped = arrayMap(arrays, castArrayLikeObject); - - comparator = typeof comparator == 'function' ? comparator : undefined; - if (comparator) { - mapped.pop(); - } - return (mapped.length && mapped[0] === arrays[0]) - ? baseIntersection(mapped, undefined, comparator) - : []; - }); - - /** - * Converts all elements in `array` into a string separated by `separator`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {Array} array The array to convert. - * @param {string} [separator=','] The element separator. - * @returns {string} Returns the joined string. - * @example - * - * _.join(['a', 'b', 'c'], '~'); - * // => 'a~b~c' - */ - function join(array, separator) { - return array == null ? '' : nativeJoin.call(array, separator); - } - - /** - * Gets the last element of `array`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Array - * @param {Array} array The array to query. - * @returns {*} Returns the last element of `array`. - * @example - * - * _.last([1, 2, 3]); - * // => 3 - */ - function last(array) { - var length = array == null ? 0 : array.length; - return length ? array[length - 1] : undefined; - } - - /** - * This method is like `_.indexOf` except that it iterates over elements of - * `array` from right to left. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Array - * @param {Array} array The array to inspect. - * @param {*} value The value to search for. - * @param {number} [fromIndex=array.length-1] The index to search from. - * @returns {number} Returns the index of the matched value, else `-1`. - * @example - * - * _.lastIndexOf([1, 2, 1, 2], 2); - * // => 3 - * - * // Search from the `fromIndex`. - * _.lastIndexOf([1, 2, 1, 2], 2, 2); - * // => 1 - */ - function lastIndexOf(array, value, fromIndex) { - var length = array == null ? 0 : array.length; - if (!length) { - return -1; - } - var index = length; - if (fromIndex !== undefined) { - index = toInteger(fromIndex); - index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1); - } - return value === value - ? strictLastIndexOf(array, value, index) - : baseFindIndex(array, baseIsNaN, index, true); - } - - /** - * Gets the element at index `n` of `array`. If `n` is negative, the nth - * element from the end is returned. - * - * @static - * @memberOf _ - * @since 4.11.0 - * @category Array - * @param {Array} array The array to query. - * @param {number} [n=0] The index of the element to return. - * @returns {*} Returns the nth element of `array`. - * @example - * - * var array = ['a', 'b', 'c', 'd']; - * - * _.nth(array, 1); - * // => 'b' - * - * _.nth(array, -2); - * // => 'c'; - */ - function nth(array, n) { - return (array && array.length) ? baseNth(array, toInteger(n)) : undefined; - } - - /** - * Removes all given values from `array` using - * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * for equality comparisons. - * - * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove` - * to remove elements from an array by predicate. - * - * @static - * @memberOf _ - * @since 2.0.0 - * @category Array - * @param {Array} array The array to modify. - * @param {...*} [values] The values to remove. - * @returns {Array} Returns `array`. - * @example - * - * var array = ['a', 'b', 'c', 'a', 'b', 'c']; - * - * _.pull(array, 'a', 'c'); - * console.log(array); - * // => ['b', 'b'] - */ - var pull = baseRest(pullAll); - - /** - * This method is like `_.pull` except that it accepts an array of values to remove. - * - * **Note:** Unlike `_.difference`, this method mutates `array`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {Array} array The array to modify. - * @param {Array} values The values to remove. - * @returns {Array} Returns `array`. - * @example - * - * var array = ['a', 'b', 'c', 'a', 'b', 'c']; - * - * _.pullAll(array, ['a', 'c']); - * console.log(array); - * // => ['b', 'b'] - */ - function pullAll(array, values) { - return (array && array.length && values && values.length) - ? basePullAll(array, values) - : array; - } - - /** - * This method is like `_.pullAll` except that it accepts `iteratee` which is - * invoked for each element of `array` and `values` to generate the criterion - * by which they're compared. The iteratee is invoked with one argument: (value). - * - * **Note:** Unlike `_.differenceBy`, this method mutates `array`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {Array} array The array to modify. - * @param {Array} values The values to remove. - * @param {Function} [iteratee=_.identity] The iteratee invoked per element. - * @returns {Array} Returns `array`. - * @example - * - * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }]; - * - * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x'); - * console.log(array); - * // => [{ 'x': 2 }] - */ - function pullAllBy(array, values, iteratee) { - return (array && array.length && values && values.length) - ? basePullAll(array, values, getIteratee(iteratee, 2)) - : array; - } - - /** - * This method is like `_.pullAll` except that it accepts `comparator` which - * is invoked to compare elements of `array` to `values`. The comparator is - * invoked with two arguments: (arrVal, othVal). - * - * **Note:** Unlike `_.differenceWith`, this method mutates `array`. - * - * @static - * @memberOf _ - * @since 4.6.0 - * @category Array - * @param {Array} array The array to modify. - * @param {Array} values The values to remove. - * @param {Function} [comparator] The comparator invoked per element. - * @returns {Array} Returns `array`. - * @example - * - * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }]; - * - * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual); - * console.log(array); - * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }] - */ - function pullAllWith(array, values, comparator) { - return (array && array.length && values && values.length) - ? basePullAll(array, values, undefined, comparator) - : array; - } - - /** - * Removes elements from `array` corresponding to `indexes` and returns an - * array of removed elements. - * - * **Note:** Unlike `_.at`, this method mutates `array`. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Array - * @param {Array} array The array to modify. - * @param {...(number|number[])} [indexes] The indexes of elements to remove. - * @returns {Array} Returns the new array of removed elements. - * @example - * - * var array = ['a', 'b', 'c', 'd']; - * var pulled = _.pullAt(array, [1, 3]); - * - * console.log(array); - * // => ['a', 'c'] - * - * console.log(pulled); - * // => ['b', 'd'] - */ - var pullAt = flatRest(function(array, indexes) { - var length = array == null ? 0 : array.length, - result = baseAt(array, indexes); - - basePullAt(array, arrayMap(indexes, function(index) { - return isIndex(index, length) ? +index : index; - }).sort(compareAscending)); - - return result; - }); - - /** - * Removes all elements from `array` that `predicate` returns truthy for - * and returns an array of the removed elements. The predicate is invoked - * with three arguments: (value, index, array). - * - * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull` - * to pull elements from an array by value. - * - * @static - * @memberOf _ - * @since 2.0.0 - * @category Array - * @param {Array} array The array to modify. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @returns {Array} Returns the new array of removed elements. - * @example - * - * var array = [1, 2, 3, 4]; - * var evens = _.remove(array, function(n) { - * return n % 2 == 0; - * }); - * - * console.log(array); - * // => [1, 3] - * - * console.log(evens); - * // => [2, 4] - */ - function remove(array, predicate) { - var result = []; - if (!(array && array.length)) { - return result; - } - var index = -1, - indexes = [], - length = array.length; - - predicate = getIteratee(predicate, 3); - while (++index < length) { - var value = array[index]; - if (predicate(value, index, array)) { - result.push(value); - indexes.push(index); - } - } - basePullAt(array, indexes); - return result; - } - - /** - * Reverses `array` so that the first element becomes the last, the second - * element becomes the second to last, and so on. - * - * **Note:** This method mutates `array` and is based on - * [`Array#reverse`](https://mdn.io/Array/reverse). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {Array} array The array to modify. - * @returns {Array} Returns `array`. - * @example - * - * var array = [1, 2, 3]; - * - * _.reverse(array); - * // => [3, 2, 1] - * - * console.log(array); - * // => [3, 2, 1] - */ - function reverse(array) { - return array == null ? array : nativeReverse.call(array); - } - - /** - * Creates a slice of `array` from `start` up to, but not including, `end`. - * - * **Note:** This method is used instead of - * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are - * returned. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Array - * @param {Array} array The array to slice. - * @param {number} [start=0] The start position. - * @param {number} [end=array.length] The end position. - * @returns {Array} Returns the slice of `array`. - */ - function slice(array, start, end) { - var length = array == null ? 0 : array.length; - if (!length) { - return []; - } - if (end && typeof end != 'number' && isIterateeCall(array, start, end)) { - start = 0; - end = length; - } - else { - start = start == null ? 0 : toInteger(start); - end = end === undefined ? length : toInteger(end); - } - return baseSlice(array, start, end); - } - - /** - * Uses a binary search to determine the lowest index at which `value` - * should be inserted into `array` in order to maintain its sort order. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Array - * @param {Array} array The sorted array to inspect. - * @param {*} value The value to evaluate. - * @returns {number} Returns the index at which `value` should be inserted - * into `array`. - * @example - * - * _.sortedIndex([30, 50], 40); - * // => 1 - */ - function sortedIndex(array, value) { - return baseSortedIndex(array, value); - } - - /** - * This method is like `_.sortedIndex` except that it accepts `iteratee` - * which is invoked for `value` and each element of `array` to compute their - * sort ranking. The iteratee is invoked with one argument: (value). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {Array} array The sorted array to inspect. - * @param {*} value The value to evaluate. - * @param {Function} [iteratee=_.identity] The iteratee invoked per element. - * @returns {number} Returns the index at which `value` should be inserted - * into `array`. - * @example - * - * var objects = [{ 'x': 4 }, { 'x': 5 }]; - * - * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; }); - * // => 0 - * - * // The `_.property` iteratee shorthand. - * _.sortedIndexBy(objects, { 'x': 4 }, 'x'); - * // => 0 - */ - function sortedIndexBy(array, value, iteratee) { - return baseSortedIndexBy(array, value, getIteratee(iteratee, 2)); - } - - /** - * This method is like `_.indexOf` except that it performs a binary - * search on a sorted `array`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {Array} array The array to inspect. - * @param {*} value The value to search for. - * @returns {number} Returns the index of the matched value, else `-1`. - * @example - * - * _.sortedIndexOf([4, 5, 5, 5, 6], 5); - * // => 1 - */ - function sortedIndexOf(array, value) { - var length = array == null ? 0 : array.length; - if (length) { - var index = baseSortedIndex(array, value); - if (index < length && eq(array[index], value)) { - return index; - } - } - return -1; - } - - /** - * This method is like `_.sortedIndex` except that it returns the highest - * index at which `value` should be inserted into `array` in order to - * maintain its sort order. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Array - * @param {Array} array The sorted array to inspect. - * @param {*} value The value to evaluate. - * @returns {number} Returns the index at which `value` should be inserted - * into `array`. - * @example - * - * _.sortedLastIndex([4, 5, 5, 5, 6], 5); - * // => 4 - */ - function sortedLastIndex(array, value) { - return baseSortedIndex(array, value, true); - } - - /** - * This method is like `_.sortedLastIndex` except that it accepts `iteratee` - * which is invoked for `value` and each element of `array` to compute their - * sort ranking. The iteratee is invoked with one argument: (value). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {Array} array The sorted array to inspect. - * @param {*} value The value to evaluate. - * @param {Function} [iteratee=_.identity] The iteratee invoked per element. - * @returns {number} Returns the index at which `value` should be inserted - * into `array`. - * @example - * - * var objects = [{ 'x': 4 }, { 'x': 5 }]; - * - * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; }); - * // => 1 - * - * // The `_.property` iteratee shorthand. - * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x'); - * // => 1 - */ - function sortedLastIndexBy(array, value, iteratee) { - return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true); - } - - /** - * This method is like `_.lastIndexOf` except that it performs a binary - * search on a sorted `array`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {Array} array The array to inspect. - * @param {*} value The value to search for. - * @returns {number} Returns the index of the matched value, else `-1`. - * @example - * - * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5); - * // => 3 - */ - function sortedLastIndexOf(array, value) { - var length = array == null ? 0 : array.length; - if (length) { - var index = baseSortedIndex(array, value, true) - 1; - if (eq(array[index], value)) { - return index; - } - } - return -1; - } - - /** - * This method is like `_.uniq` except that it's designed and optimized - * for sorted arrays. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {Array} array The array to inspect. - * @returns {Array} Returns the new duplicate free array. - * @example - * - * _.sortedUniq([1, 1, 2]); - * // => [1, 2] - */ - function sortedUniq(array) { - return (array && array.length) - ? baseSortedUniq(array) - : []; - } - - /** - * This method is like `_.uniqBy` except that it's designed and optimized - * for sorted arrays. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {Array} array The array to inspect. - * @param {Function} [iteratee] The iteratee invoked per element. - * @returns {Array} Returns the new duplicate free array. - * @example - * - * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor); - * // => [1.1, 2.3] - */ - function sortedUniqBy(array, iteratee) { - return (array && array.length) - ? baseSortedUniq(array, getIteratee(iteratee, 2)) - : []; - } - - /** - * Gets all but the first element of `array`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {Array} array The array to query. - * @returns {Array} Returns the slice of `array`. - * @example - * - * _.tail([1, 2, 3]); - * // => [2, 3] - */ - function tail(array) { - var length = array == null ? 0 : array.length; - return length ? baseSlice(array, 1, length) : []; - } - - /** - * Creates a slice of `array` with `n` elements taken from the beginning. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Array - * @param {Array} array The array to query. - * @param {number} [n=1] The number of elements to take. - * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. - * @returns {Array} Returns the slice of `array`. - * @example - * - * _.take([1, 2, 3]); - * // => [1] - * - * _.take([1, 2, 3], 2); - * // => [1, 2] - * - * _.take([1, 2, 3], 5); - * // => [1, 2, 3] - * - * _.take([1, 2, 3], 0); - * // => [] - */ - function take(array, n, guard) { - if (!(array && array.length)) { - return []; - } - n = (guard || n === undefined) ? 1 : toInteger(n); - return baseSlice(array, 0, n < 0 ? 0 : n); - } - - /** - * Creates a slice of `array` with `n` elements taken from the end. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Array - * @param {Array} array The array to query. - * @param {number} [n=1] The number of elements to take. - * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. - * @returns {Array} Returns the slice of `array`. - * @example - * - * _.takeRight([1, 2, 3]); - * // => [3] - * - * _.takeRight([1, 2, 3], 2); - * // => [2, 3] - * - * _.takeRight([1, 2, 3], 5); - * // => [1, 2, 3] - * - * _.takeRight([1, 2, 3], 0); - * // => [] - */ - function takeRight(array, n, guard) { - var length = array == null ? 0 : array.length; - if (!length) { - return []; - } - n = (guard || n === undefined) ? 1 : toInteger(n); - n = length - n; - return baseSlice(array, n < 0 ? 0 : n, length); - } - - /** - * Creates a slice of `array` with elements taken from the end. Elements are - * taken until `predicate` returns falsey. The predicate is invoked with - * three arguments: (value, index, array). - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Array - * @param {Array} array The array to query. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @returns {Array} Returns the slice of `array`. - * @example - * - * var users = [ - * { 'user': 'barney', 'active': true }, - * { 'user': 'fred', 'active': false }, - * { 'user': 'pebbles', 'active': false } - * ]; - * - * _.takeRightWhile(users, function(o) { return !o.active; }); - * // => objects for ['fred', 'pebbles'] - * - * // The `_.matches` iteratee shorthand. - * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false }); - * // => objects for ['pebbles'] - * - * // The `_.matchesProperty` iteratee shorthand. - * _.takeRightWhile(users, ['active', false]); - * // => objects for ['fred', 'pebbles'] - * - * // The `_.property` iteratee shorthand. - * _.takeRightWhile(users, 'active'); - * // => [] - */ - function takeRightWhile(array, predicate) { - return (array && array.length) - ? baseWhile(array, getIteratee(predicate, 3), false, true) - : []; - } - - /** - * Creates a slice of `array` with elements taken from the beginning. Elements - * are taken until `predicate` returns falsey. The predicate is invoked with - * three arguments: (value, index, array). - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Array - * @param {Array} array The array to query. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @returns {Array} Returns the slice of `array`. - * @example - * - * var users = [ - * { 'user': 'barney', 'active': false }, - * { 'user': 'fred', 'active': false }, - * { 'user': 'pebbles', 'active': true } - * ]; - * - * _.takeWhile(users, function(o) { return !o.active; }); - * // => objects for ['barney', 'fred'] - * - * // The `_.matches` iteratee shorthand. - * _.takeWhile(users, { 'user': 'barney', 'active': false }); - * // => objects for ['barney'] - * - * // The `_.matchesProperty` iteratee shorthand. - * _.takeWhile(users, ['active', false]); - * // => objects for ['barney', 'fred'] - * - * // The `_.property` iteratee shorthand. - * _.takeWhile(users, 'active'); - * // => [] - */ - function takeWhile(array, predicate) { - return (array && array.length) - ? baseWhile(array, getIteratee(predicate, 3)) - : []; - } - - /** - * Creates an array of unique values, in order, from all given arrays using - * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * for equality comparisons. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Array - * @param {...Array} [arrays] The arrays to inspect. - * @returns {Array} Returns the new array of combined values. - * @example - * - * _.union([2], [1, 2]); - * // => [2, 1] - */ - var union = baseRest(function(arrays) { - return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true)); - }); - - /** - * This method is like `_.union` except that it accepts `iteratee` which is - * invoked for each element of each `arrays` to generate the criterion by - * which uniqueness is computed. Result values are chosen from the first - * array in which the value occurs. The iteratee is invoked with one argument: - * (value). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {...Array} [arrays] The arrays to inspect. - * @param {Function} [iteratee=_.identity] The iteratee invoked per element. - * @returns {Array} Returns the new array of combined values. - * @example - * - * _.unionBy([2.1], [1.2, 2.3], Math.floor); - * // => [2.1, 1.2] - * - * // The `_.property` iteratee shorthand. - * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); - * // => [{ 'x': 1 }, { 'x': 2 }] - */ - var unionBy = baseRest(function(arrays) { - var iteratee = last(arrays); - if (isArrayLikeObject(iteratee)) { - iteratee = undefined; - } - return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2)); - }); - - /** - * This method is like `_.union` except that it accepts `comparator` which - * is invoked to compare elements of `arrays`. Result values are chosen from - * the first array in which the value occurs. The comparator is invoked - * with two arguments: (arrVal, othVal). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {...Array} [arrays] The arrays to inspect. - * @param {Function} [comparator] The comparator invoked per element. - * @returns {Array} Returns the new array of combined values. - * @example - * - * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; - * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; - * - * _.unionWith(objects, others, _.isEqual); - * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }] - */ - var unionWith = baseRest(function(arrays) { - var comparator = last(arrays); - comparator = typeof comparator == 'function' ? comparator : undefined; - return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator); - }); - - /** - * Creates a duplicate-free version of an array, using - * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * for equality comparisons, in which only the first occurrence of each element - * is kept. The order of result values is determined by the order they occur - * in the array. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Array - * @param {Array} array The array to inspect. - * @returns {Array} Returns the new duplicate free array. - * @example - * - * _.uniq([2, 1, 2]); - * // => [2, 1] - */ - function uniq(array) { - return (array && array.length) ? baseUniq(array) : []; - } - - /** - * This method is like `_.uniq` except that it accepts `iteratee` which is - * invoked for each element in `array` to generate the criterion by which - * uniqueness is computed. The order of result values is determined by the - * order they occur in the array. The iteratee is invoked with one argument: - * (value). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {Array} array The array to inspect. - * @param {Function} [iteratee=_.identity] The iteratee invoked per element. - * @returns {Array} Returns the new duplicate free array. - * @example - * - * _.uniqBy([2.1, 1.2, 2.3], Math.floor); - * // => [2.1, 1.2] - * - * // The `_.property` iteratee shorthand. - * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x'); - * // => [{ 'x': 1 }, { 'x': 2 }] - */ - function uniqBy(array, iteratee) { - return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : []; - } - - /** - * This method is like `_.uniq` except that it accepts `comparator` which - * is invoked to compare elements of `array`. The order of result values is - * determined by the order they occur in the array.The comparator is invoked - * with two arguments: (arrVal, othVal). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {Array} array The array to inspect. - * @param {Function} [comparator] The comparator invoked per element. - * @returns {Array} Returns the new duplicate free array. - * @example - * - * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }]; - * - * _.uniqWith(objects, _.isEqual); - * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }] - */ - function uniqWith(array, comparator) { - comparator = typeof comparator == 'function' ? comparator : undefined; - return (array && array.length) ? baseUniq(array, undefined, comparator) : []; - } - - /** - * This method is like `_.zip` except that it accepts an array of grouped - * elements and creates an array regrouping the elements to their pre-zip - * configuration. - * - * @static - * @memberOf _ - * @since 1.2.0 - * @category Array - * @param {Array} array The array of grouped elements to process. - * @returns {Array} Returns the new array of regrouped elements. - * @example - * - * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]); - * // => [['a', 1, true], ['b', 2, false]] - * - * _.unzip(zipped); - * // => [['a', 'b'], [1, 2], [true, false]] - */ - function unzip(array) { - if (!(array && array.length)) { - return []; - } - var length = 0; - array = arrayFilter(array, function(group) { - if (isArrayLikeObject(group)) { - length = nativeMax(group.length, length); - return true; - } - }); - return baseTimes(length, function(index) { - return arrayMap(array, baseProperty(index)); - }); - } - - /** - * This method is like `_.unzip` except that it accepts `iteratee` to specify - * how regrouped values should be combined. The iteratee is invoked with the - * elements of each group: (...group). - * - * @static - * @memberOf _ - * @since 3.8.0 - * @category Array - * @param {Array} array The array of grouped elements to process. - * @param {Function} [iteratee=_.identity] The function to combine - * regrouped values. - * @returns {Array} Returns the new array of regrouped elements. - * @example - * - * var zipped = _.zip([1, 2], [10, 20], [100, 200]); - * // => [[1, 10, 100], [2, 20, 200]] - * - * _.unzipWith(zipped, _.add); - * // => [3, 30, 300] - */ - function unzipWith(array, iteratee) { - if (!(array && array.length)) { - return []; - } - var result = unzip(array); - if (iteratee == null) { - return result; - } - return arrayMap(result, function(group) { - return apply(iteratee, undefined, group); - }); - } - - /** - * Creates an array excluding all given values using - * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * for equality comparisons. - * - * **Note:** Unlike `_.pull`, this method returns a new array. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Array - * @param {Array} array The array to inspect. - * @param {...*} [values] The values to exclude. - * @returns {Array} Returns the new array of filtered values. - * @see _.difference, _.xor - * @example - * - * _.without([2, 1, 2, 3], 1, 2); - * // => [3] - */ - var without = baseRest(function(array, values) { - return isArrayLikeObject(array) - ? baseDifference(array, values) - : []; - }); - - /** - * Creates an array of unique values that is the - * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference) - * of the given arrays. The order of result values is determined by the order - * they occur in the arrays. - * - * @static - * @memberOf _ - * @since 2.4.0 - * @category Array - * @param {...Array} [arrays] The arrays to inspect. - * @returns {Array} Returns the new array of filtered values. - * @see _.difference, _.without - * @example - * - * _.xor([2, 1], [2, 3]); - * // => [1, 3] - */ - var xor = baseRest(function(arrays) { - return baseXor(arrayFilter(arrays, isArrayLikeObject)); - }); - - /** - * This method is like `_.xor` except that it accepts `iteratee` which is - * invoked for each element of each `arrays` to generate the criterion by - * which by which they're compared. The order of result values is determined - * by the order they occur in the arrays. The iteratee is invoked with one - * argument: (value). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {...Array} [arrays] The arrays to inspect. - * @param {Function} [iteratee=_.identity] The iteratee invoked per element. - * @returns {Array} Returns the new array of filtered values. - * @example - * - * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor); - * // => [1.2, 3.4] - * - * // The `_.property` iteratee shorthand. - * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); - * // => [{ 'x': 2 }] - */ - var xorBy = baseRest(function(arrays) { - var iteratee = last(arrays); - if (isArrayLikeObject(iteratee)) { - iteratee = undefined; - } - return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2)); - }); - - /** - * This method is like `_.xor` except that it accepts `comparator` which is - * invoked to compare elements of `arrays`. The order of result values is - * determined by the order they occur in the arrays. The comparator is invoked - * with two arguments: (arrVal, othVal). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {...Array} [arrays] The arrays to inspect. - * @param {Function} [comparator] The comparator invoked per element. - * @returns {Array} Returns the new array of filtered values. - * @example - * - * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; - * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; - * - * _.xorWith(objects, others, _.isEqual); - * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }] - */ - var xorWith = baseRest(function(arrays) { - var comparator = last(arrays); - comparator = typeof comparator == 'function' ? comparator : undefined; - return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator); - }); - - /** - * Creates an array of grouped elements, the first of which contains the - * first elements of the given arrays, the second of which contains the - * second elements of the given arrays, and so on. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Array - * @param {...Array} [arrays] The arrays to process. - * @returns {Array} Returns the new array of grouped elements. - * @example - * - * _.zip(['a', 'b'], [1, 2], [true, false]); - * // => [['a', 1, true], ['b', 2, false]] - */ - var zip = baseRest(unzip); - - /** - * This method is like `_.fromPairs` except that it accepts two arrays, - * one of property identifiers and one of corresponding values. - * - * @static - * @memberOf _ - * @since 0.4.0 - * @category Array - * @param {Array} [props=[]] The property identifiers. - * @param {Array} [values=[]] The property values. - * @returns {Object} Returns the new object. - * @example - * - * _.zipObject(['a', 'b'], [1, 2]); - * // => { 'a': 1, 'b': 2 } - */ - function zipObject(props, values) { - return baseZipObject(props || [], values || [], assignValue); - } - - /** - * This method is like `_.zipObject` except that it supports property paths. - * - * @static - * @memberOf _ - * @since 4.1.0 - * @category Array - * @param {Array} [props=[]] The property identifiers. - * @param {Array} [values=[]] The property values. - * @returns {Object} Returns the new object. - * @example - * - * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]); - * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } } - */ - function zipObjectDeep(props, values) { - return baseZipObject(props || [], values || [], baseSet); - } - - /** - * This method is like `_.zip` except that it accepts `iteratee` to specify - * how grouped values should be combined. The iteratee is invoked with the - * elements of each group: (...group). - * - * @static - * @memberOf _ - * @since 3.8.0 - * @category Array - * @param {...Array} [arrays] The arrays to process. - * @param {Function} [iteratee=_.identity] The function to combine - * grouped values. - * @returns {Array} Returns the new array of grouped elements. - * @example - * - * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) { - * return a + b + c; - * }); - * // => [111, 222] - */ - var zipWith = baseRest(function(arrays) { - var length = arrays.length, - iteratee = length > 1 ? arrays[length - 1] : undefined; - - iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined; - return unzipWith(arrays, iteratee); - }); - - /*------------------------------------------------------------------------*/ - - /** - * Creates a `lodash` wrapper instance that wraps `value` with explicit method - * chain sequences enabled. The result of such sequences must be unwrapped - * with `_#value`. - * - * @static - * @memberOf _ - * @since 1.3.0 - * @category Seq - * @param {*} value The value to wrap. - * @returns {Object} Returns the new `lodash` wrapper instance. - * @example - * - * var users = [ - * { 'user': 'barney', 'age': 36 }, - * { 'user': 'fred', 'age': 40 }, - * { 'user': 'pebbles', 'age': 1 } - * ]; - * - * var youngest = _ - * .chain(users) - * .sortBy('age') - * .map(function(o) { - * return o.user + ' is ' + o.age; - * }) - * .head() - * .value(); - * // => 'pebbles is 1' - */ - function chain(value) { - var result = lodash(value); - result.__chain__ = true; - return result; - } - - /** - * This method invokes `interceptor` and returns `value`. The interceptor - * is invoked with one argument; (value). The purpose of this method is to - * "tap into" a method chain sequence in order to modify intermediate results. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Seq - * @param {*} value The value to provide to `interceptor`. - * @param {Function} interceptor The function to invoke. - * @returns {*} Returns `value`. - * @example - * - * _([1, 2, 3]) - * .tap(function(array) { - * // Mutate input array. - * array.pop(); - * }) - * .reverse() - * .value(); - * // => [2, 1] - */ - function tap(value, interceptor) { - interceptor(value); - return value; - } - - /** - * This method is like `_.tap` except that it returns the result of `interceptor`. - * The purpose of this method is to "pass thru" values replacing intermediate - * results in a method chain sequence. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Seq - * @param {*} value The value to provide to `interceptor`. - * @param {Function} interceptor The function to invoke. - * @returns {*} Returns the result of `interceptor`. - * @example - * - * _(' abc ') - * .chain() - * .trim() - * .thru(function(value) { - * return [value]; - * }) - * .value(); - * // => ['abc'] - */ - function thru(value, interceptor) { - return interceptor(value); - } - - /** - * This method is the wrapper version of `_.at`. - * - * @name at - * @memberOf _ - * @since 1.0.0 - * @category Seq - * @param {...(string|string[])} [paths] The property paths to pick. - * @returns {Object} Returns the new `lodash` wrapper instance. - * @example - * - * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] }; - * - * _(object).at(['a[0].b.c', 'a[1]']).value(); - * // => [3, 4] - */ - var wrapperAt = flatRest(function(paths) { - var length = paths.length, - start = length ? paths[0] : 0, - value = this.__wrapped__, - interceptor = function(object) { return baseAt(object, paths); }; - - if (length > 1 || this.__actions__.length || - !(value instanceof LazyWrapper) || !isIndex(start)) { - return this.thru(interceptor); - } - value = value.slice(start, +start + (length ? 1 : 0)); - value.__actions__.push({ - 'func': thru, - 'args': [interceptor], - 'thisArg': undefined - }); - return new LodashWrapper(value, this.__chain__).thru(function(array) { - if (length && !array.length) { - array.push(undefined); - } - return array; - }); - }); - - /** - * Creates a `lodash` wrapper instance with explicit method chain sequences enabled. - * - * @name chain - * @memberOf _ - * @since 0.1.0 - * @category Seq - * @returns {Object} Returns the new `lodash` wrapper instance. - * @example - * - * var users = [ - * { 'user': 'barney', 'age': 36 }, - * { 'user': 'fred', 'age': 40 } - * ]; - * - * // A sequence without explicit chaining. - * _(users).head(); - * // => { 'user': 'barney', 'age': 36 } - * - * // A sequence with explicit chaining. - * _(users) - * .chain() - * .head() - * .pick('user') - * .value(); - * // => { 'user': 'barney' } - */ - function wrapperChain() { - return chain(this); - } - - /** - * Executes the chain sequence and returns the wrapped result. - * - * @name commit - * @memberOf _ - * @since 3.2.0 - * @category Seq - * @returns {Object} Returns the new `lodash` wrapper instance. - * @example - * - * var array = [1, 2]; - * var wrapped = _(array).push(3); - * - * console.log(array); - * // => [1, 2] - * - * wrapped = wrapped.commit(); - * console.log(array); - * // => [1, 2, 3] - * - * wrapped.last(); - * // => 3 - * - * console.log(array); - * // => [1, 2, 3] - */ - function wrapperCommit() { - return new LodashWrapper(this.value(), this.__chain__); - } - - /** - * Gets the next value on a wrapped object following the - * [iterator protocol](https://mdn.io/iteration_protocols#iterator). - * - * @name next - * @memberOf _ - * @since 4.0.0 - * @category Seq - * @returns {Object} Returns the next iterator value. - * @example - * - * var wrapped = _([1, 2]); - * - * wrapped.next(); - * // => { 'done': false, 'value': 1 } - * - * wrapped.next(); - * // => { 'done': false, 'value': 2 } - * - * wrapped.next(); - * // => { 'done': true, 'value': undefined } - */ - function wrapperNext() { - if (this.__values__ === undefined) { - this.__values__ = toArray(this.value()); - } - var done = this.__index__ >= this.__values__.length, - value = done ? undefined : this.__values__[this.__index__++]; - - return { 'done': done, 'value': value }; - } - - /** - * Enables the wrapper to be iterable. - * - * @name Symbol.iterator - * @memberOf _ - * @since 4.0.0 - * @category Seq - * @returns {Object} Returns the wrapper object. - * @example - * - * var wrapped = _([1, 2]); - * - * wrapped[Symbol.iterator]() === wrapped; - * // => true - * - * Array.from(wrapped); - * // => [1, 2] - */ - function wrapperToIterator() { - return this; - } - - /** - * Creates a clone of the chain sequence planting `value` as the wrapped value. - * - * @name plant - * @memberOf _ - * @since 3.2.0 - * @category Seq - * @param {*} value The value to plant. - * @returns {Object} Returns the new `lodash` wrapper instance. - * @example - * - * function square(n) { - * return n * n; - * } - * - * var wrapped = _([1, 2]).map(square); - * var other = wrapped.plant([3, 4]); - * - * other.value(); - * // => [9, 16] - * - * wrapped.value(); - * // => [1, 4] - */ - function wrapperPlant(value) { - var result, - parent = this; - - while (parent instanceof baseLodash) { - var clone = wrapperClone(parent); - clone.__index__ = 0; - clone.__values__ = undefined; - if (result) { - previous.__wrapped__ = clone; - } else { - result = clone; - } - var previous = clone; - parent = parent.__wrapped__; - } - previous.__wrapped__ = value; - return result; - } - - /** - * This method is the wrapper version of `_.reverse`. - * - * **Note:** This method mutates the wrapped array. - * - * @name reverse - * @memberOf _ - * @since 0.1.0 - * @category Seq - * @returns {Object} Returns the new `lodash` wrapper instance. - * @example - * - * var array = [1, 2, 3]; - * - * _(array).reverse().value() - * // => [3, 2, 1] - * - * console.log(array); - * // => [3, 2, 1] - */ - function wrapperReverse() { - var value = this.__wrapped__; - if (value instanceof LazyWrapper) { - var wrapped = value; - if (this.__actions__.length) { - wrapped = new LazyWrapper(this); - } - wrapped = wrapped.reverse(); - wrapped.__actions__.push({ - 'func': thru, - 'args': [reverse], - 'thisArg': undefined - }); - return new LodashWrapper(wrapped, this.__chain__); - } - return this.thru(reverse); - } - - /** - * Executes the chain sequence to resolve the unwrapped value. - * - * @name value - * @memberOf _ - * @since 0.1.0 - * @alias toJSON, valueOf - * @category Seq - * @returns {*} Returns the resolved unwrapped value. - * @example - * - * _([1, 2, 3]).value(); - * // => [1, 2, 3] - */ - function wrapperValue() { - return baseWrapperValue(this.__wrapped__, this.__actions__); - } - - /*------------------------------------------------------------------------*/ - - /** - * Creates an object composed of keys generated from the results of running - * each element of `collection` thru `iteratee`. The corresponding value of - * each key is the number of times the key was returned by `iteratee`. The - * iteratee is invoked with one argument: (value). - * - * @static - * @memberOf _ - * @since 0.5.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [iteratee=_.identity] The iteratee to transform keys. - * @returns {Object} Returns the composed aggregate object. - * @example - * - * _.countBy([6.1, 4.2, 6.3], Math.floor); - * // => { '4': 1, '6': 2 } - * - * // The `_.property` iteratee shorthand. - * _.countBy(['one', 'two', 'three'], 'length'); - * // => { '3': 2, '5': 1 } - */ - var countBy = createAggregator(function(result, value, key) { - if (hasOwnProperty.call(result, key)) { - ++result[key]; - } else { - baseAssignValue(result, key, 1); - } - }); - - /** - * Checks if `predicate` returns truthy for **all** elements of `collection`. - * Iteration is stopped once `predicate` returns falsey. The predicate is - * invoked with three arguments: (value, index|key, collection). - * - * **Note:** This method returns `true` for - * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because - * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of - * elements of empty collections. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. - * @returns {boolean} Returns `true` if all elements pass the predicate check, - * else `false`. - * @example - * - * _.every([true, 1, null, 'yes'], Boolean); - * // => false - * - * var users = [ - * { 'user': 'barney', 'age': 36, 'active': false }, - * { 'user': 'fred', 'age': 40, 'active': false } - * ]; - * - * // The `_.matches` iteratee shorthand. - * _.every(users, { 'user': 'barney', 'active': false }); - * // => false - * - * // The `_.matchesProperty` iteratee shorthand. - * _.every(users, ['active', false]); - * // => true - * - * // The `_.property` iteratee shorthand. - * _.every(users, 'active'); - * // => false - */ - function every(collection, predicate, guard) { - var func = isArray(collection) ? arrayEvery : baseEvery; - if (guard && isIterateeCall(collection, predicate, guard)) { - predicate = undefined; - } - return func(collection, getIteratee(predicate, 3)); - } - - /** - * Iterates over elements of `collection`, returning an array of all elements - * `predicate` returns truthy for. The predicate is invoked with three - * arguments: (value, index|key, collection). - * - * **Note:** Unlike `_.remove`, this method returns a new array. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @returns {Array} Returns the new filtered array. - * @see _.reject - * @example - * - * var users = [ - * { 'user': 'barney', 'age': 36, 'active': true }, - * { 'user': 'fred', 'age': 40, 'active': false } - * ]; - * - * _.filter(users, function(o) { return !o.active; }); - * // => objects for ['fred'] - * - * // The `_.matches` iteratee shorthand. - * _.filter(users, { 'age': 36, 'active': true }); - * // => objects for ['barney'] - * - * // The `_.matchesProperty` iteratee shorthand. - * _.filter(users, ['active', false]); - * // => objects for ['fred'] - * - * // The `_.property` iteratee shorthand. - * _.filter(users, 'active'); - * // => objects for ['barney'] - * - * // Combining several predicates using `_.overEvery` or `_.overSome`. - * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]])); - * // => objects for ['fred', 'barney'] - */ - function filter(collection, predicate) { - var func = isArray(collection) ? arrayFilter : baseFilter; - return func(collection, getIteratee(predicate, 3)); - } - - /** - * Iterates over elements of `collection`, returning the first element - * `predicate` returns truthy for. The predicate is invoked with three - * arguments: (value, index|key, collection). - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to inspect. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @param {number} [fromIndex=0] The index to search from. - * @returns {*} Returns the matched element, else `undefined`. - * @example - * - * var users = [ - * { 'user': 'barney', 'age': 36, 'active': true }, - * { 'user': 'fred', 'age': 40, 'active': false }, - * { 'user': 'pebbles', 'age': 1, 'active': true } - * ]; - * - * _.find(users, function(o) { return o.age < 40; }); - * // => object for 'barney' - * - * // The `_.matches` iteratee shorthand. - * _.find(users, { 'age': 1, 'active': true }); - * // => object for 'pebbles' - * - * // The `_.matchesProperty` iteratee shorthand. - * _.find(users, ['active', false]); - * // => object for 'fred' - * - * // The `_.property` iteratee shorthand. - * _.find(users, 'active'); - * // => object for 'barney' - */ - var find = createFind(findIndex); - - /** - * This method is like `_.find` except that it iterates over elements of - * `collection` from right to left. - * - * @static - * @memberOf _ - * @since 2.0.0 - * @category Collection - * @param {Array|Object} collection The collection to inspect. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @param {number} [fromIndex=collection.length-1] The index to search from. - * @returns {*} Returns the matched element, else `undefined`. - * @example - * - * _.findLast([1, 2, 3, 4], function(n) { - * return n % 2 == 1; - * }); - * // => 3 - */ - var findLast = createFind(findLastIndex); - - /** - * Creates a flattened array of values by running each element in `collection` - * thru `iteratee` and flattening the mapped results. The iteratee is invoked - * with three arguments: (value, index|key, collection). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @returns {Array} Returns the new flattened array. - * @example - * - * function duplicate(n) { - * return [n, n]; - * } - * - * _.flatMap([1, 2], duplicate); - * // => [1, 1, 2, 2] - */ - function flatMap(collection, iteratee) { - return baseFlatten(map(collection, iteratee), 1); - } - - /** - * This method is like `_.flatMap` except that it recursively flattens the - * mapped results. - * - * @static - * @memberOf _ - * @since 4.7.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @returns {Array} Returns the new flattened array. - * @example - * - * function duplicate(n) { - * return [[[n, n]]]; - * } - * - * _.flatMapDeep([1, 2], duplicate); - * // => [1, 1, 2, 2] - */ - function flatMapDeep(collection, iteratee) { - return baseFlatten(map(collection, iteratee), INFINITY); - } - - /** - * This method is like `_.flatMap` except that it recursively flattens the - * mapped results up to `depth` times. - * - * @static - * @memberOf _ - * @since 4.7.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @param {number} [depth=1] The maximum recursion depth. - * @returns {Array} Returns the new flattened array. - * @example - * - * function duplicate(n) { - * return [[[n, n]]]; - * } - * - * _.flatMapDepth([1, 2], duplicate, 2); - * // => [[1, 1], [2, 2]] - */ - function flatMapDepth(collection, iteratee, depth) { - depth = depth === undefined ? 1 : toInteger(depth); - return baseFlatten(map(collection, iteratee), depth); - } - - /** - * Iterates over elements of `collection` and invokes `iteratee` for each element. - * The iteratee is invoked with three arguments: (value, index|key, collection). - * Iteratee functions may exit iteration early by explicitly returning `false`. - * - * **Note:** As with other "Collections" methods, objects with a "length" - * property are iterated like arrays. To avoid this behavior use `_.forIn` - * or `_.forOwn` for object iteration. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @alias each - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @returns {Array|Object} Returns `collection`. - * @see _.forEachRight - * @example - * - * _.forEach([1, 2], function(value) { - * console.log(value); - * }); - * // => Logs `1` then `2`. - * - * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) { - * console.log(key); - * }); - * // => Logs 'a' then 'b' (iteration order is not guaranteed). - */ - function forEach(collection, iteratee) { - var func = isArray(collection) ? arrayEach : baseEach; - return func(collection, getIteratee(iteratee, 3)); - } - - /** - * This method is like `_.forEach` except that it iterates over elements of - * `collection` from right to left. - * - * @static - * @memberOf _ - * @since 2.0.0 - * @alias eachRight - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @returns {Array|Object} Returns `collection`. - * @see _.forEach - * @example - * - * _.forEachRight([1, 2], function(value) { - * console.log(value); - * }); - * // => Logs `2` then `1`. - */ - function forEachRight(collection, iteratee) { - var func = isArray(collection) ? arrayEachRight : baseEachRight; - return func(collection, getIteratee(iteratee, 3)); - } - - /** - * Creates an object composed of keys generated from the results of running - * each element of `collection` thru `iteratee`. The order of grouped values - * is determined by the order they occur in `collection`. The corresponding - * value of each key is an array of elements responsible for generating the - * key. The iteratee is invoked with one argument: (value). - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [iteratee=_.identity] The iteratee to transform keys. - * @returns {Object} Returns the composed aggregate object. - * @example - * - * _.groupBy([6.1, 4.2, 6.3], Math.floor); - * // => { '4': [4.2], '6': [6.1, 6.3] } - * - * // The `_.property` iteratee shorthand. - * _.groupBy(['one', 'two', 'three'], 'length'); - * // => { '3': ['one', 'two'], '5': ['three'] } - */ - var groupBy = createAggregator(function(result, value, key) { - if (hasOwnProperty.call(result, key)) { - result[key].push(value); - } else { - baseAssignValue(result, key, [value]); - } - }); - - /** - * Checks if `value` is in `collection`. If `collection` is a string, it's - * checked for a substring of `value`, otherwise - * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * is used for equality comparisons. If `fromIndex` is negative, it's used as - * the offset from the end of `collection`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object|string} collection The collection to inspect. - * @param {*} value The value to search for. - * @param {number} [fromIndex=0] The index to search from. - * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`. - * @returns {boolean} Returns `true` if `value` is found, else `false`. - * @example - * - * _.includes([1, 2, 3], 1); - * // => true - * - * _.includes([1, 2, 3], 1, 2); - * // => false - * - * _.includes({ 'a': 1, 'b': 2 }, 1); - * // => true - * - * _.includes('abcd', 'bc'); - * // => true - */ - function includes(collection, value, fromIndex, guard) { - collection = isArrayLike(collection) ? collection : values(collection); - fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0; - - var length = collection.length; - if (fromIndex < 0) { - fromIndex = nativeMax(length + fromIndex, 0); - } - return isString(collection) - ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1) - : (!!length && baseIndexOf(collection, value, fromIndex) > -1); - } - - /** - * Invokes the method at `path` of each element in `collection`, returning - * an array of the results of each invoked method. Any additional arguments - * are provided to each invoked method. If `path` is a function, it's invoked - * for, and `this` bound to, each element in `collection`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Array|Function|string} path The path of the method to invoke or - * the function invoked per iteration. - * @param {...*} [args] The arguments to invoke each method with. - * @returns {Array} Returns the array of results. - * @example - * - * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort'); - * // => [[1, 5, 7], [1, 2, 3]] - * - * _.invokeMap([123, 456], String.prototype.split, ''); - * // => [['1', '2', '3'], ['4', '5', '6']] - */ - var invokeMap = baseRest(function(collection, path, args) { - var index = -1, - isFunc = typeof path == 'function', - result = isArrayLike(collection) ? Array(collection.length) : []; - - baseEach(collection, function(value) { - result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args); - }); - return result; - }); - - /** - * Creates an object composed of keys generated from the results of running - * each element of `collection` thru `iteratee`. The corresponding value of - * each key is the last element responsible for generating the key. The - * iteratee is invoked with one argument: (value). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [iteratee=_.identity] The iteratee to transform keys. - * @returns {Object} Returns the composed aggregate object. - * @example - * - * var array = [ - * { 'dir': 'left', 'code': 97 }, - * { 'dir': 'right', 'code': 100 } - * ]; - * - * _.keyBy(array, function(o) { - * return String.fromCharCode(o.code); - * }); - * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } } - * - * _.keyBy(array, 'dir'); - * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } } - */ - var keyBy = createAggregator(function(result, value, key) { - baseAssignValue(result, key, value); - }); - - /** - * Creates an array of values by running each element in `collection` thru - * `iteratee`. The iteratee is invoked with three arguments: - * (value, index|key, collection). - * - * Many lodash methods are guarded to work as iteratees for methods like - * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`. - * - * The guarded methods are: - * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`, - * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`, - * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`, - * `template`, `trim`, `trimEnd`, `trimStart`, and `words` - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @returns {Array} Returns the new mapped array. - * @example - * - * function square(n) { - * return n * n; - * } - * - * _.map([4, 8], square); - * // => [16, 64] - * - * _.map({ 'a': 4, 'b': 8 }, square); - * // => [16, 64] (iteration order is not guaranteed) - * - * var users = [ - * { 'user': 'barney' }, - * { 'user': 'fred' } - * ]; - * - * // The `_.property` iteratee shorthand. - * _.map(users, 'user'); - * // => ['barney', 'fred'] - */ - function map(collection, iteratee) { - var func = isArray(collection) ? arrayMap : baseMap; - return func(collection, getIteratee(iteratee, 3)); - } - - /** - * This method is like `_.sortBy` except that it allows specifying the sort - * orders of the iteratees to sort by. If `orders` is unspecified, all values - * are sorted in ascending order. Otherwise, specify an order of "desc" for - * descending or "asc" for ascending sort order of corresponding values. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]] - * The iteratees to sort by. - * @param {string[]} [orders] The sort orders of `iteratees`. - * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`. - * @returns {Array} Returns the new sorted array. - * @example - * - * var users = [ - * { 'user': 'fred', 'age': 48 }, - * { 'user': 'barney', 'age': 34 }, - * { 'user': 'fred', 'age': 40 }, - * { 'user': 'barney', 'age': 36 } - * ]; - * - * // Sort by `user` in ascending order and by `age` in descending order. - * _.orderBy(users, ['user', 'age'], ['asc', 'desc']); - * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]] - */ - function orderBy(collection, iteratees, orders, guard) { - if (collection == null) { - return []; - } - if (!isArray(iteratees)) { - iteratees = iteratees == null ? [] : [iteratees]; - } - orders = guard ? undefined : orders; - if (!isArray(orders)) { - orders = orders == null ? [] : [orders]; - } - return baseOrderBy(collection, iteratees, orders); - } - - /** - * Creates an array of elements split into two groups, the first of which - * contains elements `predicate` returns truthy for, the second of which - * contains elements `predicate` returns falsey for. The predicate is - * invoked with one argument: (value). - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @returns {Array} Returns the array of grouped elements. - * @example - * - * var users = [ - * { 'user': 'barney', 'age': 36, 'active': false }, - * { 'user': 'fred', 'age': 40, 'active': true }, - * { 'user': 'pebbles', 'age': 1, 'active': false } - * ]; - * - * _.partition(users, function(o) { return o.active; }); - * // => objects for [['fred'], ['barney', 'pebbles']] - * - * // The `_.matches` iteratee shorthand. - * _.partition(users, { 'age': 1, 'active': false }); - * // => objects for [['pebbles'], ['barney', 'fred']] - * - * // The `_.matchesProperty` iteratee shorthand. - * _.partition(users, ['active', false]); - * // => objects for [['barney', 'pebbles'], ['fred']] - * - * // The `_.property` iteratee shorthand. - * _.partition(users, 'active'); - * // => objects for [['fred'], ['barney', 'pebbles']] - */ - var partition = createAggregator(function(result, value, key) { - result[key ? 0 : 1].push(value); - }, function() { return [[], []]; }); - - /** - * Reduces `collection` to a value which is the accumulated result of running - * each element in `collection` thru `iteratee`, where each successive - * invocation is supplied the return value of the previous. If `accumulator` - * is not given, the first element of `collection` is used as the initial - * value. The iteratee is invoked with four arguments: - * (accumulator, value, index|key, collection). - * - * Many lodash methods are guarded to work as iteratees for methods like - * `_.reduce`, `_.reduceRight`, and `_.transform`. - * - * The guarded methods are: - * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`, - * and `sortBy` - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @param {*} [accumulator] The initial value. - * @returns {*} Returns the accumulated value. - * @see _.reduceRight - * @example - * - * _.reduce([1, 2], function(sum, n) { - * return sum + n; - * }, 0); - * // => 3 - * - * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { - * (result[value] || (result[value] = [])).push(key); - * return result; - * }, {}); - * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed) - */ - function reduce(collection, iteratee, accumulator) { - var func = isArray(collection) ? arrayReduce : baseReduce, - initAccum = arguments.length < 3; - - return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach); - } - - /** - * This method is like `_.reduce` except that it iterates over elements of - * `collection` from right to left. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @param {*} [accumulator] The initial value. - * @returns {*} Returns the accumulated value. - * @see _.reduce - * @example - * - * var array = [[0, 1], [2, 3], [4, 5]]; - * - * _.reduceRight(array, function(flattened, other) { - * return flattened.concat(other); - * }, []); - * // => [4, 5, 2, 3, 0, 1] - */ - function reduceRight(collection, iteratee, accumulator) { - var func = isArray(collection) ? arrayReduceRight : baseReduce, - initAccum = arguments.length < 3; - - return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight); - } - - /** - * The opposite of `_.filter`; this method returns the elements of `collection` - * that `predicate` does **not** return truthy for. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @returns {Array} Returns the new filtered array. - * @see _.filter - * @example - * - * var users = [ - * { 'user': 'barney', 'age': 36, 'active': false }, - * { 'user': 'fred', 'age': 40, 'active': true } - * ]; - * - * _.reject(users, function(o) { return !o.active; }); - * // => objects for ['fred'] - * - * // The `_.matches` iteratee shorthand. - * _.reject(users, { 'age': 40, 'active': true }); - * // => objects for ['barney'] - * - * // The `_.matchesProperty` iteratee shorthand. - * _.reject(users, ['active', false]); - * // => objects for ['fred'] - * - * // The `_.property` iteratee shorthand. - * _.reject(users, 'active'); - * // => objects for ['barney'] - */ - function reject(collection, predicate) { - var func = isArray(collection) ? arrayFilter : baseFilter; - return func(collection, negate(getIteratee(predicate, 3))); - } - - /** - * Gets a random element from `collection`. - * - * @static - * @memberOf _ - * @since 2.0.0 - * @category Collection - * @param {Array|Object} collection The collection to sample. - * @returns {*} Returns the random element. - * @example - * - * _.sample([1, 2, 3, 4]); - * // => 2 - */ - function sample(collection) { - var func = isArray(collection) ? arraySample : baseSample; - return func(collection); - } - - /** - * Gets `n` random elements at unique keys from `collection` up to the - * size of `collection`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Collection - * @param {Array|Object} collection The collection to sample. - * @param {number} [n=1] The number of elements to sample. - * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. - * @returns {Array} Returns the random elements. - * @example - * - * _.sampleSize([1, 2, 3], 2); - * // => [3, 1] - * - * _.sampleSize([1, 2, 3], 4); - * // => [2, 3, 1] - */ - function sampleSize(collection, n, guard) { - if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) { - n = 1; - } else { - n = toInteger(n); - } - var func = isArray(collection) ? arraySampleSize : baseSampleSize; - return func(collection, n); - } - - /** - * Creates an array of shuffled values, using a version of the - * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle). - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to shuffle. - * @returns {Array} Returns the new shuffled array. - * @example - * - * _.shuffle([1, 2, 3, 4]); - * // => [4, 1, 3, 2] - */ - function shuffle(collection) { - var func = isArray(collection) ? arrayShuffle : baseShuffle; - return func(collection); - } - - /** - * Gets the size of `collection` by returning its length for array-like - * values or the number of own enumerable string keyed properties for objects. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object|string} collection The collection to inspect. - * @returns {number} Returns the collection size. - * @example - * - * _.size([1, 2, 3]); - * // => 3 - * - * _.size({ 'a': 1, 'b': 2 }); - * // => 2 - * - * _.size('pebbles'); - * // => 7 - */ - function size(collection) { - if (collection == null) { - return 0; - } - if (isArrayLike(collection)) { - return isString(collection) ? stringSize(collection) : collection.length; - } - var tag = getTag(collection); - if (tag == mapTag || tag == setTag) { - return collection.size; - } - return baseKeys(collection).length; - } - - /** - * Checks if `predicate` returns truthy for **any** element of `collection`. - * Iteration is stopped once `predicate` returns truthy. The predicate is - * invoked with three arguments: (value, index|key, collection). - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. - * @returns {boolean} Returns `true` if any element passes the predicate check, - * else `false`. - * @example - * - * _.some([null, 0, 'yes', false], Boolean); - * // => true - * - * var users = [ - * { 'user': 'barney', 'active': true }, - * { 'user': 'fred', 'active': false } - * ]; - * - * // The `_.matches` iteratee shorthand. - * _.some(users, { 'user': 'barney', 'active': false }); - * // => false - * - * // The `_.matchesProperty` iteratee shorthand. - * _.some(users, ['active', false]); - * // => true - * - * // The `_.property` iteratee shorthand. - * _.some(users, 'active'); - * // => true - */ - function some(collection, predicate, guard) { - var func = isArray(collection) ? arraySome : baseSome; - if (guard && isIterateeCall(collection, predicate, guard)) { - predicate = undefined; - } - return func(collection, getIteratee(predicate, 3)); - } - - /** - * Creates an array of elements, sorted in ascending order by the results of - * running each element in a collection thru each iteratee. This method - * performs a stable sort, that is, it preserves the original sort order of - * equal elements. The iteratees are invoked with one argument: (value). - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {...(Function|Function[])} [iteratees=[_.identity]] - * The iteratees to sort by. - * @returns {Array} Returns the new sorted array. - * @example - * - * var users = [ - * { 'user': 'fred', 'age': 48 }, - * { 'user': 'barney', 'age': 36 }, - * { 'user': 'fred', 'age': 30 }, - * { 'user': 'barney', 'age': 34 } - * ]; - * - * _.sortBy(users, [function(o) { return o.user; }]); - * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]] - * - * _.sortBy(users, ['user', 'age']); - * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]] - */ - var sortBy = baseRest(function(collection, iteratees) { - if (collection == null) { - return []; - } - var length = iteratees.length; - if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) { - iteratees = []; - } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) { - iteratees = [iteratees[0]]; - } - return baseOrderBy(collection, baseFlatten(iteratees, 1), []); - }); - - /*------------------------------------------------------------------------*/ - - /** - * Gets the timestamp of the number of milliseconds that have elapsed since - * the Unix epoch (1 January 1970 00:00:00 UTC). - * - * @static - * @memberOf _ - * @since 2.4.0 - * @category Date - * @returns {number} Returns the timestamp. - * @example - * - * _.defer(function(stamp) { - * console.log(_.now() - stamp); - * }, _.now()); - * // => Logs the number of milliseconds it took for the deferred invocation. - */ - var now = ctxNow || function() { - return root.Date.now(); - }; - - /*------------------------------------------------------------------------*/ - - /** - * The opposite of `_.before`; this method creates a function that invokes - * `func` once it's called `n` or more times. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Function - * @param {number} n The number of calls before `func` is invoked. - * @param {Function} func The function to restrict. - * @returns {Function} Returns the new restricted function. - * @example - * - * var saves = ['profile', 'settings']; - * - * var done = _.after(saves.length, function() { - * console.log('done saving!'); - * }); - * - * _.forEach(saves, function(type) { - * asyncSave({ 'type': type, 'complete': done }); - * }); - * // => Logs 'done saving!' after the two async saves have completed. - */ - function after(n, func) { - if (typeof func != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - n = toInteger(n); - return function() { - if (--n < 1) { - return func.apply(this, arguments); - } - }; - } - - /** - * Creates a function that invokes `func`, with up to `n` arguments, - * ignoring any additional arguments. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Function - * @param {Function} func The function to cap arguments for. - * @param {number} [n=func.length] The arity cap. - * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. - * @returns {Function} Returns the new capped function. - * @example - * - * _.map(['6', '8', '10'], _.ary(parseInt, 1)); - * // => [6, 8, 10] - */ - function ary(func, n, guard) { - n = guard ? undefined : n; - n = (func && n == null) ? func.length : n; - return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n); - } - - /** - * Creates a function that invokes `func`, with the `this` binding and arguments - * of the created function, while it's called less than `n` times. Subsequent - * calls to the created function return the result of the last `func` invocation. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Function - * @param {number} n The number of calls at which `func` is no longer invoked. - * @param {Function} func The function to restrict. - * @returns {Function} Returns the new restricted function. - * @example - * - * jQuery(element).on('click', _.before(5, addContactToList)); - * // => Allows adding up to 4 contacts to the list. - */ - function before(n, func) { - var result; - if (typeof func != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - n = toInteger(n); - return function() { - if (--n > 0) { - result = func.apply(this, arguments); - } - if (n <= 1) { - func = undefined; - } - return result; - }; - } - - /** - * Creates a function that invokes `func` with the `this` binding of `thisArg` - * and `partials` prepended to the arguments it receives. - * - * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds, - * may be used as a placeholder for partially applied arguments. - * - * **Note:** Unlike native `Function#bind`, this method doesn't set the "length" - * property of bound functions. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Function - * @param {Function} func The function to bind. - * @param {*} thisArg The `this` binding of `func`. - * @param {...*} [partials] The arguments to be partially applied. - * @returns {Function} Returns the new bound function. - * @example - * - * function greet(greeting, punctuation) { - * return greeting + ' ' + this.user + punctuation; - * } - * - * var object = { 'user': 'fred' }; - * - * var bound = _.bind(greet, object, 'hi'); - * bound('!'); - * // => 'hi fred!' - * - * // Bound with placeholders. - * var bound = _.bind(greet, object, _, '!'); - * bound('hi'); - * // => 'hi fred!' - */ - var bind = baseRest(function(func, thisArg, partials) { - var bitmask = WRAP_BIND_FLAG; - if (partials.length) { - var holders = replaceHolders(partials, getHolder(bind)); - bitmask |= WRAP_PARTIAL_FLAG; - } - return createWrap(func, bitmask, thisArg, partials, holders); - }); - - /** - * Creates a function that invokes the method at `object[key]` with `partials` - * prepended to the arguments it receives. - * - * This method differs from `_.bind` by allowing bound functions to reference - * methods that may be redefined or don't yet exist. See - * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern) - * for more details. - * - * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic - * builds, may be used as a placeholder for partially applied arguments. - * - * @static - * @memberOf _ - * @since 0.10.0 - * @category Function - * @param {Object} object The object to invoke the method on. - * @param {string} key The key of the method. - * @param {...*} [partials] The arguments to be partially applied. - * @returns {Function} Returns the new bound function. - * @example - * - * var object = { - * 'user': 'fred', - * 'greet': function(greeting, punctuation) { - * return greeting + ' ' + this.user + punctuation; - * } - * }; - * - * var bound = _.bindKey(object, 'greet', 'hi'); - * bound('!'); - * // => 'hi fred!' - * - * object.greet = function(greeting, punctuation) { - * return greeting + 'ya ' + this.user + punctuation; - * }; - * - * bound('!'); - * // => 'hiya fred!' - * - * // Bound with placeholders. - * var bound = _.bindKey(object, 'greet', _, '!'); - * bound('hi'); - * // => 'hiya fred!' - */ - var bindKey = baseRest(function(object, key, partials) { - var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG; - if (partials.length) { - var holders = replaceHolders(partials, getHolder(bindKey)); - bitmask |= WRAP_PARTIAL_FLAG; - } - return createWrap(key, bitmask, object, partials, holders); - }); - - /** - * Creates a function that accepts arguments of `func` and either invokes - * `func` returning its result, if at least `arity` number of arguments have - * been provided, or returns a function that accepts the remaining `func` - * arguments, and so on. The arity of `func` may be specified if `func.length` - * is not sufficient. - * - * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds, - * may be used as a placeholder for provided arguments. - * - * **Note:** This method doesn't set the "length" property of curried functions. - * - * @static - * @memberOf _ - * @since 2.0.0 - * @category Function - * @param {Function} func The function to curry. - * @param {number} [arity=func.length] The arity of `func`. - * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. - * @returns {Function} Returns the new curried function. - * @example - * - * var abc = function(a, b, c) { - * return [a, b, c]; - * }; - * - * var curried = _.curry(abc); - * - * curried(1)(2)(3); - * // => [1, 2, 3] - * - * curried(1, 2)(3); - * // => [1, 2, 3] - * - * curried(1, 2, 3); - * // => [1, 2, 3] - * - * // Curried with placeholders. - * curried(1)(_, 3)(2); - * // => [1, 2, 3] - */ - function curry(func, arity, guard) { - arity = guard ? undefined : arity; - var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity); - result.placeholder = curry.placeholder; - return result; - } - - /** - * This method is like `_.curry` except that arguments are applied to `func` - * in the manner of `_.partialRight` instead of `_.partial`. - * - * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic - * builds, may be used as a placeholder for provided arguments. - * - * **Note:** This method doesn't set the "length" property of curried functions. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Function - * @param {Function} func The function to curry. - * @param {number} [arity=func.length] The arity of `func`. - * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. - * @returns {Function} Returns the new curried function. - * @example - * - * var abc = function(a, b, c) { - * return [a, b, c]; - * }; - * - * var curried = _.curryRight(abc); - * - * curried(3)(2)(1); - * // => [1, 2, 3] - * - * curried(2, 3)(1); - * // => [1, 2, 3] - * - * curried(1, 2, 3); - * // => [1, 2, 3] - * - * // Curried with placeholders. - * curried(3)(1, _)(2); - * // => [1, 2, 3] - */ - function curryRight(func, arity, guard) { - arity = guard ? undefined : arity; - var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity); - result.placeholder = curryRight.placeholder; - return result; - } - - /** - * Creates a debounced function that delays invoking `func` until after `wait` - * milliseconds have elapsed since the last time the debounced function was - * invoked. The debounced function comes with a `cancel` method to cancel - * delayed `func` invocations and a `flush` method to immediately invoke them. - * Provide `options` to indicate whether `func` should be invoked on the - * leading and/or trailing edge of the `wait` timeout. The `func` is invoked - * with the last arguments provided to the debounced function. Subsequent - * calls to the debounced function return the result of the last `func` - * invocation. - * - * **Note:** If `leading` and `trailing` options are `true`, `func` is - * invoked on the trailing edge of the timeout only if the debounced function - * is invoked more than once during the `wait` timeout. - * - * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred - * until to the next tick, similar to `setTimeout` with a timeout of `0`. - * - * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) - * for details over the differences between `_.debounce` and `_.throttle`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Function - * @param {Function} func The function to debounce. - * @param {number} [wait=0] The number of milliseconds to delay. - * @param {Object} [options={}] The options object. - * @param {boolean} [options.leading=false] - * Specify invoking on the leading edge of the timeout. - * @param {number} [options.maxWait] - * The maximum time `func` is allowed to be delayed before it's invoked. - * @param {boolean} [options.trailing=true] - * Specify invoking on the trailing edge of the timeout. - * @returns {Function} Returns the new debounced function. - * @example - * - * // Avoid costly calculations while the window size is in flux. - * jQuery(window).on('resize', _.debounce(calculateLayout, 150)); - * - * // Invoke `sendMail` when clicked, debouncing subsequent calls. - * jQuery(element).on('click', _.debounce(sendMail, 300, { - * 'leading': true, - * 'trailing': false - * })); - * - * // Ensure `batchLog` is invoked once after 1 second of debounced calls. - * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 }); - * var source = new EventSource('/stream'); - * jQuery(source).on('message', debounced); - * - * // Cancel the trailing debounced invocation. - * jQuery(window).on('popstate', debounced.cancel); - */ - function debounce(func, wait, options) { - var lastArgs, - lastThis, - maxWait, - result, - timerId, - lastCallTime, - lastInvokeTime = 0, - leading = false, - maxing = false, - trailing = true; - - if (typeof func != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - wait = toNumber(wait) || 0; - if (isObject(options)) { - leading = !!options.leading; - maxing = 'maxWait' in options; - maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait; - trailing = 'trailing' in options ? !!options.trailing : trailing; - } - - function invokeFunc(time) { - var args = lastArgs, - thisArg = lastThis; - - lastArgs = lastThis = undefined; - lastInvokeTime = time; - result = func.apply(thisArg, args); - return result; - } - - function leadingEdge(time) { - // Reset any `maxWait` timer. - lastInvokeTime = time; - // Start the timer for the trailing edge. - timerId = setTimeout(timerExpired, wait); - // Invoke the leading edge. - return leading ? invokeFunc(time) : result; - } - - function remainingWait(time) { - var timeSinceLastCall = time - lastCallTime, - timeSinceLastInvoke = time - lastInvokeTime, - timeWaiting = wait - timeSinceLastCall; - - return maxing - ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) - : timeWaiting; - } - - function shouldInvoke(time) { - var timeSinceLastCall = time - lastCallTime, - timeSinceLastInvoke = time - lastInvokeTime; - - // Either this is the first call, activity has stopped and we're at the - // trailing edge, the system time has gone backwards and we're treating - // it as the trailing edge, or we've hit the `maxWait` limit. - return (lastCallTime === undefined || (timeSinceLastCall >= wait) || - (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait)); - } - - function timerExpired() { - var time = now(); - if (shouldInvoke(time)) { - return trailingEdge(time); - } - // Restart the timer. - timerId = setTimeout(timerExpired, remainingWait(time)); - } - - function trailingEdge(time) { - timerId = undefined; - - // Only invoke if we have `lastArgs` which means `func` has been - // debounced at least once. - if (trailing && lastArgs) { - return invokeFunc(time); - } - lastArgs = lastThis = undefined; - return result; - } - - function cancel() { - if (timerId !== undefined) { - clearTimeout(timerId); - } - lastInvokeTime = 0; - lastArgs = lastCallTime = lastThis = timerId = undefined; - } - - function flush() { - return timerId === undefined ? result : trailingEdge(now()); - } - - function debounced() { - var time = now(), - isInvoking = shouldInvoke(time); - - lastArgs = arguments; - lastThis = this; - lastCallTime = time; - - if (isInvoking) { - if (timerId === undefined) { - return leadingEdge(lastCallTime); - } - if (maxing) { - // Handle invocations in a tight loop. - clearTimeout(timerId); - timerId = setTimeout(timerExpired, wait); - return invokeFunc(lastCallTime); - } - } - if (timerId === undefined) { - timerId = setTimeout(timerExpired, wait); - } - return result; - } - debounced.cancel = cancel; - debounced.flush = flush; - return debounced; - } - - /** - * Defers invoking the `func` until the current call stack has cleared. Any - * additional arguments are provided to `func` when it's invoked. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Function - * @param {Function} func The function to defer. - * @param {...*} [args] The arguments to invoke `func` with. - * @returns {number} Returns the timer id. - * @example - * - * _.defer(function(text) { - * console.log(text); - * }, 'deferred'); - * // => Logs 'deferred' after one millisecond. - */ - var defer = baseRest(function(func, args) { - return baseDelay(func, 1, args); - }); - - /** - * Invokes `func` after `wait` milliseconds. Any additional arguments are - * provided to `func` when it's invoked. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Function - * @param {Function} func The function to delay. - * @param {number} wait The number of milliseconds to delay invocation. - * @param {...*} [args] The arguments to invoke `func` with. - * @returns {number} Returns the timer id. - * @example - * - * _.delay(function(text) { - * console.log(text); - * }, 1000, 'later'); - * // => Logs 'later' after one second. - */ - var delay = baseRest(function(func, wait, args) { - return baseDelay(func, toNumber(wait) || 0, args); - }); - - /** - * Creates a function that invokes `func` with arguments reversed. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Function - * @param {Function} func The function to flip arguments for. - * @returns {Function} Returns the new flipped function. - * @example - * - * var flipped = _.flip(function() { - * return _.toArray(arguments); - * }); - * - * flipped('a', 'b', 'c', 'd'); - * // => ['d', 'c', 'b', 'a'] - */ - function flip(func) { - return createWrap(func, WRAP_FLIP_FLAG); - } - - /** - * Creates a function that memoizes the result of `func`. If `resolver` is - * provided, it determines the cache key for storing the result based on the - * arguments provided to the memoized function. By default, the first argument - * provided to the memoized function is used as the map cache key. The `func` - * is invoked with the `this` binding of the memoized function. - * - * **Note:** The cache is exposed as the `cache` property on the memoized - * function. Its creation may be customized by replacing the `_.memoize.Cache` - * constructor with one whose instances implement the - * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) - * method interface of `clear`, `delete`, `get`, `has`, and `set`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Function - * @param {Function} func The function to have its output memoized. - * @param {Function} [resolver] The function to resolve the cache key. - * @returns {Function} Returns the new memoized function. - * @example - * - * var object = { 'a': 1, 'b': 2 }; - * var other = { 'c': 3, 'd': 4 }; - * - * var values = _.memoize(_.values); - * values(object); - * // => [1, 2] - * - * values(other); - * // => [3, 4] - * - * object.a = 2; - * values(object); - * // => [1, 2] - * - * // Modify the result cache. - * values.cache.set(object, ['a', 'b']); - * values(object); - * // => ['a', 'b'] - * - * // Replace `_.memoize.Cache`. - * _.memoize.Cache = WeakMap; - */ - function memoize(func, resolver) { - if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) { - throw new TypeError(FUNC_ERROR_TEXT); - } - var memoized = function() { - var args = arguments, - key = resolver ? resolver.apply(this, args) : args[0], - cache = memoized.cache; - - if (cache.has(key)) { - return cache.get(key); - } - var result = func.apply(this, args); - memoized.cache = cache.set(key, result) || cache; - return result; - }; - memoized.cache = new (memoize.Cache || MapCache); - return memoized; - } - - // Expose `MapCache`. - memoize.Cache = MapCache; - - /** - * Creates a function that negates the result of the predicate `func`. The - * `func` predicate is invoked with the `this` binding and arguments of the - * created function. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Function - * @param {Function} predicate The predicate to negate. - * @returns {Function} Returns the new negated function. - * @example - * - * function isEven(n) { - * return n % 2 == 0; - * } - * - * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven)); - * // => [1, 3, 5] - */ - function negate(predicate) { - if (typeof predicate != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - return function() { - var args = arguments; - switch (args.length) { - case 0: return !predicate.call(this); - case 1: return !predicate.call(this, args[0]); - case 2: return !predicate.call(this, args[0], args[1]); - case 3: return !predicate.call(this, args[0], args[1], args[2]); - } - return !predicate.apply(this, args); - }; - } - - /** - * Creates a function that is restricted to invoking `func` once. Repeat calls - * to the function return the value of the first invocation. The `func` is - * invoked with the `this` binding and arguments of the created function. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Function - * @param {Function} func The function to restrict. - * @returns {Function} Returns the new restricted function. - * @example - * - * var initialize = _.once(createApplication); - * initialize(); - * initialize(); - * // => `createApplication` is invoked once - */ - function once(func) { - return before(2, func); - } - - /** - * Creates a function that invokes `func` with its arguments transformed. - * - * @static - * @since 4.0.0 - * @memberOf _ - * @category Function - * @param {Function} func The function to wrap. - * @param {...(Function|Function[])} [transforms=[_.identity]] - * The argument transforms. - * @returns {Function} Returns the new function. - * @example - * - * function doubled(n) { - * return n * 2; - * } - * - * function square(n) { - * return n * n; - * } - * - * var func = _.overArgs(function(x, y) { - * return [x, y]; - * }, [square, doubled]); - * - * func(9, 3); - * // => [81, 6] - * - * func(10, 5); - * // => [100, 10] - */ - var overArgs = castRest(function(func, transforms) { - transforms = (transforms.length == 1 && isArray(transforms[0])) - ? arrayMap(transforms[0], baseUnary(getIteratee())) - : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee())); - - var funcsLength = transforms.length; - return baseRest(function(args) { - var index = -1, - length = nativeMin(args.length, funcsLength); - - while (++index < length) { - args[index] = transforms[index].call(this, args[index]); - } - return apply(func, this, args); - }); - }); - - /** - * Creates a function that invokes `func` with `partials` prepended to the - * arguments it receives. This method is like `_.bind` except it does **not** - * alter the `this` binding. - * - * The `_.partial.placeholder` value, which defaults to `_` in monolithic - * builds, may be used as a placeholder for partially applied arguments. - * - * **Note:** This method doesn't set the "length" property of partially - * applied functions. - * - * @static - * @memberOf _ - * @since 0.2.0 - * @category Function - * @param {Function} func The function to partially apply arguments to. - * @param {...*} [partials] The arguments to be partially applied. - * @returns {Function} Returns the new partially applied function. - * @example - * - * function greet(greeting, name) { - * return greeting + ' ' + name; - * } - * - * var sayHelloTo = _.partial(greet, 'hello'); - * sayHelloTo('fred'); - * // => 'hello fred' - * - * // Partially applied with placeholders. - * var greetFred = _.partial(greet, _, 'fred'); - * greetFred('hi'); - * // => 'hi fred' - */ - var partial = baseRest(function(func, partials) { - var holders = replaceHolders(partials, getHolder(partial)); - return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders); - }); - - /** - * This method is like `_.partial` except that partially applied arguments - * are appended to the arguments it receives. - * - * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic - * builds, may be used as a placeholder for partially applied arguments. - * - * **Note:** This method doesn't set the "length" property of partially - * applied functions. - * - * @static - * @memberOf _ - * @since 1.0.0 - * @category Function - * @param {Function} func The function to partially apply arguments to. - * @param {...*} [partials] The arguments to be partially applied. - * @returns {Function} Returns the new partially applied function. - * @example - * - * function greet(greeting, name) { - * return greeting + ' ' + name; - * } - * - * var greetFred = _.partialRight(greet, 'fred'); - * greetFred('hi'); - * // => 'hi fred' - * - * // Partially applied with placeholders. - * var sayHelloTo = _.partialRight(greet, 'hello', _); - * sayHelloTo('fred'); - * // => 'hello fred' - */ - var partialRight = baseRest(function(func, partials) { - var holders = replaceHolders(partials, getHolder(partialRight)); - return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders); - }); - - /** - * Creates a function that invokes `func` with arguments arranged according - * to the specified `indexes` where the argument value at the first index is - * provided as the first argument, the argument value at the second index is - * provided as the second argument, and so on. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Function - * @param {Function} func The function to rearrange arguments for. - * @param {...(number|number[])} indexes The arranged argument indexes. - * @returns {Function} Returns the new function. - * @example - * - * var rearged = _.rearg(function(a, b, c) { - * return [a, b, c]; - * }, [2, 0, 1]); - * - * rearged('b', 'c', 'a') - * // => ['a', 'b', 'c'] - */ - var rearg = flatRest(function(func, indexes) { - return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes); - }); - - /** - * Creates a function that invokes `func` with the `this` binding of the - * created function and arguments from `start` and beyond provided as - * an array. - * - * **Note:** This method is based on the - * [rest parameter](https://mdn.io/rest_parameters). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Function - * @param {Function} func The function to apply a rest parameter to. - * @param {number} [start=func.length-1] The start position of the rest parameter. - * @returns {Function} Returns the new function. - * @example - * - * var say = _.rest(function(what, names) { - * return what + ' ' + _.initial(names).join(', ') + - * (_.size(names) > 1 ? ', & ' : '') + _.last(names); - * }); - * - * say('hello', 'fred', 'barney', 'pebbles'); - * // => 'hello fred, barney, & pebbles' - */ - function rest(func, start) { - if (typeof func != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - start = start === undefined ? start : toInteger(start); - return baseRest(func, start); - } - - /** - * Creates a function that invokes `func` with the `this` binding of the - * create function and an array of arguments much like - * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply). - * - * **Note:** This method is based on the - * [spread operator](https://mdn.io/spread_operator). - * - * @static - * @memberOf _ - * @since 3.2.0 - * @category Function - * @param {Function} func The function to spread arguments over. - * @param {number} [start=0] The start position of the spread. - * @returns {Function} Returns the new function. - * @example - * - * var say = _.spread(function(who, what) { - * return who + ' says ' + what; - * }); - * - * say(['fred', 'hello']); - * // => 'fred says hello' - * - * var numbers = Promise.all([ - * Promise.resolve(40), - * Promise.resolve(36) - * ]); - * - * numbers.then(_.spread(function(x, y) { - * return x + y; - * })); - * // => a Promise of 76 - */ - function spread(func, start) { - if (typeof func != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - start = start == null ? 0 : nativeMax(toInteger(start), 0); - return baseRest(function(args) { - var array = args[start], - otherArgs = castSlice(args, 0, start); - - if (array) { - arrayPush(otherArgs, array); - } - return apply(func, this, otherArgs); - }); - } - - /** - * Creates a throttled function that only invokes `func` at most once per - * every `wait` milliseconds. The throttled function comes with a `cancel` - * method to cancel delayed `func` invocations and a `flush` method to - * immediately invoke them. Provide `options` to indicate whether `func` - * should be invoked on the leading and/or trailing edge of the `wait` - * timeout. The `func` is invoked with the last arguments provided to the - * throttled function. Subsequent calls to the throttled function return the - * result of the last `func` invocation. - * - * **Note:** If `leading` and `trailing` options are `true`, `func` is - * invoked on the trailing edge of the timeout only if the throttled function - * is invoked more than once during the `wait` timeout. - * - * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred - * until to the next tick, similar to `setTimeout` with a timeout of `0`. - * - * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) - * for details over the differences between `_.throttle` and `_.debounce`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Function - * @param {Function} func The function to throttle. - * @param {number} [wait=0] The number of milliseconds to throttle invocations to. - * @param {Object} [options={}] The options object. - * @param {boolean} [options.leading=true] - * Specify invoking on the leading edge of the timeout. - * @param {boolean} [options.trailing=true] - * Specify invoking on the trailing edge of the timeout. - * @returns {Function} Returns the new throttled function. - * @example - * - * // Avoid excessively updating the position while scrolling. - * jQuery(window).on('scroll', _.throttle(updatePosition, 100)); - * - * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes. - * var throttled = _.throttle(renewToken, 300000, { 'trailing': false }); - * jQuery(element).on('click', throttled); - * - * // Cancel the trailing throttled invocation. - * jQuery(window).on('popstate', throttled.cancel); - */ - function throttle(func, wait, options) { - var leading = true, - trailing = true; - - if (typeof func != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - if (isObject(options)) { - leading = 'leading' in options ? !!options.leading : leading; - trailing = 'trailing' in options ? !!options.trailing : trailing; - } - return debounce(func, wait, { - 'leading': leading, - 'maxWait': wait, - 'trailing': trailing - }); - } - - /** - * Creates a function that accepts up to one argument, ignoring any - * additional arguments. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Function - * @param {Function} func The function to cap arguments for. - * @returns {Function} Returns the new capped function. - * @example - * - * _.map(['6', '8', '10'], _.unary(parseInt)); - * // => [6, 8, 10] - */ - function unary(func) { - return ary(func, 1); - } - - /** - * Creates a function that provides `value` to `wrapper` as its first - * argument. Any additional arguments provided to the function are appended - * to those provided to the `wrapper`. The wrapper is invoked with the `this` - * binding of the created function. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Function - * @param {*} value The value to wrap. - * @param {Function} [wrapper=identity] The wrapper function. - * @returns {Function} Returns the new function. - * @example - * - * var p = _.wrap(_.escape, function(func, text) { - * return '

' + func(text) + '

'; - * }); - * - * p('fred, barney, & pebbles'); - * // => '

fred, barney, & pebbles

' - */ - function wrap(value, wrapper) { - return partial(castFunction(wrapper), value); - } - - /*------------------------------------------------------------------------*/ - - /** - * Casts `value` as an array if it's not one. - * - * @static - * @memberOf _ - * @since 4.4.0 - * @category Lang - * @param {*} value The value to inspect. - * @returns {Array} Returns the cast array. - * @example - * - * _.castArray(1); - * // => [1] - * - * _.castArray({ 'a': 1 }); - * // => [{ 'a': 1 }] - * - * _.castArray('abc'); - * // => ['abc'] - * - * _.castArray(null); - * // => [null] - * - * _.castArray(undefined); - * // => [undefined] - * - * _.castArray(); - * // => [] - * - * var array = [1, 2, 3]; - * console.log(_.castArray(array) === array); - * // => true - */ - function castArray() { - if (!arguments.length) { - return []; - } - var value = arguments[0]; - return isArray(value) ? value : [value]; - } - - /** - * Creates a shallow clone of `value`. - * - * **Note:** This method is loosely based on the - * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm) - * and supports cloning arrays, array buffers, booleans, date objects, maps, - * numbers, `Object` objects, regexes, sets, strings, symbols, and typed - * arrays. The own enumerable properties of `arguments` objects are cloned - * as plain objects. An empty object is returned for uncloneable values such - * as error objects, functions, DOM nodes, and WeakMaps. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to clone. - * @returns {*} Returns the cloned value. - * @see _.cloneDeep - * @example - * - * var objects = [{ 'a': 1 }, { 'b': 2 }]; - * - * var shallow = _.clone(objects); - * console.log(shallow[0] === objects[0]); - * // => true - */ - function clone(value) { - return baseClone(value, CLONE_SYMBOLS_FLAG); - } - - /** - * This method is like `_.clone` except that it accepts `customizer` which - * is invoked to produce the cloned value. If `customizer` returns `undefined`, - * cloning is handled by the method instead. The `customizer` is invoked with - * up to four arguments; (value [, index|key, object, stack]). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to clone. - * @param {Function} [customizer] The function to customize cloning. - * @returns {*} Returns the cloned value. - * @see _.cloneDeepWith - * @example - * - * function customizer(value) { - * if (_.isElement(value)) { - * return value.cloneNode(false); - * } - * } - * - * var el = _.cloneWith(document.body, customizer); - * - * console.log(el === document.body); - * // => false - * console.log(el.nodeName); - * // => 'BODY' - * console.log(el.childNodes.length); - * // => 0 - */ - function cloneWith(value, customizer) { - customizer = typeof customizer == 'function' ? customizer : undefined; - return baseClone(value, CLONE_SYMBOLS_FLAG, customizer); - } - - /** - * This method is like `_.clone` except that it recursively clones `value`. - * - * @static - * @memberOf _ - * @since 1.0.0 - * @category Lang - * @param {*} value The value to recursively clone. - * @returns {*} Returns the deep cloned value. - * @see _.clone - * @example - * - * var objects = [{ 'a': 1 }, { 'b': 2 }]; - * - * var deep = _.cloneDeep(objects); - * console.log(deep[0] === objects[0]); - * // => false - */ - function cloneDeep(value) { - return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG); - } - - /** - * This method is like `_.cloneWith` except that it recursively clones `value`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to recursively clone. - * @param {Function} [customizer] The function to customize cloning. - * @returns {*} Returns the deep cloned value. - * @see _.cloneWith - * @example - * - * function customizer(value) { - * if (_.isElement(value)) { - * return value.cloneNode(true); - * } - * } - * - * var el = _.cloneDeepWith(document.body, customizer); - * - * console.log(el === document.body); - * // => false - * console.log(el.nodeName); - * // => 'BODY' - * console.log(el.childNodes.length); - * // => 20 - */ - function cloneDeepWith(value, customizer) { - customizer = typeof customizer == 'function' ? customizer : undefined; - return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer); - } - - /** - * Checks if `object` conforms to `source` by invoking the predicate - * properties of `source` with the corresponding property values of `object`. - * - * **Note:** This method is equivalent to `_.conforms` when `source` is - * partially applied. - * - * @static - * @memberOf _ - * @since 4.14.0 - * @category Lang - * @param {Object} object The object to inspect. - * @param {Object} source The object of property predicates to conform to. - * @returns {boolean} Returns `true` if `object` conforms, else `false`. - * @example - * - * var object = { 'a': 1, 'b': 2 }; - * - * _.conformsTo(object, { 'b': function(n) { return n > 1; } }); - * // => true - * - * _.conformsTo(object, { 'b': function(n) { return n > 2; } }); - * // => false - */ - function conformsTo(object, source) { - return source == null || baseConformsTo(object, source, keys(source)); - } - - /** - * Performs a - * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * comparison between two values to determine if they are equivalent. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @returns {boolean} Returns `true` if the values are equivalent, else `false`. - * @example - * - * var object = { 'a': 1 }; - * var other = { 'a': 1 }; - * - * _.eq(object, object); - * // => true - * - * _.eq(object, other); - * // => false - * - * _.eq('a', 'a'); - * // => true - * - * _.eq('a', Object('a')); - * // => false - * - * _.eq(NaN, NaN); - * // => true - */ - function eq(value, other) { - return value === other || (value !== value && other !== other); - } - - /** - * Checks if `value` is greater than `other`. - * - * @static - * @memberOf _ - * @since 3.9.0 - * @category Lang - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @returns {boolean} Returns `true` if `value` is greater than `other`, - * else `false`. - * @see _.lt - * @example - * - * _.gt(3, 1); - * // => true - * - * _.gt(3, 3); - * // => false - * - * _.gt(1, 3); - * // => false - */ - var gt = createRelationalOperation(baseGt); - - /** - * Checks if `value` is greater than or equal to `other`. - * - * @static - * @memberOf _ - * @since 3.9.0 - * @category Lang - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @returns {boolean} Returns `true` if `value` is greater than or equal to - * `other`, else `false`. - * @see _.lte - * @example - * - * _.gte(3, 1); - * // => true - * - * _.gte(3, 3); - * // => true - * - * _.gte(1, 3); - * // => false - */ - var gte = createRelationalOperation(function(value, other) { - return value >= other; - }); - - /** - * Checks if `value` is likely an `arguments` object. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an `arguments` object, - * else `false`. - * @example - * - * _.isArguments(function() { return arguments; }()); - * // => true - * - * _.isArguments([1, 2, 3]); - * // => false - */ - var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) { - return isObjectLike(value) && hasOwnProperty.call(value, 'callee') && - !propertyIsEnumerable.call(value, 'callee'); - }; - - /** - * Checks if `value` is classified as an `Array` object. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an array, else `false`. - * @example - * - * _.isArray([1, 2, 3]); - * // => true - * - * _.isArray(document.body.children); - * // => false - * - * _.isArray('abc'); - * // => false - * - * _.isArray(_.noop); - * // => false - */ - var isArray = Array.isArray; - - /** - * Checks if `value` is classified as an `ArrayBuffer` object. - * - * @static - * @memberOf _ - * @since 4.3.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`. - * @example - * - * _.isArrayBuffer(new ArrayBuffer(2)); - * // => true - * - * _.isArrayBuffer(new Array(2)); - * // => false - */ - var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer; - - /** - * Checks if `value` is array-like. A value is considered array-like if it's - * not a function and has a `value.length` that's an integer greater than or - * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is array-like, else `false`. - * @example - * - * _.isArrayLike([1, 2, 3]); - * // => true - * - * _.isArrayLike(document.body.children); - * // => true - * - * _.isArrayLike('abc'); - * // => true - * - * _.isArrayLike(_.noop); - * // => false - */ - function isArrayLike(value) { - return value != null && isLength(value.length) && !isFunction(value); - } - - /** - * This method is like `_.isArrayLike` except that it also checks if `value` - * is an object. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an array-like object, - * else `false`. - * @example - * - * _.isArrayLikeObject([1, 2, 3]); - * // => true - * - * _.isArrayLikeObject(document.body.children); - * // => true - * - * _.isArrayLikeObject('abc'); - * // => false - * - * _.isArrayLikeObject(_.noop); - * // => false - */ - function isArrayLikeObject(value) { - return isObjectLike(value) && isArrayLike(value); - } - - /** - * Checks if `value` is classified as a boolean primitive or object. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a boolean, else `false`. - * @example - * - * _.isBoolean(false); - * // => true - * - * _.isBoolean(null); - * // => false - */ - function isBoolean(value) { - return value === true || value === false || - (isObjectLike(value) && baseGetTag(value) == boolTag); - } - - /** - * Checks if `value` is a buffer. - * - * @static - * @memberOf _ - * @since 4.3.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a buffer, else `false`. - * @example - * - * _.isBuffer(new Buffer(2)); - * // => true - * - * _.isBuffer(new Uint8Array(2)); - * // => false - */ - var isBuffer = nativeIsBuffer || stubFalse; - - /** - * Checks if `value` is classified as a `Date` object. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a date object, else `false`. - * @example - * - * _.isDate(new Date); - * // => true - * - * _.isDate('Mon April 23 2012'); - * // => false - */ - var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate; - - /** - * Checks if `value` is likely a DOM element. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`. - * @example - * - * _.isElement(document.body); - * // => true - * - * _.isElement(''); - * // => false - */ - function isElement(value) { - return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value); - } - - /** - * Checks if `value` is an empty object, collection, map, or set. - * - * Objects are considered empty if they have no own enumerable string keyed - * properties. - * - * Array-like values such as `arguments` objects, arrays, buffers, strings, or - * jQuery-like collections are considered empty if they have a `length` of `0`. - * Similarly, maps and sets are considered empty if they have a `size` of `0`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is empty, else `false`. - * @example - * - * _.isEmpty(null); - * // => true - * - * _.isEmpty(true); - * // => true - * - * _.isEmpty(1); - * // => true - * - * _.isEmpty([1, 2, 3]); - * // => false - * - * _.isEmpty({ 'a': 1 }); - * // => false - */ - function isEmpty(value) { - if (value == null) { - return true; - } - if (isArrayLike(value) && - (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' || - isBuffer(value) || isTypedArray(value) || isArguments(value))) { - return !value.length; - } - var tag = getTag(value); - if (tag == mapTag || tag == setTag) { - return !value.size; - } - if (isPrototype(value)) { - return !baseKeys(value).length; - } - for (var key in value) { - if (hasOwnProperty.call(value, key)) { - return false; - } - } - return true; - } - - /** - * Performs a deep comparison between two values to determine if they are - * equivalent. - * - * **Note:** This method supports comparing arrays, array buffers, booleans, - * date objects, error objects, maps, numbers, `Object` objects, regexes, - * sets, strings, symbols, and typed arrays. `Object` objects are compared - * by their own, not inherited, enumerable properties. Functions and DOM - * nodes are compared by strict equality, i.e. `===`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @returns {boolean} Returns `true` if the values are equivalent, else `false`. - * @example - * - * var object = { 'a': 1 }; - * var other = { 'a': 1 }; - * - * _.isEqual(object, other); - * // => true - * - * object === other; - * // => false - */ - function isEqual(value, other) { - return baseIsEqual(value, other); - } - - /** - * This method is like `_.isEqual` except that it accepts `customizer` which - * is invoked to compare values. If `customizer` returns `undefined`, comparisons - * are handled by the method instead. The `customizer` is invoked with up to - * six arguments: (objValue, othValue [, index|key, object, other, stack]). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @param {Function} [customizer] The function to customize comparisons. - * @returns {boolean} Returns `true` if the values are equivalent, else `false`. - * @example - * - * function isGreeting(value) { - * return /^h(?:i|ello)$/.test(value); - * } - * - * function customizer(objValue, othValue) { - * if (isGreeting(objValue) && isGreeting(othValue)) { - * return true; - * } - * } - * - * var array = ['hello', 'goodbye']; - * var other = ['hi', 'goodbye']; - * - * _.isEqualWith(array, other, customizer); - * // => true - */ - function isEqualWith(value, other, customizer) { - customizer = typeof customizer == 'function' ? customizer : undefined; - var result = customizer ? customizer(value, other) : undefined; - return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result; - } - - /** - * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`, - * `SyntaxError`, `TypeError`, or `URIError` object. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an error object, else `false`. - * @example - * - * _.isError(new Error); - * // => true - * - * _.isError(Error); - * // => false - */ - function isError(value) { - if (!isObjectLike(value)) { - return false; - } - var tag = baseGetTag(value); - return tag == errorTag || tag == domExcTag || - (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value)); - } - - /** - * Checks if `value` is a finite primitive number. - * - * **Note:** This method is based on - * [`Number.isFinite`](https://mdn.io/Number/isFinite). - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a finite number, else `false`. - * @example - * - * _.isFinite(3); - * // => true - * - * _.isFinite(Number.MIN_VALUE); - * // => true - * - * _.isFinite(Infinity); - * // => false - * - * _.isFinite('3'); - * // => false - */ - function isFinite(value) { - return typeof value == 'number' && nativeIsFinite(value); - } - - /** - * Checks if `value` is classified as a `Function` object. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a function, else `false`. - * @example - * - * _.isFunction(_); - * // => true - * - * _.isFunction(/abc/); - * // => false - */ - function isFunction(value) { - if (!isObject(value)) { - return false; - } - // The use of `Object#toString` avoids issues with the `typeof` operator - // in Safari 9 which returns 'object' for typed arrays and other constructors. - var tag = baseGetTag(value); - return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; - } - - /** - * Checks if `value` is an integer. - * - * **Note:** This method is based on - * [`Number.isInteger`](https://mdn.io/Number/isInteger). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an integer, else `false`. - * @example - * - * _.isInteger(3); - * // => true - * - * _.isInteger(Number.MIN_VALUE); - * // => false - * - * _.isInteger(Infinity); - * // => false - * - * _.isInteger('3'); - * // => false - */ - function isInteger(value) { - return typeof value == 'number' && value == toInteger(value); - } - - /** - * Checks if `value` is a valid array-like length. - * - * **Note:** This method is loosely based on - * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. - * @example - * - * _.isLength(3); - * // => true - * - * _.isLength(Number.MIN_VALUE); - * // => false - * - * _.isLength(Infinity); - * // => false - * - * _.isLength('3'); - * // => false - */ - function isLength(value) { - return typeof value == 'number' && - value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; - } - - /** - * Checks if `value` is the - * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) - * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an object, else `false`. - * @example - * - * _.isObject({}); - * // => true - * - * _.isObject([1, 2, 3]); - * // => true - * - * _.isObject(_.noop); - * // => true - * - * _.isObject(null); - * // => false - */ - function isObject(value) { - var type = typeof value; - return value != null && (type == 'object' || type == 'function'); - } - - /** - * Checks if `value` is object-like. A value is object-like if it's not `null` - * and has a `typeof` result of "object". - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is object-like, else `false`. - * @example - * - * _.isObjectLike({}); - * // => true - * - * _.isObjectLike([1, 2, 3]); - * // => true - * - * _.isObjectLike(_.noop); - * // => false - * - * _.isObjectLike(null); - * // => false - */ - function isObjectLike(value) { - return value != null && typeof value == 'object'; - } - - /** - * Checks if `value` is classified as a `Map` object. - * - * @static - * @memberOf _ - * @since 4.3.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a map, else `false`. - * @example - * - * _.isMap(new Map); - * // => true - * - * _.isMap(new WeakMap); - * // => false - */ - var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap; - - /** - * Performs a partial deep comparison between `object` and `source` to - * determine if `object` contains equivalent property values. - * - * **Note:** This method is equivalent to `_.matches` when `source` is - * partially applied. - * - * Partial comparisons will match empty array and empty object `source` - * values against any array or object value, respectively. See `_.isEqual` - * for a list of supported value comparisons. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Lang - * @param {Object} object The object to inspect. - * @param {Object} source The object of property values to match. - * @returns {boolean} Returns `true` if `object` is a match, else `false`. - * @example - * - * var object = { 'a': 1, 'b': 2 }; - * - * _.isMatch(object, { 'b': 2 }); - * // => true - * - * _.isMatch(object, { 'b': 1 }); - * // => false - */ - function isMatch(object, source) { - return object === source || baseIsMatch(object, source, getMatchData(source)); - } - - /** - * This method is like `_.isMatch` except that it accepts `customizer` which - * is invoked to compare values. If `customizer` returns `undefined`, comparisons - * are handled by the method instead. The `customizer` is invoked with five - * arguments: (objValue, srcValue, index|key, object, source). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {Object} object The object to inspect. - * @param {Object} source The object of property values to match. - * @param {Function} [customizer] The function to customize comparisons. - * @returns {boolean} Returns `true` if `object` is a match, else `false`. - * @example - * - * function isGreeting(value) { - * return /^h(?:i|ello)$/.test(value); - * } - * - * function customizer(objValue, srcValue) { - * if (isGreeting(objValue) && isGreeting(srcValue)) { - * return true; - * } - * } - * - * var object = { 'greeting': 'hello' }; - * var source = { 'greeting': 'hi' }; - * - * _.isMatchWith(object, source, customizer); - * // => true - */ - function isMatchWith(object, source, customizer) { - customizer = typeof customizer == 'function' ? customizer : undefined; - return baseIsMatch(object, source, getMatchData(source), customizer); - } - - /** - * Checks if `value` is `NaN`. - * - * **Note:** This method is based on - * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as - * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for - * `undefined` and other non-number values. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. - * @example - * - * _.isNaN(NaN); - * // => true - * - * _.isNaN(new Number(NaN)); - * // => true - * - * isNaN(undefined); - * // => true - * - * _.isNaN(undefined); - * // => false - */ - function isNaN(value) { - // An `NaN` primitive is the only value that is not equal to itself. - // Perform the `toStringTag` check first to avoid errors with some - // ActiveX objects in IE. - return isNumber(value) && value != +value; - } - - /** - * Checks if `value` is a pristine native function. - * - * **Note:** This method can't reliably detect native functions in the presence - * of the core-js package because core-js circumvents this kind of detection. - * Despite multiple requests, the core-js maintainer has made it clear: any - * attempt to fix the detection will be obstructed. As a result, we're left - * with little choice but to throw an error. Unfortunately, this also affects - * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill), - * which rely on core-js. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a native function, - * else `false`. - * @example - * - * _.isNative(Array.prototype.push); - * // => true - * - * _.isNative(_); - * // => false - */ - function isNative(value) { - if (isMaskable(value)) { - throw new Error(CORE_ERROR_TEXT); - } - return baseIsNative(value); - } - - /** - * Checks if `value` is `null`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is `null`, else `false`. - * @example - * - * _.isNull(null); - * // => true - * - * _.isNull(void 0); - * // => false - */ - function isNull(value) { - return value === null; - } - - /** - * Checks if `value` is `null` or `undefined`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is nullish, else `false`. - * @example - * - * _.isNil(null); - * // => true - * - * _.isNil(void 0); - * // => true - * - * _.isNil(NaN); - * // => false - */ - function isNil(value) { - return value == null; - } - - /** - * Checks if `value` is classified as a `Number` primitive or object. - * - * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are - * classified as numbers, use the `_.isFinite` method. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a number, else `false`. - * @example - * - * _.isNumber(3); - * // => true - * - * _.isNumber(Number.MIN_VALUE); - * // => true - * - * _.isNumber(Infinity); - * // => true - * - * _.isNumber('3'); - * // => false - */ - function isNumber(value) { - return typeof value == 'number' || - (isObjectLike(value) && baseGetTag(value) == numberTag); - } - - /** - * Checks if `value` is a plain object, that is, an object created by the - * `Object` constructor or one with a `[[Prototype]]` of `null`. - * - * @static - * @memberOf _ - * @since 0.8.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a plain object, else `false`. - * @example - * - * function Foo() { - * this.a = 1; - * } - * - * _.isPlainObject(new Foo); - * // => false - * - * _.isPlainObject([1, 2, 3]); - * // => false - * - * _.isPlainObject({ 'x': 0, 'y': 0 }); - * // => true - * - * _.isPlainObject(Object.create(null)); - * // => true - */ - function isPlainObject(value) { - if (!isObjectLike(value) || baseGetTag(value) != objectTag) { - return false; - } - var proto = getPrototype(value); - if (proto === null) { - return true; - } - var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor; - return typeof Ctor == 'function' && Ctor instanceof Ctor && - funcToString.call(Ctor) == objectCtorString; - } - - /** - * Checks if `value` is classified as a `RegExp` object. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a regexp, else `false`. - * @example - * - * _.isRegExp(/abc/); - * // => true - * - * _.isRegExp('/abc/'); - * // => false - */ - var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp; - - /** - * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754 - * double precision number which isn't the result of a rounded unsafe integer. - * - * **Note:** This method is based on - * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`. - * @example - * - * _.isSafeInteger(3); - * // => true - * - * _.isSafeInteger(Number.MIN_VALUE); - * // => false - * - * _.isSafeInteger(Infinity); - * // => false - * - * _.isSafeInteger('3'); - * // => false - */ - function isSafeInteger(value) { - return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER; - } - - /** - * Checks if `value` is classified as a `Set` object. - * - * @static - * @memberOf _ - * @since 4.3.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a set, else `false`. - * @example - * - * _.isSet(new Set); - * // => true - * - * _.isSet(new WeakSet); - * // => false - */ - var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet; - - /** - * Checks if `value` is classified as a `String` primitive or object. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a string, else `false`. - * @example - * - * _.isString('abc'); - * // => true - * - * _.isString(1); - * // => false - */ - function isString(value) { - return typeof value == 'string' || - (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag); - } - - /** - * Checks if `value` is classified as a `Symbol` primitive or object. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. - * @example - * - * _.isSymbol(Symbol.iterator); - * // => true - * - * _.isSymbol('abc'); - * // => false - */ - function isSymbol(value) { - return typeof value == 'symbol' || - (isObjectLike(value) && baseGetTag(value) == symbolTag); - } - - /** - * Checks if `value` is classified as a typed array. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. - * @example - * - * _.isTypedArray(new Uint8Array); - * // => true - * - * _.isTypedArray([]); - * // => false - */ - var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray; - - /** - * Checks if `value` is `undefined`. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`. - * @example - * - * _.isUndefined(void 0); - * // => true - * - * _.isUndefined(null); - * // => false - */ - function isUndefined(value) { - return value === undefined; - } - - /** - * Checks if `value` is classified as a `WeakMap` object. - * - * @static - * @memberOf _ - * @since 4.3.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a weak map, else `false`. - * @example - * - * _.isWeakMap(new WeakMap); - * // => true - * - * _.isWeakMap(new Map); - * // => false - */ - function isWeakMap(value) { - return isObjectLike(value) && getTag(value) == weakMapTag; - } - - /** - * Checks if `value` is classified as a `WeakSet` object. - * - * @static - * @memberOf _ - * @since 4.3.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a weak set, else `false`. - * @example - * - * _.isWeakSet(new WeakSet); - * // => true - * - * _.isWeakSet(new Set); - * // => false - */ - function isWeakSet(value) { - return isObjectLike(value) && baseGetTag(value) == weakSetTag; - } - - /** - * Checks if `value` is less than `other`. - * - * @static - * @memberOf _ - * @since 3.9.0 - * @category Lang - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @returns {boolean} Returns `true` if `value` is less than `other`, - * else `false`. - * @see _.gt - * @example - * - * _.lt(1, 3); - * // => true - * - * _.lt(3, 3); - * // => false - * - * _.lt(3, 1); - * // => false - */ - var lt = createRelationalOperation(baseLt); - - /** - * Checks if `value` is less than or equal to `other`. - * - * @static - * @memberOf _ - * @since 3.9.0 - * @category Lang - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @returns {boolean} Returns `true` if `value` is less than or equal to - * `other`, else `false`. - * @see _.gte - * @example - * - * _.lte(1, 3); - * // => true - * - * _.lte(3, 3); - * // => true - * - * _.lte(3, 1); - * // => false - */ - var lte = createRelationalOperation(function(value, other) { - return value <= other; - }); - - /** - * Converts `value` to an array. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Lang - * @param {*} value The value to convert. - * @returns {Array} Returns the converted array. - * @example - * - * _.toArray({ 'a': 1, 'b': 2 }); - * // => [1, 2] - * - * _.toArray('abc'); - * // => ['a', 'b', 'c'] - * - * _.toArray(1); - * // => [] - * - * _.toArray(null); - * // => [] - */ - function toArray(value) { - if (!value) { - return []; - } - if (isArrayLike(value)) { - return isString(value) ? stringToArray(value) : copyArray(value); - } - if (symIterator && value[symIterator]) { - return iteratorToArray(value[symIterator]()); - } - var tag = getTag(value), - func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values); - - return func(value); - } - - /** - * Converts `value` to a finite number. - * - * @static - * @memberOf _ - * @since 4.12.0 - * @category Lang - * @param {*} value The value to convert. - * @returns {number} Returns the converted number. - * @example - * - * _.toFinite(3.2); - * // => 3.2 - * - * _.toFinite(Number.MIN_VALUE); - * // => 5e-324 - * - * _.toFinite(Infinity); - * // => 1.7976931348623157e+308 - * - * _.toFinite('3.2'); - * // => 3.2 - */ - function toFinite(value) { - if (!value) { - return value === 0 ? value : 0; - } - value = toNumber(value); - if (value === INFINITY || value === -INFINITY) { - var sign = (value < 0 ? -1 : 1); - return sign * MAX_INTEGER; - } - return value === value ? value : 0; - } - - /** - * Converts `value` to an integer. - * - * **Note:** This method is loosely based on - * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to convert. - * @returns {number} Returns the converted integer. - * @example - * - * _.toInteger(3.2); - * // => 3 - * - * _.toInteger(Number.MIN_VALUE); - * // => 0 - * - * _.toInteger(Infinity); - * // => 1.7976931348623157e+308 - * - * _.toInteger('3.2'); - * // => 3 - */ - function toInteger(value) { - var result = toFinite(value), - remainder = result % 1; - - return result === result ? (remainder ? result - remainder : result) : 0; - } - - /** - * Converts `value` to an integer suitable for use as the length of an - * array-like object. - * - * **Note:** This method is based on - * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to convert. - * @returns {number} Returns the converted integer. - * @example - * - * _.toLength(3.2); - * // => 3 - * - * _.toLength(Number.MIN_VALUE); - * // => 0 - * - * _.toLength(Infinity); - * // => 4294967295 - * - * _.toLength('3.2'); - * // => 3 - */ - function toLength(value) { - return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0; - } - - /** - * Converts `value` to a number. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to process. - * @returns {number} Returns the number. - * @example - * - * _.toNumber(3.2); - * // => 3.2 - * - * _.toNumber(Number.MIN_VALUE); - * // => 5e-324 - * - * _.toNumber(Infinity); - * // => Infinity - * - * _.toNumber('3.2'); - * // => 3.2 - */ - function toNumber(value) { - if (typeof value == 'number') { - return value; - } - if (isSymbol(value)) { - return NAN; - } - if (isObject(value)) { - var other = typeof value.valueOf == 'function' ? value.valueOf() : value; - value = isObject(other) ? (other + '') : other; - } - if (typeof value != 'string') { - return value === 0 ? value : +value; - } - value = baseTrim(value); - var isBinary = reIsBinary.test(value); - return (isBinary || reIsOctal.test(value)) - ? freeParseInt(value.slice(2), isBinary ? 2 : 8) - : (reIsBadHex.test(value) ? NAN : +value); - } - - /** - * Converts `value` to a plain object flattening inherited enumerable string - * keyed properties of `value` to own properties of the plain object. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Lang - * @param {*} value The value to convert. - * @returns {Object} Returns the converted plain object. - * @example - * - * function Foo() { - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.assign({ 'a': 1 }, new Foo); - * // => { 'a': 1, 'b': 2 } - * - * _.assign({ 'a': 1 }, _.toPlainObject(new Foo)); - * // => { 'a': 1, 'b': 2, 'c': 3 } - */ - function toPlainObject(value) { - return copyObject(value, keysIn(value)); - } - - /** - * Converts `value` to a safe integer. A safe integer can be compared and - * represented correctly. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to convert. - * @returns {number} Returns the converted integer. - * @example - * - * _.toSafeInteger(3.2); - * // => 3 - * - * _.toSafeInteger(Number.MIN_VALUE); - * // => 0 - * - * _.toSafeInteger(Infinity); - * // => 9007199254740991 - * - * _.toSafeInteger('3.2'); - * // => 3 - */ - function toSafeInteger(value) { - return value - ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER) - : (value === 0 ? value : 0); - } - - /** - * Converts `value` to a string. An empty string is returned for `null` - * and `undefined` values. The sign of `-0` is preserved. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to convert. - * @returns {string} Returns the converted string. - * @example - * - * _.toString(null); - * // => '' - * - * _.toString(-0); - * // => '-0' - * - * _.toString([1, 2, 3]); - * // => '1,2,3' - */ - function toString(value) { - return value == null ? '' : baseToString(value); - } - - /*------------------------------------------------------------------------*/ - - /** - * Assigns own enumerable string keyed properties of source objects to the - * destination object. Source objects are applied from left to right. - * Subsequent sources overwrite property assignments of previous sources. - * - * **Note:** This method mutates `object` and is loosely based on - * [`Object.assign`](https://mdn.io/Object/assign). - * - * @static - * @memberOf _ - * @since 0.10.0 - * @category Object - * @param {Object} object The destination object. - * @param {...Object} [sources] The source objects. - * @returns {Object} Returns `object`. - * @see _.assignIn - * @example - * - * function Foo() { - * this.a = 1; - * } - * - * function Bar() { - * this.c = 3; - * } - * - * Foo.prototype.b = 2; - * Bar.prototype.d = 4; - * - * _.assign({ 'a': 0 }, new Foo, new Bar); - * // => { 'a': 1, 'c': 3 } - */ - var assign = createAssigner(function(object, source) { - if (isPrototype(source) || isArrayLike(source)) { - copyObject(source, keys(source), object); - return; - } - for (var key in source) { - if (hasOwnProperty.call(source, key)) { - assignValue(object, key, source[key]); - } - } - }); - - /** - * This method is like `_.assign` except that it iterates over own and - * inherited source properties. - * - * **Note:** This method mutates `object`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @alias extend - * @category Object - * @param {Object} object The destination object. - * @param {...Object} [sources] The source objects. - * @returns {Object} Returns `object`. - * @see _.assign - * @example - * - * function Foo() { - * this.a = 1; - * } - * - * function Bar() { - * this.c = 3; - * } - * - * Foo.prototype.b = 2; - * Bar.prototype.d = 4; - * - * _.assignIn({ 'a': 0 }, new Foo, new Bar); - * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 } - */ - var assignIn = createAssigner(function(object, source) { - copyObject(source, keysIn(source), object); - }); - - /** - * This method is like `_.assignIn` except that it accepts `customizer` - * which is invoked to produce the assigned values. If `customizer` returns - * `undefined`, assignment is handled by the method instead. The `customizer` - * is invoked with five arguments: (objValue, srcValue, key, object, source). - * - * **Note:** This method mutates `object`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @alias extendWith - * @category Object - * @param {Object} object The destination object. - * @param {...Object} sources The source objects. - * @param {Function} [customizer] The function to customize assigned values. - * @returns {Object} Returns `object`. - * @see _.assignWith - * @example - * - * function customizer(objValue, srcValue) { - * return _.isUndefined(objValue) ? srcValue : objValue; - * } - * - * var defaults = _.partialRight(_.assignInWith, customizer); - * - * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); - * // => { 'a': 1, 'b': 2 } - */ - var assignInWith = createAssigner(function(object, source, srcIndex, customizer) { - copyObject(source, keysIn(source), object, customizer); - }); - - /** - * This method is like `_.assign` except that it accepts `customizer` - * which is invoked to produce the assigned values. If `customizer` returns - * `undefined`, assignment is handled by the method instead. The `customizer` - * is invoked with five arguments: (objValue, srcValue, key, object, source). - * - * **Note:** This method mutates `object`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Object - * @param {Object} object The destination object. - * @param {...Object} sources The source objects. - * @param {Function} [customizer] The function to customize assigned values. - * @returns {Object} Returns `object`. - * @see _.assignInWith - * @example - * - * function customizer(objValue, srcValue) { - * return _.isUndefined(objValue) ? srcValue : objValue; - * } - * - * var defaults = _.partialRight(_.assignWith, customizer); - * - * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); - * // => { 'a': 1, 'b': 2 } - */ - var assignWith = createAssigner(function(object, source, srcIndex, customizer) { - copyObject(source, keys(source), object, customizer); - }); - - /** - * Creates an array of values corresponding to `paths` of `object`. - * - * @static - * @memberOf _ - * @since 1.0.0 - * @category Object - * @param {Object} object The object to iterate over. - * @param {...(string|string[])} [paths] The property paths to pick. - * @returns {Array} Returns the picked values. - * @example - * - * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] }; - * - * _.at(object, ['a[0].b.c', 'a[1]']); - * // => [3, 4] - */ - var at = flatRest(baseAt); - - /** - * Creates an object that inherits from the `prototype` object. If a - * `properties` object is given, its own enumerable string keyed properties - * are assigned to the created object. - * - * @static - * @memberOf _ - * @since 2.3.0 - * @category Object - * @param {Object} prototype The object to inherit from. - * @param {Object} [properties] The properties to assign to the object. - * @returns {Object} Returns the new object. - * @example - * - * function Shape() { - * this.x = 0; - * this.y = 0; - * } - * - * function Circle() { - * Shape.call(this); - * } - * - * Circle.prototype = _.create(Shape.prototype, { - * 'constructor': Circle - * }); - * - * var circle = new Circle; - * circle instanceof Circle; - * // => true - * - * circle instanceof Shape; - * // => true - */ - function create(prototype, properties) { - var result = baseCreate(prototype); - return properties == null ? result : baseAssign(result, properties); - } - - /** - * Assigns own and inherited enumerable string keyed properties of source - * objects to the destination object for all destination properties that - * resolve to `undefined`. Source objects are applied from left to right. - * Once a property is set, additional values of the same property are ignored. - * - * **Note:** This method mutates `object`. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Object - * @param {Object} object The destination object. - * @param {...Object} [sources] The source objects. - * @returns {Object} Returns `object`. - * @see _.defaultsDeep - * @example - * - * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); - * // => { 'a': 1, 'b': 2 } - */ - var defaults = baseRest(function(object, sources) { - object = Object(object); - - var index = -1; - var length = sources.length; - var guard = length > 2 ? sources[2] : undefined; - - if (guard && isIterateeCall(sources[0], sources[1], guard)) { - length = 1; - } - - while (++index < length) { - var source = sources[index]; - var props = keysIn(source); - var propsIndex = -1; - var propsLength = props.length; - - while (++propsIndex < propsLength) { - var key = props[propsIndex]; - var value = object[key]; - - if (value === undefined || - (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) { - object[key] = source[key]; - } - } - } - - return object; - }); - - /** - * This method is like `_.defaults` except that it recursively assigns - * default properties. - * - * **Note:** This method mutates `object`. - * - * @static - * @memberOf _ - * @since 3.10.0 - * @category Object - * @param {Object} object The destination object. - * @param {...Object} [sources] The source objects. - * @returns {Object} Returns `object`. - * @see _.defaults - * @example - * - * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } }); - * // => { 'a': { 'b': 2, 'c': 3 } } - */ - var defaultsDeep = baseRest(function(args) { - args.push(undefined, customDefaultsMerge); - return apply(mergeWith, undefined, args); - }); - - /** - * This method is like `_.find` except that it returns the key of the first - * element `predicate` returns truthy for instead of the element itself. - * - * @static - * @memberOf _ - * @since 1.1.0 - * @category Object - * @param {Object} object The object to inspect. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @returns {string|undefined} Returns the key of the matched element, - * else `undefined`. - * @example - * - * var users = { - * 'barney': { 'age': 36, 'active': true }, - * 'fred': { 'age': 40, 'active': false }, - * 'pebbles': { 'age': 1, 'active': true } - * }; - * - * _.findKey(users, function(o) { return o.age < 40; }); - * // => 'barney' (iteration order is not guaranteed) - * - * // The `_.matches` iteratee shorthand. - * _.findKey(users, { 'age': 1, 'active': true }); - * // => 'pebbles' - * - * // The `_.matchesProperty` iteratee shorthand. - * _.findKey(users, ['active', false]); - * // => 'fred' - * - * // The `_.property` iteratee shorthand. - * _.findKey(users, 'active'); - * // => 'barney' - */ - function findKey(object, predicate) { - return baseFindKey(object, getIteratee(predicate, 3), baseForOwn); - } - - /** - * This method is like `_.findKey` except that it iterates over elements of - * a collection in the opposite order. - * - * @static - * @memberOf _ - * @since 2.0.0 - * @category Object - * @param {Object} object The object to inspect. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @returns {string|undefined} Returns the key of the matched element, - * else `undefined`. - * @example - * - * var users = { - * 'barney': { 'age': 36, 'active': true }, - * 'fred': { 'age': 40, 'active': false }, - * 'pebbles': { 'age': 1, 'active': true } - * }; - * - * _.findLastKey(users, function(o) { return o.age < 40; }); - * // => returns 'pebbles' assuming `_.findKey` returns 'barney' - * - * // The `_.matches` iteratee shorthand. - * _.findLastKey(users, { 'age': 36, 'active': true }); - * // => 'barney' - * - * // The `_.matchesProperty` iteratee shorthand. - * _.findLastKey(users, ['active', false]); - * // => 'fred' - * - * // The `_.property` iteratee shorthand. - * _.findLastKey(users, 'active'); - * // => 'pebbles' - */ - function findLastKey(object, predicate) { - return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight); - } - - /** - * Iterates over own and inherited enumerable string keyed properties of an - * object and invokes `iteratee` for each property. The iteratee is invoked - * with three arguments: (value, key, object). Iteratee functions may exit - * iteration early by explicitly returning `false`. - * - * @static - * @memberOf _ - * @since 0.3.0 - * @category Object - * @param {Object} object The object to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @returns {Object} Returns `object`. - * @see _.forInRight - * @example - * - * function Foo() { - * this.a = 1; - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.forIn(new Foo, function(value, key) { - * console.log(key); - * }); - * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed). - */ - function forIn(object, iteratee) { - return object == null - ? object - : baseFor(object, getIteratee(iteratee, 3), keysIn); - } - - /** - * This method is like `_.forIn` except that it iterates over properties of - * `object` in the opposite order. - * - * @static - * @memberOf _ - * @since 2.0.0 - * @category Object - * @param {Object} object The object to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @returns {Object} Returns `object`. - * @see _.forIn - * @example - * - * function Foo() { - * this.a = 1; - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.forInRight(new Foo, function(value, key) { - * console.log(key); - * }); - * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'. - */ - function forInRight(object, iteratee) { - return object == null - ? object - : baseForRight(object, getIteratee(iteratee, 3), keysIn); - } - - /** - * Iterates over own enumerable string keyed properties of an object and - * invokes `iteratee` for each property. The iteratee is invoked with three - * arguments: (value, key, object). Iteratee functions may exit iteration - * early by explicitly returning `false`. - * - * @static - * @memberOf _ - * @since 0.3.0 - * @category Object - * @param {Object} object The object to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @returns {Object} Returns `object`. - * @see _.forOwnRight - * @example - * - * function Foo() { - * this.a = 1; - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.forOwn(new Foo, function(value, key) { - * console.log(key); - * }); - * // => Logs 'a' then 'b' (iteration order is not guaranteed). - */ - function forOwn(object, iteratee) { - return object && baseForOwn(object, getIteratee(iteratee, 3)); - } - - /** - * This method is like `_.forOwn` except that it iterates over properties of - * `object` in the opposite order. - * - * @static - * @memberOf _ - * @since 2.0.0 - * @category Object - * @param {Object} object The object to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @returns {Object} Returns `object`. - * @see _.forOwn - * @example - * - * function Foo() { - * this.a = 1; - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.forOwnRight(new Foo, function(value, key) { - * console.log(key); - * }); - * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'. - */ - function forOwnRight(object, iteratee) { - return object && baseForOwnRight(object, getIteratee(iteratee, 3)); - } - - /** - * Creates an array of function property names from own enumerable properties - * of `object`. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Object - * @param {Object} object The object to inspect. - * @returns {Array} Returns the function names. - * @see _.functionsIn - * @example - * - * function Foo() { - * this.a = _.constant('a'); - * this.b = _.constant('b'); - * } - * - * Foo.prototype.c = _.constant('c'); - * - * _.functions(new Foo); - * // => ['a', 'b'] - */ - function functions(object) { - return object == null ? [] : baseFunctions(object, keys(object)); - } - - /** - * Creates an array of function property names from own and inherited - * enumerable properties of `object`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Object - * @param {Object} object The object to inspect. - * @returns {Array} Returns the function names. - * @see _.functions - * @example - * - * function Foo() { - * this.a = _.constant('a'); - * this.b = _.constant('b'); - * } - * - * Foo.prototype.c = _.constant('c'); - * - * _.functionsIn(new Foo); - * // => ['a', 'b', 'c'] - */ - function functionsIn(object) { - return object == null ? [] : baseFunctions(object, keysIn(object)); - } - - /** - * Gets the value at `path` of `object`. If the resolved value is - * `undefined`, the `defaultValue` is returned in its place. - * - * @static - * @memberOf _ - * @since 3.7.0 - * @category Object - * @param {Object} object The object to query. - * @param {Array|string} path The path of the property to get. - * @param {*} [defaultValue] The value returned for `undefined` resolved values. - * @returns {*} Returns the resolved value. - * @example - * - * var object = { 'a': [{ 'b': { 'c': 3 } }] }; - * - * _.get(object, 'a[0].b.c'); - * // => 3 - * - * _.get(object, ['a', '0', 'b', 'c']); - * // => 3 - * - * _.get(object, 'a.b.c', 'default'); - * // => 'default' - */ - function get(object, path, defaultValue) { - var result = object == null ? undefined : baseGet(object, path); - return result === undefined ? defaultValue : result; - } - - /** - * Checks if `path` is a direct property of `object`. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Object - * @param {Object} object The object to query. - * @param {Array|string} path The path to check. - * @returns {boolean} Returns `true` if `path` exists, else `false`. - * @example - * - * var object = { 'a': { 'b': 2 } }; - * var other = _.create({ 'a': _.create({ 'b': 2 }) }); - * - * _.has(object, 'a'); - * // => true - * - * _.has(object, 'a.b'); - * // => true - * - * _.has(object, ['a', 'b']); - * // => true - * - * _.has(other, 'a'); - * // => false - */ - function has(object, path) { - return object != null && hasPath(object, path, baseHas); - } - - /** - * Checks if `path` is a direct or inherited property of `object`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Object - * @param {Object} object The object to query. - * @param {Array|string} path The path to check. - * @returns {boolean} Returns `true` if `path` exists, else `false`. - * @example - * - * var object = _.create({ 'a': _.create({ 'b': 2 }) }); - * - * _.hasIn(object, 'a'); - * // => true - * - * _.hasIn(object, 'a.b'); - * // => true - * - * _.hasIn(object, ['a', 'b']); - * // => true - * - * _.hasIn(object, 'b'); - * // => false - */ - function hasIn(object, path) { - return object != null && hasPath(object, path, baseHasIn); - } - - /** - * Creates an object composed of the inverted keys and values of `object`. - * If `object` contains duplicate values, subsequent values overwrite - * property assignments of previous values. - * - * @static - * @memberOf _ - * @since 0.7.0 - * @category Object - * @param {Object} object The object to invert. - * @returns {Object} Returns the new inverted object. - * @example - * - * var object = { 'a': 1, 'b': 2, 'c': 1 }; - * - * _.invert(object); - * // => { '1': 'c', '2': 'b' } - */ - var invert = createInverter(function(result, value, key) { - if (value != null && - typeof value.toString != 'function') { - value = nativeObjectToString.call(value); - } - - result[value] = key; - }, constant(identity)); - - /** - * This method is like `_.invert` except that the inverted object is generated - * from the results of running each element of `object` thru `iteratee`. The - * corresponding inverted value of each inverted key is an array of keys - * responsible for generating the inverted value. The iteratee is invoked - * with one argument: (value). - * - * @static - * @memberOf _ - * @since 4.1.0 - * @category Object - * @param {Object} object The object to invert. - * @param {Function} [iteratee=_.identity] The iteratee invoked per element. - * @returns {Object} Returns the new inverted object. - * @example - * - * var object = { 'a': 1, 'b': 2, 'c': 1 }; - * - * _.invertBy(object); - * // => { '1': ['a', 'c'], '2': ['b'] } - * - * _.invertBy(object, function(value) { - * return 'group' + value; - * }); - * // => { 'group1': ['a', 'c'], 'group2': ['b'] } - */ - var invertBy = createInverter(function(result, value, key) { - if (value != null && - typeof value.toString != 'function') { - value = nativeObjectToString.call(value); - } - - if (hasOwnProperty.call(result, value)) { - result[value].push(key); - } else { - result[value] = [key]; - } - }, getIteratee); - - /** - * Invokes the method at `path` of `object`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Object - * @param {Object} object The object to query. - * @param {Array|string} path The path of the method to invoke. - * @param {...*} [args] The arguments to invoke the method with. - * @returns {*} Returns the result of the invoked method. - * @example - * - * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] }; - * - * _.invoke(object, 'a[0].b.c.slice', 1, 3); - * // => [2, 3] - */ - var invoke = baseRest(baseInvoke); - - /** - * Creates an array of the own enumerable property names of `object`. - * - * **Note:** Non-object values are coerced to objects. See the - * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) - * for more details. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Object - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names. - * @example - * - * function Foo() { - * this.a = 1; - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.keys(new Foo); - * // => ['a', 'b'] (iteration order is not guaranteed) - * - * _.keys('hi'); - * // => ['0', '1'] - */ - function keys(object) { - return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object); - } - - /** - * Creates an array of the own and inherited enumerable property names of `object`. - * - * **Note:** Non-object values are coerced to objects. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Object - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names. - * @example - * - * function Foo() { - * this.a = 1; - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.keysIn(new Foo); - * // => ['a', 'b', 'c'] (iteration order is not guaranteed) - */ - function keysIn(object) { - return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object); - } - - /** - * The opposite of `_.mapValues`; this method creates an object with the - * same values as `object` and keys generated by running each own enumerable - * string keyed property of `object` thru `iteratee`. The iteratee is invoked - * with three arguments: (value, key, object). - * - * @static - * @memberOf _ - * @since 3.8.0 - * @category Object - * @param {Object} object The object to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @returns {Object} Returns the new mapped object. - * @see _.mapValues - * @example - * - * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) { - * return key + value; - * }); - * // => { 'a1': 1, 'b2': 2 } - */ - function mapKeys(object, iteratee) { - var result = {}; - iteratee = getIteratee(iteratee, 3); - - baseForOwn(object, function(value, key, object) { - baseAssignValue(result, iteratee(value, key, object), value); - }); - return result; - } - - /** - * Creates an object with the same keys as `object` and values generated - * by running each own enumerable string keyed property of `object` thru - * `iteratee`. The iteratee is invoked with three arguments: - * (value, key, object). - * - * @static - * @memberOf _ - * @since 2.4.0 - * @category Object - * @param {Object} object The object to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @returns {Object} Returns the new mapped object. - * @see _.mapKeys - * @example - * - * var users = { - * 'fred': { 'user': 'fred', 'age': 40 }, - * 'pebbles': { 'user': 'pebbles', 'age': 1 } - * }; - * - * _.mapValues(users, function(o) { return o.age; }); - * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) - * - * // The `_.property` iteratee shorthand. - * _.mapValues(users, 'age'); - * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) - */ - function mapValues(object, iteratee) { - var result = {}; - iteratee = getIteratee(iteratee, 3); - - baseForOwn(object, function(value, key, object) { - baseAssignValue(result, key, iteratee(value, key, object)); - }); - return result; - } - - /** - * This method is like `_.assign` except that it recursively merges own and - * inherited enumerable string keyed properties of source objects into the - * destination object. Source properties that resolve to `undefined` are - * skipped if a destination value exists. Array and plain object properties - * are merged recursively. Other objects and value types are overridden by - * assignment. Source objects are applied from left to right. Subsequent - * sources overwrite property assignments of previous sources. - * - * **Note:** This method mutates `object`. - * - * @static - * @memberOf _ - * @since 0.5.0 - * @category Object - * @param {Object} object The destination object. - * @param {...Object} [sources] The source objects. - * @returns {Object} Returns `object`. - * @example - * - * var object = { - * 'a': [{ 'b': 2 }, { 'd': 4 }] - * }; - * - * var other = { - * 'a': [{ 'c': 3 }, { 'e': 5 }] - * }; - * - * _.merge(object, other); - * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] } - */ - var merge = createAssigner(function(object, source, srcIndex) { - baseMerge(object, source, srcIndex); - }); - - /** - * This method is like `_.merge` except that it accepts `customizer` which - * is invoked to produce the merged values of the destination and source - * properties. If `customizer` returns `undefined`, merging is handled by the - * method instead. The `customizer` is invoked with six arguments: - * (objValue, srcValue, key, object, source, stack). - * - * **Note:** This method mutates `object`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Object - * @param {Object} object The destination object. - * @param {...Object} sources The source objects. - * @param {Function} customizer The function to customize assigned values. - * @returns {Object} Returns `object`. - * @example - * - * function customizer(objValue, srcValue) { - * if (_.isArray(objValue)) { - * return objValue.concat(srcValue); - * } - * } - * - * var object = { 'a': [1], 'b': [2] }; - * var other = { 'a': [3], 'b': [4] }; - * - * _.mergeWith(object, other, customizer); - * // => { 'a': [1, 3], 'b': [2, 4] } - */ - var mergeWith = createAssigner(function(object, source, srcIndex, customizer) { - baseMerge(object, source, srcIndex, customizer); - }); - - /** - * The opposite of `_.pick`; this method creates an object composed of the - * own and inherited enumerable property paths of `object` that are not omitted. - * - * **Note:** This method is considerably slower than `_.pick`. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Object - * @param {Object} object The source object. - * @param {...(string|string[])} [paths] The property paths to omit. - * @returns {Object} Returns the new object. - * @example - * - * var object = { 'a': 1, 'b': '2', 'c': 3 }; - * - * _.omit(object, ['a', 'c']); - * // => { 'b': '2' } - */ - var omit = flatRest(function(object, paths) { - var result = {}; - if (object == null) { - return result; - } - var isDeep = false; - paths = arrayMap(paths, function(path) { - path = castPath(path, object); - isDeep || (isDeep = path.length > 1); - return path; - }); - copyObject(object, getAllKeysIn(object), result); - if (isDeep) { - result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone); - } - var length = paths.length; - while (length--) { - baseUnset(result, paths[length]); - } - return result; - }); - - /** - * The opposite of `_.pickBy`; this method creates an object composed of - * the own and inherited enumerable string keyed properties of `object` that - * `predicate` doesn't return truthy for. The predicate is invoked with two - * arguments: (value, key). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Object - * @param {Object} object The source object. - * @param {Function} [predicate=_.identity] The function invoked per property. - * @returns {Object} Returns the new object. - * @example - * - * var object = { 'a': 1, 'b': '2', 'c': 3 }; - * - * _.omitBy(object, _.isNumber); - * // => { 'b': '2' } - */ - function omitBy(object, predicate) { - return pickBy(object, negate(getIteratee(predicate))); - } - - /** - * Creates an object composed of the picked `object` properties. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Object - * @param {Object} object The source object. - * @param {...(string|string[])} [paths] The property paths to pick. - * @returns {Object} Returns the new object. - * @example - * - * var object = { 'a': 1, 'b': '2', 'c': 3 }; - * - * _.pick(object, ['a', 'c']); - * // => { 'a': 1, 'c': 3 } - */ - var pick = flatRest(function(object, paths) { - return object == null ? {} : basePick(object, paths); - }); - - /** - * Creates an object composed of the `object` properties `predicate` returns - * truthy for. The predicate is invoked with two arguments: (value, key). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Object - * @param {Object} object The source object. - * @param {Function} [predicate=_.identity] The function invoked per property. - * @returns {Object} Returns the new object. - * @example - * - * var object = { 'a': 1, 'b': '2', 'c': 3 }; - * - * _.pickBy(object, _.isNumber); - * // => { 'a': 1, 'c': 3 } - */ - function pickBy(object, predicate) { - if (object == null) { - return {}; - } - var props = arrayMap(getAllKeysIn(object), function(prop) { - return [prop]; - }); - predicate = getIteratee(predicate); - return basePickBy(object, props, function(value, path) { - return predicate(value, path[0]); - }); - } - - /** - * This method is like `_.get` except that if the resolved value is a - * function it's invoked with the `this` binding of its parent object and - * its result is returned. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Object - * @param {Object} object The object to query. - * @param {Array|string} path The path of the property to resolve. - * @param {*} [defaultValue] The value returned for `undefined` resolved values. - * @returns {*} Returns the resolved value. - * @example - * - * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] }; - * - * _.result(object, 'a[0].b.c1'); - * // => 3 - * - * _.result(object, 'a[0].b.c2'); - * // => 4 - * - * _.result(object, 'a[0].b.c3', 'default'); - * // => 'default' - * - * _.result(object, 'a[0].b.c3', _.constant('default')); - * // => 'default' - */ - function result(object, path, defaultValue) { - path = castPath(path, object); - - var index = -1, - length = path.length; - - // Ensure the loop is entered when path is empty. - if (!length) { - length = 1; - object = undefined; - } - while (++index < length) { - var value = object == null ? undefined : object[toKey(path[index])]; - if (value === undefined) { - index = length; - value = defaultValue; - } - object = isFunction(value) ? value.call(object) : value; - } - return object; - } - - /** - * Sets the value at `path` of `object`. If a portion of `path` doesn't exist, - * it's created. Arrays are created for missing index properties while objects - * are created for all other missing properties. Use `_.setWith` to customize - * `path` creation. - * - * **Note:** This method mutates `object`. - * - * @static - * @memberOf _ - * @since 3.7.0 - * @category Object - * @param {Object} object The object to modify. - * @param {Array|string} path The path of the property to set. - * @param {*} value The value to set. - * @returns {Object} Returns `object`. - * @example - * - * var object = { 'a': [{ 'b': { 'c': 3 } }] }; - * - * _.set(object, 'a[0].b.c', 4); - * console.log(object.a[0].b.c); - * // => 4 - * - * _.set(object, ['x', '0', 'y', 'z'], 5); - * console.log(object.x[0].y.z); - * // => 5 - */ - function set(object, path, value) { - return object == null ? object : baseSet(object, path, value); - } - - /** - * This method is like `_.set` except that it accepts `customizer` which is - * invoked to produce the objects of `path`. If `customizer` returns `undefined` - * path creation is handled by the method instead. The `customizer` is invoked - * with three arguments: (nsValue, key, nsObject). - * - * **Note:** This method mutates `object`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Object - * @param {Object} object The object to modify. - * @param {Array|string} path The path of the property to set. - * @param {*} value The value to set. - * @param {Function} [customizer] The function to customize assigned values. - * @returns {Object} Returns `object`. - * @example - * - * var object = {}; - * - * _.setWith(object, '[0][1]', 'a', Object); - * // => { '0': { '1': 'a' } } - */ - function setWith(object, path, value, customizer) { - customizer = typeof customizer == 'function' ? customizer : undefined; - return object == null ? object : baseSet(object, path, value, customizer); - } - - /** - * Creates an array of own enumerable string keyed-value pairs for `object` - * which can be consumed by `_.fromPairs`. If `object` is a map or set, its - * entries are returned. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @alias entries - * @category Object - * @param {Object} object The object to query. - * @returns {Array} Returns the key-value pairs. - * @example - * - * function Foo() { - * this.a = 1; - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.toPairs(new Foo); - * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed) - */ - var toPairs = createToPairs(keys); - - /** - * Creates an array of own and inherited enumerable string keyed-value pairs - * for `object` which can be consumed by `_.fromPairs`. If `object` is a map - * or set, its entries are returned. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @alias entriesIn - * @category Object - * @param {Object} object The object to query. - * @returns {Array} Returns the key-value pairs. - * @example - * - * function Foo() { - * this.a = 1; - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.toPairsIn(new Foo); - * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed) - */ - var toPairsIn = createToPairs(keysIn); - - /** - * An alternative to `_.reduce`; this method transforms `object` to a new - * `accumulator` object which is the result of running each of its own - * enumerable string keyed properties thru `iteratee`, with each invocation - * potentially mutating the `accumulator` object. If `accumulator` is not - * provided, a new object with the same `[[Prototype]]` will be used. The - * iteratee is invoked with four arguments: (accumulator, value, key, object). - * Iteratee functions may exit iteration early by explicitly returning `false`. - * - * @static - * @memberOf _ - * @since 1.3.0 - * @category Object - * @param {Object} object The object to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @param {*} [accumulator] The custom accumulator value. - * @returns {*} Returns the accumulated value. - * @example - * - * _.transform([2, 3, 4], function(result, n) { - * result.push(n *= n); - * return n % 2 == 0; - * }, []); - * // => [4, 9] - * - * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { - * (result[value] || (result[value] = [])).push(key); - * }, {}); - * // => { '1': ['a', 'c'], '2': ['b'] } - */ - function transform(object, iteratee, accumulator) { - var isArr = isArray(object), - isArrLike = isArr || isBuffer(object) || isTypedArray(object); - - iteratee = getIteratee(iteratee, 4); - if (accumulator == null) { - var Ctor = object && object.constructor; - if (isArrLike) { - accumulator = isArr ? new Ctor : []; - } - else if (isObject(object)) { - accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {}; - } - else { - accumulator = {}; - } - } - (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) { - return iteratee(accumulator, value, index, object); - }); - return accumulator; - } - - /** - * Removes the property at `path` of `object`. - * - * **Note:** This method mutates `object`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Object - * @param {Object} object The object to modify. - * @param {Array|string} path The path of the property to unset. - * @returns {boolean} Returns `true` if the property is deleted, else `false`. - * @example - * - * var object = { 'a': [{ 'b': { 'c': 7 } }] }; - * _.unset(object, 'a[0].b.c'); - * // => true - * - * console.log(object); - * // => { 'a': [{ 'b': {} }] }; - * - * _.unset(object, ['a', '0', 'b', 'c']); - * // => true - * - * console.log(object); - * // => { 'a': [{ 'b': {} }] }; - */ - function unset(object, path) { - return object == null ? true : baseUnset(object, path); - } - - /** - * This method is like `_.set` except that accepts `updater` to produce the - * value to set. Use `_.updateWith` to customize `path` creation. The `updater` - * is invoked with one argument: (value). - * - * **Note:** This method mutates `object`. - * - * @static - * @memberOf _ - * @since 4.6.0 - * @category Object - * @param {Object} object The object to modify. - * @param {Array|string} path The path of the property to set. - * @param {Function} updater The function to produce the updated value. - * @returns {Object} Returns `object`. - * @example - * - * var object = { 'a': [{ 'b': { 'c': 3 } }] }; - * - * _.update(object, 'a[0].b.c', function(n) { return n * n; }); - * console.log(object.a[0].b.c); - * // => 9 - * - * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; }); - * console.log(object.x[0].y.z); - * // => 0 - */ - function update(object, path, updater) { - return object == null ? object : baseUpdate(object, path, castFunction(updater)); - } - - /** - * This method is like `_.update` except that it accepts `customizer` which is - * invoked to produce the objects of `path`. If `customizer` returns `undefined` - * path creation is handled by the method instead. The `customizer` is invoked - * with three arguments: (nsValue, key, nsObject). - * - * **Note:** This method mutates `object`. - * - * @static - * @memberOf _ - * @since 4.6.0 - * @category Object - * @param {Object} object The object to modify. - * @param {Array|string} path The path of the property to set. - * @param {Function} updater The function to produce the updated value. - * @param {Function} [customizer] The function to customize assigned values. - * @returns {Object} Returns `object`. - * @example - * - * var object = {}; - * - * _.updateWith(object, '[0][1]', _.constant('a'), Object); - * // => { '0': { '1': 'a' } } - */ - function updateWith(object, path, updater, customizer) { - customizer = typeof customizer == 'function' ? customizer : undefined; - return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer); - } - - /** - * Creates an array of the own enumerable string keyed property values of `object`. - * - * **Note:** Non-object values are coerced to objects. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Object - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property values. - * @example - * - * function Foo() { - * this.a = 1; - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.values(new Foo); - * // => [1, 2] (iteration order is not guaranteed) - * - * _.values('hi'); - * // => ['h', 'i'] - */ - function values(object) { - return object == null ? [] : baseValues(object, keys(object)); - } - - /** - * Creates an array of the own and inherited enumerable string keyed property - * values of `object`. - * - * **Note:** Non-object values are coerced to objects. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Object - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property values. - * @example - * - * function Foo() { - * this.a = 1; - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.valuesIn(new Foo); - * // => [1, 2, 3] (iteration order is not guaranteed) - */ - function valuesIn(object) { - return object == null ? [] : baseValues(object, keysIn(object)); - } - - /*------------------------------------------------------------------------*/ - - /** - * Clamps `number` within the inclusive `lower` and `upper` bounds. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Number - * @param {number} number The number to clamp. - * @param {number} [lower] The lower bound. - * @param {number} upper The upper bound. - * @returns {number} Returns the clamped number. - * @example - * - * _.clamp(-10, -5, 5); - * // => -5 - * - * _.clamp(10, -5, 5); - * // => 5 - */ - function clamp(number, lower, upper) { - if (upper === undefined) { - upper = lower; - lower = undefined; - } - if (upper !== undefined) { - upper = toNumber(upper); - upper = upper === upper ? upper : 0; - } - if (lower !== undefined) { - lower = toNumber(lower); - lower = lower === lower ? lower : 0; - } - return baseClamp(toNumber(number), lower, upper); - } - - /** - * Checks if `n` is between `start` and up to, but not including, `end`. If - * `end` is not specified, it's set to `start` with `start` then set to `0`. - * If `start` is greater than `end` the params are swapped to support - * negative ranges. - * - * @static - * @memberOf _ - * @since 3.3.0 - * @category Number - * @param {number} number The number to check. - * @param {number} [start=0] The start of the range. - * @param {number} end The end of the range. - * @returns {boolean} Returns `true` if `number` is in the range, else `false`. - * @see _.range, _.rangeRight - * @example - * - * _.inRange(3, 2, 4); - * // => true - * - * _.inRange(4, 8); - * // => true - * - * _.inRange(4, 2); - * // => false - * - * _.inRange(2, 2); - * // => false - * - * _.inRange(1.2, 2); - * // => true - * - * _.inRange(5.2, 4); - * // => false - * - * _.inRange(-3, -2, -6); - * // => true - */ - function inRange(number, start, end) { - start = toFinite(start); - if (end === undefined) { - end = start; - start = 0; - } else { - end = toFinite(end); - } - number = toNumber(number); - return baseInRange(number, start, end); - } - - /** - * Produces a random number between the inclusive `lower` and `upper` bounds. - * If only one argument is provided a number between `0` and the given number - * is returned. If `floating` is `true`, or either `lower` or `upper` are - * floats, a floating-point number is returned instead of an integer. - * - * **Note:** JavaScript follows the IEEE-754 standard for resolving - * floating-point values which can produce unexpected results. - * - * @static - * @memberOf _ - * @since 0.7.0 - * @category Number - * @param {number} [lower=0] The lower bound. - * @param {number} [upper=1] The upper bound. - * @param {boolean} [floating] Specify returning a floating-point number. - * @returns {number} Returns the random number. - * @example - * - * _.random(0, 5); - * // => an integer between 0 and 5 - * - * _.random(5); - * // => also an integer between 0 and 5 - * - * _.random(5, true); - * // => a floating-point number between 0 and 5 - * - * _.random(1.2, 5.2); - * // => a floating-point number between 1.2 and 5.2 - */ - function random(lower, upper, floating) { - if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) { - upper = floating = undefined; - } - if (floating === undefined) { - if (typeof upper == 'boolean') { - floating = upper; - upper = undefined; - } - else if (typeof lower == 'boolean') { - floating = lower; - lower = undefined; - } - } - if (lower === undefined && upper === undefined) { - lower = 0; - upper = 1; - } - else { - lower = toFinite(lower); - if (upper === undefined) { - upper = lower; - lower = 0; - } else { - upper = toFinite(upper); - } - } - if (lower > upper) { - var temp = lower; - lower = upper; - upper = temp; - } - if (floating || lower % 1 || upper % 1) { - var rand = nativeRandom(); - return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper); - } - return baseRandom(lower, upper); - } - - /*------------------------------------------------------------------------*/ - - /** - * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase). - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category String - * @param {string} [string=''] The string to convert. - * @returns {string} Returns the camel cased string. - * @example - * - * _.camelCase('Foo Bar'); - * // => 'fooBar' - * - * _.camelCase('--foo-bar--'); - * // => 'fooBar' - * - * _.camelCase('__FOO_BAR__'); - * // => 'fooBar' - */ - var camelCase = createCompounder(function(result, word, index) { - word = word.toLowerCase(); - return result + (index ? capitalize(word) : word); - }); - - /** - * Converts the first character of `string` to upper case and the remaining - * to lower case. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category String - * @param {string} [string=''] The string to capitalize. - * @returns {string} Returns the capitalized string. - * @example - * - * _.capitalize('FRED'); - * // => 'Fred' - */ - function capitalize(string) { - return upperFirst(toString(string).toLowerCase()); - } - - /** - * Deburrs `string` by converting - * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table) - * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A) - * letters to basic Latin letters and removing - * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks). - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category String - * @param {string} [string=''] The string to deburr. - * @returns {string} Returns the deburred string. - * @example - * - * _.deburr('déjà vu'); - * // => 'deja vu' - */ - function deburr(string) { - string = toString(string); - return string && string.replace(reLatin, deburrLetter).replace(reComboMark, ''); - } - - /** - * Checks if `string` ends with the given target string. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category String - * @param {string} [string=''] The string to inspect. - * @param {string} [target] The string to search for. - * @param {number} [position=string.length] The position to search up to. - * @returns {boolean} Returns `true` if `string` ends with `target`, - * else `false`. - * @example - * - * _.endsWith('abc', 'c'); - * // => true - * - * _.endsWith('abc', 'b'); - * // => false - * - * _.endsWith('abc', 'b', 2); - * // => true - */ - function endsWith(string, target, position) { - string = toString(string); - target = baseToString(target); - - var length = string.length; - position = position === undefined - ? length - : baseClamp(toInteger(position), 0, length); - - var end = position; - position -= target.length; - return position >= 0 && string.slice(position, end) == target; - } - - /** - * Converts the characters "&", "<", ">", '"', and "'" in `string` to their - * corresponding HTML entities. - * - * **Note:** No other characters are escaped. To escape additional - * characters use a third-party library like [_he_](https://mths.be/he). - * - * Though the ">" character is escaped for symmetry, characters like - * ">" and "/" don't need escaping in HTML and have no special meaning - * unless they're part of a tag or unquoted attribute value. See - * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands) - * (under "semi-related fun fact") for more details. - * - * When working with HTML you should always - * [quote attribute values](http://wonko.com/post/html-escaping) to reduce - * XSS vectors. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category String - * @param {string} [string=''] The string to escape. - * @returns {string} Returns the escaped string. - * @example - * - * _.escape('fred, barney, & pebbles'); - * // => 'fred, barney, & pebbles' - */ - function escape(string) { - string = toString(string); - return (string && reHasUnescapedHtml.test(string)) - ? string.replace(reUnescapedHtml, escapeHtmlChar) - : string; - } - - /** - * Escapes the `RegExp` special characters "^", "$", "\", ".", "*", "+", - * "?", "(", ")", "[", "]", "{", "}", and "|" in `string`. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category String - * @param {string} [string=''] The string to escape. - * @returns {string} Returns the escaped string. - * @example - * - * _.escapeRegExp('[lodash](https://lodash.com/)'); - * // => '\[lodash\]\(https://lodash\.com/\)' - */ - function escapeRegExp(string) { - string = toString(string); - return (string && reHasRegExpChar.test(string)) - ? string.replace(reRegExpChar, '\\$&') - : string; - } - - /** - * Converts `string` to - * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles). - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category String - * @param {string} [string=''] The string to convert. - * @returns {string} Returns the kebab cased string. - * @example - * - * _.kebabCase('Foo Bar'); - * // => 'foo-bar' - * - * _.kebabCase('fooBar'); - * // => 'foo-bar' - * - * _.kebabCase('__FOO_BAR__'); - * // => 'foo-bar' - */ - var kebabCase = createCompounder(function(result, word, index) { - return result + (index ? '-' : '') + word.toLowerCase(); - }); - - /** - * Converts `string`, as space separated words, to lower case. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category String - * @param {string} [string=''] The string to convert. - * @returns {string} Returns the lower cased string. - * @example - * - * _.lowerCase('--Foo-Bar--'); - * // => 'foo bar' - * - * _.lowerCase('fooBar'); - * // => 'foo bar' - * - * _.lowerCase('__FOO_BAR__'); - * // => 'foo bar' - */ - var lowerCase = createCompounder(function(result, word, index) { - return result + (index ? ' ' : '') + word.toLowerCase(); - }); - - /** - * Converts the first character of `string` to lower case. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category String - * @param {string} [string=''] The string to convert. - * @returns {string} Returns the converted string. - * @example - * - * _.lowerFirst('Fred'); - * // => 'fred' - * - * _.lowerFirst('FRED'); - * // => 'fRED' - */ - var lowerFirst = createCaseFirst('toLowerCase'); - - /** - * Pads `string` on the left and right sides if it's shorter than `length`. - * Padding characters are truncated if they can't be evenly divided by `length`. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category String - * @param {string} [string=''] The string to pad. - * @param {number} [length=0] The padding length. - * @param {string} [chars=' '] The string used as padding. - * @returns {string} Returns the padded string. - * @example - * - * _.pad('abc', 8); - * // => ' abc ' - * - * _.pad('abc', 8, '_-'); - * // => '_-abc_-_' - * - * _.pad('abc', 3); - * // => 'abc' - */ - function pad(string, length, chars) { - string = toString(string); - length = toInteger(length); - - var strLength = length ? stringSize(string) : 0; - if (!length || strLength >= length) { - return string; - } - var mid = (length - strLength) / 2; - return ( - createPadding(nativeFloor(mid), chars) + - string + - createPadding(nativeCeil(mid), chars) - ); - } - - /** - * Pads `string` on the right side if it's shorter than `length`. Padding - * characters are truncated if they exceed `length`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category String - * @param {string} [string=''] The string to pad. - * @param {number} [length=0] The padding length. - * @param {string} [chars=' '] The string used as padding. - * @returns {string} Returns the padded string. - * @example - * - * _.padEnd('abc', 6); - * // => 'abc ' - * - * _.padEnd('abc', 6, '_-'); - * // => 'abc_-_' - * - * _.padEnd('abc', 3); - * // => 'abc' - */ - function padEnd(string, length, chars) { - string = toString(string); - length = toInteger(length); - - var strLength = length ? stringSize(string) : 0; - return (length && strLength < length) - ? (string + createPadding(length - strLength, chars)) - : string; - } - - /** - * Pads `string` on the left side if it's shorter than `length`. Padding - * characters are truncated if they exceed `length`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category String - * @param {string} [string=''] The string to pad. - * @param {number} [length=0] The padding length. - * @param {string} [chars=' '] The string used as padding. - * @returns {string} Returns the padded string. - * @example - * - * _.padStart('abc', 6); - * // => ' abc' - * - * _.padStart('abc', 6, '_-'); - * // => '_-_abc' - * - * _.padStart('abc', 3); - * // => 'abc' - */ - function padStart(string, length, chars) { - string = toString(string); - length = toInteger(length); - - var strLength = length ? stringSize(string) : 0; - return (length && strLength < length) - ? (createPadding(length - strLength, chars) + string) - : string; - } - - /** - * Converts `string` to an integer of the specified radix. If `radix` is - * `undefined` or `0`, a `radix` of `10` is used unless `value` is a - * hexadecimal, in which case a `radix` of `16` is used. - * - * **Note:** This method aligns with the - * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`. - * - * @static - * @memberOf _ - * @since 1.1.0 - * @category String - * @param {string} string The string to convert. - * @param {number} [radix=10] The radix to interpret `value` by. - * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. - * @returns {number} Returns the converted integer. - * @example - * - * _.parseInt('08'); - * // => 8 - * - * _.map(['6', '08', '10'], _.parseInt); - * // => [6, 8, 10] - */ - function parseInt(string, radix, guard) { - if (guard || radix == null) { - radix = 0; - } else if (radix) { - radix = +radix; - } - return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0); - } - - /** - * Repeats the given string `n` times. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category String - * @param {string} [string=''] The string to repeat. - * @param {number} [n=1] The number of times to repeat the string. - * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. - * @returns {string} Returns the repeated string. - * @example - * - * _.repeat('*', 3); - * // => '***' - * - * _.repeat('abc', 2); - * // => 'abcabc' - * - * _.repeat('abc', 0); - * // => '' - */ - function repeat(string, n, guard) { - if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) { - n = 1; - } else { - n = toInteger(n); - } - return baseRepeat(toString(string), n); - } - - /** - * Replaces matches for `pattern` in `string` with `replacement`. - * - * **Note:** This method is based on - * [`String#replace`](https://mdn.io/String/replace). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category String - * @param {string} [string=''] The string to modify. - * @param {RegExp|string} pattern The pattern to replace. - * @param {Function|string} replacement The match replacement. - * @returns {string} Returns the modified string. - * @example - * - * _.replace('Hi Fred', 'Fred', 'Barney'); - * // => 'Hi Barney' - */ - function replace() { - var args = arguments, - string = toString(args[0]); - - return args.length < 3 ? string : string.replace(args[1], args[2]); - } - - /** - * Converts `string` to - * [snake case](https://en.wikipedia.org/wiki/Snake_case). - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category String - * @param {string} [string=''] The string to convert. - * @returns {string} Returns the snake cased string. - * @example - * - * _.snakeCase('Foo Bar'); - * // => 'foo_bar' - * - * _.snakeCase('fooBar'); - * // => 'foo_bar' - * - * _.snakeCase('--FOO-BAR--'); - * // => 'foo_bar' - */ - var snakeCase = createCompounder(function(result, word, index) { - return result + (index ? '_' : '') + word.toLowerCase(); - }); - - /** - * Splits `string` by `separator`. - * - * **Note:** This method is based on - * [`String#split`](https://mdn.io/String/split). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category String - * @param {string} [string=''] The string to split. - * @param {RegExp|string} separator The separator pattern to split by. - * @param {number} [limit] The length to truncate results to. - * @returns {Array} Returns the string segments. - * @example - * - * _.split('a-b-c', '-', 2); - * // => ['a', 'b'] - */ - function split(string, separator, limit) { - if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) { - separator = limit = undefined; - } - limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0; - if (!limit) { - return []; - } - string = toString(string); - if (string && ( - typeof separator == 'string' || - (separator != null && !isRegExp(separator)) - )) { - separator = baseToString(separator); - if (!separator && hasUnicode(string)) { - return castSlice(stringToArray(string), 0, limit); - } - } - return string.split(separator, limit); - } - - /** - * Converts `string` to - * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage). - * - * @static - * @memberOf _ - * @since 3.1.0 - * @category String - * @param {string} [string=''] The string to convert. - * @returns {string} Returns the start cased string. - * @example - * - * _.startCase('--foo-bar--'); - * // => 'Foo Bar' - * - * _.startCase('fooBar'); - * // => 'Foo Bar' - * - * _.startCase('__FOO_BAR__'); - * // => 'FOO BAR' - */ - var startCase = createCompounder(function(result, word, index) { - return result + (index ? ' ' : '') + upperFirst(word); - }); - - /** - * Checks if `string` starts with the given target string. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category String - * @param {string} [string=''] The string to inspect. - * @param {string} [target] The string to search for. - * @param {number} [position=0] The position to search from. - * @returns {boolean} Returns `true` if `string` starts with `target`, - * else `false`. - * @example - * - * _.startsWith('abc', 'a'); - * // => true - * - * _.startsWith('abc', 'b'); - * // => false - * - * _.startsWith('abc', 'b', 1); - * // => true - */ - function startsWith(string, target, position) { - string = toString(string); - position = position == null - ? 0 - : baseClamp(toInteger(position), 0, string.length); - - target = baseToString(target); - return string.slice(position, position + target.length) == target; - } - - /** - * Creates a compiled template function that can interpolate data properties - * in "interpolate" delimiters, HTML-escape interpolated data properties in - * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data - * properties may be accessed as free variables in the template. If a setting - * object is given, it takes precedence over `_.templateSettings` values. - * - * **Note:** In the development build `_.template` utilizes - * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl) - * for easier debugging. - * - * For more information on precompiling templates see - * [lodash's custom builds documentation](https://lodash.com/custom-builds). - * - * For more information on Chrome extension sandboxes see - * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval). - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category String - * @param {string} [string=''] The template string. - * @param {Object} [options={}] The options object. - * @param {RegExp} [options.escape=_.templateSettings.escape] - * The HTML "escape" delimiter. - * @param {RegExp} [options.evaluate=_.templateSettings.evaluate] - * The "evaluate" delimiter. - * @param {Object} [options.imports=_.templateSettings.imports] - * An object to import into the template as free variables. - * @param {RegExp} [options.interpolate=_.templateSettings.interpolate] - * The "interpolate" delimiter. - * @param {string} [options.sourceURL='lodash.templateSources[n]'] - * The sourceURL of the compiled template. - * @param {string} [options.variable='obj'] - * The data object variable name. - * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. - * @returns {Function} Returns the compiled template function. - * @example - * - * // Use the "interpolate" delimiter to create a compiled template. - * var compiled = _.template('hello <%= user %>!'); - * compiled({ 'user': 'fred' }); - * // => 'hello fred!' - * - * // Use the HTML "escape" delimiter to escape data property values. - * var compiled = _.template('<%- value %>'); - * compiled({ 'value': ' - - - -
- -

- Select Your Existing Gist -

-
-
-
- - - - - - - - - - - diff --git a/src/ui/gist-selection/gist-selection.js b/src/ui/gist-selection/gist-selection.js deleted file mode 100644 index 22d30af2..00000000 --- a/src/ui/gist-selection/gist-selection.js +++ /dev/null @@ -1,89 +0,0 @@ -//import { debug } from "vscode"; - -// @ts-nocheck -function appendHTML(parent, html) { - var div = document.createElement("div"); - div.innerHTML = html; - while (div.children.length > 0) { - parent.appendChild(div.children[0]); - } - div.remove(); -} - -const vscode = acquireVsCodeApi(); -/* https://stackoverflow.com/questions/3177836/how-to-format-time-since-xxx-e-g-4-minutes-ago-similar-to-stack-exchange-site */ -function timeSince(date) { - var seconds = Math.floor((new Date() - date) / 1000); - - var interval = Math.floor(seconds / 31536000); - - if (interval > 1) { - return interval + " years"; - } - interval = Math.floor(seconds / 2592000); - if (interval > 1) { - return interval + " months"; - } - interval = Math.floor(seconds / 86400); - if (interval > 1) { - return interval + " days"; - } - interval = Math.floor(seconds / 3600); - if (interval > 1) { - return interval + " hours"; - } - interval = Math.floor(seconds / 60); - if (interval > 1) { - return interval + " minutes"; - } - return Math.floor(seconds) + " seconds"; -} - -function appendHTML(parent, html) { - var div = document.createElement("div"); - div.innerHTML = html; - while (div.children.length > 0) { - parent.appendChild(div.children[0]); - } - div.remove(); -} - -function saveGistId(id) { - vscode.postMessage({ id }); - $("#modal").modal(); -} - -const selectionContainer = document.querySelector("#selectionContainer"); - -document - .querySelector(".modal-content") - .classList.add( - document.body.className.includes("vscode-dark") ? "bg-dark" : "bg-light" - ); - -const skipContainer = document.querySelector("#skipContainer"); -appendHTML(skipContainer, skip); - -const selectionTemplate = ` -`; - -if (!gists.length) { - appendHTML( - selectionContainer, - "

No Gists found on your account. Skip this window and upload the settings to create a new Gist.

" - ); -} else { - gists - .sort((a, b) => new Date(b.updated_at) - new Date(a.updated_at)) - .forEach(gist => { - const html = selectionTemplate - .replace(new RegExp("@description", "g"), gist.description) - .replace(new RegExp("@id", "g"), gist.id) - .replace( - new RegExp("@timestamp", "g"), - timeSince(new Date(gist.updated_at)) - ); - appendHTML(selectionContainer, html); - }); -} - diff --git a/src/ui/landing-page/landing-page.html b/src/ui/landing-page/landing-page.html deleted file mode 100644 index d7d5ec88..00000000 --- a/src/ui/landing-page/landing-page.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - - - - - - - - -
-
-

- What's New in - - vX.X.X - - -

-
-
-
-

- Configuration -

-

- Login via GitHub to setup Settings Sync, or configure the settings - manually. -

- - -
-
-

- Show Your Support -

-

- While being free and open source, if you find - Settings Sync - useful, please consider supporting it by donating via PayPal or Open - Collective. -

- - -
-
-
- -
-
- - -
-
- - - - - - - diff --git a/src/ui/landing-page/landing-page.js b/src/ui/landing-page/landing-page.js deleted file mode 100644 index 52c23d2d..00000000 --- a/src/ui/landing-page/landing-page.js +++ /dev/null @@ -1,40 +0,0 @@ -// @ts-nocheck -const vscode = acquireVsCodeApi(); - -function sendCommand(command, data) { - vscode.postMessage({ - command, - data - }); -} - -function appendHTML(parent, html) { - var div = document.createElement("div"); - div.innerHTML = html; - while (div.children.length > 0) { - parent.appendChild(div.children[0]); - } - div.remove(); -} - -const releaseNoteTemplate = `
@TYPE@NOTE @EXTRA
`; - -const notesElement = document.querySelector("#notes"); -releaseNotes.changes.forEach(change => { - const html = releaseNoteTemplate - .replace(new RegExp("@NOTE", "g"), change.details) - .replace(new RegExp("@TYPE", "g"), change.type) - .replace(new RegExp("@COLOR", "g"), change.color) - .replace( - new RegExp("@EXTRA", "g"), - change.author && change.pullRequest - ? `(Thanks to @${change.author} for PR #${change.pullRequest})` - : "" - ); - appendHTML(notesElement, html); -}); - -const currentVersionElement = document.querySelector("#current-version"); -currentVersionElement.innerHTML = releaseNotes.currentVersion; - -document.querySelector("#customCheck1").checked = checked === "true"; diff --git a/src/ui/settings/settings.html b/src/ui/settings/settings.html deleted file mode 100644 index 5697b2b3..00000000 --- a/src/ui/settings/settings.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - - - - - - -
-
-

- Environment Settings -

-
-

-
-
-

- Global Settings -

-
-
-
- - - - - - - - - - - diff --git a/src/ui/settings/settings.js b/src/ui/settings/settings.js deleted file mode 100644 index 17e5d4c1..00000000 --- a/src/ui/settings/settings.js +++ /dev/null @@ -1,269 +0,0 @@ -// @ts-nocheck - -function appendHTML(parent, html) { - var div = document.createElement("div"); - div.innerHTML = html; - while (div.children.length > 0) { - parent.appendChild(div.children[0]); - } - div.remove(); -} - -const vscode = acquireVsCodeApi(); - -const textInputTemplate = `
- - @tooltip - -
`; - -const textInputGroupTemplate = `
- - @tooltip -
- -
- -
-
-
`; - -const numberInputTemplate = `
- - @tooltip - -
`; - -const checkboxTemplate = `
- - - @tooltip -
`; - -const textareaTemplate = `
- - @tooltip - -
`; - -const globalParent = document.getElementById("globalSettings"); -const envParent = document.getElementById("environmentSettings"); -const saveStatus = document.getElementById("saveStatus"); - -globalMap.forEach(settingMap => { - let template; - switch (settingMap.type) { - case "textinput": - template = textInputTemplate; - break; - case "numberinput": - template = numberInputTemplate; - break; - case "checkbox": - template = checkboxTemplate; - break; - case "textarea": - template = textareaTemplate; - break; - } - const html = template - .replace(new RegExp("@name", "g"), settingMap.name) - .replace(new RegExp("@placeholder", "g"), settingMap.placeholder) - .replace( - new RegExp("@correspondingSetting", "g"), - settingMap.correspondingSetting - ) - .replace(new RegExp("@tooltip"), "") - .replace(new RegExp("@settingType", "g"), "global"); - appendHTML(globalParent, html); -}); - -envMap.forEach(envMap => { - let template; - switch (envMap.type) { - case "textinput": - template = textInputTemplate; - break; - case "numberinput": - template = textInputTemplate; - break; - case "checkbox": - template = checkboxTemplate; - break; - } - const isInputGroup = envMap.correspondingSetting === "gist"; - let disabledStatus = ""; - if (isInputGroup) { - template = textInputGroupTemplate; - if (!_.get(envData, "gist") || !_.get(globalData, "token")) { - disabledStatus = "disabled"; - } - } - const html = template - .replace(new RegExp("@name", "g"), envMap.name) - .replace(new RegExp("@placeholder", "g"), envMap.placeholder) - .replace( - new RegExp("@correspondingSetting", "g"), - envMap.correspondingSetting - ) - .replace( - new RegExp("@tooltip"), - ` - - - ` - ) - .replace(new RegExp("@settingType", "g"), "env") - .replace( - new RegExp("@action", "g"), - `inputGroupAction('${envMap.correspondingSetting}')` - ) - .replace(new RegExp("@disabled", "g"), disabledStatus); - appendHTML(envParent, html); -}); - -$(document).ready(function() { - save(); - $('[data-toggle="tooltip"]').tooltip({ container: "html" }); - $(".text") - .each((i, el) => { - if ($(el).attr("settingType") === "global") { - $(el).val(_.get(globalData, $(el).attr("setting"))); - } else { - $(el).val(envData[$(el).attr("setting")]); - } - }) - .change(function() { - save(); - let val = $(this).val(); - vscode.postMessage({ - command: $(this).attr("setting"), - text: val, - type: $(this).attr("settingType") - }); - }); - $(".number") - .each((i, el) => { - if ($(el).attr("settingType") === "global") { - $(el).val(_.get(globalData, $(el).attr("setting"))); - } else { - $(el).val(envData[$(el).attr("setting")]); - } - }) - .change(function() { - save(); - let val = Number($(this).val()); - vscode.postMessage({ - command: $(this).attr("setting"), - text: val, - type: $(this).attr("settingType") - }); - }); - $(".checkbox") - .each((i, el) => { - if ($(el).attr("settingType") === "global") { - $(el).prop("checked", _.get(globalData, $(el).attr("setting"))); - } else { - $(el).prop("checked", envData[$(el).attr("setting")]); - } - }) - .change(function() { - save(); - let val = $(this).is(":checked"); - vscode.postMessage({ - command: $(this).attr("setting"), - text: val, - type: $(this).attr("settingType") - }); - }); - $(".textarea") - .each((i, el) => { - let str = ""; - const items = _.get(globalData, $(el).attr("setting")); - items.forEach(item => (str += item + "\n")); - $(el).val(str.slice(0, -1)); - $(el).prop("rows", items.length); - }) - .change(function() { - save(); - let val = []; - $(this) - .val() - .split("\n") - .forEach(item => { - if (item !== "") { - val.push(item); - } - }); - vscode.postMessage({ - command: $(this).attr("setting"), - text: val, - type: "global" - }); - }); -}); - -function save() { - saveStatus.innerHTML = ``; - setTimeout( - () => - (saveStatus.innerHTML = ``), - 1000 - ); -} - -function inputGroupAction(setting) { - if (setting === "gist") { - vscode.postMessage("openGist"); - } -} diff --git a/src/ui/shared/fonts.js b/src/ui/shared/fonts.js deleted file mode 100644 index c8341802..00000000 --- a/src/ui/shared/fonts.js +++ /dev/null @@ -1,19 +0,0 @@ -// @ts-nocheck - -document.querySelector("font-injector").innerHTML = ``; diff --git a/src/ui/shared/page-header.js b/src/ui/shared/page-header.js deleted file mode 100644 index a27dd99e..00000000 --- a/src/ui/shared/page-header.js +++ /dev/null @@ -1,18 +0,0 @@ -// @ts-nocheck - -document.querySelector("page-header").innerHTML = ` -

- -Settings Sync -

-

-Synchronize settings, snippets, themes, icons, launch, -keybindings, workspaces and extensions across machines -using GitHub Gist. -

-
`; diff --git a/src/ui/shared/styles.css b/src/ui/shared/styles.css deleted file mode 100644 index cea26430..00000000 --- a/src/ui/shared/styles.css +++ /dev/null @@ -1,199 +0,0 @@ -html, -body { - height: 100%; - width: 100%; - display: flex; - flex-direction: column; - font-family: "Roboto", sans-serif; - letter-spacing: 0.0625em; -} - -body.vscode-dark { - background-color: #1b1b1b; - color: #e9e9e9; -} - -body.vscode-light { - background-color: #fff; - color: #1b1b1b; -} - -.vscode-light .logo { - -webkit-filter: invert(1) opacity(0.5); - filter: invert(1) opacity(0.5); -} - -.tooltip { - display: block; -} - -.content-row { - flex-grow: 1; - overflow-y: hidden; - padding-bottom: 1rem; -} - -.modal-header { - border-bottom: none; -} - -.modal-footer { - border-top: none; -} - -.modal-body { - padding: 0rem 1rem; -} - -.footer > .col-one { - padding-left: 0; -} - -.footer > .col-two { - padding-right: 0; -} - -.footer { - margin: 0; -} - -.scrollable { - overflow-y: auto; -} - -.content { - background-color: burlywood; - overflow: scroll; -} - -:root { - --btn: #0e629c; - --btn-hover: #15496e; - --btn-click: #0e3450; - --link: dodgerblue; - --link-hover: rgb(15, 109, 204); -} - -.dock-bottom-left { - position: fixed; - bottom: 4rem; - left: 4rem; -} - -.dock-bottom-right { - position: fixed; - bottom: 1rem; - right: 1rem; - background-color: rgb(42, 42, 42); - border-radius: 1.5rem; - padding-left: 1rem; - padding-right: 1rem; - padding-top: 0.5rem; - padding-bottom: 0.5rem; -} - -.logo { - padding-right: 0.5rem; - filter: opacity(0.5); -} - -.change { - line-height: 150%; -} - -.badge-success { - color: #fff; - background-color: #73c991; -} - -.badge-danger { - color: #fff; - background-color: #ce4f59; -} - -.badge { - vertical-align: 2px; - line-height: 120%; - width: 6rem; -} - -body { - position: relative; - min-height: 35rem; - background-position: center; - background-repeat: no-repeat; - background-attachment: scroll; - background-size: cover; - margin-top: 40px; - margin-bottom: 40px; -} - -body h1 { - font-size: 3.5rem; - line-height: 2.5rem; - font-weight: bold; - color: #808080 !important; - font-family: "Open Sans"; - display: flex; - align-items: center; /* align vertical */ - justify-content: center; /* align horizontal */ -} - -body h2 { - /* max-width: 20rem; */ - font-size: 1rem; -} - -body h3 { - /* max-width: 20rem; */ - font-size: 1.5rem; -} - -.btn { - -webkit-box-shadow: 0 0.1875rem 0.1875rem 0 rgba(0, 0, 0, 0.1) !important; - box-shadow: 0 0.1875rem 0.1875rem 0 rgba(0, 0, 0, 0.1) !important; - padding: 1rem; - font-size: 80%; - text-transform: uppercase; - letter-spacing: 0.15rem; - border: 0; - width: 100%; - height: 100%; - display: flex; - justify-content: center; /* align horizontal */ - align-items: center; /* align vertical */ -} - -.btn-primary { - color: #fff !important; -} - -.btn-primary, -.btn-primary:focus { - background-color: var(--btn) !important; -} - -.btn-primary:hover, -.btn-primary:active { - background-color: var(--btn-hover) !important; -} - -.text, -.textarea, -.number { - -webkit-box-shadow: 0 0.1875rem 0.1875rem 0 rgba(0, 0, 0, 0.1) !important; - box-shadow: 0 0.1875rem 0.1875rem 0 rgba(0, 0, 0, 0.1) !important; - padding: 1.25rem 2rem; - height: auto; - border: 0; -} - -a { - color: var(--link); -} - -a:focus, -a:hover { - text-decoration: none; - color: var(--link-hover); -} diff --git a/src/ui/shared/vendor/bootstrap/css/bootstrap.min.css b/src/ui/shared/vendor/bootstrap/css/bootstrap.min.css deleted file mode 100644 index 92e3fe87..00000000 --- a/src/ui/shared/vendor/bootstrap/css/bootstrap.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v4.3.1 (https://getbootstrap.com/) - * Copyright 2011-2019 The Bootstrap Authors - * Copyright 2011-2019 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[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}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.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-repeat:no-repeat;background-position:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.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") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip{display:block}.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E");background-repeat:no-repeat;background-position:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip{display:block}.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn: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){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:no-repeat 50%/50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:calc(1rem + .4rem);padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-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-top-left-radius:0;border-bottom-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}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion>.card{overflow:hidden}.accordion>.card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion>.card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion>.card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.accordion>.card .card-header{margin-bottom:-1px}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;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){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}@media (min-width:576px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-sm .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-md .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:992px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-lg .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:1200px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-xl .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush .list-group-item:last-child{margin-bottom:-1px}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{margin-bottom:0;border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);content:""}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #dee2e6;border-bottom-right-radius:.3rem;border-bottom-left-radius:.3rem}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:0s .6s opacity}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@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;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50%/100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!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}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;overflow-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}} -/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/src/ui/shared/vendor/bootstrap/js/bootstrap.min.js b/src/ui/shared/vendor/bootstrap/js/bootstrap.min.js deleted file mode 100644 index c4c0d1f9..00000000 --- a/src/ui/shared/vendor/bootstrap/js/bootstrap.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v4.3.1 (https://getbootstrap.com/) - * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e((t=t||self).bootstrap={},t.jQuery,t.Popper)}(this,function(t,g,u){"use strict";function i(t,e){for(var n=0;nthis._items.length-1||t<0))if(this._isSliding)g(this._element).one(Q.SLID,function(){return e.to(t)});else{if(n===t)return this.pause(),void this.cycle();var i=ndocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},t._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},t._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:Ee},je="show",He="out",Re={HIDE:"hide"+De,HIDDEN:"hidden"+De,SHOW:"show"+De,SHOWN:"shown"+De,INSERTED:"inserted"+De,CLICK:"click"+De,FOCUSIN:"focusin"+De,FOCUSOUT:"focusout"+De,MOUSEENTER:"mouseenter"+De,MOUSELEAVE:"mouseleave"+De},xe="fade",Fe="show",Ue=".tooltip-inner",We=".arrow",qe="hover",Me="focus",Ke="click",Qe="manual",Be=function(){function i(t,e){if("undefined"==typeof u)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var t=i.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=g(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(g(this.getTipElement()).hasClass(Fe))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),g.removeData(this.element,this.constructor.DATA_KEY),g(this.element).off(this.constructor.EVENT_KEY),g(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&g(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if("none"===g(this.element).css("display"))throw new Error("Please use show on visible elements");var t=g.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){g(this.element).trigger(t);var n=_.findShadowRoot(this.element),i=g.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=_.getUID(this.constructor.NAME);o.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&g(o).addClass(xe);var s="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();g(o).data(this.constructor.DATA_KEY,this),g.contains(this.element.ownerDocument.documentElement,this.tip)||g(o).appendTo(l),g(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new u(this.element,o,{placement:a,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:We},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}}),g(o).addClass(Fe),"ontouchstart"in document.documentElement&&g(document.body).children().on("mouseover",null,g.noop);var c=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,g(e.element).trigger(e.constructor.Event.SHOWN),t===He&&e._leave(null,e)};if(g(this.tip).hasClass(xe)){var h=_.getTransitionDurationFromElement(this.tip);g(this.tip).one(_.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},t.hide=function(t){var e=this,n=this.getTipElement(),i=g.Event(this.constructor.Event.HIDE),o=function(){e._hoverState!==je&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),g(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(g(this.element).trigger(i),!i.isDefaultPrevented()){if(g(n).removeClass(Fe),"ontouchstart"in document.documentElement&&g(document.body).children().off("mouseover",null,g.noop),this._activeTrigger[Ke]=!1,this._activeTrigger[Me]=!1,this._activeTrigger[qe]=!1,g(this.tip).hasClass(xe)){var r=_.getTransitionDurationFromElement(n);g(n).one(_.TRANSITION_END,o).emulateTransitionEnd(r)}else o();this._hoverState=""}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(t){g(this.getTipElement()).addClass(Ae+"-"+t)},t.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},t.setContent=function(){var t=this.getTipElement();this.setElementContent(g(t.querySelectorAll(Ue)),this.getTitle()),g(t).removeClass(xe+" "+Fe)},t.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=Se(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?g(e).parent().is(t)||t.empty().append(e):t.text(g(e).text())},t.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},t._getOffset=function(){var e=this,t={};return"function"==typeof this.config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,e.config.offset(t.offsets,e.element)||{}),t}:t.offset=this.config.offset,t},t._getContainer=function(){return!1===this.config.container?document.body:_.isElement(this.config.container)?g(this.config.container):g(document).find(this.config.container)},t._getAttachment=function(t){return Pe[t.toUpperCase()]},t._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(t){if("click"===t)g(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(t){return i.toggle(t)});else if(t!==Qe){var e=t===qe?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=t===qe?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;g(i.element).on(e,i.config.selector,function(t){return i._enter(t)}).on(n,i.config.selector,function(t){return i._leave(t)})}}),g(this.element).closest(".modal").on("hide.bs.modal",function(){i.element&&i.hide()}),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},t._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},t._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Me:qe]=!0),g(e.getTipElement()).hasClass(Fe)||e._hoverState===je?e._hoverState=je:(clearTimeout(e._timeout),e._hoverState=je,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===je&&e.show()},e.config.delay.show):e.show())},t._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Me:qe]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=He,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){e._hoverState===He&&e.hide()},e.config.delay.hide):e.hide())},t._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},t._getConfig=function(t){var e=g(this.element).data();return Object.keys(e).forEach(function(t){-1!==Oe.indexOf(t)&&delete e[t]}),"number"==typeof(t=l({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),_.typeCheckConfig(be,t,this.constructor.DefaultType),t.sanitize&&(t.template=Se(t.template,t.whiteList,t.sanitizeFn)),t},t._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},t._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Ne);null!==e&&e.length&&t.removeClass(e.join(""))},t._handlePopperPlacementChange=function(t){var e=t.instance;this.tip=e.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},t._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(g(t).removeClass(xe),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},i._jQueryInterface=function(n){return this.each(function(){var t=g(this).data(Ie),e="object"==typeof n&&n;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),g(this).data(Ie,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return Le}},{key:"NAME",get:function(){return be}},{key:"DATA_KEY",get:function(){return Ie}},{key:"Event",get:function(){return Re}},{key:"EVENT_KEY",get:function(){return De}},{key:"DefaultType",get:function(){return ke}}]),i}();g.fn[be]=Be._jQueryInterface,g.fn[be].Constructor=Be,g.fn[be].noConflict=function(){return g.fn[be]=we,Be._jQueryInterface};var Ve="popover",Ye="bs.popover",ze="."+Ye,Xe=g.fn[Ve],$e="bs-popover",Ge=new RegExp("(^|\\s)"+$e+"\\S+","g"),Je=l({},Be.Default,{placement:"right",trigger:"click",content:"",template:''}),Ze=l({},Be.DefaultType,{content:"(string|element|function)"}),tn="fade",en="show",nn=".popover-header",on=".popover-body",rn={HIDE:"hide"+ze,HIDDEN:"hidden"+ze,SHOW:"show"+ze,SHOWN:"shown"+ze,INSERTED:"inserted"+ze,CLICK:"click"+ze,FOCUSIN:"focusin"+ze,FOCUSOUT:"focusout"+ze,MOUSEENTER:"mouseenter"+ze,MOUSELEAVE:"mouseleave"+ze},sn=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),(e.prototype.constructor=e).__proto__=n;var o=i.prototype;return o.isWithContent=function(){return this.getTitle()||this._getContent()},o.addAttachmentClass=function(t){g(this.getTipElement()).addClass($e+"-"+t)},o.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},o.setContent=function(){var t=g(this.getTipElement());this.setElementContent(t.find(nn),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(on),e),t.removeClass(tn+" "+en)},o._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},o._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Ge);null!==e&&0=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||tli{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:fa-spin 2s infinite linear}.fa-pulse{animation:fa-spin 1s infinite steps(8)}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-wizard:before{content:"\f6e8"}.fa-haykal:before{content:"\f666"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto} \ No newline at end of file diff --git a/src/ui/shared/vendor/fontawesome/css/solid.min.css b/src/ui/shared/vendor/fontawesome/css/solid.min.css deleted file mode 100644 index a0d56287..00000000 --- a/src/ui/shared/vendor/fontawesome/css/solid.min.css +++ /dev/null @@ -1,5 +0,0 @@ -/*! - * Font Awesome Free 5.9.0 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - */ -@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:auto;src:url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa,.fas{font-family:"Font Awesome 5 Free";font-weight:900} \ No newline at end of file diff --git a/src/ui/shared/vendor/fontawesome/webfonts/fa-solid-900.ttf b/src/ui/shared/vendor/fontawesome/webfonts/fa-solid-900.ttf deleted file mode 100644 index c6c3dd4d40e6935dbda5f4fc671956c41b768a09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191832 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 JlKu;TE2wOj%Q1qdB^k`WJpqvW9V}9KNYfOicm{ zjC>D}{;{Zt9lCZLgume;U-$&)uEtP5a5xvQ02nPd%wp-9mW~URl%Ncb2xpJQPj>0!d9(qUp{B-sImmoMR89%jsw( zg>ZseG8}?4it8&_{mX0tecC|0^D)dA-hTk0@YqYC*Wx^8v#?1d{xZPIY5~0t9;B%2 za1!P~H&r)Q;KoU~{G*YaxQ?+;hCu^}JfOTPrxNk78ByRu2`vn+H6xwBj4)qBP6ieN z$+dz7JF+Sc26+7}c7UW&J#NF$sYO$ircrar}%>A^^W#p7`zyuh~roZ>NUuvOHcd(}{FfbYoJy#h-$L4?}_pL&d| zXZ`nTHJ=PS_Gg4gU{@dZo$@{Cd(8Li&`ChURL^?BVUBx7j7@NNa$5%3IpF*RiZRds zB>OVmS%o))%VJ287TTNLg%6akx!?qyubKYM3p2syo)i28;C-OZ%GAG4k8706p)6gB5WIg z#31(!DON+t8C8wS1;MY4j2+Yx$VpegJCM9Ux01WZM{yReu2u3Zeu%K)Q}IeuFj)-< zde2>nUCcVD#Oiuh?HPxufH>w9s2^E_F~QQ&3ANyS+sbNpbspk&;0N|se)EI-k9~q4 zkd0*yRK&9gL*M|dc`zIU07usp-0qr(J-@F&v@i%u)|sAVvMVRoyDWrgiA$d=kcFUYTMVOf(oe;}L=>XRx-C!Q;=>$W2s zBkWyRIj(`n#UW}EP{%TGbC=!SFDc4PL<6zPD3sSW#P6(J!3{rFlmnt9&p6f`fHr54 zppLnt(%eBFz#@K?vNotf`i;Ieo`9@^U_3=^h(9$*+=PZhl~(D>L{UY;TYO56!8|-T zNj!Bu@OH7Jz0_aV%@CVHx+p&*c;~xw&Mn?t4*z+$oG$0{*tkvjaI2bDWu4`qcA>(k zA6eys7Cg_T(ED9kbcxHZG(36$(5c+pO8_A&UxVgMc}p-K+@fni3Ic8gwOjd(kN17H z)Bi=?wX_5oh{j<6lK2+j)cDFPIJ(@|)`Zb_<&;wO>^I%{yWR`pZ92dL=bo3Ch?eit zI@4Uok#$NX!r4JFM7QC0FCYVLpvZUT5WL>f5V*~MpD z)tz*hXmAz7&_o-Wg?%SX)BH!&%=|~}{C?jhzQe)#|7Ir4_u(aQ7KiKJM~7@w$tbrA z!tJyJG{aU$JaoCN40lj#b`~t47F?X=}8vod98TcJGrKkznCdJ|uz!yk z{*h!U$?{+rVNv|H;aKCQ5H@dyDU&59@D}`4i2fwEY}Pj2WQ^GMrg%7+^g-tL`W*8C z65L8}ayishtnr-W*rb&YfwOPRzL+Ww=Q`(d!^Ko~I2VWkcBe2NH00W>qNK~QKyLV; zR7>ZEhjZzg6f5S2oou>1UPwlT*;+7EPG_CrT+!=4JO^QlkQEuH0KklXSusy^(N@YJ zN1p2q@PIsyk8e6W*kdpI-sc=gzuBl5H|x#&Pk{3lqH{{?ZXmT$PBpCKxMHKTWLGc)$TaUrIlm}SlV~_Qn zhBztqE}R9F@GR)=!FSVmy!#-i@hp^<0|)xfqqv2*a>erjx%4Q@^YC{exA5h@dwdV$ zC05Izb*C>#%1t|1377(01#v^}GxZ zaRNf_>W{D`eA^Oz8^d>YsQwXdfgR%Qw29E+J$(Mp#tVhF-iS^7#%r8=%~d{2^UUD$ zeRY2x_1%VCkk|X(%6pV-&0R`fr(Rp>LuA6dz$4Gzw(5IUdY``Mg&k23BWK1(FyRF{U$5AVc zMkt>y&+)tIN+v;{OVH%}nf1wS1Tb(l<#vD^^Msi^ujTc_|z|eP5}RvhzvQaS++bW3Lxbf6dMaEIbPT z^m|QPLBh@9TecjWK@34Q`mV>^3!;Wu|)^qy}BAy27rrdePU>L!M~+F^zmp;On%tCAcxY5 zb0Iid&BTXm2Nl_mxM30D4uBo%_Z3ov%_fS_LtL>4yDjd5at5OUtO<1_b#ymf{>g8M zB20ycfOH*l-91}?#uV|lLIaMz^JP2rT)CAg(LY|PuVrVQxAW!gE^>Fvd}bmNvZPA1 zoK{BHt{v5<@)cupfd2AapN-%`Wtrc7vTuty;o7TdEfSv0o3Q?teLn;>?s9oIhN8%G zQ$Y1eb@6H&c>)1gDcxJ9-~>*ZiDf9ThjOU}_Sh~9sZ_n-C=`3>e$fn~wzy9Y#S^;y z6N_`#LJ&G^x06ua4HSX0BL5G6vFoP_1*#LN%C^|n*tUJ!Vj)^aHsDMh>mKM@hxbsW zgGcIz*aYzr*v7EqAs=Extnbea{4t4q+Mmw1m*kZ7hxv=#b44D)2062RZ6 z<{#b&(mT8Z+}PQ?TudN5Fm8aOWCYTVA?w$HmA1l{$V7wK3WPF|?Dw8<`0d;y{uuFy zPMfyh&~#x25L+pjY|+rQkSS_AVKez07dK6lguWmUAR&96Z!~P~BL5S7dYL}Wz%@`T zNP8Ebjqd`ES~TjnF*kL!Bmw76QFMAG^7*$wA9#*MZ;X1&y0?}|`scDK*fa7k;{;^Q zIEH6CVC0QJn>++-%6snIQ{FL}%7uZrw!|+yLl>Um&Gn5f2M=y(tUo`PORSBUg_?~x zVOJ;NHJ4(%(vq(X|HW0RD7k5&z1+_prd5yAqeFWYmX?6s)n7fSa{#!pnN zZ=CEB;>2+0kq5S##*AU?GnVqWKH+4u&P3LkWbJ%@IguEyWSw((W17CG!|OdWMV;?} zUFas?D}47sDtprRPTvQ7AH71_^;iLs=M@EUrPXhH#qx!?)is=~w0U1#<$VABFXSG` z-B$<2-NfprK18*D?c-(m&I zgeAqGHZ`W#3y|KxT*;T#TLA$94keg}xdXLIv2$c8_LfY8YBAnETi>!zL&{@TS<4df zEYR*kQ;MEvGCW5}o#cR1wu)-^rr=#tR$pO@NZ)trnkY)nRBY{@8$KbF6QLv!(o`T( z;X6!G7kIWtn1wU;Rj=?hzbtIUyN2NjJB_#JmN55SXSiNGCAzkIjzlf+cjh+L7X(EO zlNnssyz@}5jYAbwN%O|T->{)RGNuW!K;^+_Pr}d^g@B;EDAx%i4 zD=5=9 zDJm+>VatCZ#(t_Ah8ogJKvM*GXF&FkuLl}e4tA#X;{fB8Vv=l?v{3IZoVeCaUy_2> zNbXoUH(~|vj4CZr-={<;b#WU%KgIpO>-w&mExP=@|HWUs@{u0KFHS}k{+qcnesmxI zu{ZJ4_w&ezb1N5jOLWzXjiK60WH((yG@_U3>B{p(q;Pp=Ja?GL!iY)Z>d0}5Tvriy z0(#N(B=Su%T+5PMXgPMC2pbm=&U7ND?#?DWFdZ&>HSjK21gE*$B?)U3aG%}G< zKglAVj75>S-C0l1?xtCgfvBg`lgz{}tjJ1>t+uW%(XV2|T0ET6m4R9x>OBmXcY41; zu@zpwUH%)rA99@mkkI|N zgP|x}hWYw6kDNI1$cgjecLN$R3l~&HX|@af1Ky5d1ucdQKyjFf5b2z zrTvA4JYFnX;@b^ggqP6E37!HriE9Z4cOFMX3s|%l0N!Y-2=C!eA2JD3us`P+&6!wG zK&En2t*X_y8ds@)ca>eVWb@X&dce9e%qTj5lG<**zvPYg;a zY4C&@k%z}i_9Tq&AhU*RxYvvS!W<4 zGA1DA!)iuBKD2}R4VF0mitzsMS9GSQq7J>H>j&cCsnjuKZ-Zcmub^Zn*HEX{$uq!~ zYlTM-!E68UKy5wBm5vX^ZjfXR6-w7BOc_e8$qH%NkRrpXIvhbDPtLUc1HBVKM3&P+ zxuGeMByL}ak7=^>lK9X#liRy*l#cFL9}Qcfp;H^gfR;?{8j*u?xtX0VDqF$;NGRwa zPkI3bTB9tF;v36Rep0Y-67GJi@9-A2QO<9Q<8vdsQb|-&-FRvU@(|_v@U`ygdA~xa zK-bdqlqk1FQl#5B<}7eBs7YA~o7o07Nm$u9BB_9S1b@gdhiZ*5Zsb++itdCb+4Mo2s;%XdlA_1{NJ7EoWLJCI+>PQJ87@TA9;)N94 zA(ui3*m93jf((BAugLB4qc2|Rd$sR%=mlE4cuSC}_zVvT<5ANB{D?I1xE-qjgD_|p z9Qk3+Uq&3S@vI|)m1=G{)b-8;tS4$fWWjIn`0Rv?zM5Nbd za(bBbhOnN?AlMZK+CpSlF}5Ut}_+OQegen!&860%XN+lE_8oI*&Lx_%mpO9u|soA>`6%K!fdbu5Xtbc;{{2MThwp(Da9kK?vS#@*~Kn5ozf0-I(zjRy> zKDS8!xv^bf-TW48c)ZV&Kz1>T6)J4h>B6FD}`o(J_4cgSB6LOu=!JjSu4L}Icj`#NEigpL4*yB0@2PAa0NaA zv6O^P$MP`r(!K>Wl~g4kn|PG2J~|OwLZ8grj6{lk!BLr3}_`F9olKiNXINg{+6i4LIDVWdDiOCeEZ|fz_!_uhG8^D zX15J&;2B;my0f)AT2fJvy%OE+9=pk3EtG$X7Q*>_W&-YG&;>4A`A{D=fatYHKo?xQ z0=Nhle`D@+!MXz_#{41n&r2LoESd{)#IMm6ghuj|d<5`AYNlyK`S}Pu#}Q~Q6=RMe z;sODdGz9}lH6D{ezwxmd_6lGE#8j2GqNZNIetkJzbqt_27sp{v&mjS9C>Gw^7~WC} z`4KVbw+oYb3J@yjk}aV|GbyMc%P>+3;x%GrSn@-N-GIay7Lhzzj@bjTsD)1|j$aB? zstxu={EqvJ*oh14hfbEJ(Qk0zA|!DnsGkgi&SwV-jlBaClX28d5u`|TAb?aphJdsn z92S06jYvVI0^qb#v|2KfzYZv!5(qkiax~Mnf{I{}^;QO%e|Aq~l z(&s89Z;go%WED7#A;prQ4)O*$saNbBMmk)j;8POK6iBO7&UzD}N5gr{ui`TpHkUI} z06WGAw~*u1b0ttlfNSd`LIS2J@Jw{?2l3@(!Gm=uhc6bP!SL|5Ua;F~M^nR2Y#<6C zHv<^tVy2+y9pZ@bS~4J8wj~FWwK$z{@_HcygQXG;`pxJ-%n6GG^#nw}kfy~PD)1^e zaXV!q^qlT@TWWkb8A=ur*yeZA>(Y)Nts>40$6+GW%#=;Hx~)VQl>#&c>491(@Fb6Z z>--1boxw9|YA}lGsut3q;{M_+SZQVrO1?9vye5N#*`hzLSV34yG@&fs>-i;lEM^yGmw#-qM~cO$y(`V)zssE9$Ksvxw~ zBT(L<@e^MnHVz6v3IkX1QQH?38!@OHjP~Y4@s&qfKSLCyYYcFQZB$@pNr7}-^LSwWI=W8;RHEckaD5GeUGz^3*EV0K)OXK+~seg)Hv zelleq{&N~fE!!awL#b_M?T@l?V{>(Z80H+E-k*xU0X2wK#WP0u-tXzslfDDUx4M=# z9R%GZ&9^>PZ^ozUQ=}qSig=&Fs^@=(jiER}#uvz^>)0fy^mMUuO?~)n{v?#!Fr^r= zSd3vOg`r|5{Y+XvzJ2?6)IohNMlcT)K(8o~`>v(sJ`j^6A(WI%Q%Z&eNs0;EwzapZ zf~?FQm_?!L&XcZ&>gos#b1I2?bT{KoT^RuHu#pd{$4wB<1X~wDz(T-|G+hmgd%`w) zSrl#&VJa#`JP47ZaHA1KE<_~E1D+~Q<{I{Ml&MrB>PdBWH^8T#eQ?x9YSpC&j#Rf+ zHyrt$01T$EkcNOuU_u>LGl-{H69}7*dHGoxUy@PrJ%&AsuX*r>-3a+QvZ1=Ia^!&> zav~T`xlSR!tfESlq{)V8;WVl`b6-*4X$-k1?{)iO!p&gp8UvrFC$IovCLxnaV;Z2N zL}JMp_55#n&!&-WkVLla0gsCW6!ZCBO%d%6C|pBJ|6B_3;R1KXuc zxr|NJT_J&iY+G1{^=N~uMHqy*!nG-`B#F4d4Gr#%&F|D=v1lrv9J9iq+|k8FtRg|t zAZ9K>8ePgo@5Qw>bnWrniJ_2#iY>ciTh1>oQ)a6Wp!6m*Iv3AhNNo%rbuZKNxpZO| z=2hD5OR~aY9*{*6bBj!LoC85bfYNG6cB#7I$lc2<`rX;HS22mn!Fsv&mLkU;1En6mg=pzpS71)$! z_TjEl33XET%}6Hm?@*K-)W;gl0rqV?YZkVp3Mld@B!DTJ3&7Muhhkpx?&Qyf><01^ zLjDV~VqC2fI1ciCRoG4I)p)ZAt15d(!yk*@G3y`p&)yM@`5UVbx7H&0#(bkOKN}zW zR3uWXMV^e0ovTHbjya_h;qZx)bF9~5h31Vn-pB%#*+Sub;bH8$Yit2|@}whIDKmjT zQV0{XSpexTy3iNUspwP%mLEDtqDmY96c7}65p#4u(OjsiJjfp$c_(rvD+{V{R$Zu| z`QI1J_L^Kg*ESa-yB$Xm#cC4fo+PU32&)hOhb)hDF8&>*+UONYWv z=RG|5>Tkl%Lr%E!H-JR{A~J8YsFkrHtC*&e-C!b^d-Vx+FaOMPxHRg7w-yTccYXHp zfq}1fQ~21D)%oiI{Pzr7?6g@7Mfc>%Nf`hIlZG+rUw!zyeV=+bo66mNJn11*@7wPtk?v|fu@r&&i{f9Lqa*RBZsao)#>?Zz4Cdritx=IVG8;BR| zj+mL)g4l9d2NAwt7%)cF8*-sh5MBdlYpuzDbg^&Sq|?Wmx_*Be)geFmNfjVo_v?DI zv$S-{M;bnCk(v~7->QEbku*b|YyntLnrhjKE!}W~gk5V2C&I1e7XG>P>wgF;`(?~Y zU{g3VeE#(jRrwlZ7|MY99V(f9>=aSaQ*3UHX##u}G}IqA%{8lz*lYZz-8pZY{$o58 zsC~7YypOo+zN-%fL95Cu+7JXl9?Hw%4qUqGNwrur(=K$!Kk>OZf#9;8ER0?Rm0ENorh5BAsGu_9O%!$v zB^y1#8I=Mvar|;qX!n8HW19A!@S8R5k?>hfdqt?T%oakOdD*N&9Nj7G)RO+HDW_y} zO**{>Ra0L|D5V5)T26atK?@LQTHQZ}Xw!eT)Py2x`~UQSE~^RE+H5j;&mNhX^9Wfd zX%!*sZSVEm*kdlEs?aVc@O~Vrr>hghuO8*6aG=nhyB)NKEaDzmCii#~1pOHP z%RjgxFfdn1zNrzdal;dRPt-Hmf~AvcphZRl3gGKPkbJZb5TpLYK7RS3BNk>MM*XOE>jx-~n? zcY8X&x478lXFj%wmDY4U$c)TkE9G7&*NC2jlrzLxRJa;Ir#6W^c7!CIUZi$!Y89n; zVK`1Ee*FFdh90KURE0*~0#I1Jp81^?rh6;MyYiUZp}trp9hClrp7&fEbz&$JkNGfb zQUDdZAzKYd?bf4|_wZSD`iCJ6Uiab3~U5kq|YahP%yj%=~?b)pqs*}Ds0Y{kR5~fm@c!eV}mmRJDjSp z&h^1)P~WFpV)n469nOlDe&diFmWOV{sayz!hzl>`TG{G@NNu2*P?n-f`yzXteOFOTzvwaM}KmDxEzf2u}mKY2#ft<9%;_EdnIjK6_3ORPkw) z_QOqIB-iqNw?qHEkUV+vjQv1RVq4+7WXC2^7VlP3m*4pzP5Tf` zVsu@6F#T3Z6@*&_iFLjOG!UxZy!Cs(A!)HMpFhvX`wu{WzX3^*=lgNnx%*}VcsaZg z4KKos2S;4~QQW%On!%tyF46ttUhs=ANmd!@C zvVJ`qF&4%}RR?cbfFj+{LXz6#w4`(Kw*k%6LZA)bW=cePSQ`sET`rBi10f-47-lCp z6*)HZS1XJ6+n89K;?Q#v&JNF)vf(|s4zq#gIt?&v0Fd%FGnp?>Zf)ZcxHR0|wE&$J zGl7C}C~<|97%by>lLBs=VN=)d3k`=K2!0Qb@>2G2z9@*hCps34%e!9k+2d>K8zgDN zCd88d*f#bmVo(fe0|7nLvi$)u;CJLDNILfg1oP;~@K8kEvDMyC9B<)`M1<3dxtnM1 zN@5t2Q<7o5T!*nZqZxXW8A``ZS zBL)-}LLv3C1hrHu!`Cve@9U=S;lby-vLn5M}k-fq-Sk?xfE!OAE5zT_u} zA^9s!doFBtzOQL4ZHAxIG#YD}^iCeTO!ECf`0wrk*QTOdtH4}D9?{=5tGoFCoDP#U zi0pVoj>taeUgG*FCN6p(#H8Nz(gC1fH_6=Xo>nW3CKn4ZrI(S-gRuScq$+&1-7Pr+ z;2?~Prj3S^ftcVoHO=g`+UUy?YKD}sx9!)c3qb#1voOMZioSzgKBw;?1Ky*;J`Kkn}1WPZg#!Mk4QlEkZ{;*s~nn^l;a z-gHB55ci(U^hbqAD*+;95OmzSnV2Od&UV}Jm1clVtsKOz+FW%vR$+b?f3)9?zjhvz zszWWoejyPYx|)gvOhrjN_c3?RP-0l26M+lviJHN$EBawedf_wmL{VIQ0 zF_#B$@aYcVm?fIzOQ?4VAVAx%qz$7Q@Y}r>ikE2JlM}tOz3a$Tx$M`Tw#9^*eqGu&L(P^SGszU*fmedDq_YdCnL7uz2ht-&`DMon%o* z>=axBVBI{|oU|e^W3ozutdm^Gt=HW3Mutif!pJ*Jk_)6sOsG0nTj6LtRGdyC08o-N zL@x_|wT0|hmeST0R8{x^y$0sTgk{7cY@Am1QJtmbd?XPXFY4;cxXm%~MB_HU#RSv- zV?_lR5$fCDIxwgSer2Q!YjjbM&*Af_!({O|e1l<0(jAdxXdK^700NXTO1i$A|LW$B zd%$-q0`5u+k{D>d`=X>vA*|9{WH><7#3rFDDhoS8=^&x3pr>6%Tz|06Y4H5qbxlMq z7=chQQcP*;Kx)C&x!aL}(92+_pjXeIr|qtId>8F6ZapzHNqjA!1k)igsJl8h=!*nkNzA;@_Sff;}Bb<#b`TG>wQsR6lf3Nt}aC!J zv7ed#sNej)-~WBnfJlto{hWCle@C|e|6#(XRlV7I{QlN;y83B>?e+u3$NzQ1_&RU= zonahDg(_WrjLYvZ*THUsoRD&H#Yn>=NcD9!XlAy2&?#p1bbOdDKhIs6sepUa1y?#q z<9-tr)&wn~!Kjk($L%rK7=HEZsf2eK!vdY`pD{SU#uhLxR9y|aBYCvQy@lte_rP0{ zc&|Y0<7lYx`F2}u%Xjun4Wu_`2R2tyX4OnqS_f}&;%E09JWyGZu zS+kW;s51N5TzfS0Z;%s)`u=F1P>lcUu@=I3BH&4LS6hJ`n9!FfEE?{$W?lFtS<;>7 zmNa<&WtKMvjr6HX>m@-=*HqvoBc?}VOTpm2_f}e6o7@6lUk9UDW;mlS}* z0wcJ~k-IXS>vaI30B&&iT=$+R_;<971Q`(~F~SuVKqk)25}ATo*Rf_h7y1s)(7>|9 zZo0BWo81h^BAtbWg;tv_wLb;0IUbzHH?{sYU!JQ^JOK2p7XIU7NNbDUk7(Zk8beRf zf;+FXqCCd2WvHU?~7Q zC<9=rGA7K;->Bg%w;mh~2i9krB##nd#JnV13RGIur6E$sM*tCNuoz%2V71B6M=FDF z`>VIXL(1kB=l$1x_d0*)Q)}O|cHM8Vh3hxny8iIt^|x*cj~6U!c-XQE$K&y&$EVpM z`b-6q?pFMmXV6x$%DGm|BWIA4$$N>S(Yba^tP`x--H>QJ#%Pg)GC+4PafbFMX3Eg4 z{C?`2Z7fT>nVc2LZwi?5fSLf7qbX)y5)B&Vpk>yKlr8$J<E*I zJq!3t4;?7!x!|doASSG%Q`T7Qs4N;eO^l|sTn4nS2G?#^?w~n9XbCV2@&0lrEV@nQ zQhSxAYp4*X9R)Rk;Nl18Ku3LWjjpj794VdUJRu5h9qXL0%~I&n9EfS8^Khaf$<-{I zPsL_ymwccsV_RpzcX?ed_67WIv1{*!5r=Fv2v(MJ3l}om`HHCFdid>iXuL*yJGtxj;MUt zQ-PgzdxoA(PNq^ZOVd-9;}4nv?b*5cWlsKjF{8c4ci_XEUp$BSOO$+f?HL{pMi4sa zeZao;b#dgnPv~%386;3z)s=e{tTHchNm-d!$p2nRDep12884;WlZ$B_v*%Ic90_qt-)LS00l!P~{7P+yu z*o?VLk}?A28K`iut2d(v`ghqwwb|veuJ~82gDJ7-@#}-FTKZ+DwZNj$>9pdgG>Y7h}6SIeL&jVCy8N#6u_; zw$4gxd1sN%+{Ob#nYUYjhk6Oa8ZtL#vl~NEHz(#IpN*K1d`^;|>n{a^y&wIy#Rtz9 zx`XV$Jn9UBh8u?tlHV1yx+NM2+!8T7n5C{v4SP8BFMJZpDAZK&5BR{mFF;HH@(HT% zF0Yl8bt7;;3I-BBBsFdXH6}#Nw-7bq0@eXDf->X5xGI@>z!ftYzfx25b!#SOwp;4> zz{u_ZvM>h?30d_Rg;)8rOXH={Eu({~9~p6B-E@ljBTHIY-uznN1Dp&{7)!6^wacleSVCFqe z!#VCa@5vk}BCr~!sLn4QJpLfNpSSlF58wt|Z{UWYy`P)3Iwx=g#$KX1%VYh>CbfoS z+Af{yQiCeoW>~P0SfKIJ4n+X~$3DXaC!~>~&(Xg{R5(EYBk}<}XND&SKxXv3s4Bu! zr?^a#VV~u~4YXMe#o>YAF=eVs$P8;ZQA*$_S$ywoZA8(dx#$M`>BO>N#9DLZ8yDp%M4t&+VmvNdVfPF8cfD(F)-M0a;=Nsb zHSz%`f$h5kHjSHocV6yUrJPk#>|N(7?}G}NJirF|diI>aIYFhNqMjk!#tS@PC$d2M zyyPp4m(#Pg$*djDj(!gSm?JwxB!`Gj*0D##BkL?n7Ua|bAoxEPfRS65q<~fyt(U&A zgTIwWvxV{TLUt7Ftu|ZJ02r)E4fvXhNp-|oHzzPd2sU!5v0UH}v_MM}umKnPpEdjD z4Iyu?r&^X=6L5WQR~dg9Vm6QLb?1k7#Pcs{zVu%Oxc?$KkqPedvXSq6N-%-mkEt~H zLEf@rR;1g;*+7(0{KDk}{xcwUOogJ^Y}Bq3ddF0V{9C;Px?m;qm=->T^L!uXg@si( z1X*+k5LSFM{X#o(WyrzhiSRR(RY%Cfx#l&{GcO0=YAfVprYN>(fYJXg@vc=zA76FE zo?LZ!c-7JRYjoWq#Zu-q0g~%HvP558`(Liorz9Vdj@^PSCWT&_0~XEgzWYf=T^*m$ zw~BHM_&(6NVw0fB(0;BGo-hHtZ1Q>{Kmm~om>O7r3Kwu+?E30-*H|z1W$tN;i!(O z)o1~d8Mq|`d2kIRevylnt54vLT&a%(4Zg@NG;X>9rGz67tU)ocFY3Gun@3mo=-Nny z*XkCEh>9AfH0XK|)tSU}JWYW}?p*-b#4lGTx6AdHw&@X(Jc+oBy5BoX5Vf-(Ft z!2BZ}T#Q6SSz35er#oMzm;%@*7y0({mLApv01_swC`mkUXHlp66)y+wsAv`;K;jXY z6dDd5D&>QMB1T30Qv^GXNdc=GV(El2Ak2iKJ8koJ|aBcs@lnHZZ!VP<#t+~k3= z$=a4$C_gY=8j5|Ct0%6m;i@W7{cs2snZZZWncy*3qQG@Ek~{FzH`s|y zVIBG2$hg~x<5x*SfeH4&j_%24VwOJ$&_g}s3l?jO$3pwAS)1Z!4%04Ux%} zVLp!ajDr^+aj zKUG~5Wy0F`on0#k+n+*GqjLPx?Rx>1?P_4|OS8|TP}?oXp`-@X=vZqLKEc+WecxIp zY~3d*su0R|PH=qf`?xh=KYtbCGkjiJW zF&?VLUxHq@!HYdY&}woqf=XDB?;Lar1P(HCv`_MctPc%p6(~EKR#oXn46MrH>#^=_ z!Pt&=_@RN3@j?!$3RV&(jZ|#AofPef!uZGl0@nzzT~`ROJyn@Em1h)PxdpTC0Yg`| z+|5Jz0PCt6W|EVV>aFy?KV2hu?CT56<0(Pd&pM@4EBo8+c>u`^5? zk>v;HXjpmc%|)y|Zd>?U*cKKsw+A5`9`P+;MZ&J_x|G0i#s#xmPi2$h$TqL`GJDn!zVFtjX03#KD4@;nBw z6|Y7FX)-@DPXpvaSf1x?@HkHvUjQv}b7Ob$wZmx!tW&%T-0tel5*N*Jdkm$azy6R8h}{oQU+JS zz+?l-V-NJ%%og(a)jWRjR}obXWg*`Vgt0>{EM$K!k%&9Do5)>C{9tX0UTbpbgLt9N z8^#N@#1iTFONmq*BdXg!bBK5F zxUGU4x71Kkw#BW5j>>ef3q!7i_{d}W$-(17x&kgDW*F>8h7m)dOBrrOLO|*Kg{tn+ z)YofTQqyi8(o}F0{t;{_TLJ%CE!ILZxa?R@XzE_=|Eujy02{gL`*FQvG#Y7iSd!)2 zmhJVihrC{UZSQWf8)vhdYeU%VhTI{RrLm=0mK2S&UMCO?AtXQ`0RkjkSs;|V36ydb zh=Fn!2$WJNP?i>2+R_4Tp|lk3|MPt_^08S0{k8wZJ9_ix&GFv*-rw*0KHu|vdb`i} z?5!$5jlT5^=;-qi4{@EVXDA}j4`v6`1nmT;I{@zlB2xMR@(`1DnE-HXZtVTPY0JmF zK3F2RZ`oSdj=!d@%{mea^tJ}t{ax2}VV9w<>pKG-{dQ)i(Pf$GYN&Ae{n2 z2fzW221JM`OR=jZ4^1jNmX5e3ICDl+v@RvNocw{Z(B9qU*N|l)ZjSnlk^Qw1!#9e> zw1J@J?`nHhObdb1p6Y4Y8q#9P(AJ^Zp{*g7REF33w}yhfh^w3qbOiQ}kMG6Lbj0WH z4GtxL*_rfrHU)Zm0!^L%WT$3yb#!z!*5(tf`84o#%*k9GYw0B;L_%vAVBs!avsO$2 zvKrnLMPS zF3@q-+OWqSo1E$Mdv8)ac>2g5@Agiz)|f%V2%1!i_9o<>Bh&4J^#>GXQnr7Z2imvp zgUG}CX;_+@VK1GBcgTb7II&Uz`m#PK5LrN~Gt_PJx}yZ#7(_T?!b^d)AzC_(3DW5d zvj$CEq09&vvhG!mdNSc*L{!`Y<^KSsh0PD+0E?unU9eQz9rk>W{QFHMK?j^^bHM-6^z-wzaiwyGRo|k9I`=F1a5G zuOdc!$91#qhJ>BkOorRq!buZF&DTDAT}QhQ8%lWhCqv$@jtj8TP>)B)FYVpa7e(i_ z(dmvZ@BLr`6#GN;? zf%LYij^uPSe9yi^LF4?bhi_FYg7H3I$Y^RBz5Ox7TY#B*Uy??y7ybAN=Ttksmy(=( zFOc28^?W0A?V(>$yw9(Q>-eJ~;f;)$p&xi3yIqGIntrK9NDe;hJ#ic~Mc;P}J}jBk z{i;8!N}e`g<-`gc_-x%sUMwR@kdTaT8zk{rQGG{1bEUM6nZp~IC#Kf}qiOf7IM4L3<#;5)UAADBI-J08)7m_B#?ya?*yz8z78Lbh;j>b4(u3t z<{QmOGt$7kyJvsTJ9^IVc{l!D6*5wObBiwaBP#>T?p^Brs*FsU?cT2={X|4I$?#O5 z9or}G+M{FXm%hLL(dZBo9SlV~qC>Gqe4&w`@o*>t)bkPTqnw_fQ1<>V?0DJ8l7|I( zPMSrKhN+ke&E5$T4fJ<1+7h6%Z6kdx(V@A$*nmOX^&($XO1Ux)ql#%xbsT?T_o3FF z>w0~CaLqtgKIw-w{fz2w%5HcUwlZ-{ek*-16=j*+$r}YrN$*=5) zgm+{~J_66rEud!4^Sl%>vF|2p7V&LPmSuniS=bR^17(l!sv*caK{zdNNp1pbWOyT# zZ9sbe5SD>%tQbPb4Z>3zSU{J?Th`kXW;DZniC<_HF}7Iak)s(RTW&RrjhFnWlPC znO?-O&>*5pYaikA-qR`vz7OkTBA~5ABl?FZs5Rk5!ayvd@1H<0KS%?1*Ibh+)*a^S zrcywp%Uy=CXdCHkK=Xgq0DRoQ5Hk^iz{$^GQSYvu6q(I@s#Y!|e40D$Q_SBQH-sOujGQ=@RWgh~?uU;6mu z&jV4cmwqQ{bzR+%NsUkvaWV+~F?l?$Vt^2ilk^6qfz^}UU2$V;eDxGEUBavf;~o;& zhEa;k;p9{=q`G1G-xJNqKWKwNdhmDz`gkWN zk-ir>@4VP&fqR443@{Pxsy{Zf5{s>%HA_N!T%nR_cJ4TGWJhNpI2twr*wF!5$HJo= zu~Wano}PC>My5QV7dHGNG-k>;3Yb=crx!lKkDVz+VPF>66)h+LdZkiWeJ|M>HS z{uV4h4~7#%CL6v0o5Tk$7-r^BA{@lh^tb53+Z{;^4a5^Lj|D0fpI&uVZW6tpQgi$T@2qJLj+OHjc4e~UMjv_0=Ylg3F zpF?;r^IS4CJu)&qL_E9>dm@L<-UQj7AXUe@AMi)WpaNu9Lu4L19ggumJlYwq|1{Fs zB=#VZfxW)|k{-5~ol1o2uaC5aLTwRdg%Z=NfIA79tdU0{gB|}~0lm((z96fdv;5HE zfmk?8_8~Yq@uzZ{qn=o-qIP4%CKa1jwl|{f#2COq(ONYFcw#pLG98@9Cbu;1Bo>S& z$jO5sXoyvmkHxtOx2v{*QYU8vTdf^O=HxB`dqJdG>Y@YrQy|tO`Yhp>NLDY%lHlz@ z>bU`IPb`y&a}>Ia&=1ykCZ!$^)Ia4`=!R&2?!>iiL7x^ig0bypQ_>7&@ zZG4?m#^V8#zs4ShB*T#h1`@N15~Ju9@C^#V(Y;tILd!$d0g^E!IjE`)Et)oKKICsV zrV^|TF>DC3H7!GzwDcvOwbwCd}yQ)aEmeAr-P!tc7zO9{5Jp z-rc^)-|9Y@h#6y3_%+}T4Iq!S5s&zG@71x7H&wJSkMmfHw{d(qZ{I(zW2ucU;$};; zH^{UuE#TibrulTP%XpwQt_Qt6(zq|E@7fm#csn%~gzeUhOA(K4AE(6^eyyibDRc#& zT%+Ok7K{V=i%;`u&~`5( z*29P*q{mzktg<)VdEVhuD;Mp5 zxc!z>EBh~+4n-BKUFquY?^-$InTdvGV(;BEJTn7(2|x2o=<%OsU&MDJ3+Y*w<8c)U z(@RiI0?H&SD>AjJNR~CMHCt^>B*q$qVgPcqQp2&D zqM2Pfcoi0`@0f%c_Y+rPGv%r0Od(Y0s(4B$gs=Y?%xQ85)}&uGxVoct1)&bfnLWDy z&(dhF1|PjTrMA*bCzEOW@$_(=nZ)@wG)>d!5PLQrx@N>+#NePGjNBxwh zxGmPYhfU-D#$WwcW;918zFgG&NJ2y+BJs`!M<*8h01Gvn_xeNlQ)}bzjdgGY?otlu zClt?h^PsKe*Ce*9R!%r(Yjg(rnt?9_Z*EjJbX6x58;p7Yl`%-S#Dvq}t4IA&1i*x~ z1#AS@0pTCvO9hDHLpKcjuX0GFZ&SgOB=>j{^1*jAiWom z@CJGVmW@Xjv@o6)HLh}7jQVkBr+;)W?yP?Wx6<5+Grv0XVbzy5Sl$l8qM)D+GJ_Ju zNmn6EhBrYdgdryIJ8Z5WuX?$@_uko95~5eFlLB9;EBezLUFWJ;e9#k1-@6wHO=}&h z7ws|54*YI=tD;kCoorA^=53(a4os2UHqkUix#nmWB>Kl-)E{g=<7ppUNsg}If3^zu zzzS6&kD96B)U**5GJP7bBVHbAsGmSZ|5~6Ut`OQ z-U&(_2L*4ieHCs9dhO}yQwZirf<~#rH1nMCOyiW{8&>M8^dYO$R586WO;I1JI5Umk zX(TGqXkCi3E$fh`hT%s+R-T5xmLi)RimSxS$=$tR)G&f7X$!(Uu#G(bz{m?QjgAN! zhOKSWLScwy>^X|CZAFHa_zYna4)tG>{V_BYI)n^zhqNH<|J^qk2xAx}HTBEw&9P&Q z?GItHuZ;8NW|*$&8Fjc=kPU%imXu906gq^=bBE-I4Il1~wfn!08+OHxJY$j!0}}PtESu)IZ&V>!l^hrq=g_ViD-1fMlzy6 zpc!I+s=5`$2C)P2rus?4i~L`o9XZmXEevC~tzGxF#r68@+L2yJ^aq*`9P1j@n|7Oq z*=FvGdiA8eGuG;^@T%Vvio-$rB^kr=h`GZ@T6!ji&Hm8k7YDH6P`U*n2O!Xa)}Ex< zl^AdLwzV4GE(5*W+uDS+MGjw`R(%`s9HbS0YrRu5NMK8|6GPCEvNT}sR2Cpo`v7FS zbxI0P_Bx1Xx)@i}I<6ErXPFzzs-C_n9@^Gj$6m7`|Mp3aO$3IWb!t0;v3UE%{?Jd_ z8q3&*yx!fd2h3<<`&Zj~X|db>u&J%}7Wq`Ww?PntG|2pG%hqDSgzx>Kc;8iPi`pcw z|N4bdfAGe~-BoW_kbVWZ>MnN5vDP6IBbXYxr$hoc98}g45-0~IT!`!z*kAwx22e@G zLy)zrVFp6NEUSz29o@hAZvsmW5x}5*U;XB9K10yc92@NGX*I$-_a~d%2WO}XyUDLk zZ<|cF40a7E8*2#ZA#^Oa5BisAeV!3%>1pcP(K6URjkB5IJ;-*pJ8&3NqSnTphWtbO zi%ud!f7#W|0eyf#NIlLTqrXS)6_x)JYPORx8Qcy1LzXyaw?ULKr@te8%i30?NL|JC zrcUqPm9;c1>j_!N%_1nTGE&~c*~WKmv+ougKV8vzZ1BUp$kdO9VDhfB$p_H z>6A^4me{HFaU{HQRFj1WHnAZ9fx3Bc%EjW?)dzRC>CG~9Lj+4veb`bb77o{6)fDL;??=9}Pc?d*6jbVUA+;!3(;FV%>9L zZy$^W^Z=iBx7iC15jJ+!LfFTxMYc^0Hz9^Sx-ZZk@R_@teUalxniWi?;*mD36SU7y z8*w&MJ`uEtWq(z)!}T zUCk|%YCQ+h1l%+=x|^`Zxk^gv7S|mdb$=(%`c(!+vMnaCWW>qI$@~#{Hi+WENMCB?sy5Tte9`a)J0d}I3R!=UKnb?XE~#mVofu)PC2V%|lF;7Q zZiZVJ8zH>zB5UV1^_KeItDmV2$7i-+Rt(sYykn{s9D?+e6-7^-{4O_oW@uH35?zR_ zkO*^*Uu2z8<`S?7@NMFqN??F41BVj^S{=x_pq#Q~H$j>1!0fQ*mhqt&4J+<}g>Ag3 z^x9`X<;e6cnwEe!WMJ#|z`>C-o{@u*t{9Y=&iDgK^O@T8)&X2ZLf$PcSP_2vp?#$3 zoKXwRE>+4eyMrBqt&HKzf_-C@5Y1SXYZxZJ} zH1W5`T){v55$@AGD4A)%jRx*lfn%g&k=*EP=>>sljrAF;hjkUAxv&0jnu#GLpr8W-(>aJvFb7Qz#Aj6v8&rJ3AeY0FKNGeEEajA z>r2Bet;(JDBq)2VUFm{PV7=*QV7=W5Ek#+TT>yZYXQ+Q@3Wg3K)({8|R+o~F7g#6aw!nwr$zf$qRW05^}u7m!8Zz(T;+G%1el-`){7ct{>O6u4Xy`j*Q( zqJdb?v7Y1|v4M%$!+)*7!Cf=M72G%c=7rI5E)r3LPK+F1Csk*t~|F_SQc!!#p!9Gcy_0lo1<^wFgap z{!Q34nOfs;{5%uJ^A%oyyCYJ=ZJ;Ir-$ydRs*+(t3jWptexTvCOu`fmdx8$n746On z&()#bm)`Z!yKcE`@3s#AmKaFzzMJ%p&gc<@JHKr7zU{Z%bI&c4rw&c*OV&Tve*KUU zxTxk!BKyJ~#lxL^6c=KQD0U6`^eGaVdOtZeihl>Zq)(Fr5sI6JSn~m87NiArAxZW@ zGK!;_r2WJXXlVSMU;_K`PV{dvn19O@KinxrG?MHe@9uz#88imEM`DS=fp*Ga(Za4! zjTk%J3Hfp0qT#hRSV7p-Vn)%-YqTVL<4qI&jTcaCCAAyCXT*C7k@RK+I{K0{;uY5{a)lmZH*XjW~)78=XJIA&|Yw`40()jJaAyag)5TR z-VD!b)Zoi^}CgMWy z?+75~QhXPP09pDR1cID~-Pb5{9EcSe`#`{GuVY2Pus#Gl1ngl$?iH{Wuz2LbX=!A? zse^_g@6CCehwe`_*^DLd@<-T=??>c4!RFj57fvG!j>>;?Xwx`8i1;e4Rg+(o_(K7~ zGRTPI(sx&G9o;0e;!_-%_31jXCTb!99SNFjX7i`6?`JO{IPSabn&PIfa>nopWj74N zzdeF6Tw}A!`2Y(Ds3;cvkX}lwLlCv7ynLWn(BY84pV;LeYg!AUSol<`80$DW=kUn6 z4n0;(O$Ggj{9YbAY9Nq2BwI8zRxI>CsIlHL=R9HVWCu0AgBlx0W8~@~U$e`jkPjk? zbWxaE%l3?Nj~);wI{!@qXSS5F3KB6S)s}1>VSkYY$`U^ps*Bu z0p8&(p+K0`;^Z4oAjQ|*I>-qGF~?z!_dclLx^+Ycyt>ctz5 zj!xYP&rpQS1mJI{cDIflJUG_6yR1Z^t?Jm~h(+jY5`8@lSf0igQ&uYC!b;eo^m5H{ z!t(=AA0dwej_C}faM$_?#BaF2fdK4u_wMe$jO`5e1WcnNBCvn1*5ix#A;YkEN2ED8 z1Q&$Z5@@>XI2y)6J%RA$1~yf@!smMxu3*fMVG74bvam5j zz?rHh2Qae&nFM~F0kvuYhMP5c7uF}orMWiF>~wwl;KWvCo!B~YPzeZ*XYSPW^m*yT zu`-Da({+%G^Z-(3H(u?LS~u^5%=^gfJL_eAm}g`Ksdomr{J1`4~T?jVg=-| zcK^T=Fr&me$ocR7O=?OXhsgm}G7ta^GW!Q?^(#Y0{gl5i)VmYuFlYR|oxQ`-K;%|S zatOY&#xZ`5y83ehG2ZlK(|9cK$XbcL6S){7dZ^crr-pX+hWhYSBNWPOLBEErb%v5H zSXJR1W9O**a3D60XL9vSw}kQFfRiVXOXri2i;$@Y9dE$46Re>04}mxt%0}o|;_Igs zIv-f0}CnK98O)Tk1m_8o`@ngH=_kZOpdLZE1J4imKU2V3K+%-j#B?;IdoRkj{ z;I}4$4j@_*fY>{h5Gc7(JdIgD&kZY^`f-ElDB{GDbq`?iRJ;>umB>j8go3Tj(0>{a z?hi%T>5Xj4x99Qt;}ovgS^q9s-{5p@;8Os*ywms6pa2%buv+xHQ7L4jrmvtt5bSy8 zMzoDPp=l7aCaHu5D$tE$DVeh6Ii|&#qXdgjI%`N^|5JNDs_jWBI+@IZl-eEP#!n(@ z1&~a;osSy#fK{nIC1Zpit}mvU{JaC>Eo&PKLM&;SB0`4!UyykhCTH?g5~W2Enl?MK zFc3R(>-|@>^!B!N?b_1S8gC6u+|}IWoxJ|Ymf`Ns<~SEElyTH=%8v~7T{6A3cceGo zzkMvVBh)$=JJ{8f*n4GPi@CiEY2v75a0^_8WcR0UVt|__H|r=8oWy89L$VZMxjvW; zxd|zRlel0*32po~g#AZuc-?G(c>}(^^4R@1hq*sIe%*_Xi2B_E?tWHLLgq#4c!xT& zRpXY2ulI!mJaY5PkMg~`>Aj6ze)lzb2ByHTP;%zo>UhVR%<1SRBnKIgIq~@|qE|Qs z5hG|AKbQ^sJhCoMH#Fon%PP->x}&})_GX>1@1w7NwB}Y`St45!{x2y1~0m|H_Kr?8X*K+A%C=+5t%*Lb|c@GmMD-@Z^!c*7^rp z`;JWBatc-easHN`t-D4?cWv$2az0i&`(!fttqu2RiJOxY(VslUubgb{>ua67lHcOU z0jJekIqayS5qvhSht;j?{_spux=etEf(GTmV&8oz+&t49zR#J?@TRk5bC})q2JBu* z9w_`mZhdsasgfsFU0X#%nz#hGCjCueW5%cN z#dDI*Qd;FVd)3|~#=uXV3@YFl8>yuRp9pddjq7lQwBR38Lbsz>GQ^Ut zuF!utQmQ$(8Xqz3RIU)MfrxO{zK+jyqm}RXJmPuG^MvQCp6`2p>N%q{_MI?}({2Tg zS#t~y>$7<7^Yx%+*FfP)93(Z7Z1g+tKkI$tXP@hvzvn5}&raAL+uZ(lzTf4QjqiO* z!uPYk=Xac+{l4*^5yS(o-Q|d9mCksc_VUWwRdwH4hg0XcI=xo6^0cM;xo%Fb-Eywd z`U6j|Q{tyDtv>x_2oa4JZD@J!B4wFxG-fO7<#UzJ{e+qIrW+b;s9nGA#oi#dWd@p#I|g1{}hNj3xXT>_tSb90#hYSt%KF{+N7OcE3K@R8bh|; zx2Kfq52z~mO`mdU)7|GDv<>6OHax(ou0KE@!m#L?=#i7#oMa!BB^vwzCc>Rg%5FrJ zUEst|(GD<5otT8{11VTtBYb-Q4L%m|-4PtPaL8vevwvHo;;Qr2`5{NnnRZXN4IfTv z>V`%|qy4FdfJ5ujR+UZ@RdFO&P#l~JJ)me2s43vKP)z!q2@CNCjeuOEB6rZJ@p;f~ zsU`XVwg@Sb$N(ZlorMC#ryy2NP)vQJ4DMY^H*-W5$Nc^nVvTuoT88e!A{nTO|46B} zM|BbQUFr*S-;F!EyLWW6*ZOpMlMMQJ>jAHiHL<`IULQ{kh2q%Pc%Z}QE4#npz>hMC z1M#R9gK)L|h)5h5hVs9US za5LP=N23L&uwX{l?EuO~LE5G=+tBXW9@^eRNzSnJlPw2or&`6wejaA6O!sT6^`9Zu zG{;56JIamoTXJK&d;v{fqh7;yU={sNmHD)S@M?| z_e-Sy84O+6(}PWB#l=Qgm?z&wwt9+pbL5Z+Rv`>y-5u>PavkVGE@BlA}Z#975G`k-;Xs$Z_D)o1C>j3U@ciEEG22=rbgwQ%{k$)Jc=8ItLtY!Iq(qV{3<_&|{AJ zd;ut;Aes2;z83lM(NY*Pp%kx zG~~b7rNwK-f8qiU3kDG>F8HZHz#2VQ|6+>zkjo9+A`sTu?Bc##kDjm*vo-!gp#x>yt^OvM%IION0(dkBQV>}uY{{K%O5snE2 zJR1^z-#*r7{&#&`ZFI6R=|n>ue0(2!2Q-rjXK#jcU0q8-oKSFBath?I_?Fb1x+nU4NX z`ns@AbVi*CV_W|xePyo);b}|}O<8?q9ZrAm&N}PB$Y1E}6LZLO3F0_BfWQWpwonKM znJ$nEtbd3Me=z%DM_ctfbWZZ>gmi$uYEN;5kYh+q>5=4^F#KVTt!0KOU~3rrD24og zamb;y=5?mPc02|<#El?r5p=;w3;U9$Jqco6*0dDdA5#xuP4KE(+_tSp$avJ~4{?#) z{`paOi)ZNYf^T9Of?;miVj^^kf79#t2Jbrj1>E|irj_xN(zHDfX&UiIPZBnYY4{9j zH=&IdVX$`C$;VatZ|S-=8X0NX&&cjuKZWDTtFg?}AG*4JpUM`&W>mHbHjNAPcYbtd zIJ`4@{?#Q_e@ZpNTRYh`?yGxNLMvH%tRxm%W=Hg?!8Yn}nt zXyf%@Nq}4L_w3+hw~Vax{L5}R;)#i%TW<1bBITB&o;ES>mYdP$oo+dSHebLfF-a?Y zup5S3MrLJ1JUR6o`5_*0%K}l|?{mx2Gsc?SvgWy*-Qt$Lo*nFKZrSg-jwjr5z%#<% z=$0d%LH;AR+~o0#Ubh_ejEQl#-0T??&v(lSwD~wcm{JRmudytran$>XI$9+x(>a%=wQ&rjjaBM9gi!Gew7{;t%- z$leiZ@LM|l|MvaJN21=m7fVHUtD*hv&p&~2sbG-v>I?Rv_4;>j^?1g|_Kxh`vpYGw zX}C^U6+2%l?n|oAN3+KBH&5Bb+Q_FijwwCLow*4b_LMuwR|67gl4#av;n%cLUc_hF z3L45Nm64mg;7Q|yllb6_`s5_8TdGAGaFfNAD(Y#P7tp3kzTT^IR&vRj9kP>)CA*p| zm&&z5x{}OiO2wpYRg>vrHd!r|3JduvS`#={@hTgk2|MxsoO(?auiXfaBkJ{wXkM+B z?R`6U&Y@Rn2OdW&XoW|G)hdlvSY{i!F&u3^`* z>)7?|26iL6iQUYe&2C{cEX`(FhGm(>=GZ*Tu{^t#EwBPxWJOkDWp*2@Fq>6bjh$di z>?B)ex3fFgbJ%m)o$PstMSDJb0kS5&kloE*#O`7DvKO9)VBv&Fn4gt?W_uHueYX?d%=wo$Oug-RwQ= zz3dO!W9)JEKK6e0N9+UakJ$&=huDYNN7zT%pRkXykF!s(Ct!2?B>NOrYW*qu4Erqm z9Q!=`0{bHS68kguW%d>JRrVzN8vDAZkNr9O2Kx*4P4<`UTkPBHuh@6kciH#YU$gJS zd;bIM#{0MIhwMk}@7Uk7AG3d8|H%G{{e=B9`xo|8_A{()`d9XE?BCfh*e}_CuwSwN zWdFr}&HkJHhSd@6Nnk+R=1T0~fMppRDXOp&Y5-_NmLkWcdq`9XdWKg197i}@w|Qhph~oFCy=@MrKV`7`-Zeic8) zkMpbfv-maqT7DhBp5MT4ge1@m7X>W#Sxy9%BJkRkwzm+fW0$=1sUgBkb z8?SKNbD!rWyvl3*1YhDO`7*zq-@%{5pUdy$&*Lln`TPYQAHR#gkl)Q;#P8wv@)z@$ z@R#!Y_{;dq`ThI>{tEs|{wn?;e>Hy%e=UEAKg?gpU(esb-^ky@AK|C?oB3P#Tlu5> zZTt`T+xa{AJNdi#yZL+gd-)&o$N1y?ef<6WkN5}pAM+3L5AhH4kMNK3Kj9zaALpOo zPw-X#N&YGRY5u4DGyJpsbNuuC3;c`xOZ?CHm-$!tSNW6tYy9i{&-pj_U+{18zvSQI z-{ybCzr(-FzsLWYf1jV`Kj44E|Caxd|A_w`|9k#p{tx^g`9JZW@PFq2!hgzt#(&QL zmH!+6cm50hOa34HSNuQufAL>q=YrqxIzJ;kf?;WcfTLHVjogJ#V8OHqAR91k&k`09 z(IleSST&AiLkZC$T1A^^7agKgbct@!Ba(2L_KAM6MGS~RF(ih?RDDV`@*#Ph`q#9iWr;%@OG zagVrHyjZ+Myj0vLUM5~H?iUY;SBO`NSBVG3tHo=?YsEw2VevZgdhrJFM)4-`h&UzQ zjGd(4DjpSY6MrDyF5V&DDc&XCE#4#EEB;VCCLR~>6Ym#)Bt9ViSbR`?NPJj)M0`~I ziTIfKxcG#4Lad5Uicg78i$4{g5uX*G6Q37f5MLBu5`QMXEWRSXDxMTy6JHm9F1{iD zLVQ#FrTCWkw)iXY9r0c9J@MD#`{K0tf%qHox8jH5N8<0q--{oMe-QsD{z?2q{ImEM z@l)|L@pJL7;@`x-i(iOeivJM568|awOZ-~=xA={yi!;(AndB0FQmG-Kst$LlA^kES zO&NqL5k^YxCK;768JEonL2Hq%vQ4(j4%sQYWVh^*N!cs=WWU@Z2jrj}lEZSV+$Oin z9Wo_H)9=TWUljq6v<$ig<^F4WioR$}QqVk};NFI`h<;C(6 zd8xciUM`QwE95iemGYVLsJu!ZlgH)N@>%j4d9A!oUN3KuH^N|ivwXI^Mb5~yoRt}w zm6n{7^D-y%@>aPZ3vy8wWl5IhZL%V5S(P<;LN3XZa#`Lk?~u=t&y{z|=gAfMeE9-- zmwchTTfRu%Bkz?jmM@VnmG{Y)$(PIf1uPA#S@)qF9pE!OOO z#%o*YN+ze}@Kcp`HC>T4+p5U9d|}a7&7~kB&0D;h)2W=dt6C;!Wfrt*e$lc6&b_H} zp=O(Ic`;wC*+#jvWK~k7xjC<$pD(5hB2&U>KuFgzg;HigR!ZrtFI!qF7EsXg#o5wH zS+TMuX)hNuK6+0oU8qXccCL_~_v7=jpuJ;-p&wX*lNN~V;x z^jY)^zoMF+m-uJP*-~l2M+XeRf>y5Ni&bwXy=Ya^lEgM#FJ!&>YPyim1gh4_YAR=u zqTyHNrF^!U^W)llF;%eUs-{!SSjDPU2{hmn(oGU`QjZtZw`5FaT zE~J;WavGC{*(;Uxxl)Cio2q%^L_Ntp(X3moOx46Zo~V?Z&IB7Lss{m@&r~K~$rLP8 z&1d68&3fZR0fKuHzO81Vzj&N;TOePYE4gKVrc$!)TsmK|#caChPgg3XB{hZtr>I`) zbIP@{d!6P~!(A22Yn?1ZHupiCE>|quj#?)(h4f;2!|UXHeh$!LrRM;*6-!vlmVtjM z8}OcsZ){(!*vKdDmLDjFGdf+ntlw-K@GS~|uQ>$Vi%gaVNUA6$T`LeXrCoHcsG!g@E>x!b(3eIn- z0L-f77p!WoQmW18j2h6gg6CTJh*`h}WIX#S%XZ#Q<<^TQ{GcuCFq2+xa0G`} zH~>V%GPB^e@`Db#MN`pq_k?IIAlzEeTmmAg zVjx=r+EkqC3Z?^004;pW^a0egq5xXeErDH8fn*)aM+fSASRrY;P|l^*mjpMQ*UAy+ zY!NSXa5}WH0w|zPix5yM`Ha((O*OT$L)`6DtsGEf-d3%=bHMw8CFvmST2U^RN=2O{ zv-}B5%+}^N4-p}hKU)H+S6te^l(Vb?7)`zcS^*YA-3r>}bOzne)vDEk6>iX+#+1~G zcrpxl)#cE9C7rFg{1n6o)MCB{*+k5xPXZG1g)9INavut!oL-Wd+AQQa9BeSb%rc|| zf!TqKbuurju;lr&X&^6P-Wk(!cFs_PyHu)V{i+02K!i&zQ za)twrnD@w9$sHk3_hR{`;H;UF0h8P$xm%vxS3JP=; z@9`5Mc90od1R_X)gpn)|9*yx`#CB&ZH9Hra%~z_qEMZW3!Gfqkk^;C)+7%i=E8I%r zPX20Xo=7kVywNBY_1U~L1+z7vQK4j8Sv;&v!Vx+e0M%Hq@GXD`1Cvx$vN|Cby@%v5 zA^_6P<;wxZT5Jn4L={{Q-B8a3r@@p~Qz!D)lA)A@St|_@)`FN1Xa#QtsAp=GhjFRUA!?B*JQF{hYohxPFSUHrCDzC9)BN@H@gAL8c?e*_phJ zkFo>mLLq-USfSI%E~CBaw0FAT-fV$%@alG|-66B}Gm&jGWb*hO4QmM)~y znGE1Tn+3LHn-s-JL8?&v82I3d%#Na{gOx+5vpT?jKpa2|m3nIt)}-uZ$XAPYKgsJ5 zm>o6&RoJ16DK*#7MTjxWEVPawb!+XqzW}^Cktg4XniLQgfb<&uC8fYjXS1Zsq(~iI zI{{i|9W-vN!m{^DA;Z)JRv+Ibf#?NZ!$Wdoig3mijsq;Xko*1Ng zC@IraZ&8)0+{Tj=&Fk-XSrw7rr`FPkB%ab%eM;;p)#_sa5RhX5!o>yZZ7Zb44K=P{ zg$pKFFVKBni8@iGMya77^^$IkI8~0msm5^LS_~B|Xeg>3RhiCdtxP8dDV|Ev4H15W zaKn^A7eX84TAYHVkRb0|S<|WLG~jBoq^tYN(3OCgRZR)welRAhpgzp+=mYA0XvSnq zA|#+E6FCKkLeZxPKMJM`k%}RLyxJB>YyrqrD1e?5^;kPMXG=>Mwt01ttXsBCvMb>x zWNs4tofFa@$QXbN3ux}PStu$Kky8)h2x_)!0(*#6bemVm?v#Z}M`A&6u2fooxiMcV z%&9jAawOU>r^-+|joWJZEEIVNG49L}voh5Pq<}}oyd4G=D?qDh^vXcNs?6st8y9y5L$ZPJiBT9I4PiR&ks#VCKm(Q9Ft(2<4=NuIkiTqA(F2VSa~9!F2GioF4zVvY8E)H4Qqw632G-(mGm-@G4}I$=5NHU~oy-W*lD*FAy35&YgU&NQlOc2=V{wqoUwSgitC zn}X$Z1y}$&iXk{@maS45$ORrzS@xIn^YbuSq>BsQN`7`079&U@RoDqED@%|riGuo- zuABm%EI@KETR~;+ND&=C6Vo|cES1+3>iZlQA-&%VwTKvYQAg-n>u+Zi$`ENOHoN+6^K6vH>oK?-q8 z5CMIv4y4j4*!h!wRioIvQ&(LoLE$Y`Qi{%H4OJ%j!fS!S7i@hFvN}FQ!Xz^9n@`&y zFN0JNVD5^Ybxz0{aOxDuxb0P$t{I>Q&RcZQ0t*s6ek+8*VD}X=!b4vT z1KX9F-uK2#&Rst&qkHm8t}RpS%aQW-ov+2V7!8D5p6RkUG+bdw~yDdXcoK5=k?2RzasA z6Cka(3X)W*>Pvtibi|8aB648PkeNyIhqj`nt6+;-nk@PTnf#SbZ_Zk`=P_^4HBP|l z2f+r=2z6424oEKrVJ{ZbU|+5g#?iZAXwEEDA@qh2@sh#)5CU9_A!wlmft-FY$siSE zoT4X1v-x?lBBm6}#h{jRS~h?C?aPsDB|S&-FAXJ`aAdYpTMW`61=$%yDqRe?&_@pn zDyD!JgS%(kGm?FX-oPRW+693Myx%G37pd%Um3;9;3CIysjocH6B4p)(febfpr2QdP zL-Z|O1=V++<_I%n=>N`mcoPwjkKpRYg|%~%q@MIRmLWiEOMQitl_0mFP>#sde}ds`Cc; zhsa){#4`m~%6x)QsXz`wkFrTy6+H*ctkz~V{8|O=R?;Hn0`yIg43eR!x2i;Ma~Paf zNW<#xS4Y*rbc)W$y7koDgq39;h)sMA0%SwH%&tqCN;LF3LZ=340rqa#eN(fb@e2_u zRRAair7*zQJ`flf=89D)?G^I1l%cP{#pM`es3kObf@K0egY`Em5=TD>yVdpFhV{?Vz&fEx-x((4fQ(5-WFHILHh%(8gPNa**8mzhunFcIi zmjK--q-IbvFrICT=RDcK#lawQ`RAF?6$plhrF4S;C&@5$g!4oiPfZ1T4AP$8bNeB+B z;yj*1I-n~UD13)0GBpReD`&wzZ=}m4p5P-T>|={WvaEn&tsstIvmjrv(CC3%*1X)@_mkP`CrDDMGB!EI?EtHo* zF_i(vF}^F`iC%)Hi1Cydg)&rM2tx2=)2No_piIrdBLw4D4lZCE6-@|&pDL!gNd78F zP3bxK)X)}A6<3A=n1KXVTp6ki?W9)b>8u1y=Cs*7M2jE@HHM2ADg5X%Lq^z!)aa15 zuzN~|G9q;(D?l;HqU#_mFep^g(M=WwK-Ni6Oyzz|DM6{>gd~etaIOYF38`@OFnu1e zk6@4xEEnyxH9Cptdt{Ke+H?zYIECS*|g#bEDYVJq@0>idRE^u%Jug<0+ z#u_j#q~}W@lYnr1I83UQd_Fag8TFpXV{p@rn1V%;nDI%eWx#jP6$ev_7CJ&9>^{&3 zfrSK9#VkzV6dM7s_d6;y8Sr5ffS)o2d%h#DWyeN!CBtPWMYc5W1+)TAL&P#Wf}VfSQVsBUEtTQCyMzrY`69TC?fnAK)oP5-I$vNJcO_xN);%31u%n0K?Wk) z7*Vng#uac#_zSaZnT+UW6*vU-TUo+&#ol56RB}9IbP&U=c>*YmPg7ztY~{slKoJW^ zcZ0G?W3&jYB5fABs5-^yQJ0}Zt8*&G+|g79D$<0~CxAAM5mv2zS;(Lu7ge9~^wj{} zWGBD}K}@vqND!TB4&fA*;=!I!ri;Nw0op^w@_|gj?gKHB zA|fE+LwbbX1Mg79cB6lQ*|2{syOIp~(8?A`6=gCWS$1r_m}-atUbr7Y6HO(cz;gi$ zeG&Ewm;t~TNaIvsMiY|N^O-yxLbjHNG*t2~<^f4XeX$12E>#WqnevKc2iHo3wLWx? zKo7f4GN_9BQm zERYKD&`PJ1#dOg}zhJ3Lpzc65uLHrv^9qQ~0$~K|!SjkQ(;#!haI9FBYm5lMGY>`% z4-#DJG_tlu_L3r)fZL)$yBp`;Or-|yEv)%@*n{DYhvZ#x6#qrodB7MQSrq78$$|m` zy-QV)2ZMA%(6KZOaLOm%cp#zz@C0Z+Tkt z3M)XWn9I(+vx;u`XEB0!C@>KWS`~{xc8q{3+tp=w`ydu+6gH1IFY;j1QzNbsPl*Op zK~}wL31)DFIt44hO1udHNC?}BDTnB~gOyr4Zd0euu`9-%R_l&dY8KsC>9lKBRT~|y z)X;fHqt9@Q#vK0#V}OF$0#EG%o#+kGn8okaRUG7Oo&h5SE@4{@E^7Cd~0Sa R-Q)Ro=L@j@Nd4~k{{Y?~eeVDO diff --git a/src/ui/shared/vendor/google/OpenSans-Bold.ttf b/src/ui/shared/vendor/google/OpenSans-Bold.ttf deleted file mode 100644 index 96fabd865df70de92f2a4bdc24d65306759fe726..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 103616 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 z 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 z

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

n{#NV($fZ=b2Ttd7 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�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 Lv7{_*LQnk1zZlrgRDjh{?=p_(BF9M+nn-P!% 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 U=0&&n0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,u,s,l,c,f,d,p,h,g,v,y,m,b,x="sizzle"+1*new Date,w=e.document,C=0,T=0,E=ae(),N=ae(),k=ae(),A=function(e,t){return e===t&&(f=!0),0},D={}.hasOwnProperty,S=[],L=S.pop,j=S.push,q=S.push,O=S.slice,P=function(e,t){for(var n=0,r=e.length;n+~]|"+I+")"+I+"*"),_=new RegExp("="+I+"*([^\\]'\"]*?)"+I+"*\\]","g"),U=new RegExp(M),V=new RegExp("^"+R+"$"),X={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+B),PSEUDO:new RegExp("^"+M),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+I+"*(even|odd|(([+-]|)(\\d*)n|)"+I+"*(?:([+-]|)"+I+"*(\\d+)|))"+I+"*\\)|)","i"),bool:new RegExp("^(?:"+H+")$","i"),needsContext:new RegExp("^"+I+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+I+"*((?:-\\d)?\\d*)"+I+"*\\)|)(?=[^-]|$)","i")},Q=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,G=/^[^{]+\{\s*\[native \w/,K=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,J=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+I+"?|("+I+")|.)","ig"),ee=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){d()},ie=me(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{q.apply(S=O.call(w.childNodes),w.childNodes),S[w.childNodes.length].nodeType}catch(e){q={apply:S.length?function(e,t){j.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function oe(e,t,r,i){var o,u,l,c,f,h,y,m=t&&t.ownerDocument,C=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==C&&9!==C&&11!==C)return r;if(!i&&((t?t.ownerDocument||t:w)!==p&&d(t),t=t||p,g)){if(11!==C&&(f=K.exec(e)))if(o=f[1]){if(9===C){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&b(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return q.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return q.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!k[e+" "]&&(!v||!v.test(e))){if(1!==C)m=t,y=e;else if("object"!==t.nodeName.toLowerCase()){(c=t.getAttribute("id"))?c=c.replace(te,ne):t.setAttribute("id",c=x),u=(h=a(e)).length;while(u--)h[u]="#"+c+" "+ye(h[u]);y=h.join(","),m=J.test(e)&&ge(t.parentNode)||t}if(y)try{return q.apply(r,m.querySelectorAll(y)),r}catch(e){}finally{c===x&&t.removeAttribute("id")}}}return s(e.replace($,"$1"),t,r,i)}function ae(){var e=[];function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}return t}function ue(e){return e[x]=!0,e}function se(e){var t=p.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function le(e,t){var n=e.split("|"),i=n.length;while(i--)r.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function de(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pe(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return ue(function(t){return t=+t,ue(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ge(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},d=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==p&&9===a.nodeType&&a.documentElement?(p=a,h=p.documentElement,g=!o(p),w!==p&&(i=p.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=se(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=se(function(e){return e.appendChild(p.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=G.test(p.getElementsByClassName),n.getById=se(function(e){return h.appendChild(e).id=x,!p.getElementsByName||!p.getElementsByName(x).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&g)return t.getElementsByClassName(e)},y=[],v=[],(n.qsa=G.test(p.querySelectorAll))&&(se(function(e){h.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+I+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+I+"*(?:value|"+H+")"),e.querySelectorAll("[id~="+x+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+x+"+*").length||v.push(".#.+[+~]")}),se(function(e){e.innerHTML="";var t=p.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+I+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(n.matchesSelector=G.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&se(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),y.push("!=",M)}),v=v.length&&new RegExp(v.join("|")),y=y.length&&new RegExp(y.join("|")),t=G.test(h.compareDocumentPosition),b=t||G.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===p||e.ownerDocument===w&&b(w,e)?-1:t===p||t.ownerDocument===w&&b(w,t)?1:c?P(c,e)-P(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],u=[t];if(!i||!o)return e===p?-1:t===p?1:i?-1:o?1:c?P(c,e)-P(c,t):0;if(i===o)return ce(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)u.unshift(n);while(a[r]===u[r])r++;return r?ce(a[r],u[r]):a[r]===w?-1:u[r]===w?1:0},p):p},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&d(e),t=t.replace(_,"='$1']"),n.matchesSelector&&g&&!k[t+" "]&&(!y||!y.test(t))&&(!v||!v.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,p,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==p&&d(e),b(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==p&&d(e);var i=r.attrHandle[t.toLowerCase()],o=i&&D.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(A),f){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:ue,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return X.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&U.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+I+")"+e+"("+I+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace(W," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),u="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,s){var l,c,f,d,p,h,g=o!==a?"nextSibling":"previousSibling",v=t.parentNode,y=u&&t.nodeName.toLowerCase(),m=!s&&!u,b=!1;if(v){if(o){while(g){d=t;while(d=d[g])if(u?d.nodeName.toLowerCase()===y:1===d.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?v.firstChild:v.lastChild],a&&m){b=(p=(l=(c=(f=(d=v)[x]||(d[x]={}))[d.uniqueID]||(f[d.uniqueID]={}))[e]||[])[0]===C&&l[1])&&l[2],d=p&&v.childNodes[p];while(d=++p&&d&&d[g]||(b=p=0)||h.pop())if(1===d.nodeType&&++b&&d===t){c[e]=[C,p,b];break}}else if(m&&(b=p=(l=(c=(f=(d=t)[x]||(d[x]={}))[d.uniqueID]||(f[d.uniqueID]={}))[e]||[])[0]===C&&l[1]),!1===b)while(d=++p&&d&&d[g]||(b=p=0)||h.pop())if((u?d.nodeName.toLowerCase()===y:1===d.nodeType)&&++b&&(m&&((c=(f=d[x]||(d[x]={}))[d.uniqueID]||(f[d.uniqueID]={}))[e]=[C,b]),d===t))break;return(b-=i)===r||b%r==0&&b/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[x]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?ue(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=P(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:ue(function(e){var t=[],n=[],r=u(e.replace($,"$1"));return r[x]?ue(function(e,t,n,i){var o,a=r(e,null,i,[]),u=e.length;while(u--)(o=a[u])&&(e[u]=!(t[u]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:ue(function(e){return function(t){return oe(e,t).length>0}}),contains:ue(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:ue(function(e){return V.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:pe(!1),disabled:pe(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xe(e,t,n){for(var r=0,i=t.length;r-1&&(o[l]=!(a[l]=f))}}else y=we(y===a?y.splice(h,y.length):y),i?i(null,a,y,s):q.apply(a,y)})}function Te(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],u=a||r.relative[" "],s=a?1:0,c=me(function(e){return e===t},u,!0),f=me(function(e){return P(t,e)>-1},u,!0),d=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];s1&&be(d),s>1&&ye(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),n,s0,i=e.length>0,o=function(o,a,u,s,c){var f,h,v,y=0,m="0",b=o&&[],x=[],w=l,T=o||i&&r.find.TAG("*",c),E=C+=null==w?1:Math.random()||.1,N=T.length;for(c&&(l=a===p||a||c);m!==N&&null!=(f=T[m]);m++){if(i&&f){h=0,a||f.ownerDocument===p||(d(f),u=!g);while(v=e[h++])if(v(f,a||p,u)){s.push(f);break}c&&(C=E)}n&&((f=!v&&f)&&y--,o&&b.push(f))}if(y+=m,n&&m!==y){h=0;while(v=t[h++])v(b,x,a,u);if(o){if(y>0)while(m--)b[m]||x[m]||(x[m]=L.call(s));x=we(x)}q.apply(s,x),c&&!o&&x.length>0&&y+t.length>1&&oe.uniqueSort(s)}return c&&(C=E,l=w),b};return n?ue(o):o}return u=oe.compile=function(e,t){var n,r=[],i=[],o=k[e+" "];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Te(t[n]))[x]?r.push(o):i.push(o);(o=k(e,Ee(i,r))).selector=e}return o},s=oe.select=function(e,t,n,i){var o,s,l,c,f,d="function"==typeof e&&e,p=!i&&a(e=d.selector||e);if(n=n||[],1===p.length){if((s=p[0]=p[0].slice(0)).length>2&&"ID"===(l=s[0]).type&&9===t.nodeType&&g&&r.relative[s[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;d&&(t=t.parentNode),e=e.slice(s.shift().value.length)}o=X.needsContext.test(e)?0:s.length;while(o--){if(l=s[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),J.test(s[0].type)&&ge(t.parentNode)||t))){if(s.splice(o,1),!(e=i.length&&ye(s)))return q.apply(n,i),n;break}}}return(d||u(e,p))(i,t,!g,n,!t||J.test(e)&&ge(t.parentNode)||t),n},n.sortStable=x.split("").sort(A).join("")===x,n.detectDuplicates=!!f,d(),n.sortDetached=se(function(e){return 1&e.compareDocumentPosition(p.createElement("fieldset"))}),se(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||le("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&se(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||le("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),se(function(e){return null==e.getAttribute("disabled")})||le(H,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);w.find=E,w.expr=E.selectors,w.expr[":"]=w.expr.pseudos,w.uniqueSort=w.unique=E.uniqueSort,w.text=E.getText,w.isXMLDoc=E.isXML,w.contains=E.contains,w.escapeSelector=E.escape;var N=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},k=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},A=w.expr.match.needsContext;function D(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var S=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function L(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):"string"!=typeof t?w.grep(e,function(e){return s.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(L(this,e||[],!1))},not:function(e){return this.pushStack(L(this,e||[],!0))},is:function(e){return!!L(this,"string"==typeof e&&A.test(e)?w(e):e||[],!1).length}});var j,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:q.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),S.test(i[1])&&w.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,j=w(r);var O=/^(?:parents|prev(?:Until|All))/,P={children:!0,contents:!0,next:!0,prev:!0};w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&w.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?w.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?s.call(w(e),this[0]):s.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function H(e,t){while((e=e[t])&&1!==e.nodeType);return e}w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return N(e,"parentNode")},parentsUntil:function(e,t,n){return N(e,"parentNode",n)},next:function(e){return H(e,"nextSibling")},prev:function(e){return H(e,"previousSibling")},nextAll:function(e){return N(e,"nextSibling")},prevAll:function(e){return N(e,"previousSibling")},nextUntil:function(e,t,n){return N(e,"nextSibling",n)},prevUntil:function(e,t,n){return N(e,"previousSibling",n)},siblings:function(e){return k((e.parentNode||{}).firstChild,e)},children:function(e){return k(e.firstChild)},contents:function(e){return D(e,"iframe")?e.contentDocument:(D(e,"template")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=w.filter(r,i)),this.length>1&&(P[e]||w.uniqueSort(i),O.test(e)&&i.reverse()),this.pushStack(i)}});var I=/[^\x20\t\r\n\f]+/g;function R(e){var t={};return w.each(e.match(I)||[],function(e,n){t[n]=!0}),t}w.Callbacks=function(e){e="string"==typeof e?R(e):w.extend({},e);var t,n,r,i,o=[],a=[],u=-1,s=function(){for(i=i||e.once,r=t=!0;a.length;u=-1){n=a.shift();while(++u-1)o.splice(n,1),n<=u&&u--}),this},has:function(e){return e?w.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||s()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function B(e){return e}function M(e){throw e}function W(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.extend({Deferred:function(t){var n=[["notify","progress",w.Callbacks("memory"),w.Callbacks("memory"),2],["resolve","done",w.Callbacks("once memory"),w.Callbacks("once memory"),0,"resolved"],["reject","fail",w.Callbacks("once memory"),w.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},"catch":function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(t){w.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var u=this,s=arguments,l=function(){var e,l;if(!(t=o&&(r!==M&&(u=void 0,s=[e]),n.rejectWith(u,s))}};t?c():(w.Deferred.getStackHook&&(c.stackTrace=w.Deferred.getStackHook()),e.setTimeout(c))}}return w.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:B,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:B)),n[2][3].add(a(0,e,g(r)?r:M))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],u=t[5];i[t[1]]=a.add,u&&a.add(function(){r=u},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=w.Deferred(),u=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&(W(e,a.done(u(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)W(i[n],u(n),a.reject);return a.promise()}});var $=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&$.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},w.readyException=function(t){e.setTimeout(function(){throw t})};var F=w.Deferred();w.fn.ready=function(e){return F.then(e)["catch"](function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||F.resolveWith(r,[w]))}}),w.ready.then=F.then;function z(){r.removeEventListener("DOMContentLoaded",z),e.removeEventListener("load",z),w.ready()}"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener("DOMContentLoaded",z),e.addEventListener("load",z));var _=function(e,t,n,r,i,o,a){var u=0,s=e.length,l=null==n;if("object"===b(n)){i=!0;for(u in n)_(e,t,u,n[u],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(w(e),n)})),t))for(;u1,null,!0)},removeData:function(e){return this.each(function(){J.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=K.get(e,t),n&&(!r||Array.isArray(n)?r=K.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=w.queue(e,t),r=n.length,i=n.shift(),o=w._queueHooks(e,t),a=function(){w.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return K.get(e,n)||K.access(e,n,{empty:w.Callbacks("once memory").add(function(){K.remove(e,[t+"queue",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&D(e,t)?w.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}!function(){var e=r.createDocumentFragment().appendChild(r.createElement("div")),t=r.createElement("input");t.setAttribute("type","radio"),t.setAttribute("checked","checked"),t.setAttribute("name","t"),e.appendChild(t),h.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var xe=r.documentElement,we=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Te=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function Ne(){return!1}function ke(){try{return r.activeElement}catch(e){}}function Ae(e,t,n,r,i,o){var a,u;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(u in t)Ae(e,u,n,r,t[u],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Ne;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,u,s,l,c,f,d,p,h,g,v=K.get(e);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(xe,i),n.guid||(n.guid=w.guid++),(s=v.events)||(s=v.events={}),(a=v.handle)||(a=v.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(I)||[""]).length;while(l--)p=g=(u=Te.exec(t[l])||[])[1],h=(u[2]||"").split(".").sort(),p&&(f=w.event.special[p]||{},p=(i?f.delegateType:f.bindType)||p,f=w.event.special[p]||{},c=w.extend({type:p,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(d=s[p])||((d=s[p]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(p,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?d.splice(d.delegateCount++,0,c):d.push(c),w.event.global[p]=!0)}},remove:function(e,t,n,r,i){var o,a,u,s,l,c,f,d,p,h,g,v=K.hasData(e)&&K.get(e);if(v&&(s=v.events)){l=(t=(t||"").match(I)||[""]).length;while(l--)if(u=Te.exec(t[l])||[],p=g=u[1],h=(u[2]||"").split(".").sort(),p){f=w.event.special[p]||{},d=s[p=(r?f.delegateType:f.bindType)||p]||[],u=u[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=d.length;while(o--)c=d[o],!i&&g!==c.origType||n&&n.guid!==c.guid||u&&!u.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(d.splice(o,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(e,c));a&&!d.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||w.removeEvent(e,p,v.handle),delete s[p])}else for(p in s)w.event.remove(e,p+t[l],n,r,!0);w.isEmptyObject(s)&&K.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,u,s=new Array(arguments.length),l=(K.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(s[0]=t,n=1;n=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&u.push({elem:l,handlers:o})}return l=this,s\x20\t\r\n\f]*)[^>]*)\/>/gi,Se=/\s*$/g;function qe(e,t){return D(e,"table")&&D(11!==t.nodeType?t:t.firstChild,"tr")?w(e).children("tbody")[0]||e:e}function Oe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Pe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function He(e,t){var n,r,i,o,a,u,s,l;if(1===t.nodeType){if(K.hasData(e)&&(o=K.access(e),a=K.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n1&&"string"==typeof v&&!h.checkClone&&Le.test(v))return e.each(function(i){var o=e.eq(i);y&&(t[0]=v.call(this,i,o.html())),Re(o,t,n,r)});if(d&&(i=be(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(s=(u=w.map(ve(i,"script"),Oe)).length;f")},clone:function(e,t,n){var r,i,o,a,u=e.cloneNode(!0),s=w.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(a=ve(u),r=0,i=(o=ve(e)).length;r0&&ye(a,!s&&ve(e,"script")),u},cleanData:function(e){for(var t,n,r,i=w.event.special,o=0;void 0!==(n=e[o]);o++)if(Y(n)){if(t=n[K.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[K.expando]=void 0}n[J.expando]&&(n[J.expando]=void 0)}}}),w.fn.extend({detach:function(e){return Be(this,e,!0)},remove:function(e){return Be(this,e)},text:function(e){return _(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||qe(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=qe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return _(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Se.test(e)&&!ge[(pe.exec(e)||["",""])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n=0&&(s+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-s-u-.5))),s}function et(e,t,n){var r=We(e),i=Fe(e,t,r),o="border-box"===w.css(e,"boxSizing",!1,r),a=o;if(Me.test(i)){if(!n)return i;i="auto"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===w.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?"border":"content"),a,r,i)+"px"}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,u=Q(t),s=Ue.test(t),l=e.style;if(s||(t=Ke(u)),a=w.cssHooks[t]||w.cssHooks[u],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(w.cssNumber[u]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(s?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,u=Q(t);return Ue.test(t)||(t=Ke(u)),(a=w.cssHooks[t]||w.cssHooks[u])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),"normal"===i&&t in Xe&&(i=Xe[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),w.each(["height","width"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!_e.test(w.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):ue(e,Ve,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=We(e),a="border-box"===w.css(e,"boxSizing",!1,o),u=r&&Ze(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(u-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,"border",!1,o)-.5)),u&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=w.css(e,t)),Je(e,n,u)}}}),w.cssHooks.marginLeft=ze(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,"marginLeft"))||e.getBoundingClientRect().left-ue(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),w.each({margin:"",padding:"",border:"Width"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(w.cssHooks[e+t].set=Je)}),w.fn.extend({css:function(e,t){return _(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=We(e),i=t.length;a1)}}),w.fn.delay=function(t,n){return t=w.fx?w.fx.speeds[t]||t:t,n=n||"fx",this.queue(n,function(n,r){var i=e.setTimeout(n,t);r.stop=function(){e.clearTimeout(i)}})},function(){var e=r.createElement("input"),t=r.createElement("select").appendChild(r.createElement("option"));e.type="checkbox",h.checkOn=""!==e.value,h.optSelected=t.selected,(e=r.createElement("input")).value="t",e.type="radio",h.radioValue="t"===e.value}();var tt,nt=w.expr.attrHandle;w.fn.extend({attr:function(e,t){return _(this,w.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?w.prop(e,t,n):(1===o&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?tt:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&"radio"===t&&D(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(I);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),tt={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\w+/g),function(e,t){var n=nt[t]||w.find.attr;nt[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=nt[a],nt[a]=i,i=null!=n(e,t,r)?a:null,nt[a]=o),i}});var rt=/^(?:input|select|textarea|button)$/i,it=/^(?:a|area)$/i;w.fn.extend({prop:function(e,t){return _(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,"tabindex");return t?parseInt(t,10):rt.test(e.nodeName)||it.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),h.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){w.propFix[this.toLowerCase()]=this});function ot(e){return(e.match(I)||[]).join(" ")}function at(e){return e.getAttribute&&e.getAttribute("class")||""}function ut(e){return Array.isArray(e)?e:"string"==typeof e?e.match(I)||[]:[]}w.fn.extend({addClass:function(e){var t,n,r,i,o,a,u,s=0;if(g(e))return this.each(function(t){w(this).addClass(e.call(this,t,at(this)))});if((t=ut(e)).length)while(n=this[s++])if(i=at(n),r=1===n.nodeType&&" "+ot(i)+" "){a=0;while(o=t[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(u=ot(r))&&n.setAttribute("class",u)}return this},removeClass:function(e){var t,n,r,i,o,a,u,s=0;if(g(e))return this.each(function(t){w(this).removeClass(e.call(this,t,at(this)))});if(!arguments.length)return this.attr("class","");if((t=ut(e)).length)while(n=this[s++])if(i=at(n),r=1===n.nodeType&&" "+ot(i)+" "){a=0;while(o=t[a++])while(r.indexOf(" "+o+" ")>-1)r=r.replace(" "+o+" "," ");i!==(u=ot(r))&&n.setAttribute("class",u)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,at(this),t),t)}):this.each(function(){var t,i,o,a;if(r){i=0,o=w(this),a=ut(e);while(t=a[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else void 0!==e&&"boolean"!==n||((t=at(this))&&K.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":K.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&(" "+ot(at(n))+" ").indexOf(t)>-1)return!0;return!1}});var st=/\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?"":e+""})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(st,""):null==n?"":n}}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,"value");return null!=t?t:ot(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,u=a?null:[],s=a?o+1:i.length;for(r=o<0?s:a?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),w.each(["radio","checkbox"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},h.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),h.focusin="onfocusin"in e;var lt=/^(?:focusinfocus|focusoutblur)$/,ct=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(t,n,i,o){var a,u,s,l,c,d,p,h,y=[i||r],m=f.call(t,"type")?t.type:t,b=f.call(t,"namespace")?t.namespace.split("."):[];if(u=h=s=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!lt.test(m+w.event.triggered)&&(m.indexOf(".")>-1&&(m=(b=m.split(".")).shift(),b.sort()),c=m.indexOf(":")<0&&"on"+m,t=t[w.expando]?t:new w.Event(m,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=b.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+b.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:w.makeArray(n,[t]),p=w.event.special[m]||{},o||!p.trigger||!1!==p.trigger.apply(i,n))){if(!o&&!p.noBubble&&!v(i)){for(l=p.delegateType||m,lt.test(l+m)||(u=u.parentNode);u;u=u.parentNode)y.push(u),s=u;s===(i.ownerDocument||r)&&y.push(s.defaultView||s.parentWindow||e)}a=0;while((u=y[a++])&&!t.isPropagationStopped())h=u,t.type=a>1?l:p.bindType||m,(d=(K.get(u,"events")||{})[t.type]&&K.get(u,"handle"))&&d.apply(u,n),(d=c&&u[c])&&d.apply&&Y(u)&&(t.result=d.apply(u,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||p._default&&!1!==p._default.apply(y.pop(),n)||!Y(i)||c&&g(i[m])&&!v(i)&&((s=i[c])&&(i[c]=null),w.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,ct),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,ct),w.event.triggered=void 0,s&&(i[c]=s)),t.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),h.focusin||w.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=K.access(r,t);i||r.addEventListener(e,n,!0),K.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=K.access(r,t)-1;i?K.access(r,t,i):(r.removeEventListener(e,n,!0),K.remove(r,t))}}});var ft=/\[\]$/,dt=/\r?\n/g,pt=/^(?:submit|button|image|reset|file)$/i,ht=/^(?:input|select|textarea|keygen)/i;function gt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||ft.test(e)?r(e,i):gt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==b(t))r(e,t);else for(i in t)gt(e+"["+i+"]",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)gt(n,e[n],t,i);return r.join("&")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,"elements");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(":disabled")&&ht.test(this.nodeName)&&!pt.test(e)&&(this.checked||!de.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(dt,"\r\n")}}):{name:t.name,value:n.replace(dt,"\r\n")}}).get()}}),w.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},h.createHTMLDocument=function(){var e=r.implementation.createHTMLDocument("").body;return e.innerHTML="

",2===e.childNodes.length}(),w.parseHTML=function(e,t,n){if("string"!=typeof e)return[];"boolean"==typeof t&&(n=t,t=!1);var i,o,a;return t||(h.createHTMLDocument?((i=(t=r.implementation.createHTMLDocument("")).createElement("base")).href=r.location.href,t.head.appendChild(i)):t=r),o=S.exec(e),a=!n&&[],o?[t.createElement(o[1])]:(o=be([e],t,a),a&&a.length&&w(a).remove(),w.merge([],o.childNodes))},w.offset={setOffset:function(e,t,n){var r,i,o,a,u,s,l,c=w.css(e,"position"),f=w(e),d={};"static"===c&&(e.style.position="relative"),u=f.offset(),o=w.css(e,"top"),s=w.css(e,"left"),(l=("absolute"===c||"fixed"===c)&&(o+s).indexOf("auto")>-1)?(a=(r=f.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(s)||0),g(t)&&(t=t.call(e,n,w.extend({},u))),null!=t.top&&(d.top=t.top-u.top+a),null!=t.left&&(d.left=t.left-u.left+i),"using"in t?t.using.call(e,d):f.css(d)}},w.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){w.offset.setOffset(this,e,t)});var t,n,r=this[0];if(r)return r.getClientRects().length?(t=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:t.top+n.pageYOffset,left:t.left+n.pageXOffset}):{top:0,left:0}},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===w.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===w.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=w(e).offset()).top+=w.css(e,"borderTopWidth",!0),i.left+=w.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-w.css(r,"marginTop",!0),left:t.left-i.left-w.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===w.css(e,"position"))e=e.offsetParent;return e||xe})}}),w.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n="pageYOffset"===t;w.fn[e]=function(r){return _(this,function(e,r,i){var o;if(v(e)?o=e:9===e.nodeType&&(o=e.defaultView),void 0===i)return o?o[t]:e[r];o?o.scrollTo(n?o.pageXOffset:i,n?i:o.pageYOffset):e[r]=i},e,r,arguments.length)}}),w.each(["top","left"],function(e,t){w.cssHooks[t]=ze(h.pixelPosition,function(e,n){if(n)return n=Fe(e,t),Me.test(n)?w(e).position()[t]+"px":n})}),w.each({Height:"height",Width:"width"},function(e,t){w.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){w.fn[r]=function(i,o){var a=arguments.length&&(n||"boolean"!=typeof i),u=n||(!0===i||!0===o?"margin":"border");return _(this,function(t,n,i){var o;return v(t)?0===r.indexOf("outer")?t["inner"+e]:t.document.documentElement["client"+e]:9===t.nodeType?(o=t.documentElement,Math.max(t.body["scroll"+e],o["scroll"+e],t.body["offset"+e],o["offset"+e],o["client"+e])):void 0===i?w.css(t,n,u):w.style(t,n,i,u)},t,a?i:void 0,a)}})}),w.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,t){w.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),w.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),w.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),w.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),g(e))return r=o.call(arguments,2),i=function(){return e.apply(t||this,r.concat(o.call(arguments)))},i.guid=e.guid=e.guid||w.guid++,i},w.holdReady=function(e){e?w.readyWait++:w.ready(!0)},w.isArray=Array.isArray,w.parseJSON=JSON.parse,w.nodeName=D,w.isFunction=g,w.isWindow=v,w.camelCase=Q,w.type=b,w.now=Date.now,w.isNumeric=function(e){var t=w.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},"function"==typeof define&&define.amd&&define("jquery",[],function(){return w});var vt=e.jQuery,yt=e.$;return w.noConflict=function(t){return e.$===w&&(e.$=yt),t&&e.jQuery===w&&(e.jQuery=vt),w},t||(e.jQuery=e.$=w),w}); diff --git a/src/ui/shared/vendor/lodash/lodash.min.js b/src/ui/shared/vendor/lodash/lodash.min.js deleted file mode 100644 index c9112634..00000000 --- a/src/ui/shared/vendor/lodash/lodash.min.js +++ /dev/null @@ -1,137 +0,0 @@ -/** - * @license - * Lodash lodash.com/license | Underscore.js 1.8.3 underscorejs.org/LICENSE - */ -;(function(){function n(n,t,r){switch(r.length){case 0:return n.call(t);case 1:return n.call(t,r[0]);case 2:return n.call(t,r[0],r[1]);case 3:return n.call(t,r[0],r[1],r[2])}return n.apply(t,r)}function t(n,t,r,e){for(var u=-1,i=null==n?0:n.length;++u"']/g,G=RegExp(V.source),H=RegExp(K.source),J=/<%-([\s\S]+?)%>/g,Y=/<%([\s\S]+?)%>/g,Q=/<%=([\s\S]+?)%>/g,X=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,nn=/^\w*$/,tn=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,rn=/[\\^$.*+?()[\]{}|]/g,en=RegExp(rn.source),un=/^\s+|\s+$/g,on=/^\s+/,fn=/\s+$/,cn=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,an=/\{\n\/\* \[wrapped with (.+)\] \*/,ln=/,? & /,sn=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,hn=/\\(\\)?/g,pn=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,_n=/\w*$/,vn=/^[-+]0x[0-9a-f]+$/i,gn=/^0b[01]+$/i,dn=/^\[object .+?Constructor\]$/,yn=/^0o[0-7]+$/i,bn=/^(?:0|[1-9]\d*)$/,xn=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,jn=/($^)/,wn=/['\n\r\u2028\u2029\\]/g,mn="[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?(?:\\u200d(?:[^\\ud800-\\udfff]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?)*",An="(?:[\\u2700-\\u27bf]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])"+mn,kn="(?:[^\\ud800-\\udfff][\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]?|[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\ud800-\\udfff])",En=RegExp("['\u2019]","g"),Sn=RegExp("[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]","g"),On=RegExp("\\ud83c[\\udffb-\\udfff](?=\\ud83c[\\udffb-\\udfff])|"+kn+mn,"g"),In=RegExp(["[A-Z\\xc0-\\xd6\\xd8-\\xde]?[a-z\\xdf-\\xf6\\xf8-\\xff]+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?=[\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000]|[A-Z\\xc0-\\xd6\\xd8-\\xde]|$)|(?:[A-Z\\xc0-\\xd6\\xd8-\\xde]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?=[\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000]|[A-Z\\xc0-\\xd6\\xd8-\\xde](?:[a-z\\xdf-\\xf6\\xf8-\\xff]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])|$)|[A-Z\\xc0-\\xd6\\xd8-\\xde]?(?:[a-z\\xdf-\\xf6\\xf8-\\xff]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+(?:['\u2019](?:d|ll|m|re|s|t|ve))?|[A-Z\\xc0-\\xd6\\xd8-\\xde]+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?|\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])|\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])|\\d+",An].join("|"),"g"),Rn=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]"),zn=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Wn="Array Buffer DataView Date Error Float32Array Float64Array Function Int8Array Int16Array Int32Array Map Math Object Promise RegExp Set String Symbol TypeError Uint8Array Uint8ClampedArray Uint16Array Uint32Array WeakMap _ clearTimeout isFinite parseInt setTimeout".split(" "),Un={}; -Un["[object Float32Array]"]=Un["[object Float64Array]"]=Un["[object Int8Array]"]=Un["[object Int16Array]"]=Un["[object Int32Array]"]=Un["[object Uint8Array]"]=Un["[object Uint8ClampedArray]"]=Un["[object Uint16Array]"]=Un["[object Uint32Array]"]=true,Un["[object Arguments]"]=Un["[object Array]"]=Un["[object ArrayBuffer]"]=Un["[object Boolean]"]=Un["[object DataView]"]=Un["[object Date]"]=Un["[object Error]"]=Un["[object Function]"]=Un["[object Map]"]=Un["[object Number]"]=Un["[object Object]"]=Un["[object RegExp]"]=Un["[object Set]"]=Un["[object String]"]=Un["[object WeakMap]"]=false; -var Bn={};Bn["[object Arguments]"]=Bn["[object Array]"]=Bn["[object ArrayBuffer]"]=Bn["[object DataView]"]=Bn["[object Boolean]"]=Bn["[object Date]"]=Bn["[object Float32Array]"]=Bn["[object Float64Array]"]=Bn["[object Int8Array]"]=Bn["[object Int16Array]"]=Bn["[object Int32Array]"]=Bn["[object Map]"]=Bn["[object Number]"]=Bn["[object Object]"]=Bn["[object RegExp]"]=Bn["[object Set]"]=Bn["[object String]"]=Bn["[object Symbol]"]=Bn["[object Uint8Array]"]=Bn["[object Uint8ClampedArray]"]=Bn["[object Uint16Array]"]=Bn["[object Uint32Array]"]=true, -Bn["[object Error]"]=Bn["[object Function]"]=Bn["[object WeakMap]"]=false;var Ln={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Cn=parseFloat,Dn=parseInt,Mn=typeof global=="object"&&global&&global.Object===Object&&global,Tn=typeof self=="object"&&self&&self.Object===Object&&self,$n=Mn||Tn||Function("return this")(),Fn=typeof exports=="object"&&exports&&!exports.nodeType&&exports,Nn=Fn&&typeof module=="object"&&module&&!module.nodeType&&module,Pn=Nn&&Nn.exports===Fn,Zn=Pn&&Mn.process,qn=function(){ -try{var n=Nn&&Nn.require&&Nn.require("util").types;return n?n:Zn&&Zn.binding&&Zn.binding("util")}catch(n){}}(),Vn=qn&&qn.isArrayBuffer,Kn=qn&&qn.isDate,Gn=qn&&qn.isMap,Hn=qn&&qn.isRegExp,Jn=qn&&qn.isSet,Yn=qn&&qn.isTypedArray,Qn=b("length"),Xn=x({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e", -"\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a", -"\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I", -"\u0129":"i","\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r", -"\u0159":"r","\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ", -"\u0133":"ij","\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"}),nt=x({"&":"&","<":"<",">":">",'"':""","'":"'"}),tt=x({"&":"&","<":"<",">":">",""":'"',"'":"'"}),rt=function x(mn){function An(n){if(yu(n)&&!ff(n)&&!(n instanceof Ln)){if(n instanceof On)return n;if(oi.call(n,"__wrapped__"))return Fe(n)}return new On(n)}function kn(){}function On(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=T}function Ln(n){ -this.__wrapped__=n,this.__actions__=[],this.__dir__=1,this.__filtered__=false,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Mn(n){var t=-1,r=null==n?0:n.length;for(this.clear();++t=t?n:t)),n}function _t(n,t,e,u,i,o){var f,c=1&t,a=2&t,l=4&t;if(e&&(f=i?e(n,u,i,o):e(n)),f!==T)return f;if(!du(n))return n;if(u=ff(n)){if(f=me(n),!c)return Lr(n,f)}else{var s=vo(n),h="[object Function]"==s||"[object GeneratorFunction]"==s;if(af(n))return Ir(n,c);if("[object Object]"==s||"[object Arguments]"==s||h&&!i){if(f=a||h?{}:Ae(n),!c)return a?Mr(n,lt(f,n)):Dr(n,at(f,n))}else{if(!Bn[s])return i?n:{};f=ke(n,s,c)}}if(o||(o=new Zn), -i=o.get(n))return i;if(o.set(n,f),pf(n))return n.forEach(function(r){f.add(_t(r,t,e,r,n,o))}),f;if(sf(n))return n.forEach(function(r,u){f.set(u,_t(r,t,e,u,n,o))}),f;var a=l?a?ve:_e:a?Uu:Wu,p=u?T:a(n);return r(p||n,function(r,u){p&&(u=r,r=n[u]),ot(f,u,_t(r,t,e,u,n,o))}),f}function vt(n){var t=Wu(n);return function(r){return gt(r,n,t)}}function gt(n,t,r){var e=r.length;if(null==n)return!e;for(n=Qu(n);e--;){var u=r[e],i=t[u],o=n[u];if(o===T&&!(u in n)||!i(o))return false}return true}function dt(n,t,r){if(typeof n!="function")throw new ti("Expected a function"); -return bo(function(){n.apply(T,r)},t)}function yt(n,t,r,e){var u=-1,i=o,a=true,l=n.length,s=[],h=t.length;if(!l)return s;r&&(t=c(t,E(r))),e?(i=f,a=false):200<=t.length&&(i=O,a=false,t=new Nn(t));n:for(;++ut}function Rt(n,t){return null!=n&&oi.call(n,t)}function zt(n,t){return null!=n&&t in Qu(n)}function Wt(n,t,r){for(var e=r?f:o,u=n[0].length,i=n.length,a=i,l=Ku(i),s=1/0,h=[];a--;){var p=n[a];a&&t&&(p=c(p,E(t))),s=Ci(p.length,s), -l[a]=!r&&(t||120<=u&&120<=p.length)?new Nn(a&&p):T}var p=n[0],_=-1,v=l[0];n:for(;++_r.length?t:Et(t,hr(r,0,-1)),r=null==t?t:t[Me(Ve(r))],null==r?T:n(r,t,e)}function Lt(n){return yu(n)&&"[object Arguments]"==Ot(n)}function Ct(n){ -return yu(n)&&"[object ArrayBuffer]"==Ot(n)}function Dt(n){return yu(n)&&"[object Date]"==Ot(n)}function Mt(n,t,r,e,u){if(n===t)return true;if(null==n||null==t||!yu(n)&&!yu(t))return n!==n&&t!==t;n:{var i=ff(n),o=ff(t),f=i?"[object Array]":vo(n),c=o?"[object Array]":vo(t),f="[object Arguments]"==f?"[object Object]":f,c="[object Arguments]"==c?"[object Object]":c,a="[object Object]"==f,o="[object Object]"==c;if((c=f==c)&&af(n)){if(!af(t)){t=false;break n}i=true,a=false}if(c&&!a)u||(u=new Zn),t=i||_f(n)?se(n,t,r,e,Mt,u):he(n,t,f,r,e,Mt,u);else{ -if(!(1&r)&&(i=a&&oi.call(n,"__wrapped__"),f=o&&oi.call(t,"__wrapped__"),i||f)){n=i?n.value():n,t=f?t.value():t,u||(u=new Zn),t=Mt(n,t,r,e,u);break n}if(c)t:if(u||(u=new Zn),i=1&r,f=_e(n),o=f.length,c=_e(t).length,o==c||i){for(a=o;a--;){var l=f[a];if(!(i?l in t:oi.call(t,l))){t=false;break t}}if((c=u.get(n))&&u.get(t))t=c==t;else{c=true,u.set(n,t),u.set(t,n);for(var s=i;++at?r:0,Se(t,r)?n[t]:T}function Xt(n,t,r){var e=-1;return t=c(t.length?t:[$u],E(ye())),n=Gt(n,function(n,r,u){return{a:c(t,function(t){return t(n)}), -b:++e,c:n}}),w(n,function(n,t){var e;n:{e=-1;for(var u=n.a,i=t.a,o=u.length,f=r.length;++e=f){e=c;break n}e=c*("desc"==r[e]?-1:1);break n}}e=n.b-t.b}return e})}function nr(n,t){return tr(n,t,function(t,r){return zu(n,r)})}function tr(n,t,r){for(var e=-1,u=t.length,i={};++et||9007199254740991t&&(t=-t>u?0:u+t),r=r>u?u:r,0>r&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0,r=Ku(u);++e=u){for(;e>>1,o=n[i];null!==o&&!wu(o)&&(r?o<=t:ot.length?n:Et(n,hr(t,0,-1)),null==n||delete n[Me(Ve(t))]}function jr(n,t,r,e){for(var u=n.length,i=e?u:-1;(e?i--:++ie)return e?br(n[0]):[];for(var u=-1,i=Ku(e);++u=e?n:hr(n,t,r)}function Ir(n,t){if(t)return n.slice();var r=n.length,r=gi?gi(r):new n.constructor(r);return n.copy(r),r}function Rr(n){var t=new n.constructor(n.byteLength);return new vi(t).set(new vi(n)),t}function zr(n,t){return new n.constructor(t?Rr(n.buffer):n.buffer,n.byteOffset,n.length); -}function Wr(n,t){if(n!==t){var r=n!==T,e=null===n,u=n===n,i=wu(n),o=t!==T,f=null===t,c=t===t,a=wu(t);if(!f&&!a&&!i&&n>t||i&&o&&c&&!f&&!a||e&&o&&c||!r&&c||!u)return 1;if(!e&&!i&&!a&&nu?T:i,u=1),t=Qu(t);++eo&&f[0]!==a&&f[o-1]!==a?[]:B(f,a),o-=c.length,or?r?or(t,n):t:(r=or(t,Oi(n/D(t))),Rn.test(t)?Or(M(r),0,n).join(""):r.slice(0,n))}function te(t,r,e,u){function i(){for(var r=-1,c=arguments.length,a=-1,l=u.length,s=Ku(l+c),h=this&&this!==$n&&this instanceof i?f:t;++at||e)&&(1&n&&(i[2]=h[2],t|=1&r?0:4),(r=h[3])&&(e=i[3],i[3]=e?Ur(e,r,h[4]):r,i[4]=e?B(i[3],"__lodash_placeholder__"):h[4]),(r=h[5])&&(e=i[5],i[5]=e?Br(e,r,h[6]):r,i[6]=e?B(i[5],"__lodash_placeholder__"):h[6]),(r=h[7])&&(i[7]=r),128&n&&(i[8]=null==i[8]?h[8]:Ci(i[8],h[8])),null==i[9]&&(i[9]=h[9]),i[0]=h[0],i[1]=t),n=i[0],t=i[1], -r=i[2],e=i[3],u=i[4],f=i[9]=i[9]===T?c?0:n.length:Li(i[9]-a,0),!f&&24&t&&(t&=-25),c=t&&1!=t?8==t||16==t?Kr(n,t,f):32!=t&&33!=t||u.length?Jr.apply(T,i):te(n,t,r,e):Pr(n,t,r),Le((h?co:yo)(c,i),n,t)}function ce(n,t,r,e){return n===T||lu(n,ei[r])&&!oi.call(e,r)?t:n}function ae(n,t,r,e,u,i){return du(n)&&du(t)&&(i.set(t,n),Yt(n,t,T,ae,i),i.delete(t)),n}function le(n){return xu(n)?T:n}function se(n,t,r,e,u,i){var o=1&r,f=n.length,c=t.length;if(f!=c&&!(o&&c>f))return false;if((c=i.get(n))&&i.get(t))return c==t; -var c=-1,a=true,l=2&r?new Nn:T;for(i.set(n,t),i.set(t,n);++cr&&(r=Li(e+r,0)),_(n,ye(t,3),r)):-1}function Pe(n,t,r){var e=null==n?0:n.length;if(!e)return-1;var u=e-1;return r!==T&&(u=ku(r),u=0>r?Li(e+u,0):Ci(u,e-1)),_(n,ye(t,3),u,true)}function Ze(n){return(null==n?0:n.length)?wt(n,1):[]; -}function qe(n){return n&&n.length?n[0]:T}function Ve(n){var t=null==n?0:n.length;return t?n[t-1]:T}function Ke(n,t){return n&&n.length&&t&&t.length?er(n,t):n}function Ge(n){return null==n?n:$i.call(n)}function He(n){if(!n||!n.length)return[];var t=0;return n=i(n,function(n){if(hu(n))return t=Li(n.length,t),true}),A(t,function(t){return c(n,b(t))})}function Je(t,r){if(!t||!t.length)return[];var e=He(t);return null==r?e:c(e,function(t){return n(r,T,t)})}function Ye(n){return n=An(n),n.__chain__=true,n; -}function Qe(n,t){return t(n)}function Xe(){return this}function nu(n,t){return(ff(n)?r:uo)(n,ye(t,3))}function tu(n,t){return(ff(n)?e:io)(n,ye(t,3))}function ru(n,t){return(ff(n)?c:Gt)(n,ye(t,3))}function eu(n,t,r){return t=r?T:t,t=n&&null==t?n.length:t,fe(n,128,T,T,T,T,t)}function uu(n,t){var r;if(typeof t!="function")throw new ti("Expected a function");return n=ku(n),function(){return 0<--n&&(r=t.apply(this,arguments)),1>=n&&(t=T),r}}function iu(n,t,r){return t=r?T:t,n=fe(n,8,T,T,T,T,T,t),n.placeholder=iu.placeholder, -n}function ou(n,t,r){return t=r?T:t,n=fe(n,16,T,T,T,T,T,t),n.placeholder=ou.placeholder,n}function fu(n,t,r){function e(t){var r=c,e=a;return c=a=T,_=t,s=n.apply(e,r)}function u(n){var r=n-p;return n-=_,p===T||r>=t||0>r||g&&n>=l}function i(){var n=Go();if(u(n))return o(n);var r,e=bo;r=n-_,n=t-(n-p),r=g?Ci(n,l-r):n,h=e(i,r)}function o(n){return h=T,d&&c?e(n):(c=a=T,s)}function f(){var n=Go(),r=u(n);if(c=arguments,a=this,p=n,r){if(h===T)return _=n=p,h=bo(i,t),v?e(n):s;if(g)return h=bo(i,t),e(p)}return h===T&&(h=bo(i,t)), -s}var c,a,l,s,h,p,_=0,v=false,g=false,d=true;if(typeof n!="function")throw new ti("Expected a function");return t=Su(t)||0,du(r)&&(v=!!r.leading,l=(g="maxWait"in r)?Li(Su(r.maxWait)||0,t):l,d="trailing"in r?!!r.trailing:d),f.cancel=function(){h!==T&&lo(h),_=0,c=p=a=h=T},f.flush=function(){return h===T?s:o(Go())},f}function cu(n,t){if(typeof n!="function"||null!=t&&typeof t!="function")throw new ti("Expected a function");var r=function(){var e=arguments,u=t?t.apply(this,e):e[0],i=r.cache;return i.has(u)?i.get(u):(e=n.apply(this,e), -r.cache=i.set(u,e)||i,e)};return r.cache=new(cu.Cache||Fn),r}function au(n){if(typeof n!="function")throw new ti("Expected a function");return function(){var t=arguments;switch(t.length){case 0:return!n.call(this);case 1:return!n.call(this,t[0]);case 2:return!n.call(this,t[0],t[1]);case 3:return!n.call(this,t[0],t[1],t[2])}return!n.apply(this,t)}}function lu(n,t){return n===t||n!==n&&t!==t}function su(n){return null!=n&&gu(n.length)&&!_u(n)}function hu(n){return yu(n)&&su(n)}function pu(n){if(!yu(n))return false; -var t=Ot(n);return"[object Error]"==t||"[object DOMException]"==t||typeof n.message=="string"&&typeof n.name=="string"&&!xu(n)}function _u(n){return!!du(n)&&(n=Ot(n),"[object Function]"==n||"[object GeneratorFunction]"==n||"[object AsyncFunction]"==n||"[object Proxy]"==n)}function vu(n){return typeof n=="number"&&n==ku(n)}function gu(n){return typeof n=="number"&&-1=n}function du(n){var t=typeof n;return null!=n&&("object"==t||"function"==t)}function yu(n){return null!=n&&typeof n=="object"; -}function bu(n){return typeof n=="number"||yu(n)&&"[object Number]"==Ot(n)}function xu(n){return!(!yu(n)||"[object Object]"!=Ot(n))&&(n=di(n),null===n||(n=oi.call(n,"constructor")&&n.constructor,typeof n=="function"&&n instanceof n&&ii.call(n)==li))}function ju(n){return typeof n=="string"||!ff(n)&&yu(n)&&"[object String]"==Ot(n)}function wu(n){return typeof n=="symbol"||yu(n)&&"[object Symbol]"==Ot(n)}function mu(n){if(!n)return[];if(su(n))return ju(n)?M(n):Lr(n);if(wi&&n[wi]){n=n[wi]();for(var t,r=[];!(t=n.next()).done;)r.push(t.value); -return r}return t=vo(n),("[object Map]"==t?W:"[object Set]"==t?L:Lu)(n)}function Au(n){return n?(n=Su(n),n===$||n===-$?1.7976931348623157e308*(0>n?-1:1):n===n?n:0):0===n?n:0}function ku(n){n=Au(n);var t=n%1;return n===n?t?n-t:n:0}function Eu(n){return n?pt(ku(n),0,4294967295):0}function Su(n){if(typeof n=="number")return n;if(wu(n))return F;if(du(n)&&(n=typeof n.valueOf=="function"?n.valueOf():n,n=du(n)?n+"":n),typeof n!="string")return 0===n?n:+n;n=n.replace(un,"");var t=gn.test(n);return t||yn.test(n)?Dn(n.slice(2),t?2:8):vn.test(n)?F:+n; -}function Ou(n){return Cr(n,Uu(n))}function Iu(n){return null==n?"":yr(n)}function Ru(n,t,r){return n=null==n?T:Et(n,t),n===T?r:n}function zu(n,t){return null!=n&&we(n,t,zt)}function Wu(n){return su(n)?qn(n):Vt(n)}function Uu(n){if(su(n))n=qn(n,true);else if(du(n)){var t,r=ze(n),e=[];for(t in n)("constructor"!=t||!r&&oi.call(n,t))&&e.push(t);n=e}else{if(t=[],null!=n)for(r in Qu(n))t.push(r);n=t}return n}function Bu(n,t){if(null==n)return{};var r=c(ve(n),function(n){return[n]});return t=ye(t),tr(n,r,function(n,r){ -return t(n,r[0])})}function Lu(n){return null==n?[]:S(n,Wu(n))}function Cu(n){return $f(Iu(n).toLowerCase())}function Du(n){return(n=Iu(n))&&n.replace(xn,Xn).replace(Sn,"")}function Mu(n,t,r){return n=Iu(n),t=r?T:t,t===T?zn.test(n)?n.match(In)||[]:n.match(sn)||[]:n.match(t)||[]}function Tu(n){return function(){return n}}function $u(n){return n}function Fu(n){return qt(typeof n=="function"?n:_t(n,1))}function Nu(n,t,e){var u=Wu(t),i=kt(t,u);null!=e||du(t)&&(i.length||!u.length)||(e=t,t=n,n=this,i=kt(t,Wu(t))); -var o=!(du(e)&&"chain"in e&&!e.chain),f=_u(n);return r(i,function(r){var e=t[r];n[r]=e,f&&(n.prototype[r]=function(){var t=this.__chain__;if(o||t){var r=n(this.__wrapped__);return(r.__actions__=Lr(this.__actions__)).push({func:e,args:arguments,thisArg:n}),r.__chain__=t,r}return e.apply(n,a([this.value()],arguments))})}),n}function Pu(){}function Zu(n){return Ie(n)?b(Me(n)):rr(n)}function qu(){return[]}function Vu(){return false}mn=null==mn?$n:rt.defaults($n.Object(),mn,rt.pick($n,Wn));var Ku=mn.Array,Gu=mn.Date,Hu=mn.Error,Ju=mn.Function,Yu=mn.Math,Qu=mn.Object,Xu=mn.RegExp,ni=mn.String,ti=mn.TypeError,ri=Ku.prototype,ei=Qu.prototype,ui=mn["__core-js_shared__"],ii=Ju.prototype.toString,oi=ei.hasOwnProperty,fi=0,ci=function(){ -var n=/[^.]+$/.exec(ui&&ui.keys&&ui.keys.IE_PROTO||"");return n?"Symbol(src)_1."+n:""}(),ai=ei.toString,li=ii.call(Qu),si=$n._,hi=Xu("^"+ii.call(oi).replace(rn,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),pi=Pn?mn.Buffer:T,_i=mn.Symbol,vi=mn.Uint8Array,gi=pi?pi.allocUnsafe:T,di=U(Qu.getPrototypeOf,Qu),yi=Qu.create,bi=ei.propertyIsEnumerable,xi=ri.splice,ji=_i?_i.isConcatSpreadable:T,wi=_i?_i.iterator:T,mi=_i?_i.toStringTag:T,Ai=function(){try{var n=je(Qu,"defineProperty"); -return n({},"",{}),n}catch(n){}}(),ki=mn.clearTimeout!==$n.clearTimeout&&mn.clearTimeout,Ei=Gu&&Gu.now!==$n.Date.now&&Gu.now,Si=mn.setTimeout!==$n.setTimeout&&mn.setTimeout,Oi=Yu.ceil,Ii=Yu.floor,Ri=Qu.getOwnPropertySymbols,zi=pi?pi.isBuffer:T,Wi=mn.isFinite,Ui=ri.join,Bi=U(Qu.keys,Qu),Li=Yu.max,Ci=Yu.min,Di=Gu.now,Mi=mn.parseInt,Ti=Yu.random,$i=ri.reverse,Fi=je(mn,"DataView"),Ni=je(mn,"Map"),Pi=je(mn,"Promise"),Zi=je(mn,"Set"),qi=je(mn,"WeakMap"),Vi=je(Qu,"create"),Ki=qi&&new qi,Gi={},Hi=Te(Fi),Ji=Te(Ni),Yi=Te(Pi),Qi=Te(Zi),Xi=Te(qi),no=_i?_i.prototype:T,to=no?no.valueOf:T,ro=no?no.toString:T,eo=function(){ -function n(){}return function(t){return du(t)?yi?yi(t):(n.prototype=t,t=new n,n.prototype=T,t):{}}}();An.templateSettings={escape:J,evaluate:Y,interpolate:Q,variable:"",imports:{_:An}},An.prototype=kn.prototype,An.prototype.constructor=An,On.prototype=eo(kn.prototype),On.prototype.constructor=On,Ln.prototype=eo(kn.prototype),Ln.prototype.constructor=Ln,Mn.prototype.clear=function(){this.__data__=Vi?Vi(null):{},this.size=0},Mn.prototype.delete=function(n){return n=this.has(n)&&delete this.__data__[n], -this.size-=n?1:0,n},Mn.prototype.get=function(n){var t=this.__data__;return Vi?(n=t[n],"__lodash_hash_undefined__"===n?T:n):oi.call(t,n)?t[n]:T},Mn.prototype.has=function(n){var t=this.__data__;return Vi?t[n]!==T:oi.call(t,n)},Mn.prototype.set=function(n,t){var r=this.__data__;return this.size+=this.has(n)?0:1,r[n]=Vi&&t===T?"__lodash_hash_undefined__":t,this},Tn.prototype.clear=function(){this.__data__=[],this.size=0},Tn.prototype.delete=function(n){var t=this.__data__;return n=ft(t,n),!(0>n)&&(n==t.length-1?t.pop():xi.call(t,n,1), ---this.size,true)},Tn.prototype.get=function(n){var t=this.__data__;return n=ft(t,n),0>n?T:t[n][1]},Tn.prototype.has=function(n){return-1e?(++this.size,r.push([n,t])):r[e][1]=t,this},Fn.prototype.clear=function(){this.size=0,this.__data__={hash:new Mn,map:new(Ni||Tn),string:new Mn}},Fn.prototype.delete=function(n){return n=be(this,n).delete(n),this.size-=n?1:0,n},Fn.prototype.get=function(n){return be(this,n).get(n); -},Fn.prototype.has=function(n){return be(this,n).has(n)},Fn.prototype.set=function(n,t){var r=be(this,n),e=r.size;return r.set(n,t),this.size+=r.size==e?0:1,this},Nn.prototype.add=Nn.prototype.push=function(n){return this.__data__.set(n,"__lodash_hash_undefined__"),this},Nn.prototype.has=function(n){return this.__data__.has(n)},Zn.prototype.clear=function(){this.__data__=new Tn,this.size=0},Zn.prototype.delete=function(n){var t=this.__data__;return n=t.delete(n),this.size=t.size,n},Zn.prototype.get=function(n){ -return this.__data__.get(n)},Zn.prototype.has=function(n){return this.__data__.has(n)},Zn.prototype.set=function(n,t){var r=this.__data__;if(r instanceof Tn){var e=r.__data__;if(!Ni||199>e.length)return e.push([n,t]),this.size=++r.size,this;r=this.__data__=new Fn(e)}return r.set(n,t),this.size=r.size,this};var uo=Fr(mt),io=Fr(At,true),oo=Nr(),fo=Nr(true),co=Ki?function(n,t){return Ki.set(n,t),n}:$u,ao=Ai?function(n,t){return Ai(n,"toString",{configurable:true,enumerable:false,value:Tu(t),writable:true})}:$u,lo=ki||function(n){ -return $n.clearTimeout(n)},so=Zi&&1/L(new Zi([,-0]))[1]==$?function(n){return new Zi(n)}:Pu,ho=Ki?function(n){return Ki.get(n)}:Pu,po=Ri?function(n){return null==n?[]:(n=Qu(n),i(Ri(n),function(t){return bi.call(n,t)}))}:qu,_o=Ri?function(n){for(var t=[];n;)a(t,po(n)),n=di(n);return t}:qu,vo=Ot;(Fi&&"[object DataView]"!=vo(new Fi(new ArrayBuffer(1)))||Ni&&"[object Map]"!=vo(new Ni)||Pi&&"[object Promise]"!=vo(Pi.resolve())||Zi&&"[object Set]"!=vo(new Zi)||qi&&"[object WeakMap]"!=vo(new qi))&&(vo=function(n){ -var t=Ot(n);if(n=(n="[object Object]"==t?n.constructor:T)?Te(n):"")switch(n){case Hi:return"[object DataView]";case Ji:return"[object Map]";case Yi:return"[object Promise]";case Qi:return"[object Set]";case Xi:return"[object WeakMap]"}return t});var go=ui?_u:Vu,yo=Ce(co),bo=Si||function(n,t){return $n.setTimeout(n,t)},xo=Ce(ao),jo=function(n){n=cu(n,function(n){return 500===t.size&&t.clear(),n});var t=n.cache;return n}(function(n){var t=[];return 46===n.charCodeAt(0)&&t.push(""),n.replace(tn,function(n,r,e,u){ -t.push(e?u.replace(hn,"$1"):r||n)}),t}),wo=fr(function(n,t){return hu(n)?yt(n,wt(t,1,hu,true)):[]}),mo=fr(function(n,t){var r=Ve(t);return hu(r)&&(r=T),hu(n)?yt(n,wt(t,1,hu,true),ye(r,2)):[]}),Ao=fr(function(n,t){var r=Ve(t);return hu(r)&&(r=T),hu(n)?yt(n,wt(t,1,hu,true),T,r):[]}),ko=fr(function(n){var t=c(n,kr);return t.length&&t[0]===n[0]?Wt(t):[]}),Eo=fr(function(n){var t=Ve(n),r=c(n,kr);return t===Ve(r)?t=T:r.pop(),r.length&&r[0]===n[0]?Wt(r,ye(t,2)):[]}),So=fr(function(n){var t=Ve(n),r=c(n,kr);return(t=typeof t=="function"?t:T)&&r.pop(), -r.length&&r[0]===n[0]?Wt(r,T,t):[]}),Oo=fr(Ke),Io=pe(function(n,t){var r=null==n?0:n.length,e=ht(n,t);return ur(n,c(t,function(n){return Se(n,r)?+n:n}).sort(Wr)),e}),Ro=fr(function(n){return br(wt(n,1,hu,true))}),zo=fr(function(n){var t=Ve(n);return hu(t)&&(t=T),br(wt(n,1,hu,true),ye(t,2))}),Wo=fr(function(n){var t=Ve(n),t=typeof t=="function"?t:T;return br(wt(n,1,hu,true),T,t)}),Uo=fr(function(n,t){return hu(n)?yt(n,t):[]}),Bo=fr(function(n){return mr(i(n,hu))}),Lo=fr(function(n){var t=Ve(n);return hu(t)&&(t=T), -mr(i(n,hu),ye(t,2))}),Co=fr(function(n){var t=Ve(n),t=typeof t=="function"?t:T;return mr(i(n,hu),T,t)}),Do=fr(He),Mo=fr(function(n){var t=n.length,t=1=t}),of=Lt(function(){return arguments}())?Lt:function(n){return yu(n)&&oi.call(n,"callee")&&!bi.call(n,"callee")},ff=Ku.isArray,cf=Vn?E(Vn):Ct,af=zi||Vu,lf=Kn?E(Kn):Dt,sf=Gn?E(Gn):Tt,hf=Hn?E(Hn):Nt,pf=Jn?E(Jn):Pt,_f=Yn?E(Yn):Zt,vf=ee(Kt),gf=ee(function(n,t){return n<=t}),df=$r(function(n,t){ -if(ze(t)||su(t))Cr(t,Wu(t),n);else for(var r in t)oi.call(t,r)&&ot(n,r,t[r])}),yf=$r(function(n,t){Cr(t,Uu(t),n)}),bf=$r(function(n,t,r,e){Cr(t,Uu(t),n,e)}),xf=$r(function(n,t,r,e){Cr(t,Wu(t),n,e)}),jf=pe(ht),wf=fr(function(n,t){n=Qu(n);var r=-1,e=t.length,u=2--n)return t.apply(this,arguments)}},An.ary=eu,An.assign=df,An.assignIn=yf,An.assignInWith=bf,An.assignWith=xf,An.at=jf,An.before=uu,An.bind=Ho,An.bindAll=Nf,An.bindKey=Jo,An.castArray=function(){if(!arguments.length)return[];var n=arguments[0];return ff(n)?n:[n]},An.chain=Ye,An.chunk=function(n,t,r){if(t=(r?Oe(n,t,r):t===T)?1:Li(ku(t),0),r=null==n?0:n.length,!r||1>t)return[];for(var e=0,u=0,i=Ku(Oi(r/t));et?0:t,e)):[]},An.dropRight=function(n,t,r){var e=null==n?0:n.length;return e?(t=r||t===T?1:ku(t),t=e-t,hr(n,0,0>t?0:t)):[]},An.dropRightWhile=function(n,t){return n&&n.length?jr(n,ye(t,3),true,true):[]; -},An.dropWhile=function(n,t){return n&&n.length?jr(n,ye(t,3),true):[]},An.fill=function(n,t,r,e){var u=null==n?0:n.length;if(!u)return[];for(r&&typeof r!="number"&&Oe(n,t,r)&&(r=0,e=u),u=n.length,r=ku(r),0>r&&(r=-r>u?0:u+r),e=e===T||e>u?u:ku(e),0>e&&(e+=u),e=r>e?0:Eu(e);r>>0,r?(n=Iu(n))&&(typeof t=="string"||null!=t&&!hf(t))&&(t=yr(t),!t&&Rn.test(n))?Or(M(n),0,r):n.split(t,r):[]},An.spread=function(t,r){if(typeof t!="function")throw new ti("Expected a function");return r=null==r?0:Li(ku(r),0), -fr(function(e){var u=e[r];return e=Or(e,0,r),u&&a(e,u),n(t,this,e)})},An.tail=function(n){var t=null==n?0:n.length;return t?hr(n,1,t):[]},An.take=function(n,t,r){return n&&n.length?(t=r||t===T?1:ku(t),hr(n,0,0>t?0:t)):[]},An.takeRight=function(n,t,r){var e=null==n?0:n.length;return e?(t=r||t===T?1:ku(t),t=e-t,hr(n,0>t?0:t,e)):[]},An.takeRightWhile=function(n,t){return n&&n.length?jr(n,ye(t,3),false,true):[]},An.takeWhile=function(n,t){return n&&n.length?jr(n,ye(t,3)):[]},An.tap=function(n,t){return t(n), -n},An.throttle=function(n,t,r){var e=true,u=true;if(typeof n!="function")throw new ti("Expected a function");return du(r)&&(e="leading"in r?!!r.leading:e,u="trailing"in r?!!r.trailing:u),fu(n,t,{leading:e,maxWait:t,trailing:u})},An.thru=Qe,An.toArray=mu,An.toPairs=zf,An.toPairsIn=Wf,An.toPath=function(n){return ff(n)?c(n,Me):wu(n)?[n]:Lr(jo(Iu(n)))},An.toPlainObject=Ou,An.transform=function(n,t,e){var u=ff(n),i=u||af(n)||_f(n);if(t=ye(t,4),null==e){var o=n&&n.constructor;e=i?u?new o:[]:du(n)&&_u(o)?eo(di(n)):{}; -}return(i?r:mt)(n,function(n,r,u){return t(e,n,r,u)}),e},An.unary=function(n){return eu(n,1)},An.union=Ro,An.unionBy=zo,An.unionWith=Wo,An.uniq=function(n){return n&&n.length?br(n):[]},An.uniqBy=function(n,t){return n&&n.length?br(n,ye(t,2)):[]},An.uniqWith=function(n,t){return t=typeof t=="function"?t:T,n&&n.length?br(n,T,t):[]},An.unset=function(n,t){return null==n||xr(n,t)},An.unzip=He,An.unzipWith=Je,An.update=function(n,t,r){return null!=n&&(r=Er(r),n=lr(n,t,r(Et(n,t)),void 0)),n},An.updateWith=function(n,t,r,e){ -return e=typeof e=="function"?e:T,null!=n&&(r=Er(r),n=lr(n,t,r(Et(n,t)),e)),n},An.values=Lu,An.valuesIn=function(n){return null==n?[]:S(n,Uu(n))},An.without=Uo,An.words=Mu,An.wrap=function(n,t){return nf(Er(t),n)},An.xor=Bo,An.xorBy=Lo,An.xorWith=Co,An.zip=Do,An.zipObject=function(n,t){return Ar(n||[],t||[],ot)},An.zipObjectDeep=function(n,t){return Ar(n||[],t||[],lr)},An.zipWith=Mo,An.entries=zf,An.entriesIn=Wf,An.extend=yf,An.extendWith=bf,Nu(An,An),An.add=Qf,An.attempt=Ff,An.camelCase=Uf,An.capitalize=Cu, -An.ceil=Xf,An.clamp=function(n,t,r){return r===T&&(r=t,t=T),r!==T&&(r=Su(r),r=r===r?r:0),t!==T&&(t=Su(t),t=t===t?t:0),pt(Su(n),t,r)},An.clone=function(n){return _t(n,4)},An.cloneDeep=function(n){return _t(n,5)},An.cloneDeepWith=function(n,t){return t=typeof t=="function"?t:T,_t(n,5,t)},An.cloneWith=function(n,t){return t=typeof t=="function"?t:T,_t(n,4,t)},An.conformsTo=function(n,t){return null==t||gt(n,t,Wu(t))},An.deburr=Du,An.defaultTo=function(n,t){return null==n||n!==n?t:n},An.divide=nc,An.endsWith=function(n,t,r){ -n=Iu(n),t=yr(t);var e=n.length,e=r=r===T?e:pt(ku(r),0,e);return r-=t.length,0<=r&&n.slice(r,e)==t},An.eq=lu,An.escape=function(n){return(n=Iu(n))&&H.test(n)?n.replace(K,nt):n},An.escapeRegExp=function(n){return(n=Iu(n))&&en.test(n)?n.replace(rn,"\\$&"):n},An.every=function(n,t,r){var e=ff(n)?u:bt;return r&&Oe(n,t,r)&&(t=T),e(n,ye(t,3))},An.find=Fo,An.findIndex=Ne,An.findKey=function(n,t){return p(n,ye(t,3),mt)},An.findLast=No,An.findLastIndex=Pe,An.findLastKey=function(n,t){return p(n,ye(t,3),At); -},An.floor=tc,An.forEach=nu,An.forEachRight=tu,An.forIn=function(n,t){return null==n?n:oo(n,ye(t,3),Uu)},An.forInRight=function(n,t){return null==n?n:fo(n,ye(t,3),Uu)},An.forOwn=function(n,t){return n&&mt(n,ye(t,3))},An.forOwnRight=function(n,t){return n&&At(n,ye(t,3))},An.get=Ru,An.gt=ef,An.gte=uf,An.has=function(n,t){return null!=n&&we(n,t,Rt)},An.hasIn=zu,An.head=qe,An.identity=$u,An.includes=function(n,t,r,e){return n=su(n)?n:Lu(n),r=r&&!e?ku(r):0,e=n.length,0>r&&(r=Li(e+r,0)),ju(n)?r<=e&&-1r&&(r=Li(e+r,0)),v(n,t,r)):-1},An.inRange=function(n,t,r){return t=Au(t),r===T?(r=t,t=0):r=Au(r),n=Su(n),n>=Ci(t,r)&&n=n},An.isSet=pf,An.isString=ju,An.isSymbol=wu,An.isTypedArray=_f,An.isUndefined=function(n){return n===T},An.isWeakMap=function(n){return yu(n)&&"[object WeakMap]"==vo(n)},An.isWeakSet=function(n){return yu(n)&&"[object WeakSet]"==Ot(n)},An.join=function(n,t){return null==n?"":Ui.call(n,t)},An.kebabCase=Bf,An.last=Ve,An.lastIndexOf=function(n,t,r){var e=null==n?0:n.length;if(!e)return-1;var u=e;if(r!==T&&(u=ku(r),u=0>u?Li(e+u,0):Ci(u,e-1)), -t===t)n:{for(r=u+1;r--;)if(n[r]===t){n=r;break n}n=r}else n=_(n,d,u,true);return n},An.lowerCase=Lf,An.lowerFirst=Cf,An.lt=vf,An.lte=gf,An.max=function(n){return n&&n.length?xt(n,$u,It):T},An.maxBy=function(n,t){return n&&n.length?xt(n,ye(t,2),It):T},An.mean=function(n){return y(n,$u)},An.meanBy=function(n,t){return y(n,ye(t,2))},An.min=function(n){return n&&n.length?xt(n,$u,Kt):T},An.minBy=function(n,t){return n&&n.length?xt(n,ye(t,2),Kt):T},An.stubArray=qu,An.stubFalse=Vu,An.stubObject=function(){ -return{}},An.stubString=function(){return""},An.stubTrue=function(){return true},An.multiply=rc,An.nth=function(n,t){return n&&n.length?Qt(n,ku(t)):T},An.noConflict=function(){return $n._===this&&($n._=si),this},An.noop=Pu,An.now=Go,An.pad=function(n,t,r){n=Iu(n);var e=(t=ku(t))?D(n):0;return!t||e>=t?n:(t=(t-e)/2,ne(Ii(t),r)+n+ne(Oi(t),r))},An.padEnd=function(n,t,r){n=Iu(n);var e=(t=ku(t))?D(n):0;return t&&et){var e=n;n=t,t=e}return r||n%1||t%1?(r=Ti(),Ci(n+r*(t-n+Cn("1e-"+((r+"").length-1))),t)):ir(n,t)},An.reduce=function(n,t,r){var e=ff(n)?l:j,u=3>arguments.length;return e(n,ye(t,4),r,u,uo)},An.reduceRight=function(n,t,r){ -var e=ff(n)?s:j,u=3>arguments.length;return e(n,ye(t,4),r,u,io)},An.repeat=function(n,t,r){return t=(r?Oe(n,t,r):t===T)?1:ku(t),or(Iu(n),t)},An.replace=function(){var n=arguments,t=Iu(n[0]);return 3>n.length?t:t.replace(n[1],n[2])},An.result=function(n,t,r){t=Sr(t,n);var e=-1,u=t.length;for(u||(u=1,n=T);++en||9007199254740991=i)return n;if(i=r-D(e),1>i)return e;if(r=o?Or(o,0,i).join(""):n.slice(0,i),u===T)return r+e;if(o&&(i+=r.length-i),hf(u)){if(n.slice(i).search(u)){var f=r;for(u.global||(u=Xu(u.source,Iu(_n.exec(u))+"g")), -u.lastIndex=0;o=u.exec(f);)var c=o.index;r=r.slice(0,c===T?i:c)}}else n.indexOf(yr(u),i)!=i&&(u=r.lastIndexOf(u),-1e.__dir__?"Right":"")}),e},Ln.prototype[n+"Right"]=function(t){return this.reverse()[n](t).reverse()}}),r(["filter","map","takeWhile"],function(n,t){var r=t+1,e=1==r||3==r;Ln.prototype[n]=function(n){var t=this.clone();return t.__iteratees__.push({ -iteratee:ye(n,3),type:r}),t.__filtered__=t.__filtered__||e,t}}),r(["head","last"],function(n,t){var r="take"+(t?"Right":"");Ln.prototype[n]=function(){return this[r](1).value()[0]}}),r(["initial","tail"],function(n,t){var r="drop"+(t?"":"Right");Ln.prototype[n]=function(){return this.__filtered__?new Ln(this):this[r](1)}}),Ln.prototype.compact=function(){return this.filter($u)},Ln.prototype.find=function(n){return this.filter(n).head()},Ln.prototype.findLast=function(n){return this.reverse().find(n); -},Ln.prototype.invokeMap=fr(function(n,t){return typeof n=="function"?new Ln(this):this.map(function(r){return Bt(r,n,t)})}),Ln.prototype.reject=function(n){return this.filter(au(ye(n)))},Ln.prototype.slice=function(n,t){n=ku(n);var r=this;return r.__filtered__&&(0t)?new Ln(r):(0>n?r=r.takeRight(-n):n&&(r=r.drop(n)),t!==T&&(t=ku(t),r=0>t?r.dropRight(-t):r.take(t-n)),r)},Ln.prototype.takeRightWhile=function(n){return this.reverse().takeWhile(n).reverse()},Ln.prototype.toArray=function(){return this.take(4294967295); -},mt(Ln.prototype,function(n,t){var r=/^(?:filter|find|map|reject)|While$/.test(t),e=/^(?:head|last)$/.test(t),u=An[e?"take"+("last"==t?"Right":""):t],i=e||/^find/.test(t);u&&(An.prototype[t]=function(){var t=this.__wrapped__,o=e?[1]:arguments,f=t instanceof Ln,c=o[0],l=f||ff(t),s=function(n){return n=u.apply(An,a([n],o)),e&&h?n[0]:n};l&&r&&typeof c=="function"&&1!=c.length&&(f=l=false);var h=this.__chain__,p=!!this.__actions__.length,c=i&&!h,f=f&&!p;return!i&&l?(t=f?t:new Ln(this),t=n.apply(t,o),t.__actions__.push({ -func:Qe,args:[s],thisArg:T}),new On(t,h)):c&&f?n.apply(this,o):(t=this.thru(s),c?e?t.value()[0]:t.value():t)})}),r("pop push shift sort splice unshift".split(" "),function(n){var t=ri[n],r=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",e=/^(?:pop|shift)$/.test(n);An.prototype[n]=function(){var n=arguments;if(e&&!this.__chain__){var u=this.value();return t.apply(ff(u)?u:[],n)}return this[r](function(r){return t.apply(ff(r)?r:[],n)})}}),mt(Ln.prototype,function(n,t){var r=An[t];if(r){var e=r.name+""; -(Gi[e]||(Gi[e]=[])).push({name:t,func:r})}}),Gi[Jr(T,2).name]=[{name:"wrapper",func:T}],Ln.prototype.clone=function(){var n=new Ln(this.__wrapped__);return n.__actions__=Lr(this.__actions__),n.__dir__=this.__dir__,n.__filtered__=this.__filtered__,n.__iteratees__=Lr(this.__iteratees__),n.__takeCount__=this.__takeCount__,n.__views__=Lr(this.__views__),n},Ln.prototype.reverse=function(){if(this.__filtered__){var n=new Ln(this);n.__dir__=-1,n.__filtered__=true}else n=this.clone(),n.__dir__*=-1;return n; -},Ln.prototype.value=function(){var n,t=this.__wrapped__.value(),r=this.__dir__,e=ff(t),u=0>r,i=e?t.length:0;n=0;for(var o=i,f=this.__views__,c=-1,a=f.length;++c=this.__values__.length;return{done:n,value:n?T:this.__values__[this.__index__++]}},An.prototype.plant=function(n){for(var t,r=this;r instanceof kn;){ -var e=Fe(r);e.__index__=0,e.__values__=T,t?u.__wrapped__=e:t=e;var u=e,r=r.__wrapped__}return u.__wrapped__=n,t},An.prototype.reverse=function(){var n=this.__wrapped__;return n instanceof Ln?(this.__actions__.length&&(n=new Ln(this)),n=n.reverse(),n.__actions__.push({func:Qe,args:[Ge],thisArg:T}),new On(n,this.__chain__)):this.thru(Ge)},An.prototype.toJSON=An.prototype.valueOf=An.prototype.value=function(){return wr(this.__wrapped__,this.__actions__)},An.prototype.first=An.prototype.head,wi&&(An.prototype[wi]=Xe), -An}();typeof define=="function"&&typeof define.amd=="object"&&define.amd?($n._=rt, define(function(){return rt})):Nn?((Nn.exports=rt)._=rt,Fn._=rt):$n._=rt}).call(this); \ No newline at end of file diff --git a/src/ui/shared/vendor/popper.js/popper.min.js b/src/ui/shared/vendor/popper.js/popper.min.js deleted file mode 100644 index 94a5c26f..00000000 --- a/src/ui/shared/vendor/popper.js/popper.min.js +++ /dev/null @@ -1,5 +0,0 @@ -/* - Copyright (C) Federico Zivolo 2019 - Distributed under the MIT License (license terms are at http://opensource.org/licenses/MIT). - */(function(e,t){'object'==typeof exports&&'undefined'!=typeof module?module.exports=t():'function'==typeof define&&define.amd?define(t):e.Popper=t()})(this,function(){'use strict';function e(e){return e&&'[object Function]'==={}.toString.call(e)}function t(e,t){if(1!==e.nodeType)return[];var o=e.ownerDocument.defaultView,n=o.getComputedStyle(e,null);return t?n[t]:n}function o(e){return'HTML'===e.nodeName?e:e.parentNode||e.host}function n(e){if(!e)return document.body;switch(e.nodeName){case'HTML':case'BODY':return e.ownerDocument.body;case'#document':return e.body;}var i=t(e),r=i.overflow,p=i.overflowX,s=i.overflowY;return /(auto|scroll|overlay)/.test(r+s+p)?e:n(o(e))}function r(e){return 11===e?pe:10===e?se:pe||se}function p(e){if(!e)return document.documentElement;for(var o=r(10)?document.body:null,n=e.offsetParent||null;n===o&&e.nextElementSibling;)n=(e=e.nextElementSibling).offsetParent;var i=n&&n.nodeName;return i&&'BODY'!==i&&'HTML'!==i?-1!==['TH','TD','TABLE'].indexOf(n.nodeName)&&'static'===t(n,'position')?p(n):n:e?e.ownerDocument.documentElement:document.documentElement}function s(e){var t=e.nodeName;return'BODY'!==t&&('HTML'===t||p(e.firstElementChild)===e)}function d(e){return null===e.parentNode?e:d(e.parentNode)}function a(e,t){if(!e||!e.nodeType||!t||!t.nodeType)return document.documentElement;var o=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,n=o?e:t,i=o?t:e,r=document.createRange();r.setStart(n,0),r.setEnd(i,0);var l=r.commonAncestorContainer;if(e!==l&&t!==l||n.contains(i))return s(l)?l:p(l);var f=d(e);return f.host?a(f.host,t):a(e,d(t).host)}function l(e){var t=1=o.clientWidth&&n>=o.clientHeight}),l=0a[e]&&!t.escapeWithReference&&(n=Q(f[o],a[e]-('right'===e?f.width:f.height))),le({},o,n)}};return l.forEach(function(e){var t=-1===['left','top'].indexOf(e)?'secondary':'primary';f=fe({},f,m[t](e))}),e.offsets.popper=f,e},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,o=t.popper,n=t.reference,i=e.placement.split('-')[0],r=Z,p=-1!==['top','bottom'].indexOf(i),s=p?'right':'bottom',d=p?'left':'top',a=p?'width':'height';return o[s]r(n[s])&&(e.offsets.popper[d]=r(n[s])),e}},arrow:{order:500,enabled:!0,fn:function(e,o){var n;if(!K(e.instance.modifiers,'arrow','keepTogether'))return e;var i=o.element;if('string'==typeof i){if(i=e.instance.popper.querySelector(i),!i)return e;}else if(!e.instance.popper.contains(i))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),e;var r=e.placement.split('-')[0],p=e.offsets,s=p.popper,d=p.reference,a=-1!==['left','right'].indexOf(r),l=a?'height':'width',f=a?'Top':'Left',m=f.toLowerCase(),h=a?'left':'top',c=a?'bottom':'right',u=S(i)[l];d[c]-us[c]&&(e.offsets.popper[m]+=d[m]+u-s[c]),e.offsets.popper=g(e.offsets.popper);var b=d[m]+d[l]/2-u/2,w=t(e.instance.popper),y=parseFloat(w['margin'+f],10),E=parseFloat(w['border'+f+'Width'],10),v=b-e.offsets.popper[m]-y-E;return v=ee(Q(s[l]-u,v),0),e.arrowElement=i,e.offsets.arrow=(n={},le(n,m,$(v)),le(n,h,''),n),e},element:'[x-arrow]'},flip:{order:600,enabled:!0,fn:function(e,t){if(W(e.instance.modifiers,'inner'))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var o=v(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement,e.positionFixed),n=e.placement.split('-')[0],i=T(n),r=e.placement.split('-')[1]||'',p=[];switch(t.behavior){case ge.FLIP:p=[n,i];break;case ge.CLOCKWISE:p=G(n);break;case ge.COUNTERCLOCKWISE:p=G(n,!0);break;default:p=t.behavior;}return p.forEach(function(s,d){if(n!==s||p.length===d+1)return e;n=e.placement.split('-')[0],i=T(n);var a=e.offsets.popper,l=e.offsets.reference,f=Z,m='left'===n&&f(a.right)>f(l.left)||'right'===n&&f(a.left)f(l.top)||'bottom'===n&&f(a.top)f(o.right),g=f(a.top)f(o.bottom),b='left'===n&&h||'right'===n&&c||'top'===n&&g||'bottom'===n&&u,w=-1!==['top','bottom'].indexOf(n),y=!!t.flipVariations&&(w&&'start'===r&&h||w&&'end'===r&&c||!w&&'start'===r&&g||!w&&'end'===r&&u);(m||b||y)&&(e.flipped=!0,(m||b)&&(n=p[d+1]),y&&(r=z(r)),e.placement=n+(r?'-'+r:''),e.offsets.popper=fe({},e.offsets.popper,D(e.instance.popper,e.offsets.reference,e.placement)),e=P(e.instance.modifiers,e,'flip'))}),e},behavior:'flip',padding:5,boundariesElement:'viewport'},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,o=t.split('-')[0],n=e.offsets,i=n.popper,r=n.reference,p=-1!==['left','right'].indexOf(o),s=-1===['top','left'].indexOf(o);return i[p?'left':'top']=r[o]-(s?i[p?'width':'height']:0),e.placement=T(t),e.offsets.popper=g(i),e}},hide:{order:800,enabled:!0,fn:function(e){if(!K(e.instance.modifiers,'hide','preventOverflow'))return e;var t=e.offsets.reference,o=C(e.instance.modifiers,function(e){return'preventOverflow'===e.name}).boundaries;if(t.bottomo.right||t.top>o.bottom||t.rightwindow.devicePixelRatio||!me),c='bottom'===o?'top':'bottom',g='right'===n?'left':'right',b=H('transform');if(d='bottom'==c?'HTML'===l.nodeName?-l.clientHeight+h.bottom:-f.height+h.bottom:h.top,s='right'==g?'HTML'===l.nodeName?-l.clientWidth+h.right:-f.width+h.right:h.left,a&&b)m[b]='translate3d('+s+'px, '+d+'px, 0)',m[c]=0,m[g]=0,m.willChange='transform';else{var w='bottom'==c?-1:1,y='right'==g?-1:1;m[c]=d*w,m[g]=s*y,m.willChange=c+', '+g}var E={"x-placement":e.placement};return e.attributes=fe({},E,e.attributes),e.styles=fe({},m,e.styles),e.arrowStyles=fe({},e.offsets.arrow,e.arrowStyles),e},gpuAcceleration:!0,x:'bottom',y:'right'},applyStyle:{order:900,enabled:!0,fn:function(e){return j(e.instance.popper,e.styles),V(e.instance.popper,e.attributes),e.arrowElement&&Object.keys(e.arrowStyles).length&&j(e.arrowElement,e.arrowStyles),e},onLoad:function(e,t,o,n,i){var r=L(i,t,e,o.positionFixed),p=O(o.placement,r,t,e,o.modifiers.flip.boundariesElement,o.modifiers.flip.padding);return t.setAttribute('x-placement',p),j(t,{position:o.positionFixed?'fixed':'absolute'}),o},gpuAcceleration:void 0}}},ue}); -//# sourceMappingURL=popper.min.js.map diff --git a/src/util.ts b/src/util.ts deleted file mode 100644 index d353345a..00000000 --- a/src/util.ts +++ /dev/null @@ -1,31 +0,0 @@ -"use strict"; - -export class Util { - public static async Sleep(ms: number): Promise { - return new Promise(resolve => { - setTimeout(() => { - resolve(ms); - }, ms); - }); - } - /** - * promisify the function - * it will be remove when vscode use node@^8.0 - * @param fn - */ - public static promisify( - fn: (...args: any[]) => any - ): (...whatever: any[]) => Promise { - return function(...argv) { - return new Promise((resolve, reject) => { - fn.call(this, ...argv, (err, data) => { - if (err) { - reject(err); - } else { - resolve(data); - } - }); - }); - }; - } -} diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index 8a79f20f..00000000 --- a/tsconfig.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "compilerOptions": { - "module": "Node16", - "target": "ES2022", - "lib": [ - "ES2022" - ], - "sourceMap": true, - "rootDir": "src", - "strict": true /* enable all strict type-checking options */ - /* Additional Checks */ - // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ - // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ - // "noUnusedParameters": true, /* Report errors on unused parameters. */ - } -} diff --git a/vsc-extension-quickstart.md b/vsc-extension-quickstart.md deleted file mode 100644 index f518bb84..00000000 --- a/vsc-extension-quickstart.md +++ /dev/null @@ -1,48 +0,0 @@ -# Welcome to your VS Code Extension - -## What's in the folder - -* This folder contains all of the files necessary for your extension. -* `package.json` - this is the manifest file in which you declare your extension and command. - * The sample plugin registers a command and defines its title and command name. With this information VS Code can show the command in the command palette. It doesn’t yet need to load the plugin. -* `src/extension.ts` - this is the main file where you will provide the implementation of your command. - * The file exports one function, `activate`, which is called the very first time your extension is activated (in this case by executing the command). Inside the `activate` function we call `registerCommand`. - * We pass the function containing the implementation of the command as the second parameter to `registerCommand`. - -## Setup - -* install the recommended extensions (amodio.tsl-problem-matcher, ms-vscode.extension-test-runner, and dbaeumer.vscode-eslint) - - -## Get up and running straight away - -* Press `F5` to open a new window with your extension loaded. -* Run your command from the command palette by pressing (`Ctrl+Shift+P` or `Cmd+Shift+P` on Mac) and typing `Hello World`. -* Set breakpoints in your code inside `src/extension.ts` to debug your extension. -* Find output from your extension in the debug console. - -## Make changes - -* You can relaunch the extension from the debug toolbar after changing code in `src/extension.ts`. -* You can also reload (`Ctrl+R` or `Cmd+R` on Mac) the VS Code window with your extension to load your changes. - - -## Explore the API - -* You can open the full set of our API when you open the file `node_modules/@types/vscode/index.d.ts`. - -## Run tests - -* Install the [Extension Test Runner](https://marketplace.visualstudio.com/items?itemName=ms-vscode.extension-test-runner) -* Run the "watch" task via the **Tasks: Run Task** command. Make sure this is running, or tests might not be discovered. -* Open the Testing view from the activity bar and click the Run Test" button, or use the hotkey `Ctrl/Cmd + ; A` -* See the output of the test result in the Test Results view. -* Make changes to `src/test/extension.test.ts` or create new test files inside the `test` folder. - * The provided test runner will only consider files matching the name pattern `**.test.ts`. - * You can create folders inside the `test` folder to structure your tests any way you want. - -## Go further - -* Reduce the extension size and improve the startup time by [bundling your extension](https://code.visualstudio.com/api/working-with-extensions/bundling-extension). -* [Publish your extension](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) on the VS Code extension marketplace. -* Automate builds by setting up [Continuous Integration](https://code.visualstudio.com/api/working-with-extensions/continuous-integration). diff --git a/webpack.config.js b/webpack.config.js deleted file mode 100644 index 626df326..00000000 --- a/webpack.config.js +++ /dev/null @@ -1,50 +0,0 @@ -//@ts-check - -"use strict"; - -const path = require("path"); -const { CleanWebpackPlugin } = require("clean-webpack-plugin"); - -//@ts-check -/** @typedef {import('webpack').Configuration} WebpackConfig **/ - -/** @type WebpackConfig */ -const extensionConfig = { - target: "node", // VS Code extensions run in a Node.js-context 📖 -> https://webpack.js.org/configuration/node/ - mode: "none", // this leaves the source code as close as possible to the original (when packaging we set this to 'production') - - entry: "./src/extension.ts", // the entry point of this extension, 📖 -> https://webpack.js.org/configuration/entry-context/ - output: { - // the bundle is stored in the 'dist' folder (check package.json), 📖 -> https://webpack.js.org/configuration/output/ - path: path.resolve(__dirname, "dist"), - filename: "extension.js", - libraryTarget: "commonjs2", - }, - externals: { - vscode: "commonjs vscode", // the vscode-module is created on-the-fly and must be excluded. Add other modules that cannot be webpack'ed, 📖 -> https://webpack.js.org/configuration/externals/ - // modules added here also need to be added in the .vscodeignore file - }, - resolve: { - // support reading TypeScript and JavaScript files, 📖 -> https://github.com/TypeStrong/ts-loader - extensions: [".ts", ".js"], - }, - module: { - rules: [ - { - test: /\.ts$/, - exclude: /node_modules/, - use: [ - { - loader: "ts-loader", - }, - ], - }, - ], - }, - devtool: "nosources-source-map", - infrastructureLogging: { - level: "log", // enables logging required for problem matchers - }, - plugins: [new CleanWebpackPlugin()], -}; -module.exports = [extensionConfig]; From 3c0cfb6d734ff9e5f46be65bdfd7a933ce0774a4 Mon Sep 17 00:00:00 2001 From: Ali Arshad Date: Sat, 7 Dec 2024 00:04:07 +0500 Subject: [PATCH 5/6] packages upgraded --- .github/FUNDING.yml | 5 + .github/ISSUE_TEMPLATE/---bug-report.md | 37 + .github/ISSUE_TEMPLATE/---feature-request.md | 15 + .github/ISSUE_TEMPLATE/--support-question.md | 14 + .gitignore | 6 + ...bpack.development.config_20241206220533.js | 9 + ...bpack.development.config_20241206235345.js | 9 + ...bpack.development.config_20241206235347.js | 9 + .history/package_20241206220533.json | 191 +++ .history/package_20241206233731.json | 191 +++ .history/package_20241206234457.json | 192 +++ .history/package_20241206234507.json | 192 +++ .history/package_20241206234513.json | 192 +++ .history/package_20241206234604.json | 192 +++ .history/package_20241206234710.json | 191 +++ .history/package_20241206234810.json | 194 +++ .history/package_20241206234811.json | 194 +++ .history/package_20241206234923.json | 193 +++ .history/package_20241206234924.json | 193 +++ .../github.oauth.service_20241102143121.ts | 136 ++ .../github.oauth.service_20241206235603.ts | 136 ++ .../github.oauth.service_20241206235606.ts | 136 ++ .../github.oauth.service_20241206235613.ts | 136 ++ .../github.oauth.service_20241206235624.ts | 136 ++ .../github.oauth.service_20241206235626.ts | 136 ++ .../github.oauth.service_20241206235700.ts | 136 ++ .../github.oauth.service_20241206235701.ts | 136 ++ .../github.oauth.service_20241206235709.ts | 136 ++ .../github.oauth.service_20241206235714.ts | 136 ++ .../github.oauth.service_20241206235715.ts | 136 ++ .../github.oauth.service_20241206235727.ts | 136 ++ .../github.oauth.service_20241206235731.ts | 136 ++ .../github.oauth.service_20241206235738.ts | 136 ++ .../service/github.service_20241102143121.ts | 203 +++ .../service/github.service_20241206235854.ts | 203 +++ .../service/github.service_20241206235857.ts | 203 +++ .../service/github.service_20241206235858.ts | 203 +++ .../service/github.service_20241206235903.ts | 203 +++ .travis.yml | 33 + .vscode/launch.json | 27 + .vscode/settings.json | 9 + .vscode/tasks.json | 20 + .vscodeignore | 16 + CHANGELOG.md | 143 ++ CODE_OF_CONDUCT.md | 46 + CONTRIBUTING.md | 90 ++ LICENSE | 22 + PULL_REQUEST_TEMPLATE.md | 25 + README.md | 316 +++++ code-settings-sync.code-workspace | 8 + configs/webpack.config.js | 45 + configs/webpack.development.config.js | 9 + configs/webpack.production.config.js | 11 + images/existing-gist.png | Bin 0 -> 87215 bytes images/login-with-github.png | Bin 0 -> 156024 bytes images/logo-128.png | Bin 0 -> 4699 bytes images/logo-256.png | Bin 0 -> 10121 bytes images/logo-512.png | Bin 0 -> 22366 bytes images/logo.sketch | Bin 0 -> 20650 bytes images/slack.png | Bin 0 -> 8229 bytes images/white-cloud.png | Bin 0 -> 75394 bytes install_local.txt | 3 + package.json | 192 +++ package.nls.de.json | 144 +++ package.nls.es.json | 144 +++ package.nls.fr.json | 143 ++ package.nls.hu.json | 143 ++ package.nls.it.json | 144 +++ package.nls.ja.json | 144 +++ package.nls.json | 144 +++ package.nls.ko.json | 138 ++ package.nls.pt-br.json | 145 +++ package.nls.ru.json | 144 +++ package.nls.tr.json | 144 +++ package.nls.zh-cn.json | 144 +++ package.nls.zh-tw.json | 144 +++ release-notes.json | 52 + scripts/deploy.sh | 8 + src/commons.ts | 531 ++++++++ src/enums.ts | 13 + src/environmentPath.ts | 196 +++ src/extension.ts | 48 + src/localize.ts | 86 ++ src/lockfile.ts | 34 + src/models/cloudSettings.model.ts | 6 + src/models/customConfig.model.ts | 33 + src/models/extensionConfig.model.ts | 10 + src/models/language-pack.model.ts | 3 + src/models/localConfig.model.ts | 10 + src/models/settingType.model.ts | 6 + src/models/state.model.ts | 10 + src/models/webview.model.ts | 9 + src/pragmaUtil.ts | 291 +++++ src/service/autoUpload.service.ts | 99 ++ src/service/file.service.ts | 240 ++++ src/service/github.oauth.service.ts | 136 ++ src/service/github.service.ts | 203 +++ src/service/plugin.service.ts | 243 ++++ src/service/webview.service.ts | 479 +++++++ src/state.ts | 5 + src/sync.ts | 1145 +++++++++++++++++ src/util.ts | 31 + test/extension.test.ts | 3 + test/index.ts | 8 + test/pragmaUtil/index.ts | 105 ++ test/pragmaUtil/testSettings.txt | 35 + test/service/fileService/dummyrc | 3 + test/service/fileService/fileService.test.ts | 36 + tsconfig.json | 13 + tslint.json | 29 + ui/gist-selection/gist-selection.html | 95 ++ ui/gist-selection/gist-selection.js | 89 ++ ui/landing-page/landing-page.html | 178 +++ ui/landing-page/landing-page.js | 40 + ui/settings/settings.html | 68 + ui/settings/settings.js | 269 ++++ ui/shared/fonts.js | 19 + ui/shared/page-header.js | 18 + ui/shared/styles.css | 199 +++ .../vendor/bootstrap/css/bootstrap.min.css | 7 + .../vendor/bootstrap/js/bootstrap.min.js | 7 + .../fontawesome/css/fontawesome.min.css | 5 + .../vendor/fontawesome/css/solid.min.css | 5 + .../fontawesome/webfonts/fa-solid-900.ttf | Bin 0 -> 191832 bytes ui/shared/vendor/google/OpenSans-Bold.ttf | Bin 0 -> 103616 bytes ui/shared/vendor/google/Roboto-Bold.ttf | Bin 0 -> 170064 bytes ui/shared/vendor/google/Roboto-Regular.ttf | Bin 0 -> 170984 bytes .../vendor/jquery/jquery-3.3.1.slim.min.js | 2 + ui/shared/vendor/lodash/lodash.min.js | 137 ++ ui/shared/vendor/popper.js/popper.min.js | 5 + 130 files changed, 13320 insertions(+) create mode 100644 .github/FUNDING.yml create mode 100644 .github/ISSUE_TEMPLATE/---bug-report.md create mode 100644 .github/ISSUE_TEMPLATE/---feature-request.md create mode 100644 .github/ISSUE_TEMPLATE/--support-question.md create mode 100644 .gitignore create mode 100644 .history/configs/webpack.development.config_20241206220533.js create mode 100644 .history/configs/webpack.development.config_20241206235345.js create mode 100644 .history/configs/webpack.development.config_20241206235347.js create mode 100644 .history/package_20241206220533.json create mode 100644 .history/package_20241206233731.json create mode 100644 .history/package_20241206234457.json create mode 100644 .history/package_20241206234507.json create mode 100644 .history/package_20241206234513.json create mode 100644 .history/package_20241206234604.json create mode 100644 .history/package_20241206234710.json create mode 100644 .history/package_20241206234810.json create mode 100644 .history/package_20241206234811.json create mode 100644 .history/package_20241206234923.json create mode 100644 .history/package_20241206234924.json create mode 100644 .history/src/service/github.oauth.service_20241102143121.ts create mode 100644 .history/src/service/github.oauth.service_20241206235603.ts create mode 100644 .history/src/service/github.oauth.service_20241206235606.ts create mode 100644 .history/src/service/github.oauth.service_20241206235613.ts create mode 100644 .history/src/service/github.oauth.service_20241206235624.ts create mode 100644 .history/src/service/github.oauth.service_20241206235626.ts create mode 100644 .history/src/service/github.oauth.service_20241206235700.ts create mode 100644 .history/src/service/github.oauth.service_20241206235701.ts create mode 100644 .history/src/service/github.oauth.service_20241206235709.ts create mode 100644 .history/src/service/github.oauth.service_20241206235714.ts create mode 100644 .history/src/service/github.oauth.service_20241206235715.ts create mode 100644 .history/src/service/github.oauth.service_20241206235727.ts create mode 100644 .history/src/service/github.oauth.service_20241206235731.ts create mode 100644 .history/src/service/github.oauth.service_20241206235738.ts create mode 100644 .history/src/service/github.service_20241102143121.ts create mode 100644 .history/src/service/github.service_20241206235854.ts create mode 100644 .history/src/service/github.service_20241206235857.ts create mode 100644 .history/src/service/github.service_20241206235858.ts create mode 100644 .history/src/service/github.service_20241206235903.ts create mode 100644 .travis.yml create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json create mode 100644 .vscodeignore create mode 100644 CHANGELOG.md create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 PULL_REQUEST_TEMPLATE.md create mode 100644 README.md create mode 100644 code-settings-sync.code-workspace create mode 100644 configs/webpack.config.js create mode 100644 configs/webpack.development.config.js create mode 100644 configs/webpack.production.config.js create mode 100644 images/existing-gist.png create mode 100644 images/login-with-github.png create mode 100644 images/logo-128.png create mode 100644 images/logo-256.png create mode 100644 images/logo-512.png create mode 100644 images/logo.sketch create mode 100644 images/slack.png create mode 100644 images/white-cloud.png create mode 100644 install_local.txt create mode 100644 package.json create mode 100644 package.nls.de.json create mode 100644 package.nls.es.json create mode 100644 package.nls.fr.json create mode 100644 package.nls.hu.json create mode 100644 package.nls.it.json create mode 100644 package.nls.ja.json create mode 100644 package.nls.json create mode 100644 package.nls.ko.json create mode 100644 package.nls.pt-br.json create mode 100644 package.nls.ru.json create mode 100644 package.nls.tr.json create mode 100644 package.nls.zh-cn.json create mode 100644 package.nls.zh-tw.json create mode 100644 release-notes.json create mode 100644 scripts/deploy.sh create mode 100644 src/commons.ts create mode 100644 src/enums.ts create mode 100644 src/environmentPath.ts create mode 100644 src/extension.ts create mode 100644 src/localize.ts create mode 100644 src/lockfile.ts create mode 100644 src/models/cloudSettings.model.ts create mode 100644 src/models/customConfig.model.ts create mode 100644 src/models/extensionConfig.model.ts create mode 100644 src/models/language-pack.model.ts create mode 100644 src/models/localConfig.model.ts create mode 100644 src/models/settingType.model.ts create mode 100644 src/models/state.model.ts create mode 100644 src/models/webview.model.ts create mode 100644 src/pragmaUtil.ts create mode 100644 src/service/autoUpload.service.ts create mode 100644 src/service/file.service.ts create mode 100644 src/service/github.oauth.service.ts create mode 100644 src/service/github.service.ts create mode 100644 src/service/plugin.service.ts create mode 100644 src/service/webview.service.ts create mode 100644 src/state.ts create mode 100644 src/sync.ts create mode 100644 src/util.ts create mode 100644 test/extension.test.ts create mode 100644 test/index.ts create mode 100644 test/pragmaUtil/index.ts create mode 100644 test/pragmaUtil/testSettings.txt create mode 100644 test/service/fileService/dummyrc create mode 100644 test/service/fileService/fileService.test.ts create mode 100644 tsconfig.json create mode 100644 tslint.json create mode 100644 ui/gist-selection/gist-selection.html create mode 100644 ui/gist-selection/gist-selection.js create mode 100644 ui/landing-page/landing-page.html create mode 100644 ui/landing-page/landing-page.js create mode 100644 ui/settings/settings.html create mode 100644 ui/settings/settings.js create mode 100644 ui/shared/fonts.js create mode 100644 ui/shared/page-header.js create mode 100644 ui/shared/styles.css create mode 100644 ui/shared/vendor/bootstrap/css/bootstrap.min.css create mode 100644 ui/shared/vendor/bootstrap/js/bootstrap.min.js create mode 100644 ui/shared/vendor/fontawesome/css/fontawesome.min.css create mode 100644 ui/shared/vendor/fontawesome/css/solid.min.css create mode 100644 ui/shared/vendor/fontawesome/webfonts/fa-solid-900.ttf create mode 100644 ui/shared/vendor/google/OpenSans-Bold.ttf create mode 100644 ui/shared/vendor/google/Roboto-Bold.ttf create mode 100644 ui/shared/vendor/google/Roboto-Regular.ttf create mode 100644 ui/shared/vendor/jquery/jquery-3.3.1.slim.min.js create mode 100644 ui/shared/vendor/lodash/lodash.min.js create mode 100644 ui/shared/vendor/popper.js/popper.min.js diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..0628997f --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,5 @@ +# These are supported funding model platforms + +github: shanalikhan +open_collective: code-settings-sync +issuehunt: code-settings-sync diff --git a/.github/ISSUE_TEMPLATE/---bug-report.md b/.github/ISSUE_TEMPLATE/---bug-report.md new file mode 100644 index 00000000..4d0a41d1 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/---bug-report.md @@ -0,0 +1,37 @@ +--- +name: "\U0001F41B Bug report" +about: "Bugs, missing documentation, or unexpected behavior \U0001F914" + +--- + +🐛 **Describe the bug** +A clear and concise description of what the bug is. You are always welcome to check the [Troubleshooting](https://github.com/shanalikhan/code-settings-sync/wiki/Troubleshooting) section before filing the ticket. + + +🌴 **Visual Studio Code Version :** [ VERSION_HERE ] +🌴 **Code Settings Sync Version :** [ VERSION_HERE ] +🌴 **Standard or Insiders :** [ _here_ ] +🌴 **Portable or Installed :** [ _here_ ] +🌴 **OSS or Official Build :** [ _here_ ] +🌴 **Operating System :** [ VERSION_HERE ] +🌴 **Occurs On:** [Upload / Download / Help Configuring ] +🌴 **Proxy Enabled:** [ Yes / No ] +🌴 **Gist Id:** [ ID_HERE ] + + + +📰 **To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +💪 **Expected behavior** +A clear and concise description of what you expected to happen. + +📺 **Console Error Log** +If applicable, add screenshots or paste the console log from developer console of VSCode (Help Menu > Developer Tool - Console Tab). + +📺 **Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/---feature-request.md b/.github/ISSUE_TEMPLATE/---feature-request.md new file mode 100644 index 00000000..99bdb14d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/---feature-request.md @@ -0,0 +1,15 @@ +--- +name: "\U0001F4A1 Feature request" +about: "I have a suggestion (and might want to implement myself \U0001F642)! " + +--- + +💡 **Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +💡 **Describe the solution you'd like** +A clear and concise description of what you want to happen. + + +💡 **Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/--support-question.md b/.github/ISSUE_TEMPLATE/--support-question.md new file mode 100644 index 00000000..f77149b4 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/--support-question.md @@ -0,0 +1,14 @@ +--- +name: "❓ Support Question" +about: " \U0001F6D1 If you have a question \U0001F4AC, please check out our support + channels! " + +--- + +I will recommend to discuss about project over the slack. + +You can join the community from the following link: + +https://join.slack.com/t/codesettingssync/shared_invite/enQtNzQyODMzMzI5MDQ3LWNmZjVkZjE2YTg0MzY1Y2EyYzVmYThmNzg2YjZkNjhhZWY3ZTEzN2I3ZTAxMjkwNWU0ZjMyZGFhMjdiZDI3ODU + +Feel free to open ticket here. diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..c99c7b65 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +out +node_modules +package-lock.json +*.vsix +*.lock +*.log diff --git a/.history/configs/webpack.development.config_20241206220533.js b/.history/configs/webpack.development.config_20241206220533.js new file mode 100644 index 00000000..5b97ec30 --- /dev/null +++ b/.history/configs/webpack.development.config_20241206220533.js @@ -0,0 +1,9 @@ +"use strict"; + +const merge = require('webpack-merge'); +const common = require('./webpack.config.js'); + +module.exports = merge(common, { + mode: 'development', + devtool: 'source-map' +}); \ No newline at end of file diff --git a/.history/configs/webpack.development.config_20241206235345.js b/.history/configs/webpack.development.config_20241206235345.js new file mode 100644 index 00000000..1254f753 --- /dev/null +++ b/.history/configs/webpack.development.config_20241206235345.js @@ -0,0 +1,9 @@ +"use strict"; + +const {merge} = require('webpack-merge'); +const common = require('./webpack.config.js'); + +module.exports = merge(common, { + mode: 'development', + devtool: 'source-map' +}); \ No newline at end of file diff --git a/.history/configs/webpack.development.config_20241206235347.js b/.history/configs/webpack.development.config_20241206235347.js new file mode 100644 index 00000000..9397bffd --- /dev/null +++ b/.history/configs/webpack.development.config_20241206235347.js @@ -0,0 +1,9 @@ +"use strict"; + +const { merge } = require("webpack-merge"); +const common = require("./webpack.config.js"); + +module.exports = merge(common, { + mode: "development", + devtool: "source-map", +}); diff --git a/.history/package_20241206220533.json b/.history/package_20241206220533.json new file mode 100644 index 00000000..6c870bc5 --- /dev/null +++ b/.history/package_20241206220533.json @@ -0,0 +1,191 @@ +{ + "name": "code-settings-sync", + "displayName": "Settings Sync", + "description": "Synchronize Settings, Snippets, Themes, File Icons, Launch, Keybindings, Workspaces and Extensions Across Multiple Machines Using GitHub Gist.", + "version": "3.4.3", + "icon": "images/logo-128.png", + "publisher": "Shan", + "author": { + "name": "Shan Khan", + "url": "http://shanalikhan.github.io", + "email": "shanalikhan@hotmail.com" + }, + "homepage": "https://shanalikhan.github.io", + "galleryBanner": { + "color": "#3B4859", + "theme": "dark" + }, + "engines": { + "vscode": "^1.35.1" + }, + "badges": [ + { + "url": "https://vsmarketplacebadge.apphb.com/version/Shan.code-settings-sync.svg", + "description": "Latest Version", + "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" + }, + { + "url": "https://vsmarketplacebadge.apphb.com/installs/Shan.code-settings-sync.svg", + "description": "Total Downloads", + "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" + }, + { + "url": "https://vsmarketplacebadge.apphb.com/rating/Shan.code-settings-sync.svg", + "description": "Ratings", + "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" + }, + { + "url": "https://img.shields.io/badge/Join%20Community-slack-green.svg", + "description": "Join Slack Community", + "href": "https://join.slack.com/t/codesettingssync/shared_invite/enQtNzQyODMzMzI5MDQ3LWNmZjVkZjE2YTg0MzY1Y2EyYzVmYThmNzg2YjZkNjhhZWY3ZTEzN2I3ZTAxMjkwNWU0ZjMyZGFhMjdiZDI3ODU" + } + ], + "repository": { + "type": "git", + "url": "https://github.com/shanalikhan/code-settings-sync.git" + }, + "bugs": { + "url": "https://github.com/shanalikhan/code-settings-sync/issues", + "email": "shanalikhan@hotmail.com" + }, + "categories": [ + "Other" + ], + "keywords": [ + "vscode-sync", + "vscode-settings-sync", + "code-settings-sync", + "settings-sync", + "workspace-sync", + "multi-root ready" + ], + "extensionKind": "ui", + "activationEvents": [ + "*" + ], + "main": "./out/extension.js", + "contributes": { + "commands": [ + { + "command": "extension.HowSettings", + "title": "%cmd.howSetting.title%" + }, + { + "command": "extension.downloadSettings", + "title": "%cmd.downloadSettings.title%" + }, + { + "command": "extension.updateSettings", + "title": "%cmd.updateSettings.title%" + }, + { + "command": "extension.resetSettings", + "title": "%cmd.resetSettings.title%" + }, + { + "command": "extension.otherOptions", + "title": "%cmd.otherOptions.title%" + } + ], + "keybindings": [ + { + "key": "alt+shift+u", + "command": "extension.updateSettings" + }, + { + "key": "alt+shift+d", + "command": "extension.downloadSettings" + } + ], + "configuration": { + "properties": { + "sync.gist": { + "type": "string", + "default": "", + "description": "%ext.config.gist%" + }, + "sync.autoDownload": { + "type": "boolean", + "default": false, + "description": "%ext.config.autoDownload%" + }, + "sync.autoUpload": { + "type": "boolean", + "default": false, + "description": "%ext.config.autoUpload%" + }, + "sync.forceDownload": { + "type": "boolean", + "default": false, + "description": "%ext.config.forceDownload%" + }, + "sync.forceUpload": { + "type": "boolean", + "default": false, + "description": "%ext.config.forceUpload%" + }, + "sync.quietSync": { + "type": "boolean", + "default": false, + "description": "%ext.config.quietSync%" + }, + "sync.removeExtensions": { + "type": "boolean", + "default": true, + "description": "%ext.config.removeExtensions%" + }, + "sync.syncExtensions": { + "type": "boolean", + "default": true, + "description": "%ext.config.syncExtensions%" + } + }, + "title": "%ext.config.title%" + } + }, + "scripts": { + "vscode:prepublish": "npm run tslint-check && webpack --config configs/webpack.production.config.js", + "compile": "webpack --config configs/webpack.development.config.js", + "watch": "webpack --config configs/webpack.development.config.js --watch", + "postinstall": "node ./node_modules/vscode/bin/install", + "tslint-check": "tslint -c ./tslint.json ./src/**/*.ts ./src/*.ts", + "format": "prettier --write './src/**/*.ts'", + "test": "npm run tslint-check && tsc -p ./ && mocha --recursive \"./out/test/**/*.js\"" + }, + "devDependencies": { + "@types/chai": "4.2.1", + "@types/express": "^4.16.1", + "@types/lodash": "^4.14.123", + "@types/node-fetch": "^2.3.3", + "@types/fs-extra": "^8.0.0", + "@types/mocha": "^5.2.6", + "@types/node": "^12.0.9", + "@types/recursive-readdir": "^2.2.0", + "chai": "^4.2.0", + "clean-webpack-plugin": "^3.0.0", + "mocha": "^6.0.2", + "prettier": "^1.16.4", + "ts-loader": "^5.3.3", + "tslint": "^5.15.0", + "tslint-plugin-prettier": "^2.0.1", + "typescript": "^3.4.1", + "vscode": "^1.1.33", + "webpack": "^4.29.6", + "webpack-cli": "^3.3.0", + "webpack-merge": "^4.2.1" + }, + "dependencies": { + "@octokit/rest": "^16.23.2", + "adm-zip": "^0.4.13", + "const": "^1.0.0", + "express": "^4.16.4", + "fs-extra": "^8.0.1", + "https-proxy-agent": "^2.2.1", + "lockfile": "^1.0.4", + "lodash": "^4.17.15", + "node-fetch": "^2.5.0", + "recursive-readdir": "^2.2.2", + "temp": "^0.9.0", + "vscode-chokidar": "^2.1.6" + } +} diff --git a/.history/package_20241206233731.json b/.history/package_20241206233731.json new file mode 100644 index 00000000..8c74cd9f --- /dev/null +++ b/.history/package_20241206233731.json @@ -0,0 +1,191 @@ +{ + "name": "code-settings-sync", + "displayName": "Settings Sync", + "description": "Synchronize Settings, Snippets, Themes, File Icons, Launch, Keybindings, Workspaces and Extensions Across Multiple Machines Using GitHub Gist.", + "version": "3.4.3", + "icon": "images/logo-128.png", + "publisher": "Shan", + "author": { + "name": "Shan Khan", + "url": "http://shanalikhan.github.io", + "email": "shanalikhan@hotmail.com" + }, + "homepage": "https://shanalikhan.github.io", + "galleryBanner": { + "color": "#3B4859", + "theme": "dark" + }, + "engines": { + "vscode": "^1.95.0" + }, + "badges": [ + { + "url": "https://vsmarketplacebadge.apphb.com/version/Shan.code-settings-sync.svg", + "description": "Latest Version", + "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" + }, + { + "url": "https://vsmarketplacebadge.apphb.com/installs/Shan.code-settings-sync.svg", + "description": "Total Downloads", + "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" + }, + { + "url": "https://vsmarketplacebadge.apphb.com/rating/Shan.code-settings-sync.svg", + "description": "Ratings", + "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" + }, + { + "url": "https://img.shields.io/badge/Join%20Community-slack-green.svg", + "description": "Join Slack Community", + "href": "https://join.slack.com/t/codesettingssync/shared_invite/enQtNzQyODMzMzI5MDQ3LWNmZjVkZjE2YTg0MzY1Y2EyYzVmYThmNzg2YjZkNjhhZWY3ZTEzN2I3ZTAxMjkwNWU0ZjMyZGFhMjdiZDI3ODU" + } + ], + "repository": { + "type": "git", + "url": "https://github.com/shanalikhan/code-settings-sync.git" + }, + "bugs": { + "url": "https://github.com/shanalikhan/code-settings-sync/issues", + "email": "shanalikhan@hotmail.com" + }, + "categories": [ + "Other" + ], + "keywords": [ + "vscode-sync", + "vscode-settings-sync", + "code-settings-sync", + "settings-sync", + "workspace-sync", + "multi-root ready" + ], + "extensionKind": "ui", + "activationEvents": [ + "*" + ], + "main": "./out/extension.js", + "contributes": { + "commands": [ + { + "command": "extension.HowSettings", + "title": "%cmd.howSetting.title%" + }, + { + "command": "extension.downloadSettings", + "title": "%cmd.downloadSettings.title%" + }, + { + "command": "extension.updateSettings", + "title": "%cmd.updateSettings.title%" + }, + { + "command": "extension.resetSettings", + "title": "%cmd.resetSettings.title%" + }, + { + "command": "extension.otherOptions", + "title": "%cmd.otherOptions.title%" + } + ], + "keybindings": [ + { + "key": "alt+shift+u", + "command": "extension.updateSettings" + }, + { + "key": "alt+shift+d", + "command": "extension.downloadSettings" + } + ], + "configuration": { + "properties": { + "sync.gist": { + "type": "string", + "default": "", + "description": "%ext.config.gist%" + }, + "sync.autoDownload": { + "type": "boolean", + "default": false, + "description": "%ext.config.autoDownload%" + }, + "sync.autoUpload": { + "type": "boolean", + "default": false, + "description": "%ext.config.autoUpload%" + }, + "sync.forceDownload": { + "type": "boolean", + "default": false, + "description": "%ext.config.forceDownload%" + }, + "sync.forceUpload": { + "type": "boolean", + "default": false, + "description": "%ext.config.forceUpload%" + }, + "sync.quietSync": { + "type": "boolean", + "default": false, + "description": "%ext.config.quietSync%" + }, + "sync.removeExtensions": { + "type": "boolean", + "default": true, + "description": "%ext.config.removeExtensions%" + }, + "sync.syncExtensions": { + "type": "boolean", + "default": true, + "description": "%ext.config.syncExtensions%" + } + }, + "title": "%ext.config.title%" + } + }, + "scripts": { + "vscode:prepublish": "npm run tslint-check && webpack --config configs/webpack.production.config.js", + "compile": "webpack --config configs/webpack.development.config.js", + "watch": "webpack --config configs/webpack.development.config.js --watch", + "postinstall": "node ./node_modules/vscode/bin/install", + "tslint-check": "tslint -c ./tslint.json ./src/**/*.ts ./src/*.ts", + "format": "prettier --write './src/**/*.ts'", + "test": "npm run tslint-check && tsc -p ./ && mocha --recursive \"./out/test/**/*.js\"" + }, + "devDependencies": { + "@types/chai": "4.2.1", + "@types/express": "^4.16.1", + "@types/lodash": "^4.14.123", + "@types/node-fetch": "^2.3.3", + "@types/fs-extra": "^8.0.0", + "@types/mocha": "^5.2.6", + "@types/node": "^12.0.9", + "@types/recursive-readdir": "^2.2.0", + "chai": "^4.2.0", + "clean-webpack-plugin": "^3.0.0", + "mocha": "^6.0.2", + "prettier": "^1.16.4", + "ts-loader": "^5.3.3", + "tslint": "^5.15.0", + "tslint-plugin-prettier": "^2.0.1", + "typescript": "^3.4.1", + "vscode": "^1.1.33", + "webpack": "^4.29.6", + "webpack-cli": "^3.3.0", + "webpack-merge": "^4.2.1" + }, + "dependencies": { + "@octokit/rest": "^16.23.2", + "adm-zip": "^0.4.13", + "const": "^1.0.0", + "express": "^4.16.4", + "fs-extra": "^8.0.1", + "https-proxy-agent": "^2.2.1", + "lockfile": "^1.0.4", + "lodash": "^4.17.15", + "node-fetch": "^2.5.0", + "recursive-readdir": "^2.2.2", + "temp": "^0.9.0", + "vscode-chokidar": "^2.1.6" + } +} \ No newline at end of file diff --git a/.history/package_20241206234457.json b/.history/package_20241206234457.json new file mode 100644 index 00000000..10e889ec --- /dev/null +++ b/.history/package_20241206234457.json @@ -0,0 +1,192 @@ +{ + "name": "code-settings-sync", + "displayName": "Settings Sync", + "description": "Synchronize Settings, Snippets, Themes, File Icons, Launch, Keybindings, Workspaces and Extensions Across Multiple Machines Using GitHub Gist.", + "version": "3.4.3", + "icon": "images/logo-128.png", + "publisher": "Shan", + "author": { + "name": "Shan Khan", + "url": "http://shanalikhan.github.io", + "email": "shanalikhan@hotmail.com" + }, + "homepage": "https://shanalikhan.github.io", + "galleryBanner": { + "color": "#3B4859", + "theme": "dark" + }, + "engines": { + "vscode": "^1.95.0" + }, + "badges": [ + { + "url": "https://vsmarketplacebadge.apphb.com/version/Shan.code-settings-sync.svg", + "description": "Latest Version", + "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" + }, + { + "url": "https://vsmarketplacebadge.apphb.com/installs/Shan.code-settings-sync.svg", + "description": "Total Downloads", + "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" + }, + { + "url": "https://vsmarketplacebadge.apphb.com/rating/Shan.code-settings-sync.svg", + "description": "Ratings", + "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" + }, + { + "url": "https://img.shields.io/badge/Join%20Community-slack-green.svg", + "description": "Join Slack Community", + "href": "https://join.slack.com/t/codesettingssync/shared_invite/enQtNzQyODMzMzI5MDQ3LWNmZjVkZjE2YTg0MzY1Y2EyYzVmYThmNzg2YjZkNjhhZWY3ZTEzN2I3ZTAxMjkwNWU0ZjMyZGFhMjdiZDI3ODU" + } + ], + "repository": { + "type": "git", + "url": "https://github.com/shanalikhan/code-settings-sync.git" + }, + "bugs": { + "url": "https://github.com/shanalikhan/code-settings-sync/issues", + "email": "shanalikhan@hotmail.com" + }, + "categories": [ + "Other" + ], + "keywords": [ + "vscode-sync", + "vscode-settings-sync", + "code-settings-sync", + "settings-sync", + "workspace-sync", + "multi-root ready" + ], + "extensionKind": "ui", + "activationEvents": [ + "*" + ], + "main": "./out/extension.js", + "contributes": { + "commands": [ + { + "command": "extension.HowSettings", + "title": "%cmd.howSetting.title%" + }, + { + "command": "extension.downloadSettings", + "title": "%cmd.downloadSettings.title%" + }, + { + "command": "extension.updateSettings", + "title": "%cmd.updateSettings.title%" + }, + { + "command": "extension.resetSettings", + "title": "%cmd.resetSettings.title%" + }, + { + "command": "extension.otherOptions", + "title": "%cmd.otherOptions.title%" + } + ], + "keybindings": [ + { + "key": "alt+shift+u", + "command": "extension.updateSettings" + }, + { + "key": "alt+shift+d", + "command": "extension.downloadSettings" + } + ], + "configuration": { + "properties": { + "sync.gist": { + "type": "string", + "default": "", + "description": "%ext.config.gist%" + }, + "sync.autoDownload": { + "type": "boolean", + "default": false, + "description": "%ext.config.autoDownload%" + }, + "sync.autoUpload": { + "type": "boolean", + "default": false, + "description": "%ext.config.autoUpload%" + }, + "sync.forceDownload": { + "type": "boolean", + "default": false, + "description": "%ext.config.forceDownload%" + }, + "sync.forceUpload": { + "type": "boolean", + "default": false, + "description": "%ext.config.forceUpload%" + }, + "sync.quietSync": { + "type": "boolean", + "default": false, + "description": "%ext.config.quietSync%" + }, + "sync.removeExtensions": { + "type": "boolean", + "default": true, + "description": "%ext.config.removeExtensions%" + }, + "sync.syncExtensions": { + "type": "boolean", + "default": true, + "description": "%ext.config.syncExtensions%" + } + }, + "title": "%ext.config.title%" + } + }, + "scripts": { + "vscode:prepublish": "npm run tslint-check && webpack --config configs/webpack.production.config.js", + "compile": "webpack --config configs/webpack.development.config.js", + "watch": "webpack --config configs/webpack.development.config.js --watch", + "postinstall": "node ./node_modules/vscode/bin/install", + "tslint-check": "tslint -c ./tslint.json ./src/**/*.ts ./src/*.ts", + "format": "prettier --write './src/**/*.ts'", + "test": "npm run tslint-check && tsc -p ./ && mocha --recursive \"./out/test/**/*.js\"" + }, + "devDependencies": { + "@types/chai": "^5.0.1", + "@types/express": "^5.0.0", + "@types/fs-extra": "^11.0.4", + "@types/lodash": "^4.14.123", + "@types/mocha": "^10.0.10", + "@types/node": "^22.10.1", + "@types/node-fetch": "^2.6.12", + "@types/recursive-readdir": "^2.2.0", + "@types/vscode": "^1.95.0", + "chai": "^5.1.2", + "clean-webpack-plugin": "^4.0.0", + "mocha": "^11.0.1", + "prettier": "^3.4.2", + "ts-loader": "^9.5.1", + "tslint": "^6.1.3", + "tslint-plugin-prettier": "^2.3.0", + "typescript": "^5.7.2", + "vscode": "^1.1.33", + "webpack": "^5.97.1", + "webpack-cli": "^5.1.4", + "webpack-merge": "^6.0.1" + }, + "dependencies": { + "@octokit/rest": "^21.0.2", + "adm-zip": "^0.5.16", + "const": "^1.0.0", + "express": "^4.21.2", + "fs-extra": "^11.2.0", + "https-proxy-agent": "^7.0.5", + "lockfile": "^1.0.4", + "lodash": "^4.17.15", + "node-fetch": "^3.3.2", + "recursive-readdir": "^2.2.2", + "temp": "^0.9.0", + "vscode-chokidar": "^2.1.6" + } +} \ No newline at end of file diff --git a/.history/package_20241206234507.json b/.history/package_20241206234507.json new file mode 100644 index 00000000..7bfb16e1 --- /dev/null +++ b/.history/package_20241206234507.json @@ -0,0 +1,192 @@ +{ + "name": "code-settings-sync", + "displayName": "Settings Sync", + "description": "Synchronize Settings, Snippets, Themes, File Icons, Launch, Keybindings, Workspaces and Extensions Across Multiple Machines Using GitHub Gist.", + "version": "3.4.3", + "icon": "images/logo-128.png", + "publisher": "Shan", + "author": { + "name": "Shan Khan", + "url": "http://shanalikhan.github.io", + "email": "shanalikhan@hotmail.com" + }, + "homepage": "https://shanalikhan.github.io", + "galleryBanner": { + "color": "#3B4859", + "theme": "dark" + }, + "engines": { + "vscode": "^1.95.0" + }, + "badges": [ + { + "url": "https://vsmarketplacebadge.apphb.com/version/Shan.code-settings-sync.svg", + "description": "Latest Version", + "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" + }, + { + "url": "https://vsmarketplacebadge.apphb.com/installs/Shan.code-settings-sync.svg", + "description": "Total Downloads", + "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" + }, + { + "url": "https://vsmarketplacebadge.apphb.com/rating/Shan.code-settings-sync.svg", + "description": "Ratings", + "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" + }, + { + "url": "https://img.shields.io/badge/Join%20Community-slack-green.svg", + "description": "Join Slack Community", + "href": "https://join.slack.com/t/codesettingssync/shared_invite/enQtNzQyODMzMzI5MDQ3LWNmZjVkZjE2YTg0MzY1Y2EyYzVmYThmNzg2YjZkNjhhZWY3ZTEzN2I3ZTAxMjkwNWU0ZjMyZGFhMjdiZDI3ODU" + } + ], + "repository": { + "type": "git", + "url": "https://github.com/shanalikhan/code-settings-sync.git" + }, + "bugs": { + "url": "https://github.com/shanalikhan/code-settings-sync/issues", + "email": "shanalikhan@hotmail.com" + }, + "categories": [ + "Other" + ], + "keywords": [ + "vscode-sync", + "vscode-settings-sync", + "code-settings-sync", + "settings-sync", + "workspace-sync", + "multi-root ready" + ], + "extensionKind": "ui", + "activationEvents": [ + "*" + ], + "main": "./out/extension.js", + "contributes": { + "commands": [ + { + "command": "extension.HowSettings", + "title": "%cmd.howSetting.title%" + }, + { + "command": "extension.downloadSettings", + "title": "%cmd.downloadSettings.title%" + }, + { + "command": "extension.updateSettings", + "title": "%cmd.updateSettings.title%" + }, + { + "command": "extension.resetSettings", + "title": "%cmd.resetSettings.title%" + }, + { + "command": "extension.otherOptions", + "title": "%cmd.otherOptions.title%" + } + ], + "keybindings": [ + { + "key": "alt+shift+u", + "command": "extension.updateSettings" + }, + { + "key": "alt+shift+d", + "command": "extension.downloadSettings" + } + ], + "configuration": { + "properties": { + "sync.gist": { + "type": "string", + "default": "", + "description": "%ext.config.gist%" + }, + "sync.autoDownload": { + "type": "boolean", + "default": false, + "description": "%ext.config.autoDownload%" + }, + "sync.autoUpload": { + "type": "boolean", + "default": false, + "description": "%ext.config.autoUpload%" + }, + "sync.forceDownload": { + "type": "boolean", + "default": false, + "description": "%ext.config.forceDownload%" + }, + "sync.forceUpload": { + "type": "boolean", + "default": false, + "description": "%ext.config.forceUpload%" + }, + "sync.quietSync": { + "type": "boolean", + "default": false, + "description": "%ext.config.quietSync%" + }, + "sync.removeExtensions": { + "type": "boolean", + "default": true, + "description": "%ext.config.removeExtensions%" + }, + "sync.syncExtensions": { + "type": "boolean", + "default": true, + "description": "%ext.config.syncExtensions%" + } + }, + "title": "%ext.config.title%" + } + }, + "scripts": { + "vscode:prepublish": "npm run tslint-check && webpack --config configs/webpack.production.config.js", + "compile": "webpack --config configs/webpack.development.config.js", + "watch": "webpack --config configs/webpack.development.config.js --watch", + "postinstall": "node ./node_modules/vscode/bin/install", + "tslint-check": "tslint -c ./tslint.json ./src/**/*.ts ./src/*.ts", + "format": "prettier --write './src/**/*.ts'", + "test": "npm run tslint-check && tsc -p ./ && mocha --recursive \"./out/test/**/*.js\"" + }, + "devDependencies": { + "@types/chai": "^5.0.1", + "@types/express": "^5.0.0", + "@types/fs-extra": "^11.0.4", + "@types/lodash": "^4.14.123", + "@types/mocha": "^10.0.10", + "@types/node": "^22.10.1", + "@types/node-fetch": "^2.6.12", + "@types/recursive-readdir": "^2.2.0", + "@types/vscode": "^1.95.0", + "chai": "^5.1.2", + "clean-webpack-plugin": "^4.0.0", + "mocha": "^11.0.1", + "prettier": "^3.4.2", + "ts-loader": "^9.5.1", + "tslint": "^6.1.3", + "tslint-plugin-prettier": "^2.3.0", + "typescript": "^5.7.2", + "vscode": "^1.1.37", + "webpack": "^5.97.1", + "webpack-cli": "^5.1.4", + "webpack-merge": "^6.0.1" + }, + "dependencies": { + "@octokit/rest": "^21.0.2", + "adm-zip": "^0.5.16", + "const": "^1.0.0", + "express": "^4.21.2", + "fs-extra": "^11.2.0", + "https-proxy-agent": "^7.0.5", + "lockfile": "^1.0.4", + "lodash": "^4.17.15", + "node-fetch": "^3.3.2", + "recursive-readdir": "^2.2.2", + "temp": "^0.9.0", + "vscode-chokidar": "^2.1.6" + } +} \ No newline at end of file diff --git a/.history/package_20241206234513.json b/.history/package_20241206234513.json new file mode 100644 index 00000000..9db30d5b --- /dev/null +++ b/.history/package_20241206234513.json @@ -0,0 +1,192 @@ +{ + "name": "code-settings-sync", + "displayName": "Settings Sync", + "description": "Synchronize Settings, Snippets, Themes, File Icons, Launch, Keybindings, Workspaces and Extensions Across Multiple Machines Using GitHub Gist.", + "version": "3.4.3", + "icon": "images/logo-128.png", + "publisher": "Shan", + "author": { + "name": "Shan Khan", + "url": "http://shanalikhan.github.io", + "email": "shanalikhan@hotmail.com" + }, + "homepage": "https://shanalikhan.github.io", + "galleryBanner": { + "color": "#3B4859", + "theme": "dark" + }, + "engines": { + "vscode": "^1.95.0" + }, + "badges": [ + { + "url": "https://vsmarketplacebadge.apphb.com/version/Shan.code-settings-sync.svg", + "description": "Latest Version", + "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" + }, + { + "url": "https://vsmarketplacebadge.apphb.com/installs/Shan.code-settings-sync.svg", + "description": "Total Downloads", + "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" + }, + { + "url": "https://vsmarketplacebadge.apphb.com/rating/Shan.code-settings-sync.svg", + "description": "Ratings", + "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" + }, + { + "url": "https://img.shields.io/badge/Join%20Community-slack-green.svg", + "description": "Join Slack Community", + "href": "https://join.slack.com/t/codesettingssync/shared_invite/enQtNzQyODMzMzI5MDQ3LWNmZjVkZjE2YTg0MzY1Y2EyYzVmYThmNzg2YjZkNjhhZWY3ZTEzN2I3ZTAxMjkwNWU0ZjMyZGFhMjdiZDI3ODU" + } + ], + "repository": { + "type": "git", + "url": "https://github.com/shanalikhan/code-settings-sync.git" + }, + "bugs": { + "url": "https://github.com/shanalikhan/code-settings-sync/issues", + "email": "shanalikhan@hotmail.com" + }, + "categories": [ + "Other" + ], + "keywords": [ + "vscode-sync", + "vscode-settings-sync", + "code-settings-sync", + "settings-sync", + "workspace-sync", + "multi-root ready" + ], + "extensionKind": "ui", + "activationEvents": [ + "*" + ], + "main": "./out/extension.js", + "contributes": { + "commands": [ + { + "command": "extension.HowSettings", + "title": "%cmd.howSetting.title%" + }, + { + "command": "extension.downloadSettings", + "title": "%cmd.downloadSettings.title%" + }, + { + "command": "extension.updateSettings", + "title": "%cmd.updateSettings.title%" + }, + { + "command": "extension.resetSettings", + "title": "%cmd.resetSettings.title%" + }, + { + "command": "extension.otherOptions", + "title": "%cmd.otherOptions.title%" + } + ], + "keybindings": [ + { + "key": "alt+shift+u", + "command": "extension.updateSettings" + }, + { + "key": "alt+shift+d", + "command": "extension.downloadSettings" + } + ], + "configuration": { + "properties": { + "sync.gist": { + "type": "string", + "default": "", + "description": "%ext.config.gist%" + }, + "sync.autoDownload": { + "type": "boolean", + "default": false, + "description": "%ext.config.autoDownload%" + }, + "sync.autoUpload": { + "type": "boolean", + "default": false, + "description": "%ext.config.autoUpload%" + }, + "sync.forceDownload": { + "type": "boolean", + "default": false, + "description": "%ext.config.forceDownload%" + }, + "sync.forceUpload": { + "type": "boolean", + "default": false, + "description": "%ext.config.forceUpload%" + }, + "sync.quietSync": { + "type": "boolean", + "default": false, + "description": "%ext.config.quietSync%" + }, + "sync.removeExtensions": { + "type": "boolean", + "default": true, + "description": "%ext.config.removeExtensions%" + }, + "sync.syncExtensions": { + "type": "boolean", + "default": true, + "description": "%ext.config.syncExtensions%" + } + }, + "title": "%ext.config.title%" + } + }, + "scripts": { + "vscode:prepublish": "npm run tslint-check && webpack --config configs/webpack.production.config.js", + "compile": "webpack --config configs/webpack.development.config.js", + "watch": "webpack --config configs/webpack.development.config.js --watch", + "postinstall": "node ./node_modules/vscode/bin/install", + "tslint-check": "tslint -c ./tslint.json ./src/**/*.ts ./src/*.ts", + "format": "prettier --write './src/**/*.ts'", + "test": "npm run tslint-check && tsc -p ./ && mocha --recursive \"./out/test/**/*.js\"" + }, + "devDependencies": { + "@types/chai": "^5.0.1", + "@types/express": "^5.0.0", + "@types/fs-extra": "^11.0.4", + "@types/lodash": "^4.14.123", + "@types/mocha": "^10.0.10", + "@types/node": "^22.10.1", + "@types/node-fetch": "^2.6.12", + "@types/recursive-readdir": "^2.2.4", + "@types/vscode": "^1.95.0", + "chai": "^5.1.2", + "clean-webpack-plugin": "^4.0.0", + "mocha": "^11.0.1", + "prettier": "^3.4.2", + "ts-loader": "^9.5.1", + "tslint": "^6.1.3", + "tslint-plugin-prettier": "^2.3.0", + "typescript": "^5.7.2", + "vscode": "^1.1.37", + "webpack": "^5.97.1", + "webpack-cli": "^5.1.4", + "webpack-merge": "^6.0.1" + }, + "dependencies": { + "@octokit/rest": "^21.0.2", + "adm-zip": "^0.5.16", + "const": "^1.0.0", + "express": "^4.21.2", + "fs-extra": "^11.2.0", + "https-proxy-agent": "^7.0.5", + "lockfile": "^1.0.4", + "lodash": "^4.17.15", + "node-fetch": "^3.3.2", + "recursive-readdir": "^2.2.2", + "temp": "^0.9.0", + "vscode-chokidar": "^2.1.6" + } +} \ No newline at end of file diff --git a/.history/package_20241206234604.json b/.history/package_20241206234604.json new file mode 100644 index 00000000..43528533 --- /dev/null +++ b/.history/package_20241206234604.json @@ -0,0 +1,192 @@ +{ + "name": "code-settings-sync", + "displayName": "Settings Sync", + "description": "Synchronize Settings, Snippets, Themes, File Icons, Launch, Keybindings, Workspaces and Extensions Across Multiple Machines Using GitHub Gist.", + "version": "3.4.3", + "icon": "images/logo-128.png", + "publisher": "Shan", + "author": { + "name": "Shan Khan", + "url": "http://shanalikhan.github.io", + "email": "shanalikhan@hotmail.com" + }, + "homepage": "https://shanalikhan.github.io", + "galleryBanner": { + "color": "#3B4859", + "theme": "dark" + }, + "engines": { + "vscode": "^1.95.0" + }, + "badges": [ + { + "url": "https://vsmarketplacebadge.apphb.com/version/Shan.code-settings-sync.svg", + "description": "Latest Version", + "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" + }, + { + "url": "https://vsmarketplacebadge.apphb.com/installs/Shan.code-settings-sync.svg", + "description": "Total Downloads", + "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" + }, + { + "url": "https://vsmarketplacebadge.apphb.com/rating/Shan.code-settings-sync.svg", + "description": "Ratings", + "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" + }, + { + "url": "https://img.shields.io/badge/Join%20Community-slack-green.svg", + "description": "Join Slack Community", + "href": "https://join.slack.com/t/codesettingssync/shared_invite/enQtNzQyODMzMzI5MDQ3LWNmZjVkZjE2YTg0MzY1Y2EyYzVmYThmNzg2YjZkNjhhZWY3ZTEzN2I3ZTAxMjkwNWU0ZjMyZGFhMjdiZDI3ODU" + } + ], + "repository": { + "type": "git", + "url": "https://github.com/shanalikhan/code-settings-sync.git" + }, + "bugs": { + "url": "https://github.com/shanalikhan/code-settings-sync/issues", + "email": "shanalikhan@hotmail.com" + }, + "categories": [ + "Other" + ], + "keywords": [ + "vscode-sync", + "vscode-settings-sync", + "code-settings-sync", + "settings-sync", + "workspace-sync", + "multi-root ready" + ], + "extensionKind": "ui", + "activationEvents": [ + "*" + ], + "main": "./out/extension.js", + "contributes": { + "commands": [ + { + "command": "extension.HowSettings", + "title": "%cmd.howSetting.title%" + }, + { + "command": "extension.downloadSettings", + "title": "%cmd.downloadSettings.title%" + }, + { + "command": "extension.updateSettings", + "title": "%cmd.updateSettings.title%" + }, + { + "command": "extension.resetSettings", + "title": "%cmd.resetSettings.title%" + }, + { + "command": "extension.otherOptions", + "title": "%cmd.otherOptions.title%" + } + ], + "keybindings": [ + { + "key": "alt+shift+u", + "command": "extension.updateSettings" + }, + { + "key": "alt+shift+d", + "command": "extension.downloadSettings" + } + ], + "configuration": { + "properties": { + "sync.gist": { + "type": "string", + "default": "", + "description": "%ext.config.gist%" + }, + "sync.autoDownload": { + "type": "boolean", + "default": false, + "description": "%ext.config.autoDownload%" + }, + "sync.autoUpload": { + "type": "boolean", + "default": false, + "description": "%ext.config.autoUpload%" + }, + "sync.forceDownload": { + "type": "boolean", + "default": false, + "description": "%ext.config.forceDownload%" + }, + "sync.forceUpload": { + "type": "boolean", + "default": false, + "description": "%ext.config.forceUpload%" + }, + "sync.quietSync": { + "type": "boolean", + "default": false, + "description": "%ext.config.quietSync%" + }, + "sync.removeExtensions": { + "type": "boolean", + "default": true, + "description": "%ext.config.removeExtensions%" + }, + "sync.syncExtensions": { + "type": "boolean", + "default": true, + "description": "%ext.config.syncExtensions%" + } + }, + "title": "%ext.config.title%" + } + }, + "scripts": { + "vscode:prepublish": "npm run tslint-check && webpack --config configs/webpack.production.config.js", + "compile": "webpack --config configs/webpack.development.config.js", + "watch": "webpack --config configs/webpack.development.config.js --watch", + "postinstall": "node ./node_modules/vscode/bin/install", + "tslint-check": "tslint -c ./tslint.json ./src/**/*.ts ./src/*.ts", + "format": "prettier --write './src/**/*.ts'", + "test": "npm run tslint-check && tsc -p ./ && mocha --recursive \"./out/test/**/*.js\"" + }, + "devDependencies": { + "@types/chai": "^5.0.1", + "@types/express": "^5.0.0", + "@types/fs-extra": "^11.0.4", + "@types/lodash": "^4.14.123", + "@types/mocha": "^10.0.10", + "@types/node": "^20.10.0", + "@types/node-fetch": "^2.6.12", + "@types/recursive-readdir": "^2.2.4", + "@types/vscode": "^1.95.0", + "chai": "^5.1.2", + "clean-webpack-plugin": "^4.0.0", + "mocha": "^11.0.1", + "prettier": "^3.4.2", + "ts-loader": "^9.5.1", + "tslint": "^6.1.3", + "tslint-plugin-prettier": "^2.3.0", + "typescript": "^5.7.2", + "vscode": "^1.1.37", + "webpack": "^5.97.1", + "webpack-cli": "^5.1.4", + "webpack-merge": "^6.0.1" + }, + "dependencies": { + "@octokit/rest": "^21.0.2", + "adm-zip": "^0.5.16", + "const": "^1.0.0", + "express": "^4.21.2", + "fs-extra": "^11.2.0", + "https-proxy-agent": "^7.0.5", + "lockfile": "^1.0.4", + "lodash": "^4.17.15", + "node-fetch": "^3.3.2", + "recursive-readdir": "^2.2.2", + "temp": "^0.9.0", + "vscode-chokidar": "^2.1.6" + } +} \ No newline at end of file diff --git a/.history/package_20241206234710.json b/.history/package_20241206234710.json new file mode 100644 index 00000000..9aa6fa5b --- /dev/null +++ b/.history/package_20241206234710.json @@ -0,0 +1,191 @@ +{ + "name": "code-settings-sync", + "displayName": "Settings Sync", + "description": "Synchronize Settings, Snippets, Themes, File Icons, Launch, Keybindings, Workspaces and Extensions Across Multiple Machines Using GitHub Gist.", + "version": "3.4.3", + "icon": "images/logo-128.png", + "publisher": "Shan", + "author": { + "name": "Shan Khan", + "url": "http://shanalikhan.github.io", + "email": "shanalikhan@hotmail.com" + }, + "homepage": "https://shanalikhan.github.io", + "galleryBanner": { + "color": "#3B4859", + "theme": "dark" + }, + "engines": { + "vscode": "^1.95.0" + }, + "badges": [ + { + "url": "https://vsmarketplacebadge.apphb.com/version/Shan.code-settings-sync.svg", + "description": "Latest Version", + "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" + }, + { + "url": "https://vsmarketplacebadge.apphb.com/installs/Shan.code-settings-sync.svg", + "description": "Total Downloads", + "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" + }, + { + "url": "https://vsmarketplacebadge.apphb.com/rating/Shan.code-settings-sync.svg", + "description": "Ratings", + "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" + }, + { + "url": "https://img.shields.io/badge/Join%20Community-slack-green.svg", + "description": "Join Slack Community", + "href": "https://join.slack.com/t/codesettingssync/shared_invite/enQtNzQyODMzMzI5MDQ3LWNmZjVkZjE2YTg0MzY1Y2EyYzVmYThmNzg2YjZkNjhhZWY3ZTEzN2I3ZTAxMjkwNWU0ZjMyZGFhMjdiZDI3ODU" + } + ], + "repository": { + "type": "git", + "url": "https://github.com/shanalikhan/code-settings-sync.git" + }, + "bugs": { + "url": "https://github.com/shanalikhan/code-settings-sync/issues", + "email": "shanalikhan@hotmail.com" + }, + "categories": [ + "Other" + ], + "keywords": [ + "vscode-sync", + "vscode-settings-sync", + "code-settings-sync", + "settings-sync", + "workspace-sync", + "multi-root ready" + ], + "extensionKind": "ui", + "activationEvents": [ + "*" + ], + "main": "./out/extension.js", + "contributes": { + "commands": [ + { + "command": "extension.HowSettings", + "title": "%cmd.howSetting.title%" + }, + { + "command": "extension.downloadSettings", + "title": "%cmd.downloadSettings.title%" + }, + { + "command": "extension.updateSettings", + "title": "%cmd.updateSettings.title%" + }, + { + "command": "extension.resetSettings", + "title": "%cmd.resetSettings.title%" + }, + { + "command": "extension.otherOptions", + "title": "%cmd.otherOptions.title%" + } + ], + "keybindings": [ + { + "key": "alt+shift+u", + "command": "extension.updateSettings" + }, + { + "key": "alt+shift+d", + "command": "extension.downloadSettings" + } + ], + "configuration": { + "properties": { + "sync.gist": { + "type": "string", + "default": "", + "description": "%ext.config.gist%" + }, + "sync.autoDownload": { + "type": "boolean", + "default": false, + "description": "%ext.config.autoDownload%" + }, + "sync.autoUpload": { + "type": "boolean", + "default": false, + "description": "%ext.config.autoUpload%" + }, + "sync.forceDownload": { + "type": "boolean", + "default": false, + "description": "%ext.config.forceDownload%" + }, + "sync.forceUpload": { + "type": "boolean", + "default": false, + "description": "%ext.config.forceUpload%" + }, + "sync.quietSync": { + "type": "boolean", + "default": false, + "description": "%ext.config.quietSync%" + }, + "sync.removeExtensions": { + "type": "boolean", + "default": true, + "description": "%ext.config.removeExtensions%" + }, + "sync.syncExtensions": { + "type": "boolean", + "default": true, + "description": "%ext.config.syncExtensions%" + } + }, + "title": "%ext.config.title%" + } + }, + "scripts": { + "vscode:prepublish": "npm run tslint-check && webpack --config configs/webpack.production.config.js", + "compile": "webpack --config configs/webpack.development.config.js", + "watch": "webpack --config configs/webpack.development.config.js --watch", + "postinstall": "node ./node_modules/vscode/bin/install", + "tslint-check": "tslint -c ./tslint.json ./src/**/*.ts ./src/*.ts", + "format": "prettier --write './src/**/*.ts'", + "test": "npm run tslint-check && tsc -p ./ && mocha --recursive \"./out/test/**/*.js\"" + }, + "devDependencies": { + "@types/chai": "^5.0.1", + "@types/express": "^5.0.0", + "@types/fs-extra": "^11.0.4", + "@types/lodash": "^4.14.123", + "@types/mocha": "^10.0.10", + "@types/node": "^20.10.0", + "@types/node-fetch": "^2.6.12", + "@types/recursive-readdir": "^2.2.4", + "@types/vscode": "^1.95.0", + "chai": "^5.1.2", + "clean-webpack-plugin": "^4.0.0", + "mocha": "^11.0.1", + "prettier": "^3.4.2", + "ts-loader": "^9.5.1", + "tslint": "^6.1.3", + "typescript": "^5.7.2", + "vscode": "^1.1.37", + "webpack": "^5.97.1", + "webpack-cli": "^5.1.4", + "webpack-merge": "^6.0.1" + }, + "dependencies": { + "@octokit/rest": "^21.0.2", + "adm-zip": "^0.5.16", + "const": "^1.0.0", + "express": "^4.21.2", + "fs-extra": "^11.2.0", + "https-proxy-agent": "^7.0.5", + "lockfile": "^1.0.4", + "lodash": "^4.17.15", + "node-fetch": "^3.3.2", + "recursive-readdir": "^2.2.2", + "temp": "^0.9.0", + "vscode-chokidar": "^2.1.6" + } +} \ No newline at end of file diff --git a/.history/package_20241206234810.json b/.history/package_20241206234810.json new file mode 100644 index 00000000..d8aed5f3 --- /dev/null +++ b/.history/package_20241206234810.json @@ -0,0 +1,194 @@ +{ + "name": "code-settings-sync", + "displayName": "Settings Sync", + "description": "Synchronize Settings, Snippets, Themes, File Icons, Launch, Keybindings, Workspaces and Extensions Across Multiple Machines Using GitHub Gist.", + "version": "3.4.3", + "icon": "images/logo-128.png", + "publisher": "Shan", + "author": { + "name": "Shan Khan", + "url": "http://shanalikhan.github.io", + "email": "shanalikhan@hotmail.com" + }, + "homepage": "https://shanalikhan.github.io", + "galleryBanner": { + "color": "#3B4859", + "theme": "dark" + }, + "engines": { + "vscode": "^1.95.0" + }, + "badges": [ + { + "url": "https://vsmarketplacebadge.apphb.com/version/Shan.code-settings-sync.svg", + "description": "Latest Version", + "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" + }, + { + "url": "https://vsmarketplacebadge.apphb.com/installs/Shan.code-settings-sync.svg", + "description": "Total Downloads", + "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" + }, + { + "url": "https://vsmarketplacebadge.apphb.com/rating/Shan.code-settings-sync.svg", + "description": "Ratings", + "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" + }, + { + "url": "https://img.shields.io/badge/Join%20Community-slack-green.svg", + "description": "Join Slack Community", + "href": "https://join.slack.com/t/codesettingssync/shared_invite/enQtNzQyODMzMzI5MDQ3LWNmZjVkZjE2YTg0MzY1Y2EyYzVmYThmNzg2YjZkNjhhZWY3ZTEzN2I3ZTAxMjkwNWU0ZjMyZGFhMjdiZDI3ODU" + } + ], + "repository": { + "type": "git", + "url": "https://github.com/shanalikhan/code-settings-sync.git" + }, + "bugs": { + "url": "https://github.com/shanalikhan/code-settings-sync/issues", + "email": "shanalikhan@hotmail.com" + }, + "categories": [ + "Other" + ], + "keywords": [ + "vscode-sync", + "vscode-settings-sync", + "code-settings-sync", + "settings-sync", + "workspace-sync", + "multi-root ready" + ], + "extensionKind": "ui", + "activationEvents": [ + "*" + ], + "main": "./out/extension.js", + "contributes": { + "commands": [ + { + "command": "extension.HowSettings", + "title": "%cmd.howSetting.title%" + }, + { + "command": "extension.downloadSettings", + "title": "%cmd.downloadSettings.title%" + }, + { + "command": "extension.updateSettings", + "title": "%cmd.updateSettings.title%" + }, + { + "command": "extension.resetSettings", + "title": "%cmd.resetSettings.title%" + }, + { + "command": "extension.otherOptions", + "title": "%cmd.otherOptions.title%" + } + ], + "keybindings": [ + { + "key": "alt+shift+u", + "command": "extension.updateSettings" + }, + { + "key": "alt+shift+d", + "command": "extension.downloadSettings" + } + ], + "configuration": { + "properties": { + "sync.gist": { + "type": "string", + "default": "", + "description": "%ext.config.gist%" + }, + "sync.autoDownload": { + "type": "boolean", + "default": false, + "description": "%ext.config.autoDownload%" + }, + "sync.autoUpload": { + "type": "boolean", + "default": false, + "description": "%ext.config.autoUpload%" + }, + "sync.forceDownload": { + "type": "boolean", + "default": false, + "description": "%ext.config.forceDownload%" + }, + "sync.forceUpload": { + "type": "boolean", + "default": false, + "description": "%ext.config.forceUpload%" + }, + "sync.quietSync": { + "type": "boolean", + "default": false, + "description": "%ext.config.quietSync%" + }, + "sync.removeExtensions": { + "type": "boolean", + "default": true, + "description": "%ext.config.removeExtensions%" + }, + "sync.syncExtensions": { + "type": "boolean", + "default": true, + "description": "%ext.config.syncExtensions%" + } + }, + "title": "%ext.config.title%" + } + }, + "scripts": { + "vscode:prepublish": "npm run tslint-check && webpack --config configs/webpack.production.config.js", + "compile": "webpack --config configs/webpack.development.config.js", + "watch": "webpack --config configs/webpack.development.config.js --watch", + "postinstall": "node ./node_modules/vscode/bin/install", + "tslint-check": "tslint -c ./tslint.json ./src/**/*.ts ./src/*.ts", + "format": "prettier --write './src/**/*.ts'", + "test": "npm run tslint-check && tsc -p ./ && mocha --recursive \"./out/test/**/*.js\"" + }, + "devDependencies": { + "@types/chai": "^5.0.1", + "@types/express": "^5.0.0", + "@types/fs-extra": "^11.0.4", + "@types/lodash": "^4.14.123", + "@types/mocha": "^10.0.10", + "@types/node": "^20.10.0", + "@types/node-fetch": "^2.6.12", + "@types/recursive-readdir": "^2.2.4", + "@types/vscode": "^1.95.0", + "@typescript-eslint/eslint-plugin": "^8.10.0", + "@typescript-eslint/parser": "^8.7.0", + "eslint": "^9.13.0", + "chai": "^5.1.2", + "clean-webpack-plugin": "^4.0.0", + "mocha": "^11.0.1", + "prettier": "^3.4.2", + "ts-loader": "^9.5.1", + "tslint": "^6.1.3", + "typescript": "^5.7.2", + "vscode": "^1.1.37", + "webpack": "^5.97.1", + "webpack-cli": "^5.1.4", + "webpack-merge": "^6.0.1" + }, + "dependencies": { + "@octokit/rest": "^21.0.2", + "adm-zip": "^0.5.16", + "const": "^1.0.0", + "express": "^4.21.2", + "fs-extra": "^11.2.0", + "https-proxy-agent": "^7.0.5", + "lockfile": "^1.0.4", + "lodash": "^4.17.15", + "node-fetch": "^3.3.2", + "recursive-readdir": "^2.2.2", + "temp": "^0.9.0", + "vscode-chokidar": "^2.1.6" + } +} \ No newline at end of file diff --git a/.history/package_20241206234811.json b/.history/package_20241206234811.json new file mode 100644 index 00000000..d8aed5f3 --- /dev/null +++ b/.history/package_20241206234811.json @@ -0,0 +1,194 @@ +{ + "name": "code-settings-sync", + "displayName": "Settings Sync", + "description": "Synchronize Settings, Snippets, Themes, File Icons, Launch, Keybindings, Workspaces and Extensions Across Multiple Machines Using GitHub Gist.", + "version": "3.4.3", + "icon": "images/logo-128.png", + "publisher": "Shan", + "author": { + "name": "Shan Khan", + "url": "http://shanalikhan.github.io", + "email": "shanalikhan@hotmail.com" + }, + "homepage": "https://shanalikhan.github.io", + "galleryBanner": { + "color": "#3B4859", + "theme": "dark" + }, + "engines": { + "vscode": "^1.95.0" + }, + "badges": [ + { + "url": "https://vsmarketplacebadge.apphb.com/version/Shan.code-settings-sync.svg", + "description": "Latest Version", + "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" + }, + { + "url": "https://vsmarketplacebadge.apphb.com/installs/Shan.code-settings-sync.svg", + "description": "Total Downloads", + "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" + }, + { + "url": "https://vsmarketplacebadge.apphb.com/rating/Shan.code-settings-sync.svg", + "description": "Ratings", + "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" + }, + { + "url": "https://img.shields.io/badge/Join%20Community-slack-green.svg", + "description": "Join Slack Community", + "href": "https://join.slack.com/t/codesettingssync/shared_invite/enQtNzQyODMzMzI5MDQ3LWNmZjVkZjE2YTg0MzY1Y2EyYzVmYThmNzg2YjZkNjhhZWY3ZTEzN2I3ZTAxMjkwNWU0ZjMyZGFhMjdiZDI3ODU" + } + ], + "repository": { + "type": "git", + "url": "https://github.com/shanalikhan/code-settings-sync.git" + }, + "bugs": { + "url": "https://github.com/shanalikhan/code-settings-sync/issues", + "email": "shanalikhan@hotmail.com" + }, + "categories": [ + "Other" + ], + "keywords": [ + "vscode-sync", + "vscode-settings-sync", + "code-settings-sync", + "settings-sync", + "workspace-sync", + "multi-root ready" + ], + "extensionKind": "ui", + "activationEvents": [ + "*" + ], + "main": "./out/extension.js", + "contributes": { + "commands": [ + { + "command": "extension.HowSettings", + "title": "%cmd.howSetting.title%" + }, + { + "command": "extension.downloadSettings", + "title": "%cmd.downloadSettings.title%" + }, + { + "command": "extension.updateSettings", + "title": "%cmd.updateSettings.title%" + }, + { + "command": "extension.resetSettings", + "title": "%cmd.resetSettings.title%" + }, + { + "command": "extension.otherOptions", + "title": "%cmd.otherOptions.title%" + } + ], + "keybindings": [ + { + "key": "alt+shift+u", + "command": "extension.updateSettings" + }, + { + "key": "alt+shift+d", + "command": "extension.downloadSettings" + } + ], + "configuration": { + "properties": { + "sync.gist": { + "type": "string", + "default": "", + "description": "%ext.config.gist%" + }, + "sync.autoDownload": { + "type": "boolean", + "default": false, + "description": "%ext.config.autoDownload%" + }, + "sync.autoUpload": { + "type": "boolean", + "default": false, + "description": "%ext.config.autoUpload%" + }, + "sync.forceDownload": { + "type": "boolean", + "default": false, + "description": "%ext.config.forceDownload%" + }, + "sync.forceUpload": { + "type": "boolean", + "default": false, + "description": "%ext.config.forceUpload%" + }, + "sync.quietSync": { + "type": "boolean", + "default": false, + "description": "%ext.config.quietSync%" + }, + "sync.removeExtensions": { + "type": "boolean", + "default": true, + "description": "%ext.config.removeExtensions%" + }, + "sync.syncExtensions": { + "type": "boolean", + "default": true, + "description": "%ext.config.syncExtensions%" + } + }, + "title": "%ext.config.title%" + } + }, + "scripts": { + "vscode:prepublish": "npm run tslint-check && webpack --config configs/webpack.production.config.js", + "compile": "webpack --config configs/webpack.development.config.js", + "watch": "webpack --config configs/webpack.development.config.js --watch", + "postinstall": "node ./node_modules/vscode/bin/install", + "tslint-check": "tslint -c ./tslint.json ./src/**/*.ts ./src/*.ts", + "format": "prettier --write './src/**/*.ts'", + "test": "npm run tslint-check && tsc -p ./ && mocha --recursive \"./out/test/**/*.js\"" + }, + "devDependencies": { + "@types/chai": "^5.0.1", + "@types/express": "^5.0.0", + "@types/fs-extra": "^11.0.4", + "@types/lodash": "^4.14.123", + "@types/mocha": "^10.0.10", + "@types/node": "^20.10.0", + "@types/node-fetch": "^2.6.12", + "@types/recursive-readdir": "^2.2.4", + "@types/vscode": "^1.95.0", + "@typescript-eslint/eslint-plugin": "^8.10.0", + "@typescript-eslint/parser": "^8.7.0", + "eslint": "^9.13.0", + "chai": "^5.1.2", + "clean-webpack-plugin": "^4.0.0", + "mocha": "^11.0.1", + "prettier": "^3.4.2", + "ts-loader": "^9.5.1", + "tslint": "^6.1.3", + "typescript": "^5.7.2", + "vscode": "^1.1.37", + "webpack": "^5.97.1", + "webpack-cli": "^5.1.4", + "webpack-merge": "^6.0.1" + }, + "dependencies": { + "@octokit/rest": "^21.0.2", + "adm-zip": "^0.5.16", + "const": "^1.0.0", + "express": "^4.21.2", + "fs-extra": "^11.2.0", + "https-proxy-agent": "^7.0.5", + "lockfile": "^1.0.4", + "lodash": "^4.17.15", + "node-fetch": "^3.3.2", + "recursive-readdir": "^2.2.2", + "temp": "^0.9.0", + "vscode-chokidar": "^2.1.6" + } +} \ No newline at end of file diff --git a/.history/package_20241206234923.json b/.history/package_20241206234923.json new file mode 100644 index 00000000..463134fb --- /dev/null +++ b/.history/package_20241206234923.json @@ -0,0 +1,193 @@ +{ + "name": "code-settings-sync", + "displayName": "Settings Sync", + "description": "Synchronize Settings, Snippets, Themes, File Icons, Launch, Keybindings, Workspaces and Extensions Across Multiple Machines Using GitHub Gist.", + "version": "3.4.3", + "icon": "images/logo-128.png", + "publisher": "Shan", + "author": { + "name": "Shan Khan", + "url": "http://shanalikhan.github.io", + "email": "shanalikhan@hotmail.com" + }, + "homepage": "https://shanalikhan.github.io", + "galleryBanner": { + "color": "#3B4859", + "theme": "dark" + }, + "engines": { + "vscode": "^1.95.0" + }, + "badges": [ + { + "url": "https://vsmarketplacebadge.apphb.com/version/Shan.code-settings-sync.svg", + "description": "Latest Version", + "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" + }, + { + "url": "https://vsmarketplacebadge.apphb.com/installs/Shan.code-settings-sync.svg", + "description": "Total Downloads", + "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" + }, + { + "url": "https://vsmarketplacebadge.apphb.com/rating/Shan.code-settings-sync.svg", + "description": "Ratings", + "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" + }, + { + "url": "https://img.shields.io/badge/Join%20Community-slack-green.svg", + "description": "Join Slack Community", + "href": "https://join.slack.com/t/codesettingssync/shared_invite/enQtNzQyODMzMzI5MDQ3LWNmZjVkZjE2YTg0MzY1Y2EyYzVmYThmNzg2YjZkNjhhZWY3ZTEzN2I3ZTAxMjkwNWU0ZjMyZGFhMjdiZDI3ODU" + } + ], + "repository": { + "type": "git", + "url": "https://github.com/shanalikhan/code-settings-sync.git" + }, + "bugs": { + "url": "https://github.com/shanalikhan/code-settings-sync/issues", + "email": "shanalikhan@hotmail.com" + }, + "categories": [ + "Other" + ], + "keywords": [ + "vscode-sync", + "vscode-settings-sync", + "code-settings-sync", + "settings-sync", + "workspace-sync", + "multi-root ready" + ], + "extensionKind": "ui", + "activationEvents": [ + "*" + ], + "main": "./out/extension.js", + "contributes": { + "commands": [ + { + "command": "extension.HowSettings", + "title": "%cmd.howSetting.title%" + }, + { + "command": "extension.downloadSettings", + "title": "%cmd.downloadSettings.title%" + }, + { + "command": "extension.updateSettings", + "title": "%cmd.updateSettings.title%" + }, + { + "command": "extension.resetSettings", + "title": "%cmd.resetSettings.title%" + }, + { + "command": "extension.otherOptions", + "title": "%cmd.otherOptions.title%" + } + ], + "keybindings": [ + { + "key": "alt+shift+u", + "command": "extension.updateSettings" + }, + { + "key": "alt+shift+d", + "command": "extension.downloadSettings" + } + ], + "configuration": { + "properties": { + "sync.gist": { + "type": "string", + "default": "", + "description": "%ext.config.gist%" + }, + "sync.autoDownload": { + "type": "boolean", + "default": false, + "description": "%ext.config.autoDownload%" + }, + "sync.autoUpload": { + "type": "boolean", + "default": false, + "description": "%ext.config.autoUpload%" + }, + "sync.forceDownload": { + "type": "boolean", + "default": false, + "description": "%ext.config.forceDownload%" + }, + "sync.forceUpload": { + "type": "boolean", + "default": false, + "description": "%ext.config.forceUpload%" + }, + "sync.quietSync": { + "type": "boolean", + "default": false, + "description": "%ext.config.quietSync%" + }, + "sync.removeExtensions": { + "type": "boolean", + "default": true, + "description": "%ext.config.removeExtensions%" + }, + "sync.syncExtensions": { + "type": "boolean", + "default": true, + "description": "%ext.config.syncExtensions%" + } + }, + "title": "%ext.config.title%" + } + }, + "scripts": { + "vscode:prepublish": "npm run tslint-check && webpack --config configs/webpack.production.config.js", + "compile": "webpack --config configs/webpack.development.config.js", + "watch": "webpack --config configs/webpack.development.config.js --watch", + "postinstall": "node ./node_modules/vscode/bin/install", + "tslint-check": "tslint -c ./tslint.json ./src/**/*.ts ./src/*.ts", + "format": "prettier --write './src/**/*.ts'", + "test": "npm run tslint-check && tsc -p ./ && mocha --recursive \"./out/test/**/*.js\"" + }, + "devDependencies": { + "@types/chai": "^5.0.1", + "@types/express": "^5.0.0", + "@types/fs-extra": "^11.0.4", + "@types/lodash": "^4.14.123", + "@types/mocha": "^10.0.10", + "@types/node": "^20.10.0", + "@types/node-fetch": "^2.6.12", + "@types/recursive-readdir": "^2.2.4", + "@types/vscode": "^1.95.0", + "@typescript-eslint/eslint-plugin": "^8.10.0", + "@typescript-eslint/parser": "^8.7.0", + "eslint": "^9.13.0", + "chai": "^5.1.2", + "clean-webpack-plugin": "^4.0.0", + "mocha": "^11.0.1", + "prettier": "^3.4.2", + "ts-loader": "^9.5.1", + "typescript": "^5.7.2", + "vscode": "^1.1.37", + "webpack": "^5.97.1", + "webpack-cli": "^5.1.4", + "webpack-merge": "^6.0.1" + }, + "dependencies": { + "@octokit/rest": "^21.0.2", + "adm-zip": "^0.5.16", + "const": "^1.0.0", + "express": "^4.21.2", + "fs-extra": "^11.2.0", + "https-proxy-agent": "^7.0.5", + "lockfile": "^1.0.4", + "lodash": "^4.17.15", + "node-fetch": "^3.3.2", + "recursive-readdir": "^2.2.2", + "temp": "^0.9.0", + "vscode-chokidar": "^2.1.6" + } +} \ No newline at end of file diff --git a/.history/package_20241206234924.json b/.history/package_20241206234924.json new file mode 100644 index 00000000..463134fb --- /dev/null +++ b/.history/package_20241206234924.json @@ -0,0 +1,193 @@ +{ + "name": "code-settings-sync", + "displayName": "Settings Sync", + "description": "Synchronize Settings, Snippets, Themes, File Icons, Launch, Keybindings, Workspaces and Extensions Across Multiple Machines Using GitHub Gist.", + "version": "3.4.3", + "icon": "images/logo-128.png", + "publisher": "Shan", + "author": { + "name": "Shan Khan", + "url": "http://shanalikhan.github.io", + "email": "shanalikhan@hotmail.com" + }, + "homepage": "https://shanalikhan.github.io", + "galleryBanner": { + "color": "#3B4859", + "theme": "dark" + }, + "engines": { + "vscode": "^1.95.0" + }, + "badges": [ + { + "url": "https://vsmarketplacebadge.apphb.com/version/Shan.code-settings-sync.svg", + "description": "Latest Version", + "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" + }, + { + "url": "https://vsmarketplacebadge.apphb.com/installs/Shan.code-settings-sync.svg", + "description": "Total Downloads", + "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" + }, + { + "url": "https://vsmarketplacebadge.apphb.com/rating/Shan.code-settings-sync.svg", + "description": "Ratings", + "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" + }, + { + "url": "https://img.shields.io/badge/Join%20Community-slack-green.svg", + "description": "Join Slack Community", + "href": "https://join.slack.com/t/codesettingssync/shared_invite/enQtNzQyODMzMzI5MDQ3LWNmZjVkZjE2YTg0MzY1Y2EyYzVmYThmNzg2YjZkNjhhZWY3ZTEzN2I3ZTAxMjkwNWU0ZjMyZGFhMjdiZDI3ODU" + } + ], + "repository": { + "type": "git", + "url": "https://github.com/shanalikhan/code-settings-sync.git" + }, + "bugs": { + "url": "https://github.com/shanalikhan/code-settings-sync/issues", + "email": "shanalikhan@hotmail.com" + }, + "categories": [ + "Other" + ], + "keywords": [ + "vscode-sync", + "vscode-settings-sync", + "code-settings-sync", + "settings-sync", + "workspace-sync", + "multi-root ready" + ], + "extensionKind": "ui", + "activationEvents": [ + "*" + ], + "main": "./out/extension.js", + "contributes": { + "commands": [ + { + "command": "extension.HowSettings", + "title": "%cmd.howSetting.title%" + }, + { + "command": "extension.downloadSettings", + "title": "%cmd.downloadSettings.title%" + }, + { + "command": "extension.updateSettings", + "title": "%cmd.updateSettings.title%" + }, + { + "command": "extension.resetSettings", + "title": "%cmd.resetSettings.title%" + }, + { + "command": "extension.otherOptions", + "title": "%cmd.otherOptions.title%" + } + ], + "keybindings": [ + { + "key": "alt+shift+u", + "command": "extension.updateSettings" + }, + { + "key": "alt+shift+d", + "command": "extension.downloadSettings" + } + ], + "configuration": { + "properties": { + "sync.gist": { + "type": "string", + "default": "", + "description": "%ext.config.gist%" + }, + "sync.autoDownload": { + "type": "boolean", + "default": false, + "description": "%ext.config.autoDownload%" + }, + "sync.autoUpload": { + "type": "boolean", + "default": false, + "description": "%ext.config.autoUpload%" + }, + "sync.forceDownload": { + "type": "boolean", + "default": false, + "description": "%ext.config.forceDownload%" + }, + "sync.forceUpload": { + "type": "boolean", + "default": false, + "description": "%ext.config.forceUpload%" + }, + "sync.quietSync": { + "type": "boolean", + "default": false, + "description": "%ext.config.quietSync%" + }, + "sync.removeExtensions": { + "type": "boolean", + "default": true, + "description": "%ext.config.removeExtensions%" + }, + "sync.syncExtensions": { + "type": "boolean", + "default": true, + "description": "%ext.config.syncExtensions%" + } + }, + "title": "%ext.config.title%" + } + }, + "scripts": { + "vscode:prepublish": "npm run tslint-check && webpack --config configs/webpack.production.config.js", + "compile": "webpack --config configs/webpack.development.config.js", + "watch": "webpack --config configs/webpack.development.config.js --watch", + "postinstall": "node ./node_modules/vscode/bin/install", + "tslint-check": "tslint -c ./tslint.json ./src/**/*.ts ./src/*.ts", + "format": "prettier --write './src/**/*.ts'", + "test": "npm run tslint-check && tsc -p ./ && mocha --recursive \"./out/test/**/*.js\"" + }, + "devDependencies": { + "@types/chai": "^5.0.1", + "@types/express": "^5.0.0", + "@types/fs-extra": "^11.0.4", + "@types/lodash": "^4.14.123", + "@types/mocha": "^10.0.10", + "@types/node": "^20.10.0", + "@types/node-fetch": "^2.6.12", + "@types/recursive-readdir": "^2.2.4", + "@types/vscode": "^1.95.0", + "@typescript-eslint/eslint-plugin": "^8.10.0", + "@typescript-eslint/parser": "^8.7.0", + "eslint": "^9.13.0", + "chai": "^5.1.2", + "clean-webpack-plugin": "^4.0.0", + "mocha": "^11.0.1", + "prettier": "^3.4.2", + "ts-loader": "^9.5.1", + "typescript": "^5.7.2", + "vscode": "^1.1.37", + "webpack": "^5.97.1", + "webpack-cli": "^5.1.4", + "webpack-merge": "^6.0.1" + }, + "dependencies": { + "@octokit/rest": "^21.0.2", + "adm-zip": "^0.5.16", + "const": "^1.0.0", + "express": "^4.21.2", + "fs-extra": "^11.2.0", + "https-proxy-agent": "^7.0.5", + "lockfile": "^1.0.4", + "lodash": "^4.17.15", + "node-fetch": "^3.3.2", + "recursive-readdir": "^2.2.2", + "temp": "^0.9.0", + "vscode-chokidar": "^2.1.6" + } +} \ No newline at end of file diff --git a/.history/src/service/github.oauth.service_20241102143121.ts b/.history/src/service/github.oauth.service_20241102143121.ts new file mode 100644 index 00000000..ca2256ff --- /dev/null +++ b/.history/src/service/github.oauth.service_20241102143121.ts @@ -0,0 +1,136 @@ +import * as express from "express"; +import { Server } from "http"; +import fetch from "node-fetch"; +import { URL, URLSearchParams } from "url"; +import Commons from "../commons"; +import { state } from "../state"; + +export class GitHubOAuthService { + public app: express.Express; + public server: Server; + + constructor(public port: number) { + this.app = express(); + this.app.use(express.json(), express.urlencoded({ extended: false })); + } + + public async StartProcess(cmd?: string) { + const customSettings = await state.commons.GetCustomSettings(); + const host = customSettings.githubEnterpriseUrl + ? new URL(customSettings.githubEnterpriseUrl) + : new URL("https://github.com"); + + this.server = this.app.listen(this.port); + this.app.get("/callback", async (req, res) => { + try { + const params = new URLSearchParams( + await (await this.getToken(req.param("code"), host)).text() + ); + + res.send(` + + + + + + + + +

Success! You may now close this tab.

+ + + + `); + this.server.close(); + + const token = params.get("access_token"); + this.saveToken(token); + + const user = await this.getUser(token, host); + + const gists: any[] = await this.getGists(token, user, host); + + const gistViewList: any[] = gists.map(m => { + return { + id: m.id, + description: m.description, + updated_at: m.updated_at + }; + }); + + state.commons.webviewService.OpenGistSelectionpage(gistViewList, cmd); + } catch (err) { + const error = new Error(err); + Commons.LogException(error, state.commons.ERROR_MESSAGE, true); + } + }); + } + + public getToken(code: string, host: URL) { + const params = new URLSearchParams(); + params.append("client_id", "cfd96460d8b110e2351b"); + params.append("client_secret", "ed46bd3a0f736e0da57308e86ca5fa3cf8688582"); + params.append("code", code); + + const promise = fetch(`https://${host.hostname}/login/oauth/access_token`, { + method: "POST", + body: params + }); + + promise.catch(err => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + return promise; + } + + public async getGists(token: string, user: string, host: URL) { + const promise = fetch(`https://api.${host.hostname}/users/${user}/gists`, { + method: "GET", + headers: { Authorization: `token ${token}` } + }); + + promise.catch(err => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + const res = await promise; + const gists = await res.json(); + return gists; + } + + public async saveToken(token: string) { + const currentSettings = await state.commons.GetCustomSettings(); + currentSettings.token = token; + state.commons.SetCustomSettings(currentSettings); + } + + public async getUser(token: string, host: URL) { + const promise = fetch(`https://api.${host.hostname}/user`, { + method: "GET", + headers: { Authorization: `token ${token}` } + }); + + promise.catch(err => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + const res = await promise; + const json = await res.json(); + return json.login; + } +} diff --git a/.history/src/service/github.oauth.service_20241206235603.ts b/.history/src/service/github.oauth.service_20241206235603.ts new file mode 100644 index 00000000..fa2a9c58 --- /dev/null +++ b/.history/src/service/github.oauth.service_20241206235603.ts @@ -0,0 +1,136 @@ +import * as express from "express"; +import { Server } from "http"; +import fetch from "node-fetch"; +import { URL, URLSearchParams } from "url"; +import Commons from "../commons"; +import { state } from "../state"; + +export class GitHubOAuthService { + public app: express.Express; + public server: Server; + + constructor(public port: number) { + this.app = express(); + this.app.use(express.json(), express.urlencoded({ extended: false })); + } + + public async StartProcess(cmd?: string) { + const customSettings = await state.commons.GetCustomSettings(); + const host = customSettings.githubEnterpriseUrl + ? new URL(customSettings.githubEnterpriseUrl) + : new URL("https://github.com"); + + this.server = this.app.listen(this.port); + this.app.get("/callback", async (req, res) => { + try { + const params = new URLSearchParams( + await (await this.getToken(req.params("code"), host)).text() + ); + + res.send(` + + + + + + + + +

Success! You may now close this tab.

+ + + + `); + this.server.close(); + + const token = params.get("access_token"); + this.saveToken(token); + + const user = await this.getUser(token, host); + + const gists: any[] = await this.getGists(token, user, host); + + const gistViewList: any[] = gists.map(m => { + return { + id: m.id, + description: m.description, + updated_at: m.updated_at + }; + }); + + state.commons.webviewService.OpenGistSelectionpage(gistViewList, cmd); + } catch (err) { + const error = new Error(err); + Commons.LogException(error, state.commons.ERROR_MESSAGE, true); + } + }); + } + + public getToken(code: string, host: URL) { + const params = new URLSearchParams(); + params.append("client_id", "cfd96460d8b110e2351b"); + params.append("client_secret", "ed46bd3a0f736e0da57308e86ca5fa3cf8688582"); + params.append("code", code); + + const promise = fetch(`https://${host.hostname}/login/oauth/access_token`, { + method: "POST", + body: params + }); + + promise.catch(err => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + return promise; + } + + public async getGists(token: string, user: string, host: URL) { + const promise = fetch(`https://api.${host.hostname}/users/${user}/gists`, { + method: "GET", + headers: { Authorization: `token ${token}` } + }); + + promise.catch(err => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + const res = await promise; + const gists = await res.json(); + return gists; + } + + public async saveToken(token: string) { + const currentSettings = await state.commons.GetCustomSettings(); + currentSettings.token = token; + state.commons.SetCustomSettings(currentSettings); + } + + public async getUser(token: string, host: URL) { + const promise = fetch(`https://api.${host.hostname}/user`, { + method: "GET", + headers: { Authorization: `token ${token}` } + }); + + promise.catch(err => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + const res = await promise; + const json = await res.json(); + return json.login; + } +} diff --git a/.history/src/service/github.oauth.service_20241206235606.ts b/.history/src/service/github.oauth.service_20241206235606.ts new file mode 100644 index 00000000..ca2256ff --- /dev/null +++ b/.history/src/service/github.oauth.service_20241206235606.ts @@ -0,0 +1,136 @@ +import * as express from "express"; +import { Server } from "http"; +import fetch from "node-fetch"; +import { URL, URLSearchParams } from "url"; +import Commons from "../commons"; +import { state } from "../state"; + +export class GitHubOAuthService { + public app: express.Express; + public server: Server; + + constructor(public port: number) { + this.app = express(); + this.app.use(express.json(), express.urlencoded({ extended: false })); + } + + public async StartProcess(cmd?: string) { + const customSettings = await state.commons.GetCustomSettings(); + const host = customSettings.githubEnterpriseUrl + ? new URL(customSettings.githubEnterpriseUrl) + : new URL("https://github.com"); + + this.server = this.app.listen(this.port); + this.app.get("/callback", async (req, res) => { + try { + const params = new URLSearchParams( + await (await this.getToken(req.param("code"), host)).text() + ); + + res.send(` + + + + + + + + +

Success! You may now close this tab.

+ + + + `); + this.server.close(); + + const token = params.get("access_token"); + this.saveToken(token); + + const user = await this.getUser(token, host); + + const gists: any[] = await this.getGists(token, user, host); + + const gistViewList: any[] = gists.map(m => { + return { + id: m.id, + description: m.description, + updated_at: m.updated_at + }; + }); + + state.commons.webviewService.OpenGistSelectionpage(gistViewList, cmd); + } catch (err) { + const error = new Error(err); + Commons.LogException(error, state.commons.ERROR_MESSAGE, true); + } + }); + } + + public getToken(code: string, host: URL) { + const params = new URLSearchParams(); + params.append("client_id", "cfd96460d8b110e2351b"); + params.append("client_secret", "ed46bd3a0f736e0da57308e86ca5fa3cf8688582"); + params.append("code", code); + + const promise = fetch(`https://${host.hostname}/login/oauth/access_token`, { + method: "POST", + body: params + }); + + promise.catch(err => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + return promise; + } + + public async getGists(token: string, user: string, host: URL) { + const promise = fetch(`https://api.${host.hostname}/users/${user}/gists`, { + method: "GET", + headers: { Authorization: `token ${token}` } + }); + + promise.catch(err => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + const res = await promise; + const gists = await res.json(); + return gists; + } + + public async saveToken(token: string) { + const currentSettings = await state.commons.GetCustomSettings(); + currentSettings.token = token; + state.commons.SetCustomSettings(currentSettings); + } + + public async getUser(token: string, host: URL) { + const promise = fetch(`https://api.${host.hostname}/user`, { + method: "GET", + headers: { Authorization: `token ${token}` } + }); + + promise.catch(err => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + const res = await promise; + const json = await res.json(); + return json.login; + } +} diff --git a/.history/src/service/github.oauth.service_20241206235613.ts b/.history/src/service/github.oauth.service_20241206235613.ts new file mode 100644 index 00000000..89a35782 --- /dev/null +++ b/.history/src/service/github.oauth.service_20241206235613.ts @@ -0,0 +1,136 @@ +import * as express from "express"; +import { Server } from "http"; +import fetch from "node-fetch"; +import { URL, URLSearchParams } from "url"; +import Commons from "../commons"; +import { state } from "../state"; + +export class GitHubOAuthService { + public app: express.Express; + public server: Server; + + constructor(public port: number) { + this.app = express(); + this.app.use(express.json(), express.urlencoded({ extended: false })); + } + + public async StartProcess(cmd?: string) { + const customSettings = await state.commons.GetCustomSettings(); + const host = customSettings.githubEnterpriseUrl + ? new URL(customSettings.githubEnterpriseUrl) + : new URL("https://github.com"); + + this.server = this.app.listen(this.port); + this.app.get("/callback", async (req, res) => { + try { + const params = new URLSearchParams( + await (await this.getToken(req.param("code"), host)).text() + ); + + res.send(` + + + + + + + + +

Success! You may now close this tab.

+ + + + `); + this.server.close(); + + const token = params.get("access_token"); + this.saveToken(token); + + const user = await this.getUser(token, host); + + const gists: any[] = await this.getGists(token, user, host); + + const gistViewList: any[] = gists.map((m) => { + return { + id: m.id, + description: m.description, + updated_at: m.updated_at, + }; + }); + + state.commons.webviewService.OpenGistSelectionpage(gistViewList, cmd); + } catch (err) { + const error = new Error(err); + Commons.LogException(error, state.commons.ERROR_MESSAGE, true); + } + }); + } + + public getToken(code: string, host: URL) { + const params = new URLSearchParams(); + params.append("client_id", "cfd96460d8b110e2351b"); + params.append("client_secret", "ed46bd3a0f736e0da57308e86ca5fa3cf8688582"); + params.append("code", code); + + const promise = fetch(`https://${host.hostname}/login/oauth/access_token`, { + method: "POST", + body: params, + }); + + promise.catch((err) => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + return promise; + } + + public async getGists(token: string, user: string, host: URL) { + const promise = fetch(`https://api.${host.hostname}/users/${user}/gists`, { + method: "GET", + headers: { Authorization: `token ${token}` }, + }); + + promise.catch((err) => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + const res = await promise; + const gists = await res.json(); + return gists; + } + + public async saveToken(token: string) { + const currentSettings = await state.commons.GetCustomSettings(); + currentSettings.token = token; + state.commons.SetCustomSettings(currentSettings); + } + + public async getUser(token: string, host: URL) { + const promise = fetch(`https://api.${host.hostname}/user`, { + method: "GET", + headers: { Authorization: `token ${token}` }, + }); + + promise.catch((err) => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + const res = await promise; + const json = await res.json(); + return json.login; + } +} diff --git a/.history/src/service/github.oauth.service_20241206235624.ts b/.history/src/service/github.oauth.service_20241206235624.ts new file mode 100644 index 00000000..b7f9b757 --- /dev/null +++ b/.history/src/service/github.oauth.service_20241206235624.ts @@ -0,0 +1,136 @@ +import * as express from "express"; +import { Server } from "http"; +import fetch from "node-fetch"; +import { URL, URLSearchParams } from "url"; +import Commons from "../commons"; +import { state } from "../state"; + +export class GitHubOAuthService { + public app: express.Express; + public server: Server; + + constructor(public port: number) { + this.app = express(); + this.app.use(express.json(), express.urlencoded({ extended: false })); + } + + public async StartProcess(cmd?: string) { + const customSettings = await state.commons.GetCustomSettings(); + const host = customSettings.githubEnterpriseUrl + ? new URL(customSettings.githubEnterpriseUrl) + : new URL("https://github.com"); + + this.server = this.app.listen(this.port); + this.app.get("/callback", async (req, res) => { + try { + const params = new URLSearchParams( + await (await this.getToken(req.params("code"), host)).text() + ); + + res.send(` + + + + + + + + +

Success! You may now close this tab.

+ + + + `); + this.server.close(); + + const token = params.get("access_token"); + this.saveToken(token); + + const user = await this.getUser(token, host); + + const gists: any[] = await this.getGists(token, user, host); + + const gistViewList: any[] = gists.map((m) => { + return { + id: m.id, + description: m.description, + updated_at: m.updated_at, + }; + }); + + state.commons.webviewService.OpenGistSelectionpage(gistViewList, cmd); + } catch (err) { + const error = new Error(err); + Commons.LogException(error, state.commons.ERROR_MESSAGE, true); + } + }); + } + + public getToken(code: string, host: URL) { + const params = new URLSearchParams(); + params.append("client_id", "cfd96460d8b110e2351b"); + params.append("client_secret", "ed46bd3a0f736e0da57308e86ca5fa3cf8688582"); + params.append("code", code); + + const promise = fetch(`https://${host.hostname}/login/oauth/access_token`, { + method: "POST", + body: params, + }); + + promise.catch((err) => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + return promise; + } + + public async getGists(token: string, user: string, host: URL) { + const promise = fetch(`https://api.${host.hostname}/users/${user}/gists`, { + method: "GET", + headers: { Authorization: `token ${token}` }, + }); + + promise.catch((err) => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + const res = await promise; + const gists = await res.json(); + return gists; + } + + public async saveToken(token: string) { + const currentSettings = await state.commons.GetCustomSettings(); + currentSettings.token = token; + state.commons.SetCustomSettings(currentSettings); + } + + public async getUser(token: string, host: URL) { + const promise = fetch(`https://api.${host.hostname}/user`, { + method: "GET", + headers: { Authorization: `token ${token}` }, + }); + + promise.catch((err) => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + const res = await promise; + const json = await res.json(); + return json.login; + } +} diff --git a/.history/src/service/github.oauth.service_20241206235626.ts b/.history/src/service/github.oauth.service_20241206235626.ts new file mode 100644 index 00000000..b7f9b757 --- /dev/null +++ b/.history/src/service/github.oauth.service_20241206235626.ts @@ -0,0 +1,136 @@ +import * as express from "express"; +import { Server } from "http"; +import fetch from "node-fetch"; +import { URL, URLSearchParams } from "url"; +import Commons from "../commons"; +import { state } from "../state"; + +export class GitHubOAuthService { + public app: express.Express; + public server: Server; + + constructor(public port: number) { + this.app = express(); + this.app.use(express.json(), express.urlencoded({ extended: false })); + } + + public async StartProcess(cmd?: string) { + const customSettings = await state.commons.GetCustomSettings(); + const host = customSettings.githubEnterpriseUrl + ? new URL(customSettings.githubEnterpriseUrl) + : new URL("https://github.com"); + + this.server = this.app.listen(this.port); + this.app.get("/callback", async (req, res) => { + try { + const params = new URLSearchParams( + await (await this.getToken(req.params("code"), host)).text() + ); + + res.send(` + + + + + + + + +

Success! You may now close this tab.

+ + + + `); + this.server.close(); + + const token = params.get("access_token"); + this.saveToken(token); + + const user = await this.getUser(token, host); + + const gists: any[] = await this.getGists(token, user, host); + + const gistViewList: any[] = gists.map((m) => { + return { + id: m.id, + description: m.description, + updated_at: m.updated_at, + }; + }); + + state.commons.webviewService.OpenGistSelectionpage(gistViewList, cmd); + } catch (err) { + const error = new Error(err); + Commons.LogException(error, state.commons.ERROR_MESSAGE, true); + } + }); + } + + public getToken(code: string, host: URL) { + const params = new URLSearchParams(); + params.append("client_id", "cfd96460d8b110e2351b"); + params.append("client_secret", "ed46bd3a0f736e0da57308e86ca5fa3cf8688582"); + params.append("code", code); + + const promise = fetch(`https://${host.hostname}/login/oauth/access_token`, { + method: "POST", + body: params, + }); + + promise.catch((err) => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + return promise; + } + + public async getGists(token: string, user: string, host: URL) { + const promise = fetch(`https://api.${host.hostname}/users/${user}/gists`, { + method: "GET", + headers: { Authorization: `token ${token}` }, + }); + + promise.catch((err) => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + const res = await promise; + const gists = await res.json(); + return gists; + } + + public async saveToken(token: string) { + const currentSettings = await state.commons.GetCustomSettings(); + currentSettings.token = token; + state.commons.SetCustomSettings(currentSettings); + } + + public async getUser(token: string, host: URL) { + const promise = fetch(`https://api.${host.hostname}/user`, { + method: "GET", + headers: { Authorization: `token ${token}` }, + }); + + promise.catch((err) => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + const res = await promise; + const json = await res.json(); + return json.login; + } +} diff --git a/.history/src/service/github.oauth.service_20241206235700.ts b/.history/src/service/github.oauth.service_20241206235700.ts new file mode 100644 index 00000000..b921120d --- /dev/null +++ b/.history/src/service/github.oauth.service_20241206235700.ts @@ -0,0 +1,136 @@ +import * as express from "express"; +import { Server } from "http"; +import fetch from "node-fetch"; +import { URL, URLSearchParams } from "url"; +import Commons from "../commons"; +import { state } from "../state"; + +export class GitHubOAuthService { + public app: express.Express; + public server: Server; + + constructor(public port: number) { + this.app = express(); + this.app.use(express.json(), express.urlencoded({ extended: false })); + } + + public async StartProcess(cmd?: string) { + const customSettings = await state.commons.GetCustomSettings(); + const host = customSettings.githubEnterpriseUrl + ? new URL(customSettings.githubEnterpriseUrl) + : new URL("https://github.com"); + + this.server = this.app.listen(this.port); + this.app.get("/callback", async (req, res) => { + try { + const params = new URLSearchParams( + await (await this.getToken(req.params("code"), host)).text() + ); + + res.send(` + + + + + + + + +

Success! You may now close this tab.

+ + + + `); + this.server.close(); + + const token = params.get("access_token"); + this.saveToken(token); + + const user = await this.getUser(token, host); + + const gists: any = await this.getGists(token, user, host); + + const gistViewList: any[] = gists.map((m) => { + return { + id: m.id, + description: m.description, + updated_at: m.updated_at, + }; + }); + + state.commons.webviewService.OpenGistSelectionpage(gistViewList, cmd); + } catch (err) { + const error = new Error(err); + Commons.LogException(error, state.commons.ERROR_MESSAGE, true); + } + }); + } + + public getToken(code: string, host: URL) { + const params = new URLSearchParams(); + params.append("client_id", "cfd96460d8b110e2351b"); + params.append("client_secret", "ed46bd3a0f736e0da57308e86ca5fa3cf8688582"); + params.append("code", code); + + const promise = fetch(`https://${host.hostname}/login/oauth/access_token`, { + method: "POST", + body: params, + }); + + promise.catch((err) => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + return promise; + } + + public async getGists(token: string, user: string, host: URL) { + const promise = fetch(`https://api.${host.hostname}/users/${user}/gists`, { + method: "GET", + headers: { Authorization: `token ${token}` }, + }); + + promise.catch((err) => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + const res = await promise; + const gists = await res.json(); + return gists; + } + + public async saveToken(token: string) { + const currentSettings = await state.commons.GetCustomSettings(); + currentSettings.token = token; + state.commons.SetCustomSettings(currentSettings); + } + + public async getUser(token: string, host: URL) { + const promise = fetch(`https://api.${host.hostname}/user`, { + method: "GET", + headers: { Authorization: `token ${token}` }, + }); + + promise.catch((err) => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + const res = await promise; + const json = await res.json(); + return json.login; + } +} diff --git a/.history/src/service/github.oauth.service_20241206235701.ts b/.history/src/service/github.oauth.service_20241206235701.ts new file mode 100644 index 00000000..b921120d --- /dev/null +++ b/.history/src/service/github.oauth.service_20241206235701.ts @@ -0,0 +1,136 @@ +import * as express from "express"; +import { Server } from "http"; +import fetch from "node-fetch"; +import { URL, URLSearchParams } from "url"; +import Commons from "../commons"; +import { state } from "../state"; + +export class GitHubOAuthService { + public app: express.Express; + public server: Server; + + constructor(public port: number) { + this.app = express(); + this.app.use(express.json(), express.urlencoded({ extended: false })); + } + + public async StartProcess(cmd?: string) { + const customSettings = await state.commons.GetCustomSettings(); + const host = customSettings.githubEnterpriseUrl + ? new URL(customSettings.githubEnterpriseUrl) + : new URL("https://github.com"); + + this.server = this.app.listen(this.port); + this.app.get("/callback", async (req, res) => { + try { + const params = new URLSearchParams( + await (await this.getToken(req.params("code"), host)).text() + ); + + res.send(` + + + + + + + + +

Success! You may now close this tab.

+ + + + `); + this.server.close(); + + const token = params.get("access_token"); + this.saveToken(token); + + const user = await this.getUser(token, host); + + const gists: any = await this.getGists(token, user, host); + + const gistViewList: any[] = gists.map((m) => { + return { + id: m.id, + description: m.description, + updated_at: m.updated_at, + }; + }); + + state.commons.webviewService.OpenGistSelectionpage(gistViewList, cmd); + } catch (err) { + const error = new Error(err); + Commons.LogException(error, state.commons.ERROR_MESSAGE, true); + } + }); + } + + public getToken(code: string, host: URL) { + const params = new URLSearchParams(); + params.append("client_id", "cfd96460d8b110e2351b"); + params.append("client_secret", "ed46bd3a0f736e0da57308e86ca5fa3cf8688582"); + params.append("code", code); + + const promise = fetch(`https://${host.hostname}/login/oauth/access_token`, { + method: "POST", + body: params, + }); + + promise.catch((err) => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + return promise; + } + + public async getGists(token: string, user: string, host: URL) { + const promise = fetch(`https://api.${host.hostname}/users/${user}/gists`, { + method: "GET", + headers: { Authorization: `token ${token}` }, + }); + + promise.catch((err) => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + const res = await promise; + const gists = await res.json(); + return gists; + } + + public async saveToken(token: string) { + const currentSettings = await state.commons.GetCustomSettings(); + currentSettings.token = token; + state.commons.SetCustomSettings(currentSettings); + } + + public async getUser(token: string, host: URL) { + const promise = fetch(`https://api.${host.hostname}/user`, { + method: "GET", + headers: { Authorization: `token ${token}` }, + }); + + promise.catch((err) => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + const res = await promise; + const json = await res.json(); + return json.login; + } +} diff --git a/.history/src/service/github.oauth.service_20241206235709.ts b/.history/src/service/github.oauth.service_20241206235709.ts new file mode 100644 index 00000000..00dd7df6 --- /dev/null +++ b/.history/src/service/github.oauth.service_20241206235709.ts @@ -0,0 +1,136 @@ +import * as express from "express"; +import { Server } from "http"; +import fetch from "node-fetch"; +import { URL, URLSearchParams } from "url"; +import Commons from "../commons"; +import { state } from "../state"; + +export class GitHubOAuthService { + public app: express.Express; + public server: Server; + + constructor(public port: number) { + this.app = express(); + this.app.use(express.json(), express.urlencoded({ extended: false })); + } + + public async StartProcess(cmd?: string) { + const customSettings = await state.commons.GetCustomSettings(); + const host = customSettings.githubEnterpriseUrl + ? new URL(customSettings.githubEnterpriseUrl) + : new URL("https://github.com"); + + this.server = this.app.listen(this.port); + this.app.get("/callback", async (req, res) => { + try { + const params = new URLSearchParams( + await (await this.getToken(req.params("code"), host)).text() + ); + + res.send(` + + + + + + + + +

Success! You may now close this tab.

+ + + + `); + this.server.close(); + + const token = params.get("access_token"); + this.saveToken(token); + + const user = await this.getUser(token, host); + + const gists: any = await this.getGists(token, user, host); + + const gistViewList: any[] = gists.map((m) => { + return { + id: m.id, + description: m.description, + updated_at: m.updated_at, + }; + }); + + state.commons.webviewService.OpenGistSelectionpage(gistViewList, cmd); + } catch (err) { + const error = new Error(err); + Commons.LogException(error, state.commons.ERROR_MESSAGE, true); + } + }); + } + + public getToken(code: string, host: URL) { + const params = new URLSearchParams(); + params.append("client_id", "cfd96460d8b110e2351b"); + params.append("client_secret", "ed46bd3a0f736e0da57308e86ca5fa3cf8688582"); + params.append("code", code); + + const promise = fetch(`https://${host.hostname}/login/oauth/access_token`, { + method: "POST", + body: params, + }); + + promise.catch((err) => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + return promise; + } + + public async getGists(token: string, user: string, host: URL) { + const promise = fetch(`https://api.${host.hostname}/users/${user}/gists`, { + method: "GET", + headers: { Authorization: `token ${token}` }, + }); + + promise.catch((err) => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + const res = await promise; + const gists = await res.json(); + return gists; + } + + public async saveToken(token: string) { + const currentSettings = await state.commons.GetCustomSettings(); + currentSettings.token = token; + state.commons.SetCustomSettings(currentSettings); + } + + public async getUser(token: string, host: URL) { + const promise = fetch(`https://api.${host.hostname}/user`, { + method: "GET", + headers: { Authorization: `token ${token}` }, + }); + + promise.catch((err) => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + const res = await promise; + const json = await res.json(); + return json?.login; + } +} diff --git a/.history/src/service/github.oauth.service_20241206235714.ts b/.history/src/service/github.oauth.service_20241206235714.ts new file mode 100644 index 00000000..e82b245e --- /dev/null +++ b/.history/src/service/github.oauth.service_20241206235714.ts @@ -0,0 +1,136 @@ +import * as express from "express"; +import { Server } from "http"; +import fetch from "node-fetch"; +import { URL, URLSearchParams } from "url"; +import Commons from "../commons"; +import { state } from "../state"; + +export class GitHubOAuthService { + public app: express.Express; + public server: Server; + + constructor(public port: number) { + this.app = express(); + this.app.use(express.json(), express.urlencoded({ extended: false })); + } + + public async StartProcess(cmd?: string) { + const customSettings = await state.commons.GetCustomSettings(); + const host = customSettings.githubEnterpriseUrl + ? new URL(customSettings.githubEnterpriseUrl) + : new URL("https://github.com"); + + this.server = this.app.listen(this.port); + this.app.get("/callback", async (req, res) => { + try { + const params = new URLSearchParams( + await (await this.getToken(req.params("code"), host)).text() + ); + + res.send(` + + + + + + + + +

Success! You may now close this tab.

+ + + + `); + this.server.close(); + + const token = params.get("access_token"); + this.saveToken(token); + + const user = await this.getUser(token, host); + + const gists: any = await this.getGists(token, user, host); + + const gistViewList: any[] = gists.map((m) => { + return { + id: m.id, + description: m.description, + updated_at: m.updated_at, + }; + }); + + state.commons.webviewService.OpenGistSelectionpage(gistViewList, cmd); + } catch (err) { + const error = new Error(err); + Commons.LogException(error, state.commons.ERROR_MESSAGE, true); + } + }); + } + + public getToken(code: string, host: URL) { + const params = new URLSearchParams(); + params.append("client_id", "cfd96460d8b110e2351b"); + params.append("client_secret", "ed46bd3a0f736e0da57308e86ca5fa3cf8688582"); + params.append("code", code); + + const promise = fetch(`https://${host.hostname}/login/oauth/access_token`, { + method: "POST", + body: params, + }); + + promise.catch((err) => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + return promise; + } + + public async getGists(token: string, user: string, host: URL) { + const promise = fetch(`https://api.${host.hostname}/users/${user}/gists`, { + method: "GET", + headers: { Authorization: `token ${token}` }, + }); + + promise.catch((err) => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + const res = await promise; + const gists = await res.json(); + return gists; + } + + public async saveToken(token: string) { + const currentSettings = await state.commons.GetCustomSettings(); + currentSettings.token = token; + state.commons.SetCustomSettings(currentSettings); + } + + public async getUser(token: string, host: URL) { + const promise = fetch(`https://api.${host.hostname}/user`, { + method: "GET", + headers: { Authorization: `token ${token}` }, + }); + + promise.catch((err) => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + const res = await promise; + const json: any = await res.json(); + return json?.login; + } +} diff --git a/.history/src/service/github.oauth.service_20241206235715.ts b/.history/src/service/github.oauth.service_20241206235715.ts new file mode 100644 index 00000000..e82b245e --- /dev/null +++ b/.history/src/service/github.oauth.service_20241206235715.ts @@ -0,0 +1,136 @@ +import * as express from "express"; +import { Server } from "http"; +import fetch from "node-fetch"; +import { URL, URLSearchParams } from "url"; +import Commons from "../commons"; +import { state } from "../state"; + +export class GitHubOAuthService { + public app: express.Express; + public server: Server; + + constructor(public port: number) { + this.app = express(); + this.app.use(express.json(), express.urlencoded({ extended: false })); + } + + public async StartProcess(cmd?: string) { + const customSettings = await state.commons.GetCustomSettings(); + const host = customSettings.githubEnterpriseUrl + ? new URL(customSettings.githubEnterpriseUrl) + : new URL("https://github.com"); + + this.server = this.app.listen(this.port); + this.app.get("/callback", async (req, res) => { + try { + const params = new URLSearchParams( + await (await this.getToken(req.params("code"), host)).text() + ); + + res.send(` + + + + + + + + +

Success! You may now close this tab.

+ + + + `); + this.server.close(); + + const token = params.get("access_token"); + this.saveToken(token); + + const user = await this.getUser(token, host); + + const gists: any = await this.getGists(token, user, host); + + const gistViewList: any[] = gists.map((m) => { + return { + id: m.id, + description: m.description, + updated_at: m.updated_at, + }; + }); + + state.commons.webviewService.OpenGistSelectionpage(gistViewList, cmd); + } catch (err) { + const error = new Error(err); + Commons.LogException(error, state.commons.ERROR_MESSAGE, true); + } + }); + } + + public getToken(code: string, host: URL) { + const params = new URLSearchParams(); + params.append("client_id", "cfd96460d8b110e2351b"); + params.append("client_secret", "ed46bd3a0f736e0da57308e86ca5fa3cf8688582"); + params.append("code", code); + + const promise = fetch(`https://${host.hostname}/login/oauth/access_token`, { + method: "POST", + body: params, + }); + + promise.catch((err) => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + return promise; + } + + public async getGists(token: string, user: string, host: URL) { + const promise = fetch(`https://api.${host.hostname}/users/${user}/gists`, { + method: "GET", + headers: { Authorization: `token ${token}` }, + }); + + promise.catch((err) => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + const res = await promise; + const gists = await res.json(); + return gists; + } + + public async saveToken(token: string) { + const currentSettings = await state.commons.GetCustomSettings(); + currentSettings.token = token; + state.commons.SetCustomSettings(currentSettings); + } + + public async getUser(token: string, host: URL) { + const promise = fetch(`https://api.${host.hostname}/user`, { + method: "GET", + headers: { Authorization: `token ${token}` }, + }); + + promise.catch((err) => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + const res = await promise; + const json: any = await res.json(); + return json?.login; + } +} diff --git a/.history/src/service/github.oauth.service_20241206235727.ts b/.history/src/service/github.oauth.service_20241206235727.ts new file mode 100644 index 00000000..e82b245e --- /dev/null +++ b/.history/src/service/github.oauth.service_20241206235727.ts @@ -0,0 +1,136 @@ +import * as express from "express"; +import { Server } from "http"; +import fetch from "node-fetch"; +import { URL, URLSearchParams } from "url"; +import Commons from "../commons"; +import { state } from "../state"; + +export class GitHubOAuthService { + public app: express.Express; + public server: Server; + + constructor(public port: number) { + this.app = express(); + this.app.use(express.json(), express.urlencoded({ extended: false })); + } + + public async StartProcess(cmd?: string) { + const customSettings = await state.commons.GetCustomSettings(); + const host = customSettings.githubEnterpriseUrl + ? new URL(customSettings.githubEnterpriseUrl) + : new URL("https://github.com"); + + this.server = this.app.listen(this.port); + this.app.get("/callback", async (req, res) => { + try { + const params = new URLSearchParams( + await (await this.getToken(req.params("code"), host)).text() + ); + + res.send(` + + + + + + + + +

Success! You may now close this tab.

+ + + + `); + this.server.close(); + + const token = params.get("access_token"); + this.saveToken(token); + + const user = await this.getUser(token, host); + + const gists: any = await this.getGists(token, user, host); + + const gistViewList: any[] = gists.map((m) => { + return { + id: m.id, + description: m.description, + updated_at: m.updated_at, + }; + }); + + state.commons.webviewService.OpenGistSelectionpage(gistViewList, cmd); + } catch (err) { + const error = new Error(err); + Commons.LogException(error, state.commons.ERROR_MESSAGE, true); + } + }); + } + + public getToken(code: string, host: URL) { + const params = new URLSearchParams(); + params.append("client_id", "cfd96460d8b110e2351b"); + params.append("client_secret", "ed46bd3a0f736e0da57308e86ca5fa3cf8688582"); + params.append("code", code); + + const promise = fetch(`https://${host.hostname}/login/oauth/access_token`, { + method: "POST", + body: params, + }); + + promise.catch((err) => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + return promise; + } + + public async getGists(token: string, user: string, host: URL) { + const promise = fetch(`https://api.${host.hostname}/users/${user}/gists`, { + method: "GET", + headers: { Authorization: `token ${token}` }, + }); + + promise.catch((err) => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + const res = await promise; + const gists = await res.json(); + return gists; + } + + public async saveToken(token: string) { + const currentSettings = await state.commons.GetCustomSettings(); + currentSettings.token = token; + state.commons.SetCustomSettings(currentSettings); + } + + public async getUser(token: string, host: URL) { + const promise = fetch(`https://api.${host.hostname}/user`, { + method: "GET", + headers: { Authorization: `token ${token}` }, + }); + + promise.catch((err) => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + const res = await promise; + const json: any = await res.json(); + return json?.login; + } +} diff --git a/.history/src/service/github.oauth.service_20241206235731.ts b/.history/src/service/github.oauth.service_20241206235731.ts new file mode 100644 index 00000000..72189839 --- /dev/null +++ b/.history/src/service/github.oauth.service_20241206235731.ts @@ -0,0 +1,136 @@ +import * as express from "express"; +import { Server } from "http"; +import fetch from "node-fetch"; +import { URL, URLSearchParams } from "url"; +import Commons from "../commons"; +import { state } from "../state"; + +export class GitHubOAuthService { + public app: express.Express; + public server: Server; + + constructor(public port: number) { + this.app = express(); + this.app.use(express.json(), express.urlencoded({ extended: false })); + } + + public async StartProcess(cmd?: string) { + const customSettings = await state.commons.GetCustomSettings(); + const host = customSettings.githubEnterpriseUrl + ? new URL(customSettings.githubEnterpriseUrl) + : new URL("https://github.com"); + + this.server = this.app.listen(this.port); + this.app.get("/callback", async (req: any, res) => { + try { + const params = new URLSearchParams( + await (await this.getToken(req.params("code"), host)).text() + ); + + res.send(` + + + + + + + + +

Success! You may now close this tab.

+ + + + `); + this.server.close(); + + const token = params.get("access_token"); + this.saveToken(token); + + const user = await this.getUser(token, host); + + const gists: any = await this.getGists(token, user, host); + + const gistViewList: any[] = gists.map((m) => { + return { + id: m.id, + description: m.description, + updated_at: m.updated_at, + }; + }); + + state.commons.webviewService.OpenGistSelectionpage(gistViewList, cmd); + } catch (err) { + const error = new Error(err); + Commons.LogException(error, state.commons.ERROR_MESSAGE, true); + } + }); + } + + public getToken(code: string, host: URL) { + const params = new URLSearchParams(); + params.append("client_id", "cfd96460d8b110e2351b"); + params.append("client_secret", "ed46bd3a0f736e0da57308e86ca5fa3cf8688582"); + params.append("code", code); + + const promise = fetch(`https://${host.hostname}/login/oauth/access_token`, { + method: "POST", + body: params, + }); + + promise.catch((err) => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + return promise; + } + + public async getGists(token: string, user: string, host: URL) { + const promise = fetch(`https://api.${host.hostname}/users/${user}/gists`, { + method: "GET", + headers: { Authorization: `token ${token}` }, + }); + + promise.catch((err) => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + const res = await promise; + const gists = await res.json(); + return gists; + } + + public async saveToken(token: string) { + const currentSettings = await state.commons.GetCustomSettings(); + currentSettings.token = token; + state.commons.SetCustomSettings(currentSettings); + } + + public async getUser(token: string, host: URL) { + const promise = fetch(`https://api.${host.hostname}/user`, { + method: "GET", + headers: { Authorization: `token ${token}` }, + }); + + promise.catch((err) => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + const res = await promise; + const json: any = await res.json(); + return json?.login; + } +} diff --git a/.history/src/service/github.oauth.service_20241206235738.ts b/.history/src/service/github.oauth.service_20241206235738.ts new file mode 100644 index 00000000..0c85e90e --- /dev/null +++ b/.history/src/service/github.oauth.service_20241206235738.ts @@ -0,0 +1,136 @@ +import * as express from "express"; +import { Server } from "http"; +import fetch from "node-fetch"; +import { URL, URLSearchParams } from "url"; +import Commons from "../commons"; +import { state } from "../state"; + +export class GitHubOAuthService { + public app: express.Express; + public server: Server; + + constructor(public port: number) { + this.app = express(); + this.app.use(express.json(), express.urlencoded({ extended: false })); + } + + public async StartProcess(cmd?: string) { + const customSettings = await state.commons.GetCustomSettings(); + const host = customSettings.githubEnterpriseUrl + ? new URL(customSettings.githubEnterpriseUrl) + : new URL("https://github.com"); + + this.server = this.app.listen(this.port); + this.app.get("/callback", async (req: any, res: any) => { + try { + const params = new URLSearchParams( + await (await this.getToken(req.params("code"), host)).text() + ); + + res.send(` + + + + + + + + +

Success! You may now close this tab.

+ + + + `); + this.server.close(); + + const token = params.get("access_token"); + this.saveToken(token); + + const user = await this.getUser(token, host); + + const gists: any = await this.getGists(token, user, host); + + const gistViewList: any[] = gists.map((m) => { + return { + id: m.id, + description: m.description, + updated_at: m.updated_at, + }; + }); + + state.commons.webviewService.OpenGistSelectionpage(gistViewList, cmd); + } catch (err) { + const error = new Error(err); + Commons.LogException(error, state.commons.ERROR_MESSAGE, true); + } + }); + } + + public getToken(code: string, host: URL) { + const params = new URLSearchParams(); + params.append("client_id", "cfd96460d8b110e2351b"); + params.append("client_secret", "ed46bd3a0f736e0da57308e86ca5fa3cf8688582"); + params.append("code", code); + + const promise = fetch(`https://${host.hostname}/login/oauth/access_token`, { + method: "POST", + body: params, + }); + + promise.catch((err) => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + return promise; + } + + public async getGists(token: string, user: string, host: URL) { + const promise = fetch(`https://api.${host.hostname}/users/${user}/gists`, { + method: "GET", + headers: { Authorization: `token ${token}` }, + }); + + promise.catch((err) => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + const res = await promise; + const gists = await res.json(); + return gists; + } + + public async saveToken(token: string) { + const currentSettings = await state.commons.GetCustomSettings(); + currentSettings.token = token; + state.commons.SetCustomSettings(currentSettings); + } + + public async getUser(token: string, host: URL) { + const promise = fetch(`https://api.${host.hostname}/user`, { + method: "GET", + headers: { Authorization: `token ${token}` }, + }); + + promise.catch((err) => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + const res = await promise; + const json: any = await res.json(); + return json?.login; + } +} diff --git a/.history/src/service/github.service_20241102143121.ts b/.history/src/service/github.service_20241102143121.ts new file mode 100644 index 00000000..aef71c12 --- /dev/null +++ b/.history/src/service/github.service_20241102143121.ts @@ -0,0 +1,203 @@ +"use strict"; + +import * as GitHubApi from "@octokit/rest"; +import * as HttpsProxyAgent from "https-proxy-agent"; +import * as vscode from "vscode"; +import Commons from "../commons"; +import { CloudSettings } from "../models/cloudSettings.model"; +import { state } from "../state"; +import { File } from "./file.service"; + +interface IEnv { + [key: string]: string | undefined; + http_proxy: string; + HTTP_PROXY: string; +} + +interface IFixGistResponse extends Omit { + files: any | GitHubApi.GistsGetResponseFiles; +} + +export class GitHubService { + public userName: string = null; + public name: string = null; + private github: GitHubApi = null; + private GIST_JSON_EMPTY: any = { + description: "Visual Studio Code Sync Settings Gist", + public: false, + files: { + "settings.json": { + content: "// Empty" + }, + "launch.json": { + content: "// Empty" + }, + "keybindings.json": { + content: "// Empty" + }, + "extensions.json": { + content: "// Empty" + }, + "locale.json": { + content: "// Empty" + }, + "keybindingsMac.json": { + content: "// Empty" + }, + cloudSettings: { + content: "// Empty" + } + } + }; + + constructor(userToken: string, basePath: string) { + const githubApiConfig: GitHubApi.Options = {}; + + const proxyURL: string = + vscode.workspace.getConfiguration("http").get("proxy") || + (process.env as IEnv).http_proxy || + (process.env as IEnv).HTTP_PROXY; + if (basePath) { + githubApiConfig.baseUrl = basePath; + } + + if (proxyURL) { + githubApiConfig.agent = new HttpsProxyAgent(proxyURL); + } + + if (userToken !== null && userToken !== "") { + githubApiConfig.auth = `token ${userToken}`; + } + try { + this.github = new GitHubApi(githubApiConfig); + } catch (err) { + console.error(err); + } + if (userToken !== null && userToken !== "") { + this.github.users + .getAuthenticated({}) + .then(res => { + this.userName = res.data.login; + this.name = res.data.name; + console.log( + "Sync : Connected with user : " + "'" + this.userName + "'" + ); + }) + .catch(err => { + console.error(err); + }); + } + } + + public AddFile(list: File[], GIST_JSON_B: any) { + for (const file of list) { + if (file.content !== "") { + GIST_JSON_B.files[file.gistName] = {}; + GIST_JSON_B.files[file.gistName].content = file.content; + } + } + return GIST_JSON_B; + } + + public async CreateEmptyGIST( + publicGist: boolean, + gistDescription: string + ): Promise { + if (publicGist) { + this.GIST_JSON_EMPTY.public = true; + } else { + this.GIST_JSON_EMPTY.public = false; + } + if (gistDescription !== null && gistDescription !== "") { + this.GIST_JSON_EMPTY.description = gistDescription; + } + + try { + const res = await this.github.gists.create(this.GIST_JSON_EMPTY); + if (res.data && res.data.id) { + return res.data.id.toString(); + } else { + console.error("ID is null"); + console.log("Sync : " + "Response from GitHub is: "); + console.log(res); + } + } catch (err) { + console.error(err); + throw err; + } + } + + // This should return GitHubApi.Response but Types are wrong + public async ReadGist( + GIST: string + ): Promise> { + const promise = this.github.gists.get({ gist_id: GIST }); + const res = await promise.catch(err => { + if (String(err).includes("HttpError: Not Found")) { + return Commons.LogException(err, "Sync: Invalid Gist ID", true); + } + Commons.LogException(err, state.commons.ERROR_MESSAGE, true); + }); + if (res) { + return res; + } + } + + public async IsGistNewer( + GIST: string, + localLastDownload: Date + ): Promise { + const gist = await this.ReadGist(GIST); + if (!gist) { + return; + } + let gistCloudSetting: CloudSettings = null; + try { + gistCloudSetting = JSON.parse(gist.data.files.cloudSettings.content); + const gistLastUpload = new Date(gistCloudSetting.lastUpload); + if (!localLastDownload) { + return false; + } + return gistLastUpload > new Date(localLastDownload); + } catch (err) { + return false; + } + } + + public UpdateGIST(gistObject: any, files: File[]): any { + const allFiles: string[] = Object.keys(gistObject.data.files); + for (const fileName of allFiles) { + let exists = false; + + for (const settingFile of files) { + if (settingFile.gistName === fileName) { + exists = true; + } + } + + if (!exists && !fileName.startsWith("keybindings")) { + gistObject.data.files[fileName] = null; + } + } + + gistObject.data = this.AddFile(files, gistObject.data); + return gistObject; + } + + public async SaveGIST(gistObject: any): Promise { + gistObject.gist_id = gistObject.id; + // tslint:disable-next-line:comment-format + //TODO : use github.gists.update when issue is fixed. + const promise = this.github.request("PATCH /gists/:gist_id", gistObject); + const res = await promise.catch(err => { + if (String(err).includes("HttpError: Not Found")) { + return Commons.LogException(err, "Sync: Invalid Gist ID", true); + } + Commons.LogException(err, state.commons.ERROR_MESSAGE, true); + }); + + if (res) { + return true; + } + } +} diff --git a/.history/src/service/github.service_20241206235854.ts b/.history/src/service/github.service_20241206235854.ts new file mode 100644 index 00000000..6bcb2836 --- /dev/null +++ b/.history/src/service/github.service_20241206235854.ts @@ -0,0 +1,203 @@ +"use strict"; + +import * as GitHubApi from "@octokit/rest"; +import * as HttpsProxyAgent from "https-proxy-agent"; +import * as vscode from "vscode"; +import Commons from "../commons"; +import { CloudSettings } from "../models/cloudSettings.model"; +import { state } from "../state"; +import { File } from "./file.service"; + +interface IEnv { + [key: string]: string | undefined; + http_proxy: string; + HTTP_PROXY: string; +} + +interface IFixGistResponse extends Omit { + files: any | GitHubApi.GistsGetResponseFiles; +} + +export class GitHubService { + public userName: string = null; + public name: string = null; + private github: GitHubApi = null; + private GIST_JSON_EMPTY: any = { + description: "Visual Studio Code Sync Settings Gist", + public: false, + files: { + "settings.json": { + content: "// Empty" + }, + "launch.json": { + content: "// Empty" + }, + "keybindings.json": { + content: "// Empty" + }, + "extensions.json": { + content: "// Empty" + }, + "locale.json": { + content: "// Empty" + }, + "keybindingsMac.json": { + content: "// Empty" + }, + cloudSettings: { + content: "// Empty" + } + } + }; + + constructor(userToken: string, basePath: string) { + const githubApiConfig: GitHubApi.Options = {}; + + const proxyURL: string = + vscode.workspace.getConfiguration("http").get("proxy") || + (process.env as IEnv).http_proxy || + (process.env as IEnv).HTTP_PROXY; + if (basePath) { + githubApiConfig.baseUrl = basePath; + } + + if (proxyURL) { + githubApiConfig.agent = new HttpsProxyAgent(proxyURL); + } + + if (userToken !== null && userToken !== "") { + githubApiConfig.auth = `token ${userToken}`; + } + try { + this.github = new GitHubApi(githubApiConfig); + } catch (err) { + console.error(err); + } + if (userToken !== null && userToken !== "") { + this.github.users + .getAuthenticated({}) + .then(res => { + this.userName = res.data.login; + this.name = res.data.name; + console.log( + "Sync : Connected with user : " + "'" + this.userName + "'" + ); + }) + .catch(err => { + console.error(err); + }); + } + } + + public AddFile(list: File[], GIST_JSON_B: any) { + for (const file of list) { + if (file.content !== "") { + GIST_JSON_B.files[file.gistName] = {}; + GIST_JSON_B.files[file.gistName].content = file.content; + } + } + return GIST_JSON_B; + } + + public async CreateEmptyGIST( + publicGist: boolean, + gistDescription: string + ): Promise { + if (publicGist) { + this.GIST_JSON_EMPTY.public = true; + } else { + this.GIST_JSON_EMPTY.public = false; + } + if (gistDescription !== null && gistDescription !== "") { + this.GIST_JSON_EMPTY.description = gistDescription; + } + + try { + const res = await this.github.gists.create(this.GIST_JSON_EMPTY); + if (res.data && res.data.id) { + return res.data.id.toString(); + } else { + console.error("ID is null"); + console.log("Sync : " + "Response from GitHub is: "); + console.log(res); + } + } catch (err) { + console.error(err); + throw err; + } + } + + // This should return GitHubApi.Response but Types are wrong + public async ReadGist( + GIST: string + ): Promise> { + const promise = this.github.gists.get({ gist_id: GIST }); + const res = await promise.catch(err => { + if (String(err).includes("HttpError: Not Found")) { + return Commons.LogException(err, "Sync: Invalid Gist ID", true); + } + Commons.LogException(err, state.commons.ERROR_MESSAGE, true); + }); + if (res) { + return res; + } + } + + public async IsGistNewer( + GIST: string, + localLastDownload: Date + ): Promise { + const gist = await this.ReadGist(GIST); + if (!gist) { + return; + } + let gistCloudSetting: CloudSettings = null; + try { + gistCloudSetting = JSON.parse(gist.data.files.cloudSettings.content); + const gistLastUpload = new Date(gistCloudSetting.lastUpload); + if (!localLastDownload) { + return false; + } + return gistLastUpload > new Date(localLastDownload); + } catch (err) { + return false; + } + } + + public UpdateGIST(gistObject: any, files: File[]): any { + const allFiles: string[] = Object.keys(gistObject.data.files); + for (const fileName of allFiles) { + let exists = false; + + for (const settingFile of files) { + if (settingFile.gistName === fileName) { + exists = true; + } + } + + if (!exists && !fileName.startsWith("keybindings")) { + gistObject.data.files[fileName] = null; + } + } + + gistObject.data = this.AddFile(files, gistObject.data); + return gistObject; + } + + public async SaveGIST(gistObject: any): Promise { + gistObject.gist_id = gistObject.id; + // tslint:disable-next-line:comment-format + //TODO : use github.gists.update when issue is fixed. + const promise = this.github.request("PATCH /gists/:gist_id", gistObject); + const res = await promise.catch(err => { + if (String(err).includes("HttpError: Not Found")) { + return Commons.LogException(err, "Sync: Invalid Gist ID", true); + } + Commons.LogException(err, state.commons.ERROR_MESSAGE, true); + }); + + if (res) { + return true; + } + } +} diff --git a/.history/src/service/github.service_20241206235857.ts b/.history/src/service/github.service_20241206235857.ts new file mode 100644 index 00000000..8dc6de7e --- /dev/null +++ b/.history/src/service/github.service_20241206235857.ts @@ -0,0 +1,203 @@ +"use strict"; + +import * as GitHubApi from "@octokit/rest"; +import * as HttpsProxyAgent from "https-proxy-agent"; +import * as vscode from "vscode"; +import Commons from "../commons"; +import { CloudSettings } from "../models/cloudSettings.model"; +import { state } from "../state"; +import { File } from "./file.service"; + +interface IEnv { + [key: string]: string | undefined; + http_proxy: string; + HTTP_PROXY: string; +} + +interface IFixGistResponse extends Omit { + files: any | GitHubApi.GistsGetResponseFiles; +} + +export class GitHubService { + public userName: string = null; + public name: string = null; + private github: GitHubApi = null; + private GIST_JSON_EMPTY: any = { + description: "Visual Studio Code Sync Settings Gist", + public: false, + files: { + "settings.json": { + content: "// Empty" + }, + "launch.json": { + content: "// Empty" + }, + "keybindings.json": { + content: "// Empty" + }, + "extensions.json": { + content: "// Empty" + }, + "locale.json": { + content: "// Empty" + }, + "keybindingsMac.json": { + content: "// Empty" + }, + cloudSettings: { + content: "// Empty" + } + } + }; + + constructor(userToken: string, basePath: string) { + const githubApiConfig: GitHubApi.Options = {}; + + const proxyURL: string = + vscode.workspace.getConfiguration("http").get("proxy") || + (process.env as IEnv).http_proxy || + (process.env as IEnv).HTTP_PROXY; + if (basePath) { + githubApiConfig.baseUrl = basePath; + } + + if (proxyURL) { + githubApiConfig.agent = new HttpsProxyAgent(proxyURL); + } + + if (userToken !== null && userToken !== "") { + githubApiConfig.auth = `token ${userToken}`; + } + try { + this.github = new GitHubApi(githubApiConfig); + } catch (err) { + console.error(err); + } + if (userToken !== null && userToken !== "") { + this.github.users + .getAuthenticated({}) + .then(res => { + this.userName = res.data.login; + this.name = res.data.name; + console.log( + "Sync : Connected with user : " + "'" + this.userName + "'" + ); + }) + .catch(err => { + console.error(err); + }); + } + } + + public AddFile(list: File[], GIST_JSON_B: any) { + for (const file of list) { + if (file.content !== "") { + GIST_JSON_B.files[file.gistName] = {}; + GIST_JSON_B.files[file.gistName].content = file.content; + } + } + return GIST_JSON_B; + } + + public async CreateEmptyGIST( + publicGist: boolean, + gistDescription: string + ): Promise { + if (publicGist) { + this.GIST_JSON_EMPTY.public = true; + } else { + this.GIST_JSON_EMPTY.public = false; + } + if (gistDescription !== null && gistDescription !== "") { + this.GIST_JSON_EMPTY.description = gistDescription; + } + + try { + const res = await this.github.gists.create(this.GIST_JSON_EMPTY); + if (res.data && res.data.id) { + return res.data.id.toString(); + } else { + console.error("ID is null"); + console.log("Sync : " + "Response from GitHub is: "); + console.log(res); + } + } catch (err) { + console.error(err); + throw err; + } + } + + // This should return GitHubApi.Response but Types are wrong + public async ReadGist( + GIST: string + ): Promise> { + const promise = this.github.gists.get({ gist_id: GIST }); + const res = await promise.catch(err => { + if (String(err).includes("HttpError: Not Found")) { + return Commons.LogException(err, "Sync: Invalid Gist ID", true); + } + Commons.LogException(err, state.commons.ERROR_MESSAGE, true); + }); + if (res) { + return res; + } + } + + public async IsGistNewer( + GIST: string, + localLastDownload: Date + ): Promise { + const gist = await this.ReadGist(GIST); + if (!gist) { + return; + } + let gistCloudSetting: CloudSettings = null; + try { + gistCloudSetting = JSON.parse(gist.data.files.cloudSettings.content); + const gistLastUpload = new Date(gistCloudSetting.lastUpload); + if (!localLastDownload) { + return false; + } + return gistLastUpload > new Date(localLastDownload); + } catch (err) { + return false; + } + } + + public UpdateGIST(gistObject: any, files: File[]): any { + const allFiles: string[] = Object.keys(gistObject.data.files); + for (const fileName of allFiles) { + let exists = false; + + for (const settingFile of files) { + if (settingFile.gistName === fileName) { + exists = true; + } + } + + if (!exists && !fileName.startsWith("keybindings")) { + gistObject.data.files[fileName] = null; + } + } + + gistObject.data = this.AddFile(files, gistObject.data); + return gistObject; + } + + public async SaveGIST(gistObject: any): Promise { + gistObject.gist_id = gistObject.id; + // tslint:disable-next-line:comment-format + //TODO : use github.gists.update when issue is fixed. + const promise = this.github.request("PATCH /gists/:gist_id", gistObject); + const res = await promise.catch(err => { + if (String(err).includes("HttpError: Not Found")) { + return Commons.LogException(err, "Sync: Invalid Gist ID", true); + } + Commons.LogException(err, state.commons.ERROR_MESSAGE, true); + }); + + if (res) { + return true; + } + } +} diff --git a/.history/src/service/github.service_20241206235858.ts b/.history/src/service/github.service_20241206235858.ts new file mode 100644 index 00000000..a48015af --- /dev/null +++ b/.history/src/service/github.service_20241206235858.ts @@ -0,0 +1,203 @@ +"use strict"; + +import * as GitHubApi from "@octokit/rest"; +import * as HttpsProxyAgent from "https-proxy-agent"; +import * as vscode from "vscode"; +import Commons from "../commons"; +import { CloudSettings } from "../models/cloudSettings.model"; +import { state } from "../state"; +import { File } from "./file.service"; + +interface IEnv { + [key: string]: string | undefined; + http_proxy: string; + HTTP_PROXY: string; +} + +interface IFixGistResponse extends Omit { + files: any | GitHubApi.GistsGetResponseFiles; +} + +export class GitHubService { + public userName: string = null; + public name: string = null; + private github: GitHubApi = null; + private GIST_JSON_EMPTY: any = { + description: "Visual Studio Code Sync Settings Gist", + public: false, + files: { + "settings.json": { + content: "// Empty" + }, + "launch.json": { + content: "// Empty" + }, + "keybindings.json": { + content: "// Empty" + }, + "extensions.json": { + content: "// Empty" + }, + "locale.json": { + content: "// Empty" + }, + "keybindingsMac.json": { + content: "// Empty" + }, + cloudSettings: { + content: "// Empty" + } + } + }; + + constructor(userToken: string, basePath: string) { + const githubApiConfig: GitHubApi.Options = {}; + + const proxyURL: string = + vscode.workspace.getConfiguration("http").get("proxy") || + (process.env as IEnv).http_proxy || + (process.env as IEnv).HTTP_PROXY; + if (basePath) { + githubApiConfig.baseUrl = basePath; + } + + if (proxyURL) { + githubApiConfig.agent = new HttpsProxyAgent(proxyURL); + } + + if (userToken !== null && userToken !== "") { + githubApiConfig.auth = `token ${userToken}`; + } + try { + this.github = new GitHubApi(githubApiConfig); + } catch (err) { + console.error(err); + } + if (userToken !== null && userToken !== "") { + this.github.users + .getAuthenticated({}) + .then(res => { + this.userName = res.data.login; + this.name = res.data.name; + console.log( + "Sync : Connected with user : " + "'" + this.userName + "'" + ); + }) + .catch(err => { + console.error(err); + }); + } + } + + public AddFile(list: File[], GIST_JSON_B: any) { + for (const file of list) { + if (file.content !== "") { + GIST_JSON_B.files[file.gistName] = {}; + GIST_JSON_B.files[file.gistName].content = file.content; + } + } + return GIST_JSON_B; + } + + public async CreateEmptyGIST( + publicGist: boolean, + gistDescription: string + ): Promise { + if (publicGist) { + this.GIST_JSON_EMPTY.public = true; + } else { + this.GIST_JSON_EMPTY.public = false; + } + if (gistDescription !== null && gistDescription !== "") { + this.GIST_JSON_EMPTY.description = gistDescription; + } + + try { + const res = await this.github.gists.create(this.GIST_JSON_EMPTY); + if (res.data && res.data.id) { + return res.data.id.toString(); + } else { + console.error("ID is null"); + console.log("Sync : " + "Response from GitHub is: "); + console.log(res); + } + } catch (err) { + console.error(err); + throw err; + } + } + + // This should return GitHubApi.Response but Types are wrong + public async ReadGist( + GIST: string + ): Promise> { + const promise = this.github.gists.get({ gist_id: GIST }); + const res = await promise.catch(err => { + if (String(err).includes("HttpError: Not Found")) { + return Commons.LogException(err, "Sync: Invalid Gist ID", true); + } + Commons.LogException(err, state.commons.ERROR_MESSAGE, true); + }); + if (res) { + return res; + } + } + + public async IsGistNewer( + GIST: string, + localLastDownload: Date + ): Promise { + const gist = await this.ReadGist(GIST); + if (!gist) { + return; + } + let gistCloudSetting: CloudSettings = null; + try { + gistCloudSetting = JSON.parse(gist.data.files.cloudSettings.content); + const gistLastUpload = new Date(gistCloudSetting.lastUpload); + if (!localLastDownload) { + return false; + } + return gistLastUpload > new Date(localLastDownload); + } catch (err) { + return false; + } + } + + public UpdateGIST(gistObject: any, files: File[]): any { + const allFiles: string[] = Object.keys(gistObject.data.files); + for (const fileName of allFiles) { + let exists = false; + + for (const settingFile of files) { + if (settingFile.gistName === fileName) { + exists = true; + } + } + + if (!exists && !fileName.startsWith("keybindings")) { + gistObject.data.files[fileName] = null; + } + } + + gistObject.data = this.AddFile(files, gistObject.data); + return gistObject; + } + + public async SaveGIST(gistObject: any): Promise { + gistObject.gist_id = gistObject.id; + // tslint:disable-next-line:comment-format + //TODO : use github.gists.update when issue is fixed. + const promise = this.github.request("PATCH /gists/:gist_id", gistObject); + const res = await promise.catch(err => { + if (String(err).includes("HttpError: Not Found")) { + return Commons.LogException(err, "Sync: Invalid Gist ID", true); + } + Commons.LogException(err, state.commons.ERROR_MESSAGE, true); + }); + + if (res) { + return true; + } + } +} diff --git a/.history/src/service/github.service_20241206235903.ts b/.history/src/service/github.service_20241206235903.ts new file mode 100644 index 00000000..aef71c12 --- /dev/null +++ b/.history/src/service/github.service_20241206235903.ts @@ -0,0 +1,203 @@ +"use strict"; + +import * as GitHubApi from "@octokit/rest"; +import * as HttpsProxyAgent from "https-proxy-agent"; +import * as vscode from "vscode"; +import Commons from "../commons"; +import { CloudSettings } from "../models/cloudSettings.model"; +import { state } from "../state"; +import { File } from "./file.service"; + +interface IEnv { + [key: string]: string | undefined; + http_proxy: string; + HTTP_PROXY: string; +} + +interface IFixGistResponse extends Omit { + files: any | GitHubApi.GistsGetResponseFiles; +} + +export class GitHubService { + public userName: string = null; + public name: string = null; + private github: GitHubApi = null; + private GIST_JSON_EMPTY: any = { + description: "Visual Studio Code Sync Settings Gist", + public: false, + files: { + "settings.json": { + content: "// Empty" + }, + "launch.json": { + content: "// Empty" + }, + "keybindings.json": { + content: "// Empty" + }, + "extensions.json": { + content: "// Empty" + }, + "locale.json": { + content: "// Empty" + }, + "keybindingsMac.json": { + content: "// Empty" + }, + cloudSettings: { + content: "// Empty" + } + } + }; + + constructor(userToken: string, basePath: string) { + const githubApiConfig: GitHubApi.Options = {}; + + const proxyURL: string = + vscode.workspace.getConfiguration("http").get("proxy") || + (process.env as IEnv).http_proxy || + (process.env as IEnv).HTTP_PROXY; + if (basePath) { + githubApiConfig.baseUrl = basePath; + } + + if (proxyURL) { + githubApiConfig.agent = new HttpsProxyAgent(proxyURL); + } + + if (userToken !== null && userToken !== "") { + githubApiConfig.auth = `token ${userToken}`; + } + try { + this.github = new GitHubApi(githubApiConfig); + } catch (err) { + console.error(err); + } + if (userToken !== null && userToken !== "") { + this.github.users + .getAuthenticated({}) + .then(res => { + this.userName = res.data.login; + this.name = res.data.name; + console.log( + "Sync : Connected with user : " + "'" + this.userName + "'" + ); + }) + .catch(err => { + console.error(err); + }); + } + } + + public AddFile(list: File[], GIST_JSON_B: any) { + for (const file of list) { + if (file.content !== "") { + GIST_JSON_B.files[file.gistName] = {}; + GIST_JSON_B.files[file.gistName].content = file.content; + } + } + return GIST_JSON_B; + } + + public async CreateEmptyGIST( + publicGist: boolean, + gistDescription: string + ): Promise { + if (publicGist) { + this.GIST_JSON_EMPTY.public = true; + } else { + this.GIST_JSON_EMPTY.public = false; + } + if (gistDescription !== null && gistDescription !== "") { + this.GIST_JSON_EMPTY.description = gistDescription; + } + + try { + const res = await this.github.gists.create(this.GIST_JSON_EMPTY); + if (res.data && res.data.id) { + return res.data.id.toString(); + } else { + console.error("ID is null"); + console.log("Sync : " + "Response from GitHub is: "); + console.log(res); + } + } catch (err) { + console.error(err); + throw err; + } + } + + // This should return GitHubApi.Response but Types are wrong + public async ReadGist( + GIST: string + ): Promise> { + const promise = this.github.gists.get({ gist_id: GIST }); + const res = await promise.catch(err => { + if (String(err).includes("HttpError: Not Found")) { + return Commons.LogException(err, "Sync: Invalid Gist ID", true); + } + Commons.LogException(err, state.commons.ERROR_MESSAGE, true); + }); + if (res) { + return res; + } + } + + public async IsGistNewer( + GIST: string, + localLastDownload: Date + ): Promise { + const gist = await this.ReadGist(GIST); + if (!gist) { + return; + } + let gistCloudSetting: CloudSettings = null; + try { + gistCloudSetting = JSON.parse(gist.data.files.cloudSettings.content); + const gistLastUpload = new Date(gistCloudSetting.lastUpload); + if (!localLastDownload) { + return false; + } + return gistLastUpload > new Date(localLastDownload); + } catch (err) { + return false; + } + } + + public UpdateGIST(gistObject: any, files: File[]): any { + const allFiles: string[] = Object.keys(gistObject.data.files); + for (const fileName of allFiles) { + let exists = false; + + for (const settingFile of files) { + if (settingFile.gistName === fileName) { + exists = true; + } + } + + if (!exists && !fileName.startsWith("keybindings")) { + gistObject.data.files[fileName] = null; + } + } + + gistObject.data = this.AddFile(files, gistObject.data); + return gistObject; + } + + public async SaveGIST(gistObject: any): Promise { + gistObject.gist_id = gistObject.id; + // tslint:disable-next-line:comment-format + //TODO : use github.gists.update when issue is fixed. + const promise = this.github.request("PATCH /gists/:gist_id", gistObject); + const res = await promise.catch(err => { + if (String(err).includes("HttpError: Not Found")) { + return Commons.LogException(err, "Sync: Invalid Gist ID", true); + } + Commons.LogException(err, state.commons.ERROR_MESSAGE, true); + }); + + if (res) { + return true; + } + } +} diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..16e9a25b --- /dev/null +++ b/.travis.yml @@ -0,0 +1,33 @@ +language: node_js +node_js: + - node +before_install: + - npm install npm@latest -g + - npm install node-pre-gyp + - npm i --no-optional + - npm dedupe + - npm up + - npm install -g vsce + +install: + - vsce package +script: + - npm run tslint-check + - npm run compile + +deploy: + provider: script + script: bash scripts/deploy.sh + on: + branch: master + + +notifications: + slack: + secure: R9xqGEFOQHI+6oaiGz7+4zOErZydinpg+7tQd0xaCy8qRswcVtPT+yX6RAgsEGS+RXaOoVz9N534XJIdLXyW/nN8vD898Dwq4nf+lUMiRuuPrvCLk2rh50FFDRi6aoeCv1qxeNswf2ahNnFILV4FE8t2r/+P2vYeB/pJ8DChFTlz3+mjXuawH9cW+hLR6DOC7307dLHGq6SuhIvfyuysu6ZU9tyKVRWW/BsQgmz+PtlfA1HGAVzg0Yc8KhGGuWdSZydOcSisUWX2f8+BL1HGPXbzlMqJinb7z7k8HJVjddH88Tfa2Jphs/rxoKr+enlqqeCNdCIlRQ8p093bkw9B2Rmo2/xYfc2w0JnzEK5q8EibsDapn2V7hcNCd2hO1MuXTus4L43ZBxoJZoQfiyYPIYRTgo4mCT4B4AKzOuvaNZ/sXYN6I7UTwY1iXzUW3ntdn49tWJmFdUuDNwj+im+X89xdRqUWVaJD9cfgG9070MIle2CFFMGL0OXLwJRnoj3ySOLuJVThL68qVoX5E4NZn4HDdMKtmf7h8P36BUG2zmuq6n48NEiLlWgLd8HWXZEIkVnBytnnQ/+5Bg5ZZsHCEpIjcPGPuUXa5WpJlZdcqDvaQJ7NRjckDYhGqHz7AqLxMWnwcOAPWrWOYnKymh38ncGgznfjR3JSy8ZBXMU6xDw= + email: + on_success: never + on_failure: always + +env: + secure: RoVxN0hSdHzA5TEA/zW5gJcAXP7qPjLSOjWTeu+m2Ooo3XgxiHSsnld7pTMU/fDYsBjAlakiv1cLU505iBIp8I7aBb7oW2rKs/YlXHeSlYUpYpwWj7/ploiY2Zg2L+s1Ojfg3X/tAaR0jSRYsffPSlZJmUL+Wom+R5pDx64nCh2hJ2egu04Co+3QSQySWrcFbUrT7phJPVW5OHYQDc+68i9QS9ptPzuKgGu1CxsYphMPsiA0EPzTUu88hPPov7UvvE7NmDnq94ObgQbkVrpMrnQFuid0EGHAeN05/RpBhQHQ7s6/eZTPIj7EAISXDMzu0X6XsbYKNLwWyjKxdpUYyl7lUFqUQYlmCk05mgH1392LqJdpYkm6NFscdU4LHiHUzpOaOBNzpewl18eQbXq/iJei6AiEw7MxwhbCh6Kg6EzhPRpBX2Pv53EBHhcSvzgkl66lau/a7HFSnQ6G4DNl6A8akD2CV9+r2r2uAj80ZBfSPIa5lTmWoJvuOw33pW2YwJn5GMyoMXydewjPCMHLIx+PNd57M1LToVdOlbrKGL1u9Xrb0FHV2DKLYslW21Dr0LCoP+NwcRcnM2R/lUKXIh5MSKLnk31jMgXrgezr+1eaOBZwo+X0gfj5YNWSA71sUXrg9AbCIP74zyUyowbkm3b1HwVFu8JtcP/ON8xqC6A= diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..29e14514 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,27 @@ +// A launch configuration that compiles the extension and then opens it inside a new window +{ + "version": "0.1.0", + "configurations": [{ + "name": "Launch Extension", + "type": "extensionHost", + "request": "launch", + "runtimeExecutable": "${execPath}", + "args": ["--extensionDevelopmentPath=${workspaceRoot}"], + "stopOnEntry": false, + "sourceMaps": true, + "outFiles": ["${workspaceRoot}/out/**/*.js"], + "preLaunchTask": "build" + }, + { + "name": "Launch Tests", + "type": "extensionHost", + "request": "launch", + "runtimeExecutable": "${execPath}", + "args": ["--extensionDevelopmentPath=${workspaceRoot}", "--extensionTestsPath=${workspaceRoot}/out/test"], + "stopOnEntry": false, + "sourceMaps": true, + "outFiles": ["${workspaceRoot}/out/test/**/*.js"], + "preLaunchTask": "test_build" + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..f454cfdb --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,9 @@ +// Place your settings in this file to overwrite default and user settings. +{ + "files.exclude": { + "out": false // set this to true to hide the "out" folder with the compiled JS files + }, + "search.exclude": { + "out": true // set this to false to include "out" folder in search results + } +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 00000000..343e3cfe --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,20 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "type": "shell", + "command": "npm", + "args": ["run", "compile", "--loglevel", "silent"], + "problemMatcher": "$tsc-watch" + }, + { + "label": "test_build", + "type": "shell", + "command": "tsc", + "args": ["-p", "./"] + } + ] +} diff --git a/.vscodeignore b/.vscodeignore new file mode 100644 index 00000000..b66eaaf4 --- /dev/null +++ b/.vscodeignore @@ -0,0 +1,16 @@ +.vscode/** +typings/** +out/test/** +test/** +src/** +**/*.map +.gitignore +tsconfig.json +vsc-extension-quickstart.md +node_modules +.github +debug.log +scripts +tslint.json +webpack.config.js +*.log \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..24233c89 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,143 @@ +# ChangeLog : Settings Sync [![Tweet](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/intent/tweet?text=Synchronize%20your%20%40VisualStudio%20%40code%20Settings%20Across%20Multiple%20Machines%20using%20%40github%20GIST%20by%20%40itsShanKhan&url=https://github.com/shanalikhan/code-settings-sync&via=code&hashtags=code,vscode,SettingsSync,developers) [![Follow](https://img.shields.io/twitter/follow/itsShanKhan.svg?style=social&label=Follow)](https://twitter.com/intent/follow?screen_name=itsShanKhan) + +[![Version](https://vsmarketplacebadge.apphb.com/version/Shan.code-settings-sync.svg)](https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync) [![Travis](https://img.shields.io/travis/rust-lang/rust.svg)](https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync) [![Master course](https://img.shields.io/badge/Supported%20by-VSCode%20Power%20User%20Course%20%E2%86%92-gray.svg?colorA=444444&colorB=4F44D6)](https://t.co/8BEMyhpKU5?amp=1) + +#### v3.4.3 - September 23,2019 + +* Share GitHub Gist ID message Fixed [#1033](https://github.com/shanalikhan/code-settings-sync/issues/1033) +* Consistency between GitHub Gist and Description across extension readme [#1023](https://github.com/shanalikhan/code-settings-sync/issues/1023) +* Snippets Sync. Fixed [#993](https://github.com/shanalikhan/code-settings-sync/issues/993) +* GitHub Api connection improved [#1027](https://github.com/shanalikhan/code-settings-sync/issues/1027) +* Extension always asks to enable Force Upload [#1016](https://github.com/shanalikhan/code-settings-sync/issues/1016) - Thanks for PR [#1026](https://github.com/shanalikhan/code-settings-sync/pull/1026) by [@karl-lunarg](https://github.com/karl-lunarg) +* UX Improved for the Force Upload [#1035](https://github.com/shanalikhan/code-settings-sync/issues/1035) - Thanks for PR [#1042](https://github.com/shanalikhan/code-settings-sync/pull/1042) by [@karl-lunarg](https://github.com/karl-lunarg) +* Webview does not set a content security policy [#1010](https://github.com/shanalikhan/code-settings-sync/issues/1010) - Thanks for PR [#1020](https://github.com/shanalikhan/code-settings-sync/pull/1020) by [@ParkourKarthik](https://github.com/ParkourKarthik) +* Icon Improved - Thanks for PR [#1022](https://github.com/shanalikhan/code-settings-sync/pull/1022) by [@Pustur](https://github.com/Pustur) +* Improved German Languauge Support - Thanks for PR [#1040](https://github.com/shanalikhan/code-settings-sync/pull/1040) by [@jan-di](https://github.com/jan-di) +* Improved Chinese Language Support - Thanks for PR [#1028](https://github.com/shanalikhan/code-settings-sync/pull/1028) by [@YunChaoTsai](https://github.com/YunChaoTsai) +* Readme Improved - Thanks for PR [#1031](https://github.com/shanalikhan/code-settings-sync/pull/1031) by [@faliure](https://github.com/faliure) +* Slack Link Updated +* Node Modules Updated + +#### v3.4.2 - August 21, 2019 + +* Multiple Lanugages Support Improved [#1009](https://github.com/shanalikhan/code-settings-sync/pull/1009) by [@ XanatosX](https://github.com/XanatosX ) , [#999](https://github.com/shanalikhan/code-settings-sync/pull/999) by [@o3LL](https://github.com/o3LL) , [#994](https://github.com/shanalikhan/code-settings-sync/pull/994) by [@mijien0179](https://github.com/mijien0179) , [#981](https://github.com/shanalikhan/code-settings-sync/pull/981) by [@ryul1206](https://github.com/ryul1206) +* Hide GitHub Token on Summary [#974](https://github.com/shanalikhan/code-settings-sync/issues/974) +* Only Show "Share Gist" Dialog when Public Gist is created [#977](https://github.com/shanalikhan/code-settings-sync/issues/977) +* Sync Pragma Improved [#1003](https://github.com/shanalikhan/code-settings-sync/issues/1003) - Thanks for PR [#1012](https://github.com/shanalikhan/code-settings-sync/pull/1012) by [@protium-dev](https://github.com/protium-dev) +* UI Bug Fix where users were unable to select GIST [#983](https://github.com/shanalikhan/code-settings-sync/issues/983) + +#### v3.4.1 - July 22, 2019 + +* Turn off notifications on code startup [#959](https://github.com/shanalikhan/code-settings-sync/issues/959) - Thanks for PR [#960](https://github.com/shanalikhan/code-settings-sync/pull/960) by [@arnohovhannisyan](https://github.com/arnohovhannisyan) +* Chinese Translation Improved - Thanks for PR [#966](https://github.com/shanalikhan/code-settings-sync/pull/966) by [@linsui](https://github.com/linsui) and [#961](https://github.com/shanalikhan/code-settings-sync/pull/961) by [@ziofat](https://github.com/ziofat) +* Russian Translation Improved - Thanks for PR [#957](https://github.com/shanalikhan/code-settings-sync/pull/957) by [@AndreyWV](https://github.com/AndreyWV) + +#### v3.4.0 - July 15, 2019 + +* Settings Sync now use Webviews to allow you to configure settings [#506](https://github.com/shanalikhan/code-settings-sync/issues/506) - Thanks for PR [#876](https://github.com/shanalikhan/code-settings-sync/pull/876) by [@arnohovhannisyan](https://github.com/arnohovhannisyan) +* code snippets not being synced after update to 3.3.0 [#927](https://github.com/shanalikhan/code-settings-sync/issues/927) - Thanks for PR [#928](https://github.com/shanalikhan/code-settings-sync/pull/928) by [@arnohovhannisyan](https://github.com/arnohovhannisyan) +* Implement upload delay setting [#390](https://github.com/shanalikhan/code-settings-sync/issues/390) - Thanks for PR [#925](https://github.com/shanalikhan/code-settings-sync/pull/925) by [@arnohovhannisyan](https://github.com/arnohovhannisyan) +* Dont Upload If GIST and settings content are the same. [#316](https://github.com/shanalikhan/code-settings-sync/issues/316) - Thanks for PR [#923](https://github.com/shanalikhan/code-settings-sync/pull/923) by [@arnohovhannisyan](https://github.com/arnohovhannisyan) +* Prevent accidental upload [#350](https://github.com/shanalikhan/code-settings-sync/issues/350) - Thanks for PR [#923](https://github.com/shanalikhan/code-settings-sync/pull/923) by [@arnohovhannisyan](https://github.com/arnohovhannisyan) + +#### v3.3.1 - June 25,2019 +* Small Improvements + +#### v3.3.0 - June 25,2019 + +* Code OSS Version Support Added [#668](https://github.com/shanalikhan/code-settings-sync/issues/668) - Thanks for PR [#859](https://github.com/shanalikhan/code-settings-sync/pull/859) by [@arnohovhannisyan](https://github.com/arnohovhannisyan) +* Remote Development Support Added [#870](https://github.com/shanalikhan/code-settings-sync/issues/870) - Thanks for PR [#871](https://github.com/shanalikhan/code-settings-sync/pull/871) by [@mjbvz](https://github.com/mjbvz) +* Pragma Util Support for `keybindings.json` Added [#800](https://github.com/shanalikhan/code-settings-sync/issues/800) - Thanks for PR [#854](https://github.com/shanalikhan/code-settings-sync/pull/854) by [@njkevlani](https://github.com/njkevlani) +* Support OS specific `keybindings.json` in single file [#515](https://github.com/shanalikhan/code-settings-sync/issues/515) - Thanks for PR [#854](https://github.com/shanalikhan/code-settings-sync/pull/854) by [@njkevlani](https://github.com/njkevlani) +* Improved Auto Upload Process [#839](https://github.com/shanalikhan/code-settings-sync/issues/839) - Thanks for PR [#909](https://github.com/shanalikhan/code-settings-sync/pull/909) by [@arnohovhannisyan](https://github.com/arnohovhannisyan) +* Improved Pragma Util to ignore some values[#865](https://github.com/shanalikhan/code-settings-sync/issues/865) - Thanks for PR [#872](https://github.com/shanalikhan/code-settings-sync/pull/872) by [@ioprotium](https://github.com/ioprotium) +* Ignore auto-upload process for some settings [#754](https://github.com/shanalikhan/code-settings-sync/issues/754) - Thanks for PR [#872](https://github.com/shanalikhan/code-settings-sync/pull/872) by [@ioprotium](https://github.com/ioprotium) +* Language localization improved and more languages added. [#886](https://github.com/shanalikhan/code-settings-sync/issues/886) - Thanks for PR [#915](https://github.com/shanalikhan/code-settings-sync/pull/915) by [@arnohovhannisyan](https://github.com/arnohovhannisyan) +* Improved Command line text [#891](https://github.com/shanalikhan/code-settings-sync/issues/891 ) - by [@nawordar](https://github.com/nawordar) +* Support For Azure Data Studio +* Node Modules Updated and code refactoring. + +#### v3.2.9 - April 18,2019 + +* Bug : Fixed Code that kills Extension Host for MacOS [#827](https://github.com/shanalikhan/code-settings-sync/issues/827) - Thanks for PR [#834](https://github.com/shanalikhan/code-settings-sync/pull/834) by [@arnohovhannisyan](https://github.com/arnohovhannisyan) +* Bug : Download From Public Gist not working [#816](https://github.com/shanalikhan/code-settings-sync/issues/816) +* Bug : Auto Upload Fix [#832](https://github.com/shanalikhan/code-settings-sync/issues/832) - Thanks for PR [#835](https://github.com/shanalikhan/code-settings-sync/pull/835) by [@arnohovhannisyan](https://github.com/arnohovhannisyan) +* Improvement - Inserts some empty lines in the beginning of `settings.json` [#819](https://github.com/shanalikhan/code-settings-sync/issues/819) - Thanks for PR [#828](https://github.com/shanalikhan/code-settings-sync/pull/828) by [@knyhle](https://github.com/knyhle) +* Wiki : Update Documentation - Thanks for PR [#828](https://github.com/shanalikhan/code-settings-sync/pull/845) by [@colinaaa](https://github.com/colinaaa) + +#### v3.2.8 - April 04,2019 + +* Bug : auto upload doesn't work when make change on settings [#801](https://github.com/shanalikhan/code-settings-sync/issues/801) - Thanks for PR [#807](https://github.com/shanalikhan/code-settings-sync/pull/807) by [@arnohovhannisyan](https://github.com/arnohovhannisyan) +* Bug : Auto Upload / Download : Disable change detection for workspace storage folder [#708](https://github.com/shanalikhan/code-settings-sync/issues/708) - Thanks for PR [#811](https://github.com/shanalikhan/code-settings-sync/pull/811) by [@knyhle](https://github.com/knyhle) +* Pretiffy Custom Settings JSON - Thanks for PR [#812](https://github.com/shanalikhan/code-settings-sync/pull/812) by [@knyhle](https://github.com/knyhle) +* Improvement - Remove manual visx package installation in favour of extension download by CLI [#820](https://github.com/shanalikhan/code-settings-sync/issues/820) +* Improvement - Remove replaceCodeSettings from Settings Sync configurations [#805](https://github.com/shanalikhan/code-settings-sync/issues/805) + +#### v3.2.7 - March 06,2019 + +* Bug : Fixing Extensions Sync on Windows [#789](https://github.com/shanalikhan/code-settings-sync/issues/789) - Thanks for PR [#791](https://github.com/shanalikhan/code-settings-sync/pull/791) by [@LuisUrrutia](https://github.com/LuisUrrutia) + +#### v3.2.6 - March 05,2019 + +* Bug : Syncing of extensions not working in portable mode [#756](https://github.com/shanalikhan/code-settings-sync/issues/756) - Thanks for PR [#782](https://github.com/shanalikhan/code-settings-sync/pull/782) by [@LuisUrrutia](https://github.com/LuisUrrutia) +* Bug : Fixing NODE_TLS_REJECT_UNAUTHORIZED [#776](https://github.com/shanalikhan/code-settings-sync/issues/776) - Thanks for PR [#779](https://github.com/shanalikhan/code-settings-sync/pull/779) by [@MattMorgis](https://github.com/MattMorgis) +* Documentation Updated +* Packages Updated + +#### v3.2.5 - Feb 15,2019 + +* Bug : Not working with VSCode 1.31 [#762](https://github.com/shanalikhan/code-settings-sync/issues/762) - Thanks for PR [#763](https://github.com/shanalikhan/code-settings-sync/pull/763) by [@nekonenene](https://github.com/nekonenene) +* Bug : Multi-line settings aren't ignored properly using sync pragma [#701](https://github.com/shanalikhan/code-settings-sync/issues/701) - Thanks for PR [#750](https://github.com/shanalikhan/code-settings-sync/pull/750) by [@ioprotium](https://github.com/ioprotium) +* Packages updated, small improvements + +#### v3.2.3 - 11 Dec, 2018 + +* Startup : Long startup activation time on the first start [#656](https://github.com/shanalikhan/code-settings-sync/issues/656) - Thanks for PR [#717](https://github.com/shanalikhan/code-settings-sync/pull/717) by [@thejewdude](https://github.com/thejewdude) +* Feature : Adding coder.com support [#714](https://github.com/shanalikhan/code-settings-sync/issues/714) - Thanks for PR [#720](https://github.com/shanalikhan/code-settings-sync/pull/720) by [@deansheather](https://github.com/deansheather) + +#### v3.2.2 - 26 Nov, 2018 + +* Sync Advance Setting Menu doesnt open when JSON not Valid [#683](https://github.com/shanalikhan/code-settings-sync/issues/683) + +#### v3.2.1 - 23 Nov, 2018 + +* Bug : Only install missing extensions in Portable Vs Code [#687](https://github.com/shanalikhan/code-settings-sync/issues/687) +* Bug : Error: Cannot read property 'token' of undefined [#685](https://github.com/shanalikhan/code-settings-sync/issues/685) +* Bug : sync-ignore isn't ignoring my local value, it deletes it [#686](https://github.com/shanalikhan/code-settings-sync/issues/686) +* Bug : Download of extension packages failed [#642](https://github.com/shanalikhan/code-settings-sync/issues/642) - Thanks for PR [#705](https://github.com/shanalikhan/code-settings-sync/pull/705) by [@emptyother](https://github.com/emptyother) + + +#### v3.2.0 - 17 Oct, 2018 + +* Prompt to reload VSCode after installing extensions [#629](https://github.com/shanalikhan/code-settings-sync/issues/629) +* Keep output of CLI installation command [#628](https://github.com/shanalikhan/code-settings-sync/issues/628) +* Dont write default settings sync config to code settings.json [#513](https://github.com/shanalikhan/code-settings-sync/issues/513) +* vscodium download settings fails [#650](https://github.com/shanalikhan/code-settings-sync/issues/650) - Thanks for PR [#651](https://github.com/shanalikhan/code-settings-sync/pull/651) by [@stripedpajamas](https://github.com/stripedpajamas) +* Does not work with Portable Visual Studio Code [#331](https://github.com/shanalikhan/code-settings-sync/issues/331) +* Flatpak Support for Settings Sync [#621](https://github.com/shanalikhan/code-settings-sync/issues/621) - Thanks for PR [#657](https://github.com/shanalikhan/code-settings-sync/pull/657) by [@laloch](https://github.com/laloch) +* Per-platform / per-hostname inline settings [#640](https://github.com/shanalikhan/code-settings-sync/issues/640) - Thanks for PR [#667](https://github.com/shanalikhan/code-settings-sync/pull/667) by [@ioprotium](https://github.com/ioprotium) +* Idea/Suggestion: Adds support to sync custom files [#258](https://github.com/shanalikhan/code-settings-sync/issues/258) - Thanks for PR [#258](https://github.com/shanalikhan/code-settings-sync/pull/258) by [@tkrtmy](https://github.com/tkrtmy) + + +For Previous releases change log view the [post](http://shanalikhan.github.io/2016/05/14/Visual-studio-code-sync-settings-release-notes.html) + + +## [Contributions](https://github.com/shanalikhan/code-settings-sync/blob/master/CONTRIBUTING.md) + +### Financial + +[](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=4W3EWHHBSYMM8&lc=IE&item_name=Code%20Settings%20Sync&item_number=visual%20studio%20code%20settings%20sync¤cy_code=USD&bn=PP%2dDonationsBF%3abtn_donate_SM%2egif%3aNonHosted) + +I also welcome financial contributions in case of special feature requests on my [open collective](https://opencollective.com/code-settings-sync). + +### Community + +You may join slack community and disscus the ideas over there. + + +Drawing + + +I'm looking for contributors to work with me so we can make the extension smoother and more feature rich. +Let me know if anyone is willing to [contribute](https://github.com/shanalikhan/code-settings-sync/blob/master/CONTRIBUTING.md). + diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..3d1146d9 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,46 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at shanalikhan@hotmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..5f04c346 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,90 @@ +# Contributing + +## Wiki + +See (and edit!) our public Wiki. + +https://github.com/shanalikhan/code-settings-sync/wiki/Contributing + +I encourage you to create new pages or make helpful edits to all parts of the wiki. Try to ask before making major changes to pages you didn't create, but just do whatever you think is best. Feel free to make a user page and collect your notes there so everyone can learn. + +## Slack + +Join our public Slack: + + +Drawing + + +If you need any help or want someone to set up the workspace with you and get you stepping through code in your editor, make some noise in #contributors. Don't be afraid to speak up! + +If you are looking forward to solve issues, you can select any issue you want but it would be great if you start with these issues, for these issues I will be specifically asking for help : + +https://github.com/shanalikhan/code-settings-sync/labels/good%20first%20issue + +https://github.com/shanalikhan/code-settings-sync/labels/PR-Welcome + + +## Setup Extension Locally + +``` +git clone https://github.com/shanalikhan/code-settings-sync.git +cd code-settings-sync +npm install +code . +``` + +Checkout the lastest version branch available and Hit `F5` to run Settings Sync in debug mode. + +Git and Node should be enough to run this extension. Execute the commands above and you will be able to run the extension in Code. + +**PR Base Branch Guideline:** +PR usually dont merge into `master` branch but in the version name branch like `v3.1.0`. +You will always see the next version branch if which current work is being done by me and other contributors. You need to set base branch and create PR for that branch. + +## Run Tests +Make sure the changes you made are not breaking the tests cases! + +All the test cases are in `/test` directory. Add new test cases if application with your PR. + +To run the tests, +1. `cd path/to/code-settings-sync && npm install && code .` +2. `Launch Extension` by pressing `F5` +3. From Debugger menu, start `Launch Tests` + + +## Bounty Programs - Fix and Earn ! + +There might be several issue present on the [IssueHunt](https://issuehunt.io/repos/47984369) from which you can earn money by fixing those issues. Feel free to start! + + + +## Financial contributions + +You can contribute me financially by two ways: + +1. Sending donation directly to my PayPal + +[](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=4W3EWHHBSYMM8&lc=IE&item_name=Code%20Settings%20Sync&item_number=visual%20studio%20code%20settings%20sync¤cy_code=USD&bn=PP%2dDonationsBF%3abtn_donate_SM%2egif%3aNonHosted) + +2. If you looking forward to add some special features for your company, for this I also welcome financial contributions in full transparency on my [open collective](https://opencollective.com/code-settings-sync). + +[![issuehunt-image](https://github.com/BoostIO/issuehunt-materials/blob/master/issuehunt-badge@1x.png?raw=true)](https://issuehunt.io/repos/47984369) + + +## Credits + +### Contributors + +Thank you to all the people who have already contributed to Settings Sync! + + +### Backers + +Thank you to all our backers! [[Become a backer](https://opencollective.com/code-settings-sync#backer)] + + + +### Sponsors + +Thank you to all our sponsors! (please ask your company to also support this open source project by [becoming a sponsor](https://opencollective.com/code-settings-sync/order/3849#)) diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..3c0206df --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 Shan Khan + +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/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..23f9227a --- /dev/null +++ b/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,25 @@ +#### Short description of what this resolves: + + +#### Changes proposed in this pull request: + +- +- +- + +**Fixes**: # + +#### How Has This Been Tested? + + + + +#### Screenshots (if appropriate): + + +#### Checklist: + + +- [ ] I have read the [contribution](https://github.com/shanalikhan/code-settings-sync/blob/master/CONTRIBUTING.md#setup-extension-locally) guidelines. +- [ ] My change requires a change to the documentation and GitHub Wiki. +- [ ] I have updated the documentation and Wiki accordingly. diff --git a/README.md b/README.md new file mode 100644 index 00000000..e7b6f28d --- /dev/null +++ b/README.md @@ -0,0 +1,316 @@ +# Settings Sync [![Tweet](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/intent/tweet?text=Synchronize%20your%20%40VisualStudio%20%40code%20Settings%20Across%20Multiple%20Machines%20using%20%40github%20GIST%20by%20%40itsShanKhan&url=https://github.com/shanalikhan/code-settings-sync&via=code&hashtags=code,vscode,SettingsSync,developers) [![Follow](https://img.shields.io/twitter/follow/itsShanKhan.svg?style=social&label=Follow)](https://twitter.com/intent/follow?screen_name=itsShanKhan) + +**Previously known as Visual Studio Code Settings Sync** + +[![Version](https://vsmarketplacebadge.apphb.com/version/Shan.code-settings-sync.svg)](https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync) [![Travis](https://img.shields.io/travis/rust-lang/rust.svg)](https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync) +[![Greenkeeper badge](https://badges.greenkeeper.io/shanalikhan/code-settings-sync.svg)](https://greenkeeper.io/) +[![Master course](https://img.shields.io/badge/Supported%20by-VSCode%20Power%20User%20Course%20%E2%86%92-gray.svg?colorA=444444&colorB=4F44D6)](https://t.co/8BEMyhpKU5?amp=1) + +## Support + +While being free and open source, if you find it useful, please consider supporting it by donating via PayPal or Open Collective. If you are using it in office as a team, please ask your company to support us via Open Collective from just 2\$ per month! + + + + + + +
+ + + +
+
+ + + +
+ *2$ Per Month +
+
+ +Drawing + +
+
+ +**Type Sync in command Palette in order to view all commands.** + +## Key Features + +``` +1. Use your GitHub account token and Gist. +2. Easy to Upload and Download on one click. +3. Show a summary page at the end with details about config and extensions effected. +4. Auto download Latest Settings on Startup. +5. Auto upload Settings on file change. +6. Share the Gist with other users and let them download your settings. +7. Supports GitHub Enterprise +8. Support pragmas with @sync keywords: host, os and env are supported. +9. GUI for changing settings / logging in +10. Allows you to Sync any file across your machines. +``` + +## It Syncs + +``` +All extensions and complete User Folder that Contains +1. Settings File +2. Keybinding File +3. Launch File +4. Snippets Folder +5. VSCode Extensions & Extensions Configurations +6. Workspaces Folder +``` + +## Shortcuts + +``` +1. Upload Key : Shift + Alt + U +2. Download Key : Shift + Alt + D + +(on macOS: Shift + Option + U / Shift + Option + D) +``` + +## Configure Settings Sync + + +Settings Sync Configuration page will be opened automatically on code start and requires two things to setup: + +1. GitHub Token +2. GitHub Gist Id + +GitHub Token needs to be retrived by your GitHub account while Settings Sync creates GIST if you are first time user. + +Following are the steps you need to perform to configure. + +- Click on `Login with GitHub` . +- Login GitHub on Browser and close the browser tab once you get Success message. +- If you are using Settings Sync first time GIST will be created automatically when you upload your settings. +- If you already have GitHub Gist, new window will be opened to allow you to select the GitHub Gist or `Skip` to create new Gist. + + + +![Login with GitHub](https://shanalikhan.github.io/img/login-with-github.png) + + +![Existing Gist](https://shanalikhan.github.io/img/existing-gist.png) + + +You can always **verify created gist** by going to `https://gist.github.com` and checking for a gist named `cloudSettings` + + +## Upload Your Settings + +**Press Shift + Alt + U** (macOS: Shift + Option + U) + +> Type ">Sync" In Command Palette into order download / upload + +When downloading or uploading for the first time, the welcome page will automatically open, where you can configure the Settings Sync. + +Once you select upload, after uploading the settings. You will see the Summary details with the list of each files and extensions uploaded. + +## Download your Settings + +**Press Shift + Alt + D** (macOS: Shift + Option + D) + +> Type ">Sync" In Command Palette into order download / upload + +When downloading or uploading for the first time, the welcome page will automatically open, where you can configure the Settings Sync. + +Once you select download, after downloading. Settings Sync will display you Summary containing the list of each files and extension being downloaded. + +New popup will be opened to allow you to restart the code to apply the settings. + +## Reset Extension Settings + +> Select **"> Sync : Reset Extension Settings"** in the Command Palette to reset your settings + + +## Settings + +Settings can be changed through the settings page, which can be accessed through **"> Sync : Advanced Options > Open Settings Page"** + +There are two types of settings in Settings Sync. +I will recommend you to read the configurations details [here](https://dev.to/shanalikhan/visual-studio-code-settings-sync-configurations-mn0). + + +### Gist Settings + +Gist Settings are stored in `settings.json` file of Code. +You can customize the settings in gist settings like: + +``` +1. Configure Gist Id (Environment) +2. Configure auto upload / download for GitHub Gist +3. Configure extension sync behaviour +4. Configure force download +4. Configure force upload +6. Configure quiet sync +``` + +```json + "sync.gist": "0c929b1a6c51015cdc9e0fe2e369ea4c", + "sync.autoDownload": false, + "sync.autoUpload": false, + "sync.forceDownload": false, + "sync.forceUpload": false, + "sync.quietSync": false, + "sync.removeExtensions": true, + "sync.syncExtensions": true +``` + +### Global Settings + +Global settings are present in `syncLocalSettings.json` inside `User` folder. These settings will be shared across multiple Gist Environments. + + +You can customize the sync: + +``` +1. Options by which files / folders and settings to exclude from upload. +2. Configure default Gist Environment name. +3. Replace the code settings after downloading. +4. Change the Gist description while creating new one in github. +5. Configure GitHub Enterprise Url +``` + +```json +{ + "ignoreUploadFiles": [ + "state.*", + "syncLocalSettings.json", + ".DS_Store", + "sync.lock", + "projects.json", + "projects_cache_vscode.json", + "projects_cache_git.json", + "projects_cache_svn.json", + "gpm_projects.json", + "gpm-recentItems.json" + ], + "ignoreUploadFolders": [ + "workspaceStorage" + ], + "ignoreExtensions": [], + "gistDescription": "Visual Studio Code Settings Sync Gist", + "version": 340, + "token": "YOUR_GITHUB_TOKEN", + "downloadPublicGist": false, + "supportedFileExtensions": [ "json", "code-snippets" ], + "openTokenLink": true, + "disableUpdateMessage": false, + "lastUpload": null, + "lastDownload": null, + "githubEnterpriseUrl": null, + "askGistDescription": false, + "customFiles": {}, + "hostName": null, + "universalKeybindings": false, + "autoUploadDelay": 20 +} +``` + +I will recommend you to read the configurations details [here](https://dev.to/shanalikhan/visual-studio-code-settings-sync-configurations-mn0). + + +## Features + +### Toggle Auto-Upload on change + +Auto-upload is **disabled by default**. When the settings are changed and saved this feature will automatically start the upload process and save the settings online. + +Please make sure you have valid github Token and Gist available to make it work properly. + +Select Command **"Sync : Advanced Options > Toggle Auto-Upload on Settings Change"** command to Turn ON / OFF the auto-upload. + +### Toggle Auto Download + +Auto Download is **disabled by default**. It will sync all the setting by default when the editor starts. +Please make sure you have valid github Token and Gist available to make it work properly. + +Select Command **"Sync : Advanced Options > Toggle Auto-Download On Startup"** command to Turn ON / OFF the auto download. + +### Toggle Force Download + +Force Download is **disabled by default**. By default, extension won't download the latest settings if you already have the latest downloaded version, but sometimes when you delete some extension locally and don't upload the settings it will still show that you have latest versions by date or time checks, by turning this ON it will always download the cloud settings on startup. + +Please make sure you have valid github Token and Gist available to make it work properly. + +Select Command **"Sync : Advanced Options > Toggle Force Download"** command to Turn ON / OFF the force download. + +### Toggle Force Upload + +Force Upload is **disabled by default**. By default, extension won't upload the settings if the gist has newer or identical content. By turning this ON it will always upload without checking for newer settings in the gist. + +Please make sure you have valid github Token and Gist available to make it work properly. + +Select Command **"Sync : Advanced Options > Toggle Force Upload"** command to Turn ON / OFF the force upload. + +### Toggle Summary + +Summary is **enabled by default** which shows all files and extensions that are added or deleted on a single page. +You may turn it off in order to make a upload and download process clean and quiet. + +Select Command **"Sync : Advanced Options > Show Summary Page On Upload / Download"** command to Turn ON / OFF the auto download. + + +### Custom Sync + +Settings Sync allows you to sync the files other from `User` folder. For example, your workspace settings and much more. Its upon you to utilize the full potential of Settings Sync across your machines or your teams machines. Read about custom sync [here](https://github.com/shanalikhan/code-settings-sync/wiki/Custom-Sync). + +### Sync Pragmas + +You can even manage which settings you want to ignore from being upload or download. Settings Sync even allows you to manage your `home` and `office` computer specific settings even OS related settings in single GitHub Gist. Read details about [Sync Pragmas here](https://github.com/shanalikhan/code-settings-sync/wiki/Sync-Pragmas). + +### Share Settings Across Teams & Users + +If you are looking to share your settings. Read the details [here](https://dev.to/shanalikhan/how-to-share-your-visual-studio-code-settings-and-extensions-39k). Settings Sync needs to create new Public GitHub Gist to share your settings with other users. + +### Troubleshooting + +If you ever get into problem while setting up the Settings Sync. You can check our troubleshooting guide that cover those scenarios [here](https://github.com/shanalikhan/code-settings-sync/wiki/Troubleshooting), you can also add your solution there if its not available there to help other users. + +## How To Contribute + +You can contribute in different ways. Read the details [here](https://github.com/shanalikhan/code-settings-sync/blob/master/CONTRIBUTING.md) + +**Fix and Earn** - You can also earn money by fixing the issues - Check the issues under bounty program [here](https://github.com/shanalikhan/code-settings-sync/labels/bounty). + +## Credits + +### Contributors + +Thank you to all the people who have already contributed to Settings Sync! + + +### Backers + +Thank you to all our backers! [[Become a backer](https://opencollective.com/code-settings-sync#backer)] + + +[](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=4W3EWHHBSYMM8&lc=IE&item_name=Code%20Settings%20Sync&item_number=visual%20studio%20code%20settings%20sync¤cy_code=USD&bn=PP%2dDonationsBF%3abtn_donate_SM%2egif%3aNonHosted) + +### Sponsors + +Thank you to all our sponsors! (please ask your company to also support this open source project by [becoming a sponsor](https://opencollective.com/code-settings-sync)) + +## [Contributors](https://github.com/shanalikhan/code-settings-sync/graphs/contributors) + +# [Release Notes](https://shanalikhan.github.io/2016/05/14/Visual-studio-code-sync-settings-release-notes.html) + +# License + +[![Version](https://img.shields.io/badge/license-MIT-green.svg)](https://github.com/shanalikhan/code-settings-sync/blob/master/LICENSE) + +[![Version](https://vsmarketplacebadge.apphb.com/version/Shan.code-settings-sync.svg)](https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync) + +[![Installs](https://vsmarketplacebadge.apphb.com/installs/Shan.code-settings-sync.svg)](https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync) + +[![Ratings](https://vsmarketplacebadge.apphb.com/rating/Shan.code-settings-sync.svg)](https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync) + +[![Master course](https://img.shields.io/badge/Supported%20by-VSCode%20Power%20User%20Course%20%E2%86%92-gray.svg?colorA=444444&colorB=4F44D6)](https://t.co/8BEMyhpKU5?amp=1) + + +Drawing + diff --git a/code-settings-sync.code-workspace b/code-settings-sync.code-workspace new file mode 100644 index 00000000..876a1499 --- /dev/null +++ b/code-settings-sync.code-workspace @@ -0,0 +1,8 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": {} +} \ No newline at end of file diff --git a/configs/webpack.config.js b/configs/webpack.config.js new file mode 100644 index 00000000..49212e9c --- /dev/null +++ b/configs/webpack.config.js @@ -0,0 +1,45 @@ +"use strict"; + +const path = require("path"); +const { CleanWebpackPlugin } = require("clean-webpack-plugin"); + +/** @type WebpackOptions */ +const config = { + stats: { + warningsFilter: /Critical dependency: the request of a dependency is an expression/ + }, + target: "node", + entry: "./src/extension.ts", + output: { + filename: "extension.js", + path: path.resolve(__dirname, "../out"), + libraryTarget: "commonjs2", + devtoolModuleFilenameTemplate: "file:///[absolute-resource-path]" + }, + resolve: { + extensions: [".ts", ".js"], + alias: { + deepmerge$: path.resolve( + __dirname, + "../node_modules/deepmerge/dist/umd.js" + ) + } + }, + module: { + rules: [ + { + test: /\.ts$/, + exclude: /node_modules/, + loader: "ts-loader" + } + ] + }, + externals: { + vscode: "commonjs vscode", + "vscode-fsevents": "commonjs vscode-fsevents", + "original-fs": "commonjs original-fs" + }, + plugins: [new CleanWebpackPlugin()] +}; + +module.exports = config; diff --git a/configs/webpack.development.config.js b/configs/webpack.development.config.js new file mode 100644 index 00000000..9397bffd --- /dev/null +++ b/configs/webpack.development.config.js @@ -0,0 +1,9 @@ +"use strict"; + +const { merge } = require("webpack-merge"); +const common = require("./webpack.config.js"); + +module.exports = merge(common, { + mode: "development", + devtool: "source-map", +}); diff --git a/configs/webpack.production.config.js b/configs/webpack.production.config.js new file mode 100644 index 00000000..bf2cbb86 --- /dev/null +++ b/configs/webpack.production.config.js @@ -0,0 +1,11 @@ +"use strict"; + +const merge = require('webpack-merge'); +const common = require('./webpack.config.js'); + +module.exports = merge(common, { + mode: 'production', + optimization: { + minimize: true + } +}); \ No newline at end of file diff --git a/images/existing-gist.png b/images/existing-gist.png new file mode 100644 index 0000000000000000000000000000000000000000..86f61d319d7ae726a0c7b0546dc106f517d0f563 GIT binary patch literal 87215 zcmd?R_dnMCA3m&I5)CUVWrvVivO-9*g|f3kl)Y85l4K>>B%8>Hj7oM^R>%rj$(HRt z&aTh*asP7v0r&m5-;c-Vx?Dca^L)Qwuje?P$8o$)eHmI=KXzJp*Z+Qw zAsRaVzaPhU|KD%T^8fO;7N;XDiS8v!f!>cFKYsc0<>SW(RfY!C%;dzkaNWGw)6*kG z-zrXZnDB7=`h>?BXW^r1{QTK)yd~k;vuAcClL0|e^k=!aJU3SEU%wux#x^~6^xry@ za6AbJXb_LsK{PwbD<~MpcPFH{xcJr7LGRDBf>vQKUeu4yi=O+pKM(#8R=A~zmArm- zsM448q+EiMOUYeT)wb?;roFwr>xugRR=32bdemlL2?@~y4ayjWI1$&vl$4acxyOAB zPLQ&&vZm(cg*1;@lv)1w$9u7v;(7@xX>=Yd23%Y`R>&VbJBhhw}nVGq|x*9L2Gg4tC z#|tO}E(r8Y>G8GtSl|RHaByz zvObq(+}hf@>A5JG)cQs~a{ljtCz%tc3WTO2S!~2qwl>t;-^$iWU zpY?Z6TvTk~LQb=T**UzC@^o}@>wjnddIl3clS>x5bm>EJv6iOh;p;vLN~||;-O9+w zU}s}vV`tyDvACP)LBvVIeYKB{k6$qPO3fK@Em_6CGgy`ptNrWOFZXtbu$M1iMn-m1 zx!&-NjqQJHPNKXvYZ_|SlSc6guoHOeOvvwU~O&Pt}XrOlfI^==JT8+ zCDz9hXX2WzEi6LilI?{05aPA9ew9OZw?f{&eLL11MGARBa>*<4{KVc8DQ!zjOLr|Tarc&Y@A^A@ zHhCu^A`&O+-qY}TF|4d?^X2*5vWEUv{#8HM)?Cg}UcF81ZP=NqRj+l6n3z~aMTM`o zH&r<)Y~S(1f`XV!jtZNNt8V4moEocDlkFEOyY_|49U>zu%FCN@>7#Rt>E@xshM~R8OcP>4#w6gNp+9>w+u0rbhm*}pqt}fX+ z;m`OSet+-(VnXdRIyN>{`}Tx|g~eUt_SdauBGZ%I{!;XH4Gjy+%YPP2$W8I^$Ix@|CN5{ zLn3=EHCFP1f&wZo-NpHN8bK@VuBOK?UcB(}@!5>DW?*D|-K!fjGGgQG;Za^#-*)Zh z*VKve@mhUum*UX;e7<1Wk%LI zq8b|+iEm*S6f7z%boli(GUg~FQj?uM!{cD{du`6E!wK4)IayhEt*lT+S-a-ic289YI#Fd)%Ne7zHD!UT+PD5LehU%YWF!jw)M3%flHSz9mJ+uGWqxUjIW+`fIAq|)5NBBA>j5s}L-)Zqu_ z*qE~8k3wF)^s6yBbLLE?FPX+W&(laQ9wR?Q|LVe+w}gR=OpVy~2CvOXE$(W5-lkn4 z`F-{+yAqKeRcRc@}h)Qm}dioeTPXBXizH8Mg4a&~eOS3x@)XCg#Gy0?#yx$q#Hm>6Ai|9SKF)WN~Q z*u5+_Zrrf__4T6tq#B+FwNYC;+JtEW=_(SQGd4En*t<`WK6nH_jg48Hh>CpqlA4y* z_QHw1US~qXN zca2}aezz0|t&_R%m`US6Jrgk;=KD6}rDVf3iK6bI$P>c)!~ zlv$2Dn1tF}4Sr1jLN6ng5 zzLbB1;FM+D`4G2`kGuBx=Ow2qFBA>v$<&7a18D>t(bGF?5XZ z05n!Ez4FW^1!je4v%7b*Y+Ah!QiXX+A?kw}WE^ge4R~%>$z&j9@f>7iWQ2Q`48B+JXod;gxgWN9Z+*ku%8rNGqe&U2*=ap-)g z@-A&@%`GkWP}@zLqFcMV{>~CEZa%&*yGW3d{r$06|IpC3mX?<0phQy~o_r@jjL?q4 ztgLf1+jmS%1Y8!)_+F?pp@*59(@;|Wnwp9V3zOob+JA&I0$ZQjR4kp+HvOA$J@WFp zCMOpb#{np6OF-RfZ5#$AYHW=S4U(RUQ36?iwYt!oH&z$a|M zX;I30z3V(b|4CjGlB*pK`nlbfwzdnvT!I5`$H+Qrm080+dF`V;ew>Mk$)5HIvRgj- zg7R<;Wgia@4~>|I@YR6hM+Bm#r>1(_+uIvvpQax2turbqDWRmKG%p=1EiD}!)DI7c zj*0QVdE~x=f`U}VvsVl1-@CgV|!Nng^Ac=aa=DM811eNr700|EjHRrpa;CoL^~ zzW4U}`uLE|hIM9AtKyvra9m;Omq9HF54Jv(( zjMgg4T)wGELYQ7FOEMp=BB<~{S@tEGV=sA^#z*| z*+$O&+yR3BD>4+aKJw3>*BPx0Ci?mLc{Hh`e*>3fFS${KhlfiA01>`Xi0O$kXK(87 z7d?GCUeJ|V!187NC;c1>Pft%pMa4z|MzS&qNy*mCZXIMC1tp~@unfYq_lQ4FWG3Pg zO<7fYXl%^)XqyGIm{`T%L&brCfh!l96~^scoSd9wW&KR1hY;GCnewCbD8hiMd0DZs zvB}BF^;hr@^Cr*hDQ!T?{H&$r!l=`m3y>oNAz*~ za#AZ0>&o0P|MwftB>pBlbh(t%+G}fTzkk;}M_Rze$$5&$XutBVu-x3a#|Mr9F7xv6 zOioSlyB-t~Da)=Sxrg;LTO{={Kznp>aA1piYsS|z-kQ`LCzhjiT-O$}R&Vbm1_sGd zm220oB~Hu;8Lx9l`87IvL`3Mmg9Gz%;j7=?<$BV@ z0CEGLNF3dVT=VhvzEkRHCbWylZYQwrpyyl7%&Vcy7cX71=$vE8K=52sS3yWJ?T9M)5!2E4(MYDhZYIHxuoM!|; z>b|CSkzMlU%~!s@zV#=bA~l+tnqq{CMch`n+1U?niWt=%4!XqTw3{Zb8j47tl4J27qeA+?SW|wW`XS@zO!% zW@*v5oKM9*?U>WT!uSLPo=DN}^)fIv9vvQ*Y!|B6=eD%8^t-vuO|tO!FUy^X;e}Oi zZ*SI*Cfw8r2b2@E*KsNhR&qj76e1w$2iV8i*?W3=dWQ4NJjN#PlrBtTCD#IfM(OBrg;PAYS4L5%&9+R&xvjg1R+=RSM z>nBvc80OXs0(?v|j?avbf4o$2WJypm=5I-#x?V<3j-s5L%AfSEA3wBpb^lCHqj99$ z9OH~=(C1dGrjU#$Wczdq=oBqJPkHaan(VYoMbi$j!|yD5&9F zAFnSx+Rt}QJyD5OMOF0@zW@Lo6*;+ltZ-ziXPUS79%ZLDDJe1`b;m~cOfMcx3`v?e zcHx9VoI>jkBB$e@zVj04I`Yxn?Jsqv`C?*IyfHUivybdlsneWcN_u$pangL_`H{Mt zKWM!ruHsQ`>vfP+XI0;n&Q;T5A0{(rhK3UIl5?}N0*yLzLPCy)Q@Hc;^4?|I>Fj*K z`}5<+yTdC}W5qlb+D9Z3l>CmyrEZ+1Al}n@=JKMDvivn3%cpKnywP7Us06xpq^qG* zhJ++4(73mUP*PBg{`r&Lw07mn6{)PdQb$OYEmDABGF#8`@~RrkC(!~NJd8)L2B}zrT2P1+?d$FR(97>nGYZUAmr=@Q z+o{Y-ewXR1o3pX0X()*(;~o1mPb}5TIfG^WKC}5tCFWiBPYr+iI-f!M={9LEO zc%`#&?5n$mCrC{(?Ey6YSx$H=MSsS8oPoI6Pd6tsvprrcMTymI`SGw3?S`uBR=pYnEctipLMLcVlKE?w z0h;6e`wNRkI*N+ch)7gu_amfB(sWn+ZHk2%7?SXRGBQdv))fF-bXzVrMhU9l$ZU0D z38xjhcrm!h>j={$4ck|5G$=rNSX;AbJv2JoYS4xeub@)_^uyw!nnMB~AD>z=dt&|) zwNLnq7i+7lN6wAf6emds((o9`8WgsMky!8lGFjrQFhnVKa}$2jn32SjebP)<*hDJ^ZV|{Z&gX;0vi$X%8 zPP5|0v@FU_*q_&0){3Ki7ulBV3W-7nt_7s|gFB$@a~V8DG_FW^lh!q~kTYj?7;nGJ z&yT)n`^Ku;r1q9|8O7nlEsoASsDf4~H%pW1_NPWLIcG#)$l!V+lTy*y+_#o!e07vt zjHD8=`yqCxi;IiYv_4~9H`CFpHa0xU=GTpZ!ke0`P#;y_$hXFu=IuqU-nh|OY&&*J z#HD@OkBcS{%|ZI8Xn0sy>hGl*lXu}Y1~kWyA6d$1=P+eh_B8cZN=s3ut6S}rY4*XL z@A|h7!LJ!q(^6CSAL2lp4rRXnZI0w2-p3ks4%oWp>G3wlG&z8iW5Io>o>C!zf(IO#ot? zoC=%WLr6jvg=jErep?eaIl|>Y+4?-Y>li!eI?5Y4Nlo0g7cDIe8KYy(B^`Ad~9>4Tmk||Pt86^N&2?QMc^)KMN^tZn}f`VN& zH7QdMI5C8l>* zuluhNM>M$q?Q>jr5h$FWpJ&&|er}gNB{U-4_+wPu-94-q#ZG{U>B?}7nA?g{qa`JB zpO<$5H!?9XVgBnG26xf}2U;`rUx5cHvL5gNjnqmk#ans?P?GIdRHQs}{rlUNmYFt% zWNB(WcRKBtmaddaeS30YFf;%YmTrs7-j7omGE3p08B0Grt2a;+Qb55$xPcO#X-nw= z1%daCjjHqEasQAQW|P%>cMG!HY{iQS9f#dDPYCm zV7yHRCW@FzK3NrNQeR0s2hepF%|vz$E_EdJ?23I7_({L?HNzVa73&7|zi{t~$LmTw ztfj8sB_~eK>0NuU7lad9M7!kzxxW-Lp71nxEPYg2$w6v#W$S!!n7&!$-xI#iYKb-^ z+h-((7dNeTYJ;^Kt4Ze2RRlo#L(6ObZq2Y*u4ow-6mG*nd*S;(6ZP0VOir)f$jm^zu#Ke<}iNV3am`mzA zB|u^5=wvY*8(?6(DhKYE|BvqhBBw?$3m>Q00j(MuGE#1pwTt}G*4F;>qc~}6O+Y|^ zgEAvOKVL?N{)2;|R7s~Xs*A1dyL#dxK>4np*qaWoKilW=EyBa^-hDJUqn3#k*=mu+waD zJ1~h&_Ovn`-rv*Pi)QzM)5gwD{@S&+wCtDA2CA-Yke?uGxdz^X@m-C>BaJN-wCxeU zse>ZZ_l+zqg;9*P-kI##yZ7iGofr(tM>@3Bmw(Z}Qfo#be6G%K&72+`UFy7L?d|J(>Egw-V!_0* zOOs!mfXqhacd@Z7-C!lBQFQD~!DgtHHyQExk{tgw{Y#BaeUl@G=t0+R&|#(JBQ~qa z*CN_8Y1sA&Y(_s64`3yKvbR8!)OUDhMhw)TpWl8lF)_}Fj69WWC04X!aL8FUEIg6& z#)T!HKT9O;tpj($|L!d}H3=9L{P}!`-_gd%SFc_n1s0_H{ydRLFl%AVSXWaZn*R0c zP5A8BFJFx6!_H#MCtt5Kydskv)ovE?{#APFlEd#0Gvx%{49r#H!#5{L$1tKZ)@!LK zDlZZe=s zjjaQm6rh{2Aj@lTuExXan5!V(AT7GC{6`&du(H-d4G^mL22*qVxE7#vcQ^joW|nW| zs&eFzNs>z1a7~cs+TtC1`vO_UpZ6}H141K0&jz&zs%~!v5YYfo!gzp9 z_7SBqKR^GubLS@c`X^1=AT=5r8%u4{o+nvYSg^IT<6vVmx3mN=X(tp@Wq2G<4Dm@z zt1M*tE75~~ko6C``oOwfJfWbeN$q@zC{P+TN+AIBD|49^EjOV;tC!MXO>Nq+lXXPB$DTt#ob z_l~(a#wxa{2y7A*Qvmw5sm8Ot-@=B7p!WNiDC@tZZ30&<8*J;P1VXCAv;t*orf%ve{2kWGzR!)tL8 z3E1p2#iy{-$lhhsU?L)}OJ<7ui1hE=xf8*uGbzwUBT5cAYLe+Xo2It5@aY+#YTgh7 z4~c}?KYiz7c9Q)cFTjV9Mi;P~_4W0LU5GL0(zUg+URL(lx}M21%n=Rth1EZ(FcWmp zrFK)qC_vna61aP_D>Zz7p!Bd!F#rGvK;TzUnT)vzxu|CwC(L36m%6w(IDR{DSSTw8 zbDA>NH#KFar5zuKRYCV8VX)>Vsf0pAcH)9~zZWYv_u;@mtU1>mF8)B%_{l(2#l=Ot zd3!tqp|<{de3J$pMarLv?|EowQkKqyXtDMwI=X>|P7RH<^-DguJ z8IM-g)Px%K&dAXR+pV`qb-lSXHQ5w%spKLbDbXy?qozQj2is>N8o)uzr?dg~{-+WI zR3)}em_7E_=A`nMl4m}4=pNhIvvsw#PQ^mgm?{n@YfUj=kcB$lS8XDTwMHwUwJuHA zGP0v_T3bwmh*@0hJmaXYp%D=p%4^mV-#;^%d^)tw#?}_e;Tri_6q;IMVq#gD4tsJ) z!zhFw)kym{ar}aU1Lf{fMr_>lfbDEGy7cz;_B6lW#o620X_vX!|9F3&@mw?!Q9Lt2 zKH2tFW6MfSRbrXzfg*|S2fA!ML9L7>v<|bGONsjZ`{%trf!rQ%{Z9M3uy7gqDl&Nl zRD#=RJq1_{$kB;UouwX2BnX{@-U&qgka0{mNZ4)Vxpb1Vi_5ZyM#cXnf$fcx_Cq=2wC#!j(>j4EiV_odpC85{&KD+s`BRIglc2S zX|%)6j*cTIp9@8izYc}OXVI0tXZLQ9M`@uCk6k`5rhG~baP0s=r}BZwXlQ77|Nh(; z|6>@k#HoCr$}+C4&s3-@Tx$bJs6hy|e6Ay0!LneA zV@2I3fBiDSAZB22S=WMU|85i@F5OaAc6QZwHXP){!#{ui=2vTqVefVjgn>E}~f05woeZQO&3KOB0{=gLY<3FaT0niMVyTR_BcU(3g4mz9-) zSSxDYxqIhjPzhJBUIiqfG&Rpg*runW#$uMl-Qu=KrXL&TzArB?Pfbk)K#0&`Z>XuH%*g1A$-4SE9`+b7u|wh|(#~yYAvP ztOrXUKHTB;DZUMNuERl@RGCv;90{Fo>Ni?+X8o6!K*UI+w)$I(Vl;sSDbB?|srnx9 zIPhO@FWfZxnKVQX_7n8BtWQZiC(2U=J1+3EG%@!O3z6;!3_Nl18z{220Nm!>+?@H1 z956jOHnF2<9~Gs_84l+ozdH6i%ZxG}0*U#Y{0Ko^NBtnmY8@TvB3dL5l(uzn_yd{M z^>4fNTJ68Nc1LtkQBnQ(OcYTtLNl)hp!f-1HgtzWMtl!J%QDzSbFZU8q``>COh}UC z&>^h9Iwu<|>x1tk1d|ImM1%Vomtfy0<#Ne^1p4);(`2upTJbuM{~3%@8ZQ z1e*wv{zrn?MMRVu&l5v}`t0baVM_)d3R~qnL{C5YZwk;d$jTIjnEFv0^=u`GXIXZl z5VdU{63jG24~X4F^%9iqru76ZzjN>P3XY1p#`ir$AqBgzwz85c-^+T`9}S>DPrHxu z=utycQs9LMqyET%66WRjRx_v~hxYGJ z&CW&}1E{bmj+Rb3PfdbH#>hKgH;20fFr|yo8H3aXZ6MKkS?H>wqHnG7SBf z4o!aZMj}qc2CD`VH2xY)X1fkx*1#nJ)*p2O(2MbQa_w32C%7S?0g%Xjd1Z2dGvL-w zL4a!6vxDftj=ldZXX0;=#p&tw&CShyeKCzD85M;5aCUaay8z`4P|Q#$sjDxIw=%r6 z#z%0IfJJ&wVn=YRJ&5pv;89S(UvKm2Up~etfNO@#%oZ-k81gTZkoW`-2H@F4&YbLf zHa6%VyaECyxthoU48K)Bp>~2J4G9UsqCDh04Pl*_&>8++;w<9k|D0p^um4~8>Ha_9 z0(`IqW5M1MaILsXNC_6X0Z@Onb)hVwAUls9?aaC**i!Y+`q-i)L=%fSitfU_)1soH zXU+`O1~aIpC``8%EzHgi&N&I6YX0)&wc^13$P4!kB_uwlt7ohYmE|*?K0Wv?`5H8w zT{_QC-G0|S))W)PV_YvzC1nfE31L4{8@x;B@O5~?+}5XyP@J|mXFMH$e-Dm}3*rLF zi$8%pPV?KLDf*)4<`Nb3cHOH5Zv^A6-72)|TkEy1xbt@C&Gjh0-siPnBYB;LPx)3V z7v~F7y=WF)|NW!bcBMjWW44n0_y#I(MQMts7&X-1pqh7ug{Q_Jnf)9s%PoIRdQ#}i z@Ej$lwru`RuTLw}MFX6A<-bQpUWcC~y)f_k>6%@)Tb}}@4oS1<%AgnSH9r0{sc)q| zH@KqC9K8y&*2IUL5uGb5D{$I)dTu}Dtlbtb+CG1~nzh0S

g&WVR;OE^%hy@kahwL7b;hssCo)6vys;aD^to8IUC zXe*`aV1u6LW^(xE__O{2iwDnKovkx-CO>t5`<7=|MGV62lH(r|JFT@!!umQZQZ|lj zPesPYo|@cSIXnj?N{x+xK*HHIehv?#O$R=GYBf;aI6PM!L>JU4=Ca5dRI@(cz;&J^ zir<1VsHXRW<4mdZ0;f(1IUQYv{nQPVbGI>6tO2)$>tICO+%^El0gx`0t@|BeP>2z- zpX$s)kAxH-PX)xStaA@EUssOa!2A0QE`8nItG;v|;Jc*}(6J(}&_ZW7EqeSI_-QHLr^D%(& zWE0yoo74L3n+@&|$=2V0YC5uJ7*5l~ER&{aXTS{z6G<{b%uGz1b2W5O{_B|{`R;rJ zR~HIxzk#bF-h?TiZlvsQ|N2;*C(`>Fo!GPOus-lJ8+ZYHHK2O)@UVz6w^l4V<++=S zRaAP~6&{}Xb*w~9z-^6aO3_}e8>I6M%fG@dHqdZLEL#syHNU^K=OG)7-kb!JbbgQ}Hv ztLP6P=ch+|U;xBh{di{@1hXgd;7+g z{|4>{H(Jfjaq;3R9GuiXF~ZIvui5w1?VB)~_?8UrPt}771Z8`gDil(nDmp={=y`h1 zh!6LNtEakhSQr^MR)&M>gRXoK3Ax&IcIgnU!0!k>kE`6W5<#<*um1w^cInot>dB6+(LUw>@6%Uf3GbOsQv-xu^5FJiKJGCnSS@x zdE-(px>fc2RZl3+pFgjWqg&>&x%PyDJ+*z?v!<)9ZT)8e7pHFN%djxJjg>h#PS`4r z1XQj4e%FlJ>9+8z5s#ea8LqVLb{`S8+-nU1?+EhJdO#FJjhk|jsj-vOg_4RBLUy&l zE92*CuYIuW&Knsq+Mq!q_rvE1Bb|nZ#;G7d=Xs;{d>;2TJGW5mQ_O|?^w?iG3V>`T zsa}ptw@j?mxH#sjY&%HWT=~px2^Ukv)|v&<7O{l#FS#Kl-S?a7+)ca5_Oqi6Gk7Tm zk=W>HH+VP|YP?|YK!_9EUwPk>O&$VsejJ{=k*&Sjp`nMVy{4+_+|7I#5nT{KSZUMd zSoKq-hw12=hv#MkhLD<0!m;(Ohu)bqex{Yp(fQz0V%BPwziS_9JgK%>E7Te%;eM2W zZG;xm1#y2??^8)$K|x>PT{sH0ai4$sK7@PzP{>9KqM#sks`0TkH90u&@JZiozK(^k z0Z2}H`KP(L=gV!Z6*Ql&=*GKsOI6GuIrviV=$mi98YvPE*<2hqd1$Y3u)|%5Di$N- zuaOab>Oz;L$u!jzn+wq>hv;9pkYBT_8&JRXseQ7aLTPSjI9U0X5GtqaeEz$|=-goK)eKqNMcZU0ECTtil1K!uzFKhE6jfxq3RanJ*j zSfnv+V?2ja#phd@&^CdBdC6{EDW&WR=u0UnP)%@KVetSf(>H42#98&c%6OEd5_a_4 zw;67hU^d_07!yNdQAulWYg+*K$uLPVF*&&gR|yp*C5U{2DuY1L_(N7^()bDx9E2j` ztQDrZnf@}?(0=sK@|B+l7p2*6WParSjiLk*6ucldGT_-W&_Bwn4xlTiaw^K5=6)95 z?WHEEesS*BY{2`9ifzCOUAPsE8(#DlSts@V1Ua4SwmOdw#2znWlDt)Dd1lQdtaV~h z#C4gPhQ_KVe}cn)mtLhqKgxbQu`M?kzeCH*6Ny@XYj0qb_Sa_@I??M`ppPjz0^MLsMXlB_La~O zw^clo)7Hi++-jzktT!f%)i?!P&$tWO?u+OVQT94$Ojl-K|FcwBTEzzc|0P^ESAy^tL8gwA*dzw zj2qKGig~%Y?=`;SpS1o1=G=a=9qDmG*r{b;V7pCGOnprCHZ@{XIzK@Ovv|eka_^Tf zQX5XpLc-+4R{*oXnZg=t@r?RB{n@iu*}{Li-pV&?1-w{7Fz`lx?fc*uy10XRyA->F z-rtE$ym|8`Jw1J`*v>lsAw0Vc!n307L#ECL zfzzk;mnI2b%t`Vkz#)&7*`Yk+hAm_}cK$E!uZHSwcb@U$cq<`;(0#YCmsqjU3oO7< z(D!AYo#=jlKM5aJ;VGuObf#D?)wBHGg=nlN_*D0WMnUu@Ok`qPD-0eR`marsgMymz zgm6E#Y%&Q6y&7>ma~3BGEF~p(m52nM5)tC#vjZf63pX*59wRf#3kE!dKB|}5CiKs0 zp!MYBES(R9@$rM8v^2J=Wr;Jl0^xm5}m`y4?w;{x8adZMUz1OxMc)m`l?kE>jqxHOBbV)pVMYMiv!Suzu26g)V8bNt%nF(E-i>OwSi#1a_rY`u!D z0IqUbIXObT0V&`54b|}(4Zk_|m)hqLooKW~LVHJtG2B#95FQ{C{TdsCVd)GHj}4w} zdIjDq0R$;39^CMO$XM{vXi7)Y|f+z9`|ssZ}z6aBnPWhJ+( z>pCLE>y!Ql&@psNYM;R4yv!FayvIENS%F+cy2k*#q9&-3$`g~4n(#ydi$g7il^0(6 z`g-DXz=hEmU=Z{zvTIPjf%@QA{ex))do+H;8nz=XEr=j)qH)b*IOGFuQcX>2{@UHX z5(@iPa$;}vU9gevSFaxMF#yQR%Ffm;Fo$jfR{&i872BI!0 zYa4CO?7TH+(@vN(>`hJ=OjrSh-19b;&;>ZFCa`5I8yY_JW?8i?mN zO04Fj(cpf!@mr+|D;&*2YNs!xohJeFqgtFGguaY=7a0+e@+0!`$n1NMO&2>mJ6Tx- zHI$A3%slf9yd;&Fu)RpTpj^gWv^7DpOU0P`iE;%>M`6C})H_Mgp<>SSjI6BVz&p^6;E<`Wt2=(t#s~*P!0y62 z{-5f2b-O(^W4v>{xVk-L5wjv`4Z~t9k2K;N|sNoqk=Nf)8prJ0fy1Vo$>Ky__3Hh}XRW~Q4T9L~9< zZ^B56R|52H%~Whx%aZL{YKAhOhei<{eS$CKbz0g)kl5BeN5|%-rs}RULhOW@3&Jp9 zchY)*`03Nm{g+j42Fos@pdg@lIXElmsJvX+cTcQHO*JdO^g20b+@jRkOmQ%*$(6N!jw^mgdcyC3X`k{!%tS zzZ{^Yje@ESV%S$9g>ahe`}Ygj2bfx$USP{5B(L2-re*?CS*Qju*r1qJv{&hznU z7g?Pw(SYM@s6!)@iiM-I()AMp5Mb2oM$S~a%=(!UE&aX@2|eNx>R41A0`9wVrSau? zoYOdu)+{XSwz;-6{s-=^yAQ?n&CP|(T23#fu7G%|r-|18U;sRJC-}1)GH`MX}Atv08@I;DjF;e8;?vI{w7q z`$Ss`svVvpv$P0`r`-%rtl8ebuk5k6lOj;Mx73-}x6*lK_KfcR<3e_!AU4|4~0Un(cmn&%O471M?Y}_)6Kcy1LU{#|aBz{IfQVVip(l}Fb4>1LVG4$=W#8}R8XSrFr1%`$9VzdVJwff0Pzf-#d-D+vTa7E9@9BUg6K;E)5&eNr zpZ+`GN<)_nxCk6xKiZACw10*V#~Qh~$UMv2zJ2>VJlEnn#0s$k7KGSW0WJg!@ zdHi^ANDE?7*LM!^IP~;}Xs2*YPf}4-gc(p*56=Oo!Y|fpJ%?ffMeM*aX3W@_QTQB) zvW}CJ<0##%AQ*tnz7WMi5Q=#g zn~;<($hb+X{Q3zz0ys1^^w%5NH){U0`d?B%G~qvVx5L3DpDv{Nita)8v*U(NJ_aw9 zST`^?ZLLjld3tVxFhXDuFjH1hKh|mI!_#Q5$Z%MI$K{pE`Ru$MX)aGUV1G8F(2v{} zZusc=$bNH3lB6tnZLsZ{z{ksr6E7<}9v;nSjQl@d0Lk#%^NfR7^x37Q(S_A|$qOy5 zCO8E6V>55F@;EZ2aryL5v1XG&u-73-gY#_30EM?ju@=~;e!56 zN=)oWSx20EZmo`ClI(CtJB+}q8cya zr;D>6xj8sF|A=j`l7-8iME{hK*jabKX>6e*h~mCksFfs-J%)IgaYmoZM^^i;;kjRM z=~-D=TmrC0AmGX=UqkOb3-3I9knU&xd3N5mr2sgMlSkT79653(TyEFSowF=IMb5F6 z{JmeSO&*(dvw(Oh94|Yve|LRa5!@xHpkWNQqby2{z7N;N4u;nKD6)=|WyI-l{VP|z zlaogQVd^S&L<2dl`R-V~9PqE))&$ZzZm!vH9N5|F!A+uCe(AOx1(D6R;tx)c6E^0~O+?F~*dX#eKsJ)NCC zG;JNz1wDmb%5l@JZshBEh8jjNr}0#X)I-DFIw0 z#53ujdl+HV*mMdlBW>o^IK}Q16$AplC31?xdwUaHv5&#zYwqmK%pZBi2fZccmX>r7 z*63yMS6=BKmOY8mQg5#mlDzZbAkZT)&+QbI;NRNs6nhwMZrq0ujsZDkimU&@51E0A z`41M$ms`@V^W8D%(*FoY`sR%9c(lp@>KbwYeemhl^kOHx?(e#LYsKuXaV$AUGuIFt zCQLMIgI;8_DQ`!7v4Mi3Py{dnkem|MbRKck0Gu0l_6&+QkGpY-jh~MXjyA9si;HFK zjigJc?8qzlW#J3sx9G$X7Z6WRY53W=xo7dE12R+aGhrqYK@x6)6=w8hGWY#~A)>$Vfx*lA85t&i>)mCg znrW+?j2et-YHWx1w^yXc-wp555dF$cg7%3n3-0E*msce|o{-s0*IpRmR9ostk#Ak^ zvf}GwZFXm1eChl0WdyiM#APv+av)!jC9}}Z)$7JW*YD*QDd9;HF{Zjg3S%l>Vd3Gh zpF)CdjJZU``p$zBOuU^$Wfk;1k;kx zT0$Sp3Vsx%ZYmkn1H1~k2I0AT8xzUreV-Fqj>RZY7i(wFMOWa|G(hraL76TKZA(jz z`mS$q%}%4K6EHzI;cR}FqYxMA&Y(MrpLf_N`{l>=H@WmfVqXQ_AdfnVLiW~;EE?;GF(Hf%?jCXfRL-JrQ2`s zR90~M&XDR#9lIw&A%%UQ*3~vO<;|N!c?$S?fZfYn9kC3E*wkL(kl0vJhu@kT2A)bv z&w-7L_8A!({=}gRaI$M)JBPFmmz+ztfw1`XC7i(Ik>e8+trK>oKBm^zIniaO+1Uf+ zk`s6IQ~TgZAjFbG6&fKY_D;re#h5F^C=lBqMkeX@j_jMp9U}ru%sbMNP71re3#ro| zJa`Zl7&v`4L-o#`vy-!(=avw}#hPi`oFf{qu?QO}HQXHZ^gl5#)@x~oQ&3PO3{rZc z^=h+)ClY;y1ru*;)*|EVyb2Bl_EpSoiU)r%j9(;OQv#zfVs9rLtK1ZvdQ?tY-@+oG z{6u28#&``zFv?dV-58*I3-8unwB~DzI(Fk$t#!-fKc4ySNs5tzmWW491+fW3K489Y zLYu(Mm#lI&sM7vks00oJLqN7QwL#WFZJFjF=!-amrc~iVE^W+2k#1 z2M)m*eBSLZ^~g~VgfJAP<1pGnN}JWDGGAM07K8r-g7keH;lPBo=O863S0jMOTm6Sh ztWbFtp-j%tf2P|HzJ{BPjd(LJ2IuQCb<14P;o)@0*JNPwtg($W8zh)_p<0I4Y3G|M zU%Pg2t00t1#B<9Hj%qZ~pp%z6TUxmBT^l$x3KMh!i+5^2uSI7j4jP4#$-Ps2vNYSk zvVGr`Q9xiBye&c2#)Olh#M%#f1UZ8NmU`;XI;3Q?jM(y|8=`)i9HN->AS=Q)gJYaW zPn;08{UtA)_6w{#@Gc7I0uUT59>CAy^uh7LH8^sSg4hGGJKOI%6TAp8Q%d@eWnKS^ z)w_s=BB=yDr*!f>gls5jSRYSp9qtE#eV6~%V4WC$F{)TGcyGKnvsTLM*G8!GdLFBz zkXl>(JVPpX5#TGx8a0n1FgtxXgvWHW4h0u?8P@CB4&SX}^o3lbx)8YEpwW?`CgaO^ zUNxp@sHqWXO|%6}x;Hd5nqQumyy$hsnsf=)7n~$sS#erq=m)rJO}qkgZoPXTDV?Yr z8Zo~2X9ypl&FKgg5Czek)VjCWmZe^{(5UVx6z*yDBZt=OzJ5J{zkYo+l=PIaUo1Tw zkU;4W)oT!tbw-G&h)?>1yQpB>#o@!QtXqy4GEh&B^P1ok(qPh-Ea|S0h2&5)FF1D5 zKVvW2RzpMvHCegk7_U$SPVxvXZ9vFVoYe(y5@uu^@(m18wr1|n`fzqs0dR0YA?j9< znc3MMV0~dmdl?$4s;dhEiHuGZ5~LilH@YTVN}*Q*C<%u?$G)DHuwfW~{eO5{44db} z%;rGTp)3+u{eS=l^B2K#$)HWQKnLQZ>4cr|4I`I4w>F@bBuR%u&d=2>g$V%rTz~|y zZ>c&~oTfK;>gx6DIKcszBp$@1NJb4#Lh;js_by;hDxgw<8uaUY>gVT#JN@VQvjCT; zX8Q3YvKe9~`Y^yYyt%yQ8qkYxq_E70bo@Wp5N}gzAA&-_&OU|dVSaWN7A-UfXkH?= zzn;zu!6^am7%ZMsh!;-yKY}824k9BqmSiu3h{z_SUYf<+%Q$@kRSSx|O4!wl=gv(d zC?~0;Ba@Sv)+ATYlgVkYh1S6o@-9ep4PToAb5@hL-E zphwchEqn6M3JU&((2UqSv-OdHbWS+cCIG=1-^#o6Jcc5H{ zJ{V}js<-g^@S6>s2Xb4RNI?~Yj}sI3M0<_D*&Vp(Lzu4J$kfa=X{4bET*ed#9_PeN z)f`x_TSZprO3mNC9rZSS<*t%BrYBk#)XQKtUW?ZhS`Tm@^*<%-^uSb+d3CEbH$D2X z_-z``=jiGHGZ9v0^(DvF_)cjjNHZYbyJGM)vK4= zZkMk9ib7BVvo^qWfezIY911ZQ#Q&%4^XVRnzr`dA3LSz2oF?v=&qT^zpGE)`!G(G1fOe_VeN2)x zzxP$X#oWVHu|ZI>{)~^mcbZEqF23mTaI!H0XY_Y@OFU$0#?gaRIL*TxIKZBRG(@-% zMm022_#RN(;!T1w5!TnE1QHsSFu`?BtDhGY?FXjBQN5%7BbaK1?*H6fZU)JcP`Hqt zfd61BgmC=aPL=_(7QlQr6#dUb_h9cOaByyBlywH;9%L#oMy?EOZ~cX;r2}eTS-BOZ z?ggh#x=EZ+d;WSIOPqX+5Wkq%HrjIPzA!n)WP)8Jph|-2Yg1D>DkByYP0mZS;-EXUw6`xJ zK%S>atpSGP%f+w@I2nwi_wPKnJ%r!+NhGYmH4y>v8|`_!rr&*^wDO`m(RQP*%bCF4 zJI_3SOe0>hNGZNM*o2i>cHb4{Cy%IiC(9{2?LPY}n4VunlH&Or@xzCAOq^zVOn&+y zxyp<~teA<7>zEla$gA+%N%!PH!JN?}LBr55>aj;~3z+`B<-t~s*l_8CU?fvrG@?M_!PP<;L zBBGN8Fv-)CQIm{{ifWpeU>pFZH|t36VCVuz`)R?0+YK}lzR?Tji;$VoJ411zlAe{Z zTXz8td65>Fc0OBIu8T34T!&f*7$fJBra5dD98i)KJlt&?Q9d%z9ngl0*w zM|F1-T%-6xjrdkMm+dCilSG4YqjlL5S@mLEv2ZnOy#TYny%4uee*fmJm8g>!?tKI+ z>iYLjvRt^FtnA8+=XORMNy%wYcseC^tENk$Vv*bLLVdxT&uB{G@AYB6}DIg#qT`D3&!_XlhAq`T} zU=Y&M(#_D_dA@T$&vX7e>zsG3v);enS!=I--)u zbPIH#Y58t+wEl}2WHFEV0NSz9fq$bkO8@@*7AXsDLl+kq0mMRO1)FRuY8?7H=-Pm#44~E^%xA!} zVTB%)ZA~M{g^kmOURZztnt|s7{?)<~hQPv>X$-~`P;_#Ta{})V!q-7mSz#f3XFeDy z!59%{O9t?zkoNpS#(+cxAq@e3j_Xi()8_nuYx4O%Aq5_MqA3CF+}z65rNzZPhq=%h z1xlq#9{gukcPq6k28*==qTGoz2xuVw7fZSXOlXz^D%1(gHw0u75j(a zt=Z-OEc^>b3f23-+0rSq=FsQT`uZGDEy)6W!4B)=kOA)=Bqc)*1dQt4LqIGS;JQLW zlpxtpTCKu*0}reEC1{nPGvKkAgn>B_`d|?W3JXIkb_^8>RGplzzu*xh65w~CXd*aC zl7)fqj58Gt4J12PSu8ob)_S=*10y3OQk^;^AKy;lRIEM-;7NevHy30E{WxSaop@pz zQRc%9aTwLUw`he@9jMA+76JhE5-7ldf(GyRY-hkgsh=MR?J4-J{U}4aM|Q4FMt^b;fBHp zrYh91PodNTMosop1~4^UZ+n3!v^$H!)d38-0J{r&T8I0q6otcR%tki|O!+z)6B2y=#3 zL#<1Y1O(rC-;IGAt@A6GgJ)_N&q155nWuA`jBI*kWfXE)YL_##a_=<&VakLZ35_mP z4tps|8Mg3PU=PFF!5e?#rxhR#d%+XCeK8J3eNc&@Bqi11k0G#4PENYuE|Pdc#mV?I z4qtfQW>pge@Cqi8co#+(48yJ9bWiaWt;cp32x@@pY6<={J4?}_q4yIP86ABwu>GNp zg{@VASiJ$-i^-dy0GKEQmL&1rhnZeyrw|&qHaDSA7lG^!Az|~AmceCW;xkx+!0MHF z{{3xAQ!y}u*!3#6;bpGD8Ux-M%%QeB8R%1>l>PxOX~mu5U`q;R(aEGQ?bWOm`2RrU z9fo$3=I&iEK=gou4e%QbU7QQ_3_#R4h87I35L8s`h~+f{YpHCLItUocqg7>~Qil&d z9jxbmef#$9ol(3{13uqt{yRnV|0hM@|Ah5E1XTP->tg+Xy94LE{g2QEBrmt|w~GJ# zf5hofsyQ?#msq(Z=c){!H`rV~1nU0;%V709 z-0^n_%3_u~58M0lUL3ESHA;C|J!BjlIw*Jfpq5{|+SsRrU0d_$T4Bo$+-74T_B5$C zc=H7Qw!!uPL=p60a`WyDla3?{8=iE32BE<#3+7&oqr)0mL)r3P`t2>%2Zp*@C>G)y zUql7>Q*_}eo;gyCTqaoO>I3>bp7aYe9>DoQYG(KX`Yk|eTB11E#z2ybZ{VRRY$>}G zZFqe|%%H;6Hl{g(mC`?w?M!_~xK87;{^E=ZJ==7_-+7_*W9h}#qx~D18g5>BmvHYb zm)F-9Lo>cb=k)&7shaeeh#S^JFIlt-G0~2ns#~sPjjkKQckCb5bUNsv`4*|!W+k!} zzSqZbCFLrweejw%nK z^&Cn910r~U6XTgG>2knD_yl|ls0=LnbA`;ik%d4gseu74a8GaAQ1MyRQw&!LoN@az zxF0drd)n}fF{Ny(lXElbiJyJrX39ckokK-9GZn??(j&Z?(bcFAG53S6V-5o<#a}MN#H!eG1X|56P^wY_l|<>2rTwA=)iy+0bYH4tgP8k{kKMQF{OZ2 z4G>ls0eiK%9w=1qQc~?;BurA_^3BffhPX$*1WsGZ=&Dg5MzFK3#oysge!|B3J(An@ zHgTuxuYRt)M#w!CH+~>EC=x+0oTl!4(vn#cVT3})^RQm;L&%#^Qp_XmZT%+T!ISZ`n6kI{Yg6u*H2_w5HOfzA7G zF@ZvU>XueccKL{G)~mWA<5z#k^K^HPmv3?#&CN2ZF3xV9pg2p5_x83|Gd;F{_cu1N z2M5GTqq3T%E%*di7I*DT8zT|l2%+{`!bLU>gZSM;pU~N3K?d~t!+)JAf@J0BIC)LE^c%-d$6hLI zZLF*;?O7{!jEWStPTO!XVu`GyNh?GHoUUcAt1suB)sG~+XmgpM-LJ^gdlB|Ai;c86 zN6W$IRZFFZy@u)BbrF$qxjqf?#pf|X!kVEb^dv%pQBReQiZPaA)|REC&|uuhhyT|= zKPxM%^Df$s>xm$O)o5rHW!QtBK+%W*2CJjI0xBSY^Bj{?haLyk|SILh7O++*v<~z za&p_2P^jaL_n}=ejtA%hyV<&Hxest7SvL~Q$W8K?tT`a5;A@h%UQD2+77;PQ20|jg z2}+JRkz^R|sRPaf@Em?Ln|wF0@s@W`m2ldL-+1+!8!%_c6z^CgRBVq{U~n zs#tmHjcbf!wpuK)v8t5RAvnhBC~~Tk0lFZks!DTjdt)VOVNX+|e}%Nx{ujYRkq}Un&&WHym`Byqa_OmSXbIQsk9W8M9eB2n zp`hG%Is|?%41xtLdYOTD36nDq7zL7F#G_2@QCxF`M$z_7-Kr_=*fJaGPL(-L_lRKu zoD8;DDa$i3t-dOr26?i)+7}gb-PUN5?QYQCX{BI^!uNex0&OyN?mIt4JWZO0{<@Nz zq`EpyYgW2EB+h)WH9}huXOrXBp9lKW`v~y4SWg*-+vsoj@dHm#1)?ONB&u``%hcZQ zEm8V450HEZzsLVmJf9g|A|?*`PbKt~90oQ(YI6sG9IdAZLNs%p*sCnBc*Z*0%E{Gi z^Mmrt6cw@TW|Xf+(Efcqf1T%yo6fAPprqKZ`%l&Sz~0Ge95~bp3T;p`g74h32=!&^ z^Kub)pS9J5efm_;91#`fDRjD<5<%!oQ^N??IP>xUE~*|Bf+`q3|IfWU{Kx;5TI&CN z8D7WzKhNyg@%ZYmdI!8% znBIB7!-X;^1mKnRiFcfiC08K%Ky3-0~)4HV= zk|=0AkK*I&DZ4v_$@XxFaVbX#@B}-fNl-I?C1OU ze;fb8Er3TaOiZ-vIe>w-3%?Pj#?VN>f`umoz=`(Q(R&OtxST+n3;cUH3I^up0M5cS z_rZXoAp@`_=mDo3fEfiJV8Q}Hnl8Shxmg=Vz%UjZbDj=@i$+5AH4A3aVaNrTYyh-d zqLmJb6;A?DN%sei12BdF$_0%ayAJ%?LAXd#WnlP#|JOIXU=nDTwLlbye!Ij6b{4n> z9Rcmk0;c=0YM_+!+Mo0VXpL*Ciw*PRIeu!Y3o|(wLV;3KU-z_yt-yVw;SRur|6ICu zlUf=KDhyv50z$#T3TxD5I!J(3BljhM>oD{I0wauxVA!SU4nPKq`!u{a%Rt5nr(4@s zd$^bby)PK6tb=e2y7xPzq*JhvS|(`%_6Y$IzV@E$gHASKnv=RC3Sq5*Nn!mkJUjDIzpCh^dH|20CV!YGlCnb%;yao>+?Ex4MpcEnns084mb+Es$mZJdx{0bCDo} za7Cy$@WS0C#6Tx+{ow&3fPyRh24kwKYXLcekB-JL0AAsEJ|3Zur44w?0_?Rf|y%> zd;1C?m*gh!>_Nl$4NzP}C9qe)D-1p`aipixsC9Q~{0mny3eXW;YA}^Ru)RKnf=k!$ z&IiEn$cMKG$Pu75Hu#iWW+MS=HlTxh|9BQLx(5c*h%jW56ofJeaCrBn?fDHzSdL5m zR)CfPs!#yoil1@UuTu=%IPf#A8G4BGz_Nj72~s#TL_H8b;2Gxt;J6dHIXiDJ55nO> z@H9uuZJ)4}19CSQfFd@*BS0yZ2h6AetdQ%=RwrwqFq)$I z41kzr7lXL?DWIZ!u?lb#yW89Dae9DJZ37z6@JWWNW?Kbt1;{<%Y{cPTv(+JjDgk3= ztD;bt;6jHBjGDgoc8>7{+5l_#RWNm(Ot@3%4)@qU*JRl81E_i`I8_J%32kKql8^7Xn5FV9k(+ z0jNBTh=c;*k~h^kf=wrw{KAdmU8G^u3wliW%tQJ^qemcI3Rn$AfPq-#tFdZusBecm zWfzVM2CNw(1BbzF)JQ@xpfe{wVK>3H@%iwfdb?X5fDnchxGQkggjuytpcKRl{OAa@ zlfW`avJNo^p%*-5FifZ^CpQ4$Rm1lV$V`VvM-X&SQc^m(RZy;gT7%za?AUw`rY2i+ zMv>5GvqS0{nMhtdJBPAh-?0*W`-zA*F$Evgp;UFm+V#&UlfgCjezEBFJuw#mY* z7Jkzwa7#6?gVY9SE==w$&c=Awc3IhZPD3m|XM>sNvh6rGj@2PNT3bf4u zFr>#bAAonD0%Lgq>4>TL72H`XML^O3pH02dv9a1@=P!9G5T)Pu-{yjr%@1n0EtcKs zu38A$kP`sS1@4UK+Be|8WWEivgKB|{3$VC6`^Ok4QvBY10ruNXRc%o)5d=^U1p!*v zVNneN4gBk-GDIj?M)*bJ9xsntEHn7iyd?u52<#_#+J`h10A9UR<*_KX6juRbNzfrd z5ZzkLDF6iqhI1SQu=YUCa$(wqqr#Z*eO@T>hC(r9tbn6rxH`PmJtRmdx51{_kMa%* z`Vp5cDCcRMp6Fl!X7O&2c}zq}Ntq_~1BZji0jm@?G5PfBg)p+sPiIfkq&p6J#^<&Z zUfSZfI!yh$H;pHuFo8-3w%ppviXN;-n2bO!cL%r^pn`a~JF^7x-4;xO{U}@2T!3q?w zhF3#jjDm;cAi$nLS&ab{Rt?#WV`XIg*vp-+B&Cpb25*7f_DhqyEEd$gsbW3L5Pcwv zQUg>8|BFF(aiCzFYykR0ay*v7ZrjoD>fY29BXS@F*6&pA3Qj#v0d7Cv^`E`)xE zg_E2}mB`#tBI8dCjE^4%&7R*&(AMDThmc?avch+t z()swKh@h-0w2Xrq%eLeCCGT2QdE+iK&+iSYy)DsP1xX!YG&l-qw6*|%1oRp3q_!h- z5~}5iiJP!=C@IZ1=zqd1m8u-3_rbkch0&_~f6|~4Y%-{?3#vC;0QjqKqkW7oF2SN4 z1y5YW>$FzO=lAR68JOtVeq_9ZmnLhv4r3c_p{6UN<}%4g8L_!B>)-p zFED+e;f=Xt45>Zj9t&%2Ka7XX4RYXsG6?CEMqo(;osf>K?RSu;9Yll(e7#9VW)I{v z#9c4~2ClP~7T}V=9;(LhjR0^CGb2PCIYOn$jKdngXu8|1vk_+_&yd0 z4EX&`2ns6=syl}f_4b{cC-VSElItk}G0=UdPZKB@fI&A%Ly%tp4E6Qvb@+psO6eFOi`>B&ht9($-e;DQf-vzXx> zEnZLJ-MaDtg9EY>tk48EC=ucGliJ#uEs;F{AFku0!6u&U3SRhgZ zgT#b?YT!*0&^ib-T-b8>pMhr#YCL$U(3|3+SGY&m!!#9nAl?M!M>?!{$Tm<5$vk}u zrSd$eeqftxdT@6fz}AC#lrS8`36T*B9MBoS?*+#YEzuVTa5pf!SQscsDl2oEm zhhO-RnBhmjEyV)LWO#^BK2<`i?O}s`4Qn5Isyzt)kA1Gf^#B7C;yqruRtp41vu^DB zL^mlEgj3WE>{n~vBQQe(dyg+3!a%*oi(#P`fPf@A`pp)kAPJh4cqXFkm|f!nuH8Sb_h^-%a*pUC@O?F71KA8W3qBIQ4X* z;E>IEplC?Kqe+E{6YJ&V}@UjQK zb?_IS%tEl#2jwQ9?7;Q-0y0J<5+l-tc?sJH#vGnqd3cHm`+$)yex{fWUa>~-5Ku5t zTfyO&S~p?afO5VZNW^zW9|E&s7e6S&f1cldz4rgc*1~_~|3)bORiZ2heh&l7xiyjv z2MwwM>wl5VzS2O|BVawERc!hc20vTFSBWlPc5Y#XhL#6PCXlxg5)y*ztwJ2k;PE#n zrogBQQ3$rUmeyZr?h<=65`RoIf=LDdAaITnef)p;1>esYynjr<*kpFL58gJeEYj>| zCorI(GD)h1ejER>oST@KSX(njxMjRzx^KF=#)D-=-3RuodUh4|)F^FmQug9xHfn46J= zgejIROaWCd#Dr)piFPThUh9>-DEe8Ch5qg@$@YT*j+VG3V{Am3)K&qjMXQN&0p$Sy z=W$Z9s>IH3v99c!!`xkViV2v2ID4CxYTL%%%9zTWsCc%Qbu5}998@U=@`IO+Qn~`K zo_>;zav57I{7TQ&PbxW6z0!L2{q{39qd*oW?Ec@B%L6uVXI-;$r6Z1p2ZBGGK2&AH z9XdY1V*Kvbt8jL_ZbZsXCD=2{Dqu&@dRq_iTSp&R&%56Q>R(iSIhNQs)_(SUw0U%Q zLcH-wgP^9kaa;8>#@O=mOXLL=u6&&Nb|wfzbhkbZ%f!aQ&_Lx!c4wf$MZ>5bW2qaq z)t@{3w%!k8D@CfBBANdNp`#?HfhgRn_$NsLeGqan|7cD0s9}d&dJ2WK^~1!#kFv@B zu`@Z*poosJ=v6__xp;R>HFp2|oYfuOXyW%3ip17pE24*o23&p6o=o2M@J9AY*vU3M@i&+UyB zNwl36u6Y}rQcV?ob?A;>jSIW&^c>R)QV zU@QX@0I~6U9Jd6PHBvXC%|;c|DuJh$UfdO%>9?thdflY}7J~ zI&!pXVN=>;G#rKJgp%kS=0<;){)?qpX!7&dTzrq-Xfrf9Q6`msGX99c-kwYCkz3fF zYE3nRiJxr6aFj@*-%zi!RJ}>Md}LQDf9?lb2hp_I%-_d$9P~V~@^isf6-E}~M(kTz z&uG`|XT=#^Z#0zMKh<5J>FC2{l>GcXgEpcQ!ljVKa>v?RKX2QK)Ev{ z+9En4*PeRm-ec;p^GX{7_4Uf@dLg4WnFLA-l7Wsx@Vl->_tjhlh9)sU@QOZbyqG3yxF^|z`G}UlfKbdCHm!ykM!7pS`($Xev4 z8(uLTM%~Qvkdupd;6R!Vt})35Qjj^V`q90&OSHbjKYYt$JCh4gO?_2ej`v; z!4S(MfWagOwkgYM#HYW~(;#+C6#phl)gPRfkkP|;=4|RBK2MdO)Sv!)L!moKxjtsK z?E%X$uNP5*UlL7B+}}30Ukz=@sgbFA2EzpVMwycoj4e3YZFVt{HG1(>%FX&8tl@L& zaZN5mqL_k`0a@YX>)yhnJ=$Abs|R+YLt<4<9A7$E`K{&>jGDZXB+R}f8L(JI=7~6R z+%Wj&IP0aC@TmdoT}LxkZ6f{VO<;Jj>ZmZE+ukx96PU$?E>O(#n{Lv2bvSYmVDzhY zeREsu^yGYAnq=${pF!M1+XPQpl7JH{ektqWldaQ>XR)8gQC^+heRcT-I>oCkeU_B5 zvF~PE99Kp@zwmbLbO0ucU3;a--fBhFZC=W!3FWV*>SdxT*yDjEJ7sKX$woDGbancF zxByQX2kS9@RY4JjE?6YDZ2aS2h(y^-ep&MM=qrrYhzh&5vSy`*cfE2TW7@c`-VCET%XxjeGCI- zu_&H!2PY-l*jDshg8ZD~BNKy&Yb|ev)jlpSi1SG6Z0W$yAZ4+x&t)sBxHQ$K(jEr1 zE`Gl0mbDcBkcpD?cEGuGw2=5n%Dcm9M*ilQwrefxssXtT7|Lr{Va0B{TKPsKNvGWk zj}f-t?MsQ0P-={D!56;>b9u=<8dW7BKkia#4WStYL;g!tDn~tmj6l)}Zbrr%hX)1y z=xT1h9~Q4$_~_(FAzlbKT)`V~+bvuBp40L6*87I>0{zoZwTb4uIH2)z?wj@-sqc*L zwWfNC6mD0!DD@=1N1ZsjFGd@9)$PZVijR@gQU@Pejeg|dF0%nG6u(vPL|)?O8#i{z zO-$QP89Bv0SC`E@Q>|bX8Z&ILi-_QQIvJUeBOa-(OVB_BS5Q~6*c}bp-!bzz@TvLq ziP`93+#J{8TC^(TEj8Kt%BO4^XMc0eQwN4>un7r8R=Cx0uY?1O#>Rg zDKU0P=90i(Pmpi%5e^eZDOa!rFJuJYx_(PnWszZL>^@e8@?wDWT*8uDr{EpifQUin zSe|m_w!VCJ+}yAB(y&Y&QPq@B!dyhWxNjr0Syl0F9QmF`Q?J_j?Ba?r4b;68Jk5>L;ck z-`TFsmN_XErm4#mJNbH*7!PK1r%K$EUtWGi8NN%s z&sQQZZPn1$mit6HxU#B3TTKgAhvWfA1*YNjl7rBSYgW~o|B5p*Al{CUce>DD@0N9Vmg=`{p!Uu&^2?o1lunTFPjY? z#ydWUbZ#{9AiU0G$T-OJLynZhR$GI1EZv0qId1& z#Rs1J`F)QqY{INhi5#q5^J1VdXy$>UkY&$%t~U`Wg>^ln!0`yc7fI#w$R3@Sp}r-v zNN1`b)DpZy{8|;rBb(7tepJYR=y@ov zeRKQ1FM4~)8#Mh%jYyG!+$9wN1 zrq03ZpIKk*`%A4bovr(*USDkB8FV#YMb>NUiO=S{8rP4Y>3J!CEEm1G!C4DSB6_Kh zGYY4ieMEe(sI<@pV$%?*lR%lHm9EW5H3vO!PuGuk7>Yv1Agbf)y=3u3YGJ#FOih1_ zTxuX~dNCgT6gry^zd}s=r87ySr?GMUftbg76+MKOmk%g{QPlJ)Sq7eY*V90Sa@}C_ zS0NdbU#9Y}Xy0qgY;i+X<04iDS7g0nYR{sdkcP)S%$G2JZeSZ3nwVJls$r2{I>gMx zM3b3TFnLXP*89BQ%RypG$CGNCcH+rJIv+=bN&U?~?=AXaHfd|;*lSQweL9pgHrBw)!|QvUmKvSD`8Oou zK{d1c!aHwYO-|k8z7ZRuAq0ulc!h}Fa0kpg zE$afdE}cmGPl4ev%}=OVn11>Rf1<&){E@P!y41rWHMeyjMl~yEsfdl zNF084Mq5U4GO=E#!wQ*=po3)YS4_utd#8))#AZ!z_1=%K5<{;rP6hIE&npQP8P~Q3 zvxww847YT^4$-HTgql-}CkTc=l_QMyENCYt=vmE2Oby+7fE8MOtsQ03HOaIqr}9(y zPLC@V+bbCz(akG)$n{K!vhBowNS}?`04-7;m?f=W`H#h%(^}fA!39tg#W`e;QL`OnZNpswy_^ zmvUXrp&Xm5wda4_6JjrTV*c7b64at+Q7ArMwvbS3Z`|}S}YTI+3i9eH29PTWLXf|$XYqPU$#*Je| zJco*{r=!4kAVA{f#goZTq8^TNa*MeO1{lL7epJ3rmFHIF?WwOY#^eg|us~zBDv+JB{vc-7Fuy%tQxWlDy4i>BV(6xt}u{@qbPhUQsmAf4%H60Y+ zHD%?f*uj>kTR#$9%JPh{@(WW94Jp$vyGoBZI&}lNcTcOlji#r{ z)9v?S%7jC$2?W>1_5uP=_{%8csH z%*GITb3yTC3>jZMAH0%@@8@uY%4#)fFJN}-&WXTc8QDKaJEzXQNBB9RMAGhkp}`b& zw_Tc;gPrOL*2tgYlzq9fsp+kn1zIPmy9)?SCEa z0M+PMbnfqGT+7*)G->`8lof{?ZG8z+IzE+FR1DVgJg%p`PSsyr$bGA*At-E^+=t7u z`|G2>f4jKUiBIkNN646zv|nvFzIr7mXR(w01Nr!E8>qy1ii;VfE_tI8P&&_~d3mgB zJ^KvL_nf451(m37{-Ze_dN{sF6l-}Fnj872-y|VGoYTRfyN34;y{%h(CW`VCQ}~ck z#(2J~Z}<=naW_~0w`KH}LXD$y@|b==kW|Ib4T9nrNUD)Yyt+UYk+u{wpGTy}8O( zhY?pspNQbMW##oS!-F}FVXu*|71})?Qzh;}2CH2AUNFSUTNig{XV~x5V?6HRWcXb! z^-toKt2`}n}MxR0dXZ%=m|%OK?;mLqq>r=d6YKy(O3lKLfg#@(VKKUu-)9wVa-y5Y?cdHPdSNN)h4HHtojICZY- zMHirlh0|R6CRz^Vu&OHcb)R>tMaBHU*GRH@HbFD{*=LAouyHccS?BQ+fCLdQTf@IG zs%EDpT29|XClAYp`SY5~HV(*%m~rC=JG(jb{1IHVZp(uem&ll|%4Fscetucdf9tBDtgU?PU?S z-EdZq*-{_=fig~ZjLtp1>sPutn$q>sU#l$Z$5Ax5=~8jF8b2?>+RThB$fHRDWLIMDW?*__X-i1FhWPS?sAtlb)KzS> zScUTo9{KG+1TpWn*~Wc+5EN*AsVE#GyoaR1iH(HS$6WS7^;=7h@< z;v|_Bx)ZaS)9jXwG0Hm|(_Xy>L!Cauuc@9rm5K&dY$GX8b?Cx+QG2)O8!KE`Z)wj} zo+;lXiR4^48Yo?I3Hepu+@q8v6zz22&p;$5I51>u;G*jcxF?5ve8wQIX0^b|rysfC6BV?*H&=RL=j!Ge=2-Zc~kI2(fNt)CBw z&O~fF0!Nm%s_#5^;Yzi)D>5+e<1sv$qw_u-8XjC3bo<`(D^+pjZj+aUxw4(%UkWCi zbjTrd=3ia0C$MYzJf|LddDSTvl(jmIs%D(APiqd98DH7RF^iOo#LTz!)uBX*t}$om z`QF~!?tN?;DR{x zkJFd~J41F7Nn*f<{5KQmr&z&>*)fmjG{gWvfJqWK>I+!L$v#fuE zjA?XqL_b?!Jr}!14kh}*`isg_+@dn=wbo(fSZtgeO2<{;Zcx!H9+}<6KKoi_$*K>X zPQ;s08a87p)3J_vd38EbeXU;H4?^u%r0BI-8vKxosKp??N=s9RbI}#TQ!4RyQPk8; zLQGG(bU&RbE@5vP)gv9S*R@xCRW{$|rt`KNwddE%pwC`xS|a0$V|#iZ0+x8#^*Oaclb9|p}t(0(vM$J)f7#Y@X|WBLS8K} zUu}(6HBnblVXi1`meW2yGBZ2rwaQW-y<$;6lO^Z^*O3o={QOeM&)P zouMb3_9rM-U|z6fnMX8z{rpc)5APaMC2(!<|KpM8>MMHG`b9LB*kF zPE>ooe$7~USL@LJzaFy(a+O|Qi-AHN#3ua)NpJBZa|*X!tM1n48(3 z7$u2uii*Cju7m)fK#_)H*{?D&jxiz14Cf3u?E@QOo1c7Tos#LbflxeHb~d0v*N&9s zx%-rSNh4dUmU)2o;%)oaUu}-$ez){3375D@o?T1`n)Rz8EV^==zx-Y)Vy6|cErOBB#g%eTrP0y$@nD$aRZH*&6iA`1 zez*K9W%BY4H$r=X`48hq&ByQ9<*}Q`%#7R!#?704;@4#jTO1@}Wh#p0vaqo>b95^D z7U%x05Y*Io=1XRw9cXLiDUK*?AE_gGVBd}weG#z4rZzWW)^hBHo?#0ZBb8NHDbT2w zjXi#ZMHU`eV31wxBm~A&3L3&m6t=M}O&?LTl$x#%n6|PFbLqFdvx-bRQf!4e7XIp$ zW5^CaS-G0Zdymt`R?|Cva_xq)@%k_esn$~{e1wct#l``n}4 zzaz&{ze&vAael-de)Gfp{w`x$Z{jU}VB0*>lR3k=am?qj#>l%C%@bZX^perM#vo;f z2S+N9c}25cZl%y{>S*H9Y=D}QK%NxYbYMU?`qNEcq@kR2Y(FWYIhnl;i2WVSSQBd- zoA~f>s|PXQ68-n@OZxB~7zwmjt;fE0u%$~mBE~)~@_Qrk15VZ$?M`h{yf#0aYg2kxr81kC%0@t19fQFqQIpTLOe#RGNVW5>Mv1E&Z@yI z0Z~xG`tR|<4CN*7&yvNB9!J|H<)gwPB4)?+=5Wfphua>zdiKnyo8L5(Vqe_kWTMh( zgvr6=uQy7a=wfm==W;RYEkNjO)~BW^Nz|EX-<P=e*Dt-mSeE&yS?C^yN~{Za zn}Q5)2IxGQh{_Y`>84q^@{dEBhwGwLxM@L3h85qA^F@IE< zl$jJ+QsS#yw#GWQSoxx-KdL=`(f6grJ?eY!&$rfy7{B#=(To-M8Cag5_*3T83BDL` zra{5*Eg^@-0p1J`8gx2V<9lCUBnBIqC^b^1FNKMZ9{ zv(?AuyXoAU{RxS&qobob4{eIvXNOYjK9xH!*o}*e5sfDl7n6}NWTcVnDM=*x#r?wIew!z0XQ5ft&li1aVlXI$ z`Q#mOZjVb3lB5>P%SSxqrq14IP8+JGoC~b?l`EZlnUTXc@Jxi`b&Ol2oiwjrYD`SJ z!6$(ax*xV(SccN2VexQ4c zo}kqI%LT)g*2(%(hDz@gMQ#K+@0T@o0j38$v=6pkEAheT>S8*fzopYVlIF_kFOItA zFVusqbza|E>20xJFlP&Ai3Q}$I~Ms)B@a`XrpUts7cblq%WNHg88=JtP8`a*T1OMRqG;l zvaVmg2gf{-;o;yP{m#jE+orE5R!ikihNnG- z+bIVIezu!vr?Z%h3||V{=MWy?#EXa-G%Z|9a*!=d{+C|dR`ss#u9V!)qgY{NeiSwP zzJ=JiDjGaizfo6}Fwk+t%~1eT*`_B7?gA!GRh~7Khl>0r_EtKH2U{a?nCt4^Y?i8S zV!Gp81}w7O%aq}(<6bulJ;Sw_&F!tpNR**V0JlK~_i8rH?E9xIP%*6CI&%dz^pkNa zhq+FBlv=i0v(u#=`joo-@juZ}<9&(AS^7*bUCK~*&mX`T+LFXvQ$n{R0J{divJ3?6 z?9n258(+P$!u+l(*MzU1l=ocUUcZ)){yT@sL~DCV6Z(?Xoqgue{Cwl#isnz z7qjZ$p)Qr8q>#pLsPLvAV|I%QDeIxZ-J{R;CP_95ywZ(9K6c4Fh;HDj!Xd32j+#lb z>-a1?vF5_P*E4Nl$jdTPcBF0RfX<`LE!HUA7NSjijhU5|+3>=-+hFM`O(H27#(rO0 zmQcDnK7X8+`iq&Uw#mblU8nqFS?I2cX#+6i7b}&aQ8Bd z!VG9PkmDnX^SqO)|HMPqz4j=I!>s$sS&hP7c%Enq|h{jTXJ-ll3)kD3xbOPT%7WtoevaeL%8Ic%yJSA|?oazzq& z>w0HeT&s-k(Q~4ayyohMng5Kt!bL|)^7x)aTqHJuRQB?Wwp8Q0?)20$b8!~6l!0`` zt0Q7=dwIHbpXapuR>FV)HCz|%UYz^d!oqK=K`xSAxkM(6*6Xk#v1l>^{LvzL{?rdU zEw_o@a(26UQOG7krR9k)ag|L5tKN&CyM3O=3%I{6MwFYUOqTumUaMJ6isd@&Q6uBd zJ^tjQHD)1V>1pQZF_*PePp-O41hRg99356epY@h@sQ9HKm2CqZwfb{)ZIt>lHFk#A zqJ}@v9wmHS9LOtnUMSo3-oY7ow*MA#@O3!drj(zWY}4lf7h;?u{8-H%3L;SXe~ zZcY4Xv#HaqHC;Jea&rvP73V8`mPF-Nb2=xoE7NdwwqU8tYX3La=}1kL@~=a}8>XIO zF2ac2iY(3LS*WYn;c&9-KFhVbJp-ZG?VirMTQXO=g~*v>RI28*UD&_b^(|8J;>Ntz z>RKW>?A!bFB&c^JkG|zWW=e|EfY<9nL@tR4gR}YcUwdXW_n4mIvd(tr$N2JIb}`7; z#S2-k9`xTe-@44aRrP9O&D8B)$3YUdVZ(!PV_uY|CXow1<6#PUFJFRp?PKa+c%K; zz(ZMa`si45JS8|5`v8s_8O^VLRc~fM&ipJ{aV1XTY;!5XyqLyqeq6aBTl49i^8(gG z=+Ev#N~oJBX)_VP1$IfqU5P-ZBb8P>Z-1amc{Yg_zHn2$+x3~e+lLz`DjiqoKF}`D zrIUraF+LKxT&1HR^7vWP7E9;ltctI8t_u$Y2n?`0^b4QKFv6YHm(TC^E+YQD{oxDR z{^idbBtLk!oODAX(tuYbDUBs~H$owUctn7ek-;L*JtC0dz1wnPCMtxn@Cy&_`iCI& zCp}`;9eMuNhk43oS%PHM&Eb`AJHjmI&%emkBr5B@d70n}=JFSMW~&o|#*1kd0~sap zm=b3-r=Mz>hScXSI$N0W&vJrZ^RtIFCh=?V<3ELAqy!(<6_hS->z~iGNg_GA`4AZ? zFE@XZ{B+!*eW)o@BOvP*uSG@DChp4Ql^2y?f>CBWHy?A{ARr2ie?9U>` ze7|gYVg0gUq$s1jBD2wLht>p!U8e^z8!H6u8@Wuad0fcdj zY+P$c>ts(pdXA*qHvwIGYkG2HOEf6{!NC$s&(X+V%W*K+-L+I#O?&-f_OmcuMcoF! zXvSECIj?W^ne2(HgGQeI(N2W`ZA zO~}&R{LdJL`$B`B=XjA7EMJ1;kF(kN(ci*y?70w$hF?jD{X^Yo~N^#ZZmN?Rp2CP0lzgM+C3hN?aq90qAym}^u_)HLFbmR z!%GpDmcRrJ&wswR7St}(=IZCQP!-gMMjIB?ZjTImk4xl8?F6q36MVlNt@qHXak-4J z?o6dF1MJXT_ZBw>=L`5xYSYcbKl)rHUq1WUL+k#~@J|)({-7tAA1ApTUKk&``mR%a zXWo}KgyMM2SG%bgRFUg5M#LJj1-I0fQ;0g`WiWx1BDUQ#<_z)?^Y*F*tz3Rdi8IEQ ztAFwx{74&`-1%P26aFeHDsGM7bm+M*##J%zuA96%SW1v=wGgMNyL?YP_WlV zJWj@4;VbPcb~}fDL+0)MG{=n07hO~*tlGwiCbblq`1!83F0h@S zHf2-J=QZ)GRJhMdJ;BnPkrwX%?O`oqW%)b-^(bSh!IfMetoyZAUM#_5Qs)boyQBXv z=H4F(~7mQLxCMx+~2X&8`h=>};e_r>!*@3+?e zvH$J0*ItVs&Pd$%+*h2}aUNmC&Jv9#F){C7Dn@|_fsZr2TM4Xz;vgXB|6L$Z&qWSp zr_l;~6(IV1PO~3U? z_Kh$Cx{`z-LO3E6hjsvv=<$?6L&3`G8-2*ujtWp&+${OtfbtyoW+5Bj_ox-fRxoO} zhR8)6WmmdOv3951OD|myohsaHb!->v{tZ^s(MV8f>bb=)2AxC>vhk;-m;N4|F4x_< z9U)Eet-hS`ILo_vg8lFBU92#x9&f$$C9~%3H`Ss+)BycyH~)j-@70~>BQL7kl)s7w zN|QCYgUznThx@qeJCf;OQgb^zCgw#J5`?=<)3@YE=!fu~&2>ey#yGQk`~E7n2r-WJ z?ZQ7ygsx!;YzSbQfA!|ej?-K6(9N7b0~1CuhtGU2THAGRqGLY+lU^a4tTEvoYsO{! z(Flhzy^oM72$Qjj+ElP_TbV0)ZD}c)BaXc0Gf&3{5 z*HCU4y6`pNV?vW*{er9WA`do=U`32Sw^O66Ei^Qg5#(w#U`aP=xh91~El2~4qw|Xt zx4c^o;>&b37sWpp(24;1D)ExprrqEz^wDo4DN`A0a)dC6yjO;k(zTLArR`HTQDrt0 zw9PJ3mK4m1kRh{izW0TQ9$D}9uOwq6_UlF$17W>I5Ygo zCYRIp-w&;cTYuvXqH}mX&-!8&iAK7>vYCkw6a~9L>$I%y>35vXVb1@;Z~p9*y%Q{w zO`q+yJ-w{$CiDNz92@uxdo9osx*jVRWlI}ehX?tHBNNck=xref=@1s{qX(+S4GUK} z-<5`7i2gxAd_0J{&+J3- zk!%PWWpeLeLlG_)l`N&Q>>~9y)-5`C_hz{iq*9QxREi-&}bHH~SJN@*y8*C)YOfXFhO_)R+9YmP6dwjy^87sw`2PS96eYA51p?RNw8H_lvV^ zf?|%J(j^0}bYwR}gIOHyMStn4g@)nEeROn0;uqnIzjw!|p?n2ebtXHb*dGm?&k2AE zQoGUa$INkJRokuVlo=R$=FeH+Y2!aKJu!hTv#;OQGeU!ze?NOv}-It}aEv7qM zt@47z0Tw5SK=%^od}3VY1w{F~;nY^44>9E|1PuowdeR>+k4!O{!FAvjPf^(ybtDv( zb@em-hjhEtXr9NlP15Dlq_154{zz>O8Lkx%&(8YwWCCNt?$CIxRtvu8a;gnWom56(n!p% zVD_YgbkQ4BiX-BolpvDE2-bGgex*R?d$)i`HC=0mrMRD|(^5ECFyfq_QtoM{k;L(0 z|Lpx>t#Uy2(c=K$cKo5FR&~AQc z#7PbBQyH<+DE#E8Zk7*K_2I4U0#qm&2?Vl?pMUTGm)l&EUOe+|aS)3xsJF;9^+ zelwc`l~hM;I1avqXtuuaMJi2)(vO^N*45<4W--D`N zvQF4Gzk%P4OB5MpN_Tm1GD6)Bsi`yH9{%QpN|gnV7NbE#;U)sdFxkpKXJpk`owX!+> z=Rf}c@q+40Q3}w?Wu?ODs#n{`(dYoycipOEGU#{Qr5wpz9?1 z|C1Nce_yZ+i8k5e)6>x*5+UKBJco)QQbID03<{GZICuJrRDpySuIwrVUJ1ZQ_idHdayDZD@um_~Ww z`g)*{DA5iXO85Iane<6cUb%mH??d1lLZ(+69G(;_~Tq zr}KZ_>mC-HSSJ^gi)SEMc^UtmFY+~+kqNR)q%f{JOw{Y}C<(ohY!Xe9FxnPMg9C+1 z&Qnv$>gLYFoKWQ~BVO8c%{&W)KqwK%jiX9POtcm#HtFDK5E{uCrwTDUELBAQ>H{dF z8x z>5s!XG3SG4&nt5tvj%yILLYWjSqTbdPR%tjij9|vfvT#tKKKmEY3bEZ?-0>$G6IaY z{!C#$A8Il--$!17eJg(=-c4D;dSTHtUE?*#7&@jITBsspFV);Taomu%DW@V*AmSRm0B%t350A&1fx+!|uh!mSXQ$C^5U zw_Jn|gbOt;v$-tZoM}_uIOx&|D(&TU&~plN)}C4WNVOa8UFkr#wE_`9=Lv!H1#<-Y z?Xn<3&<{R~5vMUBK==1by2N2bFQ>`!N=C|vgnuv9#^DwceI|9>?ZYOG*wP}~#rYMo zfzDVV9N%5PtY_z=Joi!brY9n)ZdxLYf}j2^9dD=%N>op{{=7T&&B6`y+q>Y=`d#$5 zP+WweH^?f#pLMUsKp;52kTYMGJNphc$zqB?;^zstp`(HAzojWfdo(is^IZJ@=ebDC zs^XRzvY!>wNbGID@-KP2E@!?H7jKSRgl4wuC9VYV+JXMlu}dSj`fc;h@89=G?gXjV zxuPpbA%t&sIB_8|QcBkvgC=x`5>|)y1#9_*ksW9VA#ti!wV7t30{uZ4q$pBW^%)s+ z(wMIVc#&x$MCYK=YH{L=81Kta(Gd_rar0kqzwe_b=HyZhEh16MH1^jru~J#Ll1<-R zt<{2+#?(`Wez+;(box#rGGC?NFQr4D5tuBh;>UD=jx35_);Tw#b(uciVyOv%8bODN zb`z@J&F>^CLAvP?MX3n>p%tQ%GlqSCT#?dz&;cgKR~xS?;0Ya*HxCSe;Pj{eWIhsq z>G_fWr7A@lw@Ob~fnSNwQ-~qm=pjGtflz{2Xf6#ovL;_HK7?XX9r{TGd*XNonTP|= zh8nJnm@z@Y@gb0jFQjz% z9jEO?rnlkAX)UH0CPmMc(t-ssku};J`bNJs|9MkZuWNB*RG4e0iIt`ux+QE-C4e=S zY_2L>|82xGfI-J%2gSVQy=4@#QoR+NMD7~6(uQJELDAtz6dT0qy?jC(VBk8NeFy9B zh>Y9*f<}Y9C8TfU0wF+##IyKE_XIYTP?koGR|h*f%;HxOT`L*{F?2L)9718nn2^35 z_6te$4;sf2d6{hH)USanGM{&?zVo;NS65PV-C6z^zgzHcNJcx zNPbg&Oo)gXS5lv9emB;ji)mKk_?RKCKJT4IG3qQ!<$@Cu`mc!fbR6}uCNlZyCvl#s z=6QMOrVf-@DtHiN9V8_dIK?Jp6ScHTdL1NWRs{S^q%J01PNco!m5sGJuBktuwMPS=ZsAxe=GE+cDz zOPLETQCp#em)@rp492IbRS(vYc#rqI(i_WT+BiV*#_$MG;m%i#PFK}oP zp#k{WajJ)ljqLS?fk67ao&8u!$@^{Oq?#k4Vx@DsuatZ^Dk>~&>OE>XqJ&4a{hNz2 zh{@sd-OT)sWI%9y*~2IKi5%W?lJUZ>^SnononPc);wmE1d^qa?IEWNKXPRi!PSh8w zX3NaD*38iT=Azx1s()kH_ZjHM1UJZrGdTTMr`3RdI3+I5LGiAoz4}O{$|gOrem(n! zyi|ww?%w+$`BHAmeumd*V%v4kU%&~ZTbvDO>N~=soIhvVw6X!SoSSJO?6ck3cD1ku z|DtTXZ}!XgI5{!;_iJ#Vb7p^EX0oMtP~Ego1wXx?l4`VF=I~i31gRXr21qOYbrJk% z;dm8Opj=8xuJ`g_{$X{ndf9I;21xIb1A^1j!(L;5dCmr+#lO}1l2UxM*dRtA_N4PQ zK*SBAAl;MMMh~Pw@4x&W@~OGJFzK_jLJUsu4)@PQb5-2jlN1V386!qyDyj_zc$bG+ zv|z!@pv#KSimuP|H?*NN==fJzN$tNsVh->w)qcf~$EW=$TB@f3HlB9WN%r{Q}2 zJKkJ&BJa}*X3>=Bii%b??A1!H-Bn5ar`+pL^aS}N3t54)VCRQO+ zo1&ye))d7Fs-3sK5QpYJD~o1_S16@U{AEhqw~gyi!VTGC43yfrw&!l1MF#rE@7(ggt6H3Qp$H~PLSM_*&W`q)qX&?acTTznp#?wrb|3&au3-VS>W z2cP|yy_}EsAi1i)Fk(n1MB3+A-1YY#uHnr7?Yoh3;~Y{n4MTX|&;2ZgM`|X^N`;wR6)~9AY0s-arn}yjj)6@CuvnK(dG4K&< zHz%k;knuGq_Ts}RUVOOwBta^^oSbgseIpoAOHG!i!I#T-m)tF`^B1V(o=mKj+gR;h z_=>D&d%N7^KDRq5mGg%!1=#D&Yt z;Zi{WYW%ssQueg!TSuZ(DGm&V3kl8EOhm@TErgDokkN-fgTxs3XSvM}Pb3Md;XM*A&5Gcg|sMjInQSHY(MR~*2Z>2V35o(|Ddx?{}LgG(1!Mkj9(Pdwr z3GCCXfVDK&;1~744WaN=>h8Ivsw|8q09v7=A-DXBk&;o2Ci?bvP{6L8v6pfnwaGrs zKMU}K&&dC777=DGmv2pW+Rt9^^s!%Q+3Cr?&qZEzcd?{oxFrQos9q&4fG5|9?p#8Wso6rbyo4ou0Av2 zZ~^yShk*=jG{>X&jalzF*IwCw&tLSucuF$U=~NU68C_i{{uTA5{d7rM)4;Wv|HS>( z*^dwUKfO1K%rOaA&>*b3T+Asc7c2DCY@KJ_7#o9k=bw(?eQDg@_nb2sZ6TnhExpp zIS%~n54N}|$-o1a)LpUk5u*LZ2o|By^~6c#{pY0r+=dqas!*Nyu7$si4&9^5(10rohgjTBUt=xZV3*^*aJcw*T=Y zFtX@4S*_hY88hyQz1kmiEC@q_;3%YVnGV!x3%K8@RA}j>p3WJJS6Z`?h5W~BV%fci)PUjitFjz#T4p-;S$7~dg zkX1nh!^1Yoei$tEy-%KyYMYi$ZE?(W^@BqDneRjGn6ddtMytKQl-EXNyO&!d1~5Gw z5_>DG)nMc4BzqG2egu8=u4da$^P%+aKyp?RF@n@iKp$w;D`d2a{(wZ_`#31mMr^1EAgdc(6p7yYfg z%)#ZLKZ)>36mWcg&Zc_R_UXV&Z_yQOI_`^?Ut9hrR89AIF%q&|({XU*`7QD{G~66^ z2m#-mwXW}ouzq0mQpGM)>94Bx9`BEoq3Y>QXW-d$Q>wbTUbaKTjTRNTnL2klOnyp8 zp+eq=0vv=fPV_TUgBXlSwFG_7%sTzowYJb}COkKbjr0K*qsX0|#^Jyqz5z~J3Jr6y zH^c-_EQA8+@aQx8Up$FeRP(K5UN}hhqFnN0QIxH$KzE1I960U)(Bh4qGaL zA7V=$N>nEiryqDIVB)rJcaOYhZ`E3CI-Fkg>6hGEc39*tn^A*zph4h5U^t$&9Df3a zH2Vw9)|0#SU~E)dC7WIW5*Jwn(J8LY}dTw#a!w9Poi&-o)G|I z#9|#XmXjT}8-+VF1$*P7J+N6|7toR*m>6V z{{y>o*{G+EkY@XDifFzElA?lMUm;T|whd65u&5PJ^!|{l)T^H(YXc+#(Ait`I>j2W zcGS&Ty36*ax^$bac>ge9ZJ*4nR(#~^o;_dDpXP|S_I&>KW-9FA^eLk7#N{Dq8yS4H z=&!xI?qyqjuw5$#&V7=s1RmgGs@n<)cDfqFKpS%9w;Y?t{)&Gpo5t?!!-c{952f7+ zYa~?mo5Qedp_aS7hR>RhQmNCUhL2)Ley_~-f7)s4U;IV71THPY_wt>9R3OQ{nD03b zB1*9D9Ik*J&qRFf-o&o6F?&(b+7y&q`Cz_|1c->os3ZZ8T*$)kL6ufcf}4^Si-`B? zb|mZG7k;3vJ$q;1t7b}l>pGc%VE>d!x7cO*=FrB`ZX8?qenS7X>vaXT$iK7vQvu-G zg#_AM2M=?)BDYu0>h*x$5iQZCX+U1L7b`LuzxwO<^}eJD`6&bnsH_DgtZknDDZ9rTb*^3al>R z^9DV3GSekcWeGm4G6U>a=y)dhu{m%$W-RStH`lHU^%7OzUQ{#NMd|AX^1c(@s2-I=>IDEvY8J|oG z4X>-S6gJ`8&N?r*MT*?=x66w3DT=5uT=_I)o?Kn9Us_Bs>WaQ#)v%@;V0VdU_Z86# z#`QC~-1^q;>KklGwV@o5BFZB+3S%vIL4j`N+{h9$_7l50i;}p8mHwZMfG?TBPo<>K z@r_#8ZEedwo80$ZoRfDPnV0KU>u-;R+da$FHA?*!$PF<%l;kSbQWhQ&iR>uF*9g>^ zB)o&;pVn#+_FYb%W>(%X_%25qv4Glw2JxiG|90ls=8g*r)hJgr-KZ|7{J3xPaCKZU z<6lF2+MQ}luMf7i)EgmZ#rE1|kG=Od=n3Njf8z_J$^XG?Q8_uuuP)!m3f163QC+M`1{3;&q1OkVx;=Sqv-@AHX!A5*N z=HTknQ_*~9;9U;5FtH+Yji6ah?)%yabV^TNv(%cw%R#UIt?v<=#y1oFrN+lO1Uh2C zigG2Lo~(Io>V@Wg%k_c#(i^j_tBAN>B~^gGa0dA=0pBGs-dHuOhVp;O%{SN~KtO@G z=BdB`6CdJt+aqP`22*x$wip#Uc2Dqmd!$)=j^4(g8TGA7Tg*evc+TVG)Q_` zTHatcFAO*j0`{H%@-g|5L?@YceC;~jS5}Kuw3+#Hru}+H-W&HQWb)gZoo*`3)mzS1 zz^KoQEZMjvu+*)rDB*aZ>{3_%u#dbQcyn0c?Pd!B-p?MDAuKRN5#;2Rz z$;$Bt*TD;0UB-xc!0PA@ReR*LxmDJNZ{HmG@BeOod)OnN#luX!*7c(LOiqp&0|Go0 zc5nVBcG@nex9bpiujKs*L!hX%P&t1MaG3e&?356hpq5`L1f91TSqICG^9q2w2K1t* zwRa-!M~WaUOs~}FJ0c1$9^R^yAxMZT0{NP|_7W9(rK`oujTAwmfdN(tWjqpeztP1Z zh1!1#U&;nBAm_`@dr4G)Etu4<8V*y8?|_T((W`R#7}Tq&9#wp)jUkHI z=fUq3+S=U1Rh>qi`%#k2gN!?OMLl-fW|Pk9OD?EH%4E>7|8be8hvyVbiTgSu)BWQW z@{WT0HzJI7hl^^zSQfmeZOf-CUI^Up)ml#vY>*O#9|AHR@NU-d{1W+`(Z_zd_i=AO zt=I*-c5~bK=5cV3=|Ri+xcP|hRiO7;Hmh=Om$Q;kaS9jkBeXuem4r|f-I`pPgM(Jv z>BVP+T+6kOkiU~n5vc}FAJmb>SPtguTFy6LOe}kPE-T70U+*Wza`8&D!%@>c>+#+48axoNmXefIXL$T3=0!H1dzR=yhWT)&P_;<} z?r;VVlg2lRPIIL{-G~8J8sn*cH+OhSm-7w2y*vmS)(y%#sf3d(ec6hHy&vKibQ+*Lojxjbqf2GL>`<} z$(cl|u23Lz=?pj$`=eFEe<;aK%*b>){iq>zHnZ|skrHha6G07@5R0X{nuskH)fSh2 z*S$AC=?L2Lrnw2Tmo29j{+$xCq<0!RCNm|I`xn}$|1LVw|AAg=CZTw2^b2C>-xC-~ zFi`zqYdq*2%)z3=Mf78i8-8uE6aL64a~*Upe^+|D9env~3LR3Z%VWRr^&Z^K7C0?z zFJ6YlT^e1S4U3>7?h_o8IUiyR|0dd@?`dh=5DJ>C@A?6=ujP7w zmIm-}li~hwc6=IwHzWVCr9`*gI=Gy;5;y5jhMihk$v=UQnjF7~a-zt-XTqDQi5ldp z_ujUOxnBj9Z1>MRi5L|Wd-qCiT!Df<)g&(L$NK?-5bE7?9mPAbC_BUiJ<;-UXSQ%E z<+FTxRC_p?t1zA-0*>;owY8 zT-+mv$>TX0Bw(p=VFSd$z8YDFJZ^hqYrD+edcGU%%$n!qf2RhkpZVM+`_XIs=odqV z5EG;Rj_k>?)pMMcWMpInQd1%!GantDF*$bOPTlE2iMBg)HC0u%?cX~=Y*}uH*K6m2 zM`zwU_1GVust3L`P)hG`96wt2Yit9kU^6WyC1Su(a9AWhRtLS*PYi;5p%Sb9)x$;a ziNU?91GoNP?+Xiivpv`vrfRL!k1qG|45EoIhfdkOv!_A5zchWxyK;}^*Fav+A?mRL zB)hP7DO89!Y&w*UoaF(bKA*({#!>6|&D!^##9~p!zy3L7I_jb^U(-$H58%DRoK4se zh=v{b_Z<Zd=UI~h+8c~lYje9C5c`0A}MAt zYeGEq;s_22&|3-wMUvO*4#=jUYWF^80Od(e>!skaOJ`I4#);zRRBV#Lv4Y<0JNpMv z5g)eStmEP{#=l$mSHe^#Y_uA&q}MlibJ1`hK<2eyx~cGa!Ts{!*LdWx?$iM;ra`Gb9X+kNsNIPTC?oc!AKcckrgxvKsouNJ51&3~xp$jA0mKIL z@K0(=I%E0iVTu&$AyDvuQM;WSk2>zo_p(SeUV}lJUc1G3lrO~V(H8~+x^8yp$pGXJ zY*B#`cq~0FU6~p{;!y)8Cd4fzqs%}?yQwKH4UNQPdO{{kh{sN+QghBH6@wS#d|obB z;c#6pd!1@KQrAMjs;u7i>L0}p1CFlosU-IpzaooBd5Ip(C|AMxRe!X|7*OlM%<%hr zj0X8?$x2Yr8_llAJ6Sx%pw=>R(0I|&cx24%cVBP2_q^U}ib1#dY}FnZVz+KENn0G^ zvuJ^=2t2eKuuOxCtO5svR-Q^ouJ}JEf`Qc2yQXv+2m};1YSngG;6B(5?#KUJ3g525 zMRNSFMVjBlt5R$LljlR6=-j{1F(euqd{s0hG<=Dr%7xZo}HwY3Q91 zrv+VNA4r2Y>u?a}az1E8AE#`qQ?;1kiCMfwAI2tySavhNJ#}CWfkKVigk=6)g(Hfj zd|D~|6IYv);!2ucUWddm)ofB*U>G->voOSL<+D$*^H%^7Dt0GUFG0_&jE?xA@h6O0 zKt@sT!{5f^xH&WpC)rT3R|2E)5h5{{1YynyyP_kaOL&NL<NDSs|IN5-p2R0lKht64ba*lzI zdcyt%k0Tq@z8Ho09)Is!ClWJveTBW~sV8j6FLpzbQf=YttkOFr11nXis`kU|317H>G2t`iuJ7e_-wZ{3*Ufs=;g>E^=l zOsB}&U=7|>)x2TsOJS#VK)KsB*4h^GI%hnuFS7N@8Mph7fPzu$?B$z~Cy@WD9#rX@ zf^+=;aZ|5}-nER8Gm*~K^E<8gO%T@}#79RXfqB8C+rR~3IH{6fdB!`}Z1 z6=(%CPk@6sB!FRccSf&7rE(XXMj8iO7gyRJ@_IXOtq>vjjH*{Ba_nXAxP9+FZr9W9 zy|KAFod)p#^B+X~Mrp8^F3 z4N%3}&O7x~c!G%AZ>R^uF{@dZ!n>Cz){wZQv>AYAgF9__-)CAeki=%%?u>yQN*@wN zMb#Fb`Uf5U7Jf>FqvVnOHv|y$J*lW9B+!)BL+AxvNt{`5w@7e~C4QcUSjkHWg6}c^ zT;uv-A@YZ`U|vOxgy0<5|co_SyDQ|ViirpTQ#0s z_3d|~tQ+@gl14V+KbKfs{J}w3(uK3;=O+!t>CB(hMp&W}q6ozz1D4j*uW-IU3(>|Z zokI|kwW@x?Tn`$3q`9IR&7)D6)bZghci~|B&2`z?w#`t&NPc6n^X=#${(odQ-xdB9 ze5*waIJ#M8yXnwLc6l7nTE95vpyNRF(aPFlkN7_&@)O9%wukDq057%` z(lh|Yd{_?A>$5esEP?yu-W&j<6Err1E%%~}T1ja7C^?FK|C}%u+-;pdFrSdC7fWqE6-Re)`)Wd=;HzWw*d?@lHOLttv|pf=d&2W)yEj)L1RnRM+1R~tr<6*#0ieHy@mUHVE`z(&PZHjRN_<%QDd8 zx7iccoHVB8$UWBkx315RCTb3H{11u${Y$-2udKC-zV?wC0eE3}!u(e@cju-_apaCvubrJ_p;OynLFTdmT9 z@Y9el&)?4+vP-?}aZBBRCuT(K47IDJhM$_Oo0cp?m&Y|;4=8d#0<{`2CC7Zp^_ z^Ww;PPMVRU&&Nd#ox0MjV^;8;>QO$VE6$WLDgLpM%=M~1EZ9v(JMo^;l@^clwCY-* zO8jjAjdv{1L-Q#v$-o%GIC7H8d*7!ZqP$hl!O^;#I{HZhK}G@*nS#N;{uM`8_*c6- zdnV3aMzvDU9e4O1qf))l_<;^EBq06#JM^&333CQ#v8 zVy*V-KAsd{1y8_lyubc@#AW9)0v7z7PD2jJOCc{V4i3sxr4T{C1VF~f#PP7SbaZ-= zi4Uy&*)q0fF7+7V5>5sOG{RzEHt&5B?nYm^I{sq7bK6h@s%+@-!lnX9ZsP&GU_NI; zNY|qKLcZ`8lR5)^Q6{JT3Q!r~;o$;k7SG0$N~KI)@CLz)A+oXK87e7NpLKN}DOT&LWGTqX zXL5KS?$+nj^7M|=rs%oK*A=x4xbNyCgb<<7??;0eaVITJvcxtms%#9RStk2NWFS#7X0xn zVdIf*S~={OydGfDux~mfagB8X-Nra>cDQgZ4Zw_6u$C9Fudr<1fAyjGV(<*o{|+2%ED_SGVqFIpm@Q1Ri$`bNfl;~$YEgTRap1UPj&ZJT%imf68Gx(I{ zus1v{U8%sY4G!Kx;w)NCCUenz*3FnoLF?DYsjRC&IOIqEPF_T5|n$Myx^t;!c~?)1R|2A~|t_77zzj?0$L|8gB; z{N1;uy)O@dE|CB{s@eyjT$G|k)2{QdG&3t+q_6{BF_GIdXMhVpa;46J2r=c6UN8+B zuXE?-v4@)a;|i#>Q)Sx5^PjTD&4%&KsR6(PaxpG2Fh6?Ox)f75^bO8*-k# z^DeyGHeEe1;mohs?brK1r<|3dGv3c%&kkc$kLVZ}#mzt=b<;2+@_03*jCTb>u3pq{ zjAM|wJ4R0U0$WBhrG*b4q`S|Ur=AG$E7F@Pax|3{7LG1r&2O^RV`z(Se&DPg3bxVn z?PjUs)ZA0&-7O^y3Wtu$yb*Nx`{xhk(W69&t@vJYqG3Ww=w6xAZTfcjwlW6|5biw9 zL5vKkfZOe7Cb%?EG2s2mrLtdN3u1n1@&vZ)T~UnH4w4v87;h;XUK5%->dRw1?bFE4}{8iB~tmIDqtVLI6|_w{rhaQkQYn)0Xp2EV7difF5*st(h~fy7G`9g$3W4 z$Xkr6ZaZE!zfT0Io5xfk$TZ4m6ru^DCNH_dDIN2sQJS57@eyBoKH)eSl3}MEn#kmr zLR)8ouNF!oRF=ILr~+h0B@xONhYGT#sy7gm+do}HIP%XZ2xH7eBHE@eps7%#?iHsza&?c|)H z^uFcG2p}9wtOl~4k9?f9%h#_yu}qb!-|-@dKi@KQ3B50l)s zX?oX)fWd>OX}2 zw4gOyW?S@CdvuiOoH7UH*>jWapM#9O>8@!Zs}$!r_56cbiqf893`;H|pYFqzp2-b4 z5u)=Aq{X3+l{Z5ckOtn$@M)X1BpC<3tU`Yq82Wp*Ty9<6T&7^7Bt8FGDNW*7{%lgj zv}zrGw1It__~G6{qa&ukL4H)r_bR$5x&W*{>alrAX#Bb{Nj#>-*O6jGp2eLa%0UW2 z5{T+>{>XewN#3hR8Y5q=;iKY!za$~gJAi2rC2(Q{nF7IT-qhjwQ3&;X_Y&M|A5%!-o72I~sh&BMt4J*N{O_IaSzV^Pr6b92fKF^plu4fU-p@1=~V^`b9cvY@lh z_=!B)1nhp2Up7!?J5V$)$m{$q^ak=M{gL*7l%r9+XB{^O&N z?xy6|at-yS+;=W!WiR1!#yr6>&Qcn2^MXt1uAi~EgRFnlHxq6&kjW=&*8k#H8l{;) zRsJ61s2aST=tZpeEJeUA-U}rL6mbse&`lN=jB1X^>~CQe zbYEakv!tB6k|H{uC%?c6p15?J$}UZ?i%ine<6N`M`pbh%nQF3d?IIpk5?n(qO{CbI zf8Z*GvMN=$|A?9hQ20&rwtU^pG#d?slm?RGjyx< zSp_P)grR;LZZN@lCkfv2WTW>gpN`NZqpifI1H;MEXb!4;dq~r)RiR-`C>-n7(O7rU z(tE@vz%QHv0+SF^k8XBs(|kRG#gB5ryRhQJ+ME)t+N{Fy)vjNU37tvx+c*nHElP!) zLNg>3Alx)i^e#17jeqmJ6^{gWKBWHKMSoX*=RxTveSSx?u4=jP5mFFotUMR}!KHfAv6S5SP8|sc2Z3P? zDSYAqvYwIWMHA%2Fo7w7FCG9D$7f6+={5V$Gg2f-F&}#1>q~`*QiS_JD0V*gv%#pi z36muxq{oCPkP3zbc(t$@BcuOJHD^E$fZ{@Yh+o4#3Xo94 z!@~>7%xsH$#=dqFLMUVaKo_3Ubn-MvB|$|p>2J(I9T{yTF@?IS#*8$j71zGOYoB;r zS1|;Pkq;GB_z+~oI7kt5dnToF17+C}v@fmleu_ztlpZz`T!63b@Frh}8=DyBO6_{i z5b}lWE%Dvee{`eHBw%^J&3P-kbCV#0hz3Q5{IOP%K%+@!p$;-EuHHy575n$Lkml7= zsYNLQBtU{9=?n7|n)*m_T(vw<2t}*Wj_Rr^eWMN8NG}`C3~fq)Wz`?x1VUw%;*Oa^ zs}dY5q#*b@$+*xyi!t19dI1nbPUKHc-gwF zC^FV2x6o2)WLZkTq+eL6CR0=(nS)ltVVkg_sc#M!DH+ zigA4@i6ctd%&%)SdNrnF=CvMNPzOH|p}<)Y5D*#tnQ>%c;%JD_@U(K{#K*aprWUY4 zoJb9DU_j7228pO*NN@gs+qxDEgtADm>Yo zvf0vC8&Q1iPakJEDH2{+sZ9!yZbe&Qx}wD>7@{gZI8>ssOgNTJvEq}^JFSZS7`|eX zP=4ZuxhNE=S%wsB-)BfFAJ|ilrDH-OhRmJ!oiL&tOz1!;y@QNv$t2LgUTL{0?xq7u~GhxwW1Q z5z{C53Hlb7(ZCL~ejntg1W5@FI<#58G=CW+3TL@-4&{Jke4+CBlIh1+UvMgco|lhZ z&}KgH3njz?Bt*q0A@e`|?f&tX4{2VtAE=EI7Pi-Xl{MMD&?qE3z$nhi8A zUUFESfx?}X&#TVLYXeY=3V$^#JWM@DF#H$G{K)0F#_E)8lL6M}t?ym6$9u3QOUHj7 zll$HNi{e<*_dK5EJAMAt!`NZrb>ouH-A1au%YXs{2u!@F_9oi~wkcnp*($A^P)TAe zJB^>SpZWWazPQ6A{FIY#xZH8a-f??<(704mH+w-U&}g$Ll|U7tuWIBJh=?L6AtC5@ zOGG6b$JC@k3#Xu^gch>Dc<&zUPpgyK`RtjT ztaLjgR(SU*a*+M}t2Op|_GD2e?h*|ms(jJF5J<^_tI5kc@f_#2TnW*T-6!Si7BQm-~QH{so@q3p5wgCHj*>uIt-l90m${P3xb5*MZOF z0m7qr%=ASEiHIe@B7;#ocJIlD!DzgFknM;wH;DOs1_T!)K-D$C%*F?L&=WhgWFA-j zng)IyvR-x=wsX<5_E==svtNz~nM%GaHZFQT{9nZVWmHvR-#3a*I;FcCBn6}!7SbW0 zNF%9;)B*`f>5vZTkVZi129a(Mq`SL8dS5>GbMJTW^Wl6tW1RVcf-%q(_@H8gX2%3%w61dgcQm@Nu{Z{;fb;rmBVV2Kwr#0>2Bn3ee$6G^v|i7>+KCi zdaFY(M|tx^-LlB#f;%MwmtoTxfa&_w9ZCS)RDif^lWV4!LA9+nfU5o|@LZ%lx$o9B z^mq=cYnUW#N8_uwMXQX@K1+I>y~<4WC`u~ee3;88BqXE|EHnWuIPDTl=pQE6W#(H< zrjL7fsZb}^6Wg^-&~gBXB>{*E7+n`xo9s=T?tlWbxCWJ2qRZM*3?hn_Z%??JFC99w z4KX7#ePKM&+KpB$4E7W!@Qd@OwGt&BgczbFB_^G17+!SF$qo4rKf$)hs*bQk4lAYT ztzFJ_9Yj3X=!vQ_qAWBil(%s%Y81?q5FQHUmcv;5lsG=I$f1Zhda&X_m&Q{<{6wcDFO%b&g}(9a3-p`_ zSw`MM9+tDliO4_zBT68Ky<~bM@@s9*Wg!Z4UTDDAcXzL{rB>r`zpPC3#r(y%Yb)Ui z>a8h;nCoYvCPW@Kc*yHA>G2b9PtDv67q9X}@XYOAWio^&z|Fwb-( zeV4W#*Wp0;1$avgrO)V=5z&&9J93!=ibdJ$JCDisLC@A~pP6FgPj@Q~hj|Ci```(g+N}VDC4GGCTQSvW5FTd$)i#PqV`0iUZPuQaH66BaTlc})A^*7JHm zFFT^M1J>OE3tug1ePyjjE+k;%wqH478X1G8e*pqX(?lW^E&pFgr^^R7_;6 zYbHuv5eJ-@rre~WUL^R!ywR!7$kpx&>bYL)p62--)oD7h((7fYg44NUvgn5b21?SZ z%m;*f*a*J7kJ}xB)gF@yCZt8xIqmC|bb&2OkV_7+mh4hde>tfDn>Er;^LL6&2}jCZe+?!h1-~n zv~9@f@N-%^Yt+W%pW{p2<%SnL?=1$3MhB}W%rnoVwh3x&F_($WR2e+Gt=N_jq{6FB~ulzjO$=$umEo6r8; zzllM1tC6KSQaP74*AudG{Z7%rVR1nM2-$W_0?GKdnL{(jzty2Pf6nsh{m}vfgDwsp zOl@o^ptGGz>0N`A&9x2hS}!!H>FT19cl0@bfyR~lW*Pq1#rvaXN6^Nh6}!KSACCtR zBu?WRc4p?hmxBSUG~_vY-9o9Y>0&;k00UX_qG+z{eF<*9>Wy1p2Vb6wrGDr|>>oQ2!I;C3E-6v^ja}4sokc9}hX09&k>ZS(1eG8`jm=A7Bn&D+gl_~nZ zD}Qiy!}Fs2oU$cZbpJPRc`Nv-rx2CSrdxA1LVr0~mQ0tjKXW$=y5%^uk_6=Bqh;@R zXRJC|OTe z-Wb(Z*|N+9L#FFH)f~Fz#BnaTKi=-vG`QH1JSOILs^ck&i*=RBdD~}1%w3I)kK{0q=^bNKH!*k>O*u1;aW$~1GI*Y#-LeraG}Ko3r0JKMr2z*TCSJm&S$#ohxB0FqG>Cmp9bGD&vL)&9T!yq^VV zTaT5sZGh8Xl*)?AmkuV3QoY}b^A9Fa>F8Vl96;$)pfW1-VE`Ta>oRPdsSUU=CiZjU zZ%h}#T1?aSmYVoX{ot+dp|Z#p&E`RF_`IkkRoBf3}AKP3PkpUl!@a#;&QnO>GxJ*w_7C)U9@n!jlJnaD?iPHL$9r@Cx#JIB z*hq^}YRuPe9CGn2;Gc3Yw|6&8yS+^goPw0q)zU#T3LGmYo);L<)J>)rA&b{kmiIjP z!0A#xudl7)XUuU0-X~zN{LwBrfDkNjV=^HZvD#U~h`~3OWCv&!@55g{YB$awS{LSj zwYNiAV0>q)381VO{Tn7_v(c%klte_xkktLzVZItAR#~Trnw!0HR3o5zJl#7*QR)8d z<8$3AdF1xZ%ZJL%W&BIN8pY!5U72=)`fy6)6ETjDrVk4T_~3v>g@8_|Gc8b^v;i=V zJL~2TcaxbzY5YemlE=ryHMVzlbB(kC!NIk5(@nk^jel+;8b4panWt>3TXvrrV{r^`r-Haa23pA-+A_}SrWaI+-&C58PZ#Anp9%Q_LlmWIyU#DV$h zeZ7wGrn`I1;_D+faouIjqs}CgN91#@8s!I44>w7}R$es5-(LOei<(~b@sM!qE#zt6 zc(~XcUZ24JBESRsdcsd9lZ`~nXcXYvgT2~8d7n08w0(b$h@d})OnS=MYYrVgD znvZl;ou5LsGZpUvQ{45#zVLUS%t3>i&on@Q?XM6=r|tkS*>YJkkPi!x;B$Tgaq3sB z45u_7Mj=g$h>-Fy&p#}E1x`!g2pjl!gq7=dx32RvUIYXM;dnVLfgowqv*q98TSuI4 zPo#%z44R1BwWDdXY8KnVn6aE>f z)p046!uxK4iz{VerXlZ7QOmtm|EM`Diw1@64_OfiEHeNZNRx1FF|6ks9eoaIwixOy zt7fLAVnL3Mya+zgSXfwq6}HU4uzR-6pIT!}*qy{_@B&Ql9$jNRDZHS-KyP7}2I2EV zlMl7_lg~OhUxbwlZ~I57XNd314con&ydK}?S4k|_Z?uz(WBIIKZTms{Ymgb`RK81i z9`^3@g!jf?{Y$QtZLCc9m1O{QL6lZh?4h(*6Lz_FzH+jZGWnis7U(pS z$1lWVzr3=Jbg;Wl(l^G>$Jx(L!!6feQCWE&`GiTh!y2jTG->`tiB8K+88J}-z-fM`igK2f#OGAXXKYJfC{3d+t&Bi zKp_9EqF9*U8ib4%<#8Se$m_;U4!mq^Y*U0pL=?rvtVno>eMBx1y}9@>MQmYfsKbI! z)-l);k7YChP4Ns7Uzf;rQm-ihb5o9EHr^qAAYuNK3LqPAe(#+^|>_ zsLoS>8dt^n;>^aD=Z*R3YrU}ax5Vh^p~CEF8lV7N$}0*#C4c6!C1KJl7SEH<&)C@s zg@{?mmIlX)-Tf^UFHgaW+%RN**qj4}<9Lq*u~g>1hSv-TIksEh^7beu@VNV>2~;&N z4R8We5=%aA3#xcJcj*R1`*BNc7#ldMq%kU!{MH~(?Qh~EGH9J$;)R4|M&4ckG{(jxkZO7qs zSQW^XfWv8+!*7r=DJv=6-9_E4#EKmP)V1KtCbpeFMb)oYH^6yXOl0!IEbv4=oCpI4 zhrphOA%z!i7rr4RC0r;4%}r(9)1u*&y*giyi+W^K``TQ~>7UCaNzW2Lax}!d79SyozoF4gY;y6pOsP{B;$l9-rM`xJKyZ1yD$CF|1wo4>gw` z5il2iJr<8e%F_wEA^388pSF(nAe978RUDp|dlSpU$S5fD)o}(q8n#=Mw5*wCuy>GI2g@K&!n|^iQ%CM#d3_vz%yoHYyKkvN2a(iCBcr^G= zX4AvR6F{b+r63O%R9tt@-iiraoQ6Y<(o#P^zn@YFfuAynxwO_Mk}~ehAAZ^k0=U)w zMMBABjqSo&QFky38rogO?j*o&CUU>f+FO11rw{=GW}~;2ICsn|W-c`mU$)-ti?}b1 zEL#aJ=B5kHABp~|xV&%Qy8w{DRZ z*!A2R0Bt5=1t{`p9yA`hKD8SM80rttp25aT3=B+OV{~Zk4Z01B-5rXjALd67)yxHS{e8vR|KH z`q9(Ht#!PdrVa3>w?qv(psu_}r}NsJtJSd$W-cEUb8Rk9deFrDyuyeMaSzKyV*=;; zvoI2+<|vGLECFH{(fG+vr$%FB$gEnShI7~O= zQ}k-@T=eYJuOd0btbRG~(t%&;&gV{{iA zX3yjG>%q91Oo@-&tU|1ejQm_&^R1ia-5Q2J`WOOW&;i2$hYG-%b53hQ zuYc=F02fCD(+-Z|aKlKzUu=H(+5M;Np}}?dqo+OzE>D?{HU~awKiN*eE0BXh(Xp{B z8p9_y@DJ;MEho#lQUvH@rJ^Uwl8+{W)WCNQ*m1A1SzCnGFL3s4Ccn{FDbof72EHgF zXf++JFlzK^bT~FMwxfYUOI~LMv5CWw z>upt~dnJpiwagLPbK{Kkgam5*?T)3upr9=&D++x4PLa)|*jVIUxBYc%_~{7_mGIO3 z-_!Ta3oZ%;-@ktsc-N|5Wg)MlV=*~I-Qe2zm5v_@Fpu^5E+Y-r5!B|3M&n3Jum#?J|3YeH1!9bqg~5 zST#sGf>-whmD*JvYLnkfP;EwFKxiiAHILM{2sOMfyxkA!SNow}8p)m5)^_zRS4)QU zeQU9H&e#)coO!K1G_tIhc5AE~D^zpM^Q4J<4zYBiRwQ=%D`U4!*_7L12u?71gd+CW5eUMTne(nM z|JX1(1%~2_I#0ZVHM7JnMjN}hT;fx!KnQ->nAke%KH)d(3Oz;?Yg& z8~%(g3c~{TxLrob?PFU#Gi=CDeQxtu%>~ETbUWfc48|98uvq#65t4S+88=xgBQgF) z1{o>?Wwl4p^OzRp_%;RF;lJM98el4v>gPGVdDEjk+(Pv|IqT`_!g*gO52uE*dSCe| z2O7i6B2J&T>@+k0>DLKNnGEHn7MzaG5%7V?TA5zs>%o~v2di(3wkJwnc)?AUFslEH z1sLbRO5z0csBe~frS@+nms*Tx^yKJRSuYdt%|Cq-N4h>|2f`G931v)9-)~NGlml|+ z(2I@a=g;v!`YgH{SzDQ!njSqM`$$QMISV`f>Kb%ioRGhL)kC)HFk33-JyXBhoem!V z5!RzpEfMdjXqf{QP$Y3|eijuON#GG9)h;WCcD5^!Wl|o;s==dQvoiSOFp`qL;^iPk zgN)V7KY-DbBKX!&*D|9}yKzHezCjgaY+71Q78bDGmt0mu$q#q9Qg{A3$ z-Iy2{N=g{E5znfNUqDN>&8@Yz3q%mCN3Se1JPTr2Sh)W)JG+>YmR9k$zxKBj2p=yO z;JOHR;SqGeSP3PS9*=~gkL=^k=gGMymD_J0iRDOr3%3e8Iv7!&Dgv+SFHc0j0f&2_ z4@VvTIrPUT@w8c(G*tq6kjJIVH4-Z70zQWZ zq)A=qLBj6-=xuSMc0>4NYrL_YLhlen6&l{Tg{?$lMqM9733-QHpVl-_MXN#RlaL-)3C!{y)B1Q^%+-%F8aoNi-rTfwFe((NXV9&n&*e>l_<3U~PtxgFYs|#xs_S1W;6voonRz3H)_?NNu=&Gj;^7=x94I!LY=M*eVzAIo)SjD9h=TsL7 z9d5=aq~1S%wK;53_pKVzY4JtbrfkWPu#mBUI5a0Ll1zZQJU#99!~ zNuIUyt|*py4*vK#!$EteielTBPEDQUXB)2v%ue_jkgW6)nVo{3U?m3*oV-fxuK3c) z*~Qs~S1rjxX^{ALDdxf69j0AsXNZa&tu(XJD9BJ8s$;K!u6VQ8D2dR6jSt}YP;9Ez&R||Bi55f zpQX{X*v`-43#_Zm xM0}L!cC1;-F4{Zn2x`OCU{pM+Yf%R79Z0o}hH#aw1Rp-#U zDG*(md=T+=Y){66`1mVfPD;n;z$@hKHqITq)qRB{kw=SZ?<~3UdLEFL$?=yBOZ5}v zf}^%f`uJXK>H_4k4R26tZC~{F@$o9TP=ytaYt(CFSD5^>jMk;518!!KL#52tsOopj zOf(`doAqDtUV;-k5m4=fg}1&&SvQGX7(wV5ICh}?2hxG9%bK7g^YQQ|`v(NCVqa1h zupR&l-Wjwyjs+wbS2xoecP1RE?jK=;>*>As`8SXvQrk7UfaZzyP)4ai0g2=F!3}lm z;p{^PBQ8SQKJ`qQUhQ(;s22`POwZi9I z?Ck9o-v$k8-NiGyK2sPjZ(Ta?UJqaarNE84n%V`YgSkM!3=Cfdx)?Y(IM=3qRX5jj zl=%2R98X_%y#nqu^OFoKNSBL3ug8KJpS60agj>DN&c3;zebwTmwrimOhPgnkBr#4Z z<jbb zo{=}|3>T*<(emv4g`)g|0!Xnm*DHO+Ae7ph-_7VdCdOr^NtST^d9<0)@MHOruCQ}7 z>y|RA4JcfKzEz9hPASdh90r6%!gc!g`$Jpy>`e7V>v#Q$z8ofh>DfQEoW>0&V6oxH z;6tXf?unhB#AVDTF=2Bo{fJ%hIewzJVt6t4%*KD`>KQVkLkw}8)@Gm*#U~2p3@o*+ z1HD#kD4a$7_&FsFe0B0fEZtg@esS&r@O8JxTFG@pyvWIu?V*KowX+!p81b|2Z=2Oi z5F&-Bp=hf92Umpc#qRiBmYgGM%NZAKG287NYqKGb$LZ#MI?J}*WN@wfT@>j80Xc`= zz`_G!0^yB1v*~!7ol;{FN4?0|Tn$te9uyD)4VcS9%2o8%>yZ3Q-2C2{i!2>PdK;U* z`MbD66V}g6B4{jf#K|m%Cwf}F&kT8}wuzKKMerXNDjljgDcogazli4~3JD1f_CrFn zxkJOpaQY82SiR)64;*?d>AzOuzzKBTHEee=5~Bk{DOV>$`c=deQkqV zuYsLscu42k-OzBLW`EIsrlQnig8iRb%WPx!8F^*sR#(uucC5D5u)$Q*+c>|wkG1x* z9zSy|?VI`EO1By#pKV*iANI!0%yPtB_nufU$kP3zV~-J+$bIs+KU_-Hy=eIQ^O4Ks z`>9ve%IjNOg=z*Z5@~Kvi(Agd&aU9o<*t{TCKOj)2CHHp-k_la=71VdO?>jfxw)Zw zfkNo*OhF|`-HyR|M=A8a`6th^#eRwah)`HnQ^u;{Hz2U$G^t00Iv7Zgat=oB|A2De z!_2Pz`L36}X0-KaEU^sDFbGj@C*GO;3yWGqS~D{c+P?mxQ7kmx?+2}?g*s+7;X<>k zlX4uNnqD;_MCl(n^4*`wdA+*ka0}FHPxp#naI{LAxxrwLP@!(EI;a=$7+0*c2V#L5 zPGCR)_SWRP`<%Q`g(xEtiGR{YKwL%i-9I`FNY?XC(v8HpUR7}l3y1JhozH}4dJDSt zb!TpDti3GMJOJ7MPS*R+V7Kb%>f+REaGE*Ot9N$?Cu&`*PbPP|=oYGr4J*{f#Z|^; zsRx+83N0t?-|Df9X;0N*unuY?(ThErHp=f-pLYnmK4;XL_F7j;X=rFfg+|&foaJXo z99;CWV?h3ghomGVH5Su5px_Id8K7LvrNs$U4Hqt3ZtmklfqBw)IxonI`UT&Q{VgdM zG79|(9kugE4QJFk^p3rFT=Wlqn|o>XZ1yF9)P_8}5V zO1SRikaoc!I!@yF!QbOJQXV6lncSF%Kv35=Zty(6!XgdWwbjvC12q*M~i3b=b zfSQVof~GX%i|!kNQ7vQjH0h%q`O(@4zcezpPuQi>5DtmkD1WBKeh5R*KHu2@_3he1 zQCwk>Jk-(AMMhrez)o)5q2xg2lO#RJLJlcXcc}D?bE?Iu3{hdS@BJ9gN{gW!NWfKy6n0(#|zx)pdUK zu>jZmi>5$GvsS$nr?&d)*m~RbXa%mJdNo;)Iq*fh$<3|&jo@5V0Rw}fW4YuXHv^s4bRGXmgj3-qf~l(;gTjj(baDja)IyP z%#ZfXVN1|i>2A8;0hVCh5vgRLmi1kxnU%&19ZC^;e{x2M%cECw63#Oj92_k4er&3s z0tCOgVF0R~7Txz~0QYVBHojfUza>!R&+PMRuE+9yzJ|m1nHX zP@*}l65YHVapxtHH?s*I3Z;u~Ew*6J=o4w>Fr58B}_o_0yRT z#Zz!LiKstu=62V!EeGddQqYGoMMF@{`-1#@d6@jG!~(Ociu-p?MkDr1BZ7cyOEY!I zv$MEVE{(urgM@_S|Dd6$s@in^$KWAn2rJOzLdb0Pf)@Dp%vW|B<*6jiv_33V5SJXb zRPMSgTcP1H-#1tve(LN$JY3wI`FLZ`z`}A3FeTPQ_qXY_&y09dJU-Vs9FP5qlKQBS z6bYidG%;82h1*W>FMue(fMR3gbW8QbZm$YX8b2Jhwb)1blxqin5Y7A2ed54!I}#B6 z)w4d{Fu#|C0poR73|THMy)O%fPez8)yxe{_msExy6A_V=1N0p+nvhf?jv`V@1_2Th z8NH4?TuREbW(es_ZZyG~57#RBBFEbCBJsB&_4DAmr0v9Uth~*v6fE78_=oSYS=%%^ z9HsMD`g^L_ZH@xY8o!c@Xx-tAbnd5>crisN7X_c%Em|2@M9UZASJ`&>%3JB2{#+h(MNntO%Motd!}E%&X!5s)YtMSyM2)R&+sDob976k zX9&D^`VD{=FTdTN3?#!r4a&>IrS)cLclFW3;6~~0ANxHAgVZ5v`$lf+d!f-<-Ahtq z8bBTO^chZUMFB96VX3>nxAH2W??Mh*WM3&Mv75?;7&g|{BB>wl-@iAQyu^wgc{8;X zRP$cH`Fto>=vfQVzaA@1lqI3kG?a{vIhMTLL)`SW=4)F_2>N*oiToM)PP!-L!SbO2 z;qnAKt&J1CjsIjYy&aN9O>{R}d%}{pT&Hf}VQgm@l+hcta2<)QhZJ9QgcRaD#L(kO z@aga05&m)l!Uv>8bDk|btbK!$sE_gsPm0P)_}S_?Gei!u&pVVp)nWRKovAXRIgWWb=tZjpN)#P2oMV*v zX7~}Zt+TM2)!pVZFti{#7k2jzm-9xC5sx4YH)d6tSbyrm9Lo)Iy0}=Naa*Cq;f0rY z+7Zsx)R)G4rz!t+95|jVD)VJ26u4xr%__yU@NZxol0|kFJC}&zkw6-W*D&7spmpv= zgZQo3_Ax1Gn){XW2A_IoXT5g9R-v%`Fme>3Y}!fV8dXA8p?0pt<_0o~J7*U(D$5}# zDB2eNucisAn&rnyqCylNR!32C%E}bJiV89eB44wpLVD^A@}w;ynbzforCGah0{F4@-HHt|vGep`B` zSj}ZeebwZ?86t^_VH^#Nt*b4oHyQ^Tqx_n~#h!v4hp1&C-O}ysXq!s#5T;Ol54JQK zKYZ{!ASyFG!VL(O;D1t=A&vFi>e>`$Xf=T*4eOUJ({76UgYApX+LkdELdQ`$T43CCe(y zGHOPqT$S1QnR&O#y;G*iJD2O ztXN=Me#*%H-RgZ%CtlKM8R6Gg{#YGvQ}*q}E0WMTdMIQFm*hW#i#mxFltF&Gx-^2q zFl1?k2SqCfI*FUJDZAlsJ^KEV@YeJ3{6qs$&!z7y>SV}*k~AK~iLI&&v*hn+yZ+*& zFDDetCf(8NW4({FcCzZORaA*t(J`@LG&|tKf9TWEOhJ`?#ZdRg8bM$09{DnCCHF*+ zNT!wRwSObLJXJy6@~H`7dZ?&=Ql9M1?YOp&KW3Kofpw^%Mr5%g9eXRUW%eZX^ZEKM z@*KAl5mtONMHpMZFdhRE6J2D^8?k@j5O5hi8_)uIopb+ZPcluLiJ=K*CRk3|2&*GcrP_eEbH!sK#upVubZ z^y+V}1muneglHA4Q=RdUF`Y{4>pNTsbbxBqzk<|^=~nVjDV)yx>+A3TJMiE|7a@*h z`ai$%KR>fH+eY}o`Sjn*Ulu`b_}}9H?}dqi4JOKlwNXpRs#wK#$T}oMg4)ayy@}!Ql-`2GYwNm*a8r zO$5URtZZQ&Ibix8?#z{J$Sq>R%QAVIkoW{u(iN@AzIf3|sd6GL=5YMn%ULb@<`u;j z&J~XkBBZ}EYJol85X!RU5hhG}%8;2Ehc3L`t@DkE!5mvj!YM*t9)|qnUw!o7mG!-S zq*4}PNCW}Ti4IwsK|KIn8v7h487@06_7TTeH6nDMQ<|peQPtE_c;~5f9ES*#Z~mL> zC$Sc2Ol~L$?$3GE{kF;LQ}O+#Uh&f%IIvI>OZ;9#7$qkshkkgD8xEm-jyYqYbH+tB zBWCVjhP6#pLu`{oz4X}LRTI`hl2j<<3i9OH@yB~&!aH1a1DLd~xOkRe6M z?sdI-3%1aNjPm`I@>wSXnzQuiQ|i;05v3CyA@?(ukQ6!52t1^79yQ(ht@YOsavL6= zpJsaWUa}ZxGWv_)v^1QK<`){Nf1BGkU?JF{v*5H?jI;Ugl&gEarI+nHSU)I&F&gnD zx_a%NAn+DBORy^q%i|fuR*$n9L5P5eIq~bYT@QpHJej8AXQ8_=fC(kDa2iIgq$Pa5 zdxf;A&J*E?m+FX<#tWJG!k|JT8W$1QB8?UHA*2#(vy`j1t_U6uqx=krPR}gcM08VV zkn^qQe1Z-f$*rkmG#3$>TKh-&%TU;bWD?E!p`+z42ugcP5&z(6G$_D$krDmz6K5vM zx*hjHj`dt;cAj5uCgJfH_feO(v^%};(xby!2|EdMW1#oVK=3NjaY67ud&OT`|7`0(ME9COkEAgo_UoSHWUSxD^9^-d{LoCdmH`*LlW)VaYhdyP~u_oZ^j;613FUkB3LL ziryzUQK=#kH%1FNY^U|;BpFAaM2(ExDq%r%tFk}f9(0%0k%b+aTR@T$9cSs+DY(#GTM1?e^IYMcqCEDyNjO;zq$sZQmc&mdF7YBQ?nB4VTsP7cSidICO{$iF)d z*NwFl`F~^@Ih|-}RqlKXdzHFnrIPzL#pFh$@aiV`O-bnFR&b(Zv8%2-WUegPWs-%H z_~n@BnCM{0D!bRTDAeQ2lXB6+iVR{b@UF)Ahw3BdexwbGveN2`XqFlU#}CNC4AFf< z5-sWFf}}g}LSn2UD-0Z|Cylbwa@HKZcNxjzoF}ni8Du$G4EGYklVNJj>tPe8VqQ*sNbxI42igCgIOp> zZaAQzxbCx`Vy;t`3uVdm@>=J7=K!7&O;Id+V+J9s-RMWE3|tAhXKkE!o`_rI+vV6U zRJkjcT8>N%sk5SyxSjThJtt0ZZEdZuU%$Tc9;*27W*tZjKo+0Lg^nBd#X2@YhZdlu z7e@2UX9a7CJYT$gdGWnFV|#LQq2|3^Z*OmNqxC~D4b@b&Hd?0D+wJYku=U*`uV7rN)%mKfW&t!KO!H1tqUS;2AX0BL9CnZ_K zGvecksHm{9L8I8I;$QucGaR8WgdcAP1=yvp*1Z2%f1e!~qDb{rNG>Q|0l9-re?V6A zwIjF3Ggx6xLI<;!5Fyi`y;ohdudwc84m@gC$)yf1tI+1U)D4ke7pVhB1CBgKJexxRoo~Zfy$WB)AvG z_2tinJKCl^`O4RF2dyXGbN1Qqo<63N z%#eiN;7Set{p){Afj7#}({#~&j}$JMiBCdttvltg{_hUj1sWO@QX7W?zy5PxIOJ%K z@IxWtpUE#q=%Ai~fm^$qD8j`DHYTQyVAvI%urS~xc~~kZUE5FpC2gsrTNqcm?XV^Y-V?G;5OhZOUt0L}Gh;G_W z&Xi+0HOlloix950W2^%4PZzC$*3SMV3 z3ztK$!0M+}K4K!4$=SRzM7*iAxCj$MUPmesbFFPBDjpF>J9rYN;v9=+e?gkSduU18 z0^s}QaN5XX21Ved*dAiaVFq*_N$}_uDo1tq4;f#G@GY#YP*70Z#c8^pJblWD zUCmcpdaqthsePsh8?LQ-bI~@!TH|#o_wy`*_u?<3+Ws5tueq|i_XR8k0mNJk zAHX*v%PGr67?T(tJu6H5yXc5Wg^&{SS?>C(Qi zAjO|fi&IP}8neQi7L1!FU-ug66__Z+AB5yD6k}<;#;S+kvcO~Bp!WNr;}QQvUZINl zSWj@BdqNsNTb(!-8Vz=ChO(Ec6`c5}`2_2X!awc!XusyXho#vr*|qTKPGQu=+b*gN z+c@yo!;Z9@>_(;AZOC#Y)v0gWK3JfA5mK%Fl05|q9+#+>vXYjvqIk$hi z?C_j)M|5=bw>{3|^Mw}w2IrlTR(p-(^XljJ2yMHJL8MC~ZoMP{%bzX{~|ShZQEpL@}vgRTso8PZ}A!Wr6U7Wo={| zcOnfUrocEuY8|W%XD%IcTt1m$+ulJc1<4iq~LS&bx>PN0|nSRux$xnX+5`G~^pu1+jxfrl5Z#4aF=0FsDN zo!j;ewG_Q9=#gTR&-n~(hX3(7|2()4`m$bbTT3g;%Q?r1rHfpK6)S+M_k(vdU3B5k ze&o=~Ip2rd8_?(&Ocm5?vVEbftX!Icp&`!4#KO|x`hcdb{Ts^CZAH^x9J`$^pdr5d zrgt-ulgFX0t?i-$_4M@I+Fmprwmk5Pi4}mRCcxJe>E~5MRl};B&XWLJ7-?&a)a|#>vHN|T3RZF00532q^cQoDwCMj|4$MplP&u?+Zxod;;A50k=R_}yYH+#$(HRvd1F7WYHgg`NlspB7#d}k9adwaMm5IA2LrJ&Pk zz(TV_fFd1r=_fV})xXIx8?SN&M?OV_YE7xrU}(z!zz<-}p8C~KMD%IA*KdwF)^d_v z`BA(9ohYiKG|Q=I-H9Q3i@#ZL6mqV12a>~5Vf)y~GRCJnzbqUltEDHj>T`K-9^0@O z(6iGjtYnpBhISCLrDNACUaCW?+=Pl4Ay}vJN`^e2;8@PVg^4OhJUZCgLz)Yg&Smt7 zrhKyuTlc;lwh3FT`V43ms+=_kWA&JwPv<{sB=ZO6_PpJlaCReU5R0bBjF(AxT=>mF z;}yS&(+@p0ub&@m^hzERLX7nu6;1(GF0!U_vgc2f@Lz_6rlHHYy>b#D)tbJ<@D=7| z!dd#k$utAFFZXAhLPC=TV-WNt2qiA<_Pg73u|g0|WLShDunfz^%}?YussK0^#0A-8 zJw2YLr^Nt6KP-L~(!Ht&dSyMMtCAUf$3JE6W^3Q^1IRy!`hXRO#+1nI#3bCwiI)08 z8ibM&dZ&E+d?ua;O3mJuiLtJU+r8Ji;GL`2{1x{VMUUvy*K(A7it5DB+!Xz z6`l8<^}X@9+m!Md_#(o?#bxyHq2^M`C%3>FdvB6MM8M_G-W8CX^FE$tUHJcC4e?Pt zIqn$+o!0t?mW6{v=!yFdYwN+Zn44*9j(j+$Vbg6wjCsC#2Hv)jf#-A>kJX^jNUO=P z&5IHsk+~N~4hPJcKY7|8p;t}L>noNVVy?D6a`Q8dm$x;}SH*=rijFUSCjM&xfuaZv z5sAl#y}zN2A1@|NKF+}lE?jOaU;W=uZqWEbf&LfGeSk{HqSkw;|NjL8e*RXk%rF^{ zB_Ig2qJ}H?9SIktoP~b?k{5vA1(R}I>>ODG`mdeM_|aZHTqUXe&zbFruXk;2>x2(r zX^LB@?oXnKz;zI%iF&!7PRH~`%_K9pieq9JDy>oP%UR)!+sf@1Fwe$iIAyhl#Wn1F zkJZbyPeEo?GqMoGSF=V(m&p}F%j;E|hB-Y>;z+O5{lKqW#3FLV_jED7%GZ!^WXM}f z8A0CC53WTn0E5V#_KQMtlNl8=#iF^>_%@V^%?r25AtzYOk}->i>oGs6(h57Cx`JiQ z1*h{d%YG!=W2qoJFE|#_iBgcC=$JYEep6JJ4qTFj{}Z78g@UOPgDnUpK?R^0y{8Eq2Ut z9W(5ctwG|ZrWwQEN1)^8ex})1-Z~9dL}+hZ*NbnOIFLBayY}42*2C$b>8;;n zYnl3zD_GJ^3VQm^Lt9yS2N=>^)^hO--#hG_m8Fa6gq3SPk$CsJxU=oX14;UKD&^t* zd2Q9%nXa)X3mY3c6iF@h<7RRZ@`X#nFK!L=1wa1HmVrk8cA-Mw!F&^IbdCsN!+}7@ zro2_K$?ezy685?t0OV6B>;FN6q5k+XR}udq5jy%0w-46IHTEio%A0+PtTyE;;X;;^H>bDJgxd72WM zpyo~>H}hv@7yRk75NWrUh#|sEy?gz=#CqiwuKvtqo=)X zl;l8#l_B{(I!Suobp2ZkALR?7sC5(O2YzPaw|>g?2-nHGFXucJWbm*J15M~X&X?aI z*$By=g|2Xr*%2ZRMEk4ooQf0`Z->e{bWrV&Z_f-G;A@8a8*1{eq>-`LKO%ZW=)tKy z_BC3n`jo3EaK&(gou0wS5#hP|qM2&l#MRQgqy68-i>0Nde(o320fo8<3=307LHmmj z=qN3L?d|QwI-$VEZMtl}6~q|4JVLkt%Q<%Uk%Yht=)HFK=URQHfB>#Z#<)mJS=r{) zN@zRrxwpND-+D=lqLSMFY)QAJ^>V&6pi!8cL+QI#LuF?3a=!Z_i&@zFjf@NdnpBhD z=1-RW4gqf@Bg9As9voWu97{DPj4FEj4J*B~qthwZ{*ywg-S{dtk=)pq&M;b5%kOb& z_(Z+2IWgvSnEA0ps$sqhk8u#t>)r_t5YOhTG9hOlS4L?aI~%8;&ApczY4<2S zByR6#o7_LL?;R=N6NH{@S8Sh~K1WDvqWc}_#_Eq>pR|&HSftH?m={@a5Z9CVOQ~ou zV%n5Z&RQ`XL!uAuepz)AYq>LwnVDJ6&psPa*ma*pU|^mAh);=XvKHX=xmk9kA{ekR z7XYV?x&4UI55UNcpR5(0x?1zsS=70o=#SX55>z9Z5hv1bj2_ zK7j2{Y`j(8=<@mL^gnG4|J^{4EO`RLU9!EP{a}CpshfC+A94IG9x?g9Sx`bL^zgbI7oPyb%XpVLyJ6iR_~{I&XQ;>Fy4t8v*GQkdPGVRJyz2fGE->b!enJ4sfVLe2d@n&O7t{@y$Hn z`^-CYX7)aN*4nYwz1O>_pb#+2SS`O&k_(u0oH`y$^hu&SD&yh$MbUg!%V^KI^Dd7jE~oV7w~aWANO@f zRp_+Ie5nLE!rYp#d7WrjgoSBhVd_#+biF<&hx2D5_kgOA5amvf-AUbDtXjlKBK%SoGqQ8bxztoR6?_lZfI}Si5B|@E(hQ$g415t~72sZhH<;1tm1mM-mWbvr6+`e(Wh&uf3 z#}w!yFwxY{#d&n0yC?z6^M%v#tx|K84J`$=$*WA5YT2Qx>rK%wzA(4sv>^&%x~dW# z`RRF-5JOzOKU5Q;14MG=EitJ}{k6;{LvbU`F0oKn>!+4JIVz^#DF*3*&r0h!ogLNxly4q;w{XHEUZl9`WxtE1HI>yzB zK3ng8bzT#@{?G#pQ$)(w_Oz+*3&(}&$1A-St)GFC{c=D^_c_k7H5bUh!!XE)Ky(?u z>AHeDlIK-KXbGPyb4tWR<`BdY&{5{KCOSC@NA@l2*vkudXAZont`Fv z@qiqJEuhOLC7o23RZ0r%;&7hRQj6!5+9c}Su;N5e|uo1Z^S z6m~7lwH`t6hC;530k%&0dJBi<{KTop*?iKYf#bgxTlw1moLO^e?o$ zwj~UvQJL{lxo6bWZJnK>T+ja$wd!4|r+$C4*OS1$C_S%cx`Xota~+c^;|0DnO)O6l zz62WfJib#CRbVdvg{n%@)B6y!=Vsz!DGH+z28=PGE~pU$lVp2ljYi({{x+5E(Ywdj{pzERvFRsY z6!5s{NQhpHAkAp97>Y{RsF zkCTXuuve6S`e}_&VraNEWZKhHLIaxmE2sRPy(858cQFt3BC+?dp`m=jOQ+Q-cwWCY zOrdZeN9WS4%MJvhr=r&OZ`uc`1@7|oJ~@9{Y*-_uW3>sQ`!~BefQ*shYs@f6Ko2b` zA>ljS$@Q{XA@Vzcw!^`Q+h8*`8}wAF!n;LMQp(|WsQ??O>ddyifxzuxYtnT+{UT2; z;Z9G))^h3tR;!y<#uU4ajXLfE-Ph~DlNHWEX0>MRU{NVje1-TZ;#L;#2bf*8m4cU&9+W43EhpTyMFX5z$p z5@fDiE18UE)6bU(Zv?bq|Eu#}khdKLV!FHUVEFpl&Oyh@3NZ2AuP_iHlW;L_6l30F*x3pzwGThi`t;x269T7#~0!urIN=W)A{5^Yrr7` z1|}wnu*o^P`fHM#?M+b^PFfC|zzJ=37J(YVPwSOv^`Jt#ZEL+b3s)%d-F^`5stvu<4 z@Lck9QA3(5E)q$jUD>J~*BM>Ccxiplt6Yw@4FGYd@%V8)Tu!n%eF-^&>U*sif9SS;#H z7#uR)L^Vl-@xK&#_sPU54T&AO^5DG+>c!+jwI@f>Zcb^Ij+?m8nDJHSJ+Fz05UT8j z*q}m-E!D?J&ihi!a1C2|n(Z=zaDi=%;*iW9>xZHNagz@N(NMFgc;8e4@}Lezz<@Yf zfR>g;qPgx(8dBs_<;aNp!ZRM1{VNb5~`z+pE!%Y6$=yi(J@@#iaR=T3#a5(H&@-0auAQ2Xg70^dfxIhJjl9N5QmT9RX zKfm0k2^ED7N>ec+*+b^mS@C79%#5-V1m{1=<%V50u4_Obt0qFtQO)Tsk53{fS5exn zQbZRGyV-xxH)LGKYm-2_Swnk0_}m%t$F!K=+DJ8b*2m$_oA!P@3D#ix8K81Oq^UsE ze@1nZS*k!XoRIMd&j9|h??Y@~8gAnOQ@DSGU^Y2^*YhD3OjdQv@SgSD;@2gru8&d| zg$P?Tg&tjbR=KM>n}7GixkhSehkJh)L`xbputc5cCKJFAw>3pIlO>YgVtjaGLwfJM zfXluRm65A&H1kIW`Rkef;p@B{VuM!zg%u``={60oxI^!N^Mqd^bbF>}en*Ztyu}R< z4{um__DyTjRqUPW@XgYpPG(_P56B_noaP-U6qtdTBpE*x^}-GD=+D{`QF3OJtpG>D z0r?Z?p`3wOn_&@?KIGdyKS+RVDn0JEgHxol812Q6i07QX!2uWCCpj-K-V7?eCxW~c z-xRY{HGBNz@3-Tx1|6ua44+q`HlJfz)tu}+>iKxDE{Siv=_%w|OV;nnWtxe_ku7Kjl9e@Xy?*4#pAgk6A1(2|g~e6(1EZ*Y2ftzK74AA2Aj_ z!WEa9rAmY*{&BKux7ZKklp zoOfI0yb_07Tcvsn{0BkqfVI9z~fLUCusanh@cCLA9~nD@pmisFcpg zrpnBc3XkR0D;{3n5RPL%q~%guoAAbfKDYhl?#ams$m|Zi9IfFSFS&Ln{l^mC9&P}} zDb@p}EMZF*QoFu^zK1x~LLD8QVg&}PtZZyu$rYqzHePgC&P5p|qbkq6=y*3ByrkO3 zJ6PzNHoxZlLJj15;G{u>U}1+IQ8AQ9_!v-k$o|Cj)ArzTYqGzLmRpr^#qk{{GOqJV z6mfb|Z`Cf)Dhf)I+&d}SZd5eQ-XLrYA2)Lw3{aCyR}vN z_{&U^4JpiH54v_LnCY|Om-~VCmk(x4VsksXgj2`q1bH51+dhvg;B;shDShWUM#_#+ zlRiRhXs2mn9{D|?#L{NWFx8El*Ls?sQbK)%y{rsAnglJe+z!b)(h)wM37+vW9%J%H zPH<5^lZK`$kaI8CmpWbdbv>hzoqs~SXCz$nm~Da%WnjdPK4Dr5e54}{w$f?N=det% zl)nf}Zmz01I?A?*>MO03oA_X1!~Kki2&ivy6Mo|vKp>Dc>P*JK2)P_>EXqemtoc z;M%I9)NDzXZ4vNElkBau`dn)ttop_JwH~=TJn>}g_uQ=K4sNo8oao%jPKpQm+@%GJ zrSo0C3h?8sh&QathiD< zTF2h`Nvv(ey@1p4f@HDEOx53%LW3zmrJqv9zPZRrJmbofr~Sqz{gQrw)vk}Sc)Agm zFUTSDO!g+S%wa9yK*JD+j;WQ1MP16Sybr$-B$8NCJNXDP~i>V{T0Ozv%K4W!{`M0P9P8!)a8Gw zF$CUU*45NZ=y+@8EBsFZGqj-Z#l?M|2*DSb=9ZSWbu*K&f6geEKVef-Q zjFXd-t1Ay|wx4q3>-C zp+*?^<86cWF$GbreBT>OrC9Mu)^8{D30Aw4Y(9{r(DsYSD=4s3j(w~gYCBWd+?ngOq8#(pY#_yI_w99eV+MM) z$n9%Q3@1bBENlve6!wF(($0vu3aaVodHd#CmlIEqIU&aL3t);HIxAWW7l{Jl-Qng%&w0&r) zDke0h^@Sqh@k~SyaBe-FPNKNl*okT0AyshGPr?^o=uWm;A|eZt_Joqt9XB%c+!}KY zT9EIDY?*PaY+dsmFY>2Y^IN8DG@edQpA{h;!nP*F^h;*bl930Rq5Vv@QTn&XqYM|! zu7=Rp4d0F;4wU_B_Trs(BK5rovj}bVW_Lg74=(&(Im3D8ZQ9^eGbux7Sh<^vw>-_~ zx6r(yeNmM`(B*-;?HW?rdK64Cx*GGhy7W{6!)Z3`kfZ^Td3t`CzdkwKx>IzZoXPlf zatM!7!oujH({m?MIrI^RC+Pe`R=?loJhlzF{?+@z)&xhYUOro=S-3nI>E9{a7NL9> zvlLuLo|eY)m!8wq^-DpF2R>h{e3)9?)v^S;5OxPJI_8S2Ulnm~yTjE&FSFX6Y_}OZ(NEU*6%iHcl%sN()FbOgvX&OhQ3ResH=`#d`)+hu;x8%mV^_% zUwabXK5)Ac?JIq(&@T~uIoM2n8N?PdT_pYb9%qmlSMPIK#$?{ta(;6;CC1(&!;~D9 z&b(pK+wXT*9|Y|^S=Dh44Z07#y->Ki?|x!@qno`od1qe9v1UFt^l2AJuTn4jE13Q$ z5zAu9pTevR!WKKfD_{UDwl1!!xVr>b6%VMZkNOpd8#>1W(T(R!N?4-wT>Fiile8yr zqH(7EOSfD+k0$nP667%8z18qEw+#In#zALeefmf^Mq`uprNyynOa*i?y z$JqSHDDEgr^)4yBYXd!(&Vhk6j<>sql|(mCEsL`kGF*1tG`ZkAAJfe<6u49%gN-RMqXp$UURgdfeXPzVA^o5? zCKPwK)z^PAHW`mHSdR8m3XN7zK9f_M2r)2=Wc74h{J44*k;g;oo_TFH4@VZ9@G;ll z>MRWO`cjKu@17_+j`GcJDLfa^++5pwHaV@0!C|Me0Y<3u1DI-#7A9qOPT;Pw>xY+3 zC7wh~?i54e7zn;uo7hw+wID))gdinF|7K`Ink{kCpiu|9dTpGYBY=wTp*xvhHg+JG zn&h=^QgH|wD~p@2cWAw7jvtexC{xVj7WlbsB#t3l-BwX{_xjt^Hvgi3nCWY}0dD%@ zvT@ck&CP4{F}81PZhkl2wdddH&0s|kJ=pw7!Z@%|j|&m+g2kEsU(jh|>zH(YkwWG7 z1zpCPeAW4=l9oMmNJM zc=PNRvv~HUjuo~41_kFXETM2f1u!Tr6!+TMIQSULMrwbAkXd#ujzbaHC_e~+nD52noCJEBVIAXloJmsAFDsqDpyqMW#D8Pfy%dB)RE%OshdVuall%NyigN$AWJzjUX^v=b2!KUtqw0t)S1u6Y0 z24$`58buRZHgAg`hH-zzO}s5Hkz_KmVLOupc}2TrfpO)z9j46kxjgtT`QD3 zq{=WbYNB#ZYPlBO{BCedGsGnsr=RjTaii$v$Y3D;yD^=oK6@>DAs$BI_ge6E8*&?) zUjH2J(;h*Wn$t9Gdp)^Zv5mR%u1bj}Fk15jy)hy%cPr8lVN%W+@|5sW_#ZcYq44ok zC`ihW-fOaO@rwU#Zi9Y0)<34HU&3|0SIJFP-~Tc9s&Bg){Jb(=Q;oCzI?b}svqFS? z9dii3gazU+UdMm&ZTo3wYoF29T3l}$dv-yUcH0XH_zD&Z{PNCTOJ6JY4v#*NQ7roY zUarDrS#SgM%8C{)Us6*+G>yP8y|K2ny`9bLhi(s> zgc@10_gjdEHG5tEY&a{`;dJOmVV0-Hpvrl_ zyB!-5#c`upQ6(`~IIA%O{bPtNq@%~))_Ew=tyME3D3}K6vKQIMRBIvjGtNLCyj%wh zX?C6+8!~bqofw~SHAL+$(FopRnYZ5_(L299*vIRaB_m#qEsc$ZuJr^n zxqt9|se?jrw_gT>#>@b3>U3X__GG#$bm;J%_-Mp&h|ozNZ^?u0?UViTRIU1Z5N+V> zL()yQ2>ANO3X5&GVRlN3uKeC7u_|NtiY!^_@(A1DaLSB@!@1p#XnSaOalNmgvc5iZ z$xdQx`vGusFph5RgOZ|i(+>#A@rVejk?*7NOpHzT|86Qlf8F05UKdC+bd%Mmm~H;HWn^gqf<%e2NxZFb(tV;{l`4e0 zP`%%BtE(6EyLRKCb(D6gyGKApjI?tzlrrhmTTQJTab_=2a_u7=jF-2j$4sc}LY32V zLbFRm!Vuik^OA!lM-7v*b7pW$y<19&Z1xyQRKt}nUx@-m=PmyER4prOqZX2g60akDB@q!P=7*!i2kuI=QjhYwjK&ELq3WsI>- zY=V7qz9xwC3r3OLpqLCN-D*PHI9nT6HW4B2Lf^E~tIxj=_PG{D2Gr~`{Qew4Zw*Y1UU=(zL6OXR?5Q(#jQh>sZ*z?xv z3(I!!CXVLfRDZK@0TPe{d@SXLof#Irwlf=d)E^WBeY7iWGx3vgFVO!gmt38j^j9t7 zbbzjh<%6e@3b{C|(P<}#>=JXmR45qxItVdf0XP+mE@S9$wPd!tJJfhD8gfn@9f0XQl~8$I&_xlIm1WFa!ai;^4olZ=xhUq|XR3>M)BNDBKp*8+-DT=kYO7-N=SK;0 zd1^)Je?Bw4d|Aqal#ipijiBoW$an;hS8hKPErg@r8)WwnG+4G2@Ck7T3PQ@H|NlV3 ne*^siXZ?R-jQ?TvpSSnP=jqvZpAekh-Mp-%l0>=q+ra+=L(EnJ literal 0 HcmV?d00001 diff --git a/images/login-with-github.png b/images/login-with-github.png new file mode 100644 index 0000000000000000000000000000000000000000..7941dd7702f0f34e991ddec405361ece9d4b0de7 GIT binary patch literal 156024 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Ξ&PodTamFh${h$8N}0W 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 literal 0 HcmV?d00001 diff --git a/images/logo-512.png b/images/logo-512.png new file mode 100644 index 0000000000000000000000000000000000000000..b877867cadbf1e819bd2255217c8b44a1be75db2 GIT binary patch literal 22366 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 literal 0 HcmV?d00001 diff --git a/images/slack.png b/images/slack.png new file mode 100644 index 0000000000000000000000000000000000000000..de3f5752700f786973a799665e1ac7c52aad0753 GIT binary patch literal 8229 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%0D>fR~UXMuMidVKa&#V@)rv zX?I=xC&J@^{CNuB-lUu4%Ud>8FQAX*Gs+BYa5@h3g%gljXxadb;NC{^meBcpMyuzsu|SRIGD{Hv#j;?NPda+@Vsz(>}X!-h@h;HqK+Z5kPVeTEV|aKKs)cXyO)mOt2XnWTNh9fe5z}M)kl9 zy*Q-TH!)90?CaZ?6uKo-d7@Ck0xzjQMk{BpB_X1So?A-F)03X&64tGybAIQ`m&`6N za(~9XhRVpE;LVpVHS}pV; zNf6%Q#?u235w&Mt9^*?&D(utBFsKxPAbRsCXR4iOW9)&u7J=F1ZDnh2lO5vyimKag z;1dXrX(#*{k?Z`MuNly!!c9vP5Ws%mWEC;N*r4`mZKrOfO;t5y0mx)wf)iTP3YC8f z#VukY@loi&b6+kT&%fFIlniI58*bL)wRF!L<=ec@87Dtx_hx6)T_bS{EiL43)iGhw z=X2K4R&7bt{gfwj*T8!TA7@WdK;k{<=6{5m+2_MktUhG@#uBE-g=vSK)lwjxt^+)bsbY8(pn-#R8fPD&U3UMGg}J zYhE5z&;L~piT1)*=V@;qbv)DJgw^N%=N!h%w(rk%y+)Y+{hIZthy9T{rW#Vw#(GkZ zUWjuwVqYirTn}b(q6q`_q!+k_rRxamo#;5a5x#F?dUXAq@VDTn|f zl@8g=Z-QkSTW;hcw5^%ki)e~y~+q{>I zqBM>&iO*KO6DJL%+EkgBntTTDSF9k9#09X;^6UZ+>9SH2UOM8*DbcA#xD7uRO0^7B zB!)$#msv;xs7MYr<)DaY)XQ%R)ZM6w%9k8~T7ie~X0St;#2*DJ&-)pubn_p{Gp!*B zg{@Gh<5!1qY%xE|;b|639IzuDD$LwSEW>Q$n{G#yy7;K^mIQc|iu|n-^3*TE+8v`T z)5|=h0c5h^ry(ja#VWBTJH85NI{t@?$(F*@TPGgKg7Wy77|!aZE>gZx&xJ zU>0{I@t1vz=Ohs{!;>~OlT#p)4BNy-Z(0~wfX7?@AK8~n)s+$dHKA>WfQmg;X2POQ zQlfQ0LL5-O4XX>{8-LYabgFj48iGT;6@e-U(MQaAfqSA&1?-4Z8&6{eY~%mi7r4n7 z=?J^S>kxXyTb8OLDqfz_gYE-SEn|0g^Nc0#_0M!XLY5QcaZKM!^cH!^Y_UK--Jh(a z$UNM_bh03o7q*%1`~%@*L0GQ`5gJxyA@3y{@5n+#3Tq}pJD5q<;HZ^^uVU3{i|Vs- z+Xr-K6p|X_A&oVy6ldI?VH z$Wpe|MAD7*7V73)Fc2-MgK2D;mn-XsP!HuG|C8=X#ZaW$A{BD`0OH#rLmWy{XfGTu zcgT(QMZC^)SbpZ>xy8chtTybQIT4H5Cc1YLLRmQB$wVT!5O>7^J5K0_ZT!s05Zb8> zL;R+B>NX9wvKt8SOb^{P2!5)hBTgZdju<>1*AR+X=I^RH2+^YLCFhiu%K4vm?;$sL z+;g#Jv=;+^PCrF1!)+Zci*gKCsu0ze2Iz>K$Eny}@sCaSKz$?#LETVmA&^Fzj@}w_ zU}WAqhJzsQEWE0lcf_lDm?)ygy8;wq4H2^L^&sQXbB9EC6!&i);m&Es7(_-NLee`W z`^CyM8V-V158C-RNQ7+TFN+*S;1Wgxw^5Ju`Ux@|a2zD~N;9EGC)k*CZedmGyZ1{S zB$i(e5gK5dNSOqEGs0Q?FCqaEkg`wWu9BTb^tQV3C%p=yBRudO064JHxa&P<@=R?X zBd{N!G$XEWtVf-dF!qeYo_`zZ1Z(mBk}Y)O6~qgY10$fLIjy!tJ#{7#v0mhsu`T6J zR+NGGD0w;;lV#LCX(SxyEJ7BXH8T?Zj5#|;I*UC>uOLD)tuGIfP5e^JtEqY5ZPOG< ze27YF$$VGEUpT5-oxHo`P^0k5xJg7AB!c@c7|X>!8tP6m`%Yt?VrJv}cZq5N;|0K9 zEh^sEZ<||2Od9G|;IljMg?8I6#3KEQm{4};^iHb4jbR$1oR`44ob#C2NgjK_(9eeq zxQd&kwdMg4p)1mW?L)MuoM+8sbFaa5tNseF#1{q7!32ECy~F09Ov}^7rRcL85$#Eu zxj^Z?!t}mKBIpLL*Q^K!^?&t@>`5WMt8Qj3<6zG+(lgTXi6j(Q*cCP20vI6b9*;Zb zc+!hp0$;G(Pn7SGx=k>$fT;dPGuCraY#5*dA)jDf?3`N=3>PB(Tt^VDwfcDqM});4 zVdqS)&}el}>n4XQI;xU9SS-N> z&{PYifv&Fi=WxkJ&$>p=d=th(#hUxmTg;(TwekN(fYzImkwgyy1h7EhyYb}l;czR+ zSB;J%u0r!fQ)XL`7mOnTi~ue&Jb3_nj4g5C7c3lmMAp8!!#up`Fz!B}GSrv&Wfu1G zSbLpj_W4!sbCuvI?Qp`(Ma}W7C|rYn=fTeh=mdJw076DaMcItX_J{af8a zlG{C`G!6tMD{cP`X0fCw)U+R7$@Ld?vL96(UWd6%#$0aJ;V5~MxS+%*2j9CFsfO?* zBL%k3XE{p#ry!uG)tID6UI78cjzplTo46y96NT6FBKFP$D}pyxIfy0Q+da0VKaEQD zc?F=Ke>a1E_@;d?puuRfE6HbG{2v{Gz%&9Z;CeGvJ(*u&ae0`BvtS$lK`BxS^G(S- z*0b|iB*i>B;n`O=afmNGf9;qEF&t))qt;Ah>)1pd#+6|rx;?>l7Om24T1R4ohjbBk zekykUT`zOJ?D}NfZ~$cpHYV#Nj=;{xoXe1GE)w_IbYHzCS;o~9+Ril`9TWMez&h&q zKJq)r7ZGKsWL%LYCw_D3RzwY}=gVu&^q~)cG;4{ewj$xaF~w`iv?EgWo`Q#;B70nO zyTrA!c@iQN1YrXa`jcha?}`%#YBVIcRWard#vaFg+n^%IP^s2c!UouJW&2W~;v_ z*+57C)20~0-BH{V1b-aWd;OY7%4`#*%>PNg925}n@Wg7`#MY`t zJ#`0Qt&=6B{FH0$nuWkmb<4l#06Qm^?Tq6xZFW_WG)(U=nxPS#fTc&>iB|v+6X3px zOz@>do8^SYu{A$;k*z5k69|5CQyTJ(;K}_fmUwbgYSLd#IBm}wqS%4>`%n{MAs+4! zVj_ILl&pGVe1_ZrXGV}%)vbL)Gt|N)eka!b7hX*=kh?JB52I^#V{0eZ7C6T_&nL2j zxFNJV-(k;|hZ^t=D6;z^dYG`ZLu>J(ZAL;O=mPbL;~yG{83HAtZoCbdizOs+!U@A2 zwW;b;+tgEjpMf{_R-ulfEiVYm^hsqA+hwD~-sK_>LWdv6b}={D>sX6V&3-Vg*Wg$9 z(tFvh8;A{5-KIX=z@3la);uDpmm{i&O8G(Wwd0$Vd72LGoy&1hD3$2?$0jZ;{Cbqj zQ*+(-#T*|J@&HqZ1kom+N)lkW5DSocOXYp6dmg-Znj@+Wi-1 zg~$>5#%K3i{KGGiY36xz+6~PbWN%MHdK2#2C2Z8UqbzTDJZ)?dr;+(VHGpp%Ehlno z3SW2R+aeJL#ovOXy492}hpbGA9_u6^esNhK4Nj;>%;g&o+f=}th(q|V9u4LavU1c@ zaBYmioO#!xA6|DP8j-rC+&T>27>rY1NbvjPW-O`Oo1hNKhDd%|sQK{%w0i+6J?K+Y zW$8HKm1DH+kyOaULE48~spi@_a>U~If;A!u-#@C5?Wo-o!VEPYSuD{=y+Ia)CaamfiYfY=bN_r+~`H2X5w(Q=K_R?ti%DPvxnKo{ z){q5$UP3wHQPB(^asgIT2$Po}Os<_C5c`S5faod5aceX^#H&kV5lV`1^>EcK?2Gpj z_*UrtwK`Ve^5Q%wkbGUz{ml^Sf|_^j*8FYTHqD#6y&`w6=AaeK`*c8C)&W_ZA%Vu2@E|vI-dAM*(UxIQHl}} zLXsb`JWc#<@LKd|#Ad`c{+WoIO6pC-TUIrHxDW#0jl0aFk!Y*wz}w^tmqa`)I>i8d zKxrpfE5v(b7s*n&V@qxSomq&v*48342u1_kgtu`Nq*kH&GxK9iOMIfnXOM9aU4%jv zc+bV-WCdiLuLW5VkU7{Ux{%ai$S;Q2Q|m{$Bo{!!%*I_i%r#8QKxA%%drkISR6FV^9Mcr-s+49m0TOL6np(yb7lM!`WI zIT2)`z*=h8TUFC5SE!10&t?ilw)qfgN5LxA0xji3HXesp)!PnljqXOZ?SQuX#{aFm zmV1b{AWp<}sID73sLiSEhU|wr4%;-P$eTe*yqrkr^HT6n&3weG9kA0Q2$Vkb)QS*f z4tz*F>EDjx93Ijc_y*E(Ed;Tp=o9!IL?O>k@J`JjmKR&{ZV7YJ$0Kl3a*rJ7ejonH zWC#qJ4x+zmPms(pSRK|{y1RuTS&gbm3=OQUUNAP@UDJ>-0K%W}an)H)LIXy(E%u_f zz>z^$j6Ju1IzT=Iwua@&Aal?H#`)ck+Y9H^-^u5N5kxE8k%@tboCuloIe=7)y#(d3 z_#HFGja4_%YqvJ`gEwCzj2pIIe!9#AHE-X~htRF*(+JgxofDYlYBmN{oS2ad^06mw z8Mg7yM4e<1>aK@5F^gTo5X(f>{04b0|5o4M7T4+$2740Jwhs^ylPcdwsAEdJO}c>^ z!VyEY*$I4LSH>1?bcc#KQrW9?^y!PK=o@V>H~E6|&kw$H{Xn>OZtl!aBeS2cJ~MC2 zxhEdM%#*t(PwfqVc+c}9;~e90U@3iK>BZ+C{j&c*-@X5N#`ka1-+5=xm%q36Rj(^s zd&%ihaBOqmaGYaddrV_rX?=NDkI(JeCP`CKkDlcZ!8;7Bg^-Lj>slf>5orM4?vlqe zWwP@XQH4-8T^F5@2W#VGDAy*NMm-2`=fmIqgqkgbQ7cW7D$IbMuO3D$_r+U|HEpJQ zk~q2K!OH-}@%8f<7h&vq?FR8BWpHkT?M`5wVd2UjlvH3Z6g^Ed>q=8n*gWJz0O*JW z&^?!JXw<9e82Ve6w-8l=K>01;&NoBJg_vCi&B=CkmjNM8JW`E zXDtr4({4hS(~R;T$)~0IX?8@wsRZ4LGs4Eb{^kv_c&Qu59(ptJbggC-lekSJJtVyC zcPt%+7_@y>gh8dwA^Q42D1Ns-kOZTc&$Ug4>fXo(}@Kh-bgbOh44J29r}a*QWOa-ZS~`A&wKimR@!GQuuXh*Y?=6 z+70GQ96ph3K&(AD&ze31vM}?cnE|um3U;kP1f{x( zLC?QI`m(kMrv$>$Jpc$>#G6a1u`$^Xz6O=a15ic8XpEw9XfKdd&Y>f|7BrLn4s?z( z*v6wHHVCYAc6IA$#Ftt7BH@o=PNuSvjd$DD{l7E|1vdwY-xc?WG?4wrB;20|t@uxM zOS@{J8DlwJZXm9dy>+Uw5yDKut z@GO5&4hXp z4WP8gB7!yWUwd=`c2ly~)@8YnDaD31e82ayz^v7c_opG`7_y}0C{@96C!}GtZJ6BW zbWT=RlD6CV_p&zuCB6MCy3Q3foq&iJc)88+v6xXj+KtqbV zaOncOUg$n{KIE%SE#}7gYX~E=CsNqqLKtgmYIUrEr|A;1gm$u%tR-Dm6)vj!>yc|iwnagC`hBZ zr|jCR{7;U^k89!K{`IhEun*SDo{ z>LEy&W$C`e6R79A9<_|qj zIdXB-jSo3D2S((OpOJq)=TGuExfvnlma+YVmy_(@AzF$EFXF0N|M(%g)V!mW{1Lyb zCP2|7M)88{)&wPNIRA5w0k&{;fm!)3{()YqIRrH3!(!E|Bdvf%NI)Sk=YwzOF@zyx_kEVe7vuq z0H8`Zk%A29vwQ*G;6UKV_Jau3&Fsl-^+vpoUV&G@85LImDtW~-YP|LJ!Yo<{Xzdl1(+P#yBUKfz5(qtVZ3ucTLl??u-E!;6flxT2))KcmM!Y?{0H9*P)D1t*>>$-`O!XbopaYLxB?!bp#d z#21jKyyq+fRE<+*`jCnN5pf!19XTe$y1cjw@~)Z58bp|h#iWiaU%pJR%J84tAI z6aQ%s=?;SB{t2i?xhgCf$iNf$+`(VTtU9&5C`%)Q=s(G<5LtdwZjM={U04r=b-vZu z6Y^rHQuDd5=yHxEfON{Af(JCh*}AyTv>ybnIR%$z5XRYwdC*Sg5@YZhYc7iV09F~( ztK&rL!j34HXD*-*2&0xFX5bjd3J)bu0BsD1irv$k{OS^sW({8S;!Jq~esQgx45j<; z)7#{eCLcofBQ}$N2Z`z*NCsOzaibz@mvIZ%(5(>%tWVffjk<)z>MqU1uBCKD3;yKJ zJ9kCn8O1LgbMt;5#Fq-U@8eX%B{UyV7MeNm=ElNN31-U8KPm2Cy4L>46eOj?KJT5n zKsTW1Ulou;!Dzl@6g8a1_kk|B@e$*|kFft#az@9NEw4^2)rVIp#g$+pk#MrK?}=|c z5~cn)MQvJ^#Cwtn4-W?Wo;FlgsJ9hXGKt4xr~9NjzUaBEhjue0^XwtDuu$_co3d z8l#vEL0TAC-wAZoq3-xmWAYoN$m&!u~cxg&+-tKkR!pRb+V-~ zJI^Sbg&BB(k$8s(16$(HRWV~*QVSIh0k!+Nc}y7xHP;MK!T|P2@5}XL*YzuC@d%tI zUsW**Lv9lp?s{1}3rKVS8S?o%k~H(5b zGVOab^*ScZLr(2u2M=koDGJaUP!nG~4@hhQpY)}D)z(+_1TDXZ8o>4~LtjobLD-%6 zA|57;hHgA6>XsJM?50WwE(+!*1NupjAOTd%d-4cT$q|D z3^Qon-;KSUdMg?5myp6h@^}7D@`Xgi35Jz)kfxJeRnBBZi8lneLwh1(KG$+uD!ele zmQ6^a+m;}Xms1G`I?%`Aw{BlU=b93Jsh%jmq~{Nx#)9P;sG6EA)0~=J@0E8G4-9op#U;=%MTm`d5S(r7*ol705(l^Kp+;K zVHDLuf&$1ddDTtkFn4TQ_w^wjq6x7i>kFAVS@J({=r#KYSf9-38urzm>!%CxTT&K< z1X$9y0o6c0ktE}+?kW{rB_fyh4{gyANWuJ-VF(;yKfQ%fT;y&&F29cKmvzHXh1sYMCb;5hy@HAvp%S#kN(S0r_E4zfjARsfSl#Md$@Qj107U zlK?fQB17=*)89E!;C@R-LIp(;T6yd4QxlM>6~JGU&M||W=tz*qJSE((0|g`g0K3(0 zfjFt`6Nob=Jb!3nX(w%}65Ld|m|n-(I!?*wwC`U=*9Q`9wjPm}>*m~X);3R(0|$wf z8^Co@PaE#_gg+$B0->;TXkFzMzcl$Q-2)lI zp7L&-a`-6*fDtmzD6mBNTf#5fR81;1@vdYBe8x}!FhUcYA_jOHYK{TZP$^kyGAlQxQO^`$%G3SB$!`8m0-3jM6bi=kP6ce zZ~TMfcq%7G6mkm=W6iomri+9i(D$t^0E_)IEj`CY60biwho4|j5h0}Z7mnLYjsMv@HrG?S z0M0j0%=UU76Y3$&6gZy2K17sVo8AI@o9rkUn0Dw*p>QVloQ2+20PDLucf>~0x8pKp zU7YGg!v4sluW@TvBG+A$7E0O4+qp>vj1_>$@-t8g0eCj$h=5e}AxXEUqX~sab|A$b zELspWCcyXqc)XaROqJX(Klj+sWfvbv3U|A(gfeGszmh{eZ@z)xoTIH~_6Y6MY|y0s zT)ZA|fAfHflPC1Cl`IBB*tTTyoPgO)M%SwHPmUW-)SbQ^j!aMFhgGl6V~RYbjRHqt z)bodtzD{yaS{Mc5%1B}r+aNfCo)8<|jwi?U3);y_a!~;L#zboHHOz%}oeOj%2r(3# zaXBU|1mP9}YbiPm{bC{jbOUdP>+Pw4=42M#H@aR0Bz&%l zuiLm@#SJ#jQTCzv68(IJ89gR1MZ)M-y|gQPg^n-*uNo}ZUS6vAMHYs)g?sG&S;pN< z>ML-xwlM!`+}##H@>)Q!2Q{KpBx1VM`z-b=zv4jI0Wy|n#VC$)yjCEYccS=9UndfF zD!bsn>TgEP<|oaJA`UDMt}trwD>~IvsxQpQke@;wkSVWMdC$Qu^-F_Xl9O)Q2aU?5LUKkt}KgyP2nz>=eI7I+>PW#E+ ze!?z5THWNvgGFoTgCjXdN8q6gfh;6m=pmgz0D6(Vc2hZr|IU?NP*$Bq_H>UIw@LTd zEOCP$tKcgv{m|ybuel?^g62ejcfCvZ`nd=?>@Hg>yJAx%(N(fRcH@R-*D%;Z3D{uD zlx#h_v&?d0{)iArYt3y& z0n@nbqqjIzLpD=E)9!a}{bS%;oSw_mU9j32T}uIwlzM|H@oz(r8D%SR8VzTe3U7d! zgsm1_j>437o8z*;f3TlprF-Dgen15M0q`{o$gmxJW?%)KnIZ2b9uqxp-hx>HLpu>m z_ViagB}tkur12~9b`+38JTOlc&=FstFjoJUQIo}c2KM376fqS?<@LH1r#v!8(8ND+ z!M=k9%>%#-j-N^TG5Lwl=KyXRTn$rt#2FrYwGJ8wG@Fax&n4wfT|?-EkD#IsQdYDJiolkBcKgYBH~a!NpAa3nkYZjQUoD(d|O z!p$cmL?jYwNZJ&-r-0cNDF_fa&cm!$QQ;jwa$#7xhI`n&3gDNTR}dKLso;aYU;z9$ z>CttFJR1UaWjs&WZJC0=b6=c835L*qfg5&b-x-U&sE~~1uM1m%Nf(Knx z#H=?j*(9is=%YSiNPr{{QH8SvLv_04Pv}LEh^Ub)pO`8vBx?kYX7O7La$5C~D~RzC zl)03?Z3O;5KE!b*g!x`S!g^AiP6HKT5339l!*D`5jr2?tnzDTNM@`HBCIVG!#*w zMa-fUd8+OLJbx4p3Duk&>Qhu4Td6w4Ro-nJC*qEJ(#LarEbsf&Y&Z@ zapB=kKoBdqj#>0ZLA9xU4k%}Dp+DUUqK5IpYXyL5sv|FJ{;Ve5pZUmqiS67nJh5q$ z>4?t(`%aMk@Bms!_5n|~eMcF#(3$oBdUs*Nqb>kPJ@uII=g?#FNN%A}9#dMz-`97Y8F-+4I}*^Z zf!wBPqj4I-wXD4CC6yomzB3F2h*B7tLU{%!p?DAgND;yz9s$1ICCD?i{{V2jsJ8l^ z<@XcI^kr-52ta?g3a*k8W^Ch~7$yR>zWHfA(LX?6f#1Ftw^49PIJOONe#=-8#~1*Zw@iL@RY*pvTZ(|-tni!C>cWg;YtAKmmm7ADWbnR#-{=Mx;T&7IO<&Pjok_pc zD~j4jQ{=ztNN3*bdb;N>hMtC@MH8x~m!1E3|Dtd1M4aIq*!b;-alapLf0sMIa#zfk z^Jjf+Tru$GTFfJ5zwCpxGkAk>8Q*sIaQuDC%eVFP4slS2RU#dn#_9JFK#L7;yjGKI zQ*~Gn`yUA@Aiy^MylooF%Cqo<(r$Tc&0% zFCY9;VbQtWDCO9Zo@;sa4~-K_K20{dT0Pv@(y>(4c%yUa`Hw$*bWENty)E8$e7PXB zz%NyP{ts1s*n=PXpGw<*Dfhutz7TW^VmI~lPUKdAk0?gu-XV0)&o)(Y!mC$x2R+g8 z-kTW}LZOKsUw@qu&scD5_v_Es&TuIz_pQ4aQ&WEVUO``^qUZCq{ZT26iz5^2m95J7 zn7-kTSG_0eBy;L+D_Sl-9}e#7+LX}c;#qaQg$nJeDBp2surGG-&+A!EuP!K`zZUi0M;3T>CEVDS9&HP}OF@v%i5_wtcrIqp zzd}h=82=0)<%&7UI>|(qZQvxXHw@Sg-owf^VgXRM+2S>cSsO;#&r8lS30zgSj;!N$!f0_8$xFU$ z_+|&9I*ZKujdgq`=E?>-6KYa-E%Bm?6;mWE#r|_#5-R#-D-vE zC+*NYRnvMJc58JK8+&E`%~k5WC$0}W83od`z5hj?0g75kz+F(qSHl{u*H)s?csn~X zpYz}EV%pJUQ~O^T#H)=v^c$HL#bp$=+$Q4kWt;1*8(8o#Suiy}`~b&TXEil@0(71e zr6#=hX?Cw2!Pbr(6K02MadIik0$X*m!&xv_Q-%r3N)pcL~;;MTcssMs#-$N{y_)!7kr+dcbS}S;g2iGGIR3 z3weWBPLPua%uOS11)L7*4f39zwIb{kGq4Uo|A&Z>0L-4#r07zF_Ta_W-^^_Zk|D?% zzqMn+t5nIl-yX%RqsviJGi4P!J4?ofaJpC5P^VoLvYm| zz%lF9L-37WrE?Y(F(|jmdslq|mH_$|F@PI7s^z0R=STH#W)Qq8+zY#NjDgwMy$}_| zpJ&_<>ltB4w|5xkvr_Pfd5((ka*y? zf1o323muD?IoQ4qL?x4N&kC50vRCQ?e{6>-+gH*~NZOQLR&QU&dK&(e1@5Y9?dq)c ztQN%Y?}sZMCp5vP>Pnoz%iKO+dqOF9Z|5nHnj_w=p55mj()9u#Cxnk_h=?c208Gvy z^$nc}sP}A+)sLYe>I3HA0SNRQ_#bLe4FhZY{IHFoyGq50QfSvU0WecUxZ=fS{0qwy zWiyIAI-->`nbeRYjX&XaEGqQ4va9zV7m%1|iVBX#u#ReeepyZTT)_YVYDNYx>{XN) z7Wl7Jb!vdhskDI68*gSzC7KV(9GTv77LaeKRjUyd(ri)lc`@{9I~19~EV+kml_@2QVtqiMVi%sX@%NSx@BkM^LR2)nkPV{?5Mio-lM&3aB3D$Vv*W_Rx=_2( zqP?KRc4lE7pcWRYFT5H-eaQGRun-aKVtDwP4 zY7Sh8%wJg>IlupFI*67|HZ2JjgqOysKlYgNJ0{-=0tO5U{)K2Yg`}YCA#R1XtN|7C zsvVF<%s?dS%oIbX#rOIbRJ|$Sj238lxxnYR9CeKbl>f*+z@Fo0+03q80t@s08=Q*0 zY@H*DKR?&Bgn4C4q5&|5?Kxr~E#laJBx%+z-P*p=i@pq;5WvFtv60~7ZxHrnLRLn~ zjgbc5HdheiDFwb5zn|nEQ{tRN8)yTQg^wzAeY!7kqA(6t->+FcG@Gom44$0Tg32zX znmz%XdXb4o?KYW^owaN=?!Q^|azU2%dhL#;Y zXV47vvtuQb^lAKCz18ev7?KCwOgI!KFz3MTp+0zc@?LNjucbo)4D>vU-2;bj61Shp zfA44G6Y@0eb$DLYou_yo)cllv7wYjRt5NsX&{l=a z6u~1qAdP6wRkpn@pUDFb=By`#cTf*eVR4n}C<&5NTeiiQ7Ft;3E=mCF_4Z*O*qXyO zRmX&m9LW^H?0QW}3vmkIul(r*fa+KR&IbcM|8sgvA$N`t@ig=Bf6+p2Ss;UzAw?G~ z4b*+0nY5uegvx?jsHGyra%RYP6KlagcqQy56j`Invy18_r*Bo*SDG3GR7}rB4!Q5x zqZD<9*~Fm4?XI3~`$qavN=b7?UK%6L_8_8gL6In8hcod04hWJfRBt$au3_J41`~gY zNZLBw0Z_^_R?ZQx28hjkNx9I`24w@B)bpRReYxlUI%GeMa|Ko@{>_Da5mq|X7&q3G z&q9V>kZJU4y8Jv4gXXY{Ou-@_a_1bAk8rpCrP(ggV;J*N^AtBhEeKJ@6J|XFnC_;q zNE|ThKdCul{)8~Dz#Ik}7M}}~PdknJ)xt+65)*+>rG{E~NyCxwX-AD0Z)H!1q#>D+ zGW6BLM=))$Q|Gy%f^88kZ3PP3eKrT0|7q29bJLO_L791puV88E3H1^qWfnrm3a0jj zp`MI|+dwQA@u|cwBs%+7z#G(byz~bE2`@0UZRiMaZ2WcFHO2ISsa$0WO1mqMZuE+p z#ttc-x-(Qz?I~T4H3SlX2-MjD4>Ge@+U8*1e}q%txm8VP-nj@#Ky|Rw4&!+U9K~vR zsNV>@q-;)emfVn=q$yE@85MD`!^6>0Z?pag-0P{Zoh_0aeLFqw8)5Xc782pt25% zF1^nM+Qu-)>&~qu11~vVE5kNsd`S9Hl+W`Xa$$l{0wx6BSp19kHcamP$3Im(S48Zr z2%jByGe7Zc(UD_Qa*Ij_dTFobg#I_Sn!TFZwNmxfjUZln|Ls-y(=@;+e!w-njjy~L zT(}e({>K(eU*v84*0p>vE~ZHtKk_86=<;CiN^WFC!b$RZ6d^KpQ=ybu9Ck4hHE;1x zm;O>5{OiE;^ER)Qg9ieiU3lSCw72-P&hXx+bz9g`WtE|v=ye47VmvRm{}8!ve4`5s z|7r^NC=X6DIX9H`ZkNU@yE@}8 zrqm78*C-lhw5pS1j*+_2}1q$zAQ;%}Mn#rtV(-=5GJI z%%SF=J+lT2Vp~)41hFwaO!?K`rbW*$_r7}A+;qDoCZ=;;++mlXH)(@0ods`VtL!Rz zJ!1=c`yMv?Ro8DmRTTG9(fX2M7FtnLSecj-`>ZuO*oFCi(q;csQ-h@0p!3c0*dxrGm zGS>PV=WO;rb+FtibZTnt%Z#4b8hxkGkjK??+Tv#QKkDtP$lUy>rhUt^`hfDH%l|gX zjh^{cXM03N=7XwF%Z!`51C*hsRh=DimKRQLzjJ2rjbl(;XI$K(;Kk4L1Ae{}Ul6&t z;=#|d$dRiLnR>svom=z#Vw%cwRsA71i;MWie$Hp0oO$ zqC=Al`ubyvo3d`(MtMo|M=Lav4@&_5`=9^q!2fpOe>?EM9r)i4{BH;Tw*&uw?ttjP asPRtM^5YL2`<9XKaF@A#S@;ES&;JK^7++5S literal 0 HcmV?d00001 diff --git a/install_local.txt b/install_local.txt new file mode 100644 index 00000000..faf9d665 --- /dev/null +++ b/install_local.txt @@ -0,0 +1,3 @@ +npm install +vsce package +code --install-extension code-settings-sync-3.2.5.vsix diff --git a/package.json b/package.json new file mode 100644 index 00000000..10a0f996 --- /dev/null +++ b/package.json @@ -0,0 +1,192 @@ +{ + "name": "code-settings-sync", + "displayName": "Settings Sync", + "description": "Synchronize Settings, Snippets, Themes, File Icons, Launch, Keybindings, Workspaces and Extensions Across Multiple Machines Using GitHub Gist.", + "version": "3.4.3", + "icon": "images/logo-128.png", + "publisher": "Shan", + "author": { + "name": "Shan Khan", + "url": "http://shanalikhan.github.io", + "email": "shanalikhan@hotmail.com" + }, + "homepage": "https://shanalikhan.github.io", + "galleryBanner": { + "color": "#3B4859", + "theme": "dark" + }, + "engines": { + "vscode": "^1.95.0" + }, + "badges": [ + { + "url": "https://vsmarketplacebadge.apphb.com/version/Shan.code-settings-sync.svg", + "description": "Latest Version", + "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" + }, + { + "url": "https://vsmarketplacebadge.apphb.com/installs/Shan.code-settings-sync.svg", + "description": "Total Downloads", + "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" + }, + { + "url": "https://vsmarketplacebadge.apphb.com/rating/Shan.code-settings-sync.svg", + "description": "Ratings", + "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" + }, + { + "url": "https://img.shields.io/badge/Join%20Community-slack-green.svg", + "description": "Join Slack Community", + "href": "https://join.slack.com/t/codesettingssync/shared_invite/enQtNzQyODMzMzI5MDQ3LWNmZjVkZjE2YTg0MzY1Y2EyYzVmYThmNzg2YjZkNjhhZWY3ZTEzN2I3ZTAxMjkwNWU0ZjMyZGFhMjdiZDI3ODU" + } + ], + "repository": { + "type": "git", + "url": "https://github.com/shanalikhan/code-settings-sync.git" + }, + "bugs": { + "url": "https://github.com/shanalikhan/code-settings-sync/issues", + "email": "shanalikhan@hotmail.com" + }, + "categories": [ + "Other" + ], + "keywords": [ + "vscode-sync", + "vscode-settings-sync", + "code-settings-sync", + "settings-sync", + "workspace-sync", + "multi-root ready" + ], + "extensionKind": "ui", + "activationEvents": [ + "*" + ], + "main": "./out/extension.js", + "contributes": { + "commands": [ + { + "command": "extension.HowSettings", + "title": "%cmd.howSetting.title%" + }, + { + "command": "extension.downloadSettings", + "title": "%cmd.downloadSettings.title%" + }, + { + "command": "extension.updateSettings", + "title": "%cmd.updateSettings.title%" + }, + { + "command": "extension.resetSettings", + "title": "%cmd.resetSettings.title%" + }, + { + "command": "extension.otherOptions", + "title": "%cmd.otherOptions.title%" + } + ], + "keybindings": [ + { + "key": "alt+shift+u", + "command": "extension.updateSettings" + }, + { + "key": "alt+shift+d", + "command": "extension.downloadSettings" + } + ], + "configuration": { + "properties": { + "sync.gist": { + "type": "string", + "default": "", + "description": "%ext.config.gist%" + }, + "sync.autoDownload": { + "type": "boolean", + "default": false, + "description": "%ext.config.autoDownload%" + }, + "sync.autoUpload": { + "type": "boolean", + "default": false, + "description": "%ext.config.autoUpload%" + }, + "sync.forceDownload": { + "type": "boolean", + "default": false, + "description": "%ext.config.forceDownload%" + }, + "sync.forceUpload": { + "type": "boolean", + "default": false, + "description": "%ext.config.forceUpload%" + }, + "sync.quietSync": { + "type": "boolean", + "default": false, + "description": "%ext.config.quietSync%" + }, + "sync.removeExtensions": { + "type": "boolean", + "default": true, + "description": "%ext.config.removeExtensions%" + }, + "sync.syncExtensions": { + "type": "boolean", + "default": true, + "description": "%ext.config.syncExtensions%" + } + }, + "title": "%ext.config.title%" + } + }, + "scripts": { + "vscode:prepublish": "npm run tslint-check && webpack --config configs/webpack.production.config.js", + "compile": "webpack --config configs/webpack.development.config.js", + "watch": "webpack --config configs/webpack.development.config.js --watch", + "postinstall": "node ./node_modules/vscode/bin/install", + "tslint-check": "tslint -c ./tslint.json ./src/**/*.ts ./src/*.ts", + "format": "prettier --write './src/**/*.ts'", + "test": "npm run tslint-check && tsc -p ./ && mocha --recursive \"./out/test/**/*.js\"" + }, + "devDependencies": { + "@types/chai": "^5.0.1", + "@types/express": "^5.0.0", + "@types/fs-extra": "^11.0.4", + "@types/lodash": "^4.14.123", + "@types/mocha": "^10.0.10", + "@types/node": "^20.10.0", + "@types/node-fetch": "^2.6.12", + "@types/recursive-readdir": "^2.2.4", + "@types/vscode": "^1.95.0", + "@typescript-eslint/eslint-plugin": "^8.10.0", + "@typescript-eslint/parser": "^8.7.0", + "chai": "^5.1.2", + "clean-webpack-plugin": "^4.0.0", + "eslint": "^9.13.0", + "mocha": "^11.0.1", + "prettier": "^3.4.2", + "ts-loader": "^9.5.1", + "typescript": "^5.7.2", + "webpack": "^5.97.1", + "webpack-cli": "^5.1.4", + "webpack-merge": "^6.0.1" + }, + "dependencies": { + "@octokit/rest": "^21.0.2", + "adm-zip": "^0.5.16", + "const": "^1.0.0", + "express": "^4.21.2", + "fs-extra": "^11.2.0", + "https-proxy-agent": "^7.0.5", + "lockfile": "^1.0.4", + "lodash": "^4.17.15", + "node-fetch": "^3.3.2", + "recursive-readdir": "^2.2.2", + "temp": "^0.9.0", + "vscode-chokidar": "^2.1.6" + } +} diff --git a/package.nls.de.json b/package.nls.de.json new file mode 100644 index 00000000..0cfab05f --- /dev/null +++ b/package.nls.de.json @@ -0,0 +1,144 @@ +{ + "cmd.downloadSettings.error.removeExtFail": "Sync: Einige Erweiterungen konnten nicht entfernt werden", + "cmd.downloadSettings.error.unableSave": "Sync: Die Extension Datei konnte nicht gespeichert werden.", + "cmd.downloadSettings.info.downloaded": "Sync: Herunterladen Abgeschlossen.", + "cmd.downloadSettings.info.gotLatestVersion": "Sync: Du hast bereits die neueste Version der gespeicherten Einstellungen.", + "cmd.downloadSettings.info.readdingOnline": "Sync: Lese Online Einstellungen.", + "cmd.downloadSettings.title": "Sync: Einstellungen für das Herunterladen", + "cmd.howSetting.title": "Sync: Wie wird diese Erweiterung konfiguriert", + "cmd.otherOptions.customizedSync": "Sync: Hinzufügen eines benutzerdefinierten Sync Datei-Pfades", + "cmd.otherOptions.customizedSync.done": "Sync: {0} wurde registriert.", + "cmd.otherOptions.customizedSync.placeholder": "Geben Sie einen absoluten Pfad für die zusätzlichen hochzuladende Datei ein.", + "cmd.otherOptions.customizedSync.prompt": "(ex. /Pfad/zu/.eslintrc) wird in einen speziellen Pfad hoch bzw. heruntergeladen.", + "cmd.otherOptions.downloadCustomFile": "Sync: Importiere Benutzerdefinierte Sync-Datei zu Ihrem Arbeitsbereich", + "cmd.otherOptions.downloadCustomFile.done": "Heruntergeladen von {0}.", + "cmd.otherOptions.downloadCustomFile.placeholder": "Wählen Sie die Datei, die Sie in das Basisverzeichnis des aktuellen Arbeitsverzeichnis herunterladen möchten", + "cmd.otherOptions.downloadSetting": "Sync: Einstellungen herunterladen", + "cmd.otherOptions.editLocalSetting": "Sync: Lokale Einstellungen der Erweiterung bearbeiten", + "cmd.otherOptions.error.toggleFail": "Sync: Kann nicht umschalten.", + "cmd.otherOptions.joinCommunity": "Sync: Community beitreten", + "cmd.otherOptions.openIssue": "Sync: Problem melden", + "cmd.otherOptions.openSettingsPage": "Sync: Einstellungen öffnen", + "cmd.otherOptions.preserve": "Sync: Aufbewahren der Einstellungen um ein Überschreiben nach dem Herunterladen zu verhindern.", + "cmd.otherOptions.preserve.info.done1": "Sync: erledigt. {0} - Wert wird aus der settings.json nach dem Herunterladen entfernt.", + "cmd.otherOptions.preserve.info.done2": "Sync: erledigt. Die Erweiterung behält den Wert {0}: {1} in der settings.json nach dem Herunterladen.", + "cmd.otherOptions.preserve.placeholder": "Drücken Sie eine beliebige Taste um settings.json aufzubewahren.", + "cmd.otherOptions.preserve.prompt": "Beispiel: Geben Sie ihren lokalen Proxy in 'http.proxy' an. Dadurch wird er lokal überschrieben. Wenn es leer ist, wird der Proxy entfernt.", + "cmd.otherOptions.quietSync.off": "Sync: Es wird eine Ausgabe beim Hoch-/Herunterladen angezeigt.", + "cmd.otherOptions.quietSync.on": "Sync: Die Statusleiste wird beim Hoch-/Herunterladen aktualisiert.", + "cmd.otherOptions.releaseNotes": "Sync: Veröffentlichungshinweise", + "cmd.otherOptions.shareSetting": "Sync: Einstellungen als öffentlichen GIST freigeben", + "cmd.otherOptions.shareSetting.beforeConfirm": "Sync: Hiermit entfernen Sie den aktuellen GIST, die Einstellungen werden in einem öffentlichen GIST gespeichert. Wollen Sie fortfahren?", + "cmd.otherOptions.title": "Sync: Erweiterte Optionen", + "cmd.otherOptions.toggleAutoDownload": "Sync: Umschalten des automatischen Herunterladens beim Start von VSCode", + "cmd.otherOptions.toggleAutoDownload.off": "Sync: Automatisches Herunterladen AUSGESCHALTET.", + "cmd.otherOptions.toggleAutoDownload.on": "Sync: Automatisches Herunterladen EINGESCHALTET.", + "cmd.otherOptions.toggleAutoUpload": "Sync: Umschalten des automatischen Hochladens beim Ändern der Einstellungen", + "cmd.otherOptions.toggleAutoUpload.off": "Sync: Automatischen Hochladen AUSGESCHALTET.", + "cmd.otherOptions.toggleAutoUpload.on": "Sync: Automatischen Hochladen EINGESCHALTET.", + "cmd.otherOptions.toggleForceDownload": "Sync: Umschalten des erzwungenen Herunterladen", + "cmd.otherOptions.toggleForceDownload.off": "Sync: Herunterladen erzwingen DEAKTIVIERT", + "cmd.otherOptions.toggleForceDownload.on": "Sync: Herunterladen erzwingen AKTIVIERT.", + "cmd.otherOptions.toggleForceUpload": "Sync: Umschalten des erzwungenen Hochladen", + "cmd.otherOptions.toggleForceUpload.off": "Sync: Hochladen erzwingen DEAKTIVIERT.", + "cmd.otherOptions.toggleForceUpload.on": "Sync: Hochladen erzwingen AKTIVIERT.", + "cmd.otherOptions.toggleSummaryPage": "Sync: Umschalten ob die Zusammenfassungsseite beim Hoch-/Herunterladen angezeigt werden soll.", + "cmd.otherOptions.triggerReset": "Sync: Wollen Sie die Einstellungen wirklich zurücksetzen?", + "cmd.otherOptions.warning.tokenNotRequire": "Sync: Sync-Einstellungen wird zukünftig nicht mehr nach Ihrem GitHub-Token fragen.", + "cmd.resetSettings.info.resetting": "- Sync: Zurücksetzen Ihrer Einstellungen.", + "cmd.resetSettings.info.settingClear": "Sync: Einstellungen wurden gelöscht.", + "cmd.resetSettings.title": "Sync: Zurücksetzen der Sync-Einstellungen", + "cmd.updateSettings.error.gistNotSave": "Sync: GIST WURDE NICHT GESPEICHERT", + "cmd.updateSettings.error.newGistCreateFail": "Sync: Es konnte kein neuer GIST erstellt werden.", + "cmd.updateSettings.error.readGistFail": "Sync: die GIST-ID: {0} kann NICHT GELESEN WERDEN.", + "cmd.updateSettings.info.gotLatestVersion": "Sync: Sie haben bereits die neueste Version der gespeicherten Einstellungen hochgeladen.", + "cmd.updateSettings.info.newGistCreated": "Sync: Es wurde ein neuer GIST erstellt.", + "cmd.updateSettings.info.readding": "Sync: Lesen der Online Einstellungen und Erweiterungen.", + "cmd.updateSettings.info.shareGist": "Sync: Teilen Sie die Id mit anderen Benutzern dieser Erweiterung, um Ihre Einstellungen mit diesen zu teilen.", + "cmd.updateSettings.info.uploadCanceled": "Sync: Upload-Vorgang Abgebrochen.", + "cmd.updateSettings.info.uploading": "Sync: Hochladen/Aktualisieren Ihrer Einstellungen auf GitHub.", + "cmd.updateSettings.info.uploadingDone": "Sync: Übertragung Abgeschlossen. GIST-ID: {0}. Bitte kopieren Sie diese ID um die Einstellungen an einem anderen Gerät herunterladen zu können.", + "cmd.updateSettings.info.uploadingFile": "Sync: Hochladen der Dateien.", + "cmd.updateSettings.info.uploadingSuccess": "Sync: Erfolgreich hochgeladen.", + "cmd.updateSettings.title": "Sync: Aktualisiere die Einstellungen", + "cmd.updateSettings.warning.OSNotSupported": "Sync Pragma-OS-Wert {0} nicht unterstützt in Zeile {1}", + "cmd.updateSettings.warning.noToken": "Sync: Bitte setzen Sie Ihren GitHub-Token in den Einstellungen oder deaktivieren Sie \"downloadPublicGist' in der lokalen Sync-Einstellungen-Datei.", + "common.action.donate": "Spenden Sie jetzt", + "common.action.joinCommunity": "Treten Sie der Community bei", + "common.action.openExtPage": "Öffnen Sie die Seite der Erweiterung", + "common.action.openExtTutorial": "Anleitung öffnen", + "common.action.releaseNotes": "Versionshinweise", + "common.action.support": "Unterstützen Sie dieses Projekt", + "common.action.writeReview": "Schreiben Sie eine Bewertung", + "common.button.no": "Nein", + "common.button.yes": "Ja", + "common.error.canNotSave": "Sync: Einstellungen konnten nicht gespeichert werden. Bitte stellen Sie sicher, dass Sie eine gültige settings.json haben.", + "common.error.connection": "Sync: Es besteht keine Internetverbindung oder es konnte keine Verbindungen zu GitHub hergestellt werden. Der Fehler wurde in der Konsole protokolliert.", + "common.error.gistNotSave": "Sync: GIST nicht gespeichert.", + "common.error.invalidGistId": "Sync: Ungültige Gist-Id eingegeben. Überprüfen Sie Ihren GIST: https://gist.github.com//.", + "common.error.invalidToken": "Sync: Ungültiger/Abgelaufener GitHub-Token. Bitte generieren Sie einen neuen Token mit den Berechtigungen aus der readme-Datei. Der Fehler wurde in der Konsole protokolliert.", + "common.error.message": "Sync: Fehler wurde in der Konsole protokolliert. Um die Konsole zu öffnen gehen Sie wie folgt vor (Menü Hilfe > Entwicklungstools umschalten).", + "common.error.tokenNotSave": "Sync: Token wurde nicht gespeichert.", + "common.info.donate": "Sync: Gefällt Ihnen diese Erweiterung? Wollen Sie eine Bewertung schreiben oder Spenden? ;)", + "common.info.excludeFile": "Sync: Sie können Dateien oder Ordner in den Einstellungen für das Herunterladen auschließen.", + "common.info.gistSaved": "Sync: Gist Gespeichert", + "common.info.initAutoUpload": "Sync: Auto-Upload wird in {0} Sekunden eingeleitet.", + "common.info.installed": "Sync: Einstellungen erstellt, vielen Dank für die Installation!", + "common.info.needHelp": "Sync: Brauchen Sie Hilfe bei der Konfiguration dieser Erweiterung?", + "common.info.setToken": "Sync: Jetzt können Sie Ihre GitHub-Token manuell in `syncLocalSettings.json` eintragen", + "common.info.tokenSaved": "Sync: Token Gespeichert", + "common.info.updateTo": "Synchronisieren: Aktualisiert auf v{0}", + "common.info.updating": "Sync: Update Läuft... Bitte warten.", + "common.placeholder.enterGistId": "Bitte geben Sie Gist-Id ein", + "common.placeholder.enterGithubAccessToken": "Geben Sie Ihren persönlichen GitHub Zugangs-Token ein", + "common.placeholder.multipleGist": "Gist-Name (z.B.: Persönliche Einstellungen)", + "common.prompt.enterGistId": "Geben Sie die Gist-Id von zuvor hochgeladenen Einstellungen an. Sie können auch manuell im code Einstellungen (sync.gist). Drücken Sie [Enter] oder [Esc], um abzubrechen.", + "common.prompt.enterGithubAccessToken": "Sie können den Token auch manuell hinzufügen (User-Ordner/syncLocalSettings.json). Drücken Sie [Enter] oder [Esc], um abzubrechen.", + "common.prompt.gistForceUpload": "Sync: Der Upload ersetzt die Einstellungen in GitHub Gist. Erwägen Sie, die Einstellungen herunterzuladen oder einen erzwungenen Upload durchzuführen. Möchten Sie immer noch mit Nachdruck hochladen?", + "common.prompt.gistNewer": "Sync: Die Einstellungen in Gist haben sich seit dem letzten Download geändert. Möchten Sie Ihre aktuellen lokalen Einstellungen trotzdem in das Gist hochladen?", + "common.prompt.multipleGist": "Ermöglicht Ihnen die richtigen Einstellungen zu identifizieren, sollten mehrere vorhanden sein.", + "common.prompt.restartCode": "Wollen Sie das Programm neustarten, um die neuen Einstellungen und Erweiterungen zu übernehmen?", + "ext.config.autoDownload": "Lädt die Einstellungen beim Start von VSCode automatisch herunter", + "ext.config.autoDownload.name": "Automatisch herunterladen", + "ext.config.autoUpload": "Lädt die Einstellungen automatisch hoch, sobald sie geändert werden.", + "ext.config.autoUpload.name": "Automatisch hochladen", + "ext.config.forceDownload": "Lädt die Einstellungen auch dann herunter, wenn sie bereits aktuell sind.", + "ext.config.forceDownload.name": "Herunterladen erzwingen", + "ext.config.forceUpload": "Lädt die Einstellungen auch dann hoch, wenn sie im GIST bereits neuer sind.", + "ext.config.forceUpload.name": "Hochladen erzwingen", + "ext.config.gist": "GitHub GIST-ID für die Sync-Einstellungen.", + "ext.config.gist.name": "Gist-ID", + "ext.config.gist.placeholder": "Geben Sie Ihre GIST-ID ein", + "ext.config.host": "Speichern Sie Ihre Einstellungen auf Ihrem GitHub Enterprise Host.", + "ext.config.lastDownload": "Datum, an dem die Einstellungen das letzte Mal heruntergeladen wurden. Leeren Sie dieses Feld, um die Einstellungen manuell herunterzuladen.", + "ext.config.lastUpload": "Datum, an dem die Einstellungen das letzte Mal hochgeladen wurden. Leeren Sie dieses Feld, um die Einstellungen manuell hochzuladen.", + "ext.config.pathPrefix": "Geben Sie hier Ihren GitHub Enterprise API-Präfix ein, wenn Sie GHE verwenden möchten. In der Regel \"/api/v3\". Wird nur verwendet, wenn ein Host festgelegt wurde.", + "ext.config.quietSync": "Zeigt das Ergebnis der Synchronisierung in der Statusleiste anstatt der Ausgabe an.", + "ext.config.quietSync.name": "Hintergrund Synchronisation", + "ext.config.removeExtensions": "Entfernt Erweiterungen, die in den heruntergeladenen Einstellungen nicht enthalten sind.", + "ext.config.removeExtensions.name": "Entfernen von Erweiterungen beim Herunterladen", + "ext.config.syncExtensions": "Deaktiviert die Synchronisation von Erweiterungen komplett", + "ext.config.syncExtensions.name": "Erweiterungen synchronisieren", + "ext.config.title": "Synchronisierung der VSCode Einstellungen", + "ext.globalConfig.askGistDescription.name": "Fragen Gist Namen", + "ext.globalConfig.autoUploadDelay.name": "Verzögerung für das automatische Hochladen", + "ext.globalConfig.autoUploadDelay.placeholder": "Geben Sie die Anzahl der Sekunden für die Verzögerung ein", + "ext.globalConfig.downloadPublicGist.name": "Herunterladen eines öffentlichen Gist", + "ext.globalConfig.gistDescription.name": "GIST Beschreibung", + "ext.globalConfig.gistDescription.placeholder": "Eingeben der GIST Beschreibung", + "ext.globalConfig.githubEnterpriseUrl.name": "GitHub Enterprise-URL (optional)", + "ext.globalConfig.githubEnterpriseUrl.placeholder": "Geben Sie Ihre GitHub Enterprise URL ein", + "ext.globalConfig.hostName.name": "Hostname (optional)", + "ext.globalConfig.hostName.placeholder": "Hostname eingeben", + "ext.globalConfig.ignoreExtensions.name": "Ignorierte Erweiterungen", + "ext.globalConfig.ignoreExtensions.placeholder": "Geben Sie eine Erweiterung pro Zeile ein (vollständiger Name)", + "ext.globalConfig.ignoreUploadFiles.name": "Ignorierte Dateien", + "ext.globalConfig.ignoreUploadFiles.placeholder": "Geben Sie einen Dateinamen pro Zeile ein", + "ext.globalConfig.ignoreUploadFolders.name": "Ignorierte Ordner", + "ext.globalConfig.ignoredUploadFolders.placeholder": "Geben Sie einen Ordner pro Zeile ein", + "ext.globalConfig.openTokenLink.name": "Öffnen des Token Link", + "ext.globalConfig.supportedFileExtensions.name": "Unterstützte Datei-Erweiterungen", + "ext.globalConfig.supportedFileExtensions.placeholder": "Geben Sie eine Datei-Erweiterung pro Zeile an", + "ext.globalConfig.token.name": "Zugriffs-Token", + "ext.globalConfig.token.placeholder": "Geben Sie Ihren Token ein" +} \ No newline at end of file diff --git a/package.nls.es.json b/package.nls.es.json new file mode 100644 index 00000000..b6547ea1 --- /dev/null +++ b/package.nls.es.json @@ -0,0 +1,144 @@ +{ + "cmd.downloadSettings.error.removeExtFail": "Sincronización: no se puede eliminar algunas de las extensiones.", + "cmd.downloadSettings.error.unableSave": "Sincronización: no se puede guardar la configuración de la extensión de archivo.", + "cmd.downloadSettings.info.downloaded": "Sincronización: Descarga Completa.", + "cmd.downloadSettings.info.gotLatestVersion": "Sincronización: ya tienes la última versión de la configuración guardada.", + "cmd.downloadSettings.info.readdingOnline": "Sincronización: Ajustes De Lectura En Línea.", + "cmd.downloadSettings.title": "Sincronización: La Configuración De Descarga", + "cmd.howSetting.title": "Sincronización: Cómo Configurar", + "cmd.otherOptions.customizedSync": "Sincronización: Añadir Personalizado de Sincronización ruta de acceso del Archivo", + "cmd.otherOptions.customizedSync.done": "Sincronización: {0} ha sido registrado.", + "cmd.otherOptions.customizedSync.placeholder": "Escriba una ruta de acceso absoluta de los adicionales de archivo cargado.", + "cmd.otherOptions.customizedSync.prompt": "(ex. /ruta/a/.eslintrc) será cargado y descargado en la ruta de acceso especificada.", + "cmd.otherOptions.downloadCustomFile": "Sincronización: Importación Personalizada de Sincronización de Archivo de área de trabajo", + "cmd.otherOptions.downloadCustomFile.done": "Descargar {0}.", + "cmd.otherOptions.downloadCustomFile.placeholder": "Seleccione el archivo que desea descargar a la raíz del espacio de trabajo que usted está trabajando.", + "cmd.otherOptions.downloadSetting": "Sincronización: la Configuración de Descarga de Público ESENCIAL", + "cmd.otherOptions.editLocalSetting": "Sincronización: Editar La Extensión De La Configuración Local", + "cmd.otherOptions.error.toggleFail": "Sincronización: no se puede Alternar.", + "cmd.otherOptions.joinCommunity": "Sincronización: Únete A La Comunidad", + "cmd.otherOptions.openIssue": "Sincronización: Tema Abierto", + "cmd.otherOptions.openSettingsPage": "Sincronización: Abrir La Configuración", + "cmd.otherOptions.preserve": "Sincronización: Preservar La Configuración De Dejar De Reemplazar Después De La Descarga", + "cmd.otherOptions.preserve.info.done1": "Sincronización: Hecho. {0} valor será eliminado de la configuración.json después de la descarga.", + "cmd.otherOptions.preserve.info.done2": "Sincronización: Hecho. Extensión mantendrá {0}: {1} en el establecimiento.json después de la descarga.", + "cmd.otherOptions.preserve.placeholder": "Introduzca cualquier Tecla de ajustes.json para preservar.", + "cmd.otherOptions.preserve.prompt": "Ejemplo: Escribir 'http.proxy' => tienda de este equipo proxy y sobrescribir , si el conjunto vacío va a quitar el proxy.", + "cmd.otherOptions.quietSync.off": "Sincronización: Resumen se muestra en la carga/descarga.", + "cmd.otherOptions.quietSync.on": "Sincronización: barra de Estado será actualizado previa de carga/descarga.", + "cmd.otherOptions.releaseNotes": "Sincronización: Notas De La Versión", + "cmd.otherOptions.shareSetting": "Sincronización: Compartir valores con Público ESENCIAL", + "cmd.otherOptions.shareSetting.beforeConfirm": "Sincronización: Esto eliminará actual GIST y cargar la configuración en el nuevo público ESENCIAL. ¿Desea continuar?", + "cmd.otherOptions.title": "Sincronización: Opciones Avanzadas", + "cmd.otherOptions.toggleAutoDownload": "Sincronización: Activar La Descarga Automática En El Arranque", + "cmd.otherOptions.toggleAutoDownload.off": "Sincronización: Descarga Automática DESACTIVADA en VSCode de Inicio.", + "cmd.otherOptions.toggleAutoDownload.on": "Sincronización: Descarga Automática activada después DE VSCode de Inicio.", + "cmd.otherOptions.toggleAutoUpload": "Sincronización: Activar Auto-Cargar En La Configuración De Cambio", + "cmd.otherOptions.toggleAutoUpload.off": "Sincronización: carga Automática de Cambio de Configuración de Apagado.", + "cmd.otherOptions.toggleAutoUpload.on": "Sincronización: carga Automática de Cambio de Configuración de Encendido. Esto tendrá efecto después de reiniciar.", + "cmd.otherOptions.toggleForceDownload": "Sincronización: Alternar La Fuerza De Descarga", + "cmd.otherOptions.toggleForceDownload.off": "Sincronización: La Fuerza De La Descarga De Apagado.", + "cmd.otherOptions.toggleForceDownload.on": "Sincronización: La Fuerza De La Descarga De Encendido.", + "cmd.otherOptions.toggleForceUpload": "Sincronización: Alternar La Fuerza De Carga", + "cmd.otherOptions.toggleForceUpload.off": "Sincronización: La Fuerza De Cargar Apagado.", + "cmd.otherOptions.toggleForceUpload.on": "Sincronización: La Fuerza De Carga Encendido.", + "cmd.otherOptions.toggleSummaryPage": "Sincronización: Alternar Mostrar La Página De Resumen En La Carga/Descarga", + "cmd.otherOptions.triggerReset": "Sincronización: ¿desea restablecer la configuración ?", + "cmd.otherOptions.warning.tokenNotRequire": "Sincronización: Ajustes de Sincronización de no pedir GitHub Token a partir de ahora.", + "cmd.resetSettings.info.resetting": "Sincronización: Al Restablecer Su Configuración.", + "cmd.resetSettings.info.settingClear": "Sincronización: La Configuración Se Borra.", + "cmd.resetSettings.title": "Sincronización: Restablecer La Configuración De La Extensión", + "cmd.updateSettings.error.gistNotSave": "Sincronización: los GIST NO se GUARDAN", + "cmd.updateSettings.error.newGistCreateFail": "Sincronización: no se puede crear el Gist.", + "cmd.updateSettings.error.readGistFail": "Sincronización: GIST ID: {0} no se puede LEER.", + "cmd.updateSettings.info.gotLatestVersion": "Sincronización: Ya has subido la última versión de la configuración guardada.", + "cmd.updateSettings.info.newGistCreated": "Sincronización: Nueva esencia creada.", + "cmd.updateSettings.info.readding": "Sincronización: Ajustes de Lectura y Extensiones.", + "cmd.updateSettings.info.shareGist": "Sincronización: Compartir la Identificación con otros usuarios de la extensión para compartir la configuración.", + "cmd.updateSettings.info.uploadCanceled": "Sincronización: El Proceso De Carga De Cancelado.", + "cmd.updateSettings.info.uploading": "Sincronización: Cargar/Actualizar La Configuración En GitHub.", + "cmd.updateSettings.info.uploadingDone": "Sincronización: Carga Completa. GIST ID: {0}. Por favor, copiar y utilizar este ID en otras máquinas para la configuración de descarga.", + "cmd.updateSettings.info.uploadingFile": "Sincronización: La Carga De Archivos De Datos.", + "cmd.updateSettings.info.uploadingSuccess": "Sincronización: Se Cargó Correctamente.", + "cmd.updateSettings.title": "Sincronización: Actualización/Cargar La Configuración De", + "cmd.updateSettings.warning.OSNotSupported": "Sincronización de Pragma OS valor {0} no se admite en la línea {1}", + "cmd.updateSettings.warning.noToken": "Sincronización: Conjunto de GitHub Token o desactivar el downloadPublicGist' desde el local de la configuración de Sincronización de archivos.", + "common.action.donate": "Dona Ahora", + "common.action.joinCommunity": "Únete A La Comunidad", + "common.action.openExtPage": "Abra La Extensión De La Página", + "common.action.openExtTutorial": "Abra Tutorial", + "common.action.releaseNotes": "Notas De La Versión", + "common.action.support": "Apoyar Este Proyecto", + "common.action.writeReview": "Escribe Una Reseña", + "common.button.no": "No", + "common.button.yes": "Sí", + "common.error.canNotSave": "Sincronización: no se puede Guardar la Configuración. Por favor, asegúrese de que usted tiene válido JSON configuración.archivo json. (por ejemplo: No comas finales)", + "common.error.connection": "Sincronización: Internet No está Conectado o no se puede Conectar a GitHub. La excepción se Registra en la Consola", + "common.error.gistNotSave": "Sincronización: Los Gist No Se Guardan.", + "common.error.invalidGistId": "Sincronización: No Válido Gist Id Introducido. Compruebe su esencia: https://gist.github.com//.", + "common.error.invalidToken": "Sincronización: No Válido O Caducado GitHub Token. Por favor, generar nuevas token con los ámbitos mencionados en el archivo léame. La excepción se Registra en la Consola.", + "common.error.message": "Sincronización: Error Registrado En la Consola (menú Ayuda > Activar Herramientas de Desarrollador).", + "common.error.tokenNotSave": "Sincronización: Token No Se Guardan.", + "common.info.donate": "Sincronización: ¿te gusta esta extensión? Acerca de cómo escribir una reseña o el envío de una donación? ", + "common.info.excludeFile": "Sincronización: puede excluir cualquier archivo/carpeta para la carga y la configuración de descarga.", + "common.info.gistSaved": "Sincronización: Gist Guardado", + "common.info.initAutoUpload": "Sincronización: Carga Automática De Iniciar En {0} Segundos.", + "common.info.installed": "Sincronización: Ajustes creado, gracias por la instalación!", + "common.info.needHelp": "Sincronización: Necesita Ayuda para configurar esta extensión?", + "common.info.setToken": "Sincronización: Ahora Usted puede configurar su GitHub token manualmente en `syncLocalSettings.json`", + "common.info.tokenSaved": "Sincronización: Token Guardado", + "common.info.updateTo": "Sincronización: Actualizado a la v{0}", + "common.info.updating": "Sincronización: Actualización En Progreso... Por Favor Espere.", + "common.placeholder.enterGistId": "Entrar En Esencia Id", + "common.placeholder.enterGithubAccessToken": "Entrar En GitHub Personal Token De Acceso", + "common.placeholder.multipleGist": "Gist Nombre (por ejemplo: la Configuración Personal)", + "common.prompt.enterGistId": "Introduzca Esencia de Identificación de cargado previamente la configuración. También puede configurar manualmente en el código de configuración (sincronización.gist). Pulse [Enter] o [Esc] para cancelar.", + "common.prompt.enterGithubAccessToken": "Usted también agregar manualmente un símbolo (token) de la Carpeta de Usuario/syncLocalSettings.json). Pulse [Enter] o [Esc] para cancelar.", + "common.prompt.gistForceUpload": "Sincronización: La carga reemplazará la configuración en GitHub Gist. Considere descargar la configuración o realizar una carga forzada. ¿Todavía quieres subir con fuerza?", + "common.prompt.gistNewer": "Sincronización: La configuración de Gist ha cambiado desde la última vez que la descargó. ¿Desea cargar su configuración local actual a Gist de todos modos?", + "common.prompt.multipleGist": "Permite identificar las opciones de configuración si tiene varios gist.", + "common.prompt.restartCode": "¿Desea volver a cargar para aplicar extensiones y configuraciones?", + "ext.config.autoDownload": "Conjunto es cierto para Descargar automáticamente los ajustes en el código de inicio. [Código Necesario Reiniciar]", + "ext.config.autoDownload.name": "Descarga Automática", + "ext.config.autoUpload": "Conjunto es cierto para Carga Automática en la configuración de cambio. [Código Necesario Reiniciar]", + "ext.config.autoUpload.name": "Carga Automática", + "ext.config.forceDownload": "Se establece en true si desea descargar los ajustes, incluso cuando se tiene la configuración más reciente.", + "ext.config.forceDownload.name": "La Fuerza De La Descarga", + "ext.config.forceUpload": "Se establece en true si desea cargar la configuración incluso cuando la ESENCIA tiene una configuración nueva.", + "ext.config.forceUpload.name": "Fuerza De Carga", + "ext.config.gist": "GitHub ESENCIA de IDENTIFICACIÓN para la Configuración de Sincronización.", + "ext.config.gist.name": "Gist ID", + "ext.config.gist.placeholder": "Entrar en Esencia ID", + "ext.config.host": "Establece a su GitHub Enterprise host si desea utilizar GHE.", + "ext.config.lastDownload": "La configuración de Sincronización de la última fecha de descarga. Establecer como vacío si desea manualmente golpe de descarga.", + "ext.config.lastUpload": "La configuración de Sincronización de la última fecha de subida. Establecer como vacío si desea manualmente golpe de descarga.", + "ext.config.pathPrefix": "Establece a su GitHub Enterprise API prefijo si desea utilizar GHE. Normalmente '/api/v3'. Sólo se utiliza cuando el host está configurado.", + "ext.config.quietSync": "Cuando se establece en true, se mostrará el resultado en la barra de estado en lugar de la página de resumen.", + "ext.config.quietSync.name": "Tranquilo Sync", + "ext.config.removeExtensions": "Establece en false si no desea eliminar extensiones, mientras que la descarga.", + "ext.config.removeExtensions.name": "Quitar Las Extensiones De", + "ext.config.syncExtensions": "Establece en false si usted no desea cargar/descargar las extensiones.", + "ext.config.syncExtensions.name": "Sincronización De Extensiones", + "ext.config.title": "Código De Configuración De La Configuración De Sincronización De La Configuración De", + "ext.globalConfig.askGistDescription.name": "Pida A Los Gist Nombre", + "ext.globalConfig.autoUploadDelay.name": "Carga Automática De Retardo", + "ext.globalConfig.autoUploadDelay.placeholder": "Ingrese la cantidad de segundos de retardo de auto-carga", + "ext.globalConfig.downloadPublicGist.name": "Descargar Público Esencial", + "ext.globalConfig.gistDescription.name": "Gist Descripción", + "ext.globalConfig.gistDescription.placeholder": "Entrar En Esencia Descripción", + "ext.globalConfig.githubEnterpriseUrl.name": "GitHub Enterprise URL (opcional)", + "ext.globalConfig.githubEnterpriseUrl.placeholder": "Entrar en GitHub Enterprise URL", + "ext.globalConfig.hostName.name": "Nombre de host (opcional)", + "ext.globalConfig.hostName.placeholder": "Introduzca Nombre De Host", + "ext.globalConfig.ignoreExtensions.name": "Ignorado Extensiones", + "ext.globalConfig.ignoreExtensions.placeholder": "Introduzca una extensión por línea (nombre completo)", + "ext.globalConfig.ignoreUploadFiles.name": "Archivos Ignorados", + "ext.globalConfig.ignoreUploadFiles.placeholder": "Introduzca un archivo por línea", + "ext.globalConfig.ignoreUploadFolders.name": "Ignorado Carpetas", + "ext.globalConfig.ignoredUploadFolders.placeholder": "Entrar en una carpeta por cada línea", + "ext.globalConfig.openTokenLink.name": "Abierto Token De Enlace", + "ext.globalConfig.supportedFileExtensions.name": "Las Extensiones De Archivo", + "ext.globalConfig.supportedFileExtensions.placeholder": "Introduzca una extensión de archivo por línea", + "ext.globalConfig.token.name": "Token De Acceso", + "ext.globalConfig.token.placeholder": "Introduzca Token" +} \ No newline at end of file diff --git a/package.nls.fr.json b/package.nls.fr.json new file mode 100644 index 00000000..74395337 --- /dev/null +++ b/package.nls.fr.json @@ -0,0 +1,143 @@ +{ + "cmd.downloadSettings.error.removeExtFail": "Sync: Impossible de supprimer certaines extensions.", + "cmd.downloadSettings.error.unableSave": "Sync: Impossible d'enregistrer les paramètres de l'extension de fichier.", + "cmd.downloadSettings.info.downloaded": "Sync: Téléchargement terminé.", + "cmd.downloadSettings.info.gotLatestVersion": "Sync: Vous avez déjà la dernière version des paramètres enregistrés.", + "cmd.downloadSettings.info.readdingOnline": "Sync: Lecture des paramètres en ligne.", + "cmd.downloadSettings.title": "Sync: Paramètres de téléchargement", + "cmd.howSetting.title": "Sync: Comment configurer", + "cmd.otherOptions.customizedSync": "Sync: Ajouter un chemin d'accès au fichier de synchronisation personnalisé", + "cmd.otherOptions.customizedSync.done": "Sync: {0} a été enregistré.", + "cmd.otherOptions.customizedSync.placeholder": "Entrez un chemin d'accès absolu au fichier supplémentaires uploadé.", + "cmd.otherOptions.customizedSync.prompt": "(ex. /chemin/vers/.eslintrc) sera uploadé et téléchargé vers le chemin spécifié.", + "cmd.otherOptions.downloadCustomFile": "Sync: Importer un Fichier de Synchronisation Personnalisé à l'espace de travail", + "cmd.otherOptions.downloadCustomFile.done": "Téléchargé: {0}.", + "cmd.otherOptions.downloadCustomFile.placeholder": "Sélectionnez le fichier que vous souhaitez télécharger à la racine de l'espace de travail actuel.", + "cmd.otherOptions.downloadSetting": "Sync: Télécharger les configuration depuis un GIST public", + "cmd.otherOptions.editLocalSetting": "Sync: Modifier les paramètres locaux de l'extension", + "cmd.otherOptions.error.toggleFail": "Sync: Impossible d'activer.", + "cmd.otherOptions.joinCommunity": "Sync: Rejoignez la communauté", + "cmd.otherOptions.openIssue": "Sync: Créer une \"Issue\"", + "cmd.otherOptions.openSettingsPage": "Sync: Ouvrir les paramètres", + "cmd.otherOptions.preserve": "Sync: Empêche le remplacement des paramètres au téléchargement", + "cmd.otherOptions.preserve.info.done1": "Sync: Fait. La valeur de {0} sera supprimée dans settings.json après le téléchargement.", + "cmd.otherOptions.preserve.info.done2": "Sync: Fait. L'extension gardera {0}: {1} dans settings.json après le téléchargement.", + "cmd.otherOptions.preserve.placeholder": "Entrez n'importe quelle clé de settings.json pour la préserver.", + "cmd.otherOptions.preserve.prompt": "Exemple: Écrivez 'http.proxy' => enregistre ce proxy et le remplacer, si vide le proxy sera supprimé.", + "cmd.otherOptions.quietSync.off": "Sync: Un résumé s'affiche lors du téléchargement/upload.", + "cmd.otherOptions.quietSync.on": "Sync: La barre de statut sera mis à jour lors d'un téléchargement/upload.", + "cmd.otherOptions.releaseNotes": "Sync: Notes de version", + "cmd.otherOptions.shareSetting": "Sync: Partagez vos paramètres grâce aux GIST public", + "cmd.otherOptions.shareSetting.beforeConfirm": "Sync: Cela permettra de supprimer le GIST actuel et uploadera vos paramètres sur un nouveau GIST public. Voulez-vous continuer?", + "cmd.otherOptions.title": "Sync: Options avancées", + "cmd.otherOptions.toggleAutoDownload": "Sync: Active le téléchargement automatique au démarrage", + "cmd.otherOptions.toggleAutoDownload.off": "Sync: Téléchargement automatique DÉSACTIVÉE au démarrage de VSCode.", + "cmd.otherOptions.toggleAutoDownload.on": "Sync: Téléchargement automatique ACTIVÉ au démarrage de VSCode.", + "cmd.otherOptions.toggleAutoUpload": "Sync: Activer / Désactiver l'upload automatique lorsque vous changez vos paramètres", + "cmd.otherOptions.toggleAutoUpload.off": "Sync: L'upload automatique lors de modification des paramètres est désactivé.", + "cmd.otherOptions.toggleAutoUpload.on": "Sync: L'upload automatique lors de modification des paramètres est activé. Cela prendra effet après le redémarrage.", + "cmd.otherOptions.toggleForceDownload": "Sync: Permet de forcer le téléchargement", + "cmd.otherOptions.toggleForceDownload.off": "Sync: Téléchargement forcé désactivé.", + "cmd.otherOptions.toggleForceDownload.on": "Sync: Téléchargement forcé activé.", + "cmd.otherOptions.toggleForceUpload": "Sync: Activer l'upload forcé", + "cmd.otherOptions.toggleForceUpload.off": "Sync: Upload forcé désactivé.", + "cmd.otherOptions.toggleForceUpload.on": "Sync: Upload forcé activé.", + "cmd.otherOptions.toggleSummaryPage": "Sync: Active l'affichage de la page \"Résumé\" lors d'un téléchargement/upload", + "cmd.otherOptions.triggerReset": "Sync: Voulez-vous réinitialiser les paramètres ?", + "cmd.otherOptions.warning.tokenNotRequire": "Sync: Settings Sync ne vous demandera plus de Token GitHub à partir de maintenant.", + "cmd.resetSettings.info.resetting": "Sync: Réinitialisation de vos paramètres.", + "cmd.resetSettings.info.settingClear": "Sync: Paramètres effacés.", + "cmd.resetSettings.title": "Sync: Réinitialise les paramètres de l'extension", + "cmd.updateSettings.error.gistNotSave": "Sync: GIST NON ENREGISTRÉ", + "cmd.updateSettings.error.newGistCreateFail": "Sync: Impossible de créer le Gist.", + "cmd.updateSettings.error.readGistFail": "Sync: GIST ID: {0} NE PEUT ETRE LU.", + "cmd.updateSettings.info.gotLatestVersion": "Sync: Vous avez déjà téléchargé la dernière version des paramètres enregistrés.", + "cmd.updateSettings.info.newGistCreated": "Sync: Nouveau gist créé.", + "cmd.updateSettings.info.readding": "Sync: Lecture des paramètres et des extensions.", + "cmd.updateSettings.info.shareGist": "Sync: Partager l'Id avec un autre utilisateur de l'extension pour partager les paramètres.", + "cmd.updateSettings.info.uploadCanceled": "Sync: Processus de téléchargement annulé.", + "cmd.updateSettings.info.uploading": "Sync: Upload/Mise À Jour de vos paramètres sur GitHub.", + "cmd.updateSettings.info.uploadingDone": "Sync: Upload complet. GIST ID: {0}. Merci de copiez et d'utiliser cette ID dans d'autres machines pour télécharger les paramètres.", + "cmd.updateSettings.info.uploadingFile": "Sync:, Upload des fichiers de données.", + "cmd.updateSettings.info.uploadingSuccess": "Sync: Uploadé avec succès.", + "cmd.updateSettings.title": "Sync: Mettre À Jour/Uploader vos paramètres", + "cmd.updateSettings.warning.OSNotSupported": "Sync Pragma OS de la valeur {0} non pris en charge à la ligne {1}", + "cmd.updateSettings.warning.noToken": "Sync: Ajoutez un Token GitHub ou désactivez 'downloadPublicGist' de votre fichier local des paramètres de synchronisation.", + "common.action.donate": "Faites un don maintenant", + "common.action.joinCommunity": "Rejoignez la communauté", + "common.action.openExtPage": "Ouvrir la page de l'extension", + "common.action.openExtTutorial": "Ouvrir le tutoriel", + "common.action.releaseNotes": "Notes de version", + "common.action.support": "Soutenir ce projet", + "common.action.writeReview": "Écrire une review", + "common.button.no": "Non", + "common.button.yes": "Oui", + "common.error.canNotSave": "Sync: Impossible d'enregistrer les paramètres. Assurez-vous d'avoir un JSON valide dans votre fichier settings.json.", + "common.error.connection": "Sync: Pas de connection internet ou impossible de se connecter à GitHub. Exception enregistré dans la Console", + "common.error.gistNotSave": "Sync: Gist non enregistré.", + "common.error.invalidGistId": "Sync: Gist Id non valide. Vérifiez votre gist: https://gist.github.com//.", + "common.error.invalidToken": "Sync: Token Github non valide ou expiré. Veuillez créer un nouveau token avec des étendues mentionné dans le fichier le readme. Exception Enregistré dans la Console.", + "common.error.message": "Sync: Erreur enregistré dans la Console (menu Aide > activer / désactiver les Outils de développement).", + "common.error.tokenNotSave": "Sync: Token Non Enregistré.", + "common.info.donate": "Sync: Aimez-vous cette extension? Souhaitez-vous écrire une review ou envoyer un don? ;)", + "common.info.excludeFile": "Synchronisation: Vous pouvez exclure n'importe quel fichier/dossier pour l'upload et paramètres pour le téléchargement.", + "common.info.gistSaved": "Sync: Gist Enregistré", + "common.info.initAutoUpload": "Sync: Le téléchargement automatique démarrera dans {0} secondes.", + "common.info.installed": "Sync: Paramètres créés, je vous remercie d'avoir installé cette extension!", + "common.info.needHelp": "Sync: Besoin d'aide pour configurer cette extension?", + "common.info.setToken": "Synchronisation: Vous pouvez désormais paramétrer votre Token GitHub manuellement dans \"syncLocalSettings.json\"", + "common.info.tokenSaved": "Sync: Token Enregistré", + "common.info.updateTo": "Sync: Mise à jour à v{0}", + "common.info.updating": "Sync: Mise à jour en cours... Veuillez patienter.", + "common.placeholder.enterGistId": "Entrez Gist Id", + "common.placeholder.enterGithubAccessToken": "Entrez GitHub Personal Access Token", + "common.placeholder.multipleGist": "Gist Name (par exemple: Paramètres Personnels)", + "common.prompt.enterGistId": "Entrez le Gist Id de vos paramètres précédemment uploadé. Vous pouvez également définir le manuellement dans les paramètres de VSCode (sync.gist). Appuyez sur la touche [Enter] ou [Esc] pour annuler.", + "common.prompt.enterGithubAccessToken": "Vous aussi ajouter manuellement un token (Dossier Utilisateur/syncLocalSettings.json). Appuyez sur la touche [Enter] ou [Esc] pour annuler.", + "common.prompt.gistForceUpload": "Sync: Le téléchargement remplacera les paramètres dans GitHub Gist. Pensez à télécharger les paramètres ou à effectuer un téléchargement forcé. Voulez-vous toujours télécharger avec force?", + "common.prompt.gistNewer": "Sync: Les paramètres dans Gist ont changé depuis votre dernier téléchargement. Voulez-vous quand même télécharger vos paramètres locaux actuels dans Gist?", + "common.prompt.multipleGist": "Vous permet d'identifier les paramètres si vous avez plusieurs de gist.", + "common.prompt.restartCode": "Voulez-vous recharger afin d'appliquer les extensions et les configurations?", + "ext.config.autoDownload": "Changez la valeur à true pour télécharger automatiquement les paramètres lors du démarrage de VSCode. [Redémarrage de VSCode Nécessaire]", + "ext.config.autoDownload.name": "Téléchargement Automatique", + "ext.config.autoUpload": "Changez la valeur à true afin d'uploader automatiquement lors de modification des paramètres. [Redémarrage de VSCode Nécessaire]", + "ext.config.forceDownload": "Changez la valeur à true si vous souhaitez télécharger les paramètres, même lorsque vous avez les derniers paramètres.", + "ext.config.forceDownload.name": "Forcer Le Téléchargement", + "ext.config.forceUpload": "Changez la valeur à true si vous souhaitez uploader les paramètres, même lorsque le GIST a de nouveaux paramètres.", + "ext.config.forceUpload.name": "Forcer l'upload", + "ext.config.gist": "GitHub GIST ID pour Settings Sync.", + "ext.config.gist.name": "Gist ID", + "ext.config.gist.placeholder": "Entrez Gist ID", + "ext.config.host": "Changez la valeur à votre hôte GitHub Entreprise si vous souhaitez utiliser GHE.", + "ext.config.lastDownload": "Settings Sync dernière date de téléchargement. Laissez vide si vous souhaitez télécharger manuellement.", + "ext.config.lastUpload": "Settings Sync dernière date d'upload. Laissez vide si vous souhaitez uploader manuellement", + "ext.config.pathPrefix": "Changez la valeur à votre GitHub Enterprise API préfixe si vous souhaitez utiliser GHE. Normalement '/api/v3'. Utilisé uniquement lorsque l'hôte est défini.", + "ext.config.quietSync": "Lorsque la valeur est true, affiche le résultat dans la barre d'état au lieu de la page de résumé.", + "ext.config.quietSync.name": "Sync silencieuse", + "ext.config.removeExtensions": "Changez la valeur à false si vous ne voulez pas supprimer des extensions pendant le téléchargement.", + "ext.config.removeExtensions.name": "Supprimer Des Extensions", + "ext.config.syncExtensions": "Changez la valeur à false si vous ne voulez pas uploader/télécharger l'extensions.", + "ext.config.syncExtensions.name": "Synchronisation Des Extensions", + "ext.config.title": "Paramètres de configuration de la synchronisation des paramètres VSCode", + "ext.globalConfig.askGistDescription.name": "Demande le nom du Gist", + "ext.globalConfig.autoUploadDelay.name": "Délai de l'upload automatique", + "ext.globalConfig.autoUploadDelay.placeholder": "Entrez le montant de secondes avant chaque upload automatique", + "ext.globalConfig.downloadPublicGist.name": "Télécharger un Gist Public", + "ext.globalConfig.gistDescription.name": "Description du Gist", + "ext.globalConfig.gistDescription.placeholder": "Entrez un description du Gist", + "ext.globalConfig.githubEnterpriseUrl.name": "GitHub Enterprise URL (facultatif)", + "ext.globalConfig.githubEnterpriseUrl.placeholder": "Entrez GitHub Enterprise URL", + "ext.globalConfig.hostName.name": "Nom d'hôte (facultatif)", + "ext.globalConfig.hostName.placeholder": "Entrez Le Nom D'Hôte", + "ext.globalConfig.ignoreExtensions.name": "Ignorer Des Extensions", + "ext.globalConfig.ignoreExtensions.placeholder": "Entrez une extension par ligne (nom complet)", + "ext.globalConfig.ignoreUploadFiles.name": "Fichiers Ignorés", + "ext.globalConfig.ignoreUploadFiles.placeholder": "Entrez un fichier par ligne", + "ext.globalConfig.ignoreUploadFolders.name": "Ignorer Des Dossiers", + "ext.globalConfig.ignoredUploadFolders.placeholder": "Entrez un dossier par ligne", + "ext.globalConfig.openTokenLink.name": "Ouvrir Le Lien vers le Token", + "ext.globalConfig.supportedFileExtensions.name": "Extensions de fichier pris en charge", + "ext.globalConfig.supportedFileExtensions.placeholder": "Saisissez une extension de fichier par ligne", + "ext.globalConfig.token.name": "Token D'Accès", + "ext.globalConfig.token.placeholder": "Entrez un Token" +} diff --git a/package.nls.hu.json b/package.nls.hu.json new file mode 100644 index 00000000..9d3fbd29 --- /dev/null +++ b/package.nls.hu.json @@ -0,0 +1,143 @@ +{ + "cmd.downloadSettings.error.removeExtFail": "Fordította: Képes eltávolítani bizonyos fájlokat.", + "cmd.downloadSettings.error.unableSave": "Fordította: Nem lehet menteni kiterjesztését a beállítások, a fájl.", + "cmd.downloadSettings.info.downloaded": "Fordította: Letöltés Teljes.", + "cmd.downloadSettings.info.gotLatestVersion": "Fordította: már a legújabb verzió a mentett beállítások.", + "cmd.downloadSettings.info.readdingOnline": "Fordította: Olvasási Beállítások Online.", + "cmd.downloadSettings.title": "Fordította: Letöltési Beállítások", + "cmd.howSetting.title": "Fordította: Hogyan Kell Beállítani", + "cmd.otherOptions.customizedSync": "Fordította: Add Egyéni Fordította: Fájl elérési útját", + "cmd.otherOptions.customizedSync.done": "Fordította: {0} regisztrálták.", + "cmd.otherOptions.customizedSync.placeholder": "Adjon meg egy abszolút elérési útvonalát, előfordulhat, hogy a feltöltött fájl.", + "cmd.otherOptions.customizedSync.prompt": "(ex. /path/to/.eslintrc) feltöltésre kerül, illetve a letöltött fájl a megadott elérési utat.", + "cmd.otherOptions.downloadCustomFile": "Fordította: Import Egyéni Fordította: Fájlt munkaterület", + "cmd.otherOptions.downloadCustomFile.done": "A letöltött {0}.", + "cmd.otherOptions.downloadCustomFile.placeholder": "Válassza ki a kívánt fájlt kell letölteni, hogy a gyökér a munkaterület, amelyen dolgozik.", + "cmd.otherOptions.downloadSetting": "Fordította: Letöltési Beállítások a Nyilvános GIST", + "cmd.otherOptions.editLocalSetting": "Fordította: Edit Kiterjesztését Helyi Beállítások", + "cmd.otherOptions.error.toggleFail": "Fordította: Nem Kapcsoló.", + "cmd.otherOptions.joinCommunity": "Fordította: Csatlakozzon Közösségi", + "cmd.otherOptions.openIssue": "Fordította: Nyitott Kérdés", + "cmd.otherOptions.openSettingsPage": "Fordította: Nyissa Meg A Beállításokat", + "cmd.otherOptions.preserve": "Fordította: Megőrizni A Beállítást, Hogy Ne Felülbírálja Letöltés Után", + "cmd.otherOptions.preserve.info.done1": "Fordította: Kész. {0} érték el lesz távolítva a beállítások.json letöltése után.", + "cmd.otherOptions.preserve.info.done2": "Fordította: Kész. Kiterjesztését fogja {0}: {1} a beállítást.json letöltése után.", + "cmd.otherOptions.preserve.placeholder": "Adja meg bármelyik Gombot, a beállítások.json megőrizni.", + "cmd.otherOptions.preserve.prompt": "Példa: Írd http.proxy' => tárolja a számítógép proxy, illetve felülírása , ha meghatározott üres, akkor távolítsa el a proxy.", + "cmd.otherOptions.quietSync.off": "Fordította: Összefoglaló jelenik meg, amikor letöltés/feltöltés.", + "cmd.otherOptions.quietSync.on": "Fordította: állapotsor után fogjuk frissíteni letöltés/feltöltés.", + "cmd.otherOptions.releaseNotes": "Fordította: Kiadási Megjegyzések", + "cmd.otherOptions.shareSetting": "Fordította: Share Beállítások a Nyilvános GIST", + "cmd.otherOptions.shareSetting.beforeConfirm": "Fordította: Ez eltávolítja az aktuális GIST-ben, illetve feltöltési beállítások az új állami LÉNYEGET. Akarod, hogy folytassam?", + "cmd.otherOptions.title": "Fordította: Speciális Beállítások", + "cmd.otherOptions.toggleAutoDownload": "Fordította: Kapcsoló Automatikus Letöltés Bekapcsoláskor", + "cmd.otherOptions.toggleAutoDownload.off": "Fordította: Automatikus Letöltés KI van kapcsolva után VSCode Indítási.", + "cmd.otherOptions.toggleAutoDownload.on": "Fordította: Automatikus Letöltés bekapcsolása után VSCode Indítási.", + "cmd.otherOptions.toggleAutoUpload": "Fordította: Kapcsoló Automatikus Feltöltés A Beállítások Módosítása", + "cmd.otherOptions.toggleAutoUpload.off": "Fordította: Automatikus feltöltés Beállítás Módosítása Kapcsolva.", + "cmd.otherOptions.toggleAutoUpload.on": "Fordította: Automatikus feltöltés Beállítás Módosítása Kapcsolva. Ez akkor lép érvénybe, amikor az újraindítás.", + "cmd.otherOptions.toggleForceDownload": "Fordította: Kapcsoló Erő Letöltés", + "cmd.otherOptions.toggleForceDownload.off": "Fordította: Erő Letöltés Ki Van Kapcsolva.", + "cmd.otherOptions.toggleForceDownload.on": "Fordította: Erő Letöltés Kapcsolva.", + "cmd.otherOptions.toggleForceUpload": "Fordította: Kapcsoló Erő Feltöltés", + "cmd.otherOptions.toggleForceUpload.off": "Fordította: Erő Feltöltés Ki Van Kapcsolva.", + "cmd.otherOptions.toggleForceUpload.on": "Fordította: Erő Feltöltés Kapcsolva.", + "cmd.otherOptions.toggleSummaryPage": "Fordította: Kapcsoló Show-Gyűjtő Oldal Feltöltés/Letöltés", + "cmd.otherOptions.triggerReset": "Fordította: akarod, hogy állítsa vissza a beállításokat ?", + "cmd.otherOptions.warning.tokenNotRequire": "Fordította: Beállítások a Szinkronizálás nem fogja megkérdezni a GitHub Token mostantól.", + "cmd.resetSettings.info.resetting": "Fordította: Újraindítani A Beállításokat.", + "cmd.resetSettings.info.settingClear": "Fordította: Beállítások Törölve.", + "cmd.resetSettings.title": "Fordította: Hosszabbító Beállítások Visszaállítása", + "cmd.updateSettings.error.gistNotSave": "Fordította: LÉNYEGET NEM MENTETT", + "cmd.updateSettings.error.newGistCreateFail": "Fordította: Nem sikerült létrehozni Lényeget.", + "cmd.updateSettings.error.readGistFail": "Fordította: LÉNYEGET ID: {0} NEM OLVASTAM.", + "cmd.updateSettings.info.gotLatestVersion": "Fordította: Már feltöltötte a mentett beállítások legújabb verzióját.", + "cmd.updateSettings.info.newGistCreated": "Fordította: Új lényeget létre.", + "cmd.updateSettings.info.readding": "Fordította: Olvasási Beállítások, majd a Fájlokat.", + "cmd.updateSettings.info.shareGist": "Fordította: oszd meg az Id más kiterjesztését a felhasználók számára, hogy megosszák a beállításokat.", + "cmd.updateSettings.info.uploadCanceled": "Fordította: Feltöltési Folyamat Elmarad.", + "cmd.updateSettings.info.uploading": "Fordította: Feltöltés/Frissítése A Beállításokat A GitHub.", + "cmd.updateSettings.info.uploadingDone": "Fordította: Feltöltés Befejeződött. GIST-ID: {0}. Kérem másolja használja ID más gépek beállítások letöltése.", + "cmd.updateSettings.info.uploadingFile": "Fordította: Fájlok Feltöltése Adatokkal.", + "cmd.updateSettings.info.uploadingSuccess": "Fordította: Feltöltött Sikeresen.", + "cmd.updateSettings.title": "Fordította: Frissítés/Feltöltési Beállítások", + "cmd.updateSettings.warning.OSNotSupported": "Fordította: Pragma OS érték a {0} nem támogatott a sor {1}", + "cmd.updateSettings.warning.noToken": "Fordította: Állítsa be a GitHub Token vagy letiltása 'downloadPublicGist a helyi Szinkronizálási beállítások fájlt.", + "common.action.donate": "Adományozni Most", + "common.action.joinCommunity": "Csatlakozzon Közösségi", + "common.action.openExtPage": "Nyitva Kiterjesztését Oldal", + "common.action.openExtTutorial": "Nyílt Bemutató", + "common.action.releaseNotes": "Kiadási Megjegyzések", + "common.action.support": "Támogatja Ezt A Projektet", + "common.action.writeReview": "Írd Felülvizsgálat", + "common.button.no": "Nem", + "common.button.yes": "Igen", + "common.error.canNotSave": "Fordította: Nem lehet Menteni a Beállításokat. Kérjük, győződjön meg arról, hogy érvényes JSON beállítások.json fájlt. (például: Nem záró vesszőt)", + "common.error.connection": "Fordította: Internet Nincs Csatlakoztatva, vagy Nem tud Csatlakozni a GitHub. Kivétel Bejelentkezett Konzol", + "common.error.gistNotSave": "Fordította: Lényeget Nem Mentette Meg.", + "common.error.invalidGistId": "Fordította: Érvénytelen Lényeget Id Lépett. Ellenőrizze a lényeget: https://gist.github.com//.", + "common.error.invalidToken": "Fordította: Érvénytelen, Lejárt/GitHub Token. Kérjük, ezáltal új token a hatókörök említette a readme-t. Kivétel Bejelentkezett Konzol.", + "common.error.message": "Fordította: Hiba Naplózásra Konzol (Súgó menü > Kapcsoló Fejlesztő Eszközök).", + "common.error.tokenNotSave": "Fordította: Token Nem Mentette Meg.", + "common.info.donate": "Fordította: tetszik ez a kiterjesztés? Hogy az írásban felülvizsgálatot, vagy küld egy adomány? ", + "common.info.excludeFile": "Fordította: kizárhat bármely fájl/mappa a feltöltés, illetve a beállítások letöltéséhez.", + "common.info.gistSaved": "Fordította: Lényeget Elmentett", + "common.info.initAutoUpload": "Fordította: Automatikus Feltöltés Kezdeményező A {0} Másodperc.", + "common.info.installed": "Fordította: Beállítások létre, köszönöm, telepítése!", + "common.info.needHelp": "Fordította: Segítség konfigurálása ez a kiterjesztés?", + "common.info.setToken": "Fordította: Most beállíthatjuk, Hogy a GitHub token kézzel a `syncLocalSettings.json`", + "common.info.tokenSaved": "Fordította: Token Elmentett", + "common.info.updateTo": "Fordította: Frissített v{0}", + "common.info.updating": "Fordította: Frissítése Folyamatban Kérem Várjon.", + "common.placeholder.enterGistId": "Adja Meg Lényeget Id", + "common.placeholder.enterGithubAccessToken": "Írja Be A GitHub Személyes Access Token", + "common.placeholder.multipleGist": "Lényeg a Neve (például: Személyes Beállítások)", + "common.prompt.enterGistId": "Adja meg Lényeget Id a korábban feltöltött beállítások. Azt is beállíthatja kézzel a kódot a beállítások (fordította.gist). Nyomja meg az [Enter] vagy az [Esc] lemondani.", + "common.prompt.enterGithubAccessToken": "Te kézzel is hozzáadhat egy token (Felhasználói Mappa/syncLocalSettings.json). Nyomja meg az [Enter] vagy az [Esc] lemondani.", + "common.prompt.gistForceUpload": "Fordította: A feltöltés felváltja a GitHub Gist beállításait. Fontolja meg a beállítások letöltését vagy egy kényszerű feltöltést. Még mindig erőteljesen szeretne feltölteni?", + "common.prompt.gistNewer": "Fordította: A Gist beállításai megváltoztak az utóbbi letöltés óta. Egyébként feltölti a jelenlegi helyi beállításait a Gistbe?", + "common.prompt.multipleGist": "Lehetővé teszi, hogy azonosítsa a beállítások ha több lényeget.", + "common.prompt.restartCode": "Akarod, hogy újra alkalmazni fájlokat, konfigurációk?", + "ext.config.autoDownload": "Állítsa igaz, hogy az Automatikus Letöltés beállításai kód kezdeni. [Kód Újraindítás Szükséges]", + "ext.config.autoDownload.name": "Automatikus Letöltés", + "ext.config.autoUpload": "Állítsa igaz, hogy az Automatikus Feltöltés a beállítások módosítása. [Kód Újraindítás Szükséges]", + "ext.config.autoUpload.name": "Automatikus Feltöltés", + "ext.config.forceDownload": "Állítsa be, hogy igaz, ha szeretné letölteni a beállítások akkor is, ha a legújabb beállítások.", + "ext.config.forceDownload.name": "Erő Letöltés", + "ext.config.forceUpload": "Állítsa be, hogy igaz, ha a feltölteni kívánt a beállítások akkor is, ha a LÉNYEGET újabb beállításokat.", + "ext.config.forceUpload.name": "Erő Feltöltés", + "ext.config.gist": "A GitHub LÉNYEGET ID a Beállítások Szinkronizálása.", + "ext.config.gist.name": "Lényeg ID", + "ext.config.gist.placeholder": "Adja meg Lényeget ID", + "ext.config.host": "Állítsa be, hogy a GitHub Enterprise fogadó, ha használni szeretnénk, GHE.", + "ext.config.lastDownload": "Beállítások a Szinkronizálás utolsó letöltés dátuma. Állítsa be, mint üres, ha kézzel szeretné hit le.", + "ext.config.lastUpload": "Beállítások a Szinkronizálás utolsó feltöltés időpontja. Állítsa be, mint üres, ha kézzel szeretné hit le.", + "ext.config.pathPrefix": "Állítsa be, hogy a GitHub Enterprise API előtag, ha használni szeretnénk, GHE. Általában '/api/v3'. Csak akkor kell használni, ha az állomás épülete.", + "ext.config.quietSync": "Ha értéke true, akkor megmutatja az eredményt az állapotsoron, ahelyett, gyűjtő oldal.", + "ext.config.quietSync.name": "Csendes Fordította:", + "ext.config.removeExtensions": "Állítsa be, hogy hamis, ha nem szeretné, hogy távolítsa el a kiterjesztések letöltése közben.", + "ext.config.removeExtensions.name": "Távolítsa El A Fájlokat", + "ext.config.syncExtensions": "Állítsa be, hogy hamis, ha nem akarod, hogy a feltöltés/letöltés a fájlokat.", + "ext.config.syncExtensions.name": "Fordította: Z", + "ext.config.title": "Kód Beállítások A Szinkronizálás Konfigurációs Beállítások", + "ext.globalConfig.askGistDescription.name": "Kérdezd Meg Lényeget Név", + "ext.globalConfig.autoUploadDelay.name": "Automatikus Feltöltés Késedelem", + "ext.globalConfig.autoUploadDelay.placeholder": "Adja meg az összeget másodperc késleltetés az automatikus feltöltés", + "ext.globalConfig.downloadPublicGist.name": "Letöltés Nyilvános Gist", + "ext.globalConfig.gistDescription.name": "Lényeg Leírás", + "ext.globalConfig.gistDescription.placeholder": "Adja Meg Lényeget Leírás", + "ext.globalConfig.githubEnterpriseUrl.name": "A GitHub Enterprise URL (opcionális)", + "ext.globalConfig.githubEnterpriseUrl.placeholder": "Írja be a GitHub Enterprise URL", + "ext.globalConfig.hostName.name": "Hálózati név (nem kötelező)", + "ext.globalConfig.hostName.placeholder": "Adja Meg Hostname", + "ext.globalConfig.ignoreExtensions.name": "Figyelmen Kívül Fájlokat", + "ext.globalConfig.ignoreExtensions.placeholder": "Adjon meg egy kiterjesztés soronként (teljes név)", + "ext.globalConfig.ignoreUploadFiles.placeholder": "Adjon meg egy fájl soronként", + "ext.globalConfig.ignoreUploadFolders.name": "Figyelmen Kívül Mappák", + "ext.globalConfig.ignoredUploadFolders.placeholder": "Adjon meg egy mappát, soronként", + "ext.globalConfig.openTokenLink.name": "Nyitva Token Link", + "ext.globalConfig.supportedFileExtensions.name": "Támogatott Fájl Kiterjesztések", + "ext.globalConfig.supportedFileExtensions.placeholder": "Adja meg a fájl kiterjesztését soronként", + "ext.globalConfig.token.name": "Access Token", + "ext.globalConfig.token.placeholder": "Adja Meg Token" +} \ No newline at end of file diff --git a/package.nls.it.json b/package.nls.it.json new file mode 100644 index 00000000..2d36c27e --- /dev/null +++ b/package.nls.it.json @@ -0,0 +1,144 @@ +{ + "cmd.downloadSettings.error.removeExtFail": "Sync: Impossibile rimuovere alcune estensioni.", + "cmd.downloadSettings.error.unableSave": "Sync: Impossibile salvare le impostazioni dell'estensione del file.", + "cmd.downloadSettings.info.downloaded": "Sync: Scarica Completo.", + "cmd.downloadSettings.info.gotLatestVersion": "Sync: Hai già l'ultima versione di impostazioni salvate.", + "cmd.downloadSettings.info.readdingOnline": "Sync: Impostazioni Di Lettura On-Line.", + "cmd.downloadSettings.title": "Sync: Impostazioni Di Download", + "cmd.howSetting.title": "Sync: Come Configurare", + "cmd.otherOptions.customizedSync": "Sync: Aggiungere Sincronizzazione Personalizzata percorso del File", + "cmd.otherOptions.customizedSync.done": "Sync: {0} è stato registrato.", + "cmd.otherOptions.customizedSync.placeholder": "Immettere un percorso assoluto di ulteriori file caricato.", + "cmd.otherOptions.customizedSync.prompt": "(ex. /path/to/.eslintrc) saranno caricati e scaricati il percorso specificato.", + "cmd.otherOptions.downloadCustomFile": "Sync: Importazione di Sincronizzazione Personalizzata File di area di lavoro", + "cmd.otherOptions.downloadCustomFile.done": "Scaricato {0}.", + "cmd.otherOptions.downloadCustomFile.placeholder": "Selezionare il file che si desidera scaricare per il root del lavoro che si sta lavorando.", + "cmd.otherOptions.downloadSetting": "Sync: Impostazioni di Download dal Pubblico GIST", + "cmd.otherOptions.editLocalSetting": "Sync: Modificare L'Estensione Impostazioni Locali", + "cmd.otherOptions.error.toggleFail": "Sync: Impossibile Passare.", + "cmd.otherOptions.joinCommunity": "Sync: Unisciti Alla Community", + "cmd.otherOptions.openIssue": "Sync: Questione Aperta", + "cmd.otherOptions.openSettingsPage": "Sync: Aprire Impostazioni", + "cmd.otherOptions.preserve": "Sync: Conservare L'Impostazione Di Smettere Di Ignorare Dopo Il Download", + "cmd.otherOptions.preserve.info.done1": "Sync: Fatto. {0} valore sarà rimosso da impostazioni.json dopo il download.", + "cmd.otherOptions.preserve.info.done2": "Sync: Fatto. Estensione terrà {0}: {1} in impostazione.json dopo il download.", + "cmd.otherOptions.preserve.placeholder": "Inserisci il Tasto delle impostazioni.json per preservare.", + "cmd.otherOptions.preserve.prompt": "Esempio: Scrivere 'http.proxy' => archivio di questo computer proxy e sovrascrivere il file , se è impostato il vuoto sarà rimuovere il proxy.", + "cmd.otherOptions.quietSync.off": "Sync: Riepilogo verrà mostrato al momento del download/upload.", + "cmd.otherOptions.quietSync.on": "Sync: barra di Stato verrà aggiornato durante il download/upload.", + "cmd.otherOptions.releaseNotes": "Sync: Note Di Rilascio", + "cmd.otherOptions.shareSetting": "Sync: Impostazioni di Condivisione con il Pubblico GIST", + "cmd.otherOptions.shareSetting.beforeConfirm": "Sync: Questo consente di rimuovere corrente GIST e caricare le impostazioni sul nuovo pubblico GIST. Vuoi continuare?", + "cmd.otherOptions.title": "Sync: Opzioni Avanzate", + "cmd.otherOptions.toggleAutoDownload": "Sync: Per Attivare / Disattivare Il Download Automatico All'Avvio", + "cmd.otherOptions.toggleAutoDownload.off": "Sync: Download Automatico DISATTIVATA su VSCode di Avvio.", + "cmd.otherOptions.toggleAutoDownload.on": "Sync: Download Automatico acceso su VSCode di Avvio.", + "cmd.otherOptions.toggleAutoUpload": "Sync: Attivare E Disattivare Auto-Caricare Sulla Modifica Delle Impostazioni Di", + "cmd.otherOptions.toggleAutoUpload.off": "Sync: upload Automatico su di Cambiare l'Impostazione Disattivata.", + "cmd.otherOptions.toggleAutoUpload.on": "Sync: upload Automatico su di Cambiare l'Impostazione attivata. Questo avrà effetto dopo il riavvio.", + "cmd.otherOptions.toggleForceDownload": "Sync: Attiva / Disattiva La Forza Scaricare", + "cmd.otherOptions.toggleForceDownload.off": "Sync: Forza Scaricare Spento.", + "cmd.otherOptions.toggleForceDownload.on": "Sync: Forza Scaricare Acceso.", + "cmd.otherOptions.toggleForceUpload": "Sync: Attiva / Disattiva La Forza Di Upload", + "cmd.otherOptions.toggleForceUpload.off": "Sync: Forza Caricare Spento.", + "cmd.otherOptions.toggleForceUpload.on": "Sync: Forza Caricare Acceso.", + "cmd.otherOptions.toggleSummaryPage": "Sync: Attiva / Disattiva La Mostra Pagina Di Riepilogo Su Upload/Download", + "cmd.otherOptions.triggerReset": "Sync: si desidera ripristinare le impostazioni ?", + "cmd.otherOptions.warning.tokenNotRequire": "Sync: Impostazioni di Sincronizzazione non chiedere GitHub Token da ora in poi.", + "cmd.resetSettings.info.resetting": "Sync: Il Ripristino Delle Impostazioni.", + "cmd.resetSettings.info.settingClear": "Sync: Impostazioni Cancellato.", + "cmd.resetSettings.title": "Sync: Ripristina Le Impostazioni Di Estensione", + "cmd.updateSettings.error.gistNotSave": "Sync: GIST NON SALVATI", + "cmd.updateSettings.error.newGistCreateFail": "Sync: Impossibile creare il Gist.", + "cmd.updateSettings.error.readGistFail": "Sync: GIST ID: {0} non RIESCE A LEGGERE.", + "cmd.updateSettings.info.gotLatestVersion": "Sync: Hai già caricato l'ultima versione delle impostazioni salvate.", + "cmd.updateSettings.info.newGistCreated": "Sync: Nuovo gist creato.", + "cmd.updateSettings.info.readding": "Sync: Impostazioni di Lettura e le Estensioni.", + "cmd.updateSettings.info.shareGist": "Sync: Condividere l'Id con altra estensione agli utenti di condividere le impostazioni.", + "cmd.updateSettings.info.uploadCanceled": "Sync: Il Processo Di Caricamento Annullato.", + "cmd.updateSettings.info.uploading": "Sync: Caricamento/Aggiornamento Le Impostazioni In GitHub.", + "cmd.updateSettings.info.uploadingDone": "Sync: Completamento Del Caricamento. GIST ID: {0}. Si prega di copiare e utilizzare l'ID in altre macchine per scaricare le impostazioni.", + "cmd.updateSettings.info.uploadingFile": "Sincronizzare Il Caricamento Di File Di Dati.", + "cmd.updateSettings.info.uploadingSuccess": "Sync: Caricato Con Successo.", + "cmd.updateSettings.title": "Sync: Aggiornamento/Carica Impostazioni", + "cmd.updateSettings.warning.OSNotSupported": "Sync Pragma OS valore di {0} non è supportato in linea di {1}", + "cmd.updateSettings.warning.noToken": "Sync: Set di GitHub Token o disabilita 'downloadPublicGist' locali le impostazioni di Sincronizzazione di file.", + "common.action.donate": "Dona Ora", + "common.action.joinCommunity": "Partecipare Comunità", + "common.action.openExtPage": "Aprire La Pagina Estensione", + "common.action.openExtTutorial": "Aprire Tutorial", + "common.action.releaseNotes": "Note Di Rilascio", + "common.action.support": "Sostenere Questo Progetto", + "common.action.writeReview": "Scrivi La Recensione", + "common.button.no": "No", + "common.button.yes": "Sì", + "common.error.canNotSave": "Sync: Impossibile Salvare le Impostazioni. Si prega di assicurarsi di avere una valida JSON impostazioni.file json. (ad esempio: assenza di virgole finali)", + "common.error.connection": "Sync: Internet Non è Collegato o non è in Grado di Connettersi a GitHub. Eccezione Registrato in Console", + "common.error.gistNotSave": "Sync: Gist Non Salvati.", + "common.error.invalidGistId": "Sync: Invalid Gist Id Inserito. Verificare il succo: https://gist.github.com//.", + "common.error.invalidToken": "Sync: Non Valido O Scaduto GitHub Token. Si prega di generare nuovo token con gli ambiti menzionati nel readme. Eccezione Registrato in Console.", + "common.error.message": "Sync: Errore Registrato In Console (menu Aiuto > Toggle Strumenti di sviluppo).", + "common.error.tokenNotSave": "Sync: Token Non Salvati.", + "common.info.donate": "Sync: ti piace questa estensione? Come circa la scrittura di una recensione o di invio di una donazione? ", + "common.info.excludeFile": "Sync: Si può escludere ogni file/cartella per l'upload e impostazioni per il download.", + "common.info.gistSaved": "Sync: Gist Salvato", + "common.info.initAutoUpload": "Sync: Upload Automatico Di Iniziare A {0} Secondi.", + "common.info.installed": "Sync: le Impostazioni create, la ringrazio per l'installazione!", + "common.info.needHelp": "Sync: Bisogno di Aiuto per configurare questa estensione?", + "common.info.setToken": "Sync: Ora È possibile impostare il GitHub token manualmente nel `syncLocalSettings.json`", + "common.info.tokenSaved": "Sync: Token Salvato", + "common.info.updateTo": "Sync: Aggiornato alla v{0}", + "common.info.updating": "Sync: Aggiornamento In Corso... Attendere Prego.", + "common.placeholder.enterGistId": "Inserisci Il Gist Id", + "common.placeholder.enterGithubAccessToken": "Inserire GitHub Personali Token Di Accesso", + "common.placeholder.multipleGist": "Gist Nome (ad esempio: Impostazioni Personali)", + "common.prompt.enterGistId": "Inserisci il Gist Id precedentemente caricato le impostazioni. È anche possibile impostare manualmente le impostazioni del codice (sync.gist). Premere il tasto [Enter] o il tasto [Esc] per annullare.", + "common.prompt.enterGithubAccessToken": "Puoi anche aggiungere manualmente un token (Cartella Utente/syncLocalSettings.json). Premere il tasto [Enter] o il tasto [Esc] per annullare.", + "common.prompt.gistForceUpload": "Sync: Il caricamento sostituirà le impostazioni in GitHub Gist. Valuta di scaricare le impostazioni o eseguire un caricamento forzato. Vuoi ancora caricare forzatamente?", + "common.prompt.gistNewer": "Sync: Le impostazioni in Gist sono cambiate dall'ultima volta che le hai scaricate. Vuoi caricare comunque le tue impostazioni locali attuali su Gist?", + "common.prompt.multipleGist": "Consente di identificare le impostazioni, se si dispone di più gist.", + "common.prompt.restartCode": "Vuoi ricaricare per applicare le estensioni e le configurazioni?", + "ext.config.autoDownload": "Il Set e ' vero per il Download Automatico le impostazioni del codice di avvio. [Codice Di Riavvio Richiesto]", + "ext.config.autoDownload.name": "Il Download Automatico", + "ext.config.autoUpload": "Impostare la verità Upload Automatico su modifica impostazioni. [Codice Di Riavvio Richiesto]", + "ext.config.autoUpload.name": "Upload Automatico", + "ext.config.forceDownload": "Impostare a true se si desidera scaricare le impostazioni anche quando si hanno le ultime impostazioni.", + "ext.config.forceDownload.name": "Forza Scaricare", + "ext.config.forceUpload": "Impostare a true se si desidera caricare le impostazioni anche quando il GIST impostazioni più recenti.", + "ext.config.forceUpload.name": "Forza Caricare", + "ext.config.gist": "GitHub GIST ID Impostazioni di Sincronizzazione.", + "ext.config.gist.name": "Gist ID", + "ext.config.gist.placeholder": "Inserisci il Gist ID", + "ext.config.host": "Impostare la GitHub Enterprise host se si desidera utilizzare GHE.", + "ext.config.lastDownload": "Impostazioni di Sincronizzazione di download ultima data. Impostare come vuoto se si desidera configurare manualmente colpito il download.", + "ext.config.lastUpload": "Impostazioni di Sincronizzazione ultima data di caricamento. Impostare come vuoto se si desidera configurare manualmente colpito il download.", + "ext.config.pathPrefix": "Impostare la GitHub Enterprise API prefisso, se si desidera utilizzare GHE. Normalmente '/api/v3'. Utilizzato solo quando l'host è impostato.", + "ext.config.quietSync": "Quando è impostato su true, verrà visualizzato il risultato nella barra di stato, invece della pagina di riepilogo.", + "ext.config.quietSync.name": "Tranquilla Sync", + "ext.config.removeExtensions": "Impostare a false se non si desidera rimuovere le estensioni durante il download.", + "ext.config.removeExtensions.name": "Rimuovere Le Estensioni", + "ext.config.syncExtensions": "Impostare a false se non si desidera caricare/scaricare le estensioni.", + "ext.config.syncExtensions.name": "Sincronizzazione Delle Estensioni", + "ext.config.title": "Codice Impostazioni Impostazioni Di Configurazione Di Sincronizzazione", + "ext.globalConfig.askGistDescription.name": "Chiedi Gist Nome", + "ext.globalConfig.autoUploadDelay.name": "Upload Automatico Di Ritardo", + "ext.globalConfig.autoUploadDelay.placeholder": "Immettere il numero di secondi di ritardo di auto-upload", + "ext.globalConfig.downloadPublicGist.name": "Scarica Pubblico Gist", + "ext.globalConfig.gistDescription.name": "Gist Descrizione", + "ext.globalConfig.gistDescription.placeholder": "Inserisci Il Gist Descrizione", + "ext.globalConfig.githubEnterpriseUrl.name": "GitHub Enterprise URL (opzionale)", + "ext.globalConfig.githubEnterpriseUrl.placeholder": "Inserire GitHub Enterprise URL", + "ext.globalConfig.hostName.name": "Hostname (opzionale)", + "ext.globalConfig.hostName.placeholder": "Immettere Il Nome Dell'Host", + "ext.globalConfig.ignoreExtensions.name": "Ignorato Estensioni", + "ext.globalConfig.ignoreExtensions.placeholder": "Inserire un'estensione per linea (cognome e nome)", + "ext.globalConfig.ignoreUploadFiles.name": "File Ignorati", + "ext.globalConfig.ignoreUploadFiles.placeholder": "Inserire un file per riga", + "ext.globalConfig.ignoreUploadFolders.name": "Ignorate Le Cartelle", + "ext.globalConfig.ignoredUploadFolders.placeholder": "Inserire una cartella per ogni linea", + "ext.globalConfig.openTokenLink.name": "Aprire Token Link", + "ext.globalConfig.supportedFileExtensions.name": "Estensioni Di File Supportati", + "ext.globalConfig.supportedFileExtensions.placeholder": "Inserire un file di estensione per linea", + "ext.globalConfig.token.name": "Token Di Accesso", + "ext.globalConfig.token.placeholder": "Inserisci Il Token" +} \ No newline at end of file diff --git a/package.nls.ja.json b/package.nls.ja.json new file mode 100644 index 00000000..b78b00dc --- /dev/null +++ b/package.nls.ja.json @@ -0,0 +1,144 @@ +{ + "ext.config.title": "Code Settings Sync の設定", + "ext.config.gist": "Settings Sync で使用する GitHub Gist ID", + "ext.config.lastUpload": "Settings Sync の最新アップロード日。手動でダウンロードする場合は空にしてください", + "ext.config.lastDownload": "Settings Sync の最新ダウンロード日。手動でダウンロードする場合は空にしてください", + "ext.config.autoDownload": "VSCode 起動時に設定を自動でダウンロードします。[VSCode の再起動が必要です]", + "ext.config.autoUpload": "設定変更時に自動でアップロードします。[VSCode の再起動が必要です]", + "ext.config.forceDownload": "最新の設定が既に存在する場合でも強制的に設定をダウンロードします", + "ext.config.forceUpload": "Gist に新しい設定が存在する場合でも強制的に設定をアップロードします", + "ext.config.host": "GHE を使用する場合は GitHub Enterprise のホストを設定してください", + "ext.config.pathPrefix": "GHE を使用する場合は GitHub Enterprise API のプレフィックスを設定してください。通常は '/api/v3' です。ホストが設定されている場合にのみ使用されます", + "ext.config.quietSync": "結果をサマリーページではなくステータスバーに表示します", + "ext.config.removeExtensions": "ダウンロード中に拡張機能を削除します", + "ext.config.syncExtensions": "拡張機能をアップロード・ダウンロードします", + "cmd.howSetting.title": "Sync: Settings Sync の設定方法を参照", + "cmd.updateSettings.title": "Sync: アップデート・アップロードの設定", + "cmd.updateSettings.info.uploading": "Sync: GitHub の設定をアップデート・アップロードしています", + "cmd.updateSettings.info.uploadingFile": "Sync: ファイルのデータをアップロードしています", + "cmd.updateSettings.info.uploadingDone": "Sync: アップロード完了。Gist ID: {0}。設定をダウンロードするには、この ID を他のマシンにコピーして使用してください", + "cmd.updateSettings.info.uploadingSuccess": "Sync: アップロード完了", + "cmd.updateSettings.info.shareGist": "Sync: 設定を他のユーザに共有するには ID を共有してください", + "cmd.updateSettings.info.readding": "Sync: 設定を拡張機能を読み込んでいます", + "cmd.updateSettings.info.uploadCanceled": "Sync: アップロードがキャンセルされました", + "cmd.updateSettings.info.newGistCreated": "Sync: 新規 Gist を作成しました", + "cmd.updateSettings.info.gotLatestVersion": "Sync: 保存済み設定の最新バージョンはすでにアップロードされています。", + "cmd.updateSettings.warning.noToken": "Sync: GitHub トークンを設定するか、ローカルの同期設定ファイルから 'downloadPublicGist' を無効にしてください", + "cmd.updateSettings.warning.OSNotSupported": "Sync: {1} 行目の値 {0} はサポートされていません", + "cmd.updateSettings.error.newGistCreateFail": "Sync: Gist を作成できません", + "cmd.updateSettings.error.readGistFail": "Sync: Gist ID: {0} を読み込めません", + "cmd.updateSettings.error.gistNotSave": "Sync: Gist が保存されていません", + "cmd.downloadSettings.title": "Sync: 設定をダウンロード", + "cmd.downloadSettings.info.downloaded": "Sync: ダウンロードが完了しました", + "cmd.downloadSettings.info.readdingOnline": "Sync: 設定をオンラインから読み込んでいます", + "cmd.downloadSettings.info.gotLatestVersion": "Sync: 既に最新の設定に更新されています", + "cmd.downloadSettings.error.removeExtFail": "Sync: 削除できない拡張機能があります", + "cmd.downloadSettings.error.unableSave": "Sync: 拡張機能の設定ファイルを保存できません", + "cmd.resetSettings.title": "Sync: 拡張機能の設定を初期化", + "cmd.resetSettings.info.resetting": "Sync: 設定をリセットしています", + "cmd.resetSettings.info.settingClear": "Sync: 設定をクリアしました", + "cmd.otherOptions.title": "Sync: 高度なオプション", + "cmd.otherOptions.openSettingsPage": "Sync: 設定を開く", + "cmd.otherOptions.editLocalSetting": "Sync: 拡張機能のローカル設定を編集", + "cmd.otherOptions.shareSetting": "Sync: Public Gist の共有設定", + "cmd.otherOptions.shareSetting.beforeConfirm": "Sync: 現在の Gist が削除され、新規の Public Gist に設定がアップロードされます。続けますか?", + "cmd.otherOptions.downloadSetting": "Sync: Public Gist から設定をダウンロードします", + "cmd.otherOptions.toggleForceDownload": "Sync: 強制ダウンロード機能の切り替え", + "cmd.otherOptions.toggleForceDownload.on": "Sync: 強制的にダウンロードします", + "cmd.otherOptions.toggleForceDownload.off": "Sync: 強制的にダウンロードしません", + "cmd.otherOptions.toggleForceUpload": "Sync: 強制アップロード機能の切り替え", + "cmd.otherOptions.toggleForceUpload.on": "Sync: 強制的にアップロードします", + "cmd.otherOptions.toggleForceUpload.off": "Sync: 強制的にアップロードしません", + "cmd.otherOptions.toggleAutoUpload": "Sync: 設定変更時の自動アップロード機能の切り替え", + "cmd.otherOptions.toggleAutoUpload.on": "Sync: 設定変更時に設定を自動アップロードします。[VSCode の再起動が必要です]", + "cmd.otherOptions.toggleAutoUpload.off": "Sync: 設定変更時に設定を自動アップロードしません", + "cmd.otherOptions.toggleAutoDownload": "Sync: 起動時の自動ダウンロード機能の切り替え", + "cmd.otherOptions.toggleAutoDownload.on": "Sync: VSCode を起動時に設定を自動ダウンロードする", + "cmd.otherOptions.toggleAutoDownload.off": "Sync: VSCode を起動時に設定を自動ダウンロードしない", + "cmd.otherOptions.toggleSummaryPage": "Sync: アップロード・ダウンロード時の概要画面表示の切り替え", + "cmd.otherOptions.preserve": "Sync: ダウンロード後の上書きを禁止する設定を保持する", + "cmd.otherOptions.preserve.placeholder": "Sync: 設定を保持するために settings.json から任意のキーを入力してください", + "cmd.otherOptions.preserve.prompt": "Sync: 例: 'http.proxy' と入力することでこのコンピュータのプロキシを保存して上書きします。空の場合プロキシが削除されます", + "cmd.otherOptions.preserve.info.done1": "Sync: 同期完了。ダウンロード後に {0} の値は settings.json から削除されます", + "cmd.otherOptions.preserve.info.done2": "Sync: 同期完了。ダウンロード後に拡張機能は {0}:{1} を settings.json に保持します", + "cmd.otherOptions.customizedSync": "Sync: カスタム同期ファイルのパスを追加", + "cmd.otherOptions.customizedSync.placeholder": "Sync: 追加でアップロードするファイルの絶対パスを入力してください", + "cmd.otherOptions.customizedSync.prompt": "(例: /path/to/.eslintrc) は指定されたパスにアップロード・ダウンロードされます", + "cmd.otherOptions.customizedSync.done": "Sync: {0} が登録されています", + "cmd.otherOptions.downloadCustomFile": "Sync: カスタム同期ファイルをワークスペースに挿入します", + "cmd.otherOptions.downloadCustomFile.placeholder": "Sync: 作業中のワークスペースのルートにダウンロードするファイルを選択してください", + "cmd.otherOptions.downloadCustomFile.done": "Sync: {0} をダウンロードしました", + "cmd.otherOptions.joinCommunity": "Sync: コミュニティに参加", + "cmd.otherOptions.openIssue": "Sync: Issue を開く", + "cmd.otherOptions.releaseNotes": "Sync: リリースノート", + "cmd.otherOptions.quietSync.on": "Sync: ステータスバーはダウンロード・アップロード時に更新されます.", + "cmd.otherOptions.quietSync.off": "Sync: ダウンロード・アップロード時に概要が表示されます", + "cmd.otherOptions.warning.tokenNotRequire": "Sync: Settings Sync は今後 GitHub トークンを要求しません", + "cmd.otherOptions.error.toggleFail": "Sync: 切り替えができません", + "cmd.otherOptions.triggerReset": "Sync: 設定をリセットしますか?", + "common.info.installed": "Sync: 設定を生成しました。インストールありがとうございます!", + "common.info.needHelp": "Sync: この拡張機能の設定に関するヘルプが必要ですか?", + "common.info.excludeFile": "Sync: 任意のアップロードするのファイル・フォルダとダウンロードする設定を除外", + "common.info.updating": "Sync: アップデート中です。お待ちください", + "common.info.initAutoUpload": "Sync: 自動アップロードは {0} 秒以内に開始されました", + "common.info.setToken": "Sync: 'syncLocalSettings.json' 内で手動で GitHub トークンを設定できます", + "common.info.tokenSaved": "Sync: トークンが保存されました", + "common.info.gistSaved": "Sync: Gist は保存されました", + "common.info.updateTo": "Sync: v{0} にアップデートしました", + "common.info.donate": "Sync: この拡張機能は気に入りましたか?レビューを書いたり寄付を送ったりしませんか?", + "common.error.message": "Sync: コンソールのログインエラー ([ヘルプ] > [開発者ツールの切り替え])", + "common.error.connection": "Sync: インターネットに接続されていないため GitHub に接続できません。コンソールにログが記録されています", + "common.error.canNotSave": "Sync: 設定を保存できません。settings.json が有効であるか確認してください (例: 末尾のカンマは不要です)", + "common.error.invalidToken": "Sync: GitHub トークンは無効または期限切れです。README に記載されているスコープで新規トークンを発行してください。コンソールにログが記録されています", + "common.error.invalidGistId": "Sync: Gist ID が無効です。Gist を確認してください: https://gist.github.com//", + "common.error.tokenNotSave": "Sync: トークンが保存されていません", + "common.error.gistNotSave": "Sync: Gist が保存されていません", + "common.action.openExtPage": "拡張機能のページを開く", + "common.action.openExtTutorial": "ターミナルを開く", + "common.action.releaseNotes": "リリースノート", + "common.action.writeReview": "レビューを書く", + "common.action.support": "このプロジェクトを支援", + "common.action.joinCommunity": "コミュニティに参加する", + "common.action.donate": "寄付する", + "common.placeholder.enterGithubAccessToken": "GitHub Personl Access Token を入力してください", + "common.placeholder.enterGistId": "Gist ID を入力してください", + "common.placeholder.multipleGist": "Gist Name (例: Personal Settings)", + "common.prompt.multipleGist": "Gist が複数ある場合、個別に設定できます", + "common.prompt.enterGistId": "以前にアップロードした設定から Gist ID を入力してください。VSCode Settings (sync.gist) で手動で設定することもできます。キャンセルするには [Enter] または [Esc] キーを押してください", + "common.prompt.enterGithubAccessToken": "手動でトークンを追加することができます (User Folder/syncLocalSettings.json)。キャンセルするには [Enter] または [Esc] キーを押してください", + "common.prompt.restartCode": "拡張機能と設定を適用するためにリロードしますか?", + "common.prompt.gistForceUpload": "Sync: アップロードにより、GitHub Gistの設定が置き換えられます。 設定をダウンロードするか、強制アップロードを行うことを検討してください。 それでも強制的にアップロードしますか?", + "common.prompt.gistNewer": "Sync: Gistの設定は、最後にダウンロードしてから変更されています。 とにかく、現在のローカル設定をGistにアップロードしますか?", + "common.button.no": "番号", + "common.button.yes": "はい", + "ext.globalConfig.token.name": "アクセストークン", + "ext.globalConfig.token.placeholder": "トークンを入力してください", + "ext.globalConfig.githubEnterpriseUrl.name": "GitHub Enterprise の URL (オプション)", + "ext.globalConfig.githubEnterpriseUrl.placeholder": "GitHub Enterprise の URL を入力してください", + "ext.globalConfig.ignoreUploadFolders.name": "フォルダを無視", + "ext.globalConfig.ignoredUploadFolders.placeholder": "1行に1つのフォルダ名を入力してください", + "ext.globalConfig.ignoreExtensions.name": "拡張子を無視", + "ext.globalConfig.ignoreExtensions.placeholder": "1行に1つの拡張機能名をフルネームで入力してください", + "ext.globalConfig.hostName.name": "ホスト名 (オプション)", + "ext.globalConfig.hostName.placeholder": "ホスト名を入力してください", + "ext.globalConfig.ignoreUploadFiles.name": "ファイルを無視", + "ext.globalConfig.ignoreUploadFiles.placeholder": "1行に1つのファイル名を入力してください", + "ext.globalConfig.supportedFileExtensions.name": "サポートされているファイルの拡張子", + "ext.globalConfig.supportedFileExtensions.placeholder": "1行に1つの拡張子を入力してください", + "ext.globalConfig.gistDescription.name": "Gist の説明", + "ext.globalConfig.gistDescription.placeholder": "Gist の説明を入力してください", + "ext.globalConfig.autoUploadDelay.name": "自動アップロードの遅延", + "ext.globalConfig.autoUploadDelay.placeholder": "自動アップロードの遅延時間 (秒) を入力してください", + "ext.globalConfig.askGistDescription.name": "Gist Name の確認", + "ext.globalConfig.downloadPublicGist.name": "公開 Gist のダウンロード", + "ext.globalConfig.openTokenLink.name": "トークンのリンクを開く", + "ext.config.gist.name": "Gist ID", + "ext.config.gist.placeholder": "Gist ID を入力してください", + "ext.config.autoDownload.name": "自動ダウンロード", + "ext.config.autoUpload.name": "自動アップロード", + "ext.config.forceDownload.name": "強制ダウンロード", + "ext.config.forceUpload.name": "強制アップロード", + "ext.config.quietSync.name": "出力抑制同期", + "ext.config.removeExtensions.name": "拡張機能の削除", + "ext.config.syncExtensions.name": "拡張機能の同期" +} diff --git a/package.nls.json b/package.nls.json new file mode 100644 index 00000000..6d0eea95 --- /dev/null +++ b/package.nls.json @@ -0,0 +1,144 @@ +{ + "ext.config.title": "Code Settings Sync Configuration Settings", + "ext.config.gist": "GitHub GIST ID for Settings Sync.", + "ext.config.lastUpload": "Settings Sync last upload date. Set it as empty if you want to manually hit download.", + "ext.config.lastDownload": "Settings Sync last download date. Set it as empty if you want to manually hit download.", + "ext.config.autoDownload": "Set it true to Auto Download the settings on code start. [Code Restart Required]", + "ext.config.autoUpload": "Set it true to Auto Upload on the settings change. [Code Restart Required]", + "ext.config.forceDownload": "Set it to true if you want to download the settings even when you have the latest settings.", + "ext.config.forceUpload": "Set it to true if you want to upload the settings even when the GIST has newer settings.", + "ext.config.host": "Set it to your GitHub Enterprise host if you want to use GHE.", + "ext.config.pathPrefix": "Set it to your GitHub Enterprise API prefix if you want to use GHE. Normally '/api/v3'. Only used when host is set.", + "ext.config.quietSync": "When set to true, will show the result in status bar instead of summary page.", + "ext.config.removeExtensions": "Set it to false if you don't want to remove extensions while downloading.", + "ext.config.syncExtensions": "Set it to false if you don't want to upload/download the extensions.", + "cmd.howSetting.title": "Sync: How To Configure", + "cmd.updateSettings.title": "Sync: Update/Upload Settings", + "cmd.updateSettings.info.uploading": "Sync: Uploading/Updating Your Settings In GitHub.", + "cmd.updateSettings.info.uploadingFile": "Sync: Uploading Files Data.", + "cmd.updateSettings.info.uploadingDone": "Sync: Upload Complete. GIST ID: {0}. Please copy and use this ID in other machines to download settings.", + "cmd.updateSettings.info.uploadingSuccess": "Sync: Uploaded Successfully.", + "cmd.updateSettings.info.shareGist": "Sync: Share the Id with other extension users to share the settings.", + "cmd.updateSettings.info.readding": "Sync: Reading Settings and Extensions.", + "cmd.updateSettings.info.uploadCanceled": "Sync: Upload Process Cancelled.", + "cmd.updateSettings.info.newGistCreated": "Sync: New gist created.", + "cmd.updateSettings.info.gotLatestVersion": "Sync: You have already uploaded the latest version of saved settings.", + "cmd.updateSettings.warning.noToken": "Sync: Set GitHub Token or disable 'downloadPublicGist' from local Sync settings file.", + "cmd.updateSettings.warning.OSNotSupported": "Sync Pragma OS value {0} not supported at line {1}", + "cmd.updateSettings.error.newGistCreateFail": "Sync: Unable to create Gist.", + "cmd.updateSettings.error.readGistFail": "Sync: GIST ID: {0} UNABLE TO READ.", + "cmd.updateSettings.error.gistNotSave": "Sync: GIST NOT SAVED", + "cmd.downloadSettings.title": "Sync: Download Settings", + "cmd.downloadSettings.info.downloaded": "Sync: Download Complete.", + "cmd.downloadSettings.info.readdingOnline": "Sync: Reading Settings Online.", + "cmd.downloadSettings.info.gotLatestVersion": "Sync: You already have the latest version of saved settings.", + "cmd.downloadSettings.error.removeExtFail": "Sync: Unable to remove some extensions.", + "cmd.downloadSettings.error.unableSave": "Sync: Unable to save extension settings file.", + "cmd.resetSettings.title": "Sync: Reset Extension Settings", + "cmd.resetSettings.info.resetting": "Sync: Resetting Your Settings.", + "cmd.resetSettings.info.settingClear": "Sync: Settings Cleared.", + "cmd.otherOptions.title": "Sync: Advanced Options", + "cmd.otherOptions.openSettingsPage": "Sync: Open Settings", + "cmd.otherOptions.editLocalSetting": "Sync: Edit Extension Local Settings", + "cmd.otherOptions.shareSetting": "Sync: Share Settings with Public GIST", + "cmd.otherOptions.shareSetting.beforeConfirm": "Sync: This will remove current GIST and upload settings on new public GIST. Do you want to continue?", + "cmd.otherOptions.downloadSetting": "Sync: Download Settings from Public GIST", + "cmd.otherOptions.toggleForceDownload": "Sync: Toggle Force Download", + "cmd.otherOptions.toggleForceDownload.on": "Sync: Force Download Turned On.", + "cmd.otherOptions.toggleForceDownload.off": "Sync: Force Download Turned Off.", + "cmd.otherOptions.toggleForceUpload": "Sync: Toggle Force Upload", + "cmd.otherOptions.toggleForceUpload.on": "Sync: Force Upload Turned On.", + "cmd.otherOptions.toggleForceUpload.off": "Sync: Force Upload Turned Off.", + "cmd.otherOptions.toggleAutoUpload": "Sync: Toggle Auto-Upload On Settings Change", + "cmd.otherOptions.toggleAutoUpload.on": "Sync: Auto upload on Setting Change Turned On. This will take effect after restart.", + "cmd.otherOptions.toggleAutoUpload.off": "Sync: Auto upload on Setting Change Turned Off.", + "cmd.otherOptions.toggleAutoDownload": "Sync: Toggle Auto-Download On Startup", + "cmd.otherOptions.toggleAutoDownload.on": "Sync: Auto Download turned ON upon VSCode Startup.", + "cmd.otherOptions.toggleAutoDownload.off": "Sync: Auto Download turned OFF upon VSCode Startup.", + "cmd.otherOptions.toggleSummaryPage": "Sync: Toggle Show Summary Page On Upload/Download", + "cmd.otherOptions.preserve": "Sync: Preserve Setting To Stop Override After Download", + "cmd.otherOptions.preserve.placeholder": "Enter any Key from settings.json to preserve.", + "cmd.otherOptions.preserve.prompt": "Example: Write 'http.proxy' => store this computer proxy and overwrite it , if set empty it will remove proxy.", + "cmd.otherOptions.preserve.info.done1": "Sync: Done. {0} value will be removed from settings.json after downloading.", + "cmd.otherOptions.preserve.info.done2": "Sync: Done. Extension will keep {0}: {1} in setting.json after downloading.", + "cmd.otherOptions.customizedSync": "Sync: Add Custom Sync File path", + "cmd.otherOptions.customizedSync.placeholder": "Enter an absolute path of the additional uploaded file.", + "cmd.otherOptions.customizedSync.prompt": "(ex. /path/to/.eslintrc) will be uploaded and downloaded to the specified path.", + "cmd.otherOptions.customizedSync.done": "Sync: {0} has been registered.", + "cmd.otherOptions.downloadCustomFile": "Sync: Import Custom Sync File to workspace", + "cmd.otherOptions.downloadCustomFile.placeholder": "Select the file you want to download to the root of the workspace you are working on.", + "cmd.otherOptions.downloadCustomFile.done": "Downloaded {0}.", + "cmd.otherOptions.joinCommunity": "Sync: Join Community", + "cmd.otherOptions.openIssue": "Sync: Open Issue", + "cmd.otherOptions.releaseNotes": "Sync: Release Notes", + "cmd.otherOptions.quietSync.on": "Sync: Status bar will be updated upon download/upload.", + "cmd.otherOptions.quietSync.off": "Sync: Summary will be shown upon download/upload.", + "cmd.otherOptions.warning.tokenNotRequire": "Sync: Settings Sync will not ask for GitHub Token from now on.", + "cmd.otherOptions.error.toggleFail": "Sync: Unable to Toggle.", + "cmd.otherOptions.triggerReset": "Sync: Do you want to reset the settings ?", + "common.info.installed": "Sync: Settings created, thank you for installing!", + "common.info.needHelp": "Sync: Need Help configuring this extension?", + "common.info.excludeFile": "Sync: You can exclude any file/folder for upload and settings for download.", + "common.info.updating": "Sync: Updating In Progress… Please Wait.", + "common.info.initAutoUpload": "Sync: Auto Upload Initiating In {0} Seconds.", + "common.info.setToken": "Sync: Now You can set your GitHub token manually in `syncLocalSettings.json`", + "common.info.tokenSaved": "Sync: Token Saved", + "common.info.gistSaved": "Sync: Gist Saved", + "common.info.updateTo": "Sync: Updated to v{0}", + "common.info.donate": "Sync: Do you like this extension? How about writing a review or sending a donation? ;)", + "common.error.message": "Sync: Error Logged In Console (Help menu > Toggle Developer Tools).", + "common.error.connection": "Sync: Internet Not Connected or Unable to Connect to GitHub. Exception Logged in Console", + "common.error.canNotSave": "Sync: Unable to Save Settings. Please make sure you have valid JSON settings.json file. (e.g.: No trailing commas)", + "common.error.invalidToken": "Sync: Invalid/Expired GitHub Token. Please generate new token with scopes mentioned in readme. Exception Logged in Console.", + "common.error.invalidGistId": "Sync: Invalid Gist Id Entered. Verify your gist: https://gist.github.com//.", + "common.error.tokenNotSave": "Sync: Token Not Saved.", + "common.error.gistNotSave": "Sync: Gist Not Saved.", + "common.action.openExtPage": "Open Extension Page", + "common.action.openExtTutorial": "Open Tutorial", + "common.action.releaseNotes": "Release Notes", + "common.action.writeReview": "Write Review", + "common.action.support": "Support This Project", + "common.action.joinCommunity": "Join Community", + "common.action.donate": "Donate Now", + "common.placeholder.enterGithubAccessToken": "Enter GitHub Personal Access Token", + "common.placeholder.enterGistId": "Enter Gist Id", + "common.placeholder.multipleGist": "Gist Name (e.g.: Personal Settings)", + "common.prompt.multipleGist": "Allows you to identify the settings if you have multiple gist.", + "common.prompt.enterGistId": "Enter Gist Id from previously uploaded settings. You can also set manually in code settings (sync.gist). Press [Enter] or [Esc] to cancel.", + "common.prompt.enterGithubAccessToken": "You also manually add a token (User Folder/syncLocalSettings.json). Press [Enter] or [Esc] to cancel.", + "common.prompt.restartCode": "Do you want to reload to apply extensions and configurations?", + "common.prompt.gistForceUpload": "Sync: The upload will replace the settings in GitHub Gist. Consider downloading the settings or doing a forced upload. Do you still want to upload forcefully?", + "common.prompt.gistNewer": "Sync: The settings in the Gist have changed since you last downloaded them. Do you want to upload your current local settings to the Gist anyway?", + "common.button.no": "No", + "common.button.yes": "Yes", + "ext.globalConfig.token.name": "Access Token", + "ext.globalConfig.token.placeholder": "Enter Token", + "ext.globalConfig.githubEnterpriseUrl.name": "GitHub Enterprise URL (optional)", + "ext.globalConfig.githubEnterpriseUrl.placeholder": "Enter GitHub Enterprise URL", + "ext.globalConfig.ignoreUploadFolders.name": "Ignored Folders", + "ext.globalConfig.ignoredUploadFolders.placeholder": "Enter one folder per line", + "ext.globalConfig.ignoreExtensions.name": "Ignored Extensions", + "ext.globalConfig.ignoreExtensions.placeholder": "Enter one extension per line (full name)", + "ext.globalConfig.hostName.name": "Hostname (optional)", + "ext.globalConfig.hostName.placeholder": "Enter Hostname", + "ext.globalConfig.ignoreUploadFiles.name": "Ignored Files", + "ext.globalConfig.ignoreUploadFiles.placeholder": "Enter one file per line", + "ext.globalConfig.supportedFileExtensions.name": "Supported File Extensions", + "ext.globalConfig.supportedFileExtensions.placeholder": "Enter one file extension per line", + "ext.globalConfig.gistDescription.name": "Gist Description", + "ext.globalConfig.gistDescription.placeholder": "Enter Gist Description", + "ext.globalConfig.autoUploadDelay.name": "Auto Upload Delay", + "ext.globalConfig.autoUploadDelay.placeholder": "Enter the amount of seconds to delay auto-upload", + "ext.globalConfig.askGistDescription.name": "Ask Gist Name", + "ext.globalConfig.downloadPublicGist.name": "Download Public Gist", + "ext.globalConfig.openTokenLink.name": "Open Token Link", + "ext.config.gist.name": "Gist ID", + "ext.config.gist.placeholder": "Enter Gist ID", + "ext.config.autoDownload.name": "Auto Download", + "ext.config.autoUpload.name": "Auto Upload", + "ext.config.forceDownload.name": "Force Download", + "ext.config.forceUpload.name": "Force Upload", + "ext.config.quietSync.name": "Quiet Sync", + "ext.config.removeExtensions.name": "Remove Extensions", + "ext.config.syncExtensions.name": "Sync Extensions" +} diff --git a/package.nls.ko.json b/package.nls.ko.json new file mode 100644 index 00000000..ea264db5 --- /dev/null +++ b/package.nls.ko.json @@ -0,0 +1,138 @@ +{ + "ext.config.title": "Code Settings Sync 설정", + "ext.config.gist": "Settings Sync에 사용할 GitHub GIST ID.", + "ext.config.lastDownload": "Settings Sync의 마지막 다운로드 날짜입니다. 수동으로 다운받길 원하면 비워두세요.", + "ext.config.lastUpload": "Settings Sync의 마지막 업로드 날짜입니다. 수동으로 다운받길 원하면 비워두세요.", + "ext.config.autoDownload": "VSCode가 실행될 때 설정을 자동으로 다운로드합니다. [코드 재시작 필요]", + "ext.config.autoUpload": "설정이 변경되면 변경된 설정을 자동으로 업로드합니다. [코드 재시작 필요]", + "ext.config.forceDownload": "로컬 설정의 버전에 무관하게 강제로 설정을 다운로드합니다.", + "ext.config.forceUpload": "Gist에 존재하는 설정 버전과 무관하게 강제로 현재 설정을 업로드합니다.", + "ext.config.host": "GHE를 사용하려면 GitHub Enterprise 호스트를 설정하십시오.", + "ext.config.pathPrefix": "GHE를 사용하기 위해서는 GitHub Enterprise API의 접두사가 필요합니다. 일반적으로 '/api/v3'를 사용합니다. 호스트가 설정되어있을 때만 사용됩니다.", + "ext.config.quietSync": "설정시 결과를 알림창 대신 상태바에 표시합니다.", + "ext.config.askGistDescription": "생성시 Gist 이름을 묻습니다. 여러 개의 Gist가 존재할 때 식별에 도움이 됩니다.", + "ext.config.removeExtensions": "동기화 다운로드로 인해 확장(extension)이 삭제되는 걸 막고 싶다면 False로 설정하세요.", + "ext.config.syncExtensions": "만약 확장(extension)이 업로드/다운로드되는 걸 원하지 않으면 False로 설정하세요.", + "cmd.howSetting.title": "Sync: 환경설정 방법", + "cmd.updateSettings.title": "Sync: 업데이트/업로드 설정", + "cmd.updateSettings.info.uploading": "Sync: GitHub에서 설정을 업로드/업데이트하는 중입니다.", + "cmd.updateSettings.info.uploadingFile": "Sync: 파일 데이터를 업로드 중 입니다.", + "cmd.updateSettings.info.uploadingDone": "Sync: 업로드 완료. GIST ID: {0}. 다른 기기에서도 설정을 다운받으려면 이 ID를 복사해서 사용하세요.", + "cmd.updateSettings.info.uploadingSuccess": "Sync: 업로드 완료", + "cmd.updateSettings.info.shareGist": "Sync: ID를 공유하여 다른 확장(extension) 사용자들과 설정을 공유하세요.", + "cmd.updateSettings.info.readding": "Sync: 설정과 확장을 읽고 있습니다.", + "cmd.updateSettings.info.uploadCanceled": "Sync: 업로드 동작이 취소되었습니다.", + "cmd.updateSettings.info.newGistCreated": "Sync: 새로운 Gist가 생성되었습니다.", + "cmd.updateSettings.info.gotLatestVersion": "Sync: 저장된 설정의 최신 버전을 이미 업로드했습니다.", + "cmd.updateSettings.warning.noToken": "Sync: 로컬 설정 동기화 파일에서 'downloadPublicGist'를 끄거나 GitHub 토큰을 설정하세요.", + "cmd.updateSettings.warning.OSNotSupported": "동기화 Pragma 운영체제 값 {0} 는 line {1} 에서 지원되지 않습니다.", + "cmd.updateSettings.error.newGistCreateFail": "Sync: 새로운 Gist 생성에 실패했습니다.", + "cmd.updateSettings.error.readGistFail": "Sync: GIST ID: {0} 읽기에 실패했습니다.", + "cmd.updateSettings.error.gistNotSave": "Sync: Gist가 저장되지 않았습니다.", + "cmd.downloadSettings.title": "Sync: 다운로드 설정", + "cmd.downloadSettings.info.downloaded": "Sync: 다운로드 완료.", + "cmd.downloadSettings.info.readdingOnline": "Sync: 온라인에서 설정을 읽고 있습니다.", + "cmd.downloadSettings.info.gotLatestVersion": "Sync: 로컬 설정이 이미 최신 버전입니다.", + "cmd.downloadSettings.error.removeExtFail": "Sync: 일부 확장(extension)을 제거하는데 실패했습니다.", + "cmd.downloadSettings.error.unableSave": "Sync: 확장(extension) 설정파일을 저장하는데 실패했습니다.", + "cmd.resetSettings.title": "Sync: 설정 초기화", + "cmd.resetSettings.info.resetting": "Sync: 설정을 초기화 중입니다.", + "cmd.resetSettings.info.settingClear": "Sync: 설정이 초기화되었습니다.", + "cmd.otherOptions.title": "Sync: 고급 옵션", + "cmd.otherOptions.openSettingsPage": "Sync: 설정 열기", + "cmd.otherOptions.editLocalSetting": "Sync: 확장(extension)의 로컬 설정 편집하기", + "cmd.otherOptions.shareSetting": "Sync: Public GIST로 설정 공유하기", + "cmd.otherOptions.shareSetting.beforeConfirm": "Sync: 현재 Gist를 삭제하고 새 public Gist에 설정을 업로드합니다. 계속하시겠습니까?", + "cmd.otherOptions.downloadSetting": "Sync: public Gist로부터 설정 다운로드", + "cmd.otherOptions.toggleForceDownload": "Sync: 강제 다운로드 켜기/끄기", + "cmd.otherOptions.toggleForceDownload.on": "Sync: 강제 다운로드 켜기", + "cmd.otherOptions.toggleForceDownload.off": "Sync: 강제 다운로드 끄기", + "cmd.otherOptions.toggleForceUpload": "Sync: 강제 업로드 켜기/끄기", + "cmd.otherOptions.toggleForceUpload.on": "Sync: 강제 업로드 켜기", + "cmd.otherOptions.toggleForceUpload.off": "Sync: 강제 업로드 끄기", + "cmd.otherOptions.toggleAutoUpload": "Sync: 설정이 변경될 때 자동 업로드 켜기/끄기", + "cmd.otherOptions.toggleAutoUpload.on": "Sync: 설정이 변경될 때 자동 업로드하기 켜기. VSCode가 재시작한 뒤에 적용됩니다.", + "cmd.otherOptions.toggleAutoUpload.off": "Sync: 설정이 변경될 때 자동 업로드하기 끄기", + "cmd.otherOptions.toggleAutoDownload": "Sync: VSCode가 시작될 때 자동 다운로드 켜기/끄기", + "cmd.otherOptions.toggleAutoDownload.on": "Sync: VSCode가 시작될 때 자동 다운로드 켜기", + "cmd.otherOptions.toggleAutoDownload.off": "Sync: VSCode가 시작될 때 자동 다운로드 끄기", + "cmd.otherOptions.toggleSummaryPage": "Sync: 업로드/다운로드 시 요약 페이지 표시 켜기/끄기", + "cmd.otherOptions.preserve": "Sync: 다운로드 후 설정을 보호해 덮어쓰기 방지하기", + "cmd.otherOptions.preserve.placeholder": "settings.json를 보호할 암호(key)를 입력하세요.", + "cmd.otherOptions.preserve.prompt": "Example: 'http.proxy' 작성 => 컴퓨터 프록시를 저장 및 덮어씁니다. 비어있으면 프록시가 제거됩니다.", + "cmd.otherOptions.preserve.info.done1": "Sync: 완료. 다운로드 후 {0} 값이 settings.json에서 제거되었습니다.", + "cmd.otherOptions.preserve.info.done2": "Sync: 완료. 다운로드 후 {0}: {1} 는 settings.json에 유지됩니다.", + "cmd.otherOptions.customizedSync": "Sync: 사용자 정의 동기화 파일 추가", + "cmd.otherOptions.customizedSync.placeholder": "추가 업로드 파일의 절대 경로를 입력하십시오.", + "cmd.otherOptions.customizedSync.prompt": "(예: /path/to/.eslintrc)가 업로드되고 지정된 경로로 다운로드될 것입니다.", + "cmd.otherOptions.customizedSync.done": "Sync: {0}가 등록되었습니다.", + "cmd.otherOptions.downloadCustomFile": "Sync: 사용자 정의 동기화 파일을 현재 작업영역에 불러옵니다.", + "cmd.otherOptions.downloadCustomFile.placeholder": "현재 작업영역의 루트(root)에 다운로드 받을 파일을 선택하세요.", + "cmd.otherOptions.downloadCustomFile.done": "{0} 다운로드됨.", + "cmd.otherOptions.joinCommunity": "Sync: 커뮤니티 가입", + "cmd.otherOptions.openIssue": "Sync: 이슈(issue) 열기", + "cmd.otherOptions.releaseNotes": "Sync: 릴리즈 노트", + "cmd.otherOptions.quietSync.on": "Sync: 업/다운로드시 상태바에 표시됩니다.", + "cmd.otherOptions.quietSync.off": "Sync: 업/다운로드시 알림창이 표시됩니다.", + "cmd.otherOptions.warning.tokenNotRequire": "Sync: 이제부터 Settings Sync에서 GitHub 토큰을 묻지 않습니다.", + "cmd.otherOptions.error.toggleFail": "Sync: 설정/해제 할 수 없습니다.", + "cmd.otherOptions.triggerReset": "Sync: 설정을 초기화할까요?", + "common.info.installed": "Sync: 확장이 설치되었습니다. 설치해주셔서 감사합니다!", + "common.info.needHelp": "Sync: 이 확장(extension)을 환경설정하는 데 도움이 필요하십니까?", + "common.info.excludeFile": "Sync: 업/다운로드시 특정 파일 및 폴더를 제외할 수 있습니다.", + "common.info.updating": "Sync: 업데이트 중입니다... 잠시만 기다려주세요.", + "common.info.initAutoUpload": "Sync: {0}초 뒤 자동 업로드가 시작됩니다.", + "common.info.setToken": "Sync: 이제 'syncLocalSetings.json'에서 GitHub 토큰을 수동으로 설정할 수 있습니다.", + "common.info.tokenSaved": "Sync: Token이 저장되었습니다.", + "common.info.gistSaved": "Sync: Gist가 저장되었습니다.", + "common.info.updateTo": "Sync: v{0}로 업데이트 되었습니다.", + "common.info.donate": "Sync: 이 확장(extension)이 마음에 드셨나요? 리뷰를 쓰거나 기부를 해보는 건 어떠세요? ;)", + "common.error.message": "Sync: 콘솔에 오류가 기록되었습니다. (메뉴의 `도움말 > 개발자 도구 설정/해제`에서 볼 수 있습니다.)", + "common.error.connection": "Sync: 인터넷이 연결되지 않았거나 GitHub에 연결할 수 없습니다. 콘솔에 예외(exception)가 기록되었습니다.", + "common.error.canNotSave": "Sync: 설정을 저장할 수 없습니다. settings.json 파일이 유효한 JSON인지 확인해 주세요. (예: 끝에 콤마','가 없는 경우)", + "common.error.invalidToken": "Sync: 유효하지 않거나 만료된 GitHub 토큰입니다. Readme에 언급된 범위에서 새 토큰을 생성해 주세요. 콘솔에 예외(exception)가 기록되었습니다.", + "common.error.invalidGistId": "Sync: 유효하지 않은 Gist Id가 입력되었습니다. 당신의 Gist를 확인해주세요: https://gist.github.com/<당신의_사용자이름>/.", + "common.error.tokenNotSave": "Sync: 토큰이 저장되지 않았습니다.", + "common.error.gistNotSave": "Sync: Gist가 저장되지 않았습니다.", + "common.action.openExtPage": "확장(extension) 페이지 열기", + "common.action.openExtTutorial": "튜토리얼 열기", + "common.action.releaseNotes": "릴리즈 노트", + "common.action.writeReview": "리뷰 작성하기", + "common.action.support": "이 프로젝트 지원하기", + "common.action.joinCommunity": "커뮤니티 참여", + "common.action.donate": "기부하기", + "common.placeholder.enterGithubAccessToken": "GitHub 개인(personal) 액세스 토큰을 입력하세요.", + "common.placeholder.enterGistId": "Gist Id를 입력하세요.", + "common.placeholder.multipleGist": "Gist 이름 (예: 개인 설정)", + "common.prompt.multipleGist": "여러 개의 Gist가 있는 경우, 당신에게 설정을 식별하도록 허용하기", + "common.prompt.enterGistId": "이전에 업로드된 설정으로부터 Gist ID 입력. VSCode설정 중 `sync.gist`에서 수동으로 설정할 수도 있습니다. [Enter]를 누르거나 취소하려면 [Esc]를 누르세요.", + "common.prompt.enterGithubAccessToken": "수동으로 토큰을 추가합니다.(사용자 폴더/syncLocalSettings.json). [Enter]를 누르거나 취소하려면 [Esc]를 누르세요.", + "common.prompt.restartCode": "확장(extensions) 및 구성을 적용하기 위해 VScode를 재시작하시겠습니까?", + "common.prompt.gistForceUpload": "Sync: 업로드하면 GitHub Gist의 설정이 대체됩니다. 설정을 다운로드하거나 강제 업로드를 고려하십시오. 여전히 강제로 업로드 하시겠습니까?", + "common.prompt.gistNewer": "Sync: 마지막으로 다운로드 한 이후 Gist의 설정이 변경되었습니다. 어쨌든 현재 로컬 설정을 Gist에 업로드 하시겠습니까?", + "common.button.no": "아니", + "common.button.yes": "예", + "ext.globalConfig.token.name": "액세스 토큰", + "ext.globalConfig.token.placeholder": "토큰을 입력하세요.", + "ext.globalConfig.githubEnterpriseUrl.name": "GitHub Enterpirse URL(선택사항)", + "ext.globalConfig.githubEnterpriseUrl.placeholder": "GitHub Enterprise URL을 입력하세요", + "ext.globalConfig.ignoreUploadFolders.name": "무시할 폴더", + "ext.globalConfig.ignoredUploadFolders.placeholder": "한 줄에 하나의 폴더를 입력하세요", + "ext.globalConfig.ignoreExtensions.name": "무시할 확장(extension)", + "ext.globalConfig.ignoreExtensions.placeholder": "한 줄에 하나의 확장(extension)을 풀네임으로 입력하세요.", + "ext.globalConfig.hostName.name": "호스트명 (선택사항)", + "ext.globalConfig.hostName.placeholder": "호스트명을 입력하세요", + "ext.globalConfig.ignoreUploadFiles.name": "무시할 파일", + "ext.globalConfig.ignoreUploadFiles.placeholder": "한 줄에 한 파일씩 입력하세요", + "ext.globalConfig.supportedFileExtensions.name": "지원할 파일 확장자", + "ext.globalConfig.supportedFileExtensions.placeholder": "한 줄에 하나의 파일 확장자를 입력하세요", + "ext.globalConfig.gistDescription.name": "Gist 설명", + "ext.globalConfig.gistDescription.placeholder": "Gist 설명을 입력하세요", + "ext.globalConfig.autoUploadDelay.name": "자동 업로드 간격", + "ext.globalConfig.autoUploadDelay.placeholder": "자동 업로드 간격을 초 단위로 입력하세요", + "ext.globalConfig.askGistDescription.name": "Gist 이름", + "ext.globalConfig.downloadPublicGist.name": "public Gist 다운로드", + "ext.globalConfig.openTokenLink.name": "토큰 링크 열기", + "ext.config.gist.name": "Gist ID", + "ext.config.gist.placeholder": "Gist ID를 입력하세요" +} \ No newline at end of file diff --git a/package.nls.pt-br.json b/package.nls.pt-br.json new file mode 100644 index 00000000..73022592 --- /dev/null +++ b/package.nls.pt-br.json @@ -0,0 +1,145 @@ +{ + "cmd.downloadSettings.error.removeExtFail": "Sync: não é Possível remover algumas extensões.", + "cmd.downloadSettings.error.unableSave": "Sync: não é Possível salvar as configurações da extensão do arquivo.", + "cmd.downloadSettings.info.downloaded": "Sincronização: Baixar Completo.", + "cmd.downloadSettings.info.gotLatestVersion": "Sincronização: Você já tem a versão mais recente de configurações salvas.", + "cmd.downloadSettings.info.readdingOnline": "Sincronização: Definições De Leitura On-Line.", + "cmd.downloadSettings.title": "Sincronização: Configurações De Download", + "cmd.howSetting.title": "Sincronização: Como Configurar", + "cmd.otherOptions.customizedSync": "Sincronização: Adicionar Sincronização Personalizada caminho do Arquivo", + "cmd.otherOptions.customizedSync.done": "Sincronização: {0} foi registrado.", + "cmd.otherOptions.customizedSync.placeholder": "Inserir um caminho absoluto do adicional arquivo carregado.", + "cmd.otherOptions.customizedSync.prompt": "(ex. /caminho/para/.eslintrc) será carregado e descarregado para o caminho especificado.", + "cmd.otherOptions.downloadCustomFile": "Sincronização: a Importação de Sincronização Personalizada Arquivo de espaço de trabalho", + "cmd.otherOptions.downloadCustomFile.done": "Baixado {0}.", + "cmd.otherOptions.downloadCustomFile.placeholder": "Selecione o arquivo que você deseja transferir para a raiz do espaço de trabalho que você está trabalhando.", + "cmd.otherOptions.downloadSetting": "Sincronização: Configurações de Download de Público ESSÊNCIA", + "cmd.otherOptions.editLocalSetting": "Sincronização: Editar Extensão De Configurações Locais", + "cmd.otherOptions.error.toggleFail": "Sync: não é Possível Alternar.", + "cmd.otherOptions.joinCommunity": "Sincronização: Junte-Se A Comunidade", + "cmd.otherOptions.openIssue": "Sincronização: Questão Aberta", + "cmd.otherOptions.openSettingsPage": "Sincronização: Configuração Abrir", + "cmd.otherOptions.preserve": "Sincronização: Preservar A Configuração Para Parar De Substituição Após O Download", + "cmd.otherOptions.preserve.info.done1": "Sincronização: Feito. {0} valor será removido a partir de definições.json após o download.", + "cmd.otherOptions.preserve.info.done2": "Sincronização: Feito. Extensão irá mantê - {0}: {1} na definição.json após o download.", + "cmd.otherOptions.preserve.placeholder": "Introduzir a Chave de configurações.json para preservar.", + "cmd.otherOptions.preserve.prompt": "Exemplo: Escrever 'http.proxy' => guarde este computador de proxy e substituí-lo , se o conjunto vazio, ele irá remover o proxy.", + "cmd.otherOptions.quietSync.off": "Sincronização: Resumo será mostrado após o download/upload.", + "cmd.otherOptions.quietSync.on": "Sincronização: a barra de Status será atualizada após o download/upload.", + "cmd.otherOptions.releaseNotes": "Sincronização: Notas De Lançamento", + "cmd.otherOptions.shareSetting": "Sincronização: Definições de Partilha com o Público ESSÊNCIA", + "cmd.otherOptions.shareSetting.beforeConfirm": "Sincronização: Isto irá remover a actual ESSÊNCIA e configurações de upload no novo pública ESSÊNCIA. Você deseja continuar?", + "cmd.otherOptions.title": "Sincronização: Opções Avançadas", + "cmd.otherOptions.toggleAutoDownload": "Sincronização: A Alternância De Download Automático Na Inicialização", + "cmd.otherOptions.toggleAutoDownload.off": "Sincronização: Download Automático DESLIGADO após VSCode de Inicialização.", + "cmd.otherOptions.toggleAutoDownload.on": "Sincronização: Download Automático ligado ao VSCode de Inicialização.", + "cmd.otherOptions.toggleAutoUpload": "Sincronização: A Alternância De Auto-Carregamento Sobre A Alteração De Configurações De", + "cmd.otherOptions.toggleAutoUpload.off": "Sincronização: upload Automático na Alteração de Configuração Desligado.", + "cmd.otherOptions.toggleAutoUpload.on": "Sincronização: upload Automático na Alteração de Configuração ativada. Isso terá efeito após a reinicialização.", + "cmd.otherOptions.toggleForceDownload": "Sincronização: A Alternância De Força Download", + "cmd.otherOptions.toggleForceDownload.off": "Sincronização: A Força De Download Desligado.", + "cmd.otherOptions.toggleForceDownload.on": "Sincronização: A Força De Download Ativado.", + "cmd.otherOptions.toggleForceUpload": "Sincronização: A Alternância De Força Upload", + "cmd.otherOptions.toggleForceUpload.off": "Sincronização: A Força De Carregar Desligado.", + "cmd.otherOptions.toggleForceUpload.on": "Sincronização: A Força De Carregar Ativado.", + "cmd.otherOptions.toggleSummaryPage": "Sincronização: A Alternância De Mostrar Página De Resumo De Upload/Download", + "cmd.otherOptions.triggerReset": "Sincronização: você deseja redefinir as configurações ?", + "cmd.otherOptions.warning.tokenNotRequire": "Sincronização: Definições de Sincronização não vai pedir para o GitHub Token a partir de agora.", + "cmd.resetSettings.info.resetting": "Sincronização: Redefinir As Configurações.", + "cmd.resetSettings.info.settingClear": "Sincronização: Definições Limpo.", + "cmd.resetSettings.title": "Sincronização: Redefinir As Configurações De Extensão", + "cmd.updateSettings.error.gistNotSave": "Sincronização: a ESSÊNCIA NÃO SALVO", + "cmd.updateSettings.error.newGistCreateFail": "Sync: não é Possível criar Essência.", + "cmd.updateSettings.error.readGistFail": "Sincronização: a ESSÊNCIA ID: {0} não é POSSÍVEL LER.", + "cmd.updateSettings.info.gotLatestVersion": "Sincronização: Você já fez o upload da versão mais recente das configurações salvas.", + "cmd.updateSettings.info.newGistCreated": "Sincronização: a Nova essência criado.", + "cmd.updateSettings.info.readding": "Sincronização: Definições de Leitura e de Extensões.", + "cmd.updateSettings.info.shareGist": "Sincronização: Compartilhar a Identificação com outra extensão do blog para compartilhar as configurações.", + "cmd.updateSettings.info.uploadCanceled": "Sincronização: O Processo De Carregar Cancelado.", + "cmd.updateSettings.info.uploading": "Sincronização: Uploading/Atualização De Suas Configurações No GitHub.", + "cmd.updateSettings.info.uploadingDone": "Sincronização: A Transferência Concluída. ESSÊNCIA ID: {0}. Por favor, copiar e utilizar este ID de outras máquinas para transferir definições.", + "cmd.updateSettings.info.uploadingFile": "Sincronização: Upload De Arquivos De Dados.", + "cmd.updateSettings.info.uploadingSuccess": "Sincronização: Carregado Com Êxito.", + "cmd.updateSettings.title": "Sincronização: Atualização/Carregar Configurações", + "cmd.updateSettings.warning.OSNotSupported": "Sincronização Pragma OS value {0} não é suportado linha {1}", + "cmd.updateSettings.warning.noToken": "Sincronização: a Definir GitHub Token ou desactivar 'downloadPublicGist' a partir do local de definições de Sincronização de arquivo.", + "common.action.donate": "Doe Agora", + "common.action.joinCommunity": "Participe Da Comunidade", + "common.action.openExtPage": "Abrir Página De Extensão", + "common.action.openExtTutorial": "Abrir Um Tutorial", + "common.action.releaseNotes": "Notas De Lançamento", + "common.action.support": "Apoiar Este Projeto", + "common.action.writeReview": "Escrever Análise", + "common.button.no": "Não", + "common.button.yes": "Sim", + "common.error.canNotSave": "Sync: não é Possível Salvar as Configurações. Por favor, certifique-se de que você tem válidos JSON configurações.json arquivo. (por exemplo: Sem a vírgula decimal)", + "common.error.connection": "Sincronização: a Internet Não está Conectado ou não é Possível Conectar-se para o GitHub. Exceção Registrada no Console", + "common.error.gistNotSave": "Sincronização: A Essência Não Salvos.", + "common.error.invalidGistId": "Sincronização: Erro De Essência De Identificação Inseridos. Verifique a sua essência: https://gist.github.com//.", + "common.error.invalidToken": "Sincronização: Inválido Ou Expirou GitHub Token. Por favor, gerar novo token com âmbitos mencionados no leia-me. Exceção Registrada no Console.", + "common.error.message": "Sincronização: Erro Registrado No Console (menu Ajuda > Alternância de Ferramentas do Desenvolvedor).", + "common.error.tokenNotSave": "Sincronização: Token Não Salvos.", + "common.info.donate": "Sincronização: você gosta de esta extensão? Que tal escrever um comentário ou enviando um donativo? ", + "common.info.excludeFile": "Sincronização: Você pode excluir qualquer arquivo/pasta para carregar e definições para download.", + "common.info.gistSaved": "Sincronização: A Essência Salvo", + "common.info.initAutoUpload": "Sincronização: Upload Automático De Iniciar No {0} Segundos.", + "common.info.installed": "Sincronização: Definições criadas, agradecer a você para instalar!", + "common.info.needHelp": "Sincronização: Precisa de Ajuda para configurar esta extensão?", + "common.info.setToken": "Sincronização: Agora Você pode definir o seu GitHub token manualmente em `syncLocalSettings.json`", + "common.info.tokenSaved": "Sincronização: Token Salvo", + "common.info.updateTo": "Sincronização: Atualizado para v{0}", + "common.info.updating": "Sincronização: A Atualização Em Andamento... Por Favor, Aguarde.", + "common.placeholder.enterGistId": "Digite Essência De Identificação", + "common.placeholder.enterGithubAccessToken": "Introduza O GitHub Pessoal Token De Acesso", + "common.placeholder.multipleGist": "Gist Nome (por exemplo: Definições Pessoais)", + "common.prompt.enterGistId": "Digite Essência Identificação de carregado anteriormente configurações. Você também pode definir manualmente no código (configurações de sincronização.gist). Pressione [Enter] ou a tecla [Esc] para cancelar.", + "common.prompt.enterGithubAccessToken": "Você também adicionar manualmente um token (Pasta de Usuário/syncLocalSettings.json). Pressione [Enter] ou a tecla [Esc] para cancelar.", + "common.prompt.gistForceUpload": "Sincronização: O upload substituirá as configurações no GitHub Gist. Considere baixar as configurações ou fazer um upload forçado. Você ainda deseja fazer o upload com força?", + "common.prompt.gistNewer": "Sincronização: As configurações no Gist foram alteradas desde o último download. Deseja fazer o upload de suas configurações locais atuais para o Gist?", + "common.prompt.multipleGist": "Permite identificar as configurações se você tiver vários essência.", + "common.prompt.restartCode": "Você deseja recarregar para aplicar extensões e configurações?", + "ext.config.autoDownload": "Defina true para Baixar automaticamente as configurações no código de iniciar. [Código Necessário Reiniciar]", + "ext.config.autoDownload.name": "Download Automático", + "ext.config.autoUpload": "Defina true para Carregamento Automático sobre a alteração de definições. [Código Necessário Reiniciar]", + "ext.config.autoUpload.name": "Carregamento Automático", + "ext.config.forceDownload": "Defina para true se deseja baixar as configurações, mesmo quando você tem as últimas definições.", + "ext.config.forceDownload.name": "Força De Download", + "ext.config.forceUpload": "Defina para true se deseja carregar as configurações, mesmo quando a ESSÊNCIA tem configurações mais recentes.", + "ext.config.forceUpload.name": "Força Upload", + "ext.config.gist": "GIST do GitHub IDENTIFICAÇÃO para as Configurações de Sincronização.", + "ext.config.gist.name": "Essência ID", + "ext.config.gist.placeholder": "Digite Essência de IDENTIFICAÇÃO", + "ext.config.host": "Defini-lo para o seu GitHub Empresa de hospedagem se você deseja usar GHE.", + "ext.config.lastDownload": "Definições de Sincronização última data da transferência. Definir como vazio se você deseja manualmente bater download.", + "ext.config.lastUpload": "Definições de Sincronização última data de envio. Definir como vazio se você deseja manualmente bater download.", + "ext.config.pathPrefix": "Defini-lo para o seu GitHub Empresa API prefixo, se você deseja usar GHE. Normalmente '/api/v3'. Usado apenas quando o host é definido.", + "ext.config.quietSync": "Quando definida como true, vai mostrar o resultado na barra de status em vez de página de resumo.", + "ext.config.quietSync.name": "Silencioso De Sincronização", + "ext.config.removeExtensions": "Definido para false se você não deseja remover extensões para download.", + "ext.config.removeExtensions.name": "Remover Extensões De", + "ext.config.syncExtensions": "Definido para false se você não quiser fazer o upload/download de extensões.", + "ext.config.syncExtensions.name": "Sincronização De Extensões", + "ext.config.title": "Código De Definições De Sincronização De Definições De Configuração", + "ext.globalConfig.askGistDescription.name": "Pergunte Gist Nome", + "ext.globalConfig.autoUploadDelay.name": "Upload Automático De Atraso", + "ext.globalConfig.autoUploadDelay.placeholder": "Insira a quantidade de segundos de atraso auto-upload", + "ext.globalConfig.downloadPublicGist.name": "Download Pública Essência", + "ext.globalConfig.gistDescription.name": "Essência Descrição", + "ext.globalConfig.gistDescription.placeholder": "Digite Essência Descrição", + "ext.globalConfig.githubEnterpriseUrl.name": "O GitHub Enterprise URL (opcional)", + "ext.globalConfig.githubEnterpriseUrl.placeholder": "Introduza o GitHub Empresa de URL", + "ext.globalConfig.hostName.name": "Hostname (opcional)", + "ext.globalConfig.hostName.placeholder": "Introduza O Nome De Host", + "ext.globalConfig.ignoreExtensions.name": "Ignorado Extensões", + "ext.globalConfig.ignoreExtensions.placeholder": "Introduza uma extensão por linha (nome completo)", + "ext.globalConfig.ignoreUploadFiles.name": "Arquivos Ignorados", + "ext.globalConfig.ignoreUploadFiles.placeholder": "Inserir um arquivo por linha", + "ext.globalConfig.ignoreUploadFolders.name": "Ignorado Pastas", + "ext.globalConfig.ignoredUploadFolders.placeholder": "Insira uma pasta por linha", + "ext.globalConfig.openTokenLink.name": "Abrir Token Link", + "ext.globalConfig.supportedFileExtensions.name": "Extensões De Arquivo Suportadas", + "ext.globalConfig.supportedFileExtensions.placeholder": "Digite uma extensão de arquivo por linha", + "ext.globalConfig.token.name": "Token De Acesso", + "ext.globalConfig.token.placeholder": "Digite Token" +} + diff --git a/package.nls.ru.json b/package.nls.ru.json new file mode 100644 index 00000000..7d1c3012 --- /dev/null +++ b/package.nls.ru.json @@ -0,0 +1,144 @@ +{ + "cmd.downloadSettings.error.removeExtFail": "Sync: Не удалось удалить некоторые расширения.", + "cmd.downloadSettings.error.unableSave": "Sync: Не удалось сохранить файл настроек расширения.", + "cmd.downloadSettings.info.downloaded": "Sync: Загрузка завершена", + "cmd.downloadSettings.info.gotLatestVersion": "Sync: У Вас уже установлена последняя версия сохраненных настроек.", + "cmd.downloadSettings.info.readdingOnline": "Sync: Чтение удаленных настроек.", + "cmd.downloadSettings.title": "Sync: Скачать настройки", + "cmd.howSetting.title": "Sync: Инструкция по настройке", + "cmd.otherOptions.customizedSync": "Sync: Добавить путь для синхронизации файлов", + "cmd.otherOptions.customizedSync.done": "Sync: Файл {0} был зарегистрирован.", + "cmd.otherOptions.customizedSync.placeholder": "Введите абсолютный путь к дополнительно загружаемому файлу.", + "cmd.otherOptions.customizedSync.prompt": "(прим.: /путь/к/.eslintrc) этот файл будет синхронизирован", + "cmd.otherOptions.downloadCustomFile": "Sync: Импортировать другой файл настроек в рабочей области", + "cmd.otherOptions.downloadCustomFile.done": "{0} скачен.", + "cmd.otherOptions.downloadCustomFile.placeholder": "Выберите файл, который Вы хотите скачать в корневой каталог активной рабочей области.", + "cmd.otherOptions.downloadSetting": "Sync: Скачать настройки из публичного Gist", + "cmd.otherOptions.editLocalSetting": "Sync: Редактирование параметров синхронизации на этом устройстве", + "cmd.otherOptions.error.toggleFail": "Sync: Не удалось изменить значение.", + "cmd.otherOptions.joinCommunity": "Присоединиться к сообществу", + "cmd.otherOptions.openIssue": "Sync: Создать issue", + "cmd.otherOptions.openSettingsPage": "Sync: Открыть Параметры", + "cmd.otherOptions.preserve": "Sync: Сохранить локальные значения настроек при скачивании удаленных настроек", + "cmd.otherOptions.preserve.info.done1": "Синхронизации: Готово. {0} значение будет удалено из settings.json после синхронизации.", + "cmd.otherOptions.preserve.info.done2": "Синхронизации: Готово. Будет сохранено {0}: {1} в settings.json после синхронизации.", + "cmd.otherOptions.preserve.placeholder": "Введите ключ из settings.json для сохранения локального значения настройки.", + "cmd.otherOptions.preserve.prompt": "Пример: Введите 'http.proxy' => сохранит локальную настройку прокси при синхронизации.", + "cmd.otherOptions.quietSync.off": "Sync: Результат синхронизации будет показан после завершения операции.", + "cmd.otherOptions.quietSync.on": "Sync: Строка состояния будет обновляться во время синхронизации.", + "cmd.otherOptions.releaseNotes": "Sync: Примечания к выпуску", + "cmd.otherOptions.shareSetting": "Sync: Поделиться настройками при помощи публичного Gist", + "cmd.otherOptions.shareSetting.beforeConfirm": "Sync: Это удалит текущий Gist и загрузит настройки в новый публичный Gist. Вы действительно хотите продолжить?", + "cmd.otherOptions.title": "Sync: Дополнительные Параметры", + "cmd.otherOptions.toggleAutoDownload": "Sync: Вкл./выкл. автоматическое скачивание настроек при загрузке приложения", + "cmd.otherOptions.toggleAutoDownload.off": "Sync: Автоматическое скачивание настроек при запуске VSCode отключено.", + "cmd.otherOptions.toggleAutoDownload.on": "Sync: Автоматическое скачивание настроек при запуске VSCode включено.", + "cmd.otherOptions.toggleAutoUpload": "Sync: Вкл./выкл. автоматическую загрузку настроек при изменении параметров", + "cmd.otherOptions.toggleAutoUpload.off": "Sync: Автоматическая загрузка при изменении параметров отключена.", + "cmd.otherOptions.toggleAutoUpload.on": "Sync: Автоматическая загрузка при изменении параметров включена. Изменения вступят в силу после перезагрузки VSCode.", + "cmd.otherOptions.toggleForceDownload": "Sync: Вкл./выкл. принудительное скачивание настроек", + "cmd.otherOptions.toggleForceDownload.off": "Sync: Принудительное скачивание отключено.", + "cmd.otherOptions.toggleForceDownload.on": "Sync: Принудительное скачивание включено.", + "cmd.otherOptions.toggleForceUpload": "Sync: Вкл./выкл. принудительную загрузку", + "cmd.otherOptions.toggleForceUpload.off": "Sync: Принудительная загрузка отключена.", + "cmd.otherOptions.toggleForceUpload.on": "Sync: Принудительная загрузка включена.", + "cmd.otherOptions.toggleSummaryPage": "Sync: Вкл./выкл. показ страницы результата скачивания/загрузки настроек", + "cmd.otherOptions.triggerReset": "Sync: Сбросить настройки синхронизации?", + "cmd.otherOptions.warning.tokenNotRequire": "Sync: Настройки синхронизации больше не будут требовать токен GitHub.", + "cmd.resetSettings.info.resetting": "Sync: Сброс Настроек.", + "cmd.resetSettings.info.settingClear": "Sync: Настройки Сброшены.", + "cmd.resetSettings.title": "Sync: Сброс настроек синхронизации", + "cmd.updateSettings.error.gistNotSave": "Sync: Gist не сохранен", + "cmd.updateSettings.error.newGistCreateFail": "Sync: Не удалось создать Gist.", + "cmd.updateSettings.error.readGistFail": "Sync: Не удалось прочитать Gist ID {0}.", + "cmd.updateSettings.info.gotLatestVersion": "Sync: Вы уже загрузили последнюю версию сохраненных настроек.", + "cmd.updateSettings.info.newGistCreated": "Sync: Создан новый Gist.", + "cmd.updateSettings.info.readding": "Sync: Чтение настроек и расширений.", + "cmd.updateSettings.info.shareGist": "Sync: Поделиться настройками с другими пользователями расширения, отправив ID.", + "cmd.updateSettings.info.uploadCanceled": "Sync: Загрузка отменена.", + "cmd.updateSettings.info.uploading": "Sync: Загрузка/обновление настроек в GitHub.", + "cmd.updateSettings.info.uploadingDone": "Sync: Загрузка Завершена. Gist ID: {0}. Пожалуйста, скопируйте и используйте этот идентификатор на других устройствах для синхронизации настроек.", + "cmd.updateSettings.info.uploadingFile": "Sync: Загрузка файлов данных.", + "cmd.updateSettings.info.uploadingSuccess": "Sync: Успешная загрузка.", + "cmd.updateSettings.title": "Sync: Загрузить/обновить настройки.", + "cmd.updateSettings.warning.OSNotSupported": "Sync: Значение Pragma OS {0} в строке {1} не поддерживается", + "cmd.updateSettings.warning.noToken": "Sync: Введите токен GitHub или отключите настройку 'downloadPublicGist' в настройках.", + "common.action.donate": "Пожертвовать", + "common.action.joinCommunity": "Присоединяйтесь к сообществу", + "common.action.openExtPage": "Открыть страницу расширения", + "common.action.openExtTutorial": "Открыть руководство пользователя", + "common.action.releaseNotes": "Информация о выпуске", + "common.action.support": "Поддержать проект", + "common.action.writeReview": "Написать отзыв", + "common.button.no": "нет", + "common.button.yes": "Да", + "common.error.canNotSave": "Sync: Не удалось сохранить настройки. Пожалуйста, убедитесь в корректности файла `settings.json`. (Например, проверьте на отсутствие завершающих запятых)", + "common.error.connection": "Sync: Интернет не подключен или невозможно подключиться к GitHub. Ошибка выведена в консоль", + "common.error.gistNotSave": "Sync: Gist не сохранен.", + "common.error.invalidGistId": "Sync: Введен некорректный Gist ID. Проверьте Ваш Gist на https://gist.github.com/<имя_пользователя>/.", + "common.error.invalidToken": "Sync: Некорректный или недействительный токен GitHub. Пожалуйста, создайте новый токен с правами доступа, перечисленными в README. Ошибка выведена в консоль.", + "common.error.message": "Sync: Ошибка выведена в консоль (Справка > Показать/скрыть средства разработчика).", + "common.error.tokenNotSave": "Sync: Токен не сохранён.", + "common.info.donate": "Sync: Нравится расширение? Как насчет оставить отзыв или отправить пожертвование?", + "common.info.excludeFile": "Sync: Вы можете исключить любой файл/папку из загрузки и настроек для скачивания", + "common.info.gistSaved": "Sync: Gist сохранен", + "common.info.initAutoUpload": "Sync: Автоматическая загрузка начнется через {0} секунд.", + "common.info.installed": "Sync: Настройки созданы, спасибо за установку расширения!", + "common.info.needHelp": "Sync: Нужна помощь в настройке расширения?", + "common.info.setToken": "Sync: Теперь Вы можете вручную установить Ваш токен GitHub в `syncLocalSettings.json`", + "common.info.tokenSaved": "Sync: Токен сохранен", + "common.info.updateTo": "Sync: Обновлено до v{0}", + "common.info.updating": "Sync: Обновление В Процессе... Пожалуйста, Подождите.", + "common.placeholder.enterGistId": "Введите Gist ID", + "common.placeholder.enterGithubAccessToken": "Введите токен GitHub", + "common.placeholder.multipleGist": "Имя Gist (Например: Personal Settings)", + "common.prompt.enterGistId": "Введите Gist ID от ранее сохраненных настроек. Вы также можете вручную задать его в параметрах (sync.gist). Нажмите [Enter] или [Esc] для отмены.", + "common.prompt.enterGithubAccessToken": "Вы также можете вручную добавить токен (User Folder/syncLocalSettings.json). Нажмите [Enter] или [Esc] для отмены.", + "common.prompt.gistForceUpload": "Sync: Загрузка заменит настройки в GitHub Gist. Попробуйте загрузить настройки или выполнить принудительную загрузку. Вы все еще хотите загружать принудительно?", + "common.prompt.gistNewer": "Sync: Настройки в Gist изменились с момента их последней загрузки. Вы хотите загрузить текущие локальные настройки в Gist?", + "common.prompt.multipleGist": "Поможет определить настройки если Вы используете несколько репозиториев для сохранения настроек.", + "common.prompt.restartCode": "Перезагрузить VSCode для применения расширений и параметров?", + "ext.config.autoDownload": "Установите значение true для автоматической загрузки настроек при запуске приложения. [Требуется перезагрузка VSCode]", + "ext.config.autoDownload.name": "Автоматическое скачивание", + "ext.config.autoUpload": "Установите значение true для автоматической загрузки при изменении параметров. [Требуется перезагрузка VSCode]", + "ext.config.autoUpload.name": "Автоматическая загрузка", + "ext.config.forceDownload": "Установите значение true, для принудительного скачивания настроек (локальные настройки будут перезаписаны даже если у вас более новая версия настроек).", + "ext.config.forceDownload.name": "Принудительное скачивание", + "ext.config.forceUpload": "Установите значение true для загрузки настроек, даже если Gist содержит более новые настройки (удаленные настройки будут перезаписаны даже если там содержится более новая версия настроек).", + "ext.config.forceUpload.name": "Принудительная загрузка", + "ext.config.gist": "GitHub Gist ID для сохранения настроек синхронизации.", + "ext.config.gist.name": "Gist ID", + "ext.config.gist.placeholder": "Введите Gist ID", + "ext.config.host": "Введите адрес Вашего домена GitHub Enterprise для использования GHE.", + "ext.config.lastDownload": "Дата последнего скачивания настроек. Установить пустое значение для скачивания настроек вручную.", + "ext.config.lastUpload": "Дата последней загрузки настроек. Установить пустое значение для скачивания настроек вручную.", + "ext.config.pathPrefix": "Установите префикс Вашего GitHub Enterprise API для работы с GHE. Обычно '/api/v3'. Используется только если введен домен GitHub Enterprise.", + "ext.config.quietSync": "Установите значение true для показа результата в строке состояния вместо страницы.", + "ext.config.quietSync.name": "\"Тихая\" синхронизация", + "ext.config.removeExtensions": "Установите значение false, если вы не хотите, чтобы расширения удалялись во время скачивания настроек.", + "ext.config.removeExtensions.name": "Удалить расширения", + "ext.config.syncExtensions": "Установите значение true для синхронизации расширений.", + "ext.config.syncExtensions.name": "Синхронизация расширений", + "ext.config.title": "Настройки расширения Code Settings Sync", + "ext.globalConfig.askGistDescription.name": "Задать имя Gist", + "ext.globalConfig.autoUploadDelay.name": "Задержка перед автозагрузкой", + "ext.globalConfig.autoUploadDelay.placeholder": "Введите количество секунд для задержки перед автозагрузкой", + "ext.globalConfig.downloadPublicGist.name": "Скачать настройки из публичного Gist", + "ext.globalConfig.gistDescription.name": "Описание Gist", + "ext.globalConfig.gistDescription.placeholder": "Введите описание Gist", + "ext.globalConfig.githubEnterpriseUrl.name": "Домен GitHub Enterprise (не обязательно)", + "ext.globalConfig.githubEnterpriseUrl.placeholder": "Введите домен GitHub Enterprise", + "ext.globalConfig.hostName.name": "Hostname (необязательно)", + "ext.globalConfig.hostName.placeholder": "Введите hostname", + "ext.globalConfig.ignoreExtensions.name": "Игнорируемые расширения", + "ext.globalConfig.ignoreExtensions.placeholder": "Введите одно расширение на строку (полное название)", + "ext.globalConfig.ignoreUploadFiles.name": "Игнорируемые файлы", + "ext.globalConfig.ignoreUploadFiles.placeholder": "Введите один файл на строку", + "ext.globalConfig.ignoreUploadFolders.name": "Игнорируемые папки", + "ext.globalConfig.ignoredUploadFolders.placeholder": "Введите по одной папке на строку", + "ext.globalConfig.openTokenLink.name": "Open Token Link", + "ext.globalConfig.supportedFileExtensions.name": "Поддерживаемые расширения файлов", + "ext.globalConfig.supportedFileExtensions.placeholder": "Введите расширение файла на строку", + "ext.globalConfig.token.name": "Токен доступа", + "ext.globalConfig.token.placeholder": "Введите Токен" +} \ No newline at end of file diff --git a/package.nls.tr.json b/package.nls.tr.json new file mode 100644 index 00000000..df08e488 --- /dev/null +++ b/package.nls.tr.json @@ -0,0 +1,144 @@ +{ + "cmd.downloadSettings.error.removeExtFail": "Bazı uzantıları kaldırmak Mümkün Sync.", + "cmd.downloadSettings.error.unableSave": "Uzantı ayarları dosyası kaydedilemedi çeviri:.", + "cmd.downloadSettings.info.downloaded": "Çeviri: İndirme Tamamlandı.", + "cmd.downloadSettings.info.gotLatestVersion": "Çeviri: önceden kaydedilmiş ayarları en son sürümü.", + "cmd.downloadSettings.info.readdingOnline": "Çeviri: Okuma Ayarları Çevrimiçi.", + "cmd.downloadSettings.title": "Çeviri: İndirme Ayarları", + "cmd.howSetting.title": "Yapılandırma Sync: ", + "cmd.otherOptions.customizedSync": "Sync: Sync Add Özel Dosya yolu", + "cmd.otherOptions.customizedSync.done": "{0} çeviri: kayıtlı.", + "cmd.otherOptions.customizedSync.placeholder": "Ek yüklenen dosyanın mutlak bir yol girin.", + "cmd.otherOptions.customizedSync.prompt": "(ex. ///yolu.eslintrc) yüklenen ve belirtilen yol yüklenir.", + "cmd.otherOptions.downloadCustomFile": "Çeviri: Al Özel Senkron çalışma alanı Dosyası ", + "cmd.otherOptions.downloadCustomFile.done": "{0} indirilmiş.", + "cmd.otherOptions.downloadCustomFile.placeholder": "Üzerinde çalıştığınız çalışma alanı köküne indirmek istediğiniz dosyayı seçin.", + "cmd.otherOptions.downloadSetting": "Kamu ÖZÜ senkronizasyon: İndirme Ayarları ", + "cmd.otherOptions.editLocalSetting": "Çeviri: Düzenleme Uzantısı Yerel Ayarları", + "cmd.otherOptions.error.toggleFail": "Geçiş Yapılamıyor çeviri:.", + "cmd.otherOptions.joinCommunity": "Çeviri: Katılmak Topluluk", + "cmd.otherOptions.openIssue": "Sync: Açık Sorunu", + "cmd.otherOptions.openSettingsPage": "Sync: Açık Ayarları", + "cmd.otherOptions.preserve": "Geçersiz Durdurmak İçin Ayar İndirildikten Sonra Korumak Çeviri: ", + "cmd.otherOptions.preserve.info.done1": "Çeviri: Bitti. {0} değerini ayarlar silinecektir.indirdikten sonra json.", + "cmd.otherOptions.preserve.info.done2": "Çeviri: Bitti. Uzantısı {1} {0}: ortamda devam edecektir.indirdikten sonra json.", + "cmd.otherOptions.preserve.placeholder": "Ayarlardan herhangi bir Tuşa basın.json korumak için.", + "cmd.otherOptions.preserve.prompt": "Örnek: http Yazın.proxy' => deposu bu bilgisayara proxy ve bunun üzerine , eğer boş küme proxy kaldıracaktır.", + "cmd.otherOptions.quietSync.off": "Çeviri: Özet download/upload üzerine gösterilecektir.", + "cmd.otherOptions.quietSync.on": "Çeviri: Durum Çubuğu yükleme indirme üzerine güncellenecektir.", + "cmd.otherOptions.releaseNotes": "Çeviri: Sürüm Notları", + "cmd.otherOptions.shareSetting": "Kamu ÖZÜ ile senkronizasyon: Paylaşım Ayarları ", + "cmd.otherOptions.shareSetting.beforeConfirm": "Sync: Bu yeni ortak KONUSUNU güncel KONUSUNU ve yükleme ayarları kaldıracaktır. Devam etmek istiyor musunuz?", + "cmd.otherOptions.title": "Çeviri: Gelişmiş Seçenekler", + "cmd.otherOptions.toggleAutoDownload": "Başlangıç Sync: Otomatik Aç / Kapat-Download ", + "cmd.otherOptions.toggleAutoDownload.off": "Sync: Otomatik İndirme VSCode Başlangıçta KAPALI.", + "cmd.otherOptions.toggleAutoDownload.on": "Sync: Otomatik İndirme VSCode Başlangıçta açık.", + "cmd.otherOptions.toggleAutoUpload": "Ayarlar Senkronizasyon: Otomatik Aç / Kapat-Upload Değiştirin", + "cmd.otherOptions.toggleAutoUpload.off": "Değiştirme Ayarı senkronizasyon: Otomatik Yükleme Kapalı.", + "cmd.otherOptions.toggleAutoUpload.on": "Değiştirme Ayarı senkronizasyon: Otomatik Yükleme Açık. Bu yeniden başlatma sonra yürürlüğe girecek.", + "cmd.otherOptions.toggleForceDownload": "Çeviri: Geçiş Güç İndir", + "cmd.otherOptions.toggleForceDownload.off": "Çeviri: Force Download Kapalı.", + "cmd.otherOptions.toggleForceDownload.on": "Çeviri: Force Download Açık.", + "cmd.otherOptions.toggleForceUpload": "Çeviri: Geçiş Güç Yüklemek", + "cmd.otherOptions.toggleForceUpload.off": "Çeviri: Force Upload Kapattı.", + "cmd.otherOptions.toggleForceUpload.on": "Çeviri: Force Upload Açık.", + "cmd.otherOptions.toggleSummaryPage": "Yükleme/İndirme Sync: * Toggle Özet Sayfası ", + "cmd.otherOptions.triggerReset": "Çeviri: ayarları sıfırlamak istiyor Musunuz ?", + "cmd.otherOptions.warning.tokenNotRequire": "Sync: Sync GitHub Ayarları Simge için artık sormayacağım.", + "cmd.resetSettings.info.resetting": "Çeviri: Ayarlarınız Sıfırlanıyor.", + "cmd.resetSettings.info.settingClear": "Çeviri: Ayarlar Temizlenir.", + "cmd.resetSettings.title": "Çeviri: Sıfırlama Uzatma Ayarları", + "cmd.updateSettings.error.gistNotSave": "Çeviri: ÖZÜ KAYITLI DEĞİL ", + "cmd.updateSettings.error.newGistCreateFail": "Konusunu oluşturulamadı çeviri:.", + "cmd.updateSettings.error.readGistFail": "OKUMAK İÇİN {0} MÜMKÜN çeviren: ESAS NUMARASI:.", + "cmd.updateSettings.info.gotLatestVersion": "Çeviri: Kayıtlı ayarların en son sürümünü zaten yüklediniz.", + "cmd.updateSettings.info.newGistCreated": "Oluşturulan Sync: Yeni fikri.", + "cmd.updateSettings.info.readding": "Çeviri: Okuma Ayarları ve Uzantıları.", + "cmd.updateSettings.info.shareGist": "Sync: diğer abone ile ayarları paylaşmak Kimliği Paylaşımı.", + "cmd.updateSettings.info.uploadCanceled": "İptal Çeviren: Yükleme İşlemi.", + "cmd.updateSettings.info.uploading": "Çeviri: Yükleme/GitHub Ayarlarını Güncelleme.", + "cmd.updateSettings.info.uploadingDone": "Çeviri: Tam Karşıya. {0} KONUSUNU ID:. Lütfen kopyalayın ve ayarları indirmek için diğer makinelerde bu KİMLİĞİ kullanın.", + "cmd.updateSettings.info.uploadingFile": "Senkron: Veri Dosyaları Yüklemek.", + "cmd.updateSettings.info.uploadingSuccess": "Başarıyla Yüklendi Çeviri:.", + "cmd.updateSettings.title": "Çeviri: Güncelleme/Yükleme Ayarları", + "cmd.updateSettings.warning.OSNotSupported": "{0} Sync Pragma OS değeri {1}satırında desteklenmeyen ", + "cmd.updateSettings.warning.noToken": "Yerel Senkronizasyon ayarları senkronizasyon: Set GitHub Token veya devre dışı bırak 'downloadPublicGist' dosyası.", + "common.action.donate": "Şimdi Bağış ", + "common.action.joinCommunity": "Topluluğuna Katılın ", + "common.action.openExtPage": "Açık Uzatma Sayfa", + "common.action.openExtTutorial": "Açık Öğretici", + "common.action.releaseNotes": "Sürüm Notları", + "common.action.support": "Destek Bu Proje", + "common.action.writeReview": "Gözden Geçirme ", + "common.button.no": "Hayır", + "common.button.yes": "Evet", + "common.error.canNotSave": "Ayarlar kaydedilemedi çeviri:. Geçerli JSON ayarları olduğundan emin olun lütfen.json dosyası. (örn: sondaki virgül)", + "common.error.connection": "GitHub Bağlanmak için Bağlı ya da Yapamaz Sync: İnternet Değil. Özel durum Konsolunda Oturum ", + "common.error.gistNotSave": "Kaydedilen Çeviri: Özü.", + "common.error.invalidGistId": "Çeviri: Geçersiz Özü Kimliği Girdi. Özetle sizin: https://gist.github.com//doğrulayın.", + "common.error.invalidToken": "Çeviri: Geçersiz/GitHub Token Sona Erdi. Readme belirtilen kapsam ile yeni bir belirteç oluşturmak lütfen. Özel durum Konsolunda Oturum.", + "common.error.message": "Çeviri: Hata (menü > Değiştir Geliştirici Araçları Yardım) Konsol giriş yapmış.", + "common.error.tokenNotSave": "Kayıtlı Değil Token Sync.", + "common.info.donate": "Çeviri: bu uzantı sever misiniz? Hakkında bir inceleme yazmak ya da bir bağış göndermek nasıl? ", + "common.info.excludeFile": "Yükleme ve indirme için ayarları için herhangi bir dosya/klasör hariç tutabilirsiniz çeviri:.", + "common.info.gistSaved": "Çeviri: Özü Kurtardı", + "common.info.initAutoUpload": "{0} Saniye Başlatan Sync: Otomatik Yükleme.", + "common.info.installed": "Oluşturulan çeviri: Ayarlar, yükleme için teşekkürler!", + "common.info.needHelp": "Sync: bu uzantı yapılandırma konusunda Yardıma mı İhtiyacınız var?", + "common.info.setToken": "Çeviri: Şimdi GitHub elle syncLocalSettings olarak `simge ayarlayabilirsiniz.json`", + "common.info.tokenSaved": "Çeviri: Simge Kurtardı", + "common.info.updateTo": "{0}v için Güncelleme Sync: ", + "common.info.updating": "Çeviri: İlerleme Güncelleme... Lütfen Bekleyin.", + "common.placeholder.enterGistId": "Konusunu Kimliği Girin ", + "common.placeholder.enterGithubAccessToken": "Token GitHub Kişisel Erişim Girin ", + "common.placeholder.multipleGist": "Esas Adı (örneğin: Kişisel Ayarlar)", + "common.prompt.enterGistId": "Önceden yüklenmiş ayarları Konusunu Kimliğini girin. Ayrıca el ile kod ayarları (eşitleme ayarlayabilirsiniz.özü). Basın [Enter] veya [Esc] iptal etmek için.", + "common.prompt.enterGithubAccessToken": "Ayrıca el/syncLocalSettings Klasör belirteci (bir Kullanıcı ekleyin.json). Basın [Enter] veya [Esc] iptal etmek için.", + "common.prompt.gistForceUpload": "Çeviri: TYükleme GitHub Gist'teki ayarları değiştirecek. Ayarları indirmeyi veya zorunlu bir yükleme yapmayı düşünün. Hala zorla yüklemek istiyor musunuz?", + "common.prompt.gistNewer": "Çeviri: Gist'teki ayarlar, en son indirdiğinizden bu yana değişti. Mevcut yerel ayarlarınızı yine de Gist’e yüklemek ister misiniz?", + "common.prompt.multipleGist": "Birden çok fikri varsa ayarları belirlemenizi sağlar.", + "common.prompt.restartCode": "Uzantıları ve yapılandırmaları uygulamak için yeniden yüklemek ister misiniz?", + "ext.config.autoDownload": "Ayarlamak true Otomatik kod başlangıç ayarları İndirmek. [Kod Yeniden Başlatma Gerekli]", + "ext.config.autoDownload.name": "Otomatik İndirme", + "ext.config.autoUpload": "Doğru ayarları değiştir Yükleme Otomatik olarak ayarlayın. [Kod Yeniden Başlatma Gerekli]", + "ext.config.autoUpload.name": "Otomatik Yükle", + "ext.config.forceDownload": "Eğer en son ayarlar varsa bile ayarları indirmek istiyorsanız true olarak ayarlayın.", + "ext.config.forceDownload.name": "Kuvvet İndir", + "ext.config.forceUpload": "Eğer ÖZÜ yeni ayarları olsa bile ayarları yüklemek istiyorsanız true olarak ayarlayın.", + "ext.config.forceUpload.name": "Güç Yükleme", + "ext.config.gist": "Ayarları Eşitlemek için GitHub KONUSUNU KİMLİĞİ.", + "ext.config.gist.name": "Konusunu KİMLİĞİ", + "ext.config.gist.placeholder": "Konusunu KİMLİĞİ girin ", + "ext.config.host": "Eğer GHE kullanmak istiyorsanız GitHub Enterprise ev sahibi olarak ayarlayın.", + "ext.config.lastDownload": "Ayarları son indirme tarihi Sync. El ile karşıdan vurmak istiyorsan boş olarak ayarlayın.", + "ext.config.lastUpload": "Ayarları son yükleme tarihi Sync. El ile karşıdan vurmak istiyorsan boş olarak ayarlayın.", + "ext.config.pathPrefix": "Eğer GHE kullanmak istiyorsanız GitHub Enterprise API önek ayarlayın. Normalde '/api/v3. Ana ayarlandığında yalnızca kullanılır.", + "ext.config.quietSync": "True olarak ayarlandığında, bunun yerine sayfa sayfa durum çubuğunda sonucu gösterir.", + "ext.config.quietSync.name": "Sessiz Sync", + "ext.config.removeExtensions": "Eğer indirirken uzantıları kaldırmak istemiyorsanız false olarak ayarlayın.", + "ext.config.removeExtensions.name": "Uzantıları Kaldırmak ", + "ext.config.syncExtensions": "Eğer/uzantıları karşıdan yüklemek istemiyorsan false olarak ayarlayın.", + "ext.config.syncExtensions.name": "Sync Uzantıları", + "ext.config.title": "Kod Ayarları Eşitleme Yapılandırma Ayarları", + "ext.globalConfig.askGistDescription.name": "Özü Adını Sor ", + "ext.globalConfig.autoUploadDelay.name": "Otomatik Yükleme Gecikme", + "ext.globalConfig.autoUploadDelay.placeholder": "Otomatik gecikme için upload saniye miktarını girin", + "ext.globalConfig.downloadPublicGist.name": "İndir Kamu Özü", + "ext.globalConfig.gistDescription.name": "Özetle Açıklama", + "ext.globalConfig.gistDescription.placeholder": "Özetle Açıklama Girin ", + "ext.globalConfig.githubEnterpriseUrl.name": "(İsteğe bağlı)GitHub Enterprise URL ", + "ext.globalConfig.githubEnterpriseUrl.placeholder": "GitHub Enterprise URL girin ", + "ext.globalConfig.hostName.name": "Ana bilgisayar adı (isteğe bağlı)", + "ext.globalConfig.hostName.placeholder": "Makine Adını Girin ", + "ext.globalConfig.ignoreExtensions.name": "Göz Ardı Uzantıları", + "ext.globalConfig.ignoreExtensions.placeholder": "(Tam adı)satır başına bir uzantısı girin ", + "ext.globalConfig.ignoreUploadFiles.name": "Yoksayılan Dosyaları", + "ext.globalConfig.ignoreUploadFiles.placeholder": "Satır başına bir dosya girin ", + "ext.globalConfig.ignoreUploadFolders.name": "Göz Ardı Klasörler", + "ext.globalConfig.ignoredUploadFolders.placeholder": "Satır başına bir klasör girin ", + "ext.globalConfig.openTokenLink.name": "Açık Token Linki", + "ext.globalConfig.supportedFileExtensions.name": "Desteklenen Dosya Uzantıları", + "ext.globalConfig.supportedFileExtensions.placeholder": "Satır başına bir dosya uzantısı girin ", + "ext.globalConfig.token.name": "Erişim Belirteci", + "ext.globalConfig.token.placeholder": "Token Girin " +} \ No newline at end of file diff --git a/package.nls.zh-cn.json b/package.nls.zh-cn.json new file mode 100644 index 00000000..16dc0c34 --- /dev/null +++ b/package.nls.zh-cn.json @@ -0,0 +1,144 @@ +{ + "cmd.downloadSettings.error.removeExtFail": "Sync: 不能移除一些扩展", + "cmd.downloadSettings.error.unableSave": "Sync: 无法保存扩展配置文件。", + "cmd.downloadSettings.info.downloaded": "Sync: 下载完成。", + "cmd.downloadSettings.info.gotLatestVersion": "Sync: 你已经应用了最新版本的配置", + "cmd.downloadSettings.info.readdingOnline": "Sync: 正在读取远程设置。", + "cmd.downloadSettings.title": "Sync: 下载配置", + "cmd.howSetting.title": "Sync: 如何配置", + "cmd.otherOptions.customizedSync": "Sync: 添加自定义的文件同步路径", + "cmd.otherOptions.customizedSync.done": "Sync: {0} 已经被注册。", + "cmd.otherOptions.customizedSync.placeholder": "输入额外上传文件的绝对路径。", + "cmd.otherOptions.customizedSync.prompt": "(例如 /path/to/.eslintrc) 将被上传和下载到指定的路径。", + "cmd.otherOptions.downloadCustomFile": "Sync: 导入自定义同步文件到工作区", + "cmd.otherOptions.downloadCustomFile.done": "{0} 下载完成。", + "cmd.otherOptions.downloadCustomFile.placeholder": "选择你想要的文件下载到你正在使用的工作空间的根目录下。", + "cmd.otherOptions.downloadSetting": "Sync: 从公开 Gist 下载配置", + "cmd.otherOptions.editLocalSetting": "Sync: 编辑扩展本地设置", + "cmd.otherOptions.error.toggleFail": "Sync: 无法切换。", + "cmd.otherOptions.joinCommunity": "Sync: 加入社区", + "cmd.otherOptions.openIssue": "Sync: 打开 Issue", + "cmd.otherOptions.openSettingsPage": "Sync: 打开设置", + "cmd.otherOptions.preserve": "Sync: 防止配置在下载后覆盖", + "cmd.otherOptions.preserve.info.done1": "Sync: 完成。下载完成后将从 setting.json 中删除 {0}", + "cmd.otherOptions.preserve.info.done2": "Sync: 完成。下载完成后扩展将在 settings.json 中保留 {0}:{1} 。", + "cmd.otherOptions.preserve.placeholder": "输入 settings.json 中的任意字段以保留", + "cmd.otherOptions.preserve.prompt": "例如:输入 'http.proxy' => 在本机存储该配置,并覆盖同步后的配置。如果设置为空,则会移除同步后配置中的这一字段。", + "cmd.otherOptions.quietSync.off": "Sync: 将在上传或下载时显示摘要。", + "cmd.otherOptions.quietSync.on": "Sync: 将在上传或下载后更新状态栏。", + "cmd.otherOptions.releaseNotes": "Sync: 更新日志", + "cmd.otherOptions.shareSetting": "Sync: 在公开 Gist 上分享配置", + "cmd.otherOptions.shareSetting.beforeConfirm": "Sync: 这将移除当前的 Gist 并将配置发布到新的公开 Gist 。你确定继续吗?", + "cmd.otherOptions.title": "Sync: 高级选项", + "cmd.otherOptions.toggleAutoDownload": "Sync: 切换启动时自动下载", + "cmd.otherOptions.toggleAutoDownload.off": "Sync: VSCode 启动时自动下载已关闭", + "cmd.otherOptions.toggleAutoDownload.on": "Sync: VSCode 启动时自动下载已开启", + "cmd.otherOptions.toggleAutoUpload": "Sync: 切换配置更新后自动上传", + "cmd.otherOptions.toggleAutoUpload.off": "Sync: 自动上传配置已关闭。", + "cmd.otherOptions.toggleAutoUpload.on": "Sync: 自动上传配置已开启。重启后生效。", + "cmd.otherOptions.toggleForceDownload": "Sync: 开关强制下载", + "cmd.otherOptions.toggleForceDownload.off": "Sync: 强制下载已关闭。", + "cmd.otherOptions.toggleForceDownload.on": "Sync: 强制下载已开启。", + "cmd.otherOptions.toggleForceUpload": "Sync: 切换强制上传", + "cmd.otherOptions.toggleForceUpload.off": "Sync: 强制上传已关闭。", + "cmd.otherOptions.toggleForceUpload.on": "Sync: 强制上传已开启。", + "cmd.otherOptions.toggleSummaryPage": "Sync: 开关同步时显示摘要页面", + "cmd.otherOptions.triggerReset": "Sync: 确定要重置设置吗?", + "cmd.otherOptions.warning.tokenNotRequire": "Sync: Settings Sync 将不再要求填写 GitHub 令牌。", + "cmd.resetSettings.info.resetting": "Sync: 正在重置你的设置。", + "cmd.resetSettings.info.settingClear": "Sync: 设置已清除。", + "cmd.resetSettings.title": "Sync: 重置扩展设置", + "cmd.updateSettings.error.gistNotSave": "Sync: Gist 没有保存", + "cmd.updateSettings.error.newGistCreateFail": "Sync: 无法创建 Gist。", + "cmd.updateSettings.error.readGistFail": "Sync: 无法读取 Gist ID:{0}。", + "cmd.updateSettings.info.gotLatestVersion": "Sync: 您已经上传了最新版本的已保存设置。", + "cmd.updateSettings.info.newGistCreated": "Sync: 已创建新的 Gist。", + "cmd.updateSettings.info.readding": "Sync: 正在读取设置和扩展", + "cmd.updateSettings.info.shareGist": "Sync: 与其他用户分享 Gist ID 来共享配置", + "cmd.updateSettings.info.uploadCanceled": "Sync: 上传已取消。", + "cmd.updateSettings.info.uploading": "Sync: 上传/更新您的配置到 GitHub", + "cmd.updateSettings.info.uploadingDone": "Sync: 上传完成。Gist ID:{0}。请复制这个 ID 并将其用于其他设备来下载配置。", + "cmd.updateSettings.info.uploadingFile": "Sync: 上传文件数据。", + "cmd.updateSettings.info.uploadingSuccess": "Sync: 上传成功。", + "cmd.updateSettings.title": "Sync: 更新/上传配置", + "cmd.updateSettings.warning.OSNotSupported": "同步 Pragma OS 值 {0} 不被支持。行:{1}", + "cmd.updateSettings.warning.noToken": "Sync: 设置 GitHub 令牌或从本地同步设置文件中禁用 'downloadPublicGist' 。", + "common.action.donate": "现在捐赠", + "common.action.joinCommunity": "加入社区", + "common.action.openExtPage": "打开扩展主页", + "common.action.openExtTutorial": "打开教程", + "common.action.releaseNotes": "更新日志", + "common.action.support": "支持这个项目", + "common.action.writeReview": "去写评论", + "common.button.no": "没有", + "common.button.yes": "是", + "common.error.canNotSave": "Sync: 保存设置失败。请确保你的 setting.json 文件合法 (例如 : 没有逗号尾随)", + "common.error.connection": "Sync: 未连接到网络或者连接 GitHub 失败。错误信息已打印到控制台", + "common.error.gistNotSave": "Sync: Gist 未保存。", + "common.error.invalidGistId": "Sync: Gist Id 无效。请确认你的 Gist : https://gist.github.com// 是否有效", + "common.error.invalidToken": "Sync: GitHub 令牌无效或已过期。请重新生成。错误信息已打印到控制台", + "common.error.message": "Sync: 错误信息已打印在控制台 (帮助 > 切换开发人员工具)。", + "common.error.tokenNotSave": "Sync: 令牌未保存。", + "common.info.donate": "Sync: 你喜欢这个扩展吗?要不留下评论或捐助我怎么样 ;)", + "common.info.excludeFile": "Sync: 你可以在上传和下载中忽略任何文件或文件夹", + "common.info.gistSaved": "Sync: Gist 已保存", + "common.info.initAutoUpload": "Sync: {0} 秒后开始自动上传", + "common.info.installed": "Sync: 配置已创建。感谢您的使用!", + "common.info.needHelp": "Sync: 需要帮助来配置此扩展吗?", + "common.info.setToken": "Sync: 现现在你可以在 `syncLocalSettings.json` 中手动设置 GitHub 令牌", + "common.info.tokenSaved": "Sync: 令牌已保存", + "common.info.updateTo": "Sync: 更新至 v{0}", + "common.info.updating": "Sync: 正在更新... 请稍候。", + "common.placeholder.enterGistId": "请输入 Gist Id", + "common.placeholder.enterGithubAccessToken": "请输入 GitHub Token", + "common.placeholder.multipleGist": "Gist 名 [ 例如 : Personal Settings ]", + "common.prompt.enterGistId": "请输入上一次上传设置的 Gist Id 。你也可以手动添加到 VSCode 的配置文件 (sync.gist 字段) 。按下 [Enter] 确认或者 输入 'esc' 取消", + "common.prompt.enterGithubAccessToken": "链接打开了!你可以手动添加到用户目录/syncLocalSettings.json 。按下 [Enter] 确认或者 输入 'esc' 取消", + "common.prompt.gistForceUpload": "Sync: 上传将替换GitHub Gist中的设置。 考虑下载设置或强制上传。 你还想强力上传吗?", + "common.prompt.gistNewer": "Sync: 自上次下载以来,Gist中的设置已更改。 您是否要将当前的本地设置上传到Gist?", + "common.prompt.multipleGist": "如果你有多个 Gist 设置,使你可以识别设置", + "common.prompt.restartCode": "你是否要重新加载 VSCode 来应用扩展和设置?", + "ext.config.autoDownload": "设置为 true 在编辑器打开时自动下载远程配置。[需要重启]", + "ext.config.autoDownload.name": "自动下载", + "ext.config.autoUpload": "设置为 true 在编辑器打开时自动上传本地配置。[需要重启]", + "ext.config.autoUpload.name": "自动上传", + "ext.config.forceDownload": "设置为 true 将会下载远程配置,即便本地已有更新的配置。", + "ext.config.forceDownload.name": "强制下载", + "ext.config.forceUpload": "如果即使 Gist 具有较新设置你仍想上传设置,请设置为 true 。", + "ext.config.forceUpload.name": "强制上传", + "ext.config.gist": "设置同步使用的 GitHub Gist ID", + "ext.config.gist.name": "Gist ID", + "ext.config.gist.placeholder": "请输入 Gist ID", + "ext.config.host": "如果你是 GitHub 企业用户,设置为 GitHub 企业版服务器。", + "ext.config.lastDownload": "最后下载时间。如果你要手动下载,请将其设置为空", + "ext.config.lastUpload": "最后上传时间。如果你要手动下载,请将其设置为空", + "ext.config.pathPrefix": "如果你是 GitHub 企业用户,设置 GitHub 的 API 前缀。通常是 '/api/v3' 。只在 host 字段设置后生效", + "ext.config.quietSync": "如果设置为 true ,开启静默模式。上传和下载的概要信息显示在状态栏而非输出面板", + "ext.config.quietSync.name": "静默同步", + "ext.config.removeExtensions": "设置为 false 如果你不想在下载时移除扩展。", + "ext.config.removeExtensions.name": "删除扩展", + "ext.config.syncExtensions": "设置为 false 如果你不想上传/下载扩展。", + "ext.config.syncExtensions.name": "同步扩展", + "ext.config.title": "代码同步配置", + "ext.globalConfig.askGistDescription.name": "创建 Gist 时询问名称,这可以帮助您在您的多个 Gist 中找到这个配置", + "ext.globalConfig.autoUploadDelay.name": "自动上传延迟", + "ext.globalConfig.autoUploadDelay.placeholder": "输入延迟的秒数", + "ext.globalConfig.downloadPublicGist.name": "下载公开 Gist", + "ext.globalConfig.gistDescription.name": "Gist 描述说明", + "ext.globalConfig.gistDescription.placeholder": "请输入描述", + "ext.globalConfig.githubEnterpriseUrl.name": "GitHub 企业版地址(可选)", + "ext.globalConfig.githubEnterpriseUrl.placeholder": "输入 GitHub 企业版 URL", + "ext.globalConfig.hostName.name": "主机名(可选)", + "ext.globalConfig.hostName.placeholder": "输入主机名", + "ext.globalConfig.ignoreExtensions.name": "忽略的扩展", + "ext.globalConfig.ignoreExtensions.placeholder": "每行输入一个扩展名(全名)", + "ext.globalConfig.ignoreUploadFiles.name": "忽略的文件", + "ext.globalConfig.ignoreUploadFiles.placeholder": "每行输入一个文件", + "ext.globalConfig.ignoreUploadFolders.name": "忽略文件夹", + "ext.globalConfig.ignoredUploadFolders.placeholder": "每行输入一个文件夹", + "ext.globalConfig.openTokenLink.name": "打开令牌链接", + "ext.globalConfig.supportedFileExtensions.name": "支持的文件扩展", + "ext.globalConfig.supportedFileExtensions.placeholder": "每行输入一个文件扩展", + "ext.globalConfig.token.name": "获取令牌", + "ext.globalConfig.token.placeholder": "输入令牌" +} diff --git a/package.nls.zh-tw.json b/package.nls.zh-tw.json new file mode 100644 index 00000000..e29e2e1e --- /dev/null +++ b/package.nls.zh-tw.json @@ -0,0 +1,144 @@ +{ + "cmd.downloadSettings.error.removeExtFail": "Sync: 無法移除一些延伸模組", + "cmd.downloadSettings.error.unableSave": "Sync: 無法儲存延伸模組設定檔案。", + "cmd.downloadSettings.info.downloaded": "Sync: 下載完成。", + "cmd.downloadSettings.info.gotLatestVersion": "Sync: 你已經應用了最新版本的設定", + "cmd.downloadSettings.info.readdingOnline": "Sync: 正在讀取線上設定。", + "cmd.downloadSettings.title": "Sync: 下載設定", + "cmd.howSetting.title": "Sync: 如何設定", + "cmd.otherOptions.customizedSync": "Sync: 增加自定義的檔案同步路徑", + "cmd.otherOptions.customizedSync.done": "Sync: {0} 已經被註冊。", + "cmd.otherOptions.customizedSync.placeholder": "輸入額外上傳檔案的絶對路徑。", + "cmd.otherOptions.customizedSync.prompt": "(例如 /path/to/.eslintrc) 將被上傳和下載到指定的路徑。", + "cmd.otherOptions.downloadCustomFile": "Sync: 導入自定義同步檔案到工作區", + "cmd.otherOptions.downloadCustomFile.done": "{0} 下載完成。", + "cmd.otherOptions.downloadCustomFile.placeholder": "選擇你想要的檔案下載到你正在使用的工作空間的根目錄下。", + "cmd.otherOptions.downloadSetting": "Sync: 從公開 Gist 下載設定", + "cmd.otherOptions.editLocalSetting": "Sync: 編輯本機延伸模組設定", + "cmd.otherOptions.error.toggleFail": "Sync: 無法切換。", + "cmd.otherOptions.joinCommunity": "Sync: 加入社群", + "cmd.otherOptions.openIssue": "Sync: 打開 Issue", + "cmd.otherOptions.openSettingsPage": "Sync: 打開設定", + "cmd.otherOptions.preserve": "Sync: 保存電腦裡的設定,避免被下載的設定覆蓋", + "cmd.otherOptions.preserve.info.done1": "Sync: 完成。下載完成後將從 setting.json 中刪除 {0}", + "cmd.otherOptions.preserve.info.done2": "Sync: 完成。下載完成後延伸模組將在 settings.json 中保留 {0}:{1} 。", + "cmd.otherOptions.preserve.placeholder": "輸入 settings.json 中的任意欄位以保留", + "cmd.otherOptions.preserve.prompt": "例如:輸入 'http.proxy' => 在本機存儲該設定,並覆蓋同步後的設定。如果設定為空白,則會移除同步後設定中的這一欄位。", + "cmd.otherOptions.quietSync.off": "Sync: 將在上傳或下載時顯示摘要。", + "cmd.otherOptions.quietSync.on": "Sync: 將在上傳或下載後更新狀態欄。", + "cmd.otherOptions.releaseNotes": "Sync: 更新日誌", + "cmd.otherOptions.shareSetting": "Sync: 在公開 Gist 上分享設定", + "cmd.otherOptions.shareSetting.beforeConfirm": "Sync: 這將移除當前的 Gist 並將設定發佈到新的公開 Gist 。你確定繼續嗎?", + "cmd.otherOptions.title": "Sync: 進階選項", + "cmd.otherOptions.toggleAutoDownload": "Sync: 切換啟動時自動下載", + "cmd.otherOptions.toggleAutoDownload.off": "Sync: VSCode 啟動時自動下載已停用", + "cmd.otherOptions.toggleAutoDownload.on": "Sync: VSCode 啟動時自動下載已啟用", + "cmd.otherOptions.toggleAutoUpload": "Sync: 切換設定更新後自動上傳", + "cmd.otherOptions.toggleAutoUpload.off": "Sync: 自動上傳設定已停用。", + "cmd.otherOptions.toggleAutoUpload.on": "Sync: 自動上傳設定已啟用。重啟後生效。", + "cmd.otherOptions.toggleForceDownload": "Sync: 開關強制下載", + "cmd.otherOptions.toggleForceDownload.off": "Sync: 強制下載已停用。", + "cmd.otherOptions.toggleForceDownload.on": "Sync: 強制下載已啟用。", + "cmd.otherOptions.toggleForceUpload": "Sync: 切換強制上傳", + "cmd.otherOptions.toggleForceUpload.off": "Sync: 強制上傳已停用。", + "cmd.otherOptions.toggleForceUpload.on": "Sync: 強制上傳已啟用。", + "cmd.otherOptions.toggleSummaryPage": "Sync: 開關同步時顯示摘要頁面", + "cmd.otherOptions.triggerReset": "Sync: 確定要重設設定嗎?", + "cmd.otherOptions.warning.tokenNotRequire": "Sync: Settings Sync 將不再要求填寫 GitHub 令牌。", + "cmd.resetSettings.info.resetting": "Sync: 正在重設你的設定。", + "cmd.resetSettings.info.settingClear": "Sync: 設定已清除。", + "cmd.resetSettings.title": "Sync: 重設延伸模組設定", + "cmd.updateSettings.error.gistNotSave": "Sync: Gist 沒有儲存", + "cmd.updateSettings.error.newGistCreateFail": "Sync: 無法創建 Gist。", + "cmd.updateSettings.error.readGistFail": "Sync: 無法讀取 Gist ID:{0}。", + "cmd.updateSettings.info.gotLatestVersion": "Sync: 您已經上傳了最新版本的已保存設定。", + "cmd.updateSettings.info.newGistCreated": "Sync: 已創建新的 Gist。", + "cmd.updateSettings.info.readding": "Sync: 正在讀取設定和延伸模組", + "cmd.updateSettings.info.shareGist": "Sync: 與其他用戶分享 Gist ID 來共享設定", + "cmd.updateSettings.info.uploadCanceled": "Sync: 上傳已取消。", + "cmd.updateSettings.info.uploading": "Sync: 上傳/更新您的設定到 GitHub", + "cmd.updateSettings.info.uploadingDone": "Sync: 上傳完成。Gist ID:{0}。請複製這個 ID 並將其用於其他裝置來下載設定。", + "cmd.updateSettings.info.uploadingFile": "Sync: 上傳檔案資料。", + "cmd.updateSettings.info.uploadingSuccess": "Sync: 上傳成功。", + "cmd.updateSettings.title": "Sync: 更新/上傳設定", + "cmd.updateSettings.warning.OSNotSupported": "不支援同步 Pragma OS 值 {0}。行:{1}", + "cmd.updateSettings.warning.noToken": "Sync: 設定 GitHub 令牌或從本機同步設定檔案中禁用 'downloadPublicGist' 。", + "common.action.donate": "現在捐贈", + "common.action.joinCommunity": "加入社群", + "common.action.openExtPage": "打開延伸模組主頁", + "common.action.openExtTutorial": "打開教學", + "common.action.releaseNotes": "更新日誌", + "common.action.support": "支持這個專案", + "common.action.writeReview": "寫評論", + "common.button.no": "沒有", + "common.button.yes": "是", + "common.error.canNotSave": "Sync: 儲存設定失敗。請確保你的 setting.json 檔案合法 (例如 : 沒有逗號尾隨)", + "common.error.connection": "Sync: 未連接到網絡或者連接 GitHub 失敗。錯誤信息已列印到控制台", + "common.error.gistNotSave": "Sync: Gist 未儲存。", + "common.error.invalidGistId": "Sync: Gist Id 無效。請確認你的 Gist : https://gist.github.com// 是否有效", + "common.error.invalidToken": "Sync: GitHub 令牌無效或已過期。請重新生成。錯誤信息已列印到控制台", + "common.error.message": "Sync: 錯誤信息已列印在控制台 (幫助 > 切換開發人員工具)。", + "common.error.tokenNotSave": "Sync: 令牌未儲存。", + "common.info.donate": "Sync: 你喜歡這個延伸模組嗎?要不留下評論或捐助我怎麼樣 :)", + "common.info.excludeFile": "Sync: 你可以在上傳和下載中忽略任何檔案或資料夾", + "common.info.gistSaved": "Sync: Gist 已儲存", + "common.info.initAutoUpload": "Sync: {0} 秒後開始自動上傳", + "common.info.installed": "Sync: 已建立設定。感謝您的使用!", + "common.info.needHelp": "Sync: 需要幫助來設定此延伸模組嗎?", + "common.info.setToken": "Sync: 現現在你可以在 `syncLocalSettings.json` 中手動設定 GitHub 令牌", + "common.info.tokenSaved": "Sync: 令牌已儲存", + "common.info.updateTo": "Sync: 更新至 v{0}", + "common.info.updating": "Sync: 正在更新... 請稍候。", + "common.placeholder.enterGistId": "請輸入 Gist Id", + "common.placeholder.enterGithubAccessToken": "請輸入 GitHub Token", + "common.placeholder.multipleGist": "Gist 名 [ 例如 : Personal Settings ]", + "common.prompt.enterGistId": "請輸入上一次上傳設定的 Gist Id 。你也可以手動增加到 VSCode 的設定檔案 (sync.gist 欄位) 。按下 [Enter] 確認或者 輸入 'esc' 取消", + "common.prompt.enterGithubAccessToken": "連結打開了!你可以手動增加到用戶目錄/syncLocalSettings.json 。按下 [Enter] 確認或者 輸入 'esc' 取消", + "common.prompt.gistForceUpload": "Sync: 上傳將替換GitHub Gist中的設置。 考慮下載設置或強制上傳。 你還想強力上傳嗎?", + "common.prompt.gistNewer": "Sync: 自上次下載以來,Gist中的設置已更改。 您是否要將當前的本地設置上傳到Gist?", + "common.prompt.multipleGist": "如果你有多個 Gist 設定,使你可以識別設定", + "common.prompt.restartCode": "你是否要重新啟動 VSCode 以應用延伸模組和設定?", + "ext.config.autoDownload": "設定為 true 在編輯器打開時自動下載線上設定。[需要重啟]", + "ext.config.autoDownload.name": "自動下載", + "ext.config.autoUpload": "設定為 true 在編輯器打開時自動上傳本機設定。[需要重啟]", + "ext.config.autoUpload.name": "自動上傳", + "ext.config.forceDownload": "設定為 true 將會下載線上設定,即便本機已有更新的設定。", + "ext.config.forceDownload.name": "強制下載", + "ext.config.forceUpload": "如果即使 Gist 具有較新設定你仍想上傳設定,請設定為 true 。", + "ext.config.forceUpload.name": "強制上傳", + "ext.config.gist": "設定同步使用的 GitHub Gist ID", + "ext.config.gist.name": "Gist ID", + "ext.config.gist.placeholder": "請輸入 Gist ID", + "ext.config.host": "如果你是 GitHub 企業用戶,設定為 GitHub 企業版伺服器。", + "ext.config.lastDownload": "最後下載時間。如果你要手動下載,請將其設定為空白", + "ext.config.lastUpload": "最後上傳時間。如果你要手動下載,請將其設定為空白", + "ext.config.pathPrefix": "如果你是 GitHub 企業用戶,設定 GitHub 的 API 前綴。通常是 '/api/v3' 。只在 host 欄位設定後生效", + "ext.config.quietSync": "如果設定為 true ,將顯示結果在狀態欄而非輸出面板", + "ext.config.quietSync.name": "静音模式同步", + "ext.config.removeExtensions": "設定為 false 如果你不想在下載時移除延伸模組。", + "ext.config.removeExtensions.name": "刪除延伸模組", + "ext.config.syncExtensions": "設定為 false 如果你不想上傳/下載延伸模組。", + "ext.config.syncExtensions.name": "同步延伸模組", + "ext.config.title": "Code Settings Sync 設定", + "ext.globalConfig.askGistDescription.name": "創建 Gist 時詢問名稱,這可以幫助您在您的多個 Gist 中找到這個設定", + "ext.globalConfig.autoUploadDelay.name": "自動上傳延遲", + "ext.globalConfig.autoUploadDelay.placeholder": "輸入延遲的秒數", + "ext.globalConfig.downloadPublicGist.name": "下載公開 Gist", + "ext.globalConfig.gistDescription.name": "Gist 描述說明", + "ext.globalConfig.gistDescription.placeholder": "請輸入描述", + "ext.globalConfig.githubEnterpriseUrl.name": "GitHub 企業版 URL(可選)", + "ext.globalConfig.githubEnterpriseUrl.placeholder": "輸入 GitHub 企業版 URL", + "ext.globalConfig.hostName.name": "主機名(可選)", + "ext.globalConfig.hostName.placeholder": "輸入主機名", + "ext.globalConfig.ignoreExtensions.name": "忽略的延伸模組", + "ext.globalConfig.ignoreExtensions.placeholder": "每行輸入一個延伸模組名稱(全名)", + "ext.globalConfig.ignoreUploadFiles.name": "忽略的檔案", + "ext.globalConfig.ignoreUploadFiles.placeholder": "每行輸入一個檔案", + "ext.globalConfig.ignoreUploadFolders.name": "忽略資料夾", + "ext.globalConfig.ignoredUploadFolders.placeholder": "每行輸入一個資料夾", + "ext.globalConfig.openTokenLink.name": "打開令牌連結", + "ext.globalConfig.supportedFileExtensions.name": "支援的檔案延伸模組", + "ext.globalConfig.supportedFileExtensions.placeholder": "每行輸入一個檔案延伸模組", + "ext.globalConfig.token.name": "獲取令牌", + "ext.globalConfig.token.placeholder": "輸入令牌" +} diff --git a/release-notes.json b/release-notes.json new file mode 100644 index 00000000..2cff592d --- /dev/null +++ b/release-notes.json @@ -0,0 +1,52 @@ +{ + "changes": [ + { + "details": "Add content security policy for webviews", + "type": "NEW", + "color": "success", + "author": "ParkourKarthik", + "pullRequest": "1020" + }, + { + "details": "Improve UX for the Force Upload", + "type": "NEW", + "color": "success", + "author": "karl-lunarg", + "pullRequest": "1042" + }, + { + "details": "Extension always asks to enable Force Upload", + "type": "FIX", + "color": "danger", + "author": "karl-lunarg", + "pullRequest": "1026" + }, + { + "details": "Languages, Icon and Wiki Improved", + "type": "NEW", + "color": "success" + }, + { + "details": "Github Gist Name Consistency across extension", + "type": "FIX", + "color": "danger" + }, + { + "details": "Snippets Sync. Fixed", + "type": "FIX", + "color": "danger" + }, + { + "details": "Share Settings Dialog Fixed", + "type": "FIX", + "color": "danger" + }, + { + "details": "Github Sync Improved", + "type": "FIX", + "color": "danger" + } + + ], + "currentVersion": "v3.4.3" +} diff --git a/scripts/deploy.sh b/scripts/deploy.sh new file mode 100644 index 00000000..bf87a1c4 --- /dev/null +++ b/scripts/deploy.sh @@ -0,0 +1,8 @@ +npm install node-pre-gyp +npm i --no-optional +npm dedupe +npm up +npm install -g vsce +printf "Applying Token" +echo "[{\"name\":\"Shan\",\"pat\":\"$VSCE_TOKEN\"}]" > ~/.vsce +vsce publish diff --git a/src/commons.ts b/src/commons.ts new file mode 100644 index 00000000..2252546a --- /dev/null +++ b/src/commons.ts @@ -0,0 +1,531 @@ +"use strict"; +import * as vscode from "vscode"; +import { Environment } from "./environmentPath"; +import localize from "./localize"; +import { CustomConfig } from "./models/customConfig.model"; +import { ExtensionConfig } from "./models/extensionConfig.model"; +import { LocalConfig } from "./models/localConfig.model"; +import { AutoUploadService } from "./service/autoUpload.service"; +import { File, FileService } from "./service/file.service"; +import { ExtensionInformation } from "./service/plugin.service"; +import { WebviewService } from "./service/webview.service"; +import { state } from "./state"; + +export default class Commons { + public static outputChannel: vscode.OutputChannel = null; + public static LogException( + error: any, + message: string, + msgBox: boolean, + callback?: () => void + ): void { + if (error) { + console.error(error); + if (error.status === 500) { + message = localize("common.error.connection"); + msgBox = false; + } else if (error.status === 401) { + msgBox = true; + message = localize("common.error.invalidToken"); + } else if (error.status === 4) { + message = localize("common.error.canNotSave"); + } else if (error.message) { + try { + message = JSON.parse(error.message).message; + if (message.toLowerCase() === "not found") { + msgBox = true; + message = localize("common.error.invalidGistId"); + } + } catch (error) { + // message = error.message; + } + } + } + + if (msgBox === true) { + vscode.window.showErrorMessage(message); + vscode.window.setStatusBarMessage("").dispose(); + } else { + vscode.window.setStatusBarMessage(message, 5000); + } + + if (callback) { + callback.apply(this); + } + } + + public static GetInputBox(token: boolean) { + if (token) { + const options: vscode.InputBoxOptions = { + placeHolder: localize("common.placeholder.enterGithubAccessToken"), + password: false, + prompt: localize("common.prompt.enterGithubAccessToken"), + ignoreFocusOut: true + }; + return options; + } else { + const options: vscode.InputBoxOptions = { + placeHolder: localize("common.placeholder.enterGistId"), + password: false, + prompt: localize("common.prompt.enterGistId"), + ignoreFocusOut: true + }; + return options; + } + } + + public autoUploadService: AutoUploadService; + public webviewService = new WebviewService(); + + public ERROR_MESSAGE: string = localize("common.error.message"); + + constructor() { + this.InitializeAutoUpload(); + } + + public async InitializeAutoUpload() { + const ignored = AutoUploadService.GetIgnoredItems( + await this.GetCustomSettings() + ); + this.autoUploadService = new AutoUploadService(ignored); + } + + public async HandleStartWatching() { + if (this.autoUploadService) { + this.autoUploadService.StartWatching(); + } else { + await this.InitializeAutoUpload(); + this.HandleStartWatching(); + } + } + + public async HandleStopWatching() { + if (this.autoUploadService) { + this.autoUploadService.StopWatching(); + } else { + await this.InitializeAutoUpload(); + this.HandleStopWatching(); + } + } + + public async InitalizeSettings(): Promise { + const settings = new LocalConfig(); + const extSettings = this.GetSettings(); + const cusSettings = await this.GetCustomSettings(); + + settings.customConfig = cusSettings; + settings.extConfig = extSettings; + return settings; + } + + public async GetCustomSettings(): Promise { + let customSettings = new CustomConfig(); + try { + const customExist: boolean = await FileService.FileExists( + state.environment.FILE_CUSTOMIZEDSETTINGS + ); + if (customExist) { + const customSettingStr: string = await FileService.ReadFile( + state.environment.FILE_CUSTOMIZEDSETTINGS + ); + const tempObj = JSON.parse(customSettingStr); + + Object.assign(customSettings, tempObj); + customSettings.token = customSettings.token.trim(); + } + } catch (e) { + customSettings = null; + Commons.LogException( + e, + "Sync : Unable to read " + + state.environment.FILE_CUSTOMIZEDSETTINGS_NAME + + ". Make sure its Valid JSON.", + true + ); + vscode.commands.executeCommand( + "vscode.open", + vscode.Uri.parse( + "http://shanalikhan.github.io/2017/02/19/Option-to-ignore-settings-folders-code-settings-sync.html" + ) + ); + } + return customSettings; + } + + public async SetCustomSettings(setting: CustomConfig): Promise { + try { + await FileService.WriteFile( + state.environment.FILE_CUSTOMIZEDSETTINGS, + JSON.stringify(setting, null, 4) + ); + return true; + } catch (e) { + Commons.LogException( + e, + "Sync : Unable to write " + + state.environment.FILE_CUSTOMIZEDSETTINGS_NAME, + true + ); + return false; + } + } + + public async StartMigrationProcess(): Promise { + const fileExist: boolean = await FileService.FileExists( + state.environment.FILE_CUSTOMIZEDSETTINGS + ); + let customSettings: CustomConfig = null; + const firstTime: boolean = !fileExist; + let fileChanged: boolean = firstTime; + + if (fileExist) { + customSettings = await this.GetCustomSettings(); + } else { + customSettings = new CustomConfig(); + } + // vscode.workspace.getConfiguration().update("sync.version", undefined, true); + + if (firstTime) { + const openExtensionPage = localize("common.action.openExtPage"); + vscode.window.showInformationMessage(localize("common.info.installed")); + vscode.window + .showInformationMessage( + localize("common.info.needHelp"), + openExtensionPage + ) + .then((val: string) => { + if (val === openExtensionPage) { + vscode.commands.executeCommand( + "vscode.open", + vscode.Uri.parse( + "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" + ) + ); + } + }); + } else if (customSettings.version < Environment.CURRENT_VERSION) { + fileChanged = true; + // #TODO : Remove this in new update + const newIgnoredList = new CustomConfig().ignoreUploadFiles; + newIgnoredList.forEach(m => { + if (customSettings.ignoreUploadFiles.indexOf(m) === -1) { + customSettings.ignoreUploadFiles.push(m); + } + }); + + if (state.context.globalState.get("synctoken")) { + const token = state.context.globalState.get("synctoken"); + if (token !== "") { + customSettings.token = String(token); + state.context.globalState.update("synctoken", ""); + vscode.window.showInformationMessage( + localize("common.info.setToken") + ); + } + } + + const releaseNotes = localize("common.action.releaseNotes"); + const writeReview = localize("common.action.writeReview"); + const support = localize("common.action.support"); + const joinCommunity = localize("common.action.joinCommunity"); + if (!customSettings.disableUpdateMessage) { + vscode.window + .showInformationMessage( + localize("common.info.updateTo", Environment.getVersion()), + releaseNotes, + writeReview, + support, + joinCommunity + ) + .then((val: string) => { + if (val === releaseNotes) { + vscode.commands.executeCommand( + "vscode.open", + vscode.Uri.parse( + "http://shanalikhan.github.io/2016/05/14/Visual-studio-code-sync-settings-release-notes.html" + ) + ); + } + if (val === writeReview) { + vscode.commands.executeCommand( + "vscode.open", + vscode.Uri.parse( + "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync#review-details" + ) + ); + } + if (val === support) { + vscode.commands.executeCommand( + "vscode.open", + vscode.Uri.parse( + "https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=4W3EWHHBSYMM8&lc=IE&item_name=Code%20Settings%20Sync&item_number=visual%20studio%20code%20settings%20sync¤cy_code=USD&bn=PP-DonationsBF:btn_donate_SM.gif:NonHosted" + ) + ); + } + if (val === joinCommunity) { + vscode.commands.executeCommand( + "vscode.open", + vscode.Uri.parse( + "https://join.slack.com/t/codesettingssync/shared_invite/enQtNzQyODMzMzI5MDQ3LWNmZjVkZjE2YTg0MzY1Y2EyYzVmYThmNzg2YjZkNjhhZWY3ZTEzN2I3ZTAxMjkwNWU0ZjMyZGFhMjdiZDI3ODU" + ) + ); + } + }); + } + } + + if (fileChanged) { + customSettings.version = Environment.CURRENT_VERSION; + await this.SetCustomSettings(customSettings); + } + return true; + } + + public async SaveSettings(setting: ExtensionConfig): Promise { + const config = vscode.workspace.getConfiguration("sync"); + const allKeysUpdated = new Array>(); + + const keys = Object.keys(setting); + keys.forEach(async keyName => { + if (setting[keyName] == null) { + setting[keyName] = ""; + } + if (keyName.toLowerCase() !== "token") { + if (config.get(keyName) !== setting[keyName]) { + allKeysUpdated.push(config.update(keyName, setting[keyName], true)); + } + } + }); + + try { + await Promise.all(allKeysUpdated); + if (state.context.globalState.get("syncCounter")) { + const counter = state.context.globalState.get("syncCounter"); + let count: number = parseInt(counter + "", 10); + if (count % 450 === 0) { + this.DonateMessage(); + } + count = count + 1; + state.context.globalState.update("syncCounter", count); + } else { + state.context.globalState.update("syncCounter", 1); + } + return true; + } catch (err) { + Commons.LogException(err, this.ERROR_MESSAGE, true); + return false; + } + } + + public async DonateMessage(): Promise { + const donateNow = localize("common.action.donate"); + const writeReview = localize("common.action.writeReview"); + const res = await vscode.window.showInformationMessage( + localize("common.info.donate"), + donateNow, + writeReview + ); + + if (res === donateNow) { + vscode.commands.executeCommand( + "vscode.open", + vscode.Uri.parse( + "https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=4W3EWHHBSYMM8&lc=IE&item_name=Code%20Settings%20Sync&item_number=visual%20studio%20code%20settings%20sync¤cy_code=USD&bn=PP-DonationsBF:btn_donate_SM.gif:NonHosted" + ) + ); + } else if (res === writeReview) { + vscode.commands.executeCommand( + "vscode.open", + vscode.Uri.parse( + "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync#review-details" + ) + ); + } + } + + public GetSettings(): ExtensionConfig { + const settings = new ExtensionConfig(); + + for (const key of Object.keys(settings)) { + if (key !== "token") { + settings[key] = vscode.workspace.getConfiguration("sync").get(key); + } + } + + settings.gist = settings.gist.trim(); + return settings; + } + + public async GetTokenAndSave(sett: CustomConfig): Promise { + const opt = Commons.GetInputBox(true); + + const token = ((await vscode.window.showInputBox(opt)) || "").trim(); + + if (token && token !== "esc") { + sett.token = token; + const saved = await this.SetCustomSettings(sett); + if (saved) { + vscode.window.setStatusBarMessage( + localize("common.info.tokenSaved"), + 1000 + ); + } + } + + return token; + } + public async GetGistAndSave(sett: ExtensionConfig): Promise { + const opt = Commons.GetInputBox(false); + + const gist = ((await vscode.window.showInputBox(opt)) || "").trim(); + + if (gist && gist !== "esc") { + sett.gist = gist; + const saved = await this.SaveSettings(sett); + if (saved) { + vscode.window.setStatusBarMessage( + localize("common.info.gistSaved"), + 1000 + ); + } + return gist; + } + } + + /** + * IgnoreSettings + */ + public async GetIgnoredSettings(settings: string[]): Promise { + const ignoreSettings: object = {}; + const config = vscode.workspace.getConfiguration(); + const keysUpdated: Array> = []; + + for (const key of settings) { + let keyValue: object = null; + keyValue = config.get(key, null); + if (keyValue !== null) { + ignoreSettings[key] = keyValue; + keysUpdated.push(config.update(key, undefined, true)); + } + } + + await Promise.all(keysUpdated); + + return ignoreSettings; + } + + /** + * RestoreIgnoredSettings + */ + public SetIgnoredSettings(ignoredSettings: object): void { + const config = vscode.workspace.getConfiguration(); + const keysUpdated: Array> = []; + for (const key of Object.keys(ignoredSettings)) { + keysUpdated.push(config.update(key, ignoredSettings[key], true)); + } + } + + /** + * AskGistDescription + */ + public async AskGistDescription(): Promise { + return vscode.window.showInputBox({ + prompt: localize("common.prompt.multipleGist"), + ignoreFocusOut: true, + placeHolder: localize("common.placeholder.multipleGist") + }); + } + + public ShowSummaryOutput( + upload: boolean, + files: File[], + removedExtensions: ExtensionInformation[], + addedExtensions: ExtensionInformation[], + ignoredExtensions: ExtensionInformation[], + syncSettings: LocalConfig + ) { + if (Commons.outputChannel === null) { + Commons.outputChannel = vscode.window.createOutputChannel( + "Code Settings Sync" + ); + } + + const outputChannel = Commons.outputChannel; + outputChannel.appendLine( + `CODE SETTINGS SYNC ${upload ? "UPLOAD" : "DOWNLOAD"} SUMMARY` + ); + outputChannel.appendLine(`Version: ${Environment.getVersion()}`); + outputChannel.appendLine(`--------------------`); + outputChannel.appendLine( + `GitHub Token: ${ + syncSettings.customConfig.token + ? syncSettings.customConfig.token.slice(0, 4) + "**********" + : "Anonymous" + }` + ); + outputChannel.appendLine(`GitHub Gist: ${syncSettings.extConfig.gist}`); + outputChannel.appendLine( + `GitHub Gist Type: ${syncSettings.publicGist ? "Public" : "Secret"}` + ); + outputChannel.appendLine(``); + if (!syncSettings.customConfig.token) { + outputChannel.appendLine( + `Anonymous Gist cannot be edited, the extension will always create a new one during upload.` + ); + } + outputChannel.appendLine( + `Restarting Visual Studio Code may be required to apply color and file icon theme.` + ); + outputChannel.appendLine(`--------------------`); + + outputChannel.appendLine(`Files ${upload ? "Upload" : "Download"}ed:`); + files + .filter(item => item.fileName.indexOf(".") > 0) + .forEach(item => { + outputChannel.appendLine(` ${item.fileName} > ${item.gistName}`); + }); + + outputChannel.appendLine(``); + outputChannel.appendLine(`Extensions Ignored:`); + + if (!ignoredExtensions || ignoredExtensions.length === 0) { + outputChannel.appendLine(` No extensions ignored.`); + } else { + ignoredExtensions.forEach(extn => { + outputChannel.appendLine(` ${extn.name} v${extn.version}`); + }); + } + + outputChannel.appendLine(``); + outputChannel.appendLine(`Extensions Removed:`); + + if (!syncSettings.extConfig.removeExtensions) { + outputChannel.appendLine(` Feature Disabled.`); + } else { + if (!removedExtensions || removedExtensions.length === 0) { + outputChannel.appendLine(` No extensions removed.`); + } else { + removedExtensions.forEach(extn => { + outputChannel.appendLine(` ${extn.name} v${extn.version}`); + }); + } + } + + if (addedExtensions) { + outputChannel.appendLine(``); + outputChannel.appendLine(`Extensions Added:`); + + if (addedExtensions.length === 0) { + outputChannel.appendLine(` No extensions installed.`); + } + + addedExtensions.forEach(extn => { + outputChannel.appendLine(` ${extn.name} v${extn.version}`); + }); + } + + outputChannel.appendLine(`--------------------`); + outputChannel.append(`Done.`); + outputChannel.show(true); + } +} diff --git a/src/enums.ts b/src/enums.ts new file mode 100644 index 00000000..69ebef8f --- /dev/null +++ b/src/enums.ts @@ -0,0 +1,13 @@ +export enum OsType { + Windows = "win32", + Linux = "linux", + Mac = "darwin" +} + +export enum SettingType { + Settings = 1, + Launch, + KeyBindings, + Locale, + Extensions +} diff --git a/src/environmentPath.ts b/src/environmentPath.ts new file mode 100644 index 00000000..611fa20d --- /dev/null +++ b/src/environmentPath.ts @@ -0,0 +1,196 @@ +"use strict"; + +import { normalize, resolve } from "path"; +import * as vscode from "vscode"; +import { OsType } from "./enums"; +import { state } from "./state"; + +export const SUPPORTED_OS: string[] = Object.keys(OsType) + .filter(k => !/\d/.test(k)) + .map(k => k.toLowerCase()); // . ["windows", "linux", "mac"]; + +export function osTypeFromString(osName: string): OsType { + const capitalized: string = + osName[0].toUpperCase() + osName.substr(1).toLowerCase(); + return OsType[capitalized]; +} + +export class Environment { + public static CURRENT_VERSION: number = 343; + public static getVersion(): string { + return ( + Environment.CURRENT_VERSION.toString().slice(0, 1) + + "." + + Environment.CURRENT_VERSION.toString().slice(1, 2) + + "." + + Environment.CURRENT_VERSION.toString().slice(2, 3) + ); + } + + // public isInsiders: boolean = false; + // public isOss: boolean = false; + // public isCoderCom: boolean = false; + // public homeDir: string | null = null; + + public isPortable: boolean = false; + public USER_FOLDER: string = null; + + public CODE_BIN: string; + + public EXTENSION_FOLDER: string = null; + public PATH: string = null; + public OsType: OsType = null; + + public FILE_SETTING: string = null; + public FILE_LAUNCH: string = null; + public FILE_KEYBINDING: string = null; + public FILE_LOCALE: string = null; + public FILE_EXTENSION: string = null; + public FILE_CLOUDSETTINGS: string = null; + public FILE_SYNC_LOCK: string = null; + + public FILE_CUSTOMIZEDSETTINGS_NAME: string = "syncLocalSettings.json"; + public FILE_CUSTOMIZEDSETTINGS: string = null; + + public FILE_SETTING_NAME: string = "settings.json"; + public FILE_LAUNCH_NAME: string = "launch.json"; + public FILE_KEYBINDING_NAME: string = "keybindings.json"; + public FILE_KEYBINDING_MAC: string = "keybindingsMac.json"; + public FILE_KEYBINDING_DEFAULT: string = "keybindings.json"; + public FILE_EXTENSION_NAME: string = "extensions.json"; + public FILE_LOCALE_NAME: string = "locale.json"; + public FILE_SYNC_LOCK_NAME: string = "sync.lock"; + + public FILE_CLOUDSETTINGS_NAME: string = "cloudSettings"; + + public FOLDER_SNIPPETS: string = null; + + constructor() { + state.context.globalState.update("_", undefined); // Make sure the global state folder exists. This is needed for using this.context.globalStoragePath to access user folder + + this.isPortable = !!process.env.VSCODE_PORTABLE; + + this.OsType = process.platform as OsType; + if (!this.isPortable) { + this.PATH = resolve(state.context.globalStoragePath, "../../..").concat( + normalize("/") + ); + this.USER_FOLDER = resolve(this.PATH, "User").concat(normalize("/")); + this.EXTENSION_FOLDER = resolve( + vscode.extensions.all.filter( + extension => !extension.packageJSON.isBuiltin + )[0].extensionPath, + ".." + ).concat(normalize("/")); // Gets first non-builtin extension's path + } else { + this.PATH = process.env.VSCODE_PORTABLE; + this.USER_FOLDER = resolve(this.PATH, "user-data/User").concat( + normalize("/") + ); + this.EXTENSION_FOLDER = resolve(this.PATH, "extensions").concat( + normalize("/") + ); + } + + /* Start Legacy Code + + this.isInsiders = /insiders/.test(this.context.asAbsolutePath("")); + this.isOss = /\boss\b/.test(this.context.asAbsolutePath("")); + this.isCoderCom = + vscode.extensions.getExtension("coder.coder") !== undefined; + const isXdg = + !this.isInsiders && + !this.isCoderCom && + process.platform === "linux" && + !!process.env.XDG_DATA_HOME; + this.homeDir = isXdg + ? process.env.XDG_DATA_HOME + : process.env[process.platform === "win32" ? "USERPROFILE" : "HOME"]; + const configSuffix = `; $; {isXdg || this.isCoderCom ? "" : "."; }vscode$; { + this.isInsiders ? "-insiders" : this.isOss ? "-oss" : ""; + }`; + + if (!this.isPortable) { + if (process.platform === "darwin") { + this.PATH = process.env.HOME + "/Library/Application Support"; + this.OsType = OsType.Mac; + } else if (process.platform === "linux") { + if (!this.isCoderCom) { + this.PATH = + isXdg && !!process.env.XDG_CONFIG_HOME + ? process.env.XDG_CONFIG_HOME + : os.homedir() + "/.config"; + } else { + this.PATH = "/tmp"; + } + this.OsType = OsType.Linux; + } else if (process.platform === "win32") { + this.PATH = process.env.APPDATA; + this.OsType = OsType.Windows; + } else { + this.PATH = "/var/local"; + this.OsType = OsType.Linux; + } + } + + if (this.isPortable) { + this.PATH = process.env.VSCODE_PORTABLE; + if (process.platform === "darwin") { + this.OsType = OsType.Mac; + } else if (process.platform === "linux") { + this.OsType = OsType.Linux; + } else if (process.platform === "win32") { + this.OsType = OsType.Windows; + } else { + this.OsType = OsType.Linux; + } + } + + if (!this.isPortable) { + const possibleCodePaths = []; + if (this.isInsiders) { + possibleCodePaths.push("/Code - Insiders"); + } else if (this.isOss) { + possibleCodePaths.push("/Code - OSS"); + possibleCodePaths.push("/VSCodium"); + } else { + possibleCodePaths.push("/Code"); + } + for (const possibleCodePath of possibleCodePaths) { + try { + fs.statSync(this.PATH + possibleCodePath); + this.PATH = this.PATH + possibleCodePath; + break; + } catch (e) { + console.error("Error :" + possibleCodePath); + console.error(e); + } + } + this.ExtensionFolder = path.join( + this.homeDir, + configSuffix, + "extensions" + ); + this.USER_FOLDER = this.PATH.concat("/User/"); + } else { + this.USER_FOLDER = this.PATH.concat("/user-data/User/"); + this.ExtensionFolder = this.PATH.concat("/extensions/"); + } + + End Legacy Code */ + + this.FILE_EXTENSION = this.USER_FOLDER.concat(this.FILE_EXTENSION_NAME); + this.FILE_SETTING = this.USER_FOLDER.concat(this.FILE_SETTING_NAME); + this.FILE_LAUNCH = this.USER_FOLDER.concat(this.FILE_LAUNCH_NAME); + this.FILE_KEYBINDING = this.USER_FOLDER.concat(this.FILE_KEYBINDING_NAME); + this.FILE_LOCALE = this.USER_FOLDER.concat(this.FILE_LOCALE_NAME); + this.FOLDER_SNIPPETS = this.USER_FOLDER.concat("/snippets/"); + this.FILE_CLOUDSETTINGS = this.USER_FOLDER.concat( + this.FILE_CLOUDSETTINGS_NAME + ); + this.FILE_CUSTOMIZEDSETTINGS = this.USER_FOLDER.concat( + this.FILE_CUSTOMIZEDSETTINGS_NAME + ); + this.FILE_SYNC_LOCK = this.USER_FOLDER.concat(this.FILE_SYNC_LOCK_NAME); + } +} diff --git a/src/extension.ts b/src/extension.ts new file mode 100644 index 00000000..7ebc3934 --- /dev/null +++ b/src/extension.ts @@ -0,0 +1,48 @@ +"use strict"; + +import * as vscode from "vscode"; +import { Environment } from "./environmentPath"; +import { state } from "./state"; +import { Sync } from "./sync"; + +export async function activate(context: vscode.ExtensionContext) { + state.context = context; + state.environment = new Environment(); + + const sync = new Sync(); + + sync.bootstrap(); + + context.subscriptions.push( + vscode.commands.registerCommand( + "extension.updateSettings", + (optArgument?: string) => { + sync.upload.bind(sync, optArgument)(); + } + ) + ); + context.subscriptions.push( + vscode.commands.registerCommand( + "extension.downloadSettings", + sync.download.bind(sync) + ) + ); + context.subscriptions.push( + vscode.commands.registerCommand( + "extension.resetSettings", + sync.reset.bind(sync) + ) + ); + context.subscriptions.push( + vscode.commands.registerCommand( + "extension.HowSettings", + sync.how.bind(sync) + ) + ); + context.subscriptions.push( + vscode.commands.registerCommand( + "extension.otherOptions", + sync.advance.bind(sync) + ) + ); +} diff --git a/src/localize.ts b/src/localize.ts new file mode 100644 index 00000000..a88ce0fd --- /dev/null +++ b/src/localize.ts @@ -0,0 +1,86 @@ +import { existsSync, readFileSync } from "fs-extra"; +import { resolve } from "path"; +import { extensions } from "vscode"; +import { ILanguagePack } from "./models/language-pack.model"; + +export class Localize { + private bundle = this.resolveLanguagePack(); + private options: { locale: string }; + + public localize(key: string, ...args: string[]): string { + const message = this.bundle[key] || key; + return this.format(message, args); + } + + private init() { + try { + this.options = { + ...this.options, + ...JSON.parse(process.env.VSCODE_NLS_CONFIG || "{}") + }; + } catch (err) { + throw err; + } + } + + private format(message: string, args: string[] = []): string { + return args.length + ? message.replace( + /\{(\d+)\}/g, + (match, rest: any[]) => args[rest[0]] || match + ) + : message; + } + + private resolveLanguagePack(): ILanguagePack { + this.init(); + + const languageFormat = "package.nls{0}.json"; + const defaultLanguage = languageFormat.replace("{0}", ""); + + const rootPath = extensions.getExtension("Shan.code-settings-sync") + .extensionPath; + + const resolvedLanguage = this.recurseCandidates( + rootPath, + languageFormat, + this.options.locale + ); + + const languageFilePath = resolve(rootPath, resolvedLanguage); + + try { + const defaultLanguageBundle = JSON.parse( + resolvedLanguage !== defaultLanguage + ? readFileSync(resolve(rootPath, defaultLanguage), "utf-8") + : "{}" + ); + + const resolvedLanguageBundle = JSON.parse( + readFileSync(languageFilePath, "utf-8") + ); + + return { ...defaultLanguageBundle, ...resolvedLanguageBundle }; + } catch (err) { + throw err; + } + } + + private recurseCandidates( + rootPath: string, + format: string, + candidate: string + ): string { + const filename = format.replace("{0}", `.${candidate}`); + const filepath = resolve(rootPath, filename); + if (existsSync(filepath)) { + return filename; + } + if (candidate.split("-")[0] !== candidate) { + return this.recurseCandidates(rootPath, format, candidate.split("-")[0]); + } + return format.replace("{0}", ""); + } +} + +export default Localize.prototype.localize.bind(new Localize()); diff --git a/src/lockfile.ts b/src/lockfile.ts new file mode 100644 index 00000000..e3df2842 --- /dev/null +++ b/src/lockfile.ts @@ -0,0 +1,34 @@ +import * as lockfile from "lockfile"; +import { Util } from "./util"; + +interface IOptions { + wait?: number; + pollPeriod?: number; + stale?: number; + retries?: number; + retryWait?: number; +} + +export default { + Check, + Lock, + Unlock +}; + +export function Check( + filepath: string, + options: IOptions = {} +): Promise { + return Util.promisify(lockfile.check)(filepath, options); +} + +export function Lock( + filepath: string, + options: IOptions = {} +): Promise { + return Util.promisify(lockfile.lock)(filepath, options); +} + +export function Unlock(filepath: string): Promise { + return Util.promisify(lockfile.unlock)(filepath); +} diff --git a/src/models/cloudSettings.model.ts b/src/models/cloudSettings.model.ts new file mode 100644 index 00000000..f57a4195 --- /dev/null +++ b/src/models/cloudSettings.model.ts @@ -0,0 +1,6 @@ +import { Environment } from "../environmentPath"; + +export class CloudSettings { + public lastUpload: Date = null; + public extensionVersion: string = "v" + Environment.getVersion(); +} diff --git a/src/models/customConfig.model.ts b/src/models/customConfig.model.ts new file mode 100644 index 00000000..15203845 --- /dev/null +++ b/src/models/customConfig.model.ts @@ -0,0 +1,33 @@ +import { Environment } from "../environmentPath"; + +export class CustomConfig { + public ignoreUploadFiles: string[] = [ + "state.*", + "syncLocalSettings.json", + ".DS_Store", + "sync.lock", + "projects.json", + "projects_cache_vscode.json", + "projects_cache_git.json", + "projects_cache_svn.json", + "gpm_projects.json", + "gpm-recentItems.json" + ]; + public ignoreUploadFolders: string[] = ["workspaceStorage"]; + public ignoreExtensions: string[] = []; + public gistDescription: string = "Visual Studio Code Settings Sync Gist"; + public version: number = Environment.CURRENT_VERSION; + public token: string = ""; + public downloadPublicGist: boolean = false; + public supportedFileExtensions: string[] = ["json", "code-snippets"]; + public openTokenLink: boolean = true; + public disableUpdateMessage: boolean = false; + public lastUpload: Date = null; + public lastDownload: Date = null; + public githubEnterpriseUrl: string = null; + public askGistDescription: boolean = false; + public customFiles: { [key: string]: string } = {}; + public hostName: string = null; + public universalKeybindings: boolean = false; + public autoUploadDelay: number = 20; +} diff --git a/src/models/extensionConfig.model.ts b/src/models/extensionConfig.model.ts new file mode 100644 index 00000000..d74242c2 --- /dev/null +++ b/src/models/extensionConfig.model.ts @@ -0,0 +1,10 @@ +export class ExtensionConfig { + public gist = null; + public quietSync = false; + public removeExtensions = true; + public syncExtensions = true; + public autoDownload = false; + public autoUpload = false; + public forceDownload = false; + public forceUpload = false; +} diff --git a/src/models/language-pack.model.ts b/src/models/language-pack.model.ts new file mode 100644 index 00000000..f4571408 --- /dev/null +++ b/src/models/language-pack.model.ts @@ -0,0 +1,3 @@ +export interface ILanguagePack { + [key: string]: string; +} diff --git a/src/models/localConfig.model.ts b/src/models/localConfig.model.ts new file mode 100644 index 00000000..20a4fcbf --- /dev/null +++ b/src/models/localConfig.model.ts @@ -0,0 +1,10 @@ +import { CustomConfig } from "./customConfig.model"; +import { ExtensionConfig } from "./extensionConfig.model"; + +export class LocalConfig { + public publicGist: boolean = false; + public userName: string = null; + public name: string = null; + public extConfig = new ExtensionConfig(); + public customConfig = new CustomConfig(); +} diff --git a/src/models/settingType.model.ts b/src/models/settingType.model.ts new file mode 100644 index 00000000..638c640a --- /dev/null +++ b/src/models/settingType.model.ts @@ -0,0 +1,6 @@ +export enum UISettingType { + TextInput = "textinput", + NumberInput = "numberinput", + Checkbox = "checkbox", + TextArea = "textarea" +} diff --git a/src/models/state.model.ts b/src/models/state.model.ts new file mode 100644 index 00000000..30d3944a --- /dev/null +++ b/src/models/state.model.ts @@ -0,0 +1,10 @@ +import { ExtensionContext } from "vscode"; +import Commons from "../commons"; +import { Environment } from "../environmentPath"; + +export interface IExtensionState { + context?: ExtensionContext; + environment?: Environment; + commons?: Commons; + instanceID: string; +} diff --git a/src/models/webview.model.ts b/src/models/webview.model.ts new file mode 100644 index 00000000..09f8649e --- /dev/null +++ b/src/models/webview.model.ts @@ -0,0 +1,9 @@ +import { WebviewPanel } from "vscode"; + +export interface IWebview { + name: string; + htmlPath: string; + htmlContent?: string; + webview?: WebviewPanel; + replaceables: Array<{}>; +} diff --git a/src/pragmaUtil.ts b/src/pragmaUtil.ts new file mode 100644 index 00000000..1bd9938d --- /dev/null +++ b/src/pragmaUtil.ts @@ -0,0 +1,291 @@ +import { OsType } from "./enums"; +import { osTypeFromString, SUPPORTED_OS } from "./environmentPath"; +import localize from "./localize"; + +/** + * Comment/Uncomment lines if matches OS name or Hostname. + * Usage: @sync os=[OS name] host=[hostName] + * Notes: Hostname must be defined in sync.host setting. It could be used for parse any JSON valid string. + * @export + * @class PragmaUtil + */ +export default class PragmaUtil { + /** + * Process @sync pragma statements before file is saved. + * Comment lines that don't match with the user OS or host value. + * @static + * @param {string} newContent a valid JSON string + * @returns {string} + * @memberof PragmaUtil + */ + public static processBeforeWrite( + localContent: string, + newContent: string, + osType: OsType, + hostName: string + ): string { + const parsedLines: string[] = []; + const lines = newContent.split("\n"); + let osMatch: RegExpMatchArray; + let osFromPragma: string; + + let hostMatch: RegExpMatchArray; + let hostFromPragma: string; + + let envMatch: RegExpMatchArray; + let envFromPragma: string; + let currentLine: string = ""; + + for (let index = 0; index < lines.length; index++) { + let shouldComment = false; + currentLine = lines[index]; + if (this.PragmaRegExp.test(currentLine)) { + try { + // check OS pragma + osMatch = currentLine.match(/os=(\w+)/); + if (osMatch !== null) { + osFromPragma = osMatch[1].toLowerCase(); + + if (!SUPPORTED_OS.includes(osFromPragma)) { + continue; + } + if (osTypeFromString(osFromPragma) !== osType) { + shouldComment = true; + } + } + // check host pragma + hostMatch = currentLine.match(/host=(\S+)/); + if (hostMatch !== null) { + hostFromPragma = hostMatch[1]; + if ( + hostName === null || + hostName === "" || + hostFromPragma.toLowerCase() !== hostName.toLowerCase() + ) { + shouldComment = true; + } + } + + // check env pragma + envMatch = currentLine.match(/env=(\S+)/); + if (envMatch !== null) { + envFromPragma = envMatch[1]; + if (process.env[envFromPragma.toUpperCase()] === undefined) { + shouldComment = true; + } + } + parsedLines.push(currentLine); + index = this.checkNextLines( + lines, + parsedLines, + index, + false, + shouldComment + ); + } catch (e) { + console.error("Sync: Error processing pragmas ", e.message); + continue; + } + } else if (this.IgnorePragmaRegExp.test(currentLine)) { + index = this.checkNextLines(lines, parsedLines, index, true, false); + } else { + parsedLines.push(currentLine); + } + } + + let result = parsedLines.join("\n"); + const ignoredBlocks = this.getIgnoredBlocks(localContent); // get the settings that must prevail + if (ignoredBlocks) { + result = result.replace(/{\s*\n/, `{\n${ignoredBlocks}\n\n\n`); // 3 lines breaks to separate from other settings + } + // check is a valid JSON + + // remove comments and trailing comma + const uncommented = this.removeAllComments(result).replace(/,\s*\}/g, " }"); + try { + JSON.parse(uncommented); + } catch (e) { + console.error( + "Sync: Result content is not a valid JSON.", + e.message, + uncommented + ); + } + + return result; + } + + /** + * Remove @sync-ignore settings before upload. + * + * @static + * @param {string} fileContent + * @returns {string} + * @memberof PragmaUtil + */ + public static async processBeforeUpload( + fileContent: string + ): Promise { + const lines = fileContent.split("\n"); + let osMatch: RegExpMatchArray; + let osFromPragma: string; + + let hostMatch: RegExpMatchArray; + let hostFromPragma: string; + + let envMatch: RegExpMatchArray; + let envFromPragma: string; + + const parsedLines: string[] = []; + let currentLine = ""; + + for (let index = 0; index < lines.length; index++) { + currentLine = lines[index]; + + if (this.IgnorePragmaRegExp.test(currentLine)) { + index = this.checkNextLines(lines, parsedLines, index, true); + } else if (this.PragmaRegExp.test(currentLine)) { + // alert not supported OS + osMatch = currentLine.match(this.OSPragmaWhiteSpacesSupportRegExp); + if (osMatch !== null) { + osFromPragma = osMatch[1] || osMatch[2] || osMatch[3]; + + if (osFromPragma !== "" && /\s/.test(osFromPragma)) { + currentLine = currentLine.replace( + osFromPragma, + osFromPragma.trimLeft() + ); + } + + const trimmed = osFromPragma.toLowerCase().trim(); + if (!SUPPORTED_OS.includes(trimmed)) { + console.warn("Sync: Invalid OS", osFromPragma); + throw new Error( + localize( + "cmd.updateSettings.warning.OSNotSupported", + trimmed, + index + 1 + ) + ); + } + } + + hostMatch = currentLine.match(this.HostPragmaWhiteSpacesSupportRegExp); + if (hostMatch !== null) { + hostFromPragma = hostMatch[1] || hostMatch[2] || hostMatch[3]; + if (hostFromPragma !== "" && /\s/.test(hostFromPragma)) { + currentLine = currentLine.replace( + hostFromPragma, + hostFromPragma.trimLeft() + ); + } + } + + envMatch = currentLine.match(this.EnvPragmaWhiteSpacesSupportRegExp); + if (envMatch !== null) { + envFromPragma = envMatch[1] || envMatch[2] || envMatch[3]; + if (envFromPragma !== "" && /\s/.test(envFromPragma)) { + currentLine = currentLine.replace( + envFromPragma, + envFromPragma.trimLeft() + ); + } + } + + parsedLines.push(currentLine); + index = this.checkNextLines(lines, parsedLines, index, false, false); + } else { + parsedLines.push(currentLine); + } + } + return parsedLines.join("\n"); + } + + public static getIgnoredBlocks(content: string): string { + content = content.replace(/\@sync ignore/g, "@sync-ignore"); + const ignoredLines: string[] = []; + const lines = content.split("\n"); + let currentLine = ""; + for (let index = 0; index < lines.length; index++) { + currentLine = lines[index]; + if (this.IgnorePragmaRegExp.test(currentLine)) { + ignoredLines.push(currentLine); + index = this.checkNextLines( + lines, + ignoredLines, + index, + false, + false, + true + ); + } + } + return ignoredLines.join("\n"); + } + + public static removeAllComments(text: string): string { + return text.replace(/(? 0) { + currentLine = lines[++currentIndex]; + if (this.OpenBlockRegExp.test(currentLine)) { + ++openBlocks; + } else if (this.CloseBlockRegExp.test(currentLine)) { + --openBlocks; + if (checkTrailingComma && !currentLine.trim().endsWith(",")) { + // we add a coma to avoid parse error when we paste the ignored settings at the + // beginning of the file + currentLine = currentLine.trimRight() + ","; + } + } + if (!shouldIgnore) { + parsedLines.push(this.toggleComments(currentLine, shouldComment)); + } + } + + return currentIndex; + } +} diff --git a/src/service/autoUpload.service.ts b/src/service/autoUpload.service.ts new file mode 100644 index 00000000..ba97963e --- /dev/null +++ b/src/service/autoUpload.service.ts @@ -0,0 +1,99 @@ +import * as vscode from "vscode"; +import { watch } from "vscode-chokidar"; +import localize from "../localize"; +import lockfile from "../lockfile"; +import { CustomConfig } from "../models/customConfig.model"; +import { state } from "../state"; +import { Util } from "../util"; +import { FileService } from "./file.service"; + +export class AutoUploadService { + public static GetIgnoredItems(customSettings: CustomConfig) { + return [ + ...customSettings.ignoreUploadFolders.map(folder => `**/${folder}/**`), + ...customSettings.ignoreUploadFiles.map(file => `**/${file}`) + ]; + } + + public watching = false; + + private watcher = watch(state.environment.USER_FOLDER, { + depth: 2, + ignored: this.ignored + }); + + constructor(private ignored: string[]) { + vscode.extensions.onDidChange(async () => { + if (this.watching && vscode.window.state.focused) { + console.log("Sync: Extensions changed"); + if (await lockfile.Check(state.environment.FILE_SYNC_LOCK)) { + return; + } else { + await lockfile.Lock(state.environment.FILE_SYNC_LOCK); + } + const customConfig = await state.commons.GetCustomSettings(); + if (!customConfig.downloadPublicGist) { + await this.InitiateAutoUpload(); + } + await lockfile.Unlock(state.environment.FILE_SYNC_LOCK); + return; + } + }); + } + + public async StartWatching() { + this.StopWatching(); + + this.watching = true; + + this.watcher.addListener("change", async (path: string) => { + if (this.watching && vscode.window.state.focused) { + console.log(`Sync: ${FileService.ExtractFileName(path)} changed`); + if (await lockfile.Check(state.environment.FILE_SYNC_LOCK)) { + return; + } else { + await lockfile.Lock(state.environment.FILE_SYNC_LOCK); + } + + const customConfig = await state.commons.GetCustomSettings(); + if (customConfig) { + const fileType: string = path + .substring(path.lastIndexOf("."), path.length) + .slice(1); + if ( + customConfig.supportedFileExtensions.includes(fileType) && + !customConfig.downloadPublicGist + ) { + await this.InitiateAutoUpload(); + } + } + await lockfile.Unlock(state.environment.FILE_SYNC_LOCK); + return; + } + }); + } + + public StopWatching() { + if (this.watcher) { + this.watcher.removeAllListeners(); + } + this.watching = false; + } + + private async InitiateAutoUpload() { + const customSettings = await state.commons.GetCustomSettings(); + + vscode.window.setStatusBarMessage("").dispose(); + vscode.window.setStatusBarMessage( + localize("common.info.initAutoUpload").replace( + "{0}", + customSettings.autoUploadDelay + ), + 5000 + ); + + await Util.Sleep(customSettings.autoUploadDelay * 1000); + + vscode.commands.executeCommand("extension.updateSettings", "forceUpdate"); + } +} diff --git a/src/service/file.service.ts b/src/service/file.service.ts new file mode 100644 index 00000000..81bbe9a4 --- /dev/null +++ b/src/service/file.service.ts @@ -0,0 +1,240 @@ +"use strict"; + +import * as fs from "fs-extra"; +import * as path from "path"; +import * as recursiveRead from "recursive-readdir"; +import { CustomConfig } from "../models/customConfig.model"; + +export class File { + constructor( + public fileName: string, + public content: string, + public filePath: string, + public gistName: string + ) {} +} +export class FileService { + public static CUSTOMIZED_SYNC_PREFIX = "|customized_sync|"; + + public static async ReadFile(filePath: string): Promise { + try { + const data = await fs.readFile(filePath, { encoding: "utf8" }); + return data; + } catch (err) { + console.error(err); + throw err; + } + } + + public static async IsDirectory(filepath: string): Promise { + try { + const stat = await fs.lstat(filepath); + return stat.isDirectory(); + } catch (err) { + return false; + } + } + + public static async GetFile( + filePath: string, + fileName: string + ): Promise { + const fileExists: boolean = await FileService.FileExists(filePath); + + if (!fileExists) { + return null; + } + + const content = await FileService.ReadFile(filePath); + + if (content === null) { + return null; + } + + const pathFromUser: string = filePath.substring( + filePath.lastIndexOf("User") + 5, + filePath.length + ); + + const arr: string[] = pathFromUser.indexOf("/") + ? pathFromUser.split("/") + : pathFromUser.split(path.sep); + + let gistName: string = ""; + + arr.forEach((element, index) => { + if (index < arr.length - 1) { + gistName += element + "|"; + } else { + gistName += element; + } + }); + + const file: File = new File(fileName, content, filePath, gistName); + return file; + } + + public static async WriteFile( + filePath: string, + data: string + ): Promise { + if (!data) { + console.error( + new Error( + "Unable to write file. FilePath :" + filePath + " Data :" + data + ) + ); + return false; + } + try { + await fs.writeFile(filePath, data); + return true; + } catch (err) { + console.error(err); + return false; + } + } + + public static async ListFiles( + directory: string, + customSettings: CustomConfig + ): Promise { + function folderMatcher(file: string, stats: fs.Stats) { + if (stats.isDirectory()) { + return customSettings.ignoreUploadFolders.some(fold => { + return file.split(path.sep).includes(fold); + }); + } + return false; + } + function fileExtensionMatcher(file: string, stats: fs.Stats) { + if (stats.isDirectory()) { + return false; + } + const ext = path.extname(file).slice(1); + if (!customSettings.supportedFileExtensions.includes(ext)) { + return true; + } + return false; + } + const files = await recursiveRead(directory, [ + ...customSettings.ignoreUploadFiles, + folderMatcher, + fileExtensionMatcher + ]); + return Promise.all( + files.map(file => { + return FileService.GetFile(file, path.basename(file)); + }) + ); + } + + public static async CreateDirTree( + userFolder: string, + fileName: string + ): Promise { + let fullPath: string = userFolder; + let result: string; + + let paths: string[] = null; + if (fileName.indexOf("|") > -1) { + paths = fileName.split("|"); + } else if (fileName.indexOf("//") > -1) { + paths = fileName.split("//"); + } else if (fileName.indexOf("\\") > -1) { + paths = fileName.split("\\"); + } + + if (paths != null) { + for (let i = 0; i < paths.length - 1; i++) { + const element = paths[i]; + fullPath += element + path.sep; + await FileService.CreateDirectory(fullPath); + } + + result = fullPath + paths[paths.length - 1]; + return result; + } else { + result = fullPath + fileName; + + return result; + } + } + + public static async DeleteFile(filePath: string): Promise { + try { + const stat: boolean = await FileService.FileExists(filePath); + if (stat) { + await fs.unlink(filePath); + } + return true; + } catch (err) { + console.error("Unable to delete file. File Path is :" + filePath); + return false; + } + } + + public static async FileExists(filePath: string): Promise { + try { + await fs.access(filePath, fs.constants.F_OK); + return true; + } catch (err) { + return false; + } + } + + public static async CreateDirectory(name: string): Promise { + try { + await fs.mkdir(name); + return true; + } catch (err) { + if (err.code === "EEXIST") { + return false; + } + throw err; + } + } + + public static async GetCustomFile( + filePath: string, + fileName: string + ): Promise { + const fileExists: boolean = await FileService.FileExists(filePath); + + if (!fileExists) { + return null; + } + + const content = await FileService.ReadFile(filePath); + + if (content === null) { + return null; + } + + // for identifing Customized Sync file + const gistName: string = FileService.CUSTOMIZED_SYNC_PREFIX + fileName; + + const file: File = new File(fileName, content, filePath, gistName); + return file; + } + + public static async CreateCustomDirTree(filePath: string): Promise { + const dir = path.dirname(filePath); + const fileExists = await FileService.FileExists(dir); + + if (!fileExists) { + // mkdir recursively + await fs.mkdirs(dir); + } + + return filePath; + } + + public static ExtractFileName(fullPath: string): string { + return path.basename(fullPath); + } + + public static ConcatPath(...filePaths: string[]): string { + return filePaths.join(path.sep); + } +} diff --git a/src/service/github.oauth.service.ts b/src/service/github.oauth.service.ts new file mode 100644 index 00000000..0c85e90e --- /dev/null +++ b/src/service/github.oauth.service.ts @@ -0,0 +1,136 @@ +import * as express from "express"; +import { Server } from "http"; +import fetch from "node-fetch"; +import { URL, URLSearchParams } from "url"; +import Commons from "../commons"; +import { state } from "../state"; + +export class GitHubOAuthService { + public app: express.Express; + public server: Server; + + constructor(public port: number) { + this.app = express(); + this.app.use(express.json(), express.urlencoded({ extended: false })); + } + + public async StartProcess(cmd?: string) { + const customSettings = await state.commons.GetCustomSettings(); + const host = customSettings.githubEnterpriseUrl + ? new URL(customSettings.githubEnterpriseUrl) + : new URL("https://github.com"); + + this.server = this.app.listen(this.port); + this.app.get("/callback", async (req: any, res: any) => { + try { + const params = new URLSearchParams( + await (await this.getToken(req.params("code"), host)).text() + ); + + res.send(` + + + + + + + + +

Success! You may now close this tab.

+ + + + `); + this.server.close(); + + const token = params.get("access_token"); + this.saveToken(token); + + const user = await this.getUser(token, host); + + const gists: any = await this.getGists(token, user, host); + + const gistViewList: any[] = gists.map((m) => { + return { + id: m.id, + description: m.description, + updated_at: m.updated_at, + }; + }); + + state.commons.webviewService.OpenGistSelectionpage(gistViewList, cmd); + } catch (err) { + const error = new Error(err); + Commons.LogException(error, state.commons.ERROR_MESSAGE, true); + } + }); + } + + public getToken(code: string, host: URL) { + const params = new URLSearchParams(); + params.append("client_id", "cfd96460d8b110e2351b"); + params.append("client_secret", "ed46bd3a0f736e0da57308e86ca5fa3cf8688582"); + params.append("code", code); + + const promise = fetch(`https://${host.hostname}/login/oauth/access_token`, { + method: "POST", + body: params, + }); + + promise.catch((err) => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + return promise; + } + + public async getGists(token: string, user: string, host: URL) { + const promise = fetch(`https://api.${host.hostname}/users/${user}/gists`, { + method: "GET", + headers: { Authorization: `token ${token}` }, + }); + + promise.catch((err) => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + const res = await promise; + const gists = await res.json(); + return gists; + } + + public async saveToken(token: string) { + const currentSettings = await state.commons.GetCustomSettings(); + currentSettings.token = token; + state.commons.SetCustomSettings(currentSettings); + } + + public async getUser(token: string, host: URL) { + const promise = fetch(`https://api.${host.hostname}/user`, { + method: "GET", + headers: { Authorization: `token ${token}` }, + }); + + promise.catch((err) => { + Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); + }); + + const res = await promise; + const json: any = await res.json(); + return json?.login; + } +} diff --git a/src/service/github.service.ts b/src/service/github.service.ts new file mode 100644 index 00000000..aef71c12 --- /dev/null +++ b/src/service/github.service.ts @@ -0,0 +1,203 @@ +"use strict"; + +import * as GitHubApi from "@octokit/rest"; +import * as HttpsProxyAgent from "https-proxy-agent"; +import * as vscode from "vscode"; +import Commons from "../commons"; +import { CloudSettings } from "../models/cloudSettings.model"; +import { state } from "../state"; +import { File } from "./file.service"; + +interface IEnv { + [key: string]: string | undefined; + http_proxy: string; + HTTP_PROXY: string; +} + +interface IFixGistResponse extends Omit { + files: any | GitHubApi.GistsGetResponseFiles; +} + +export class GitHubService { + public userName: string = null; + public name: string = null; + private github: GitHubApi = null; + private GIST_JSON_EMPTY: any = { + description: "Visual Studio Code Sync Settings Gist", + public: false, + files: { + "settings.json": { + content: "// Empty" + }, + "launch.json": { + content: "// Empty" + }, + "keybindings.json": { + content: "// Empty" + }, + "extensions.json": { + content: "// Empty" + }, + "locale.json": { + content: "// Empty" + }, + "keybindingsMac.json": { + content: "// Empty" + }, + cloudSettings: { + content: "// Empty" + } + } + }; + + constructor(userToken: string, basePath: string) { + const githubApiConfig: GitHubApi.Options = {}; + + const proxyURL: string = + vscode.workspace.getConfiguration("http").get("proxy") || + (process.env as IEnv).http_proxy || + (process.env as IEnv).HTTP_PROXY; + if (basePath) { + githubApiConfig.baseUrl = basePath; + } + + if (proxyURL) { + githubApiConfig.agent = new HttpsProxyAgent(proxyURL); + } + + if (userToken !== null && userToken !== "") { + githubApiConfig.auth = `token ${userToken}`; + } + try { + this.github = new GitHubApi(githubApiConfig); + } catch (err) { + console.error(err); + } + if (userToken !== null && userToken !== "") { + this.github.users + .getAuthenticated({}) + .then(res => { + this.userName = res.data.login; + this.name = res.data.name; + console.log( + "Sync : Connected with user : " + "'" + this.userName + "'" + ); + }) + .catch(err => { + console.error(err); + }); + } + } + + public AddFile(list: File[], GIST_JSON_B: any) { + for (const file of list) { + if (file.content !== "") { + GIST_JSON_B.files[file.gistName] = {}; + GIST_JSON_B.files[file.gistName].content = file.content; + } + } + return GIST_JSON_B; + } + + public async CreateEmptyGIST( + publicGist: boolean, + gistDescription: string + ): Promise { + if (publicGist) { + this.GIST_JSON_EMPTY.public = true; + } else { + this.GIST_JSON_EMPTY.public = false; + } + if (gistDescription !== null && gistDescription !== "") { + this.GIST_JSON_EMPTY.description = gistDescription; + } + + try { + const res = await this.github.gists.create(this.GIST_JSON_EMPTY); + if (res.data && res.data.id) { + return res.data.id.toString(); + } else { + console.error("ID is null"); + console.log("Sync : " + "Response from GitHub is: "); + console.log(res); + } + } catch (err) { + console.error(err); + throw err; + } + } + + // This should return GitHubApi.Response but Types are wrong + public async ReadGist( + GIST: string + ): Promise> { + const promise = this.github.gists.get({ gist_id: GIST }); + const res = await promise.catch(err => { + if (String(err).includes("HttpError: Not Found")) { + return Commons.LogException(err, "Sync: Invalid Gist ID", true); + } + Commons.LogException(err, state.commons.ERROR_MESSAGE, true); + }); + if (res) { + return res; + } + } + + public async IsGistNewer( + GIST: string, + localLastDownload: Date + ): Promise { + const gist = await this.ReadGist(GIST); + if (!gist) { + return; + } + let gistCloudSetting: CloudSettings = null; + try { + gistCloudSetting = JSON.parse(gist.data.files.cloudSettings.content); + const gistLastUpload = new Date(gistCloudSetting.lastUpload); + if (!localLastDownload) { + return false; + } + return gistLastUpload > new Date(localLastDownload); + } catch (err) { + return false; + } + } + + public UpdateGIST(gistObject: any, files: File[]): any { + const allFiles: string[] = Object.keys(gistObject.data.files); + for (const fileName of allFiles) { + let exists = false; + + for (const settingFile of files) { + if (settingFile.gistName === fileName) { + exists = true; + } + } + + if (!exists && !fileName.startsWith("keybindings")) { + gistObject.data.files[fileName] = null; + } + } + + gistObject.data = this.AddFile(files, gistObject.data); + return gistObject; + } + + public async SaveGIST(gistObject: any): Promise { + gistObject.gist_id = gistObject.id; + // tslint:disable-next-line:comment-format + //TODO : use github.gists.update when issue is fixed. + const promise = this.github.request("PATCH /gists/:gist_id", gistObject); + const res = await promise.catch(err => { + if (String(err).includes("HttpError: Not Found")) { + return Commons.LogException(err, "Sync: Invalid Gist ID", true); + } + Commons.LogException(err, state.commons.ERROR_MESSAGE, true); + }); + + if (res) { + return true; + } + } +} diff --git a/src/service/plugin.service.ts b/src/service/plugin.service.ts new file mode 100644 index 00000000..1b06c112 --- /dev/null +++ b/src/service/plugin.service.ts @@ -0,0 +1,243 @@ +"use strict"; +import * as vscode from "vscode"; + +export class ExtensionInformation { + public static fromJSON(text: string) { + try { + // TODO: JSON.parse may throw error + // Throw custom error should be more friendly + const obj = JSON.parse(text); + const meta = new ExtensionMetadata( + obj.meta.galleryApiUrl, + obj.meta.id, + obj.meta.downloadUrl, + obj.meta.publisherId, + obj.meta.publisherDisplayName, + obj.meta.date + ); + const item = new ExtensionInformation(); + item.metadata = meta; + item.name = obj.name; + item.publisher = obj.publisher; + item.version = obj.version; + return item; + } catch (err) { + throw new Error(err); + } + } + + public static fromJSONList(text: string) { + const extList: ExtensionInformation[] = []; + try { + // TODO: JSON.parse may throw error + // Throw custom error should be more friendly + const list = JSON.parse(text); + list.forEach(obj => { + const meta = new ExtensionMetadata( + obj.metadata.galleryApiUrl, + obj.metadata.id, + obj.metadata.downloadUrl, + obj.metadata.publisherId, + obj.metadata.publisherDisplayName, + obj.metadata.date + ); + const item = new ExtensionInformation(); + item.metadata = meta; + item.name = obj.name; + item.publisher = obj.publisher; + item.version = obj.version; + + if (item.name !== "code-settings-sync") { + extList.push(item); + } + }); + } catch (err) { + throw new Error(err); + } + + return extList; + } + + public metadata: ExtensionMetadata; + public name: string; + public version: string; + public publisher: string; +} + +export class ExtensionMetadata { + constructor( + public galleryApiUrl: string, + public id: string, + public downloadUrl: string, + public publisherId: string, + public publisherDisplayName: string, + public date: string + ) {} +} + +export class PluginService { + public static GetMissingExtensions( + remoteExt: string, + ignoredExtensions: string[] + ) { + const remoteList = ExtensionInformation.fromJSONList(remoteExt); + const localList = this.CreateExtensionList(); + + return remoteList.filter( + ext => + !ignoredExtensions.includes(ext.name) && + !localList.map(e => e.name).includes(ext.name) + ); + } + + public static GetDeletedExtensions( + remoteExtensions: ExtensionInformation[], + ignoredExtensions: string[] + ) { + const localExtensions = this.CreateExtensionList(); + + // for (var i = 0; i < remoteList.length; i++) { + + // var ext = remoteList[i]; + // var found: boolean = false; + + // for (var j = 0; j < localList.length; j++) { + // var localExt = localList[j]; + // if (ext.name == localExt.name) { + // found = true; + // break; + // } + // } + // if (!found) { + // deletedList.push(localExt); + // } + + // } + + return localExtensions.filter( + ext => + ext.name !== "code-settings-sync" && + !remoteExtensions.map(e => e.name).includes(ext.name) && + !ignoredExtensions.includes(ext.name) + ); + } + + public static CreateExtensionList() { + return vscode.extensions.all + .filter(ext => !ext.packageJSON.isBuiltin) + .map(ext => { + const meta = ext.packageJSON.__metadata || { + id: ext.packageJSON.uuid, + publisherId: ext.id, + publisherDisplayName: ext.packageJSON.publisher + }; + const data = new ExtensionMetadata( + meta.galleryApiUrl, + meta.id, + meta.downloadUrl, + meta.publisherId, + meta.publisherDisplayName, + meta.date + ); + const info = new ExtensionInformation(); + info.metadata = data; + info.name = ext.packageJSON.name; + info.publisher = ext.packageJSON.publisher; + info.version = ext.packageJSON.version; + return info; + }); + } + + public static async DeleteExtension( + extension: ExtensionInformation + ): Promise { + try { + await vscode.commands.executeCommand( + "workbench.extensions.uninstallExtension", + `${extension.publisher}.${extension.name}` + ); + return true; + } catch (err) { + throw new Error(err); + } + } + + public static async DeleteExtensions( + extensionsJson: string, + ignoredExtensions: string[] + ): Promise { + const remoteExtensions = ExtensionInformation.fromJSONList(extensionsJson); + const toDelete = PluginService.GetDeletedExtensions( + remoteExtensions, + ignoredExtensions + ); + + return Promise.all( + toDelete.map(async selectedExtension => { + try { + await PluginService.DeleteExtension(selectedExtension); + return selectedExtension; + } catch (err) { + throw new Error( + `Sync : Unable to delete extension ${selectedExtension.name} ${selectedExtension.version}: ${err}` + ); + } + }) + ); + } + + public static async InstallExtensions( + extensions: string, + ignoredExtensions: string[], + notificationCallBack: (...data: any[]) => void + ): Promise { + let addedExtensions: ExtensionInformation[] = []; + const missingExtensions = PluginService.GetMissingExtensions( + extensions, + ignoredExtensions + ); + if (missingExtensions.length === 0) { + notificationCallBack("Sync : No Extensions needs to be installed."); + return []; + } + addedExtensions = await PluginService.InstallWithAPI( + missingExtensions, + notificationCallBack + ); + return addedExtensions; + } + + public static async InstallWithAPI( + missingExtensions: ExtensionInformation[], + notificationCallBack: (...data: any[]) => void + ): Promise { + const addedExtensions: ExtensionInformation[] = []; + const missingExtensionsCount = missingExtensions.length; + notificationCallBack("TOTAL EXTENSIONS : " + missingExtensionsCount); + notificationCallBack(""); + notificationCallBack(""); + for (const ext of missingExtensions) { + const name = ext.publisher + "." + ext.name; + try { + notificationCallBack(""); + notificationCallBack(`[x] - EXTENSION: ${ext.name} - INSTALLING`); + await vscode.commands.executeCommand( + "workbench.extensions.installExtension", + name + ); + notificationCallBack(""); + notificationCallBack(`[x] - EXTENSION: ${ext.name} INSTALLED.`); + notificationCallBack( + ` ${missingExtensions.indexOf(ext) + + 1} OF ${missingExtensionsCount} INSTALLED`, + true + ); + notificationCallBack(""); + addedExtensions.push(ext); + } catch (err) { + throw new Error(err); + } + } + return addedExtensions; + } +} diff --git a/src/service/webview.service.ts b/src/service/webview.service.ts new file mode 100644 index 00000000..8bad69c1 --- /dev/null +++ b/src/service/webview.service.ts @@ -0,0 +1,479 @@ +import { readFileSync } from "fs-extra"; +import { has, set } from "lodash"; +import { URL } from "url"; +import * as vscode from "vscode"; +import Commons from "../commons"; +import localize from "../localize"; +import { CustomConfig } from "../models/customConfig.model"; +import { ExtensionConfig } from "../models/extensionConfig.model"; +import { UISettingType } from "../models/settingType.model"; +import { IWebview } from "../models/webview.model"; +import { state } from "../state"; +import { GitHubOAuthService } from "./github.oauth.service"; + +export class WebviewService { + private globalSettings = [ + { + name: localize("ext.globalConfig.token.name"), + placeholder: localize("ext.globalConfig.token.placeholder"), + type: UISettingType.TextInput, + correspondingSetting: "token" + }, + { + name: localize("ext.globalConfig.githubEnterpriseUrl.name"), + placeholder: localize("ext.globalConfig.githubEnterpriseUrl.placeholder"), + type: UISettingType.TextInput, + correspondingSetting: "githubEnterpriseUrl" + }, + + { + name: localize("ext.globalConfig.ignoreUploadFolders.name"), + placeholder: localize("ext.globalConfig.ignoreUploadFolders.placeholder"), + type: UISettingType.TextArea, + correspondingSetting: "ignoreUploadFolders" + }, + { + name: localize("ext.globalConfig.ignoreExtensions.name"), + placeholder: localize("ext.globalConfig.ignoreExtensions.placeholder"), + type: UISettingType.TextArea, + correspondingSetting: "ignoreExtensions" + }, + { + name: localize("ext.globalConfig.hostName.name"), + placeholder: localize("ext.globalConfig.hostName.placeholder"), + type: UISettingType.TextInput, + correspondingSetting: "hostName" + }, + { + name: localize("ext.globalConfig.ignoreUploadFiles.name"), + placeholder: localize("ext.globalConfig.ignoreUploadFiles.placeholder"), + type: UISettingType.TextArea, + correspondingSetting: "ignoreUploadFiles" + }, + { + name: localize("ext.globalConfig.supportedFileExtensions.name"), + placeholder: localize( + "ext.globalConfig.supportedFileExtensions.placeholder" + ), + type: UISettingType.TextArea, + correspondingSetting: "supportedFileExtensions" + }, + { + name: localize("ext.globalConfig.gistDescription.name"), + placeholder: localize("ext.globalConfig.gistDescription.placeholder"), + type: UISettingType.TextInput, + correspondingSetting: "gistDescription" + }, + { + name: localize("ext.globalConfig.autoUploadDelay.name"), + placeholder: localize("ext.globalConfig.autoUploadDelay.placeholder"), + type: UISettingType.NumberInput, + correspondingSetting: "autoUploadDelay" + }, + { + name: localize("ext.globalConfig.askGistDescription.name"), + placeholder: "", + type: UISettingType.Checkbox, + correspondingSetting: "askGistDescription" + }, + { + name: localize("ext.globalConfig.downloadPublicGist.name"), + placeholder: "", + type: UISettingType.Checkbox, + correspondingSetting: "downloadPublicGist" + }, + { + name: localize("ext.globalConfig.openTokenLink.name"), + placeholder: "", + type: UISettingType.Checkbox, + correspondingSetting: "openTokenLink" + } + ]; + + private environmentSettings = [ + { + name: localize("ext.config.gist.name"), + placeholder: localize("ext.config.gist.placeholder"), + type: UISettingType.TextInput, + correspondingSetting: "gist", + tooltip: localize("ext.config.gist") + }, + { + name: localize("ext.config.autoDownload.name"), + placeholder: "", + type: UISettingType.Checkbox, + correspondingSetting: "autoDownload", + tooltip: localize("ext.config.autoDownload") + }, + { + name: localize("ext.config.autoUpload.name"), + placeholder: "", + type: UISettingType.Checkbox, + correspondingSetting: "autoUpload", + tooltip: localize("ext.config.autoUpload") + }, + { + name: localize("ext.config.forceDownload.name"), + placeholder: "", + type: UISettingType.Checkbox, + correspondingSetting: "forceDownload", + tooltip: localize("ext.config.forceDownload") + }, + { + name: localize("ext.config.forceUpload.name"), + placeholder: "", + type: UISettingType.Checkbox, + correspondingSetting: "forceUpload", + tooltip: localize("ext.config.forceUpload") + }, + { + name: localize("ext.config.quietSync.name"), + placeholder: "", + type: UISettingType.Checkbox, + correspondingSetting: "quietSync", + tooltip: localize("ext.config.quietSync") + }, + { + name: localize("ext.config.removeExtensions.name"), + placeholder: "", + type: UISettingType.Checkbox, + correspondingSetting: "removeExtensions", + tooltip: localize("ext.config.removeExtensions") + }, + { + name: localize("ext.config.syncExtensions.name"), + placeholder: "", + type: UISettingType.Checkbox, + correspondingSetting: "syncExtensions", + tooltip: localize("ext.config.syncExtensions") + } + ]; + + private webviews: IWebview[] = [ + { + name: "landing-page", + htmlPath: "landing-page.html", + replaceables: [ + { + find: "@RELEASE_NOTES", + replace: "releaseNotes" + }, + { + find: "@CHECKED", + replace: "checked" + } + ] + }, + { + name: "settings", + htmlPath: "settings.html", + replaceables: [ + { + find: "@GLOBAL_DATA", + replace: "customSettings" + }, + { + find: "@ENV_DATA", + replace: "extSettings" + }, + { + find: "@GLOBAL_MAP", + replace: this.globalSettings + }, + { + find: "@ENV_MAP", + replace: this.environmentSettings + } + ] + }, + { + name: "gist-selection", + htmlPath: "gist-selection.html", + replaceables: [ + { + find: "@GISTS", + replace: "gists" + }, + { + find: "@SKIP", + replace: "skip" + } + ] + } + ]; + + constructor() { + this.webviews = this.webviews.map(view => { + return { + ...view, + htmlContent: readFileSync( + `${state.context.extensionPath}/ui/${view.name}/${view.htmlPath}`, + "utf-8" + ) + }; + }); + } + + public OpenSettingsPage( + customSettings: CustomConfig, + extSettings: ExtensionConfig + ): vscode.WebviewPanel { + const webview = this.webviews[1]; + const content: string = this.GenerateContent({ + content: webview.htmlContent, + items: webview.replaceables, + customSettings, + extSettings + }); + if (webview.webview) { + webview.webview.webview.html = content; + webview.webview.reveal(); + return webview.webview; + } + const settingsPanel = vscode.window.createWebviewPanel( + "syncSettings", + "Sync Settings", + vscode.ViewColumn.One, + { + retainContextWhenHidden: true, + enableScripts: true + } + ); + settingsPanel.webview.html = content; + settingsPanel.webview.onDidReceiveMessage(async message => { + if (message === "openGist") { + const [customConfig, extConfig] = await Promise.all([ + state.commons.GetCustomSettings(), + state.commons.GetSettings() + ]); + const host = customConfig.githubEnterpriseUrl + ? new URL(customConfig.githubEnterpriseUrl) + : new URL("https://github.com"); + const username = await new GitHubOAuthService(0).getUser( + customConfig.token, + host + ); + if (!username) { + return Commons.LogException( + null, + "Sync: Invalid Access Token.", + true + ); + } + vscode.env.openExternal( + vscode.Uri.parse( + `https://gist.${host.hostname}/${username}/${extConfig.gist}` + ) + ); + return; + } + this.ReceiveSettingChange(message, customSettings, extSettings); + }); + webview.webview = settingsPanel; + settingsPanel.onDidDispose(() => (webview.webview = null)); + return settingsPanel; + } + + public UpdateSettingsPage( + customSettings: CustomConfig, + extSettings: ExtensionConfig + ) { + const webview = this.webviews[1]; + if (webview.webview) { + webview.webview.webview.html = this.GenerateContent({ + content: webview.htmlContent, + items: webview.replaceables, + customSettings, + extSettings + }); + } + } + + public ReceiveSettingChange( + message: { + command: string; + text: string; + type: string; + }, + customSettings: CustomConfig, + extSettings: ExtensionConfig + ) { + let value: any = message.text; + if (message.text === "true" || message.text === "false") { + value = message.text === "true"; + } + if (message.type === "global") { + if (has(customSettings, message.command)) { + set(customSettings, message.command, value); + state.commons.SetCustomSettings(customSettings); + } + } else { + extSettings[message.command] = value; + state.commons.SaveSettings(extSettings); + } + } + + public IsLandingPageEnabled(): boolean { + return !state.context.globalState.get( + "landingPage.dontShowThisAgain" + ); + } + + public OpenLandingPage(cmd?: string) { + const webview = this.webviews[0]; + const releaseNotes = require("../../release-notes.json"); + const content: string = this.GenerateContent({ + content: webview.htmlContent, + items: webview.replaceables, + releaseNotes, + checked: this.IsLandingPageEnabled() + }); + if (webview.webview) { + webview.webview.webview.html = content; + webview.webview.reveal(); + return webview.webview; + } + const landingPanel = vscode.window.createWebviewPanel( + "landingPage", + "Welcome to Settings Sync", + vscode.ViewColumn.One, + { + retainContextWhenHidden: true, + enableScripts: true + } + ); + landingPanel.webview.onDidReceiveMessage(async message => { + switch (message.command) { + case "loginWithGitHub": + new GitHubOAuthService(54321).StartProcess(cmd); + const customSettings = await state.commons.GetCustomSettings(); + const host = customSettings.githubEnterpriseUrl + ? new URL(customSettings.githubEnterpriseUrl) + : new URL("https://github.com"); + vscode.commands.executeCommand( + "vscode.open", + vscode.Uri.parse( + `https://${host.hostname}/login/oauth/authorize?scope=gist%20read:user&client_id=cfd96460d8b110e2351b&redirect_uri=http://localhost:54321/callback` + ) + ); + break; + case "editConfiguration": + this.OpenSettingsPage( + await state.commons.GetCustomSettings(), + await state.commons.GetSettings() + ); + break; + case "downloadPublicGist": + const [extConfig, customConfig] = await Promise.all([ + state.commons.GetSettings(), + state.commons.GetCustomSettings() + ]); + const publicGist = await vscode.window.showInputBox({ + placeHolder: localize("common.placeholder.enterGistId"), + ignoreFocusOut: true + }); + if (!publicGist) { + break; + } + await state.commons.SetCustomSettings({ + ...customConfig, + downloadPublicGist: true + }); + await state.commons.SaveSettings({ + ...extConfig, + gist: publicGist + }); + vscode.window.showInformationMessage( + localize("cmd.otherOptions.warning.tokenNotRequire") + ); + vscode.commands.executeCommand("extension.downloadSettings"); + break; + case "dontShowThisAgain": + await state.context.globalState.update( + "landingPage.dontShowThisAgain", + message.data + ); + break; + } + }); + landingPanel.webview.html = content; + webview.webview = landingPanel; + landingPanel.onDidDispose(() => (webview.webview = null)); + return landingPanel; + } + + public OpenGistSelectionpage(gists: any, cmd?: string) { + const webview = this.webviews[2]; + const content: string = this.GenerateContent({ + content: webview.htmlContent, + items: webview.replaceables, + gists, + skip: + cmd !== "extension.downloadSettings" + ? `Skip (new one will be created upon first upload)` + : "" + }); + if (webview.webview) { + webview.webview.webview.html = content; + webview.webview.reveal(); + return webview.webview; + } + const gistSelectionPanel = vscode.window.createWebviewPanel( + "selectGist", + "Select Your Existing Gist", + vscode.ViewColumn.One, + { + retainContextWhenHidden: true, + enableScripts: true + } + ); + gistSelectionPanel.webview.html = content; + gistSelectionPanel.webview.onDidReceiveMessage(async message => { + if (!message.close) { + const extSettings = await state.commons.GetSettings(); + extSettings.gist = message.id; + state.commons.SaveSettings(extSettings); + } else { + gistSelectionPanel.dispose(); + } + }); + webview.webview = gistSelectionPanel; + gistSelectionPanel.onDidDispose(() => { + webview.webview = null; + if (cmd) { + vscode.commands.executeCommand(cmd); + } + }); + return gistSelectionPanel; + } + + private GenerateContent(options: any) { + const toReplace: Array<{}> = []; + options.items.forEach(option => { + if (typeof option.replace === "string") { + toReplace.push({ + ...option, + replace: JSON.stringify(options[option.replace]) + }); + } else { + toReplace.push({ + find: option.find, + replace: JSON.stringify(option.replace) + }); + } + }); + return toReplace + .reduce( + (acc, cur: any) => acc.replace(new RegExp(cur.find, "g"), cur.replace), + options.content + ) + .replace( + new RegExp("@PWD", "g"), + vscode.Uri.file(state.context.extensionPath) + .with({ + scheme: "vscode-resource" + }) + .toString() + ); + } +} diff --git a/src/state.ts b/src/state.ts new file mode 100644 index 00000000..a51155cf --- /dev/null +++ b/src/state.ts @@ -0,0 +1,5 @@ +import { IExtensionState } from "./models/state.model"; + +export const state: IExtensionState = { + instanceID: Math.random().toString() +}; diff --git a/src/sync.ts b/src/sync.ts new file mode 100644 index 00000000..3e926481 --- /dev/null +++ b/src/sync.ts @@ -0,0 +1,1145 @@ +import * as fs from "fs-extra"; +import * as vscode from "vscode"; + +import Commons from "./commons"; +import { OsType } from "./enums"; +import localize from "./localize"; +import * as lockfile from "./lockfile"; +import { CloudSettings } from "./models/cloudSettings.model"; +import { CustomConfig } from "./models/customConfig.model"; +import { ExtensionConfig } from "./models/extensionConfig.model"; +import { LocalConfig } from "./models/localConfig.model"; +import PragmaUtil from "./pragmaUtil"; +import { File, FileService } from "./service/file.service"; +import { GitHubService } from "./service/github.service"; +import { ExtensionInformation, PluginService } from "./service/plugin.service"; +import { state } from "./state"; + +export class Sync { + /** + * Run when extension have been activated + */ + public async bootstrap(): Promise { + state.commons = new Commons(); + + await state.commons.StartMigrationProcess(); + const startUpSetting = await state.commons.GetSettings(); + const startUpCustomSetting = await state.commons.GetCustomSettings(); + + if (startUpSetting) { + const tokenAvailable: boolean = + startUpCustomSetting.token != null && startUpCustomSetting.token !== ""; + const gistAvailable: boolean = + startUpSetting.gist != null && startUpSetting.gist !== ""; + + if (!startUpCustomSetting.downloadPublicGist && !tokenAvailable) { + if (state.commons.webviewService.IsLandingPageEnabled()) { + state.commons.webviewService.OpenLandingPage(); + return; + } + } + + if (gistAvailable) { + if (startUpSetting.autoDownload) { + vscode.commands + .executeCommand("extension.downloadSettings") + .then(async () => { + if ( + startUpSetting.autoUpload && + tokenAvailable && + gistAvailable + ) { + await state.commons.HandleStartWatching(); + return; + } + }); + } else { + if (startUpSetting.autoUpload && tokenAvailable && gistAvailable) { + await state.commons.HandleStartWatching(); + return; + } + } + } + } + } + /** + * Upload setting to github gist + */ + public async upload(optArgument?: string): Promise { + // @ts-ignore + // const args = arguments; + let github: GitHubService = null; + const localConfig = await state.commons.InitalizeSettings(); + + if (!localConfig.customConfig.token) { + state.commons.webviewService.OpenLandingPage("extension.updateSettings"); + return; + } + + const allSettingFiles: File[] = []; + let uploadedExtensions: ExtensionInformation[] = []; + const ignoredExtensions: ExtensionInformation[] = []; + const dateNow = new Date(); + await state.commons.HandleStopWatching(); + + try { + localConfig.publicGist = false; + if (optArgument && optArgument === "publicGIST") { + localConfig.publicGist = true; + } + + github = new GitHubService( + localConfig.customConfig.token, + localConfig.customConfig.githubEnterpriseUrl + ); + + await startGitProcess.call( + this, + localConfig.extConfig, + localConfig.customConfig + ); + } catch (error) { + Commons.LogException(error, state.commons.ERROR_MESSAGE, true); + return; + } + + async function startGitProcess( + syncSetting: ExtensionConfig, + customSettings: CustomConfig + ) { + vscode.window.setStatusBarMessage( + localize("cmd.updateSettings.info.uploading"), + 2000 + ); + + if (customSettings.downloadPublicGist) { + if (customSettings.token == null || customSettings.token === "") { + vscode.window.showInformationMessage( + localize("cmd.updateSettings.warning.noToken") + ); + + return; + } + } + + vscode.window.setStatusBarMessage( + localize("cmd.updateSettings.info.readding"), + 2000 + ); + + // var remoteList = ExtensionInformation.fromJSONList(file.content); + // var deletedList = PluginService.GetDeletedExtensions(uploadedExtensions); + if (syncSetting.syncExtensions) { + uploadedExtensions = PluginService.CreateExtensionList(); + if ( + customSettings.ignoreExtensions && + customSettings.ignoreExtensions.length > 0 + ) { + uploadedExtensions = uploadedExtensions.filter(extension => { + if (customSettings.ignoreExtensions.includes(extension.name)) { + ignoredExtensions.push(extension); + return false; + } + return true; + }); + } + uploadedExtensions.sort((a, b) => a.name.localeCompare(b.name)); + const extensionFileName = state.environment.FILE_EXTENSION_NAME; + const extensionFilePath = state.environment.FILE_EXTENSION; + const extensionFileContent = JSON.stringify( + uploadedExtensions, + undefined, + 2 + ); + const extensionFile: File = new File( + extensionFileName, + extensionFileContent, + extensionFilePath, + extensionFileName + ); + allSettingFiles.push(extensionFile); + } + + const contentFiles = await FileService.ListFiles( + state.environment.USER_FOLDER, + customSettings + ); + + const customExist: boolean = await FileService.FileExists( + state.environment.FILE_CUSTOMIZEDSETTINGS + ); + if (customExist) { + const customFileKeys: string[] = Object.keys( + customSettings.customFiles + ); + if (customFileKeys.length > 0) { + for (const key of customFileKeys) { + const val = customSettings.customFiles[key]; + const customFile: File = await FileService.GetCustomFile(val, key); + if (customFile !== null) { + allSettingFiles.push(customFile); + } + } + } + } else { + Commons.LogException(null, state.commons.ERROR_MESSAGE, true); + return; + } + for (const snippetFile of contentFiles) { + if (snippetFile.fileName !== state.environment.FILE_KEYBINDING_MAC) { + if (snippetFile.content !== "") { + if ( + snippetFile.fileName === state.environment.FILE_KEYBINDING_NAME + ) { + snippetFile.gistName = + state.environment.OsType === OsType.Mac && + !customSettings.universalKeybindings + ? state.environment.FILE_KEYBINDING_MAC + : state.environment.FILE_KEYBINDING_DEFAULT; + } + if ( + snippetFile.fileName === state.environment.FILE_SETTING_NAME || + snippetFile.fileName === state.environment.FILE_KEYBINDING_MAC || + snippetFile.fileName === state.environment.FILE_KEYBINDING_DEFAULT + ) { + try { + const parsedContent = await PragmaUtil.processBeforeUpload( + snippetFile.content + ); + snippetFile.content = parsedContent; + } catch (e) { + Commons.LogException(null, e.message, true); + console.error(e); + return; + } + } + allSettingFiles.push(snippetFile); + } + } + } + + const extProp = new CloudSettings(); + extProp.lastUpload = dateNow; + const fileName: string = state.environment.FILE_CLOUDSETTINGS_NAME; + const fileContent: string = JSON.stringify(extProp); + const file: File = new File(fileName, fileContent, "", fileName); + allSettingFiles.push(file); + + let completed: boolean = false; + + let newGIST: boolean = false; + try { + if (syncSetting.gist == null || syncSetting.gist === "") { + if (customSettings.askGistDescription) { + customSettings.gistDescription = await state.commons.AskGistDescription(); + } + newGIST = true; + const gistID = await github.CreateEmptyGIST( + localConfig.publicGist, + customSettings.gistDescription + ); + if (gistID) { + syncSetting.gist = gistID; + vscode.window.setStatusBarMessage( + localize("cmd.updateSettings.info.newGistCreated"), + 2000 + ); + } else { + vscode.window.showInformationMessage( + localize("cmd.updateSettings.error.newGistCreateFail") + ); + return; + } + } + + let gistObj = await github.ReadGist(syncSetting.gist); + + if (!gistObj) { + return; + } + + if (gistObj.data.owner !== null) { + const gistOwnerName: string = gistObj.data.owner.login.trim(); + if (github.userName != null) { + const userName: string = github.userName.trim(); + if (gistOwnerName !== userName) { + Commons.LogException( + null, + "Sync : You cant edit GIST for user : " + + gistObj.data.owner.login, + true, + () => { + console.log("Sync : Current User : " + "'" + userName + "'"); + console.log( + "Sync : Gist Owner User : " + "'" + gistOwnerName + "'" + ); + } + ); + return; + } + } + } + + if (gistObj.data.public === true) { + localConfig.publicGist = true; + } + + if ( + !allSettingFiles.some(fileToUpload => { + if (fileToUpload.gistName === "cloudSettings") { + return false; + } + if (!gistObj.data.files[fileToUpload.gistName]) { + return true; + } + if ( + gistObj.data.files[fileToUpload.gistName].content !== + fileToUpload.content + ) { + console.info(`Sync: file ${fileToUpload.gistName} has changed`); + return true; + } + }) + ) { + // Gist files are the same as the local files. + if (!localConfig.extConfig.forceUpload) { + vscode.window.setStatusBarMessage( + localize("cmd.updateSettings.info.gotLatestVersion"), + 5000 + ); + // Exit early to avoid unneeded upload. + return; + } + // Fall through to upload code for forced upload case. + } else { + // Gist files are different from the local files. + const gistNewer = await github.IsGistNewer( + syncSetting.gist, + customSettings.lastDownload + ); + if (!customSettings.lastDownload) { + // Unable to compare the last gist upload time with the + // last download time, so ask user to force upload. + const message = await vscode.window.showInformationMessage( + localize("common.prompt.gistForceUpload"), + localize("common.button.yes"), + localize("common.button.no") + ); + if (message !== localize("common.button.yes")) { + vscode.window.setStatusBarMessage( + localize("cmd.updateSettings.info.uploadCanceled"), + 3000 + ); + return; + } + // Fall through to upload code for one-time forced upload. + } else if (gistNewer && !localConfig.extConfig.forceUpload) { + // Last local download is prior to the last gist upload, so + // the local settings may be out of date. + const message = await vscode.window.showInformationMessage( + localize("common.prompt.gistNewer"), + localize("common.button.yes"), + localize("common.button.no") + ); + if (message !== localize("common.button.yes")) { + vscode.window.setStatusBarMessage( + localize("cmd.updateSettings.info.uploadCanceled"), + 3000 + ); + return; + } + // Fall through to upload code for one-time forced upload. + } + // !gistNewer: Last local download is later or the same as last Gist upload, + // so OK to upload - fall through to upload code below. + } + + vscode.window.setStatusBarMessage( + localize("cmd.updateSettings.info.uploadingFile"), + 3000 + ); + + gistObj = github.UpdateGIST(gistObj, allSettingFiles); + completed = await github.SaveGIST(gistObj.data); + if (!completed) { + vscode.window.showErrorMessage( + localize("cmd.updateSettings.error.gistNotSave") + ); + return; + } + } catch (err) { + Commons.LogException(err, state.commons.ERROR_MESSAGE, true); + return; + } + + if (completed) { + try { + customSettings.lastUpload = dateNow; + customSettings.lastDownload = dateNow; + await state.commons.SaveSettings(syncSetting); + await state.commons.SetCustomSettings(customSettings); + if (newGIST) { + vscode.window.showInformationMessage( + localize( + "cmd.updateSettings.info.uploadingDone", + syncSetting.gist + ) + ); + } + + if (optArgument && optArgument === "publicGIST") { + vscode.window.showInformationMessage( + localize("cmd.updateSettings.info.shareGist") + ); + } + + if (!syncSetting.quietSync) { + state.commons.ShowSummaryOutput( + true, + allSettingFiles, + null, + uploadedExtensions, + ignoredExtensions, + localConfig + ); + vscode.window.setStatusBarMessage("").dispose(); + } else { + vscode.window.setStatusBarMessage("").dispose(); + vscode.window.setStatusBarMessage( + localize("cmd.updateSettings.info.uploadingSuccess"), + 5000 + ); + } + if (syncSetting.autoUpload) { + await state.commons.HandleStartWatching(); + } + } catch (err) { + Commons.LogException(err, state.commons.ERROR_MESSAGE, true); + } + } + } + } + /** + * Download setting from github gist + */ + public async download(): Promise { + const localSettings: LocalConfig = await state.commons.InitalizeSettings(); + + if ( + localSettings.customConfig.downloadPublicGist + ? !localSettings.extConfig.gist + : !localSettings.customConfig.token || !localSettings.extConfig.gist + ) { + state.commons.webviewService.OpenLandingPage( + "extension.downloadSettings" + ); + return; + } + + await state.commons.HandleStopWatching(); + + try { + await StartDownload(localSettings.extConfig, localSettings.customConfig); + } catch (err) { + Commons.LogException(err, state.commons.ERROR_MESSAGE, true); + return; + } + + async function StartDownload( + syncSetting: ExtensionConfig, + customSettings: CustomConfig + ) { + const github = new GitHubService( + customSettings.token, + customSettings.githubEnterpriseUrl + ); + vscode.window.setStatusBarMessage("").dispose(); + vscode.window.setStatusBarMessage( + localize("cmd.downloadSettings.info.readdingOnline"), + 2000 + ); + + const res = await github.ReadGist(syncSetting.gist); + + if (!res) { + return; + } + + let addedExtensions: ExtensionInformation[] = []; + let deletedExtensions: ExtensionInformation[] = []; + const ignoredExtensions: string[] = + customSettings.ignoreExtensions || new Array(); + const updatedFiles: File[] = []; + const actionList: Array> = []; + + if (res.data.public === true) { + localSettings.publicGist = true; + } + const keys = Object.keys(res.data.files); + if (keys.indexOf(state.environment.FILE_CLOUDSETTINGS_NAME) > -1) { + const cloudSettGist: object = JSON.parse( + res.data.files[state.environment.FILE_CLOUDSETTINGS_NAME].content + ); + const cloudSett: CloudSettings = Object.assign( + new CloudSettings(), + cloudSettGist + ); + + const lastUploadStr: string = customSettings.lastUpload + ? customSettings.lastUpload.toString() + : ""; + const lastDownloadStr: string = customSettings.lastDownload + ? customSettings.lastDownload.toString() + : ""; + + let upToDate: boolean = false; + if (lastDownloadStr !== "") { + upToDate = + new Date(lastDownloadStr).getTime() === + new Date(cloudSett.lastUpload).getTime(); + } + + if (lastUploadStr !== "") { + upToDate = + upToDate || + new Date(lastUploadStr).getTime() === + new Date(cloudSett.lastUpload).getTime(); + } + + if (!syncSetting.forceDownload) { + if (upToDate) { + vscode.window.setStatusBarMessage("").dispose(); + vscode.window.setStatusBarMessage( + localize("cmd.downloadSettings.info.gotLatestVersion"), + 5000 + ); + return; + } + } + customSettings.lastDownload = cloudSett.lastUpload; + } + + keys.forEach(gistName => { + if (res.data.files[gistName]) { + if (res.data.files[gistName].content) { + const prefix = FileService.CUSTOMIZED_SYNC_PREFIX; + if (gistName.indexOf(prefix) > -1) { + const fileName = gistName.split(prefix).join(""); // |customized_sync|.htmlhintrc => .htmlhintrc + if (!(fileName in customSettings.customFiles)) { + // syncLocalSettings.json > customFiles doesn't have key + return; + } + const f: File = new File( + fileName, + res.data.files[gistName].content, + customSettings.customFiles[fileName], + gistName + ); + updatedFiles.push(f); + } else if (gistName.indexOf(".") > -1) { + if (customSettings.universalKeybindings) { + if (gistName === state.environment.FILE_KEYBINDING_MAC) { + return; + } + } else { + if ( + state.environment.OsType === OsType.Mac && + gistName === state.environment.FILE_KEYBINDING_DEFAULT + ) { + return; + } + if ( + state.environment.OsType !== OsType.Mac && + gistName === state.environment.FILE_KEYBINDING_MAC + ) { + return; + } + } + const f: File = new File( + gistName, + res.data.files[gistName].content, + null, + gistName + ); + updatedFiles.push(f); + } + } + } else { + console.log(gistName + " key in response is empty."); + } + }); + + for (const file of updatedFiles) { + let writeFile: boolean = false; + let content: string = file.content; + + if (content !== "") { + if (file.gistName === state.environment.FILE_EXTENSION_NAME) { + if (syncSetting.syncExtensions) { + if (syncSetting.removeExtensions) { + try { + deletedExtensions = await PluginService.DeleteExtensions( + content, + ignoredExtensions + ); + } catch (err) { + vscode.window.showErrorMessage( + localize("cmd.downloadSettings.error.removeExtFail") + ); + throw new Error(err); + } + } + + try { + if (!syncSetting.quietSync) { + Commons.outputChannel = vscode.window.createOutputChannel( + "Code Settings Sync" + ); + Commons.outputChannel.clear(); + Commons.outputChannel.appendLine( + `Realtime Extension Download Summary` + ); + Commons.outputChannel.appendLine(`--------------------`); + Commons.outputChannel.show(); + } + + addedExtensions = await PluginService.InstallExtensions( + content, + ignoredExtensions, + (message: string, dispose: boolean) => { + if (!syncSetting.quietSync) { + Commons.outputChannel.appendLine(message); + } else { + console.log(message); + if (dispose) { + vscode.window.setStatusBarMessage( + "Sync : " + message, + 3000 + ); + } + } + } + ); + } catch (err) { + throw new Error(err); + } + } + } else { + writeFile = true; + if ( + file.gistName === state.environment.FILE_KEYBINDING_DEFAULT || + file.gistName === state.environment.FILE_KEYBINDING_MAC + ) { + let test: string = ""; + state.environment.OsType === OsType.Mac && + !customSettings.universalKeybindings + ? (test = state.environment.FILE_KEYBINDING_MAC) + : (test = state.environment.FILE_KEYBINDING_DEFAULT); + if (file.gistName !== test) { + writeFile = false; + } + } + if (writeFile) { + if (file.gistName === state.environment.FILE_KEYBINDING_MAC) { + file.fileName = state.environment.FILE_KEYBINDING_DEFAULT; + } + let filePath: string = ""; + if (file.filePath !== null) { + filePath = await FileService.CreateCustomDirTree(file.filePath); + } else { + filePath = await FileService.CreateDirTree( + state.environment.USER_FOLDER, + file.fileName + ); + } + + if ( + file.gistName === state.environment.FILE_SETTING_NAME || + file.gistName === state.environment.FILE_KEYBINDING_MAC || + file.gistName === state.environment.FILE_KEYBINDING_DEFAULT + ) { + const fileExists = await FileService.FileExists(filePath); + + if (fileExists) { + const localContent = await FileService.ReadFile(filePath); + content = PragmaUtil.processBeforeWrite( + localContent, + content, + state.environment.OsType, + localSettings.customConfig.hostName + ); + } + } + + actionList.push( + FileService.WriteFile(filePath, content) + .then(() => { + // TODO : add Name attribute in File and show information message here with name , when required. + }) + .catch(err => { + Commons.LogException( + err, + state.commons.ERROR_MESSAGE, + true + ); + return; + }) + ); + } + } + } + } + + await Promise.all(actionList); + const settingsUpdated = await state.commons.SaveSettings(syncSetting); + const customSettingsUpdated = await state.commons.SetCustomSettings( + customSettings + ); + if (settingsUpdated && customSettingsUpdated) { + if (!syncSetting.quietSync) { + state.commons.ShowSummaryOutput( + false, + updatedFiles, + deletedExtensions, + addedExtensions, + null, + localSettings + ); + if (deletedExtensions.length > 0 || addedExtensions.length > 0) { + const message = await vscode.window.showInformationMessage( + localize("common.prompt.restartCode"), + "Yes" + ); + if (message === "Yes") { + vscode.commands.executeCommand("workbench.action.reloadWindow"); + } + } + vscode.window.setStatusBarMessage("").dispose(); + } else { + vscode.window.setStatusBarMessage("").dispose(); + vscode.window.setStatusBarMessage( + localize("cmd.downloadSettings.info.downloaded"), + 5000 + ); + } + if (syncSetting.autoUpload) { + await state.commons.HandleStartWatching(); + } + } else { + vscode.window.showErrorMessage( + localize("cmd.downloadSettings.error.unableSave") + ); + } + } + } + /** + * Reset the setting to Sync + */ + public async reset(): Promise { + let extSettings: ExtensionConfig = null; + let localSettings: CustomConfig = null; + + vscode.window.setStatusBarMessage( + localize("cmd.resetSettings.info.resetting"), + 2000 + ); + + try { + extSettings = new ExtensionConfig(); + localSettings = new CustomConfig(); + + await Promise.all([ + state.context.globalState.update("landingPage.dontShowThisAgain", false) + ]); + + const [extSaved, customSaved, lockExist] = await Promise.all([ + state.commons.SaveSettings(extSettings), + state.commons.SetCustomSettings(localSettings), + FileService.FileExists(state.environment.FILE_SYNC_LOCK) + ]); + + if (!lockExist) { + fs.closeSync(fs.openSync(state.environment.FILE_SYNC_LOCK, "w")); + } + + // check is sync locking + if (await lockfile.Check(state.environment.FILE_SYNC_LOCK)) { + await lockfile.Unlock(state.environment.FILE_SYNC_LOCK); + } + + if (extSaved && customSaved) { + vscode.window.showInformationMessage( + localize("cmd.resetSettings.info.settingClear") + ); + } + + state.commons.webviewService.UpdateSettingsPage( + localSettings, + extSettings + ); + } catch (err) { + Commons.LogException( + err, + "Sync : Unable to clear settings. Error Logged on console. Please open an issue.", + true + ); + } + } + public async how() { + return vscode.commands.executeCommand( + "vscode.open", + vscode.Uri.parse( + "http://shanalikhan.github.io/2015/12/15/Visual-Studio-Code-Sync-Settings.html" + ) + ); + } + public async advance() { + const setting: ExtensionConfig = await state.commons.GetSettings(); + const customSettings: CustomConfig = await state.commons.GetCustomSettings(); + if (customSettings == null) { + vscode.window + .showInformationMessage( + localize("cmd.otherOptions.triggerReset"), + localize("common.button.yes") + ) + .then(val => { + if (val === localize("common.button.yes")) { + vscode.commands.executeCommand("extension.resetSettings"); + } + }); + } + const localSetting: LocalConfig = new LocalConfig(); + const tokenAvailable: boolean = + customSettings.token != null && customSettings.token !== ""; + const gistAvailable: boolean = setting.gist != null && setting.gist !== ""; + + const items: string[] = [ + "cmd.otherOptions.openSettingsPage", + "cmd.otherOptions.editLocalSetting", + "cmd.otherOptions.shareSetting", + "cmd.otherOptions.downloadSetting", + "cmd.otherOptions.toggleForceDownload", + "cmd.otherOptions.toggleForceUpload", + "cmd.otherOptions.toggleAutoUpload", + "cmd.otherOptions.toggleAutoDownload", + "cmd.otherOptions.toggleSummaryPage", + "cmd.otherOptions.customizedSync", + "cmd.otherOptions.downloadCustomFile", + "cmd.otherOptions.joinCommunity", + "cmd.otherOptions.openIssue", + "cmd.otherOptions.releaseNotes" + ].map(localize); + + let selectedItem: number = 0; + let settingChanged: boolean = false; + + const item = await vscode.window.showQuickPick(items); + + // if not pick anyone, do nothing + if (!item) { + return; + } + + const index = items.findIndex(v => v === item); + + const handlerMap = [ + async () => { + state.commons.webviewService.OpenSettingsPage(customSettings, setting); + }, + async () => { + const file: vscode.Uri = vscode.Uri.file( + state.environment.FILE_CUSTOMIZEDSETTINGS + ); + fs.openSync(file.fsPath, "r"); + const document = await vscode.workspace.openTextDocument(file); + await vscode.window.showTextDocument( + document, + vscode.ViewColumn.One, + true + ); + }, + async () => { + // share public gist + const answer = await vscode.window.showInformationMessage( + localize("cmd.otherOptions.shareSetting.beforeConfirm"), + "Yes" + ); + + if (answer === "Yes") { + localSetting.publicGist = true; + settingChanged = true; + setting.gist = ""; + selectedItem = 1; + customSettings.downloadPublicGist = false; + await state.commons.SetCustomSettings(customSettings); + } + }, + async () => { + // Download Settings from Public GIST + selectedItem = 2; + customSettings.downloadPublicGist = true; + settingChanged = true; + await state.commons.SetCustomSettings(customSettings); + }, + async () => { + // toggle force download + selectedItem = 3; + settingChanged = true; + setting.forceDownload = !setting.forceDownload; + }, + async () => { + // toggle force upload + selectedItem = 4; + settingChanged = true; + setting.forceUpload = !setting.forceUpload; + }, + async () => { + // toggle auto upload + selectedItem = 5; + settingChanged = true; + setting.autoUpload = !setting.autoUpload; + }, + async () => { + // auto download on startup + selectedItem = 6; + settingChanged = true; + if (!setting) { + vscode.commands.executeCommand("extension.HowSettings"); + return; + } + if (!gistAvailable) { + vscode.commands.executeCommand("extension.HowSettings"); + return; + } + + setting.autoDownload = !setting.autoDownload; + }, + async () => { + // page summary toggle + selectedItem = 7; + settingChanged = true; + + if (!tokenAvailable || !gistAvailable) { + vscode.commands.executeCommand("extension.HowSettings"); + return; + } + setting.quietSync = !setting.quietSync; + }, + async () => { + // add customized sync file + const options: vscode.InputBoxOptions = { + ignoreFocusOut: true, + placeHolder: localize("cmd.otherOptions.customizedSync.placeholder"), + prompt: localize("cmd.otherOptions.customizedSync.prompt") + }; + const input = await vscode.window.showInputBox(options); + + if (input) { + const fileName: string = FileService.ExtractFileName(input); + if (fileName === "") { + return; + } + customSettings.customFiles[fileName] = input; + const done: boolean = await state.commons.SetCustomSettings( + customSettings + ); + if (done) { + vscode.window.showInformationMessage( + localize("cmd.otherOptions.customizedSync.done", fileName) + ); + } + } + }, + async () => { + // Import customized sync file to workspace + const customFiles = await this.getCustomFilesFromGist( + customSettings, + setting + ); + if (customFiles.length < 1) { + return; + } + const options: vscode.QuickPickOptions = { + ignoreFocusOut: true, + placeHolder: localize( + "cmd.otherOptions.downloadCustomFile.placeholder" + ) + }; + const fileName = await vscode.window.showQuickPick( + customFiles.map(file => { + return file.fileName; + }), + options + ); + // if not pick anyone, do nothing + if (!fileName) { + return; + } + const selected = customFiles.find(f => { + return f.fileName === fileName; + }); + if (selected && vscode.workspace.rootPath) { + const downloadPath = FileService.ConcatPath( + vscode.workspace.rootPath, + selected.fileName + ); + const done = await FileService.WriteFile( + downloadPath, + selected.content + ); + if (done) { + vscode.window.showInformationMessage( + localize("cmd.otherOptions.downloadCustomFile.done", downloadPath) + ); + } + } + }, + async () => { + vscode.commands.executeCommand( + "vscode.open", + vscode.Uri.parse( + "https://join.slack.com/t/codesettingssync/shared_invite/enQtNzQyODMzMzI5MDQ3LWNmZjVkZjE2YTg0MzY1Y2EyYzVmYThmNzg2YjZkNjhhZWY3ZTEzN2I3ZTAxMjkwNWU0ZjMyZGFhMjdiZDI3ODU" + ) + ); + }, + async () => { + vscode.commands.executeCommand( + "vscode.open", + vscode.Uri.parse( + "https://github.com/shanalikhan/code-settings-sync/issues/new" + ) + ); + }, + async () => { + vscode.commands.executeCommand( + "vscode.open", + vscode.Uri.parse( + "http://shanalikhan.github.io/2016/05/14/Visual-studio-code-sync-settings-release-notes.html" + ) + ); + } + ]; + + try { + await handlerMap[index](); + if (settingChanged) { + if (selectedItem === 1) { + await state.commons.HandleStopWatching(); + } + await state.commons + .SaveSettings(setting) + .then((added: boolean) => { + if (added) { + const callbackMap = { + 1: async () => { + return await vscode.commands.executeCommand( + "extension.updateSettings", + "publicGIST" + ); + }, + 2: async () => { + return await vscode.window.showInformationMessage( + localize("cmd.otherOptions.warning.tokenNotRequire") + ); + }, + 3: async () => { + const message = setting.forceDownload + ? "cmd.otherOptions.toggleForceDownload.on" + : "cmd.otherOptions.toggleForceDownload.off"; + return vscode.window.showInformationMessage( + localize(message) + ); + }, + 4: async () => { + const message = setting.forceUpload + ? "cmd.otherOptions.toggleForceUpload.on" + : "cmd.otherOptions.toggleForceUpload.off"; + return vscode.window.showInformationMessage( + localize(message) + ); + }, + 5: async () => { + const message = setting.autoUpload + ? "cmd.otherOptions.toggleAutoUpload.on" + : "cmd.otherOptions.toggleAutoUpload.off"; + return vscode.window.showInformationMessage( + localize(message) + ); + }, + 6: async () => { + const message = setting.autoDownload + ? "cmd.otherOptions.toggleAutoDownload.on" + : "cmd.otherOptions.toggleAutoDownload.off"; + return vscode.window.showInformationMessage( + localize(message) + ); + }, + 7: async () => { + const message = setting.quietSync + ? "cmd.otherOptions.quietSync.on" + : "cmd.otherOptions.quietSync.off"; + return vscode.window.showInformationMessage( + localize(message) + ); + } + }; + + if (callbackMap[selectedItem]) { + return callbackMap[selectedItem](); + } + } else { + return vscode.window.showErrorMessage( + localize("cmd.otherOptions.error.toggleFail") + ); + } + }) + .catch(err => { + Commons.LogException( + err, + "Sync : Unable to toggle. Please open an issue.", + true + ); + }); + } + } catch (err) { + Commons.LogException(err, "Error", true); + return; + } + } + + private async getCustomFilesFromGist( + customSettings: CustomConfig, + syncSetting: ExtensionConfig + ): Promise { + const github = new GitHubService( + customSettings.token, + customSettings.githubEnterpriseUrl + ); + const res = await github.ReadGist(syncSetting.gist); + if (!res) { + return []; + } + const keys = Object.keys(res.data.files); + const customFiles: File[] = []; + keys.forEach(gistName => { + if (res.data.files[gistName]) { + if (res.data.files[gistName].content) { + const prefix = FileService.CUSTOMIZED_SYNC_PREFIX; + if (gistName.indexOf(prefix) > -1) { + const fileName = gistName.split(prefix).join(""); // |customized_sync|.htmlhintrc => .htmlhintrc + const f: File = new File( + fileName, + res.data.files[gistName].content, + fileName in customSettings.customFiles + ? customSettings.customFiles[fileName] + : null, + gistName + ); + customFiles.push(f); + } + } + } + }); + return customFiles; + } +} diff --git a/src/util.ts b/src/util.ts new file mode 100644 index 00000000..d353345a --- /dev/null +++ b/src/util.ts @@ -0,0 +1,31 @@ +"use strict"; + +export class Util { + public static async Sleep(ms: number): Promise { + return new Promise(resolve => { + setTimeout(() => { + resolve(ms); + }, ms); + }); + } + /** + * promisify the function + * it will be remove when vscode use node@^8.0 + * @param fn + */ + public static promisify( + fn: (...args: any[]) => any + ): (...whatever: any[]) => Promise { + return function(...argv) { + return new Promise((resolve, reject) => { + fn.call(this, ...argv, (err, data) => { + if (err) { + reject(err); + } else { + resolve(data); + } + }); + }); + }; + } +} diff --git a/test/extension.test.ts b/test/extension.test.ts new file mode 100644 index 00000000..1f248602 --- /dev/null +++ b/test/extension.test.ts @@ -0,0 +1,3 @@ +describe("PragmaUtil", () => { + require("./pragmaUtil"); +}); diff --git a/test/index.ts b/test/index.ts new file mode 100644 index 00000000..abb2dd76 --- /dev/null +++ b/test/index.ts @@ -0,0 +1,8 @@ +import * as testRunner from "vscode/lib/testrunner"; + +testRunner.configure({ + ui: "bdd", + useColors: true, + timeout: 5000 +}); +module.exports = testRunner; diff --git a/test/pragmaUtil/index.ts b/test/pragmaUtil/index.ts new file mode 100644 index 00000000..87a46edf --- /dev/null +++ b/test/pragmaUtil/index.ts @@ -0,0 +1,105 @@ +import { expect } from "chai"; +import fs = require("fs"); +import { OsType } from "../../src/enums"; +import PragmaUtil from "../../src/pragmaUtil"; + +let testSettings = null; + +describe("Process before upload", function() { + this.beforeAll(() => { + testSettings = fs.readFileSync( + __dirname + "/../../../test/pragmaUtil/testSettings.txt", + "utf8" + ); + }); + + it("should trim os, host and env", async () => { + const result = await PragmaUtil.processBeforeUpload(testSettings); + await expect(result).to.match(/@sync os=linux host=trim env=TEST_ENV/); + }); + + it("should uncomment all lines", async () => { + const commentedSettings = ` + // @sync os=linux + // "window": 1, + // @sync os=mac + // "server": "http://exmaple.com + `; + + const result = await PragmaUtil.processBeforeUpload(commentedSettings); + await expect(result) + .to.match(/\s+"window"/) + .and.to.match(/\s+"server"/); + }); + + it("should uncomment lines before write file for os=linux", () => { + const commentedSettings = `{ + // @sync os=linux + // "linux": 1, + // @sync os=mac + "mac": 1 + }`; + const processed = PragmaUtil.processBeforeWrite( + commentedSettings, + commentedSettings, + OsType.Linux, + null + ); + expect(processed) + .to.match(/\s+"linux"/) + .and.to.match(/\s+\/\/\s+"mac"/); + }); + + it("should not comment os=linux settings lines", async () => { + let processed = await PragmaUtil.processBeforeUpload(testSettings); + processed = PragmaUtil.processBeforeWrite( + processed, + processed, + OsType.Linux, + null + ); + expect(processed).to.match(/\s+"not_commented"/); + }); + + it("should leave only settings that matches with os=mac host=mac2 env=TEST_ENV", async () => { + const processed = await PragmaUtil.processBeforeUpload(testSettings); + // tslint:disable-next-line:no-string-literal + process.env["TEST_ENV"] = "1"; + await expect( + PragmaUtil.processBeforeWrite(processed, processed, OsType.Mac, "mac2") + ) + .to.match(/\n\s+"mac2"/) + .and.match(/\n\s+"mactest"/); + }); + + it("should remove all comments and parse JSON", () => { + const possibleJson = PragmaUtil.removeAllComments(testSettings); + expect(JSON.parse.bind(null, possibleJson)).to.not.throw(); + }); + + it("should parse multi-line settings", () => { + const commentedSettings = `{ + // @sync os=linux + "multi": { + "setting": false, + "settingWithBrackets": "{} []", + "multi": { + } + }, + // @sync os=mac + "mac": 1 + }`; + const processed = PragmaUtil.processBeforeWrite( + commentedSettings, + commentedSettings, + OsType.Mac, + null + ); + expect(processed) + .to.match(/\/{2}\s+"multi"/) + .and.to.match(/\/{2}\s+"setting"/) + .and.to.match(/\/{2}\s+"settingWithBrackets"/) + .and.to.match(/\/{2}\s+},/) + .and.to.match(/\s+"mac"/); + }); +}); diff --git a/test/pragmaUtil/testSettings.txt b/test/pragmaUtil/testSettings.txt new file mode 100644 index 00000000..14f05281 --- /dev/null +++ b/test/pragmaUtil/testSettings.txt @@ -0,0 +1,35 @@ +{ + + // @sync os=windows host=h1 + "setting.test": 1, + + // @sync os=windows host=h2 + "setting.test": 2, + + // @sync os= linux host= trim env= TEST_ENV + //"setting.test": 3, + + // @sync os=linux + "not_commented": 4, + + // @sync host=_mac1_ os=mac + "setting.test": 5, + + // @sync host=mac2 os=mac env=TEST_ENV + //"mac2": 3, + + // @sync host=mac2 + //"server": "http://example.com", + + // @sync os=mac + "mactest": "", + + // @sync host=test1 + "onlyHost": "", + + // @sync-ignore + "test4": 12, + + // @sync ignore + "test5": 12 +} \ No newline at end of file diff --git a/test/service/fileService/dummyrc b/test/service/fileService/dummyrc new file mode 100644 index 00000000..02eb9c90 --- /dev/null +++ b/test/service/fileService/dummyrc @@ -0,0 +1,3 @@ +{ + "hoge": true, +} \ No newline at end of file diff --git a/test/service/fileService/fileService.test.ts b/test/service/fileService/fileService.test.ts new file mode 100644 index 00000000..ac6dfcd2 --- /dev/null +++ b/test/service/fileService/fileService.test.ts @@ -0,0 +1,36 @@ +import { expect } from "chai"; + +import { File, FileService } from "../../../src/service/file.service"; + +describe("FileService", () => { + it("should get custom file info", async () => { + const expected = new File( + "dummyrc", + '{\n "hoge": true,\n}', + __dirname + "/../../../../test/service/fileService/dummyrc", + "|customized_sync|dummyrc" + ); + const actual = await FileService.GetCustomFile( + __dirname + "/../../../../test/service/fileService/dummyrc", // __dirname => out/src/test/service + "dummyrc" + ); + expect(actual).to.deep.equals(expected); + }); + + it("should return null if file does not exists", async () => { + const actual = await FileService.GetCustomFile( + __dirname + "/../../../../test/service/fileService/hoge", + "hoge" + ); + expect(actual).to.be.equals(null); + }); + + it("should join by path separator", () => { + const actual = FileService.ConcatPath( + "/User/path/to", + "hoge/piyo", + "hoge.txt" + ); + expect(actual).to.be.equals("/User/path/to/hoge/piyo/hoge.txt"); + }); +}); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..1fe9bcaf --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "es5", + "outDir": "out", + "lib": ["es2015", "es2016", "es2017", "es2018", "esnext"], + "sourceMap": true, + "rootDir": ".", + "noUnusedLocals": true, + "noUnusedParameters": true + }, + "exclude": ["node_modules", ".vscode-test"] +} diff --git a/tslint.json b/tslint.json new file mode 100644 index 00000000..e37dd33b --- /dev/null +++ b/tslint.json @@ -0,0 +1,29 @@ +{ + "extends": [ + "tslint:recommended", + "tslint-plugin-prettier" + ], + "rules": { + "prefer-for-of": false, + "prettier": [ + true, + { + "singleQuote": false + } + ], + "max-classes-per-file": false, + "object-literal-sort-keys": false, + "trailing-comma": false, + "arrow-parens": false, + "no-console": false, + "object-literal-key-quotes": false, + "max-line-length": { + "options": { + "limit": 260 + } + } + }, + "linterOptions": { + "exclude": [] + } +} \ No newline at end of file diff --git a/ui/gist-selection/gist-selection.html b/ui/gist-selection/gist-selection.html new file mode 100644 index 00000000..2322ba79 --- /dev/null +++ b/ui/gist-selection/gist-selection.html @@ -0,0 +1,95 @@ + + + + + + + + + + + + + +
+ +

+ Select Your Existing Gist +

+
+
+
+ + + + + + + + + + + diff --git a/ui/gist-selection/gist-selection.js b/ui/gist-selection/gist-selection.js new file mode 100644 index 00000000..22d30af2 --- /dev/null +++ b/ui/gist-selection/gist-selection.js @@ -0,0 +1,89 @@ +//import { debug } from "vscode"; + +// @ts-nocheck +function appendHTML(parent, html) { + var div = document.createElement("div"); + div.innerHTML = html; + while (div.children.length > 0) { + parent.appendChild(div.children[0]); + } + div.remove(); +} + +const vscode = acquireVsCodeApi(); +/* https://stackoverflow.com/questions/3177836/how-to-format-time-since-xxx-e-g-4-minutes-ago-similar-to-stack-exchange-site */ +function timeSince(date) { + var seconds = Math.floor((new Date() - date) / 1000); + + var interval = Math.floor(seconds / 31536000); + + if (interval > 1) { + return interval + " years"; + } + interval = Math.floor(seconds / 2592000); + if (interval > 1) { + return interval + " months"; + } + interval = Math.floor(seconds / 86400); + if (interval > 1) { + return interval + " days"; + } + interval = Math.floor(seconds / 3600); + if (interval > 1) { + return interval + " hours"; + } + interval = Math.floor(seconds / 60); + if (interval > 1) { + return interval + " minutes"; + } + return Math.floor(seconds) + " seconds"; +} + +function appendHTML(parent, html) { + var div = document.createElement("div"); + div.innerHTML = html; + while (div.children.length > 0) { + parent.appendChild(div.children[0]); + } + div.remove(); +} + +function saveGistId(id) { + vscode.postMessage({ id }); + $("#modal").modal(); +} + +const selectionContainer = document.querySelector("#selectionContainer"); + +document + .querySelector(".modal-content") + .classList.add( + document.body.className.includes("vscode-dark") ? "bg-dark" : "bg-light" + ); + +const skipContainer = document.querySelector("#skipContainer"); +appendHTML(skipContainer, skip); + +const selectionTemplate = ` +`; + +if (!gists.length) { + appendHTML( + selectionContainer, + "

No Gists found on your account. Skip this window and upload the settings to create a new Gist.

" + ); +} else { + gists + .sort((a, b) => new Date(b.updated_at) - new Date(a.updated_at)) + .forEach(gist => { + const html = selectionTemplate + .replace(new RegExp("@description", "g"), gist.description) + .replace(new RegExp("@id", "g"), gist.id) + .replace( + new RegExp("@timestamp", "g"), + timeSince(new Date(gist.updated_at)) + ); + appendHTML(selectionContainer, html); + }); +} + diff --git a/ui/landing-page/landing-page.html b/ui/landing-page/landing-page.html new file mode 100644 index 00000000..d7d5ec88 --- /dev/null +++ b/ui/landing-page/landing-page.html @@ -0,0 +1,178 @@ + + + + + + + + + + + + + + +
+
+

+ What's New in + + vX.X.X + + +

+
+
+
+

+ Configuration +

+

+ Login via GitHub to setup Settings Sync, or configure the settings + manually. +

+ + +
+
+

+ Show Your Support +

+

+ While being free and open source, if you find + Settings Sync + useful, please consider supporting it by donating via PayPal or Open + Collective. +

+ + +
+
+
+ +
+
+ + +
+
+ + + + + + + diff --git a/ui/landing-page/landing-page.js b/ui/landing-page/landing-page.js new file mode 100644 index 00000000..52c23d2d --- /dev/null +++ b/ui/landing-page/landing-page.js @@ -0,0 +1,40 @@ +// @ts-nocheck +const vscode = acquireVsCodeApi(); + +function sendCommand(command, data) { + vscode.postMessage({ + command, + data + }); +} + +function appendHTML(parent, html) { + var div = document.createElement("div"); + div.innerHTML = html; + while (div.children.length > 0) { + parent.appendChild(div.children[0]); + } + div.remove(); +} + +const releaseNoteTemplate = `
@TYPE@NOTE @EXTRA
`; + +const notesElement = document.querySelector("#notes"); +releaseNotes.changes.forEach(change => { + const html = releaseNoteTemplate + .replace(new RegExp("@NOTE", "g"), change.details) + .replace(new RegExp("@TYPE", "g"), change.type) + .replace(new RegExp("@COLOR", "g"), change.color) + .replace( + new RegExp("@EXTRA", "g"), + change.author && change.pullRequest + ? `(Thanks to @${change.author} for PR #${change.pullRequest})` + : "" + ); + appendHTML(notesElement, html); +}); + +const currentVersionElement = document.querySelector("#current-version"); +currentVersionElement.innerHTML = releaseNotes.currentVersion; + +document.querySelector("#customCheck1").checked = checked === "true"; diff --git a/ui/settings/settings.html b/ui/settings/settings.html new file mode 100644 index 00000000..5697b2b3 --- /dev/null +++ b/ui/settings/settings.html @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + +
+
+

+ Environment Settings +

+
+

+
+
+

+ Global Settings +

+
+
+
+ + + + + + + + + + + diff --git a/ui/settings/settings.js b/ui/settings/settings.js new file mode 100644 index 00000000..17e5d4c1 --- /dev/null +++ b/ui/settings/settings.js @@ -0,0 +1,269 @@ +// @ts-nocheck + +function appendHTML(parent, html) { + var div = document.createElement("div"); + div.innerHTML = html; + while (div.children.length > 0) { + parent.appendChild(div.children[0]); + } + div.remove(); +} + +const vscode = acquireVsCodeApi(); + +const textInputTemplate = `
+ + @tooltip + +
`; + +const textInputGroupTemplate = `
+ + @tooltip +
+ +
+ +
+
+
`; + +const numberInputTemplate = `
+ + @tooltip + +
`; + +const checkboxTemplate = `
+ + + @tooltip +
`; + +const textareaTemplate = `
+ + @tooltip + +
`; + +const globalParent = document.getElementById("globalSettings"); +const envParent = document.getElementById("environmentSettings"); +const saveStatus = document.getElementById("saveStatus"); + +globalMap.forEach(settingMap => { + let template; + switch (settingMap.type) { + case "textinput": + template = textInputTemplate; + break; + case "numberinput": + template = numberInputTemplate; + break; + case "checkbox": + template = checkboxTemplate; + break; + case "textarea": + template = textareaTemplate; + break; + } + const html = template + .replace(new RegExp("@name", "g"), settingMap.name) + .replace(new RegExp("@placeholder", "g"), settingMap.placeholder) + .replace( + new RegExp("@correspondingSetting", "g"), + settingMap.correspondingSetting + ) + .replace(new RegExp("@tooltip"), "") + .replace(new RegExp("@settingType", "g"), "global"); + appendHTML(globalParent, html); +}); + +envMap.forEach(envMap => { + let template; + switch (envMap.type) { + case "textinput": + template = textInputTemplate; + break; + case "numberinput": + template = textInputTemplate; + break; + case "checkbox": + template = checkboxTemplate; + break; + } + const isInputGroup = envMap.correspondingSetting === "gist"; + let disabledStatus = ""; + if (isInputGroup) { + template = textInputGroupTemplate; + if (!_.get(envData, "gist") || !_.get(globalData, "token")) { + disabledStatus = "disabled"; + } + } + const html = template + .replace(new RegExp("@name", "g"), envMap.name) + .replace(new RegExp("@placeholder", "g"), envMap.placeholder) + .replace( + new RegExp("@correspondingSetting", "g"), + envMap.correspondingSetting + ) + .replace( + new RegExp("@tooltip"), + ` + + + ` + ) + .replace(new RegExp("@settingType", "g"), "env") + .replace( + new RegExp("@action", "g"), + `inputGroupAction('${envMap.correspondingSetting}')` + ) + .replace(new RegExp("@disabled", "g"), disabledStatus); + appendHTML(envParent, html); +}); + +$(document).ready(function() { + save(); + $('[data-toggle="tooltip"]').tooltip({ container: "html" }); + $(".text") + .each((i, el) => { + if ($(el).attr("settingType") === "global") { + $(el).val(_.get(globalData, $(el).attr("setting"))); + } else { + $(el).val(envData[$(el).attr("setting")]); + } + }) + .change(function() { + save(); + let val = $(this).val(); + vscode.postMessage({ + command: $(this).attr("setting"), + text: val, + type: $(this).attr("settingType") + }); + }); + $(".number") + .each((i, el) => { + if ($(el).attr("settingType") === "global") { + $(el).val(_.get(globalData, $(el).attr("setting"))); + } else { + $(el).val(envData[$(el).attr("setting")]); + } + }) + .change(function() { + save(); + let val = Number($(this).val()); + vscode.postMessage({ + command: $(this).attr("setting"), + text: val, + type: $(this).attr("settingType") + }); + }); + $(".checkbox") + .each((i, el) => { + if ($(el).attr("settingType") === "global") { + $(el).prop("checked", _.get(globalData, $(el).attr("setting"))); + } else { + $(el).prop("checked", envData[$(el).attr("setting")]); + } + }) + .change(function() { + save(); + let val = $(this).is(":checked"); + vscode.postMessage({ + command: $(this).attr("setting"), + text: val, + type: $(this).attr("settingType") + }); + }); + $(".textarea") + .each((i, el) => { + let str = ""; + const items = _.get(globalData, $(el).attr("setting")); + items.forEach(item => (str += item + "\n")); + $(el).val(str.slice(0, -1)); + $(el).prop("rows", items.length); + }) + .change(function() { + save(); + let val = []; + $(this) + .val() + .split("\n") + .forEach(item => { + if (item !== "") { + val.push(item); + } + }); + vscode.postMessage({ + command: $(this).attr("setting"), + text: val, + type: "global" + }); + }); +}); + +function save() { + saveStatus.innerHTML = ``; + setTimeout( + () => + (saveStatus.innerHTML = ``), + 1000 + ); +} + +function inputGroupAction(setting) { + if (setting === "gist") { + vscode.postMessage("openGist"); + } +} diff --git a/ui/shared/fonts.js b/ui/shared/fonts.js new file mode 100644 index 00000000..c8341802 --- /dev/null +++ b/ui/shared/fonts.js @@ -0,0 +1,19 @@ +// @ts-nocheck + +document.querySelector("font-injector").innerHTML = ``; diff --git a/ui/shared/page-header.js b/ui/shared/page-header.js new file mode 100644 index 00000000..a27dd99e --- /dev/null +++ b/ui/shared/page-header.js @@ -0,0 +1,18 @@ +// @ts-nocheck + +document.querySelector("page-header").innerHTML = ` +

+ +Settings Sync +

+

+Synchronize settings, snippets, themes, icons, launch, +keybindings, workspaces and extensions across machines +using GitHub Gist. +

+
`; diff --git a/ui/shared/styles.css b/ui/shared/styles.css new file mode 100644 index 00000000..cea26430 --- /dev/null +++ b/ui/shared/styles.css @@ -0,0 +1,199 @@ +html, +body { + height: 100%; + width: 100%; + display: flex; + flex-direction: column; + font-family: "Roboto", sans-serif; + letter-spacing: 0.0625em; +} + +body.vscode-dark { + background-color: #1b1b1b; + color: #e9e9e9; +} + +body.vscode-light { + background-color: #fff; + color: #1b1b1b; +} + +.vscode-light .logo { + -webkit-filter: invert(1) opacity(0.5); + filter: invert(1) opacity(0.5); +} + +.tooltip { + display: block; +} + +.content-row { + flex-grow: 1; + overflow-y: hidden; + padding-bottom: 1rem; +} + +.modal-header { + border-bottom: none; +} + +.modal-footer { + border-top: none; +} + +.modal-body { + padding: 0rem 1rem; +} + +.footer > .col-one { + padding-left: 0; +} + +.footer > .col-two { + padding-right: 0; +} + +.footer { + margin: 0; +} + +.scrollable { + overflow-y: auto; +} + +.content { + background-color: burlywood; + overflow: scroll; +} + +:root { + --btn: #0e629c; + --btn-hover: #15496e; + --btn-click: #0e3450; + --link: dodgerblue; + --link-hover: rgb(15, 109, 204); +} + +.dock-bottom-left { + position: fixed; + bottom: 4rem; + left: 4rem; +} + +.dock-bottom-right { + position: fixed; + bottom: 1rem; + right: 1rem; + background-color: rgb(42, 42, 42); + border-radius: 1.5rem; + padding-left: 1rem; + padding-right: 1rem; + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.logo { + padding-right: 0.5rem; + filter: opacity(0.5); +} + +.change { + line-height: 150%; +} + +.badge-success { + color: #fff; + background-color: #73c991; +} + +.badge-danger { + color: #fff; + background-color: #ce4f59; +} + +.badge { + vertical-align: 2px; + line-height: 120%; + width: 6rem; +} + +body { + position: relative; + min-height: 35rem; + background-position: center; + background-repeat: no-repeat; + background-attachment: scroll; + background-size: cover; + margin-top: 40px; + margin-bottom: 40px; +} + +body h1 { + font-size: 3.5rem; + line-height: 2.5rem; + font-weight: bold; + color: #808080 !important; + font-family: "Open Sans"; + display: flex; + align-items: center; /* align vertical */ + justify-content: center; /* align horizontal */ +} + +body h2 { + /* max-width: 20rem; */ + font-size: 1rem; +} + +body h3 { + /* max-width: 20rem; */ + font-size: 1.5rem; +} + +.btn { + -webkit-box-shadow: 0 0.1875rem 0.1875rem 0 rgba(0, 0, 0, 0.1) !important; + box-shadow: 0 0.1875rem 0.1875rem 0 rgba(0, 0, 0, 0.1) !important; + padding: 1rem; + font-size: 80%; + text-transform: uppercase; + letter-spacing: 0.15rem; + border: 0; + width: 100%; + height: 100%; + display: flex; + justify-content: center; /* align horizontal */ + align-items: center; /* align vertical */ +} + +.btn-primary { + color: #fff !important; +} + +.btn-primary, +.btn-primary:focus { + background-color: var(--btn) !important; +} + +.btn-primary:hover, +.btn-primary:active { + background-color: var(--btn-hover) !important; +} + +.text, +.textarea, +.number { + -webkit-box-shadow: 0 0.1875rem 0.1875rem 0 rgba(0, 0, 0, 0.1) !important; + box-shadow: 0 0.1875rem 0.1875rem 0 rgba(0, 0, 0, 0.1) !important; + padding: 1.25rem 2rem; + height: auto; + border: 0; +} + +a { + color: var(--link); +} + +a:focus, +a:hover { + text-decoration: none; + color: var(--link-hover); +} diff --git a/ui/shared/vendor/bootstrap/css/bootstrap.min.css b/ui/shared/vendor/bootstrap/css/bootstrap.min.css new file mode 100644 index 00000000..92e3fe87 --- /dev/null +++ b/ui/shared/vendor/bootstrap/css/bootstrap.min.css @@ -0,0 +1,7 @@ +/*! + * Bootstrap v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors + * Copyright 2011-2019 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[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}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.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-repeat:no-repeat;background-position:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.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") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip{display:block}.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E");background-repeat:no-repeat;background-position:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip{display:block}.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn: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){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:no-repeat 50%/50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:calc(1rem + .4rem);padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-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-top-left-radius:0;border-bottom-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}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion>.card{overflow:hidden}.accordion>.card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion>.card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion>.card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.accordion>.card .card-header{margin-bottom:-1px}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;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){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}@media (min-width:576px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-sm .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-md .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:992px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-lg .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:1200px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-xl .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush .list-group-item:last-child{margin-bottom:-1px}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{margin-bottom:0;border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);content:""}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #dee2e6;border-bottom-right-radius:.3rem;border-bottom-left-radius:.3rem}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:0s .6s opacity}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@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;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50%/100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!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}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;overflow-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/ui/shared/vendor/bootstrap/js/bootstrap.min.js b/ui/shared/vendor/bootstrap/js/bootstrap.min.js new file mode 100644 index 00000000..c4c0d1f9 --- /dev/null +++ b/ui/shared/vendor/bootstrap/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e((t=t||self).bootstrap={},t.jQuery,t.Popper)}(this,function(t,g,u){"use strict";function i(t,e){for(var n=0;nthis._items.length-1||t<0))if(this._isSliding)g(this._element).one(Q.SLID,function(){return e.to(t)});else{if(n===t)return this.pause(),void this.cycle();var i=ndocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},t._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},t._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:Ee},je="show",He="out",Re={HIDE:"hide"+De,HIDDEN:"hidden"+De,SHOW:"show"+De,SHOWN:"shown"+De,INSERTED:"inserted"+De,CLICK:"click"+De,FOCUSIN:"focusin"+De,FOCUSOUT:"focusout"+De,MOUSEENTER:"mouseenter"+De,MOUSELEAVE:"mouseleave"+De},xe="fade",Fe="show",Ue=".tooltip-inner",We=".arrow",qe="hover",Me="focus",Ke="click",Qe="manual",Be=function(){function i(t,e){if("undefined"==typeof u)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var t=i.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=g(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(g(this.getTipElement()).hasClass(Fe))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),g.removeData(this.element,this.constructor.DATA_KEY),g(this.element).off(this.constructor.EVENT_KEY),g(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&g(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if("none"===g(this.element).css("display"))throw new Error("Please use show on visible elements");var t=g.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){g(this.element).trigger(t);var n=_.findShadowRoot(this.element),i=g.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=_.getUID(this.constructor.NAME);o.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&g(o).addClass(xe);var s="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();g(o).data(this.constructor.DATA_KEY,this),g.contains(this.element.ownerDocument.documentElement,this.tip)||g(o).appendTo(l),g(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new u(this.element,o,{placement:a,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:We},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}}),g(o).addClass(Fe),"ontouchstart"in document.documentElement&&g(document.body).children().on("mouseover",null,g.noop);var c=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,g(e.element).trigger(e.constructor.Event.SHOWN),t===He&&e._leave(null,e)};if(g(this.tip).hasClass(xe)){var h=_.getTransitionDurationFromElement(this.tip);g(this.tip).one(_.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},t.hide=function(t){var e=this,n=this.getTipElement(),i=g.Event(this.constructor.Event.HIDE),o=function(){e._hoverState!==je&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),g(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(g(this.element).trigger(i),!i.isDefaultPrevented()){if(g(n).removeClass(Fe),"ontouchstart"in document.documentElement&&g(document.body).children().off("mouseover",null,g.noop),this._activeTrigger[Ke]=!1,this._activeTrigger[Me]=!1,this._activeTrigger[qe]=!1,g(this.tip).hasClass(xe)){var r=_.getTransitionDurationFromElement(n);g(n).one(_.TRANSITION_END,o).emulateTransitionEnd(r)}else o();this._hoverState=""}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(t){g(this.getTipElement()).addClass(Ae+"-"+t)},t.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},t.setContent=function(){var t=this.getTipElement();this.setElementContent(g(t.querySelectorAll(Ue)),this.getTitle()),g(t).removeClass(xe+" "+Fe)},t.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=Se(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?g(e).parent().is(t)||t.empty().append(e):t.text(g(e).text())},t.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},t._getOffset=function(){var e=this,t={};return"function"==typeof this.config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,e.config.offset(t.offsets,e.element)||{}),t}:t.offset=this.config.offset,t},t._getContainer=function(){return!1===this.config.container?document.body:_.isElement(this.config.container)?g(this.config.container):g(document).find(this.config.container)},t._getAttachment=function(t){return Pe[t.toUpperCase()]},t._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(t){if("click"===t)g(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(t){return i.toggle(t)});else if(t!==Qe){var e=t===qe?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=t===qe?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;g(i.element).on(e,i.config.selector,function(t){return i._enter(t)}).on(n,i.config.selector,function(t){return i._leave(t)})}}),g(this.element).closest(".modal").on("hide.bs.modal",function(){i.element&&i.hide()}),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},t._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},t._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Me:qe]=!0),g(e.getTipElement()).hasClass(Fe)||e._hoverState===je?e._hoverState=je:(clearTimeout(e._timeout),e._hoverState=je,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===je&&e.show()},e.config.delay.show):e.show())},t._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Me:qe]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=He,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){e._hoverState===He&&e.hide()},e.config.delay.hide):e.hide())},t._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},t._getConfig=function(t){var e=g(this.element).data();return Object.keys(e).forEach(function(t){-1!==Oe.indexOf(t)&&delete e[t]}),"number"==typeof(t=l({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),_.typeCheckConfig(be,t,this.constructor.DefaultType),t.sanitize&&(t.template=Se(t.template,t.whiteList,t.sanitizeFn)),t},t._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},t._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Ne);null!==e&&e.length&&t.removeClass(e.join(""))},t._handlePopperPlacementChange=function(t){var e=t.instance;this.tip=e.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},t._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(g(t).removeClass(xe),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},i._jQueryInterface=function(n){return this.each(function(){var t=g(this).data(Ie),e="object"==typeof n&&n;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),g(this).data(Ie,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return Le}},{key:"NAME",get:function(){return be}},{key:"DATA_KEY",get:function(){return Ie}},{key:"Event",get:function(){return Re}},{key:"EVENT_KEY",get:function(){return De}},{key:"DefaultType",get:function(){return ke}}]),i}();g.fn[be]=Be._jQueryInterface,g.fn[be].Constructor=Be,g.fn[be].noConflict=function(){return g.fn[be]=we,Be._jQueryInterface};var Ve="popover",Ye="bs.popover",ze="."+Ye,Xe=g.fn[Ve],$e="bs-popover",Ge=new RegExp("(^|\\s)"+$e+"\\S+","g"),Je=l({},Be.Default,{placement:"right",trigger:"click",content:"",template:''}),Ze=l({},Be.DefaultType,{content:"(string|element|function)"}),tn="fade",en="show",nn=".popover-header",on=".popover-body",rn={HIDE:"hide"+ze,HIDDEN:"hidden"+ze,SHOW:"show"+ze,SHOWN:"shown"+ze,INSERTED:"inserted"+ze,CLICK:"click"+ze,FOCUSIN:"focusin"+ze,FOCUSOUT:"focusout"+ze,MOUSEENTER:"mouseenter"+ze,MOUSELEAVE:"mouseleave"+ze},sn=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),(e.prototype.constructor=e).__proto__=n;var o=i.prototype;return o.isWithContent=function(){return this.getTitle()||this._getContent()},o.addAttachmentClass=function(t){g(this.getTipElement()).addClass($e+"-"+t)},o.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},o.setContent=function(){var t=g(this.getTipElement());this.setElementContent(t.find(nn),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(on),e),t.removeClass(tn+" "+en)},o._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},o._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Ge);null!==e&&0=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||tli{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:fa-spin 2s infinite linear}.fa-pulse{animation:fa-spin 1s infinite steps(8)}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-wizard:before{content:"\f6e8"}.fa-haykal:before{content:"\f666"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto} \ No newline at end of file diff --git a/ui/shared/vendor/fontawesome/css/solid.min.css b/ui/shared/vendor/fontawesome/css/solid.min.css new file mode 100644 index 00000000..a0d56287 --- /dev/null +++ b/ui/shared/vendor/fontawesome/css/solid.min.css @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 5.9.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:auto;src:url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa,.fas{font-family:"Font Awesome 5 Free";font-weight:900} \ No newline at end of file diff --git a/ui/shared/vendor/fontawesome/webfonts/fa-solid-900.ttf b/ui/shared/vendor/fontawesome/webfonts/fa-solid-900.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c6c3dd4d40e6935dbda5f4fc671956c41b768a09 GIT binary patch literal 191832 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 JlKu;TE2wOj%Q1qdB^k`WJpqvW9V}9KNYfOicm{ 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 R-Q)Ro=L@j@Nd4~k{{Y?~eeVDO literal 0 HcmV?d00001 diff --git a/ui/shared/vendor/google/OpenSans-Bold.ttf b/ui/shared/vendor/google/OpenSans-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..96fabd865df70de92f2a4bdc24d65306759fe726 GIT binary patch literal 103616 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 z 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 z

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

n{#NV($fZ=b2Ttd7 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�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 Lv7{_*LQnk1zZlrgRDjh{?=p_(BF9M+nn-P!% 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 U=0&&n0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,u,s,l,c,f,d,p,h,g,v,y,m,b,x="sizzle"+1*new Date,w=e.document,C=0,T=0,E=ae(),N=ae(),k=ae(),A=function(e,t){return e===t&&(f=!0),0},D={}.hasOwnProperty,S=[],L=S.pop,j=S.push,q=S.push,O=S.slice,P=function(e,t){for(var n=0,r=e.length;n+~]|"+I+")"+I+"*"),_=new RegExp("="+I+"*([^\\]'\"]*?)"+I+"*\\]","g"),U=new RegExp(M),V=new RegExp("^"+R+"$"),X={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+B),PSEUDO:new RegExp("^"+M),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+I+"*(even|odd|(([+-]|)(\\d*)n|)"+I+"*(?:([+-]|)"+I+"*(\\d+)|))"+I+"*\\)|)","i"),bool:new RegExp("^(?:"+H+")$","i"),needsContext:new RegExp("^"+I+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+I+"*((?:-\\d)?\\d*)"+I+"*\\)|)(?=[^-]|$)","i")},Q=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,G=/^[^{]+\{\s*\[native \w/,K=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,J=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+I+"?|("+I+")|.)","ig"),ee=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){d()},ie=me(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{q.apply(S=O.call(w.childNodes),w.childNodes),S[w.childNodes.length].nodeType}catch(e){q={apply:S.length?function(e,t){j.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function oe(e,t,r,i){var o,u,l,c,f,h,y,m=t&&t.ownerDocument,C=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==C&&9!==C&&11!==C)return r;if(!i&&((t?t.ownerDocument||t:w)!==p&&d(t),t=t||p,g)){if(11!==C&&(f=K.exec(e)))if(o=f[1]){if(9===C){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&b(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return q.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return q.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!k[e+" "]&&(!v||!v.test(e))){if(1!==C)m=t,y=e;else if("object"!==t.nodeName.toLowerCase()){(c=t.getAttribute("id"))?c=c.replace(te,ne):t.setAttribute("id",c=x),u=(h=a(e)).length;while(u--)h[u]="#"+c+" "+ye(h[u]);y=h.join(","),m=J.test(e)&&ge(t.parentNode)||t}if(y)try{return q.apply(r,m.querySelectorAll(y)),r}catch(e){}finally{c===x&&t.removeAttribute("id")}}}return s(e.replace($,"$1"),t,r,i)}function ae(){var e=[];function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}return t}function ue(e){return e[x]=!0,e}function se(e){var t=p.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function le(e,t){var n=e.split("|"),i=n.length;while(i--)r.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function de(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pe(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return ue(function(t){return t=+t,ue(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ge(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},d=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==p&&9===a.nodeType&&a.documentElement?(p=a,h=p.documentElement,g=!o(p),w!==p&&(i=p.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=se(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=se(function(e){return e.appendChild(p.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=G.test(p.getElementsByClassName),n.getById=se(function(e){return h.appendChild(e).id=x,!p.getElementsByName||!p.getElementsByName(x).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&g)return t.getElementsByClassName(e)},y=[],v=[],(n.qsa=G.test(p.querySelectorAll))&&(se(function(e){h.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+I+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+I+"*(?:value|"+H+")"),e.querySelectorAll("[id~="+x+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+x+"+*").length||v.push(".#.+[+~]")}),se(function(e){e.innerHTML="";var t=p.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+I+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(n.matchesSelector=G.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&se(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),y.push("!=",M)}),v=v.length&&new RegExp(v.join("|")),y=y.length&&new RegExp(y.join("|")),t=G.test(h.compareDocumentPosition),b=t||G.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===p||e.ownerDocument===w&&b(w,e)?-1:t===p||t.ownerDocument===w&&b(w,t)?1:c?P(c,e)-P(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],u=[t];if(!i||!o)return e===p?-1:t===p?1:i?-1:o?1:c?P(c,e)-P(c,t):0;if(i===o)return ce(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)u.unshift(n);while(a[r]===u[r])r++;return r?ce(a[r],u[r]):a[r]===w?-1:u[r]===w?1:0},p):p},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&d(e),t=t.replace(_,"='$1']"),n.matchesSelector&&g&&!k[t+" "]&&(!y||!y.test(t))&&(!v||!v.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,p,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==p&&d(e),b(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==p&&d(e);var i=r.attrHandle[t.toLowerCase()],o=i&&D.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(A),f){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:ue,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return X.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&U.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+I+")"+e+"("+I+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace(W," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),u="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,s){var l,c,f,d,p,h,g=o!==a?"nextSibling":"previousSibling",v=t.parentNode,y=u&&t.nodeName.toLowerCase(),m=!s&&!u,b=!1;if(v){if(o){while(g){d=t;while(d=d[g])if(u?d.nodeName.toLowerCase()===y:1===d.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?v.firstChild:v.lastChild],a&&m){b=(p=(l=(c=(f=(d=v)[x]||(d[x]={}))[d.uniqueID]||(f[d.uniqueID]={}))[e]||[])[0]===C&&l[1])&&l[2],d=p&&v.childNodes[p];while(d=++p&&d&&d[g]||(b=p=0)||h.pop())if(1===d.nodeType&&++b&&d===t){c[e]=[C,p,b];break}}else if(m&&(b=p=(l=(c=(f=(d=t)[x]||(d[x]={}))[d.uniqueID]||(f[d.uniqueID]={}))[e]||[])[0]===C&&l[1]),!1===b)while(d=++p&&d&&d[g]||(b=p=0)||h.pop())if((u?d.nodeName.toLowerCase()===y:1===d.nodeType)&&++b&&(m&&((c=(f=d[x]||(d[x]={}))[d.uniqueID]||(f[d.uniqueID]={}))[e]=[C,b]),d===t))break;return(b-=i)===r||b%r==0&&b/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[x]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?ue(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=P(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:ue(function(e){var t=[],n=[],r=u(e.replace($,"$1"));return r[x]?ue(function(e,t,n,i){var o,a=r(e,null,i,[]),u=e.length;while(u--)(o=a[u])&&(e[u]=!(t[u]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:ue(function(e){return function(t){return oe(e,t).length>0}}),contains:ue(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:ue(function(e){return V.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:pe(!1),disabled:pe(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xe(e,t,n){for(var r=0,i=t.length;r-1&&(o[l]=!(a[l]=f))}}else y=we(y===a?y.splice(h,y.length):y),i?i(null,a,y,s):q.apply(a,y)})}function Te(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],u=a||r.relative[" "],s=a?1:0,c=me(function(e){return e===t},u,!0),f=me(function(e){return P(t,e)>-1},u,!0),d=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];s1&&be(d),s>1&&ye(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),n,s0,i=e.length>0,o=function(o,a,u,s,c){var f,h,v,y=0,m="0",b=o&&[],x=[],w=l,T=o||i&&r.find.TAG("*",c),E=C+=null==w?1:Math.random()||.1,N=T.length;for(c&&(l=a===p||a||c);m!==N&&null!=(f=T[m]);m++){if(i&&f){h=0,a||f.ownerDocument===p||(d(f),u=!g);while(v=e[h++])if(v(f,a||p,u)){s.push(f);break}c&&(C=E)}n&&((f=!v&&f)&&y--,o&&b.push(f))}if(y+=m,n&&m!==y){h=0;while(v=t[h++])v(b,x,a,u);if(o){if(y>0)while(m--)b[m]||x[m]||(x[m]=L.call(s));x=we(x)}q.apply(s,x),c&&!o&&x.length>0&&y+t.length>1&&oe.uniqueSort(s)}return c&&(C=E,l=w),b};return n?ue(o):o}return u=oe.compile=function(e,t){var n,r=[],i=[],o=k[e+" "];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Te(t[n]))[x]?r.push(o):i.push(o);(o=k(e,Ee(i,r))).selector=e}return o},s=oe.select=function(e,t,n,i){var o,s,l,c,f,d="function"==typeof e&&e,p=!i&&a(e=d.selector||e);if(n=n||[],1===p.length){if((s=p[0]=p[0].slice(0)).length>2&&"ID"===(l=s[0]).type&&9===t.nodeType&&g&&r.relative[s[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;d&&(t=t.parentNode),e=e.slice(s.shift().value.length)}o=X.needsContext.test(e)?0:s.length;while(o--){if(l=s[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),J.test(s[0].type)&&ge(t.parentNode)||t))){if(s.splice(o,1),!(e=i.length&&ye(s)))return q.apply(n,i),n;break}}}return(d||u(e,p))(i,t,!g,n,!t||J.test(e)&&ge(t.parentNode)||t),n},n.sortStable=x.split("").sort(A).join("")===x,n.detectDuplicates=!!f,d(),n.sortDetached=se(function(e){return 1&e.compareDocumentPosition(p.createElement("fieldset"))}),se(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||le("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&se(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||le("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),se(function(e){return null==e.getAttribute("disabled")})||le(H,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);w.find=E,w.expr=E.selectors,w.expr[":"]=w.expr.pseudos,w.uniqueSort=w.unique=E.uniqueSort,w.text=E.getText,w.isXMLDoc=E.isXML,w.contains=E.contains,w.escapeSelector=E.escape;var N=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},k=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},A=w.expr.match.needsContext;function D(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var S=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function L(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):"string"!=typeof t?w.grep(e,function(e){return s.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(L(this,e||[],!1))},not:function(e){return this.pushStack(L(this,e||[],!0))},is:function(e){return!!L(this,"string"==typeof e&&A.test(e)?w(e):e||[],!1).length}});var j,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:q.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),S.test(i[1])&&w.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,j=w(r);var O=/^(?:parents|prev(?:Until|All))/,P={children:!0,contents:!0,next:!0,prev:!0};w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&w.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?w.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?s.call(w(e),this[0]):s.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function H(e,t){while((e=e[t])&&1!==e.nodeType);return e}w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return N(e,"parentNode")},parentsUntil:function(e,t,n){return N(e,"parentNode",n)},next:function(e){return H(e,"nextSibling")},prev:function(e){return H(e,"previousSibling")},nextAll:function(e){return N(e,"nextSibling")},prevAll:function(e){return N(e,"previousSibling")},nextUntil:function(e,t,n){return N(e,"nextSibling",n)},prevUntil:function(e,t,n){return N(e,"previousSibling",n)},siblings:function(e){return k((e.parentNode||{}).firstChild,e)},children:function(e){return k(e.firstChild)},contents:function(e){return D(e,"iframe")?e.contentDocument:(D(e,"template")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=w.filter(r,i)),this.length>1&&(P[e]||w.uniqueSort(i),O.test(e)&&i.reverse()),this.pushStack(i)}});var I=/[^\x20\t\r\n\f]+/g;function R(e){var t={};return w.each(e.match(I)||[],function(e,n){t[n]=!0}),t}w.Callbacks=function(e){e="string"==typeof e?R(e):w.extend({},e);var t,n,r,i,o=[],a=[],u=-1,s=function(){for(i=i||e.once,r=t=!0;a.length;u=-1){n=a.shift();while(++u-1)o.splice(n,1),n<=u&&u--}),this},has:function(e){return e?w.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||s()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function B(e){return e}function M(e){throw e}function W(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.extend({Deferred:function(t){var n=[["notify","progress",w.Callbacks("memory"),w.Callbacks("memory"),2],["resolve","done",w.Callbacks("once memory"),w.Callbacks("once memory"),0,"resolved"],["reject","fail",w.Callbacks("once memory"),w.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},"catch":function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(t){w.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var u=this,s=arguments,l=function(){var e,l;if(!(t=o&&(r!==M&&(u=void 0,s=[e]),n.rejectWith(u,s))}};t?c():(w.Deferred.getStackHook&&(c.stackTrace=w.Deferred.getStackHook()),e.setTimeout(c))}}return w.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:B,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:B)),n[2][3].add(a(0,e,g(r)?r:M))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],u=t[5];i[t[1]]=a.add,u&&a.add(function(){r=u},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=w.Deferred(),u=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&(W(e,a.done(u(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)W(i[n],u(n),a.reject);return a.promise()}});var $=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&$.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},w.readyException=function(t){e.setTimeout(function(){throw t})};var F=w.Deferred();w.fn.ready=function(e){return F.then(e)["catch"](function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||F.resolveWith(r,[w]))}}),w.ready.then=F.then;function z(){r.removeEventListener("DOMContentLoaded",z),e.removeEventListener("load",z),w.ready()}"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener("DOMContentLoaded",z),e.addEventListener("load",z));var _=function(e,t,n,r,i,o,a){var u=0,s=e.length,l=null==n;if("object"===b(n)){i=!0;for(u in n)_(e,t,u,n[u],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(w(e),n)})),t))for(;u1,null,!0)},removeData:function(e){return this.each(function(){J.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=K.get(e,t),n&&(!r||Array.isArray(n)?r=K.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=w.queue(e,t),r=n.length,i=n.shift(),o=w._queueHooks(e,t),a=function(){w.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return K.get(e,n)||K.access(e,n,{empty:w.Callbacks("once memory").add(function(){K.remove(e,[t+"queue",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&D(e,t)?w.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}!function(){var e=r.createDocumentFragment().appendChild(r.createElement("div")),t=r.createElement("input");t.setAttribute("type","radio"),t.setAttribute("checked","checked"),t.setAttribute("name","t"),e.appendChild(t),h.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var xe=r.documentElement,we=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Te=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function Ne(){return!1}function ke(){try{return r.activeElement}catch(e){}}function Ae(e,t,n,r,i,o){var a,u;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(u in t)Ae(e,u,n,r,t[u],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Ne;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,u,s,l,c,f,d,p,h,g,v=K.get(e);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(xe,i),n.guid||(n.guid=w.guid++),(s=v.events)||(s=v.events={}),(a=v.handle)||(a=v.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(I)||[""]).length;while(l--)p=g=(u=Te.exec(t[l])||[])[1],h=(u[2]||"").split(".").sort(),p&&(f=w.event.special[p]||{},p=(i?f.delegateType:f.bindType)||p,f=w.event.special[p]||{},c=w.extend({type:p,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(d=s[p])||((d=s[p]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(p,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?d.splice(d.delegateCount++,0,c):d.push(c),w.event.global[p]=!0)}},remove:function(e,t,n,r,i){var o,a,u,s,l,c,f,d,p,h,g,v=K.hasData(e)&&K.get(e);if(v&&(s=v.events)){l=(t=(t||"").match(I)||[""]).length;while(l--)if(u=Te.exec(t[l])||[],p=g=u[1],h=(u[2]||"").split(".").sort(),p){f=w.event.special[p]||{},d=s[p=(r?f.delegateType:f.bindType)||p]||[],u=u[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=d.length;while(o--)c=d[o],!i&&g!==c.origType||n&&n.guid!==c.guid||u&&!u.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(d.splice(o,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(e,c));a&&!d.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||w.removeEvent(e,p,v.handle),delete s[p])}else for(p in s)w.event.remove(e,p+t[l],n,r,!0);w.isEmptyObject(s)&&K.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,u,s=new Array(arguments.length),l=(K.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(s[0]=t,n=1;n=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&u.push({elem:l,handlers:o})}return l=this,s\x20\t\r\n\f]*)[^>]*)\/>/gi,Se=/\s*$/g;function qe(e,t){return D(e,"table")&&D(11!==t.nodeType?t:t.firstChild,"tr")?w(e).children("tbody")[0]||e:e}function Oe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Pe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function He(e,t){var n,r,i,o,a,u,s,l;if(1===t.nodeType){if(K.hasData(e)&&(o=K.access(e),a=K.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n1&&"string"==typeof v&&!h.checkClone&&Le.test(v))return e.each(function(i){var o=e.eq(i);y&&(t[0]=v.call(this,i,o.html())),Re(o,t,n,r)});if(d&&(i=be(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(s=(u=w.map(ve(i,"script"),Oe)).length;f")},clone:function(e,t,n){var r,i,o,a,u=e.cloneNode(!0),s=w.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(a=ve(u),r=0,i=(o=ve(e)).length;r0&&ye(a,!s&&ve(e,"script")),u},cleanData:function(e){for(var t,n,r,i=w.event.special,o=0;void 0!==(n=e[o]);o++)if(Y(n)){if(t=n[K.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[K.expando]=void 0}n[J.expando]&&(n[J.expando]=void 0)}}}),w.fn.extend({detach:function(e){return Be(this,e,!0)},remove:function(e){return Be(this,e)},text:function(e){return _(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||qe(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=qe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return _(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Se.test(e)&&!ge[(pe.exec(e)||["",""])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n=0&&(s+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-s-u-.5))),s}function et(e,t,n){var r=We(e),i=Fe(e,t,r),o="border-box"===w.css(e,"boxSizing",!1,r),a=o;if(Me.test(i)){if(!n)return i;i="auto"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===w.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?"border":"content"),a,r,i)+"px"}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,u=Q(t),s=Ue.test(t),l=e.style;if(s||(t=Ke(u)),a=w.cssHooks[t]||w.cssHooks[u],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(w.cssNumber[u]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(s?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,u=Q(t);return Ue.test(t)||(t=Ke(u)),(a=w.cssHooks[t]||w.cssHooks[u])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),"normal"===i&&t in Xe&&(i=Xe[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),w.each(["height","width"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!_e.test(w.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):ue(e,Ve,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=We(e),a="border-box"===w.css(e,"boxSizing",!1,o),u=r&&Ze(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(u-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,"border",!1,o)-.5)),u&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=w.css(e,t)),Je(e,n,u)}}}),w.cssHooks.marginLeft=ze(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,"marginLeft"))||e.getBoundingClientRect().left-ue(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),w.each({margin:"",padding:"",border:"Width"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(w.cssHooks[e+t].set=Je)}),w.fn.extend({css:function(e,t){return _(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=We(e),i=t.length;a1)}}),w.fn.delay=function(t,n){return t=w.fx?w.fx.speeds[t]||t:t,n=n||"fx",this.queue(n,function(n,r){var i=e.setTimeout(n,t);r.stop=function(){e.clearTimeout(i)}})},function(){var e=r.createElement("input"),t=r.createElement("select").appendChild(r.createElement("option"));e.type="checkbox",h.checkOn=""!==e.value,h.optSelected=t.selected,(e=r.createElement("input")).value="t",e.type="radio",h.radioValue="t"===e.value}();var tt,nt=w.expr.attrHandle;w.fn.extend({attr:function(e,t){return _(this,w.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?w.prop(e,t,n):(1===o&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?tt:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&"radio"===t&&D(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(I);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),tt={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\w+/g),function(e,t){var n=nt[t]||w.find.attr;nt[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=nt[a],nt[a]=i,i=null!=n(e,t,r)?a:null,nt[a]=o),i}});var rt=/^(?:input|select|textarea|button)$/i,it=/^(?:a|area)$/i;w.fn.extend({prop:function(e,t){return _(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,"tabindex");return t?parseInt(t,10):rt.test(e.nodeName)||it.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),h.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){w.propFix[this.toLowerCase()]=this});function ot(e){return(e.match(I)||[]).join(" ")}function at(e){return e.getAttribute&&e.getAttribute("class")||""}function ut(e){return Array.isArray(e)?e:"string"==typeof e?e.match(I)||[]:[]}w.fn.extend({addClass:function(e){var t,n,r,i,o,a,u,s=0;if(g(e))return this.each(function(t){w(this).addClass(e.call(this,t,at(this)))});if((t=ut(e)).length)while(n=this[s++])if(i=at(n),r=1===n.nodeType&&" "+ot(i)+" "){a=0;while(o=t[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(u=ot(r))&&n.setAttribute("class",u)}return this},removeClass:function(e){var t,n,r,i,o,a,u,s=0;if(g(e))return this.each(function(t){w(this).removeClass(e.call(this,t,at(this)))});if(!arguments.length)return this.attr("class","");if((t=ut(e)).length)while(n=this[s++])if(i=at(n),r=1===n.nodeType&&" "+ot(i)+" "){a=0;while(o=t[a++])while(r.indexOf(" "+o+" ")>-1)r=r.replace(" "+o+" "," ");i!==(u=ot(r))&&n.setAttribute("class",u)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,at(this),t),t)}):this.each(function(){var t,i,o,a;if(r){i=0,o=w(this),a=ut(e);while(t=a[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else void 0!==e&&"boolean"!==n||((t=at(this))&&K.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":K.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&(" "+ot(at(n))+" ").indexOf(t)>-1)return!0;return!1}});var st=/\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?"":e+""})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(st,""):null==n?"":n}}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,"value");return null!=t?t:ot(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,u=a?null:[],s=a?o+1:i.length;for(r=o<0?s:a?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),w.each(["radio","checkbox"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},h.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),h.focusin="onfocusin"in e;var lt=/^(?:focusinfocus|focusoutblur)$/,ct=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(t,n,i,o){var a,u,s,l,c,d,p,h,y=[i||r],m=f.call(t,"type")?t.type:t,b=f.call(t,"namespace")?t.namespace.split("."):[];if(u=h=s=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!lt.test(m+w.event.triggered)&&(m.indexOf(".")>-1&&(m=(b=m.split(".")).shift(),b.sort()),c=m.indexOf(":")<0&&"on"+m,t=t[w.expando]?t:new w.Event(m,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=b.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+b.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:w.makeArray(n,[t]),p=w.event.special[m]||{},o||!p.trigger||!1!==p.trigger.apply(i,n))){if(!o&&!p.noBubble&&!v(i)){for(l=p.delegateType||m,lt.test(l+m)||(u=u.parentNode);u;u=u.parentNode)y.push(u),s=u;s===(i.ownerDocument||r)&&y.push(s.defaultView||s.parentWindow||e)}a=0;while((u=y[a++])&&!t.isPropagationStopped())h=u,t.type=a>1?l:p.bindType||m,(d=(K.get(u,"events")||{})[t.type]&&K.get(u,"handle"))&&d.apply(u,n),(d=c&&u[c])&&d.apply&&Y(u)&&(t.result=d.apply(u,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||p._default&&!1!==p._default.apply(y.pop(),n)||!Y(i)||c&&g(i[m])&&!v(i)&&((s=i[c])&&(i[c]=null),w.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,ct),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,ct),w.event.triggered=void 0,s&&(i[c]=s)),t.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),h.focusin||w.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=K.access(r,t);i||r.addEventListener(e,n,!0),K.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=K.access(r,t)-1;i?K.access(r,t,i):(r.removeEventListener(e,n,!0),K.remove(r,t))}}});var ft=/\[\]$/,dt=/\r?\n/g,pt=/^(?:submit|button|image|reset|file)$/i,ht=/^(?:input|select|textarea|keygen)/i;function gt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||ft.test(e)?r(e,i):gt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==b(t))r(e,t);else for(i in t)gt(e+"["+i+"]",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)gt(n,e[n],t,i);return r.join("&")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,"elements");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(":disabled")&&ht.test(this.nodeName)&&!pt.test(e)&&(this.checked||!de.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(dt,"\r\n")}}):{name:t.name,value:n.replace(dt,"\r\n")}}).get()}}),w.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},h.createHTMLDocument=function(){var e=r.implementation.createHTMLDocument("").body;return e.innerHTML="

",2===e.childNodes.length}(),w.parseHTML=function(e,t,n){if("string"!=typeof e)return[];"boolean"==typeof t&&(n=t,t=!1);var i,o,a;return t||(h.createHTMLDocument?((i=(t=r.implementation.createHTMLDocument("")).createElement("base")).href=r.location.href,t.head.appendChild(i)):t=r),o=S.exec(e),a=!n&&[],o?[t.createElement(o[1])]:(o=be([e],t,a),a&&a.length&&w(a).remove(),w.merge([],o.childNodes))},w.offset={setOffset:function(e,t,n){var r,i,o,a,u,s,l,c=w.css(e,"position"),f=w(e),d={};"static"===c&&(e.style.position="relative"),u=f.offset(),o=w.css(e,"top"),s=w.css(e,"left"),(l=("absolute"===c||"fixed"===c)&&(o+s).indexOf("auto")>-1)?(a=(r=f.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(s)||0),g(t)&&(t=t.call(e,n,w.extend({},u))),null!=t.top&&(d.top=t.top-u.top+a),null!=t.left&&(d.left=t.left-u.left+i),"using"in t?t.using.call(e,d):f.css(d)}},w.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){w.offset.setOffset(this,e,t)});var t,n,r=this[0];if(r)return r.getClientRects().length?(t=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:t.top+n.pageYOffset,left:t.left+n.pageXOffset}):{top:0,left:0}},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===w.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===w.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=w(e).offset()).top+=w.css(e,"borderTopWidth",!0),i.left+=w.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-w.css(r,"marginTop",!0),left:t.left-i.left-w.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===w.css(e,"position"))e=e.offsetParent;return e||xe})}}),w.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n="pageYOffset"===t;w.fn[e]=function(r){return _(this,function(e,r,i){var o;if(v(e)?o=e:9===e.nodeType&&(o=e.defaultView),void 0===i)return o?o[t]:e[r];o?o.scrollTo(n?o.pageXOffset:i,n?i:o.pageYOffset):e[r]=i},e,r,arguments.length)}}),w.each(["top","left"],function(e,t){w.cssHooks[t]=ze(h.pixelPosition,function(e,n){if(n)return n=Fe(e,t),Me.test(n)?w(e).position()[t]+"px":n})}),w.each({Height:"height",Width:"width"},function(e,t){w.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){w.fn[r]=function(i,o){var a=arguments.length&&(n||"boolean"!=typeof i),u=n||(!0===i||!0===o?"margin":"border");return _(this,function(t,n,i){var o;return v(t)?0===r.indexOf("outer")?t["inner"+e]:t.document.documentElement["client"+e]:9===t.nodeType?(o=t.documentElement,Math.max(t.body["scroll"+e],o["scroll"+e],t.body["offset"+e],o["offset"+e],o["client"+e])):void 0===i?w.css(t,n,u):w.style(t,n,i,u)},t,a?i:void 0,a)}})}),w.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,t){w.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),w.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),w.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),w.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),g(e))return r=o.call(arguments,2),i=function(){return e.apply(t||this,r.concat(o.call(arguments)))},i.guid=e.guid=e.guid||w.guid++,i},w.holdReady=function(e){e?w.readyWait++:w.ready(!0)},w.isArray=Array.isArray,w.parseJSON=JSON.parse,w.nodeName=D,w.isFunction=g,w.isWindow=v,w.camelCase=Q,w.type=b,w.now=Date.now,w.isNumeric=function(e){var t=w.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},"function"==typeof define&&define.amd&&define("jquery",[],function(){return w});var vt=e.jQuery,yt=e.$;return w.noConflict=function(t){return e.$===w&&(e.$=yt),t&&e.jQuery===w&&(e.jQuery=vt),w},t||(e.jQuery=e.$=w),w}); diff --git a/ui/shared/vendor/lodash/lodash.min.js b/ui/shared/vendor/lodash/lodash.min.js new file mode 100644 index 00000000..c9112634 --- /dev/null +++ b/ui/shared/vendor/lodash/lodash.min.js @@ -0,0 +1,137 @@ +/** + * @license + * Lodash lodash.com/license | Underscore.js 1.8.3 underscorejs.org/LICENSE + */ +;(function(){function n(n,t,r){switch(r.length){case 0:return n.call(t);case 1:return n.call(t,r[0]);case 2:return n.call(t,r[0],r[1]);case 3:return n.call(t,r[0],r[1],r[2])}return n.apply(t,r)}function t(n,t,r,e){for(var u=-1,i=null==n?0:n.length;++u"']/g,G=RegExp(V.source),H=RegExp(K.source),J=/<%-([\s\S]+?)%>/g,Y=/<%([\s\S]+?)%>/g,Q=/<%=([\s\S]+?)%>/g,X=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,nn=/^\w*$/,tn=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,rn=/[\\^$.*+?()[\]{}|]/g,en=RegExp(rn.source),un=/^\s+|\s+$/g,on=/^\s+/,fn=/\s+$/,cn=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,an=/\{\n\/\* \[wrapped with (.+)\] \*/,ln=/,? & /,sn=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,hn=/\\(\\)?/g,pn=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,_n=/\w*$/,vn=/^[-+]0x[0-9a-f]+$/i,gn=/^0b[01]+$/i,dn=/^\[object .+?Constructor\]$/,yn=/^0o[0-7]+$/i,bn=/^(?:0|[1-9]\d*)$/,xn=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,jn=/($^)/,wn=/['\n\r\u2028\u2029\\]/g,mn="[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?(?:\\u200d(?:[^\\ud800-\\udfff]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?)*",An="(?:[\\u2700-\\u27bf]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])"+mn,kn="(?:[^\\ud800-\\udfff][\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]?|[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\ud800-\\udfff])",En=RegExp("['\u2019]","g"),Sn=RegExp("[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]","g"),On=RegExp("\\ud83c[\\udffb-\\udfff](?=\\ud83c[\\udffb-\\udfff])|"+kn+mn,"g"),In=RegExp(["[A-Z\\xc0-\\xd6\\xd8-\\xde]?[a-z\\xdf-\\xf6\\xf8-\\xff]+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?=[\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000]|[A-Z\\xc0-\\xd6\\xd8-\\xde]|$)|(?:[A-Z\\xc0-\\xd6\\xd8-\\xde]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?=[\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000]|[A-Z\\xc0-\\xd6\\xd8-\\xde](?:[a-z\\xdf-\\xf6\\xf8-\\xff]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])|$)|[A-Z\\xc0-\\xd6\\xd8-\\xde]?(?:[a-z\\xdf-\\xf6\\xf8-\\xff]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+(?:['\u2019](?:d|ll|m|re|s|t|ve))?|[A-Z\\xc0-\\xd6\\xd8-\\xde]+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?|\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])|\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])|\\d+",An].join("|"),"g"),Rn=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]"),zn=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Wn="Array Buffer DataView Date Error Float32Array Float64Array Function Int8Array Int16Array Int32Array Map Math Object Promise RegExp Set String Symbol TypeError Uint8Array Uint8ClampedArray Uint16Array Uint32Array WeakMap _ clearTimeout isFinite parseInt setTimeout".split(" "),Un={}; +Un["[object Float32Array]"]=Un["[object Float64Array]"]=Un["[object Int8Array]"]=Un["[object Int16Array]"]=Un["[object Int32Array]"]=Un["[object Uint8Array]"]=Un["[object Uint8ClampedArray]"]=Un["[object Uint16Array]"]=Un["[object Uint32Array]"]=true,Un["[object Arguments]"]=Un["[object Array]"]=Un["[object ArrayBuffer]"]=Un["[object Boolean]"]=Un["[object DataView]"]=Un["[object Date]"]=Un["[object Error]"]=Un["[object Function]"]=Un["[object Map]"]=Un["[object Number]"]=Un["[object Object]"]=Un["[object RegExp]"]=Un["[object Set]"]=Un["[object String]"]=Un["[object WeakMap]"]=false; +var Bn={};Bn["[object Arguments]"]=Bn["[object Array]"]=Bn["[object ArrayBuffer]"]=Bn["[object DataView]"]=Bn["[object Boolean]"]=Bn["[object Date]"]=Bn["[object Float32Array]"]=Bn["[object Float64Array]"]=Bn["[object Int8Array]"]=Bn["[object Int16Array]"]=Bn["[object Int32Array]"]=Bn["[object Map]"]=Bn["[object Number]"]=Bn["[object Object]"]=Bn["[object RegExp]"]=Bn["[object Set]"]=Bn["[object String]"]=Bn["[object Symbol]"]=Bn["[object Uint8Array]"]=Bn["[object Uint8ClampedArray]"]=Bn["[object Uint16Array]"]=Bn["[object Uint32Array]"]=true, +Bn["[object Error]"]=Bn["[object Function]"]=Bn["[object WeakMap]"]=false;var Ln={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Cn=parseFloat,Dn=parseInt,Mn=typeof global=="object"&&global&&global.Object===Object&&global,Tn=typeof self=="object"&&self&&self.Object===Object&&self,$n=Mn||Tn||Function("return this")(),Fn=typeof exports=="object"&&exports&&!exports.nodeType&&exports,Nn=Fn&&typeof module=="object"&&module&&!module.nodeType&&module,Pn=Nn&&Nn.exports===Fn,Zn=Pn&&Mn.process,qn=function(){ +try{var n=Nn&&Nn.require&&Nn.require("util").types;return n?n:Zn&&Zn.binding&&Zn.binding("util")}catch(n){}}(),Vn=qn&&qn.isArrayBuffer,Kn=qn&&qn.isDate,Gn=qn&&qn.isMap,Hn=qn&&qn.isRegExp,Jn=qn&&qn.isSet,Yn=qn&&qn.isTypedArray,Qn=b("length"),Xn=x({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e", +"\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a", +"\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I", +"\u0129":"i","\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r", +"\u0159":"r","\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ", +"\u0133":"ij","\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"}),nt=x({"&":"&","<":"<",">":">",'"':""","'":"'"}),tt=x({"&":"&","<":"<",">":">",""":'"',"'":"'"}),rt=function x(mn){function An(n){if(yu(n)&&!ff(n)&&!(n instanceof Ln)){if(n instanceof On)return n;if(oi.call(n,"__wrapped__"))return Fe(n)}return new On(n)}function kn(){}function On(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=T}function Ln(n){ +this.__wrapped__=n,this.__actions__=[],this.__dir__=1,this.__filtered__=false,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Mn(n){var t=-1,r=null==n?0:n.length;for(this.clear();++t=t?n:t)),n}function _t(n,t,e,u,i,o){var f,c=1&t,a=2&t,l=4&t;if(e&&(f=i?e(n,u,i,o):e(n)),f!==T)return f;if(!du(n))return n;if(u=ff(n)){if(f=me(n),!c)return Lr(n,f)}else{var s=vo(n),h="[object Function]"==s||"[object GeneratorFunction]"==s;if(af(n))return Ir(n,c);if("[object Object]"==s||"[object Arguments]"==s||h&&!i){if(f=a||h?{}:Ae(n),!c)return a?Mr(n,lt(f,n)):Dr(n,at(f,n))}else{if(!Bn[s])return i?n:{};f=ke(n,s,c)}}if(o||(o=new Zn), +i=o.get(n))return i;if(o.set(n,f),pf(n))return n.forEach(function(r){f.add(_t(r,t,e,r,n,o))}),f;if(sf(n))return n.forEach(function(r,u){f.set(u,_t(r,t,e,u,n,o))}),f;var a=l?a?ve:_e:a?Uu:Wu,p=u?T:a(n);return r(p||n,function(r,u){p&&(u=r,r=n[u]),ot(f,u,_t(r,t,e,u,n,o))}),f}function vt(n){var t=Wu(n);return function(r){return gt(r,n,t)}}function gt(n,t,r){var e=r.length;if(null==n)return!e;for(n=Qu(n);e--;){var u=r[e],i=t[u],o=n[u];if(o===T&&!(u in n)||!i(o))return false}return true}function dt(n,t,r){if(typeof n!="function")throw new ti("Expected a function"); +return bo(function(){n.apply(T,r)},t)}function yt(n,t,r,e){var u=-1,i=o,a=true,l=n.length,s=[],h=t.length;if(!l)return s;r&&(t=c(t,E(r))),e?(i=f,a=false):200<=t.length&&(i=O,a=false,t=new Nn(t));n:for(;++ut}function Rt(n,t){return null!=n&&oi.call(n,t)}function zt(n,t){return null!=n&&t in Qu(n)}function Wt(n,t,r){for(var e=r?f:o,u=n[0].length,i=n.length,a=i,l=Ku(i),s=1/0,h=[];a--;){var p=n[a];a&&t&&(p=c(p,E(t))),s=Ci(p.length,s), +l[a]=!r&&(t||120<=u&&120<=p.length)?new Nn(a&&p):T}var p=n[0],_=-1,v=l[0];n:for(;++_r.length?t:Et(t,hr(r,0,-1)),r=null==t?t:t[Me(Ve(r))],null==r?T:n(r,t,e)}function Lt(n){return yu(n)&&"[object Arguments]"==Ot(n)}function Ct(n){ +return yu(n)&&"[object ArrayBuffer]"==Ot(n)}function Dt(n){return yu(n)&&"[object Date]"==Ot(n)}function Mt(n,t,r,e,u){if(n===t)return true;if(null==n||null==t||!yu(n)&&!yu(t))return n!==n&&t!==t;n:{var i=ff(n),o=ff(t),f=i?"[object Array]":vo(n),c=o?"[object Array]":vo(t),f="[object Arguments]"==f?"[object Object]":f,c="[object Arguments]"==c?"[object Object]":c,a="[object Object]"==f,o="[object Object]"==c;if((c=f==c)&&af(n)){if(!af(t)){t=false;break n}i=true,a=false}if(c&&!a)u||(u=new Zn),t=i||_f(n)?se(n,t,r,e,Mt,u):he(n,t,f,r,e,Mt,u);else{ +if(!(1&r)&&(i=a&&oi.call(n,"__wrapped__"),f=o&&oi.call(t,"__wrapped__"),i||f)){n=i?n.value():n,t=f?t.value():t,u||(u=new Zn),t=Mt(n,t,r,e,u);break n}if(c)t:if(u||(u=new Zn),i=1&r,f=_e(n),o=f.length,c=_e(t).length,o==c||i){for(a=o;a--;){var l=f[a];if(!(i?l in t:oi.call(t,l))){t=false;break t}}if((c=u.get(n))&&u.get(t))t=c==t;else{c=true,u.set(n,t),u.set(t,n);for(var s=i;++at?r:0,Se(t,r)?n[t]:T}function Xt(n,t,r){var e=-1;return t=c(t.length?t:[$u],E(ye())),n=Gt(n,function(n,r,u){return{a:c(t,function(t){return t(n)}), +b:++e,c:n}}),w(n,function(n,t){var e;n:{e=-1;for(var u=n.a,i=t.a,o=u.length,f=r.length;++e=f){e=c;break n}e=c*("desc"==r[e]?-1:1);break n}}e=n.b-t.b}return e})}function nr(n,t){return tr(n,t,function(t,r){return zu(n,r)})}function tr(n,t,r){for(var e=-1,u=t.length,i={};++et||9007199254740991t&&(t=-t>u?0:u+t),r=r>u?u:r,0>r&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0,r=Ku(u);++e=u){for(;e>>1,o=n[i];null!==o&&!wu(o)&&(r?o<=t:ot.length?n:Et(n,hr(t,0,-1)),null==n||delete n[Me(Ve(t))]}function jr(n,t,r,e){for(var u=n.length,i=e?u:-1;(e?i--:++ie)return e?br(n[0]):[];for(var u=-1,i=Ku(e);++u=e?n:hr(n,t,r)}function Ir(n,t){if(t)return n.slice();var r=n.length,r=gi?gi(r):new n.constructor(r);return n.copy(r),r}function Rr(n){var t=new n.constructor(n.byteLength);return new vi(t).set(new vi(n)),t}function zr(n,t){return new n.constructor(t?Rr(n.buffer):n.buffer,n.byteOffset,n.length); +}function Wr(n,t){if(n!==t){var r=n!==T,e=null===n,u=n===n,i=wu(n),o=t!==T,f=null===t,c=t===t,a=wu(t);if(!f&&!a&&!i&&n>t||i&&o&&c&&!f&&!a||e&&o&&c||!r&&c||!u)return 1;if(!e&&!i&&!a&&nu?T:i,u=1),t=Qu(t);++eo&&f[0]!==a&&f[o-1]!==a?[]:B(f,a),o-=c.length,or?r?or(t,n):t:(r=or(t,Oi(n/D(t))),Rn.test(t)?Or(M(r),0,n).join(""):r.slice(0,n))}function te(t,r,e,u){function i(){for(var r=-1,c=arguments.length,a=-1,l=u.length,s=Ku(l+c),h=this&&this!==$n&&this instanceof i?f:t;++at||e)&&(1&n&&(i[2]=h[2],t|=1&r?0:4),(r=h[3])&&(e=i[3],i[3]=e?Ur(e,r,h[4]):r,i[4]=e?B(i[3],"__lodash_placeholder__"):h[4]),(r=h[5])&&(e=i[5],i[5]=e?Br(e,r,h[6]):r,i[6]=e?B(i[5],"__lodash_placeholder__"):h[6]),(r=h[7])&&(i[7]=r),128&n&&(i[8]=null==i[8]?h[8]:Ci(i[8],h[8])),null==i[9]&&(i[9]=h[9]),i[0]=h[0],i[1]=t),n=i[0],t=i[1], +r=i[2],e=i[3],u=i[4],f=i[9]=i[9]===T?c?0:n.length:Li(i[9]-a,0),!f&&24&t&&(t&=-25),c=t&&1!=t?8==t||16==t?Kr(n,t,f):32!=t&&33!=t||u.length?Jr.apply(T,i):te(n,t,r,e):Pr(n,t,r),Le((h?co:yo)(c,i),n,t)}function ce(n,t,r,e){return n===T||lu(n,ei[r])&&!oi.call(e,r)?t:n}function ae(n,t,r,e,u,i){return du(n)&&du(t)&&(i.set(t,n),Yt(n,t,T,ae,i),i.delete(t)),n}function le(n){return xu(n)?T:n}function se(n,t,r,e,u,i){var o=1&r,f=n.length,c=t.length;if(f!=c&&!(o&&c>f))return false;if((c=i.get(n))&&i.get(t))return c==t; +var c=-1,a=true,l=2&r?new Nn:T;for(i.set(n,t),i.set(t,n);++cr&&(r=Li(e+r,0)),_(n,ye(t,3),r)):-1}function Pe(n,t,r){var e=null==n?0:n.length;if(!e)return-1;var u=e-1;return r!==T&&(u=ku(r),u=0>r?Li(e+u,0):Ci(u,e-1)),_(n,ye(t,3),u,true)}function Ze(n){return(null==n?0:n.length)?wt(n,1):[]; +}function qe(n){return n&&n.length?n[0]:T}function Ve(n){var t=null==n?0:n.length;return t?n[t-1]:T}function Ke(n,t){return n&&n.length&&t&&t.length?er(n,t):n}function Ge(n){return null==n?n:$i.call(n)}function He(n){if(!n||!n.length)return[];var t=0;return n=i(n,function(n){if(hu(n))return t=Li(n.length,t),true}),A(t,function(t){return c(n,b(t))})}function Je(t,r){if(!t||!t.length)return[];var e=He(t);return null==r?e:c(e,function(t){return n(r,T,t)})}function Ye(n){return n=An(n),n.__chain__=true,n; +}function Qe(n,t){return t(n)}function Xe(){return this}function nu(n,t){return(ff(n)?r:uo)(n,ye(t,3))}function tu(n,t){return(ff(n)?e:io)(n,ye(t,3))}function ru(n,t){return(ff(n)?c:Gt)(n,ye(t,3))}function eu(n,t,r){return t=r?T:t,t=n&&null==t?n.length:t,fe(n,128,T,T,T,T,t)}function uu(n,t){var r;if(typeof t!="function")throw new ti("Expected a function");return n=ku(n),function(){return 0<--n&&(r=t.apply(this,arguments)),1>=n&&(t=T),r}}function iu(n,t,r){return t=r?T:t,n=fe(n,8,T,T,T,T,T,t),n.placeholder=iu.placeholder, +n}function ou(n,t,r){return t=r?T:t,n=fe(n,16,T,T,T,T,T,t),n.placeholder=ou.placeholder,n}function fu(n,t,r){function e(t){var r=c,e=a;return c=a=T,_=t,s=n.apply(e,r)}function u(n){var r=n-p;return n-=_,p===T||r>=t||0>r||g&&n>=l}function i(){var n=Go();if(u(n))return o(n);var r,e=bo;r=n-_,n=t-(n-p),r=g?Ci(n,l-r):n,h=e(i,r)}function o(n){return h=T,d&&c?e(n):(c=a=T,s)}function f(){var n=Go(),r=u(n);if(c=arguments,a=this,p=n,r){if(h===T)return _=n=p,h=bo(i,t),v?e(n):s;if(g)return h=bo(i,t),e(p)}return h===T&&(h=bo(i,t)), +s}var c,a,l,s,h,p,_=0,v=false,g=false,d=true;if(typeof n!="function")throw new ti("Expected a function");return t=Su(t)||0,du(r)&&(v=!!r.leading,l=(g="maxWait"in r)?Li(Su(r.maxWait)||0,t):l,d="trailing"in r?!!r.trailing:d),f.cancel=function(){h!==T&&lo(h),_=0,c=p=a=h=T},f.flush=function(){return h===T?s:o(Go())},f}function cu(n,t){if(typeof n!="function"||null!=t&&typeof t!="function")throw new ti("Expected a function");var r=function(){var e=arguments,u=t?t.apply(this,e):e[0],i=r.cache;return i.has(u)?i.get(u):(e=n.apply(this,e), +r.cache=i.set(u,e)||i,e)};return r.cache=new(cu.Cache||Fn),r}function au(n){if(typeof n!="function")throw new ti("Expected a function");return function(){var t=arguments;switch(t.length){case 0:return!n.call(this);case 1:return!n.call(this,t[0]);case 2:return!n.call(this,t[0],t[1]);case 3:return!n.call(this,t[0],t[1],t[2])}return!n.apply(this,t)}}function lu(n,t){return n===t||n!==n&&t!==t}function su(n){return null!=n&&gu(n.length)&&!_u(n)}function hu(n){return yu(n)&&su(n)}function pu(n){if(!yu(n))return false; +var t=Ot(n);return"[object Error]"==t||"[object DOMException]"==t||typeof n.message=="string"&&typeof n.name=="string"&&!xu(n)}function _u(n){return!!du(n)&&(n=Ot(n),"[object Function]"==n||"[object GeneratorFunction]"==n||"[object AsyncFunction]"==n||"[object Proxy]"==n)}function vu(n){return typeof n=="number"&&n==ku(n)}function gu(n){return typeof n=="number"&&-1=n}function du(n){var t=typeof n;return null!=n&&("object"==t||"function"==t)}function yu(n){return null!=n&&typeof n=="object"; +}function bu(n){return typeof n=="number"||yu(n)&&"[object Number]"==Ot(n)}function xu(n){return!(!yu(n)||"[object Object]"!=Ot(n))&&(n=di(n),null===n||(n=oi.call(n,"constructor")&&n.constructor,typeof n=="function"&&n instanceof n&&ii.call(n)==li))}function ju(n){return typeof n=="string"||!ff(n)&&yu(n)&&"[object String]"==Ot(n)}function wu(n){return typeof n=="symbol"||yu(n)&&"[object Symbol]"==Ot(n)}function mu(n){if(!n)return[];if(su(n))return ju(n)?M(n):Lr(n);if(wi&&n[wi]){n=n[wi]();for(var t,r=[];!(t=n.next()).done;)r.push(t.value); +return r}return t=vo(n),("[object Map]"==t?W:"[object Set]"==t?L:Lu)(n)}function Au(n){return n?(n=Su(n),n===$||n===-$?1.7976931348623157e308*(0>n?-1:1):n===n?n:0):0===n?n:0}function ku(n){n=Au(n);var t=n%1;return n===n?t?n-t:n:0}function Eu(n){return n?pt(ku(n),0,4294967295):0}function Su(n){if(typeof n=="number")return n;if(wu(n))return F;if(du(n)&&(n=typeof n.valueOf=="function"?n.valueOf():n,n=du(n)?n+"":n),typeof n!="string")return 0===n?n:+n;n=n.replace(un,"");var t=gn.test(n);return t||yn.test(n)?Dn(n.slice(2),t?2:8):vn.test(n)?F:+n; +}function Ou(n){return Cr(n,Uu(n))}function Iu(n){return null==n?"":yr(n)}function Ru(n,t,r){return n=null==n?T:Et(n,t),n===T?r:n}function zu(n,t){return null!=n&&we(n,t,zt)}function Wu(n){return su(n)?qn(n):Vt(n)}function Uu(n){if(su(n))n=qn(n,true);else if(du(n)){var t,r=ze(n),e=[];for(t in n)("constructor"!=t||!r&&oi.call(n,t))&&e.push(t);n=e}else{if(t=[],null!=n)for(r in Qu(n))t.push(r);n=t}return n}function Bu(n,t){if(null==n)return{};var r=c(ve(n),function(n){return[n]});return t=ye(t),tr(n,r,function(n,r){ +return t(n,r[0])})}function Lu(n){return null==n?[]:S(n,Wu(n))}function Cu(n){return $f(Iu(n).toLowerCase())}function Du(n){return(n=Iu(n))&&n.replace(xn,Xn).replace(Sn,"")}function Mu(n,t,r){return n=Iu(n),t=r?T:t,t===T?zn.test(n)?n.match(In)||[]:n.match(sn)||[]:n.match(t)||[]}function Tu(n){return function(){return n}}function $u(n){return n}function Fu(n){return qt(typeof n=="function"?n:_t(n,1))}function Nu(n,t,e){var u=Wu(t),i=kt(t,u);null!=e||du(t)&&(i.length||!u.length)||(e=t,t=n,n=this,i=kt(t,Wu(t))); +var o=!(du(e)&&"chain"in e&&!e.chain),f=_u(n);return r(i,function(r){var e=t[r];n[r]=e,f&&(n.prototype[r]=function(){var t=this.__chain__;if(o||t){var r=n(this.__wrapped__);return(r.__actions__=Lr(this.__actions__)).push({func:e,args:arguments,thisArg:n}),r.__chain__=t,r}return e.apply(n,a([this.value()],arguments))})}),n}function Pu(){}function Zu(n){return Ie(n)?b(Me(n)):rr(n)}function qu(){return[]}function Vu(){return false}mn=null==mn?$n:rt.defaults($n.Object(),mn,rt.pick($n,Wn));var Ku=mn.Array,Gu=mn.Date,Hu=mn.Error,Ju=mn.Function,Yu=mn.Math,Qu=mn.Object,Xu=mn.RegExp,ni=mn.String,ti=mn.TypeError,ri=Ku.prototype,ei=Qu.prototype,ui=mn["__core-js_shared__"],ii=Ju.prototype.toString,oi=ei.hasOwnProperty,fi=0,ci=function(){ +var n=/[^.]+$/.exec(ui&&ui.keys&&ui.keys.IE_PROTO||"");return n?"Symbol(src)_1."+n:""}(),ai=ei.toString,li=ii.call(Qu),si=$n._,hi=Xu("^"+ii.call(oi).replace(rn,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),pi=Pn?mn.Buffer:T,_i=mn.Symbol,vi=mn.Uint8Array,gi=pi?pi.allocUnsafe:T,di=U(Qu.getPrototypeOf,Qu),yi=Qu.create,bi=ei.propertyIsEnumerable,xi=ri.splice,ji=_i?_i.isConcatSpreadable:T,wi=_i?_i.iterator:T,mi=_i?_i.toStringTag:T,Ai=function(){try{var n=je(Qu,"defineProperty"); +return n({},"",{}),n}catch(n){}}(),ki=mn.clearTimeout!==$n.clearTimeout&&mn.clearTimeout,Ei=Gu&&Gu.now!==$n.Date.now&&Gu.now,Si=mn.setTimeout!==$n.setTimeout&&mn.setTimeout,Oi=Yu.ceil,Ii=Yu.floor,Ri=Qu.getOwnPropertySymbols,zi=pi?pi.isBuffer:T,Wi=mn.isFinite,Ui=ri.join,Bi=U(Qu.keys,Qu),Li=Yu.max,Ci=Yu.min,Di=Gu.now,Mi=mn.parseInt,Ti=Yu.random,$i=ri.reverse,Fi=je(mn,"DataView"),Ni=je(mn,"Map"),Pi=je(mn,"Promise"),Zi=je(mn,"Set"),qi=je(mn,"WeakMap"),Vi=je(Qu,"create"),Ki=qi&&new qi,Gi={},Hi=Te(Fi),Ji=Te(Ni),Yi=Te(Pi),Qi=Te(Zi),Xi=Te(qi),no=_i?_i.prototype:T,to=no?no.valueOf:T,ro=no?no.toString:T,eo=function(){ +function n(){}return function(t){return du(t)?yi?yi(t):(n.prototype=t,t=new n,n.prototype=T,t):{}}}();An.templateSettings={escape:J,evaluate:Y,interpolate:Q,variable:"",imports:{_:An}},An.prototype=kn.prototype,An.prototype.constructor=An,On.prototype=eo(kn.prototype),On.prototype.constructor=On,Ln.prototype=eo(kn.prototype),Ln.prototype.constructor=Ln,Mn.prototype.clear=function(){this.__data__=Vi?Vi(null):{},this.size=0},Mn.prototype.delete=function(n){return n=this.has(n)&&delete this.__data__[n], +this.size-=n?1:0,n},Mn.prototype.get=function(n){var t=this.__data__;return Vi?(n=t[n],"__lodash_hash_undefined__"===n?T:n):oi.call(t,n)?t[n]:T},Mn.prototype.has=function(n){var t=this.__data__;return Vi?t[n]!==T:oi.call(t,n)},Mn.prototype.set=function(n,t){var r=this.__data__;return this.size+=this.has(n)?0:1,r[n]=Vi&&t===T?"__lodash_hash_undefined__":t,this},Tn.prototype.clear=function(){this.__data__=[],this.size=0},Tn.prototype.delete=function(n){var t=this.__data__;return n=ft(t,n),!(0>n)&&(n==t.length-1?t.pop():xi.call(t,n,1), +--this.size,true)},Tn.prototype.get=function(n){var t=this.__data__;return n=ft(t,n),0>n?T:t[n][1]},Tn.prototype.has=function(n){return-1e?(++this.size,r.push([n,t])):r[e][1]=t,this},Fn.prototype.clear=function(){this.size=0,this.__data__={hash:new Mn,map:new(Ni||Tn),string:new Mn}},Fn.prototype.delete=function(n){return n=be(this,n).delete(n),this.size-=n?1:0,n},Fn.prototype.get=function(n){return be(this,n).get(n); +},Fn.prototype.has=function(n){return be(this,n).has(n)},Fn.prototype.set=function(n,t){var r=be(this,n),e=r.size;return r.set(n,t),this.size+=r.size==e?0:1,this},Nn.prototype.add=Nn.prototype.push=function(n){return this.__data__.set(n,"__lodash_hash_undefined__"),this},Nn.prototype.has=function(n){return this.__data__.has(n)},Zn.prototype.clear=function(){this.__data__=new Tn,this.size=0},Zn.prototype.delete=function(n){var t=this.__data__;return n=t.delete(n),this.size=t.size,n},Zn.prototype.get=function(n){ +return this.__data__.get(n)},Zn.prototype.has=function(n){return this.__data__.has(n)},Zn.prototype.set=function(n,t){var r=this.__data__;if(r instanceof Tn){var e=r.__data__;if(!Ni||199>e.length)return e.push([n,t]),this.size=++r.size,this;r=this.__data__=new Fn(e)}return r.set(n,t),this.size=r.size,this};var uo=Fr(mt),io=Fr(At,true),oo=Nr(),fo=Nr(true),co=Ki?function(n,t){return Ki.set(n,t),n}:$u,ao=Ai?function(n,t){return Ai(n,"toString",{configurable:true,enumerable:false,value:Tu(t),writable:true})}:$u,lo=ki||function(n){ +return $n.clearTimeout(n)},so=Zi&&1/L(new Zi([,-0]))[1]==$?function(n){return new Zi(n)}:Pu,ho=Ki?function(n){return Ki.get(n)}:Pu,po=Ri?function(n){return null==n?[]:(n=Qu(n),i(Ri(n),function(t){return bi.call(n,t)}))}:qu,_o=Ri?function(n){for(var t=[];n;)a(t,po(n)),n=di(n);return t}:qu,vo=Ot;(Fi&&"[object DataView]"!=vo(new Fi(new ArrayBuffer(1)))||Ni&&"[object Map]"!=vo(new Ni)||Pi&&"[object Promise]"!=vo(Pi.resolve())||Zi&&"[object Set]"!=vo(new Zi)||qi&&"[object WeakMap]"!=vo(new qi))&&(vo=function(n){ +var t=Ot(n);if(n=(n="[object Object]"==t?n.constructor:T)?Te(n):"")switch(n){case Hi:return"[object DataView]";case Ji:return"[object Map]";case Yi:return"[object Promise]";case Qi:return"[object Set]";case Xi:return"[object WeakMap]"}return t});var go=ui?_u:Vu,yo=Ce(co),bo=Si||function(n,t){return $n.setTimeout(n,t)},xo=Ce(ao),jo=function(n){n=cu(n,function(n){return 500===t.size&&t.clear(),n});var t=n.cache;return n}(function(n){var t=[];return 46===n.charCodeAt(0)&&t.push(""),n.replace(tn,function(n,r,e,u){ +t.push(e?u.replace(hn,"$1"):r||n)}),t}),wo=fr(function(n,t){return hu(n)?yt(n,wt(t,1,hu,true)):[]}),mo=fr(function(n,t){var r=Ve(t);return hu(r)&&(r=T),hu(n)?yt(n,wt(t,1,hu,true),ye(r,2)):[]}),Ao=fr(function(n,t){var r=Ve(t);return hu(r)&&(r=T),hu(n)?yt(n,wt(t,1,hu,true),T,r):[]}),ko=fr(function(n){var t=c(n,kr);return t.length&&t[0]===n[0]?Wt(t):[]}),Eo=fr(function(n){var t=Ve(n),r=c(n,kr);return t===Ve(r)?t=T:r.pop(),r.length&&r[0]===n[0]?Wt(r,ye(t,2)):[]}),So=fr(function(n){var t=Ve(n),r=c(n,kr);return(t=typeof t=="function"?t:T)&&r.pop(), +r.length&&r[0]===n[0]?Wt(r,T,t):[]}),Oo=fr(Ke),Io=pe(function(n,t){var r=null==n?0:n.length,e=ht(n,t);return ur(n,c(t,function(n){return Se(n,r)?+n:n}).sort(Wr)),e}),Ro=fr(function(n){return br(wt(n,1,hu,true))}),zo=fr(function(n){var t=Ve(n);return hu(t)&&(t=T),br(wt(n,1,hu,true),ye(t,2))}),Wo=fr(function(n){var t=Ve(n),t=typeof t=="function"?t:T;return br(wt(n,1,hu,true),T,t)}),Uo=fr(function(n,t){return hu(n)?yt(n,t):[]}),Bo=fr(function(n){return mr(i(n,hu))}),Lo=fr(function(n){var t=Ve(n);return hu(t)&&(t=T), +mr(i(n,hu),ye(t,2))}),Co=fr(function(n){var t=Ve(n),t=typeof t=="function"?t:T;return mr(i(n,hu),T,t)}),Do=fr(He),Mo=fr(function(n){var t=n.length,t=1=t}),of=Lt(function(){return arguments}())?Lt:function(n){return yu(n)&&oi.call(n,"callee")&&!bi.call(n,"callee")},ff=Ku.isArray,cf=Vn?E(Vn):Ct,af=zi||Vu,lf=Kn?E(Kn):Dt,sf=Gn?E(Gn):Tt,hf=Hn?E(Hn):Nt,pf=Jn?E(Jn):Pt,_f=Yn?E(Yn):Zt,vf=ee(Kt),gf=ee(function(n,t){return n<=t}),df=$r(function(n,t){ +if(ze(t)||su(t))Cr(t,Wu(t),n);else for(var r in t)oi.call(t,r)&&ot(n,r,t[r])}),yf=$r(function(n,t){Cr(t,Uu(t),n)}),bf=$r(function(n,t,r,e){Cr(t,Uu(t),n,e)}),xf=$r(function(n,t,r,e){Cr(t,Wu(t),n,e)}),jf=pe(ht),wf=fr(function(n,t){n=Qu(n);var r=-1,e=t.length,u=2--n)return t.apply(this,arguments)}},An.ary=eu,An.assign=df,An.assignIn=yf,An.assignInWith=bf,An.assignWith=xf,An.at=jf,An.before=uu,An.bind=Ho,An.bindAll=Nf,An.bindKey=Jo,An.castArray=function(){if(!arguments.length)return[];var n=arguments[0];return ff(n)?n:[n]},An.chain=Ye,An.chunk=function(n,t,r){if(t=(r?Oe(n,t,r):t===T)?1:Li(ku(t),0),r=null==n?0:n.length,!r||1>t)return[];for(var e=0,u=0,i=Ku(Oi(r/t));et?0:t,e)):[]},An.dropRight=function(n,t,r){var e=null==n?0:n.length;return e?(t=r||t===T?1:ku(t),t=e-t,hr(n,0,0>t?0:t)):[]},An.dropRightWhile=function(n,t){return n&&n.length?jr(n,ye(t,3),true,true):[]; +},An.dropWhile=function(n,t){return n&&n.length?jr(n,ye(t,3),true):[]},An.fill=function(n,t,r,e){var u=null==n?0:n.length;if(!u)return[];for(r&&typeof r!="number"&&Oe(n,t,r)&&(r=0,e=u),u=n.length,r=ku(r),0>r&&(r=-r>u?0:u+r),e=e===T||e>u?u:ku(e),0>e&&(e+=u),e=r>e?0:Eu(e);r>>0,r?(n=Iu(n))&&(typeof t=="string"||null!=t&&!hf(t))&&(t=yr(t),!t&&Rn.test(n))?Or(M(n),0,r):n.split(t,r):[]},An.spread=function(t,r){if(typeof t!="function")throw new ti("Expected a function");return r=null==r?0:Li(ku(r),0), +fr(function(e){var u=e[r];return e=Or(e,0,r),u&&a(e,u),n(t,this,e)})},An.tail=function(n){var t=null==n?0:n.length;return t?hr(n,1,t):[]},An.take=function(n,t,r){return n&&n.length?(t=r||t===T?1:ku(t),hr(n,0,0>t?0:t)):[]},An.takeRight=function(n,t,r){var e=null==n?0:n.length;return e?(t=r||t===T?1:ku(t),t=e-t,hr(n,0>t?0:t,e)):[]},An.takeRightWhile=function(n,t){return n&&n.length?jr(n,ye(t,3),false,true):[]},An.takeWhile=function(n,t){return n&&n.length?jr(n,ye(t,3)):[]},An.tap=function(n,t){return t(n), +n},An.throttle=function(n,t,r){var e=true,u=true;if(typeof n!="function")throw new ti("Expected a function");return du(r)&&(e="leading"in r?!!r.leading:e,u="trailing"in r?!!r.trailing:u),fu(n,t,{leading:e,maxWait:t,trailing:u})},An.thru=Qe,An.toArray=mu,An.toPairs=zf,An.toPairsIn=Wf,An.toPath=function(n){return ff(n)?c(n,Me):wu(n)?[n]:Lr(jo(Iu(n)))},An.toPlainObject=Ou,An.transform=function(n,t,e){var u=ff(n),i=u||af(n)||_f(n);if(t=ye(t,4),null==e){var o=n&&n.constructor;e=i?u?new o:[]:du(n)&&_u(o)?eo(di(n)):{}; +}return(i?r:mt)(n,function(n,r,u){return t(e,n,r,u)}),e},An.unary=function(n){return eu(n,1)},An.union=Ro,An.unionBy=zo,An.unionWith=Wo,An.uniq=function(n){return n&&n.length?br(n):[]},An.uniqBy=function(n,t){return n&&n.length?br(n,ye(t,2)):[]},An.uniqWith=function(n,t){return t=typeof t=="function"?t:T,n&&n.length?br(n,T,t):[]},An.unset=function(n,t){return null==n||xr(n,t)},An.unzip=He,An.unzipWith=Je,An.update=function(n,t,r){return null!=n&&(r=Er(r),n=lr(n,t,r(Et(n,t)),void 0)),n},An.updateWith=function(n,t,r,e){ +return e=typeof e=="function"?e:T,null!=n&&(r=Er(r),n=lr(n,t,r(Et(n,t)),e)),n},An.values=Lu,An.valuesIn=function(n){return null==n?[]:S(n,Uu(n))},An.without=Uo,An.words=Mu,An.wrap=function(n,t){return nf(Er(t),n)},An.xor=Bo,An.xorBy=Lo,An.xorWith=Co,An.zip=Do,An.zipObject=function(n,t){return Ar(n||[],t||[],ot)},An.zipObjectDeep=function(n,t){return Ar(n||[],t||[],lr)},An.zipWith=Mo,An.entries=zf,An.entriesIn=Wf,An.extend=yf,An.extendWith=bf,Nu(An,An),An.add=Qf,An.attempt=Ff,An.camelCase=Uf,An.capitalize=Cu, +An.ceil=Xf,An.clamp=function(n,t,r){return r===T&&(r=t,t=T),r!==T&&(r=Su(r),r=r===r?r:0),t!==T&&(t=Su(t),t=t===t?t:0),pt(Su(n),t,r)},An.clone=function(n){return _t(n,4)},An.cloneDeep=function(n){return _t(n,5)},An.cloneDeepWith=function(n,t){return t=typeof t=="function"?t:T,_t(n,5,t)},An.cloneWith=function(n,t){return t=typeof t=="function"?t:T,_t(n,4,t)},An.conformsTo=function(n,t){return null==t||gt(n,t,Wu(t))},An.deburr=Du,An.defaultTo=function(n,t){return null==n||n!==n?t:n},An.divide=nc,An.endsWith=function(n,t,r){ +n=Iu(n),t=yr(t);var e=n.length,e=r=r===T?e:pt(ku(r),0,e);return r-=t.length,0<=r&&n.slice(r,e)==t},An.eq=lu,An.escape=function(n){return(n=Iu(n))&&H.test(n)?n.replace(K,nt):n},An.escapeRegExp=function(n){return(n=Iu(n))&&en.test(n)?n.replace(rn,"\\$&"):n},An.every=function(n,t,r){var e=ff(n)?u:bt;return r&&Oe(n,t,r)&&(t=T),e(n,ye(t,3))},An.find=Fo,An.findIndex=Ne,An.findKey=function(n,t){return p(n,ye(t,3),mt)},An.findLast=No,An.findLastIndex=Pe,An.findLastKey=function(n,t){return p(n,ye(t,3),At); +},An.floor=tc,An.forEach=nu,An.forEachRight=tu,An.forIn=function(n,t){return null==n?n:oo(n,ye(t,3),Uu)},An.forInRight=function(n,t){return null==n?n:fo(n,ye(t,3),Uu)},An.forOwn=function(n,t){return n&&mt(n,ye(t,3))},An.forOwnRight=function(n,t){return n&&At(n,ye(t,3))},An.get=Ru,An.gt=ef,An.gte=uf,An.has=function(n,t){return null!=n&&we(n,t,Rt)},An.hasIn=zu,An.head=qe,An.identity=$u,An.includes=function(n,t,r,e){return n=su(n)?n:Lu(n),r=r&&!e?ku(r):0,e=n.length,0>r&&(r=Li(e+r,0)),ju(n)?r<=e&&-1r&&(r=Li(e+r,0)),v(n,t,r)):-1},An.inRange=function(n,t,r){return t=Au(t),r===T?(r=t,t=0):r=Au(r),n=Su(n),n>=Ci(t,r)&&n=n},An.isSet=pf,An.isString=ju,An.isSymbol=wu,An.isTypedArray=_f,An.isUndefined=function(n){return n===T},An.isWeakMap=function(n){return yu(n)&&"[object WeakMap]"==vo(n)},An.isWeakSet=function(n){return yu(n)&&"[object WeakSet]"==Ot(n)},An.join=function(n,t){return null==n?"":Ui.call(n,t)},An.kebabCase=Bf,An.last=Ve,An.lastIndexOf=function(n,t,r){var e=null==n?0:n.length;if(!e)return-1;var u=e;if(r!==T&&(u=ku(r),u=0>u?Li(e+u,0):Ci(u,e-1)), +t===t)n:{for(r=u+1;r--;)if(n[r]===t){n=r;break n}n=r}else n=_(n,d,u,true);return n},An.lowerCase=Lf,An.lowerFirst=Cf,An.lt=vf,An.lte=gf,An.max=function(n){return n&&n.length?xt(n,$u,It):T},An.maxBy=function(n,t){return n&&n.length?xt(n,ye(t,2),It):T},An.mean=function(n){return y(n,$u)},An.meanBy=function(n,t){return y(n,ye(t,2))},An.min=function(n){return n&&n.length?xt(n,$u,Kt):T},An.minBy=function(n,t){return n&&n.length?xt(n,ye(t,2),Kt):T},An.stubArray=qu,An.stubFalse=Vu,An.stubObject=function(){ +return{}},An.stubString=function(){return""},An.stubTrue=function(){return true},An.multiply=rc,An.nth=function(n,t){return n&&n.length?Qt(n,ku(t)):T},An.noConflict=function(){return $n._===this&&($n._=si),this},An.noop=Pu,An.now=Go,An.pad=function(n,t,r){n=Iu(n);var e=(t=ku(t))?D(n):0;return!t||e>=t?n:(t=(t-e)/2,ne(Ii(t),r)+n+ne(Oi(t),r))},An.padEnd=function(n,t,r){n=Iu(n);var e=(t=ku(t))?D(n):0;return t&&et){var e=n;n=t,t=e}return r||n%1||t%1?(r=Ti(),Ci(n+r*(t-n+Cn("1e-"+((r+"").length-1))),t)):ir(n,t)},An.reduce=function(n,t,r){var e=ff(n)?l:j,u=3>arguments.length;return e(n,ye(t,4),r,u,uo)},An.reduceRight=function(n,t,r){ +var e=ff(n)?s:j,u=3>arguments.length;return e(n,ye(t,4),r,u,io)},An.repeat=function(n,t,r){return t=(r?Oe(n,t,r):t===T)?1:ku(t),or(Iu(n),t)},An.replace=function(){var n=arguments,t=Iu(n[0]);return 3>n.length?t:t.replace(n[1],n[2])},An.result=function(n,t,r){t=Sr(t,n);var e=-1,u=t.length;for(u||(u=1,n=T);++en||9007199254740991=i)return n;if(i=r-D(e),1>i)return e;if(r=o?Or(o,0,i).join(""):n.slice(0,i),u===T)return r+e;if(o&&(i+=r.length-i),hf(u)){if(n.slice(i).search(u)){var f=r;for(u.global||(u=Xu(u.source,Iu(_n.exec(u))+"g")), +u.lastIndex=0;o=u.exec(f);)var c=o.index;r=r.slice(0,c===T?i:c)}}else n.indexOf(yr(u),i)!=i&&(u=r.lastIndexOf(u),-1e.__dir__?"Right":"")}),e},Ln.prototype[n+"Right"]=function(t){return this.reverse()[n](t).reverse()}}),r(["filter","map","takeWhile"],function(n,t){var r=t+1,e=1==r||3==r;Ln.prototype[n]=function(n){var t=this.clone();return t.__iteratees__.push({ +iteratee:ye(n,3),type:r}),t.__filtered__=t.__filtered__||e,t}}),r(["head","last"],function(n,t){var r="take"+(t?"Right":"");Ln.prototype[n]=function(){return this[r](1).value()[0]}}),r(["initial","tail"],function(n,t){var r="drop"+(t?"":"Right");Ln.prototype[n]=function(){return this.__filtered__?new Ln(this):this[r](1)}}),Ln.prototype.compact=function(){return this.filter($u)},Ln.prototype.find=function(n){return this.filter(n).head()},Ln.prototype.findLast=function(n){return this.reverse().find(n); +},Ln.prototype.invokeMap=fr(function(n,t){return typeof n=="function"?new Ln(this):this.map(function(r){return Bt(r,n,t)})}),Ln.prototype.reject=function(n){return this.filter(au(ye(n)))},Ln.prototype.slice=function(n,t){n=ku(n);var r=this;return r.__filtered__&&(0t)?new Ln(r):(0>n?r=r.takeRight(-n):n&&(r=r.drop(n)),t!==T&&(t=ku(t),r=0>t?r.dropRight(-t):r.take(t-n)),r)},Ln.prototype.takeRightWhile=function(n){return this.reverse().takeWhile(n).reverse()},Ln.prototype.toArray=function(){return this.take(4294967295); +},mt(Ln.prototype,function(n,t){var r=/^(?:filter|find|map|reject)|While$/.test(t),e=/^(?:head|last)$/.test(t),u=An[e?"take"+("last"==t?"Right":""):t],i=e||/^find/.test(t);u&&(An.prototype[t]=function(){var t=this.__wrapped__,o=e?[1]:arguments,f=t instanceof Ln,c=o[0],l=f||ff(t),s=function(n){return n=u.apply(An,a([n],o)),e&&h?n[0]:n};l&&r&&typeof c=="function"&&1!=c.length&&(f=l=false);var h=this.__chain__,p=!!this.__actions__.length,c=i&&!h,f=f&&!p;return!i&&l?(t=f?t:new Ln(this),t=n.apply(t,o),t.__actions__.push({ +func:Qe,args:[s],thisArg:T}),new On(t,h)):c&&f?n.apply(this,o):(t=this.thru(s),c?e?t.value()[0]:t.value():t)})}),r("pop push shift sort splice unshift".split(" "),function(n){var t=ri[n],r=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",e=/^(?:pop|shift)$/.test(n);An.prototype[n]=function(){var n=arguments;if(e&&!this.__chain__){var u=this.value();return t.apply(ff(u)?u:[],n)}return this[r](function(r){return t.apply(ff(r)?r:[],n)})}}),mt(Ln.prototype,function(n,t){var r=An[t];if(r){var e=r.name+""; +(Gi[e]||(Gi[e]=[])).push({name:t,func:r})}}),Gi[Jr(T,2).name]=[{name:"wrapper",func:T}],Ln.prototype.clone=function(){var n=new Ln(this.__wrapped__);return n.__actions__=Lr(this.__actions__),n.__dir__=this.__dir__,n.__filtered__=this.__filtered__,n.__iteratees__=Lr(this.__iteratees__),n.__takeCount__=this.__takeCount__,n.__views__=Lr(this.__views__),n},Ln.prototype.reverse=function(){if(this.__filtered__){var n=new Ln(this);n.__dir__=-1,n.__filtered__=true}else n=this.clone(),n.__dir__*=-1;return n; +},Ln.prototype.value=function(){var n,t=this.__wrapped__.value(),r=this.__dir__,e=ff(t),u=0>r,i=e?t.length:0;n=0;for(var o=i,f=this.__views__,c=-1,a=f.length;++c=this.__values__.length;return{done:n,value:n?T:this.__values__[this.__index__++]}},An.prototype.plant=function(n){for(var t,r=this;r instanceof kn;){ +var e=Fe(r);e.__index__=0,e.__values__=T,t?u.__wrapped__=e:t=e;var u=e,r=r.__wrapped__}return u.__wrapped__=n,t},An.prototype.reverse=function(){var n=this.__wrapped__;return n instanceof Ln?(this.__actions__.length&&(n=new Ln(this)),n=n.reverse(),n.__actions__.push({func:Qe,args:[Ge],thisArg:T}),new On(n,this.__chain__)):this.thru(Ge)},An.prototype.toJSON=An.prototype.valueOf=An.prototype.value=function(){return wr(this.__wrapped__,this.__actions__)},An.prototype.first=An.prototype.head,wi&&(An.prototype[wi]=Xe), +An}();typeof define=="function"&&typeof define.amd=="object"&&define.amd?($n._=rt, define(function(){return rt})):Nn?((Nn.exports=rt)._=rt,Fn._=rt):$n._=rt}).call(this); \ No newline at end of file diff --git a/ui/shared/vendor/popper.js/popper.min.js b/ui/shared/vendor/popper.js/popper.min.js new file mode 100644 index 00000000..94a5c26f --- /dev/null +++ b/ui/shared/vendor/popper.js/popper.min.js @@ -0,0 +1,5 @@ +/* + Copyright (C) Federico Zivolo 2019 + Distributed under the MIT License (license terms are at http://opensource.org/licenses/MIT). + */(function(e,t){'object'==typeof exports&&'undefined'!=typeof module?module.exports=t():'function'==typeof define&&define.amd?define(t):e.Popper=t()})(this,function(){'use strict';function e(e){return e&&'[object Function]'==={}.toString.call(e)}function t(e,t){if(1!==e.nodeType)return[];var o=e.ownerDocument.defaultView,n=o.getComputedStyle(e,null);return t?n[t]:n}function o(e){return'HTML'===e.nodeName?e:e.parentNode||e.host}function n(e){if(!e)return document.body;switch(e.nodeName){case'HTML':case'BODY':return e.ownerDocument.body;case'#document':return e.body;}var i=t(e),r=i.overflow,p=i.overflowX,s=i.overflowY;return /(auto|scroll|overlay)/.test(r+s+p)?e:n(o(e))}function r(e){return 11===e?pe:10===e?se:pe||se}function p(e){if(!e)return document.documentElement;for(var o=r(10)?document.body:null,n=e.offsetParent||null;n===o&&e.nextElementSibling;)n=(e=e.nextElementSibling).offsetParent;var i=n&&n.nodeName;return i&&'BODY'!==i&&'HTML'!==i?-1!==['TH','TD','TABLE'].indexOf(n.nodeName)&&'static'===t(n,'position')?p(n):n:e?e.ownerDocument.documentElement:document.documentElement}function s(e){var t=e.nodeName;return'BODY'!==t&&('HTML'===t||p(e.firstElementChild)===e)}function d(e){return null===e.parentNode?e:d(e.parentNode)}function a(e,t){if(!e||!e.nodeType||!t||!t.nodeType)return document.documentElement;var o=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,n=o?e:t,i=o?t:e,r=document.createRange();r.setStart(n,0),r.setEnd(i,0);var l=r.commonAncestorContainer;if(e!==l&&t!==l||n.contains(i))return s(l)?l:p(l);var f=d(e);return f.host?a(f.host,t):a(e,d(t).host)}function l(e){var t=1=o.clientWidth&&n>=o.clientHeight}),l=0a[e]&&!t.escapeWithReference&&(n=Q(f[o],a[e]-('right'===e?f.width:f.height))),le({},o,n)}};return l.forEach(function(e){var t=-1===['left','top'].indexOf(e)?'secondary':'primary';f=fe({},f,m[t](e))}),e.offsets.popper=f,e},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,o=t.popper,n=t.reference,i=e.placement.split('-')[0],r=Z,p=-1!==['top','bottom'].indexOf(i),s=p?'right':'bottom',d=p?'left':'top',a=p?'width':'height';return o[s]r(n[s])&&(e.offsets.popper[d]=r(n[s])),e}},arrow:{order:500,enabled:!0,fn:function(e,o){var n;if(!K(e.instance.modifiers,'arrow','keepTogether'))return e;var i=o.element;if('string'==typeof i){if(i=e.instance.popper.querySelector(i),!i)return e;}else if(!e.instance.popper.contains(i))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),e;var r=e.placement.split('-')[0],p=e.offsets,s=p.popper,d=p.reference,a=-1!==['left','right'].indexOf(r),l=a?'height':'width',f=a?'Top':'Left',m=f.toLowerCase(),h=a?'left':'top',c=a?'bottom':'right',u=S(i)[l];d[c]-us[c]&&(e.offsets.popper[m]+=d[m]+u-s[c]),e.offsets.popper=g(e.offsets.popper);var b=d[m]+d[l]/2-u/2,w=t(e.instance.popper),y=parseFloat(w['margin'+f],10),E=parseFloat(w['border'+f+'Width'],10),v=b-e.offsets.popper[m]-y-E;return v=ee(Q(s[l]-u,v),0),e.arrowElement=i,e.offsets.arrow=(n={},le(n,m,$(v)),le(n,h,''),n),e},element:'[x-arrow]'},flip:{order:600,enabled:!0,fn:function(e,t){if(W(e.instance.modifiers,'inner'))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var o=v(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement,e.positionFixed),n=e.placement.split('-')[0],i=T(n),r=e.placement.split('-')[1]||'',p=[];switch(t.behavior){case ge.FLIP:p=[n,i];break;case ge.CLOCKWISE:p=G(n);break;case ge.COUNTERCLOCKWISE:p=G(n,!0);break;default:p=t.behavior;}return p.forEach(function(s,d){if(n!==s||p.length===d+1)return e;n=e.placement.split('-')[0],i=T(n);var a=e.offsets.popper,l=e.offsets.reference,f=Z,m='left'===n&&f(a.right)>f(l.left)||'right'===n&&f(a.left)f(l.top)||'bottom'===n&&f(a.top)f(o.right),g=f(a.top)f(o.bottom),b='left'===n&&h||'right'===n&&c||'top'===n&&g||'bottom'===n&&u,w=-1!==['top','bottom'].indexOf(n),y=!!t.flipVariations&&(w&&'start'===r&&h||w&&'end'===r&&c||!w&&'start'===r&&g||!w&&'end'===r&&u);(m||b||y)&&(e.flipped=!0,(m||b)&&(n=p[d+1]),y&&(r=z(r)),e.placement=n+(r?'-'+r:''),e.offsets.popper=fe({},e.offsets.popper,D(e.instance.popper,e.offsets.reference,e.placement)),e=P(e.instance.modifiers,e,'flip'))}),e},behavior:'flip',padding:5,boundariesElement:'viewport'},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,o=t.split('-')[0],n=e.offsets,i=n.popper,r=n.reference,p=-1!==['left','right'].indexOf(o),s=-1===['top','left'].indexOf(o);return i[p?'left':'top']=r[o]-(s?i[p?'width':'height']:0),e.placement=T(t),e.offsets.popper=g(i),e}},hide:{order:800,enabled:!0,fn:function(e){if(!K(e.instance.modifiers,'hide','preventOverflow'))return e;var t=e.offsets.reference,o=C(e.instance.modifiers,function(e){return'preventOverflow'===e.name}).boundaries;if(t.bottomo.right||t.top>o.bottom||t.rightwindow.devicePixelRatio||!me),c='bottom'===o?'top':'bottom',g='right'===n?'left':'right',b=H('transform');if(d='bottom'==c?'HTML'===l.nodeName?-l.clientHeight+h.bottom:-f.height+h.bottom:h.top,s='right'==g?'HTML'===l.nodeName?-l.clientWidth+h.right:-f.width+h.right:h.left,a&&b)m[b]='translate3d('+s+'px, '+d+'px, 0)',m[c]=0,m[g]=0,m.willChange='transform';else{var w='bottom'==c?-1:1,y='right'==g?-1:1;m[c]=d*w,m[g]=s*y,m.willChange=c+', '+g}var E={"x-placement":e.placement};return e.attributes=fe({},E,e.attributes),e.styles=fe({},m,e.styles),e.arrowStyles=fe({},e.offsets.arrow,e.arrowStyles),e},gpuAcceleration:!0,x:'bottom',y:'right'},applyStyle:{order:900,enabled:!0,fn:function(e){return j(e.instance.popper,e.styles),V(e.instance.popper,e.attributes),e.arrowElement&&Object.keys(e.arrowStyles).length&&j(e.arrowElement,e.arrowStyles),e},onLoad:function(e,t,o,n,i){var r=L(i,t,e,o.positionFixed),p=O(o.placement,r,t,e,o.modifiers.flip.boundariesElement,o.modifiers.flip.padding);return t.setAttribute('x-placement',p),j(t,{position:o.positionFixed?'fixed':'absolute'}),o},gpuAcceleration:void 0}}},ue}); +//# sourceMappingURL=popper.min.js.map From 90069cef0604de0ef5bf7ab3c38c06caf6b1c3a8 Mon Sep 17 00:00:00 2001 From: Ali Arshad Date: Fri, 13 Dec 2024 16:15:15 +0500 Subject: [PATCH 6/6] .history removed from index --- .gitignore | 1 + ...bpack.development.config_20241206220533.js | 9 - ...bpack.development.config_20241206235345.js | 9 - ...bpack.development.config_20241206235347.js | 9 - .history/package_20241206220533.json | 191 ---------------- .history/package_20241206233731.json | 191 ---------------- .history/package_20241206234457.json | 192 ----------------- .history/package_20241206234507.json | 192 ----------------- .history/package_20241206234513.json | 192 ----------------- .history/package_20241206234604.json | 192 ----------------- .history/package_20241206234710.json | 191 ---------------- .history/package_20241206234810.json | 194 ----------------- .history/package_20241206234811.json | 194 ----------------- .history/package_20241206234923.json | 193 ----------------- .history/package_20241206234924.json | 193 ----------------- .../github.oauth.service_20241102143121.ts | 136 ------------ .../github.oauth.service_20241206235603.ts | 136 ------------ .../github.oauth.service_20241206235606.ts | 136 ------------ .../github.oauth.service_20241206235613.ts | 136 ------------ .../github.oauth.service_20241206235624.ts | 136 ------------ .../github.oauth.service_20241206235626.ts | 136 ------------ .../github.oauth.service_20241206235700.ts | 136 ------------ .../github.oauth.service_20241206235701.ts | 136 ------------ .../github.oauth.service_20241206235709.ts | 136 ------------ .../github.oauth.service_20241206235714.ts | 136 ------------ .../github.oauth.service_20241206235715.ts | 136 ------------ .../github.oauth.service_20241206235727.ts | 136 ------------ .../github.oauth.service_20241206235731.ts | 136 ------------ .../github.oauth.service_20241206235738.ts | 136 ------------ .../service/github.service_20241102143121.ts | 203 ------------------ .../service/github.service_20241206235854.ts | 203 ------------------ .../service/github.service_20241206235857.ts | 203 ------------------ .../service/github.service_20241206235858.ts | 203 ------------------ .../service/github.service_20241206235903.ts | 203 ------------------ 34 files changed, 1 insertion(+), 5061 deletions(-) delete mode 100644 .history/configs/webpack.development.config_20241206220533.js delete mode 100644 .history/configs/webpack.development.config_20241206235345.js delete mode 100644 .history/configs/webpack.development.config_20241206235347.js delete mode 100644 .history/package_20241206220533.json delete mode 100644 .history/package_20241206233731.json delete mode 100644 .history/package_20241206234457.json delete mode 100644 .history/package_20241206234507.json delete mode 100644 .history/package_20241206234513.json delete mode 100644 .history/package_20241206234604.json delete mode 100644 .history/package_20241206234710.json delete mode 100644 .history/package_20241206234810.json delete mode 100644 .history/package_20241206234811.json delete mode 100644 .history/package_20241206234923.json delete mode 100644 .history/package_20241206234924.json delete mode 100644 .history/src/service/github.oauth.service_20241102143121.ts delete mode 100644 .history/src/service/github.oauth.service_20241206235603.ts delete mode 100644 .history/src/service/github.oauth.service_20241206235606.ts delete mode 100644 .history/src/service/github.oauth.service_20241206235613.ts delete mode 100644 .history/src/service/github.oauth.service_20241206235624.ts delete mode 100644 .history/src/service/github.oauth.service_20241206235626.ts delete mode 100644 .history/src/service/github.oauth.service_20241206235700.ts delete mode 100644 .history/src/service/github.oauth.service_20241206235701.ts delete mode 100644 .history/src/service/github.oauth.service_20241206235709.ts delete mode 100644 .history/src/service/github.oauth.service_20241206235714.ts delete mode 100644 .history/src/service/github.oauth.service_20241206235715.ts delete mode 100644 .history/src/service/github.oauth.service_20241206235727.ts delete mode 100644 .history/src/service/github.oauth.service_20241206235731.ts delete mode 100644 .history/src/service/github.oauth.service_20241206235738.ts delete mode 100644 .history/src/service/github.service_20241102143121.ts delete mode 100644 .history/src/service/github.service_20241206235854.ts delete mode 100644 .history/src/service/github.service_20241206235857.ts delete mode 100644 .history/src/service/github.service_20241206235858.ts delete mode 100644 .history/src/service/github.service_20241206235903.ts diff --git a/.gitignore b/.gitignore index c99c7b65..e1183eeb 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ package-lock.json *.vsix *.lock *.log +.history diff --git a/.history/configs/webpack.development.config_20241206220533.js b/.history/configs/webpack.development.config_20241206220533.js deleted file mode 100644 index 5b97ec30..00000000 --- a/.history/configs/webpack.development.config_20241206220533.js +++ /dev/null @@ -1,9 +0,0 @@ -"use strict"; - -const merge = require('webpack-merge'); -const common = require('./webpack.config.js'); - -module.exports = merge(common, { - mode: 'development', - devtool: 'source-map' -}); \ No newline at end of file diff --git a/.history/configs/webpack.development.config_20241206235345.js b/.history/configs/webpack.development.config_20241206235345.js deleted file mode 100644 index 1254f753..00000000 --- a/.history/configs/webpack.development.config_20241206235345.js +++ /dev/null @@ -1,9 +0,0 @@ -"use strict"; - -const {merge} = require('webpack-merge'); -const common = require('./webpack.config.js'); - -module.exports = merge(common, { - mode: 'development', - devtool: 'source-map' -}); \ No newline at end of file diff --git a/.history/configs/webpack.development.config_20241206235347.js b/.history/configs/webpack.development.config_20241206235347.js deleted file mode 100644 index 9397bffd..00000000 --- a/.history/configs/webpack.development.config_20241206235347.js +++ /dev/null @@ -1,9 +0,0 @@ -"use strict"; - -const { merge } = require("webpack-merge"); -const common = require("./webpack.config.js"); - -module.exports = merge(common, { - mode: "development", - devtool: "source-map", -}); diff --git a/.history/package_20241206220533.json b/.history/package_20241206220533.json deleted file mode 100644 index 6c870bc5..00000000 --- a/.history/package_20241206220533.json +++ /dev/null @@ -1,191 +0,0 @@ -{ - "name": "code-settings-sync", - "displayName": "Settings Sync", - "description": "Synchronize Settings, Snippets, Themes, File Icons, Launch, Keybindings, Workspaces and Extensions Across Multiple Machines Using GitHub Gist.", - "version": "3.4.3", - "icon": "images/logo-128.png", - "publisher": "Shan", - "author": { - "name": "Shan Khan", - "url": "http://shanalikhan.github.io", - "email": "shanalikhan@hotmail.com" - }, - "homepage": "https://shanalikhan.github.io", - "galleryBanner": { - "color": "#3B4859", - "theme": "dark" - }, - "engines": { - "vscode": "^1.35.1" - }, - "badges": [ - { - "url": "https://vsmarketplacebadge.apphb.com/version/Shan.code-settings-sync.svg", - "description": "Latest Version", - "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" - }, - { - "url": "https://vsmarketplacebadge.apphb.com/installs/Shan.code-settings-sync.svg", - "description": "Total Downloads", - "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" - }, - { - "url": "https://vsmarketplacebadge.apphb.com/rating/Shan.code-settings-sync.svg", - "description": "Ratings", - "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" - }, - { - "url": "https://img.shields.io/badge/Join%20Community-slack-green.svg", - "description": "Join Slack Community", - "href": "https://join.slack.com/t/codesettingssync/shared_invite/enQtNzQyODMzMzI5MDQ3LWNmZjVkZjE2YTg0MzY1Y2EyYzVmYThmNzg2YjZkNjhhZWY3ZTEzN2I3ZTAxMjkwNWU0ZjMyZGFhMjdiZDI3ODU" - } - ], - "repository": { - "type": "git", - "url": "https://github.com/shanalikhan/code-settings-sync.git" - }, - "bugs": { - "url": "https://github.com/shanalikhan/code-settings-sync/issues", - "email": "shanalikhan@hotmail.com" - }, - "categories": [ - "Other" - ], - "keywords": [ - "vscode-sync", - "vscode-settings-sync", - "code-settings-sync", - "settings-sync", - "workspace-sync", - "multi-root ready" - ], - "extensionKind": "ui", - "activationEvents": [ - "*" - ], - "main": "./out/extension.js", - "contributes": { - "commands": [ - { - "command": "extension.HowSettings", - "title": "%cmd.howSetting.title%" - }, - { - "command": "extension.downloadSettings", - "title": "%cmd.downloadSettings.title%" - }, - { - "command": "extension.updateSettings", - "title": "%cmd.updateSettings.title%" - }, - { - "command": "extension.resetSettings", - "title": "%cmd.resetSettings.title%" - }, - { - "command": "extension.otherOptions", - "title": "%cmd.otherOptions.title%" - } - ], - "keybindings": [ - { - "key": "alt+shift+u", - "command": "extension.updateSettings" - }, - { - "key": "alt+shift+d", - "command": "extension.downloadSettings" - } - ], - "configuration": { - "properties": { - "sync.gist": { - "type": "string", - "default": "", - "description": "%ext.config.gist%" - }, - "sync.autoDownload": { - "type": "boolean", - "default": false, - "description": "%ext.config.autoDownload%" - }, - "sync.autoUpload": { - "type": "boolean", - "default": false, - "description": "%ext.config.autoUpload%" - }, - "sync.forceDownload": { - "type": "boolean", - "default": false, - "description": "%ext.config.forceDownload%" - }, - "sync.forceUpload": { - "type": "boolean", - "default": false, - "description": "%ext.config.forceUpload%" - }, - "sync.quietSync": { - "type": "boolean", - "default": false, - "description": "%ext.config.quietSync%" - }, - "sync.removeExtensions": { - "type": "boolean", - "default": true, - "description": "%ext.config.removeExtensions%" - }, - "sync.syncExtensions": { - "type": "boolean", - "default": true, - "description": "%ext.config.syncExtensions%" - } - }, - "title": "%ext.config.title%" - } - }, - "scripts": { - "vscode:prepublish": "npm run tslint-check && webpack --config configs/webpack.production.config.js", - "compile": "webpack --config configs/webpack.development.config.js", - "watch": "webpack --config configs/webpack.development.config.js --watch", - "postinstall": "node ./node_modules/vscode/bin/install", - "tslint-check": "tslint -c ./tslint.json ./src/**/*.ts ./src/*.ts", - "format": "prettier --write './src/**/*.ts'", - "test": "npm run tslint-check && tsc -p ./ && mocha --recursive \"./out/test/**/*.js\"" - }, - "devDependencies": { - "@types/chai": "4.2.1", - "@types/express": "^4.16.1", - "@types/lodash": "^4.14.123", - "@types/node-fetch": "^2.3.3", - "@types/fs-extra": "^8.0.0", - "@types/mocha": "^5.2.6", - "@types/node": "^12.0.9", - "@types/recursive-readdir": "^2.2.0", - "chai": "^4.2.0", - "clean-webpack-plugin": "^3.0.0", - "mocha": "^6.0.2", - "prettier": "^1.16.4", - "ts-loader": "^5.3.3", - "tslint": "^5.15.0", - "tslint-plugin-prettier": "^2.0.1", - "typescript": "^3.4.1", - "vscode": "^1.1.33", - "webpack": "^4.29.6", - "webpack-cli": "^3.3.0", - "webpack-merge": "^4.2.1" - }, - "dependencies": { - "@octokit/rest": "^16.23.2", - "adm-zip": "^0.4.13", - "const": "^1.0.0", - "express": "^4.16.4", - "fs-extra": "^8.0.1", - "https-proxy-agent": "^2.2.1", - "lockfile": "^1.0.4", - "lodash": "^4.17.15", - "node-fetch": "^2.5.0", - "recursive-readdir": "^2.2.2", - "temp": "^0.9.0", - "vscode-chokidar": "^2.1.6" - } -} diff --git a/.history/package_20241206233731.json b/.history/package_20241206233731.json deleted file mode 100644 index 8c74cd9f..00000000 --- a/.history/package_20241206233731.json +++ /dev/null @@ -1,191 +0,0 @@ -{ - "name": "code-settings-sync", - "displayName": "Settings Sync", - "description": "Synchronize Settings, Snippets, Themes, File Icons, Launch, Keybindings, Workspaces and Extensions Across Multiple Machines Using GitHub Gist.", - "version": "3.4.3", - "icon": "images/logo-128.png", - "publisher": "Shan", - "author": { - "name": "Shan Khan", - "url": "http://shanalikhan.github.io", - "email": "shanalikhan@hotmail.com" - }, - "homepage": "https://shanalikhan.github.io", - "galleryBanner": { - "color": "#3B4859", - "theme": "dark" - }, - "engines": { - "vscode": "^1.95.0" - }, - "badges": [ - { - "url": "https://vsmarketplacebadge.apphb.com/version/Shan.code-settings-sync.svg", - "description": "Latest Version", - "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" - }, - { - "url": "https://vsmarketplacebadge.apphb.com/installs/Shan.code-settings-sync.svg", - "description": "Total Downloads", - "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" - }, - { - "url": "https://vsmarketplacebadge.apphb.com/rating/Shan.code-settings-sync.svg", - "description": "Ratings", - "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" - }, - { - "url": "https://img.shields.io/badge/Join%20Community-slack-green.svg", - "description": "Join Slack Community", - "href": "https://join.slack.com/t/codesettingssync/shared_invite/enQtNzQyODMzMzI5MDQ3LWNmZjVkZjE2YTg0MzY1Y2EyYzVmYThmNzg2YjZkNjhhZWY3ZTEzN2I3ZTAxMjkwNWU0ZjMyZGFhMjdiZDI3ODU" - } - ], - "repository": { - "type": "git", - "url": "https://github.com/shanalikhan/code-settings-sync.git" - }, - "bugs": { - "url": "https://github.com/shanalikhan/code-settings-sync/issues", - "email": "shanalikhan@hotmail.com" - }, - "categories": [ - "Other" - ], - "keywords": [ - "vscode-sync", - "vscode-settings-sync", - "code-settings-sync", - "settings-sync", - "workspace-sync", - "multi-root ready" - ], - "extensionKind": "ui", - "activationEvents": [ - "*" - ], - "main": "./out/extension.js", - "contributes": { - "commands": [ - { - "command": "extension.HowSettings", - "title": "%cmd.howSetting.title%" - }, - { - "command": "extension.downloadSettings", - "title": "%cmd.downloadSettings.title%" - }, - { - "command": "extension.updateSettings", - "title": "%cmd.updateSettings.title%" - }, - { - "command": "extension.resetSettings", - "title": "%cmd.resetSettings.title%" - }, - { - "command": "extension.otherOptions", - "title": "%cmd.otherOptions.title%" - } - ], - "keybindings": [ - { - "key": "alt+shift+u", - "command": "extension.updateSettings" - }, - { - "key": "alt+shift+d", - "command": "extension.downloadSettings" - } - ], - "configuration": { - "properties": { - "sync.gist": { - "type": "string", - "default": "", - "description": "%ext.config.gist%" - }, - "sync.autoDownload": { - "type": "boolean", - "default": false, - "description": "%ext.config.autoDownload%" - }, - "sync.autoUpload": { - "type": "boolean", - "default": false, - "description": "%ext.config.autoUpload%" - }, - "sync.forceDownload": { - "type": "boolean", - "default": false, - "description": "%ext.config.forceDownload%" - }, - "sync.forceUpload": { - "type": "boolean", - "default": false, - "description": "%ext.config.forceUpload%" - }, - "sync.quietSync": { - "type": "boolean", - "default": false, - "description": "%ext.config.quietSync%" - }, - "sync.removeExtensions": { - "type": "boolean", - "default": true, - "description": "%ext.config.removeExtensions%" - }, - "sync.syncExtensions": { - "type": "boolean", - "default": true, - "description": "%ext.config.syncExtensions%" - } - }, - "title": "%ext.config.title%" - } - }, - "scripts": { - "vscode:prepublish": "npm run tslint-check && webpack --config configs/webpack.production.config.js", - "compile": "webpack --config configs/webpack.development.config.js", - "watch": "webpack --config configs/webpack.development.config.js --watch", - "postinstall": "node ./node_modules/vscode/bin/install", - "tslint-check": "tslint -c ./tslint.json ./src/**/*.ts ./src/*.ts", - "format": "prettier --write './src/**/*.ts'", - "test": "npm run tslint-check && tsc -p ./ && mocha --recursive \"./out/test/**/*.js\"" - }, - "devDependencies": { - "@types/chai": "4.2.1", - "@types/express": "^4.16.1", - "@types/lodash": "^4.14.123", - "@types/node-fetch": "^2.3.3", - "@types/fs-extra": "^8.0.0", - "@types/mocha": "^5.2.6", - "@types/node": "^12.0.9", - "@types/recursive-readdir": "^2.2.0", - "chai": "^4.2.0", - "clean-webpack-plugin": "^3.0.0", - "mocha": "^6.0.2", - "prettier": "^1.16.4", - "ts-loader": "^5.3.3", - "tslint": "^5.15.0", - "tslint-plugin-prettier": "^2.0.1", - "typescript": "^3.4.1", - "vscode": "^1.1.33", - "webpack": "^4.29.6", - "webpack-cli": "^3.3.0", - "webpack-merge": "^4.2.1" - }, - "dependencies": { - "@octokit/rest": "^16.23.2", - "adm-zip": "^0.4.13", - "const": "^1.0.0", - "express": "^4.16.4", - "fs-extra": "^8.0.1", - "https-proxy-agent": "^2.2.1", - "lockfile": "^1.0.4", - "lodash": "^4.17.15", - "node-fetch": "^2.5.0", - "recursive-readdir": "^2.2.2", - "temp": "^0.9.0", - "vscode-chokidar": "^2.1.6" - } -} \ No newline at end of file diff --git a/.history/package_20241206234457.json b/.history/package_20241206234457.json deleted file mode 100644 index 10e889ec..00000000 --- a/.history/package_20241206234457.json +++ /dev/null @@ -1,192 +0,0 @@ -{ - "name": "code-settings-sync", - "displayName": "Settings Sync", - "description": "Synchronize Settings, Snippets, Themes, File Icons, Launch, Keybindings, Workspaces and Extensions Across Multiple Machines Using GitHub Gist.", - "version": "3.4.3", - "icon": "images/logo-128.png", - "publisher": "Shan", - "author": { - "name": "Shan Khan", - "url": "http://shanalikhan.github.io", - "email": "shanalikhan@hotmail.com" - }, - "homepage": "https://shanalikhan.github.io", - "galleryBanner": { - "color": "#3B4859", - "theme": "dark" - }, - "engines": { - "vscode": "^1.95.0" - }, - "badges": [ - { - "url": "https://vsmarketplacebadge.apphb.com/version/Shan.code-settings-sync.svg", - "description": "Latest Version", - "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" - }, - { - "url": "https://vsmarketplacebadge.apphb.com/installs/Shan.code-settings-sync.svg", - "description": "Total Downloads", - "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" - }, - { - "url": "https://vsmarketplacebadge.apphb.com/rating/Shan.code-settings-sync.svg", - "description": "Ratings", - "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" - }, - { - "url": "https://img.shields.io/badge/Join%20Community-slack-green.svg", - "description": "Join Slack Community", - "href": "https://join.slack.com/t/codesettingssync/shared_invite/enQtNzQyODMzMzI5MDQ3LWNmZjVkZjE2YTg0MzY1Y2EyYzVmYThmNzg2YjZkNjhhZWY3ZTEzN2I3ZTAxMjkwNWU0ZjMyZGFhMjdiZDI3ODU" - } - ], - "repository": { - "type": "git", - "url": "https://github.com/shanalikhan/code-settings-sync.git" - }, - "bugs": { - "url": "https://github.com/shanalikhan/code-settings-sync/issues", - "email": "shanalikhan@hotmail.com" - }, - "categories": [ - "Other" - ], - "keywords": [ - "vscode-sync", - "vscode-settings-sync", - "code-settings-sync", - "settings-sync", - "workspace-sync", - "multi-root ready" - ], - "extensionKind": "ui", - "activationEvents": [ - "*" - ], - "main": "./out/extension.js", - "contributes": { - "commands": [ - { - "command": "extension.HowSettings", - "title": "%cmd.howSetting.title%" - }, - { - "command": "extension.downloadSettings", - "title": "%cmd.downloadSettings.title%" - }, - { - "command": "extension.updateSettings", - "title": "%cmd.updateSettings.title%" - }, - { - "command": "extension.resetSettings", - "title": "%cmd.resetSettings.title%" - }, - { - "command": "extension.otherOptions", - "title": "%cmd.otherOptions.title%" - } - ], - "keybindings": [ - { - "key": "alt+shift+u", - "command": "extension.updateSettings" - }, - { - "key": "alt+shift+d", - "command": "extension.downloadSettings" - } - ], - "configuration": { - "properties": { - "sync.gist": { - "type": "string", - "default": "", - "description": "%ext.config.gist%" - }, - "sync.autoDownload": { - "type": "boolean", - "default": false, - "description": "%ext.config.autoDownload%" - }, - "sync.autoUpload": { - "type": "boolean", - "default": false, - "description": "%ext.config.autoUpload%" - }, - "sync.forceDownload": { - "type": "boolean", - "default": false, - "description": "%ext.config.forceDownload%" - }, - "sync.forceUpload": { - "type": "boolean", - "default": false, - "description": "%ext.config.forceUpload%" - }, - "sync.quietSync": { - "type": "boolean", - "default": false, - "description": "%ext.config.quietSync%" - }, - "sync.removeExtensions": { - "type": "boolean", - "default": true, - "description": "%ext.config.removeExtensions%" - }, - "sync.syncExtensions": { - "type": "boolean", - "default": true, - "description": "%ext.config.syncExtensions%" - } - }, - "title": "%ext.config.title%" - } - }, - "scripts": { - "vscode:prepublish": "npm run tslint-check && webpack --config configs/webpack.production.config.js", - "compile": "webpack --config configs/webpack.development.config.js", - "watch": "webpack --config configs/webpack.development.config.js --watch", - "postinstall": "node ./node_modules/vscode/bin/install", - "tslint-check": "tslint -c ./tslint.json ./src/**/*.ts ./src/*.ts", - "format": "prettier --write './src/**/*.ts'", - "test": "npm run tslint-check && tsc -p ./ && mocha --recursive \"./out/test/**/*.js\"" - }, - "devDependencies": { - "@types/chai": "^5.0.1", - "@types/express": "^5.0.0", - "@types/fs-extra": "^11.0.4", - "@types/lodash": "^4.14.123", - "@types/mocha": "^10.0.10", - "@types/node": "^22.10.1", - "@types/node-fetch": "^2.6.12", - "@types/recursive-readdir": "^2.2.0", - "@types/vscode": "^1.95.0", - "chai": "^5.1.2", - "clean-webpack-plugin": "^4.0.0", - "mocha": "^11.0.1", - "prettier": "^3.4.2", - "ts-loader": "^9.5.1", - "tslint": "^6.1.3", - "tslint-plugin-prettier": "^2.3.0", - "typescript": "^5.7.2", - "vscode": "^1.1.33", - "webpack": "^5.97.1", - "webpack-cli": "^5.1.4", - "webpack-merge": "^6.0.1" - }, - "dependencies": { - "@octokit/rest": "^21.0.2", - "adm-zip": "^0.5.16", - "const": "^1.0.0", - "express": "^4.21.2", - "fs-extra": "^11.2.0", - "https-proxy-agent": "^7.0.5", - "lockfile": "^1.0.4", - "lodash": "^4.17.15", - "node-fetch": "^3.3.2", - "recursive-readdir": "^2.2.2", - "temp": "^0.9.0", - "vscode-chokidar": "^2.1.6" - } -} \ No newline at end of file diff --git a/.history/package_20241206234507.json b/.history/package_20241206234507.json deleted file mode 100644 index 7bfb16e1..00000000 --- a/.history/package_20241206234507.json +++ /dev/null @@ -1,192 +0,0 @@ -{ - "name": "code-settings-sync", - "displayName": "Settings Sync", - "description": "Synchronize Settings, Snippets, Themes, File Icons, Launch, Keybindings, Workspaces and Extensions Across Multiple Machines Using GitHub Gist.", - "version": "3.4.3", - "icon": "images/logo-128.png", - "publisher": "Shan", - "author": { - "name": "Shan Khan", - "url": "http://shanalikhan.github.io", - "email": "shanalikhan@hotmail.com" - }, - "homepage": "https://shanalikhan.github.io", - "galleryBanner": { - "color": "#3B4859", - "theme": "dark" - }, - "engines": { - "vscode": "^1.95.0" - }, - "badges": [ - { - "url": "https://vsmarketplacebadge.apphb.com/version/Shan.code-settings-sync.svg", - "description": "Latest Version", - "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" - }, - { - "url": "https://vsmarketplacebadge.apphb.com/installs/Shan.code-settings-sync.svg", - "description": "Total Downloads", - "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" - }, - { - "url": "https://vsmarketplacebadge.apphb.com/rating/Shan.code-settings-sync.svg", - "description": "Ratings", - "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" - }, - { - "url": "https://img.shields.io/badge/Join%20Community-slack-green.svg", - "description": "Join Slack Community", - "href": "https://join.slack.com/t/codesettingssync/shared_invite/enQtNzQyODMzMzI5MDQ3LWNmZjVkZjE2YTg0MzY1Y2EyYzVmYThmNzg2YjZkNjhhZWY3ZTEzN2I3ZTAxMjkwNWU0ZjMyZGFhMjdiZDI3ODU" - } - ], - "repository": { - "type": "git", - "url": "https://github.com/shanalikhan/code-settings-sync.git" - }, - "bugs": { - "url": "https://github.com/shanalikhan/code-settings-sync/issues", - "email": "shanalikhan@hotmail.com" - }, - "categories": [ - "Other" - ], - "keywords": [ - "vscode-sync", - "vscode-settings-sync", - "code-settings-sync", - "settings-sync", - "workspace-sync", - "multi-root ready" - ], - "extensionKind": "ui", - "activationEvents": [ - "*" - ], - "main": "./out/extension.js", - "contributes": { - "commands": [ - { - "command": "extension.HowSettings", - "title": "%cmd.howSetting.title%" - }, - { - "command": "extension.downloadSettings", - "title": "%cmd.downloadSettings.title%" - }, - { - "command": "extension.updateSettings", - "title": "%cmd.updateSettings.title%" - }, - { - "command": "extension.resetSettings", - "title": "%cmd.resetSettings.title%" - }, - { - "command": "extension.otherOptions", - "title": "%cmd.otherOptions.title%" - } - ], - "keybindings": [ - { - "key": "alt+shift+u", - "command": "extension.updateSettings" - }, - { - "key": "alt+shift+d", - "command": "extension.downloadSettings" - } - ], - "configuration": { - "properties": { - "sync.gist": { - "type": "string", - "default": "", - "description": "%ext.config.gist%" - }, - "sync.autoDownload": { - "type": "boolean", - "default": false, - "description": "%ext.config.autoDownload%" - }, - "sync.autoUpload": { - "type": "boolean", - "default": false, - "description": "%ext.config.autoUpload%" - }, - "sync.forceDownload": { - "type": "boolean", - "default": false, - "description": "%ext.config.forceDownload%" - }, - "sync.forceUpload": { - "type": "boolean", - "default": false, - "description": "%ext.config.forceUpload%" - }, - "sync.quietSync": { - "type": "boolean", - "default": false, - "description": "%ext.config.quietSync%" - }, - "sync.removeExtensions": { - "type": "boolean", - "default": true, - "description": "%ext.config.removeExtensions%" - }, - "sync.syncExtensions": { - "type": "boolean", - "default": true, - "description": "%ext.config.syncExtensions%" - } - }, - "title": "%ext.config.title%" - } - }, - "scripts": { - "vscode:prepublish": "npm run tslint-check && webpack --config configs/webpack.production.config.js", - "compile": "webpack --config configs/webpack.development.config.js", - "watch": "webpack --config configs/webpack.development.config.js --watch", - "postinstall": "node ./node_modules/vscode/bin/install", - "tslint-check": "tslint -c ./tslint.json ./src/**/*.ts ./src/*.ts", - "format": "prettier --write './src/**/*.ts'", - "test": "npm run tslint-check && tsc -p ./ && mocha --recursive \"./out/test/**/*.js\"" - }, - "devDependencies": { - "@types/chai": "^5.0.1", - "@types/express": "^5.0.0", - "@types/fs-extra": "^11.0.4", - "@types/lodash": "^4.14.123", - "@types/mocha": "^10.0.10", - "@types/node": "^22.10.1", - "@types/node-fetch": "^2.6.12", - "@types/recursive-readdir": "^2.2.0", - "@types/vscode": "^1.95.0", - "chai": "^5.1.2", - "clean-webpack-plugin": "^4.0.0", - "mocha": "^11.0.1", - "prettier": "^3.4.2", - "ts-loader": "^9.5.1", - "tslint": "^6.1.3", - "tslint-plugin-prettier": "^2.3.0", - "typescript": "^5.7.2", - "vscode": "^1.1.37", - "webpack": "^5.97.1", - "webpack-cli": "^5.1.4", - "webpack-merge": "^6.0.1" - }, - "dependencies": { - "@octokit/rest": "^21.0.2", - "adm-zip": "^0.5.16", - "const": "^1.0.0", - "express": "^4.21.2", - "fs-extra": "^11.2.0", - "https-proxy-agent": "^7.0.5", - "lockfile": "^1.0.4", - "lodash": "^4.17.15", - "node-fetch": "^3.3.2", - "recursive-readdir": "^2.2.2", - "temp": "^0.9.0", - "vscode-chokidar": "^2.1.6" - } -} \ No newline at end of file diff --git a/.history/package_20241206234513.json b/.history/package_20241206234513.json deleted file mode 100644 index 9db30d5b..00000000 --- a/.history/package_20241206234513.json +++ /dev/null @@ -1,192 +0,0 @@ -{ - "name": "code-settings-sync", - "displayName": "Settings Sync", - "description": "Synchronize Settings, Snippets, Themes, File Icons, Launch, Keybindings, Workspaces and Extensions Across Multiple Machines Using GitHub Gist.", - "version": "3.4.3", - "icon": "images/logo-128.png", - "publisher": "Shan", - "author": { - "name": "Shan Khan", - "url": "http://shanalikhan.github.io", - "email": "shanalikhan@hotmail.com" - }, - "homepage": "https://shanalikhan.github.io", - "galleryBanner": { - "color": "#3B4859", - "theme": "dark" - }, - "engines": { - "vscode": "^1.95.0" - }, - "badges": [ - { - "url": "https://vsmarketplacebadge.apphb.com/version/Shan.code-settings-sync.svg", - "description": "Latest Version", - "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" - }, - { - "url": "https://vsmarketplacebadge.apphb.com/installs/Shan.code-settings-sync.svg", - "description": "Total Downloads", - "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" - }, - { - "url": "https://vsmarketplacebadge.apphb.com/rating/Shan.code-settings-sync.svg", - "description": "Ratings", - "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" - }, - { - "url": "https://img.shields.io/badge/Join%20Community-slack-green.svg", - "description": "Join Slack Community", - "href": "https://join.slack.com/t/codesettingssync/shared_invite/enQtNzQyODMzMzI5MDQ3LWNmZjVkZjE2YTg0MzY1Y2EyYzVmYThmNzg2YjZkNjhhZWY3ZTEzN2I3ZTAxMjkwNWU0ZjMyZGFhMjdiZDI3ODU" - } - ], - "repository": { - "type": "git", - "url": "https://github.com/shanalikhan/code-settings-sync.git" - }, - "bugs": { - "url": "https://github.com/shanalikhan/code-settings-sync/issues", - "email": "shanalikhan@hotmail.com" - }, - "categories": [ - "Other" - ], - "keywords": [ - "vscode-sync", - "vscode-settings-sync", - "code-settings-sync", - "settings-sync", - "workspace-sync", - "multi-root ready" - ], - "extensionKind": "ui", - "activationEvents": [ - "*" - ], - "main": "./out/extension.js", - "contributes": { - "commands": [ - { - "command": "extension.HowSettings", - "title": "%cmd.howSetting.title%" - }, - { - "command": "extension.downloadSettings", - "title": "%cmd.downloadSettings.title%" - }, - { - "command": "extension.updateSettings", - "title": "%cmd.updateSettings.title%" - }, - { - "command": "extension.resetSettings", - "title": "%cmd.resetSettings.title%" - }, - { - "command": "extension.otherOptions", - "title": "%cmd.otherOptions.title%" - } - ], - "keybindings": [ - { - "key": "alt+shift+u", - "command": "extension.updateSettings" - }, - { - "key": "alt+shift+d", - "command": "extension.downloadSettings" - } - ], - "configuration": { - "properties": { - "sync.gist": { - "type": "string", - "default": "", - "description": "%ext.config.gist%" - }, - "sync.autoDownload": { - "type": "boolean", - "default": false, - "description": "%ext.config.autoDownload%" - }, - "sync.autoUpload": { - "type": "boolean", - "default": false, - "description": "%ext.config.autoUpload%" - }, - "sync.forceDownload": { - "type": "boolean", - "default": false, - "description": "%ext.config.forceDownload%" - }, - "sync.forceUpload": { - "type": "boolean", - "default": false, - "description": "%ext.config.forceUpload%" - }, - "sync.quietSync": { - "type": "boolean", - "default": false, - "description": "%ext.config.quietSync%" - }, - "sync.removeExtensions": { - "type": "boolean", - "default": true, - "description": "%ext.config.removeExtensions%" - }, - "sync.syncExtensions": { - "type": "boolean", - "default": true, - "description": "%ext.config.syncExtensions%" - } - }, - "title": "%ext.config.title%" - } - }, - "scripts": { - "vscode:prepublish": "npm run tslint-check && webpack --config configs/webpack.production.config.js", - "compile": "webpack --config configs/webpack.development.config.js", - "watch": "webpack --config configs/webpack.development.config.js --watch", - "postinstall": "node ./node_modules/vscode/bin/install", - "tslint-check": "tslint -c ./tslint.json ./src/**/*.ts ./src/*.ts", - "format": "prettier --write './src/**/*.ts'", - "test": "npm run tslint-check && tsc -p ./ && mocha --recursive \"./out/test/**/*.js\"" - }, - "devDependencies": { - "@types/chai": "^5.0.1", - "@types/express": "^5.0.0", - "@types/fs-extra": "^11.0.4", - "@types/lodash": "^4.14.123", - "@types/mocha": "^10.0.10", - "@types/node": "^22.10.1", - "@types/node-fetch": "^2.6.12", - "@types/recursive-readdir": "^2.2.4", - "@types/vscode": "^1.95.0", - "chai": "^5.1.2", - "clean-webpack-plugin": "^4.0.0", - "mocha": "^11.0.1", - "prettier": "^3.4.2", - "ts-loader": "^9.5.1", - "tslint": "^6.1.3", - "tslint-plugin-prettier": "^2.3.0", - "typescript": "^5.7.2", - "vscode": "^1.1.37", - "webpack": "^5.97.1", - "webpack-cli": "^5.1.4", - "webpack-merge": "^6.0.1" - }, - "dependencies": { - "@octokit/rest": "^21.0.2", - "adm-zip": "^0.5.16", - "const": "^1.0.0", - "express": "^4.21.2", - "fs-extra": "^11.2.0", - "https-proxy-agent": "^7.0.5", - "lockfile": "^1.0.4", - "lodash": "^4.17.15", - "node-fetch": "^3.3.2", - "recursive-readdir": "^2.2.2", - "temp": "^0.9.0", - "vscode-chokidar": "^2.1.6" - } -} \ No newline at end of file diff --git a/.history/package_20241206234604.json b/.history/package_20241206234604.json deleted file mode 100644 index 43528533..00000000 --- a/.history/package_20241206234604.json +++ /dev/null @@ -1,192 +0,0 @@ -{ - "name": "code-settings-sync", - "displayName": "Settings Sync", - "description": "Synchronize Settings, Snippets, Themes, File Icons, Launch, Keybindings, Workspaces and Extensions Across Multiple Machines Using GitHub Gist.", - "version": "3.4.3", - "icon": "images/logo-128.png", - "publisher": "Shan", - "author": { - "name": "Shan Khan", - "url": "http://shanalikhan.github.io", - "email": "shanalikhan@hotmail.com" - }, - "homepage": "https://shanalikhan.github.io", - "galleryBanner": { - "color": "#3B4859", - "theme": "dark" - }, - "engines": { - "vscode": "^1.95.0" - }, - "badges": [ - { - "url": "https://vsmarketplacebadge.apphb.com/version/Shan.code-settings-sync.svg", - "description": "Latest Version", - "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" - }, - { - "url": "https://vsmarketplacebadge.apphb.com/installs/Shan.code-settings-sync.svg", - "description": "Total Downloads", - "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" - }, - { - "url": "https://vsmarketplacebadge.apphb.com/rating/Shan.code-settings-sync.svg", - "description": "Ratings", - "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" - }, - { - "url": "https://img.shields.io/badge/Join%20Community-slack-green.svg", - "description": "Join Slack Community", - "href": "https://join.slack.com/t/codesettingssync/shared_invite/enQtNzQyODMzMzI5MDQ3LWNmZjVkZjE2YTg0MzY1Y2EyYzVmYThmNzg2YjZkNjhhZWY3ZTEzN2I3ZTAxMjkwNWU0ZjMyZGFhMjdiZDI3ODU" - } - ], - "repository": { - "type": "git", - "url": "https://github.com/shanalikhan/code-settings-sync.git" - }, - "bugs": { - "url": "https://github.com/shanalikhan/code-settings-sync/issues", - "email": "shanalikhan@hotmail.com" - }, - "categories": [ - "Other" - ], - "keywords": [ - "vscode-sync", - "vscode-settings-sync", - "code-settings-sync", - "settings-sync", - "workspace-sync", - "multi-root ready" - ], - "extensionKind": "ui", - "activationEvents": [ - "*" - ], - "main": "./out/extension.js", - "contributes": { - "commands": [ - { - "command": "extension.HowSettings", - "title": "%cmd.howSetting.title%" - }, - { - "command": "extension.downloadSettings", - "title": "%cmd.downloadSettings.title%" - }, - { - "command": "extension.updateSettings", - "title": "%cmd.updateSettings.title%" - }, - { - "command": "extension.resetSettings", - "title": "%cmd.resetSettings.title%" - }, - { - "command": "extension.otherOptions", - "title": "%cmd.otherOptions.title%" - } - ], - "keybindings": [ - { - "key": "alt+shift+u", - "command": "extension.updateSettings" - }, - { - "key": "alt+shift+d", - "command": "extension.downloadSettings" - } - ], - "configuration": { - "properties": { - "sync.gist": { - "type": "string", - "default": "", - "description": "%ext.config.gist%" - }, - "sync.autoDownload": { - "type": "boolean", - "default": false, - "description": "%ext.config.autoDownload%" - }, - "sync.autoUpload": { - "type": "boolean", - "default": false, - "description": "%ext.config.autoUpload%" - }, - "sync.forceDownload": { - "type": "boolean", - "default": false, - "description": "%ext.config.forceDownload%" - }, - "sync.forceUpload": { - "type": "boolean", - "default": false, - "description": "%ext.config.forceUpload%" - }, - "sync.quietSync": { - "type": "boolean", - "default": false, - "description": "%ext.config.quietSync%" - }, - "sync.removeExtensions": { - "type": "boolean", - "default": true, - "description": "%ext.config.removeExtensions%" - }, - "sync.syncExtensions": { - "type": "boolean", - "default": true, - "description": "%ext.config.syncExtensions%" - } - }, - "title": "%ext.config.title%" - } - }, - "scripts": { - "vscode:prepublish": "npm run tslint-check && webpack --config configs/webpack.production.config.js", - "compile": "webpack --config configs/webpack.development.config.js", - "watch": "webpack --config configs/webpack.development.config.js --watch", - "postinstall": "node ./node_modules/vscode/bin/install", - "tslint-check": "tslint -c ./tslint.json ./src/**/*.ts ./src/*.ts", - "format": "prettier --write './src/**/*.ts'", - "test": "npm run tslint-check && tsc -p ./ && mocha --recursive \"./out/test/**/*.js\"" - }, - "devDependencies": { - "@types/chai": "^5.0.1", - "@types/express": "^5.0.0", - "@types/fs-extra": "^11.0.4", - "@types/lodash": "^4.14.123", - "@types/mocha": "^10.0.10", - "@types/node": "^20.10.0", - "@types/node-fetch": "^2.6.12", - "@types/recursive-readdir": "^2.2.4", - "@types/vscode": "^1.95.0", - "chai": "^5.1.2", - "clean-webpack-plugin": "^4.0.0", - "mocha": "^11.0.1", - "prettier": "^3.4.2", - "ts-loader": "^9.5.1", - "tslint": "^6.1.3", - "tslint-plugin-prettier": "^2.3.0", - "typescript": "^5.7.2", - "vscode": "^1.1.37", - "webpack": "^5.97.1", - "webpack-cli": "^5.1.4", - "webpack-merge": "^6.0.1" - }, - "dependencies": { - "@octokit/rest": "^21.0.2", - "adm-zip": "^0.5.16", - "const": "^1.0.0", - "express": "^4.21.2", - "fs-extra": "^11.2.0", - "https-proxy-agent": "^7.0.5", - "lockfile": "^1.0.4", - "lodash": "^4.17.15", - "node-fetch": "^3.3.2", - "recursive-readdir": "^2.2.2", - "temp": "^0.9.0", - "vscode-chokidar": "^2.1.6" - } -} \ No newline at end of file diff --git a/.history/package_20241206234710.json b/.history/package_20241206234710.json deleted file mode 100644 index 9aa6fa5b..00000000 --- a/.history/package_20241206234710.json +++ /dev/null @@ -1,191 +0,0 @@ -{ - "name": "code-settings-sync", - "displayName": "Settings Sync", - "description": "Synchronize Settings, Snippets, Themes, File Icons, Launch, Keybindings, Workspaces and Extensions Across Multiple Machines Using GitHub Gist.", - "version": "3.4.3", - "icon": "images/logo-128.png", - "publisher": "Shan", - "author": { - "name": "Shan Khan", - "url": "http://shanalikhan.github.io", - "email": "shanalikhan@hotmail.com" - }, - "homepage": "https://shanalikhan.github.io", - "galleryBanner": { - "color": "#3B4859", - "theme": "dark" - }, - "engines": { - "vscode": "^1.95.0" - }, - "badges": [ - { - "url": "https://vsmarketplacebadge.apphb.com/version/Shan.code-settings-sync.svg", - "description": "Latest Version", - "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" - }, - { - "url": "https://vsmarketplacebadge.apphb.com/installs/Shan.code-settings-sync.svg", - "description": "Total Downloads", - "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" - }, - { - "url": "https://vsmarketplacebadge.apphb.com/rating/Shan.code-settings-sync.svg", - "description": "Ratings", - "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" - }, - { - "url": "https://img.shields.io/badge/Join%20Community-slack-green.svg", - "description": "Join Slack Community", - "href": "https://join.slack.com/t/codesettingssync/shared_invite/enQtNzQyODMzMzI5MDQ3LWNmZjVkZjE2YTg0MzY1Y2EyYzVmYThmNzg2YjZkNjhhZWY3ZTEzN2I3ZTAxMjkwNWU0ZjMyZGFhMjdiZDI3ODU" - } - ], - "repository": { - "type": "git", - "url": "https://github.com/shanalikhan/code-settings-sync.git" - }, - "bugs": { - "url": "https://github.com/shanalikhan/code-settings-sync/issues", - "email": "shanalikhan@hotmail.com" - }, - "categories": [ - "Other" - ], - "keywords": [ - "vscode-sync", - "vscode-settings-sync", - "code-settings-sync", - "settings-sync", - "workspace-sync", - "multi-root ready" - ], - "extensionKind": "ui", - "activationEvents": [ - "*" - ], - "main": "./out/extension.js", - "contributes": { - "commands": [ - { - "command": "extension.HowSettings", - "title": "%cmd.howSetting.title%" - }, - { - "command": "extension.downloadSettings", - "title": "%cmd.downloadSettings.title%" - }, - { - "command": "extension.updateSettings", - "title": "%cmd.updateSettings.title%" - }, - { - "command": "extension.resetSettings", - "title": "%cmd.resetSettings.title%" - }, - { - "command": "extension.otherOptions", - "title": "%cmd.otherOptions.title%" - } - ], - "keybindings": [ - { - "key": "alt+shift+u", - "command": "extension.updateSettings" - }, - { - "key": "alt+shift+d", - "command": "extension.downloadSettings" - } - ], - "configuration": { - "properties": { - "sync.gist": { - "type": "string", - "default": "", - "description": "%ext.config.gist%" - }, - "sync.autoDownload": { - "type": "boolean", - "default": false, - "description": "%ext.config.autoDownload%" - }, - "sync.autoUpload": { - "type": "boolean", - "default": false, - "description": "%ext.config.autoUpload%" - }, - "sync.forceDownload": { - "type": "boolean", - "default": false, - "description": "%ext.config.forceDownload%" - }, - "sync.forceUpload": { - "type": "boolean", - "default": false, - "description": "%ext.config.forceUpload%" - }, - "sync.quietSync": { - "type": "boolean", - "default": false, - "description": "%ext.config.quietSync%" - }, - "sync.removeExtensions": { - "type": "boolean", - "default": true, - "description": "%ext.config.removeExtensions%" - }, - "sync.syncExtensions": { - "type": "boolean", - "default": true, - "description": "%ext.config.syncExtensions%" - } - }, - "title": "%ext.config.title%" - } - }, - "scripts": { - "vscode:prepublish": "npm run tslint-check && webpack --config configs/webpack.production.config.js", - "compile": "webpack --config configs/webpack.development.config.js", - "watch": "webpack --config configs/webpack.development.config.js --watch", - "postinstall": "node ./node_modules/vscode/bin/install", - "tslint-check": "tslint -c ./tslint.json ./src/**/*.ts ./src/*.ts", - "format": "prettier --write './src/**/*.ts'", - "test": "npm run tslint-check && tsc -p ./ && mocha --recursive \"./out/test/**/*.js\"" - }, - "devDependencies": { - "@types/chai": "^5.0.1", - "@types/express": "^5.0.0", - "@types/fs-extra": "^11.0.4", - "@types/lodash": "^4.14.123", - "@types/mocha": "^10.0.10", - "@types/node": "^20.10.0", - "@types/node-fetch": "^2.6.12", - "@types/recursive-readdir": "^2.2.4", - "@types/vscode": "^1.95.0", - "chai": "^5.1.2", - "clean-webpack-plugin": "^4.0.0", - "mocha": "^11.0.1", - "prettier": "^3.4.2", - "ts-loader": "^9.5.1", - "tslint": "^6.1.3", - "typescript": "^5.7.2", - "vscode": "^1.1.37", - "webpack": "^5.97.1", - "webpack-cli": "^5.1.4", - "webpack-merge": "^6.0.1" - }, - "dependencies": { - "@octokit/rest": "^21.0.2", - "adm-zip": "^0.5.16", - "const": "^1.0.0", - "express": "^4.21.2", - "fs-extra": "^11.2.0", - "https-proxy-agent": "^7.0.5", - "lockfile": "^1.0.4", - "lodash": "^4.17.15", - "node-fetch": "^3.3.2", - "recursive-readdir": "^2.2.2", - "temp": "^0.9.0", - "vscode-chokidar": "^2.1.6" - } -} \ No newline at end of file diff --git a/.history/package_20241206234810.json b/.history/package_20241206234810.json deleted file mode 100644 index d8aed5f3..00000000 --- a/.history/package_20241206234810.json +++ /dev/null @@ -1,194 +0,0 @@ -{ - "name": "code-settings-sync", - "displayName": "Settings Sync", - "description": "Synchronize Settings, Snippets, Themes, File Icons, Launch, Keybindings, Workspaces and Extensions Across Multiple Machines Using GitHub Gist.", - "version": "3.4.3", - "icon": "images/logo-128.png", - "publisher": "Shan", - "author": { - "name": "Shan Khan", - "url": "http://shanalikhan.github.io", - "email": "shanalikhan@hotmail.com" - }, - "homepage": "https://shanalikhan.github.io", - "galleryBanner": { - "color": "#3B4859", - "theme": "dark" - }, - "engines": { - "vscode": "^1.95.0" - }, - "badges": [ - { - "url": "https://vsmarketplacebadge.apphb.com/version/Shan.code-settings-sync.svg", - "description": "Latest Version", - "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" - }, - { - "url": "https://vsmarketplacebadge.apphb.com/installs/Shan.code-settings-sync.svg", - "description": "Total Downloads", - "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" - }, - { - "url": "https://vsmarketplacebadge.apphb.com/rating/Shan.code-settings-sync.svg", - "description": "Ratings", - "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" - }, - { - "url": "https://img.shields.io/badge/Join%20Community-slack-green.svg", - "description": "Join Slack Community", - "href": "https://join.slack.com/t/codesettingssync/shared_invite/enQtNzQyODMzMzI5MDQ3LWNmZjVkZjE2YTg0MzY1Y2EyYzVmYThmNzg2YjZkNjhhZWY3ZTEzN2I3ZTAxMjkwNWU0ZjMyZGFhMjdiZDI3ODU" - } - ], - "repository": { - "type": "git", - "url": "https://github.com/shanalikhan/code-settings-sync.git" - }, - "bugs": { - "url": "https://github.com/shanalikhan/code-settings-sync/issues", - "email": "shanalikhan@hotmail.com" - }, - "categories": [ - "Other" - ], - "keywords": [ - "vscode-sync", - "vscode-settings-sync", - "code-settings-sync", - "settings-sync", - "workspace-sync", - "multi-root ready" - ], - "extensionKind": "ui", - "activationEvents": [ - "*" - ], - "main": "./out/extension.js", - "contributes": { - "commands": [ - { - "command": "extension.HowSettings", - "title": "%cmd.howSetting.title%" - }, - { - "command": "extension.downloadSettings", - "title": "%cmd.downloadSettings.title%" - }, - { - "command": "extension.updateSettings", - "title": "%cmd.updateSettings.title%" - }, - { - "command": "extension.resetSettings", - "title": "%cmd.resetSettings.title%" - }, - { - "command": "extension.otherOptions", - "title": "%cmd.otherOptions.title%" - } - ], - "keybindings": [ - { - "key": "alt+shift+u", - "command": "extension.updateSettings" - }, - { - "key": "alt+shift+d", - "command": "extension.downloadSettings" - } - ], - "configuration": { - "properties": { - "sync.gist": { - "type": "string", - "default": "", - "description": "%ext.config.gist%" - }, - "sync.autoDownload": { - "type": "boolean", - "default": false, - "description": "%ext.config.autoDownload%" - }, - "sync.autoUpload": { - "type": "boolean", - "default": false, - "description": "%ext.config.autoUpload%" - }, - "sync.forceDownload": { - "type": "boolean", - "default": false, - "description": "%ext.config.forceDownload%" - }, - "sync.forceUpload": { - "type": "boolean", - "default": false, - "description": "%ext.config.forceUpload%" - }, - "sync.quietSync": { - "type": "boolean", - "default": false, - "description": "%ext.config.quietSync%" - }, - "sync.removeExtensions": { - "type": "boolean", - "default": true, - "description": "%ext.config.removeExtensions%" - }, - "sync.syncExtensions": { - "type": "boolean", - "default": true, - "description": "%ext.config.syncExtensions%" - } - }, - "title": "%ext.config.title%" - } - }, - "scripts": { - "vscode:prepublish": "npm run tslint-check && webpack --config configs/webpack.production.config.js", - "compile": "webpack --config configs/webpack.development.config.js", - "watch": "webpack --config configs/webpack.development.config.js --watch", - "postinstall": "node ./node_modules/vscode/bin/install", - "tslint-check": "tslint -c ./tslint.json ./src/**/*.ts ./src/*.ts", - "format": "prettier --write './src/**/*.ts'", - "test": "npm run tslint-check && tsc -p ./ && mocha --recursive \"./out/test/**/*.js\"" - }, - "devDependencies": { - "@types/chai": "^5.0.1", - "@types/express": "^5.0.0", - "@types/fs-extra": "^11.0.4", - "@types/lodash": "^4.14.123", - "@types/mocha": "^10.0.10", - "@types/node": "^20.10.0", - "@types/node-fetch": "^2.6.12", - "@types/recursive-readdir": "^2.2.4", - "@types/vscode": "^1.95.0", - "@typescript-eslint/eslint-plugin": "^8.10.0", - "@typescript-eslint/parser": "^8.7.0", - "eslint": "^9.13.0", - "chai": "^5.1.2", - "clean-webpack-plugin": "^4.0.0", - "mocha": "^11.0.1", - "prettier": "^3.4.2", - "ts-loader": "^9.5.1", - "tslint": "^6.1.3", - "typescript": "^5.7.2", - "vscode": "^1.1.37", - "webpack": "^5.97.1", - "webpack-cli": "^5.1.4", - "webpack-merge": "^6.0.1" - }, - "dependencies": { - "@octokit/rest": "^21.0.2", - "adm-zip": "^0.5.16", - "const": "^1.0.0", - "express": "^4.21.2", - "fs-extra": "^11.2.0", - "https-proxy-agent": "^7.0.5", - "lockfile": "^1.0.4", - "lodash": "^4.17.15", - "node-fetch": "^3.3.2", - "recursive-readdir": "^2.2.2", - "temp": "^0.9.0", - "vscode-chokidar": "^2.1.6" - } -} \ No newline at end of file diff --git a/.history/package_20241206234811.json b/.history/package_20241206234811.json deleted file mode 100644 index d8aed5f3..00000000 --- a/.history/package_20241206234811.json +++ /dev/null @@ -1,194 +0,0 @@ -{ - "name": "code-settings-sync", - "displayName": "Settings Sync", - "description": "Synchronize Settings, Snippets, Themes, File Icons, Launch, Keybindings, Workspaces and Extensions Across Multiple Machines Using GitHub Gist.", - "version": "3.4.3", - "icon": "images/logo-128.png", - "publisher": "Shan", - "author": { - "name": "Shan Khan", - "url": "http://shanalikhan.github.io", - "email": "shanalikhan@hotmail.com" - }, - "homepage": "https://shanalikhan.github.io", - "galleryBanner": { - "color": "#3B4859", - "theme": "dark" - }, - "engines": { - "vscode": "^1.95.0" - }, - "badges": [ - { - "url": "https://vsmarketplacebadge.apphb.com/version/Shan.code-settings-sync.svg", - "description": "Latest Version", - "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" - }, - { - "url": "https://vsmarketplacebadge.apphb.com/installs/Shan.code-settings-sync.svg", - "description": "Total Downloads", - "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" - }, - { - "url": "https://vsmarketplacebadge.apphb.com/rating/Shan.code-settings-sync.svg", - "description": "Ratings", - "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" - }, - { - "url": "https://img.shields.io/badge/Join%20Community-slack-green.svg", - "description": "Join Slack Community", - "href": "https://join.slack.com/t/codesettingssync/shared_invite/enQtNzQyODMzMzI5MDQ3LWNmZjVkZjE2YTg0MzY1Y2EyYzVmYThmNzg2YjZkNjhhZWY3ZTEzN2I3ZTAxMjkwNWU0ZjMyZGFhMjdiZDI3ODU" - } - ], - "repository": { - "type": "git", - "url": "https://github.com/shanalikhan/code-settings-sync.git" - }, - "bugs": { - "url": "https://github.com/shanalikhan/code-settings-sync/issues", - "email": "shanalikhan@hotmail.com" - }, - "categories": [ - "Other" - ], - "keywords": [ - "vscode-sync", - "vscode-settings-sync", - "code-settings-sync", - "settings-sync", - "workspace-sync", - "multi-root ready" - ], - "extensionKind": "ui", - "activationEvents": [ - "*" - ], - "main": "./out/extension.js", - "contributes": { - "commands": [ - { - "command": "extension.HowSettings", - "title": "%cmd.howSetting.title%" - }, - { - "command": "extension.downloadSettings", - "title": "%cmd.downloadSettings.title%" - }, - { - "command": "extension.updateSettings", - "title": "%cmd.updateSettings.title%" - }, - { - "command": "extension.resetSettings", - "title": "%cmd.resetSettings.title%" - }, - { - "command": "extension.otherOptions", - "title": "%cmd.otherOptions.title%" - } - ], - "keybindings": [ - { - "key": "alt+shift+u", - "command": "extension.updateSettings" - }, - { - "key": "alt+shift+d", - "command": "extension.downloadSettings" - } - ], - "configuration": { - "properties": { - "sync.gist": { - "type": "string", - "default": "", - "description": "%ext.config.gist%" - }, - "sync.autoDownload": { - "type": "boolean", - "default": false, - "description": "%ext.config.autoDownload%" - }, - "sync.autoUpload": { - "type": "boolean", - "default": false, - "description": "%ext.config.autoUpload%" - }, - "sync.forceDownload": { - "type": "boolean", - "default": false, - "description": "%ext.config.forceDownload%" - }, - "sync.forceUpload": { - "type": "boolean", - "default": false, - "description": "%ext.config.forceUpload%" - }, - "sync.quietSync": { - "type": "boolean", - "default": false, - "description": "%ext.config.quietSync%" - }, - "sync.removeExtensions": { - "type": "boolean", - "default": true, - "description": "%ext.config.removeExtensions%" - }, - "sync.syncExtensions": { - "type": "boolean", - "default": true, - "description": "%ext.config.syncExtensions%" - } - }, - "title": "%ext.config.title%" - } - }, - "scripts": { - "vscode:prepublish": "npm run tslint-check && webpack --config configs/webpack.production.config.js", - "compile": "webpack --config configs/webpack.development.config.js", - "watch": "webpack --config configs/webpack.development.config.js --watch", - "postinstall": "node ./node_modules/vscode/bin/install", - "tslint-check": "tslint -c ./tslint.json ./src/**/*.ts ./src/*.ts", - "format": "prettier --write './src/**/*.ts'", - "test": "npm run tslint-check && tsc -p ./ && mocha --recursive \"./out/test/**/*.js\"" - }, - "devDependencies": { - "@types/chai": "^5.0.1", - "@types/express": "^5.0.0", - "@types/fs-extra": "^11.0.4", - "@types/lodash": "^4.14.123", - "@types/mocha": "^10.0.10", - "@types/node": "^20.10.0", - "@types/node-fetch": "^2.6.12", - "@types/recursive-readdir": "^2.2.4", - "@types/vscode": "^1.95.0", - "@typescript-eslint/eslint-plugin": "^8.10.0", - "@typescript-eslint/parser": "^8.7.0", - "eslint": "^9.13.0", - "chai": "^5.1.2", - "clean-webpack-plugin": "^4.0.0", - "mocha": "^11.0.1", - "prettier": "^3.4.2", - "ts-loader": "^9.5.1", - "tslint": "^6.1.3", - "typescript": "^5.7.2", - "vscode": "^1.1.37", - "webpack": "^5.97.1", - "webpack-cli": "^5.1.4", - "webpack-merge": "^6.0.1" - }, - "dependencies": { - "@octokit/rest": "^21.0.2", - "adm-zip": "^0.5.16", - "const": "^1.0.0", - "express": "^4.21.2", - "fs-extra": "^11.2.0", - "https-proxy-agent": "^7.0.5", - "lockfile": "^1.0.4", - "lodash": "^4.17.15", - "node-fetch": "^3.3.2", - "recursive-readdir": "^2.2.2", - "temp": "^0.9.0", - "vscode-chokidar": "^2.1.6" - } -} \ No newline at end of file diff --git a/.history/package_20241206234923.json b/.history/package_20241206234923.json deleted file mode 100644 index 463134fb..00000000 --- a/.history/package_20241206234923.json +++ /dev/null @@ -1,193 +0,0 @@ -{ - "name": "code-settings-sync", - "displayName": "Settings Sync", - "description": "Synchronize Settings, Snippets, Themes, File Icons, Launch, Keybindings, Workspaces and Extensions Across Multiple Machines Using GitHub Gist.", - "version": "3.4.3", - "icon": "images/logo-128.png", - "publisher": "Shan", - "author": { - "name": "Shan Khan", - "url": "http://shanalikhan.github.io", - "email": "shanalikhan@hotmail.com" - }, - "homepage": "https://shanalikhan.github.io", - "galleryBanner": { - "color": "#3B4859", - "theme": "dark" - }, - "engines": { - "vscode": "^1.95.0" - }, - "badges": [ - { - "url": "https://vsmarketplacebadge.apphb.com/version/Shan.code-settings-sync.svg", - "description": "Latest Version", - "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" - }, - { - "url": "https://vsmarketplacebadge.apphb.com/installs/Shan.code-settings-sync.svg", - "description": "Total Downloads", - "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" - }, - { - "url": "https://vsmarketplacebadge.apphb.com/rating/Shan.code-settings-sync.svg", - "description": "Ratings", - "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" - }, - { - "url": "https://img.shields.io/badge/Join%20Community-slack-green.svg", - "description": "Join Slack Community", - "href": "https://join.slack.com/t/codesettingssync/shared_invite/enQtNzQyODMzMzI5MDQ3LWNmZjVkZjE2YTg0MzY1Y2EyYzVmYThmNzg2YjZkNjhhZWY3ZTEzN2I3ZTAxMjkwNWU0ZjMyZGFhMjdiZDI3ODU" - } - ], - "repository": { - "type": "git", - "url": "https://github.com/shanalikhan/code-settings-sync.git" - }, - "bugs": { - "url": "https://github.com/shanalikhan/code-settings-sync/issues", - "email": "shanalikhan@hotmail.com" - }, - "categories": [ - "Other" - ], - "keywords": [ - "vscode-sync", - "vscode-settings-sync", - "code-settings-sync", - "settings-sync", - "workspace-sync", - "multi-root ready" - ], - "extensionKind": "ui", - "activationEvents": [ - "*" - ], - "main": "./out/extension.js", - "contributes": { - "commands": [ - { - "command": "extension.HowSettings", - "title": "%cmd.howSetting.title%" - }, - { - "command": "extension.downloadSettings", - "title": "%cmd.downloadSettings.title%" - }, - { - "command": "extension.updateSettings", - "title": "%cmd.updateSettings.title%" - }, - { - "command": "extension.resetSettings", - "title": "%cmd.resetSettings.title%" - }, - { - "command": "extension.otherOptions", - "title": "%cmd.otherOptions.title%" - } - ], - "keybindings": [ - { - "key": "alt+shift+u", - "command": "extension.updateSettings" - }, - { - "key": "alt+shift+d", - "command": "extension.downloadSettings" - } - ], - "configuration": { - "properties": { - "sync.gist": { - "type": "string", - "default": "", - "description": "%ext.config.gist%" - }, - "sync.autoDownload": { - "type": "boolean", - "default": false, - "description": "%ext.config.autoDownload%" - }, - "sync.autoUpload": { - "type": "boolean", - "default": false, - "description": "%ext.config.autoUpload%" - }, - "sync.forceDownload": { - "type": "boolean", - "default": false, - "description": "%ext.config.forceDownload%" - }, - "sync.forceUpload": { - "type": "boolean", - "default": false, - "description": "%ext.config.forceUpload%" - }, - "sync.quietSync": { - "type": "boolean", - "default": false, - "description": "%ext.config.quietSync%" - }, - "sync.removeExtensions": { - "type": "boolean", - "default": true, - "description": "%ext.config.removeExtensions%" - }, - "sync.syncExtensions": { - "type": "boolean", - "default": true, - "description": "%ext.config.syncExtensions%" - } - }, - "title": "%ext.config.title%" - } - }, - "scripts": { - "vscode:prepublish": "npm run tslint-check && webpack --config configs/webpack.production.config.js", - "compile": "webpack --config configs/webpack.development.config.js", - "watch": "webpack --config configs/webpack.development.config.js --watch", - "postinstall": "node ./node_modules/vscode/bin/install", - "tslint-check": "tslint -c ./tslint.json ./src/**/*.ts ./src/*.ts", - "format": "prettier --write './src/**/*.ts'", - "test": "npm run tslint-check && tsc -p ./ && mocha --recursive \"./out/test/**/*.js\"" - }, - "devDependencies": { - "@types/chai": "^5.0.1", - "@types/express": "^5.0.0", - "@types/fs-extra": "^11.0.4", - "@types/lodash": "^4.14.123", - "@types/mocha": "^10.0.10", - "@types/node": "^20.10.0", - "@types/node-fetch": "^2.6.12", - "@types/recursive-readdir": "^2.2.4", - "@types/vscode": "^1.95.0", - "@typescript-eslint/eslint-plugin": "^8.10.0", - "@typescript-eslint/parser": "^8.7.0", - "eslint": "^9.13.0", - "chai": "^5.1.2", - "clean-webpack-plugin": "^4.0.0", - "mocha": "^11.0.1", - "prettier": "^3.4.2", - "ts-loader": "^9.5.1", - "typescript": "^5.7.2", - "vscode": "^1.1.37", - "webpack": "^5.97.1", - "webpack-cli": "^5.1.4", - "webpack-merge": "^6.0.1" - }, - "dependencies": { - "@octokit/rest": "^21.0.2", - "adm-zip": "^0.5.16", - "const": "^1.0.0", - "express": "^4.21.2", - "fs-extra": "^11.2.0", - "https-proxy-agent": "^7.0.5", - "lockfile": "^1.0.4", - "lodash": "^4.17.15", - "node-fetch": "^3.3.2", - "recursive-readdir": "^2.2.2", - "temp": "^0.9.0", - "vscode-chokidar": "^2.1.6" - } -} \ No newline at end of file diff --git a/.history/package_20241206234924.json b/.history/package_20241206234924.json deleted file mode 100644 index 463134fb..00000000 --- a/.history/package_20241206234924.json +++ /dev/null @@ -1,193 +0,0 @@ -{ - "name": "code-settings-sync", - "displayName": "Settings Sync", - "description": "Synchronize Settings, Snippets, Themes, File Icons, Launch, Keybindings, Workspaces and Extensions Across Multiple Machines Using GitHub Gist.", - "version": "3.4.3", - "icon": "images/logo-128.png", - "publisher": "Shan", - "author": { - "name": "Shan Khan", - "url": "http://shanalikhan.github.io", - "email": "shanalikhan@hotmail.com" - }, - "homepage": "https://shanalikhan.github.io", - "galleryBanner": { - "color": "#3B4859", - "theme": "dark" - }, - "engines": { - "vscode": "^1.95.0" - }, - "badges": [ - { - "url": "https://vsmarketplacebadge.apphb.com/version/Shan.code-settings-sync.svg", - "description": "Latest Version", - "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" - }, - { - "url": "https://vsmarketplacebadge.apphb.com/installs/Shan.code-settings-sync.svg", - "description": "Total Downloads", - "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" - }, - { - "url": "https://vsmarketplacebadge.apphb.com/rating/Shan.code-settings-sync.svg", - "description": "Ratings", - "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync" - }, - { - "url": "https://img.shields.io/badge/Join%20Community-slack-green.svg", - "description": "Join Slack Community", - "href": "https://join.slack.com/t/codesettingssync/shared_invite/enQtNzQyODMzMzI5MDQ3LWNmZjVkZjE2YTg0MzY1Y2EyYzVmYThmNzg2YjZkNjhhZWY3ZTEzN2I3ZTAxMjkwNWU0ZjMyZGFhMjdiZDI3ODU" - } - ], - "repository": { - "type": "git", - "url": "https://github.com/shanalikhan/code-settings-sync.git" - }, - "bugs": { - "url": "https://github.com/shanalikhan/code-settings-sync/issues", - "email": "shanalikhan@hotmail.com" - }, - "categories": [ - "Other" - ], - "keywords": [ - "vscode-sync", - "vscode-settings-sync", - "code-settings-sync", - "settings-sync", - "workspace-sync", - "multi-root ready" - ], - "extensionKind": "ui", - "activationEvents": [ - "*" - ], - "main": "./out/extension.js", - "contributes": { - "commands": [ - { - "command": "extension.HowSettings", - "title": "%cmd.howSetting.title%" - }, - { - "command": "extension.downloadSettings", - "title": "%cmd.downloadSettings.title%" - }, - { - "command": "extension.updateSettings", - "title": "%cmd.updateSettings.title%" - }, - { - "command": "extension.resetSettings", - "title": "%cmd.resetSettings.title%" - }, - { - "command": "extension.otherOptions", - "title": "%cmd.otherOptions.title%" - } - ], - "keybindings": [ - { - "key": "alt+shift+u", - "command": "extension.updateSettings" - }, - { - "key": "alt+shift+d", - "command": "extension.downloadSettings" - } - ], - "configuration": { - "properties": { - "sync.gist": { - "type": "string", - "default": "", - "description": "%ext.config.gist%" - }, - "sync.autoDownload": { - "type": "boolean", - "default": false, - "description": "%ext.config.autoDownload%" - }, - "sync.autoUpload": { - "type": "boolean", - "default": false, - "description": "%ext.config.autoUpload%" - }, - "sync.forceDownload": { - "type": "boolean", - "default": false, - "description": "%ext.config.forceDownload%" - }, - "sync.forceUpload": { - "type": "boolean", - "default": false, - "description": "%ext.config.forceUpload%" - }, - "sync.quietSync": { - "type": "boolean", - "default": false, - "description": "%ext.config.quietSync%" - }, - "sync.removeExtensions": { - "type": "boolean", - "default": true, - "description": "%ext.config.removeExtensions%" - }, - "sync.syncExtensions": { - "type": "boolean", - "default": true, - "description": "%ext.config.syncExtensions%" - } - }, - "title": "%ext.config.title%" - } - }, - "scripts": { - "vscode:prepublish": "npm run tslint-check && webpack --config configs/webpack.production.config.js", - "compile": "webpack --config configs/webpack.development.config.js", - "watch": "webpack --config configs/webpack.development.config.js --watch", - "postinstall": "node ./node_modules/vscode/bin/install", - "tslint-check": "tslint -c ./tslint.json ./src/**/*.ts ./src/*.ts", - "format": "prettier --write './src/**/*.ts'", - "test": "npm run tslint-check && tsc -p ./ && mocha --recursive \"./out/test/**/*.js\"" - }, - "devDependencies": { - "@types/chai": "^5.0.1", - "@types/express": "^5.0.0", - "@types/fs-extra": "^11.0.4", - "@types/lodash": "^4.14.123", - "@types/mocha": "^10.0.10", - "@types/node": "^20.10.0", - "@types/node-fetch": "^2.6.12", - "@types/recursive-readdir": "^2.2.4", - "@types/vscode": "^1.95.0", - "@typescript-eslint/eslint-plugin": "^8.10.0", - "@typescript-eslint/parser": "^8.7.0", - "eslint": "^9.13.0", - "chai": "^5.1.2", - "clean-webpack-plugin": "^4.0.0", - "mocha": "^11.0.1", - "prettier": "^3.4.2", - "ts-loader": "^9.5.1", - "typescript": "^5.7.2", - "vscode": "^1.1.37", - "webpack": "^5.97.1", - "webpack-cli": "^5.1.4", - "webpack-merge": "^6.0.1" - }, - "dependencies": { - "@octokit/rest": "^21.0.2", - "adm-zip": "^0.5.16", - "const": "^1.0.0", - "express": "^4.21.2", - "fs-extra": "^11.2.0", - "https-proxy-agent": "^7.0.5", - "lockfile": "^1.0.4", - "lodash": "^4.17.15", - "node-fetch": "^3.3.2", - "recursive-readdir": "^2.2.2", - "temp": "^0.9.0", - "vscode-chokidar": "^2.1.6" - } -} \ No newline at end of file diff --git a/.history/src/service/github.oauth.service_20241102143121.ts b/.history/src/service/github.oauth.service_20241102143121.ts deleted file mode 100644 index ca2256ff..00000000 --- a/.history/src/service/github.oauth.service_20241102143121.ts +++ /dev/null @@ -1,136 +0,0 @@ -import * as express from "express"; -import { Server } from "http"; -import fetch from "node-fetch"; -import { URL, URLSearchParams } from "url"; -import Commons from "../commons"; -import { state } from "../state"; - -export class GitHubOAuthService { - public app: express.Express; - public server: Server; - - constructor(public port: number) { - this.app = express(); - this.app.use(express.json(), express.urlencoded({ extended: false })); - } - - public async StartProcess(cmd?: string) { - const customSettings = await state.commons.GetCustomSettings(); - const host = customSettings.githubEnterpriseUrl - ? new URL(customSettings.githubEnterpriseUrl) - : new URL("https://github.com"); - - this.server = this.app.listen(this.port); - this.app.get("/callback", async (req, res) => { - try { - const params = new URLSearchParams( - await (await this.getToken(req.param("code"), host)).text() - ); - - res.send(` - - - - - - - - -

Success! You may now close this tab.

- - - - `); - this.server.close(); - - const token = params.get("access_token"); - this.saveToken(token); - - const user = await this.getUser(token, host); - - const gists: any[] = await this.getGists(token, user, host); - - const gistViewList: any[] = gists.map(m => { - return { - id: m.id, - description: m.description, - updated_at: m.updated_at - }; - }); - - state.commons.webviewService.OpenGistSelectionpage(gistViewList, cmd); - } catch (err) { - const error = new Error(err); - Commons.LogException(error, state.commons.ERROR_MESSAGE, true); - } - }); - } - - public getToken(code: string, host: URL) { - const params = new URLSearchParams(); - params.append("client_id", "cfd96460d8b110e2351b"); - params.append("client_secret", "ed46bd3a0f736e0da57308e86ca5fa3cf8688582"); - params.append("code", code); - - const promise = fetch(`https://${host.hostname}/login/oauth/access_token`, { - method: "POST", - body: params - }); - - promise.catch(err => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - return promise; - } - - public async getGists(token: string, user: string, host: URL) { - const promise = fetch(`https://api.${host.hostname}/users/${user}/gists`, { - method: "GET", - headers: { Authorization: `token ${token}` } - }); - - promise.catch(err => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - const res = await promise; - const gists = await res.json(); - return gists; - } - - public async saveToken(token: string) { - const currentSettings = await state.commons.GetCustomSettings(); - currentSettings.token = token; - state.commons.SetCustomSettings(currentSettings); - } - - public async getUser(token: string, host: URL) { - const promise = fetch(`https://api.${host.hostname}/user`, { - method: "GET", - headers: { Authorization: `token ${token}` } - }); - - promise.catch(err => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - const res = await promise; - const json = await res.json(); - return json.login; - } -} diff --git a/.history/src/service/github.oauth.service_20241206235603.ts b/.history/src/service/github.oauth.service_20241206235603.ts deleted file mode 100644 index fa2a9c58..00000000 --- a/.history/src/service/github.oauth.service_20241206235603.ts +++ /dev/null @@ -1,136 +0,0 @@ -import * as express from "express"; -import { Server } from "http"; -import fetch from "node-fetch"; -import { URL, URLSearchParams } from "url"; -import Commons from "../commons"; -import { state } from "../state"; - -export class GitHubOAuthService { - public app: express.Express; - public server: Server; - - constructor(public port: number) { - this.app = express(); - this.app.use(express.json(), express.urlencoded({ extended: false })); - } - - public async StartProcess(cmd?: string) { - const customSettings = await state.commons.GetCustomSettings(); - const host = customSettings.githubEnterpriseUrl - ? new URL(customSettings.githubEnterpriseUrl) - : new URL("https://github.com"); - - this.server = this.app.listen(this.port); - this.app.get("/callback", async (req, res) => { - try { - const params = new URLSearchParams( - await (await this.getToken(req.params("code"), host)).text() - ); - - res.send(` - - - - - - - - -

Success! You may now close this tab.

- - - - `); - this.server.close(); - - const token = params.get("access_token"); - this.saveToken(token); - - const user = await this.getUser(token, host); - - const gists: any[] = await this.getGists(token, user, host); - - const gistViewList: any[] = gists.map(m => { - return { - id: m.id, - description: m.description, - updated_at: m.updated_at - }; - }); - - state.commons.webviewService.OpenGistSelectionpage(gistViewList, cmd); - } catch (err) { - const error = new Error(err); - Commons.LogException(error, state.commons.ERROR_MESSAGE, true); - } - }); - } - - public getToken(code: string, host: URL) { - const params = new URLSearchParams(); - params.append("client_id", "cfd96460d8b110e2351b"); - params.append("client_secret", "ed46bd3a0f736e0da57308e86ca5fa3cf8688582"); - params.append("code", code); - - const promise = fetch(`https://${host.hostname}/login/oauth/access_token`, { - method: "POST", - body: params - }); - - promise.catch(err => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - return promise; - } - - public async getGists(token: string, user: string, host: URL) { - const promise = fetch(`https://api.${host.hostname}/users/${user}/gists`, { - method: "GET", - headers: { Authorization: `token ${token}` } - }); - - promise.catch(err => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - const res = await promise; - const gists = await res.json(); - return gists; - } - - public async saveToken(token: string) { - const currentSettings = await state.commons.GetCustomSettings(); - currentSettings.token = token; - state.commons.SetCustomSettings(currentSettings); - } - - public async getUser(token: string, host: URL) { - const promise = fetch(`https://api.${host.hostname}/user`, { - method: "GET", - headers: { Authorization: `token ${token}` } - }); - - promise.catch(err => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - const res = await promise; - const json = await res.json(); - return json.login; - } -} diff --git a/.history/src/service/github.oauth.service_20241206235606.ts b/.history/src/service/github.oauth.service_20241206235606.ts deleted file mode 100644 index ca2256ff..00000000 --- a/.history/src/service/github.oauth.service_20241206235606.ts +++ /dev/null @@ -1,136 +0,0 @@ -import * as express from "express"; -import { Server } from "http"; -import fetch from "node-fetch"; -import { URL, URLSearchParams } from "url"; -import Commons from "../commons"; -import { state } from "../state"; - -export class GitHubOAuthService { - public app: express.Express; - public server: Server; - - constructor(public port: number) { - this.app = express(); - this.app.use(express.json(), express.urlencoded({ extended: false })); - } - - public async StartProcess(cmd?: string) { - const customSettings = await state.commons.GetCustomSettings(); - const host = customSettings.githubEnterpriseUrl - ? new URL(customSettings.githubEnterpriseUrl) - : new URL("https://github.com"); - - this.server = this.app.listen(this.port); - this.app.get("/callback", async (req, res) => { - try { - const params = new URLSearchParams( - await (await this.getToken(req.param("code"), host)).text() - ); - - res.send(` - - - - - - - - -

Success! You may now close this tab.

- - - - `); - this.server.close(); - - const token = params.get("access_token"); - this.saveToken(token); - - const user = await this.getUser(token, host); - - const gists: any[] = await this.getGists(token, user, host); - - const gistViewList: any[] = gists.map(m => { - return { - id: m.id, - description: m.description, - updated_at: m.updated_at - }; - }); - - state.commons.webviewService.OpenGistSelectionpage(gistViewList, cmd); - } catch (err) { - const error = new Error(err); - Commons.LogException(error, state.commons.ERROR_MESSAGE, true); - } - }); - } - - public getToken(code: string, host: URL) { - const params = new URLSearchParams(); - params.append("client_id", "cfd96460d8b110e2351b"); - params.append("client_secret", "ed46bd3a0f736e0da57308e86ca5fa3cf8688582"); - params.append("code", code); - - const promise = fetch(`https://${host.hostname}/login/oauth/access_token`, { - method: "POST", - body: params - }); - - promise.catch(err => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - return promise; - } - - public async getGists(token: string, user: string, host: URL) { - const promise = fetch(`https://api.${host.hostname}/users/${user}/gists`, { - method: "GET", - headers: { Authorization: `token ${token}` } - }); - - promise.catch(err => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - const res = await promise; - const gists = await res.json(); - return gists; - } - - public async saveToken(token: string) { - const currentSettings = await state.commons.GetCustomSettings(); - currentSettings.token = token; - state.commons.SetCustomSettings(currentSettings); - } - - public async getUser(token: string, host: URL) { - const promise = fetch(`https://api.${host.hostname}/user`, { - method: "GET", - headers: { Authorization: `token ${token}` } - }); - - promise.catch(err => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - const res = await promise; - const json = await res.json(); - return json.login; - } -} diff --git a/.history/src/service/github.oauth.service_20241206235613.ts b/.history/src/service/github.oauth.service_20241206235613.ts deleted file mode 100644 index 89a35782..00000000 --- a/.history/src/service/github.oauth.service_20241206235613.ts +++ /dev/null @@ -1,136 +0,0 @@ -import * as express from "express"; -import { Server } from "http"; -import fetch from "node-fetch"; -import { URL, URLSearchParams } from "url"; -import Commons from "../commons"; -import { state } from "../state"; - -export class GitHubOAuthService { - public app: express.Express; - public server: Server; - - constructor(public port: number) { - this.app = express(); - this.app.use(express.json(), express.urlencoded({ extended: false })); - } - - public async StartProcess(cmd?: string) { - const customSettings = await state.commons.GetCustomSettings(); - const host = customSettings.githubEnterpriseUrl - ? new URL(customSettings.githubEnterpriseUrl) - : new URL("https://github.com"); - - this.server = this.app.listen(this.port); - this.app.get("/callback", async (req, res) => { - try { - const params = new URLSearchParams( - await (await this.getToken(req.param("code"), host)).text() - ); - - res.send(` - - - - - - - - -

Success! You may now close this tab.

- - - - `); - this.server.close(); - - const token = params.get("access_token"); - this.saveToken(token); - - const user = await this.getUser(token, host); - - const gists: any[] = await this.getGists(token, user, host); - - const gistViewList: any[] = gists.map((m) => { - return { - id: m.id, - description: m.description, - updated_at: m.updated_at, - }; - }); - - state.commons.webviewService.OpenGistSelectionpage(gistViewList, cmd); - } catch (err) { - const error = new Error(err); - Commons.LogException(error, state.commons.ERROR_MESSAGE, true); - } - }); - } - - public getToken(code: string, host: URL) { - const params = new URLSearchParams(); - params.append("client_id", "cfd96460d8b110e2351b"); - params.append("client_secret", "ed46bd3a0f736e0da57308e86ca5fa3cf8688582"); - params.append("code", code); - - const promise = fetch(`https://${host.hostname}/login/oauth/access_token`, { - method: "POST", - body: params, - }); - - promise.catch((err) => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - return promise; - } - - public async getGists(token: string, user: string, host: URL) { - const promise = fetch(`https://api.${host.hostname}/users/${user}/gists`, { - method: "GET", - headers: { Authorization: `token ${token}` }, - }); - - promise.catch((err) => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - const res = await promise; - const gists = await res.json(); - return gists; - } - - public async saveToken(token: string) { - const currentSettings = await state.commons.GetCustomSettings(); - currentSettings.token = token; - state.commons.SetCustomSettings(currentSettings); - } - - public async getUser(token: string, host: URL) { - const promise = fetch(`https://api.${host.hostname}/user`, { - method: "GET", - headers: { Authorization: `token ${token}` }, - }); - - promise.catch((err) => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - const res = await promise; - const json = await res.json(); - return json.login; - } -} diff --git a/.history/src/service/github.oauth.service_20241206235624.ts b/.history/src/service/github.oauth.service_20241206235624.ts deleted file mode 100644 index b7f9b757..00000000 --- a/.history/src/service/github.oauth.service_20241206235624.ts +++ /dev/null @@ -1,136 +0,0 @@ -import * as express from "express"; -import { Server } from "http"; -import fetch from "node-fetch"; -import { URL, URLSearchParams } from "url"; -import Commons from "../commons"; -import { state } from "../state"; - -export class GitHubOAuthService { - public app: express.Express; - public server: Server; - - constructor(public port: number) { - this.app = express(); - this.app.use(express.json(), express.urlencoded({ extended: false })); - } - - public async StartProcess(cmd?: string) { - const customSettings = await state.commons.GetCustomSettings(); - const host = customSettings.githubEnterpriseUrl - ? new URL(customSettings.githubEnterpriseUrl) - : new URL("https://github.com"); - - this.server = this.app.listen(this.port); - this.app.get("/callback", async (req, res) => { - try { - const params = new URLSearchParams( - await (await this.getToken(req.params("code"), host)).text() - ); - - res.send(` - - - - - - - - -

Success! You may now close this tab.

- - - - `); - this.server.close(); - - const token = params.get("access_token"); - this.saveToken(token); - - const user = await this.getUser(token, host); - - const gists: any[] = await this.getGists(token, user, host); - - const gistViewList: any[] = gists.map((m) => { - return { - id: m.id, - description: m.description, - updated_at: m.updated_at, - }; - }); - - state.commons.webviewService.OpenGistSelectionpage(gistViewList, cmd); - } catch (err) { - const error = new Error(err); - Commons.LogException(error, state.commons.ERROR_MESSAGE, true); - } - }); - } - - public getToken(code: string, host: URL) { - const params = new URLSearchParams(); - params.append("client_id", "cfd96460d8b110e2351b"); - params.append("client_secret", "ed46bd3a0f736e0da57308e86ca5fa3cf8688582"); - params.append("code", code); - - const promise = fetch(`https://${host.hostname}/login/oauth/access_token`, { - method: "POST", - body: params, - }); - - promise.catch((err) => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - return promise; - } - - public async getGists(token: string, user: string, host: URL) { - const promise = fetch(`https://api.${host.hostname}/users/${user}/gists`, { - method: "GET", - headers: { Authorization: `token ${token}` }, - }); - - promise.catch((err) => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - const res = await promise; - const gists = await res.json(); - return gists; - } - - public async saveToken(token: string) { - const currentSettings = await state.commons.GetCustomSettings(); - currentSettings.token = token; - state.commons.SetCustomSettings(currentSettings); - } - - public async getUser(token: string, host: URL) { - const promise = fetch(`https://api.${host.hostname}/user`, { - method: "GET", - headers: { Authorization: `token ${token}` }, - }); - - promise.catch((err) => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - const res = await promise; - const json = await res.json(); - return json.login; - } -} diff --git a/.history/src/service/github.oauth.service_20241206235626.ts b/.history/src/service/github.oauth.service_20241206235626.ts deleted file mode 100644 index b7f9b757..00000000 --- a/.history/src/service/github.oauth.service_20241206235626.ts +++ /dev/null @@ -1,136 +0,0 @@ -import * as express from "express"; -import { Server } from "http"; -import fetch from "node-fetch"; -import { URL, URLSearchParams } from "url"; -import Commons from "../commons"; -import { state } from "../state"; - -export class GitHubOAuthService { - public app: express.Express; - public server: Server; - - constructor(public port: number) { - this.app = express(); - this.app.use(express.json(), express.urlencoded({ extended: false })); - } - - public async StartProcess(cmd?: string) { - const customSettings = await state.commons.GetCustomSettings(); - const host = customSettings.githubEnterpriseUrl - ? new URL(customSettings.githubEnterpriseUrl) - : new URL("https://github.com"); - - this.server = this.app.listen(this.port); - this.app.get("/callback", async (req, res) => { - try { - const params = new URLSearchParams( - await (await this.getToken(req.params("code"), host)).text() - ); - - res.send(` - - - - - - - - -

Success! You may now close this tab.

- - - - `); - this.server.close(); - - const token = params.get("access_token"); - this.saveToken(token); - - const user = await this.getUser(token, host); - - const gists: any[] = await this.getGists(token, user, host); - - const gistViewList: any[] = gists.map((m) => { - return { - id: m.id, - description: m.description, - updated_at: m.updated_at, - }; - }); - - state.commons.webviewService.OpenGistSelectionpage(gistViewList, cmd); - } catch (err) { - const error = new Error(err); - Commons.LogException(error, state.commons.ERROR_MESSAGE, true); - } - }); - } - - public getToken(code: string, host: URL) { - const params = new URLSearchParams(); - params.append("client_id", "cfd96460d8b110e2351b"); - params.append("client_secret", "ed46bd3a0f736e0da57308e86ca5fa3cf8688582"); - params.append("code", code); - - const promise = fetch(`https://${host.hostname}/login/oauth/access_token`, { - method: "POST", - body: params, - }); - - promise.catch((err) => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - return promise; - } - - public async getGists(token: string, user: string, host: URL) { - const promise = fetch(`https://api.${host.hostname}/users/${user}/gists`, { - method: "GET", - headers: { Authorization: `token ${token}` }, - }); - - promise.catch((err) => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - const res = await promise; - const gists = await res.json(); - return gists; - } - - public async saveToken(token: string) { - const currentSettings = await state.commons.GetCustomSettings(); - currentSettings.token = token; - state.commons.SetCustomSettings(currentSettings); - } - - public async getUser(token: string, host: URL) { - const promise = fetch(`https://api.${host.hostname}/user`, { - method: "GET", - headers: { Authorization: `token ${token}` }, - }); - - promise.catch((err) => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - const res = await promise; - const json = await res.json(); - return json.login; - } -} diff --git a/.history/src/service/github.oauth.service_20241206235700.ts b/.history/src/service/github.oauth.service_20241206235700.ts deleted file mode 100644 index b921120d..00000000 --- a/.history/src/service/github.oauth.service_20241206235700.ts +++ /dev/null @@ -1,136 +0,0 @@ -import * as express from "express"; -import { Server } from "http"; -import fetch from "node-fetch"; -import { URL, URLSearchParams } from "url"; -import Commons from "../commons"; -import { state } from "../state"; - -export class GitHubOAuthService { - public app: express.Express; - public server: Server; - - constructor(public port: number) { - this.app = express(); - this.app.use(express.json(), express.urlencoded({ extended: false })); - } - - public async StartProcess(cmd?: string) { - const customSettings = await state.commons.GetCustomSettings(); - const host = customSettings.githubEnterpriseUrl - ? new URL(customSettings.githubEnterpriseUrl) - : new URL("https://github.com"); - - this.server = this.app.listen(this.port); - this.app.get("/callback", async (req, res) => { - try { - const params = new URLSearchParams( - await (await this.getToken(req.params("code"), host)).text() - ); - - res.send(` - - - - - - - - -

Success! You may now close this tab.

- - - - `); - this.server.close(); - - const token = params.get("access_token"); - this.saveToken(token); - - const user = await this.getUser(token, host); - - const gists: any = await this.getGists(token, user, host); - - const gistViewList: any[] = gists.map((m) => { - return { - id: m.id, - description: m.description, - updated_at: m.updated_at, - }; - }); - - state.commons.webviewService.OpenGistSelectionpage(gistViewList, cmd); - } catch (err) { - const error = new Error(err); - Commons.LogException(error, state.commons.ERROR_MESSAGE, true); - } - }); - } - - public getToken(code: string, host: URL) { - const params = new URLSearchParams(); - params.append("client_id", "cfd96460d8b110e2351b"); - params.append("client_secret", "ed46bd3a0f736e0da57308e86ca5fa3cf8688582"); - params.append("code", code); - - const promise = fetch(`https://${host.hostname}/login/oauth/access_token`, { - method: "POST", - body: params, - }); - - promise.catch((err) => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - return promise; - } - - public async getGists(token: string, user: string, host: URL) { - const promise = fetch(`https://api.${host.hostname}/users/${user}/gists`, { - method: "GET", - headers: { Authorization: `token ${token}` }, - }); - - promise.catch((err) => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - const res = await promise; - const gists = await res.json(); - return gists; - } - - public async saveToken(token: string) { - const currentSettings = await state.commons.GetCustomSettings(); - currentSettings.token = token; - state.commons.SetCustomSettings(currentSettings); - } - - public async getUser(token: string, host: URL) { - const promise = fetch(`https://api.${host.hostname}/user`, { - method: "GET", - headers: { Authorization: `token ${token}` }, - }); - - promise.catch((err) => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - const res = await promise; - const json = await res.json(); - return json.login; - } -} diff --git a/.history/src/service/github.oauth.service_20241206235701.ts b/.history/src/service/github.oauth.service_20241206235701.ts deleted file mode 100644 index b921120d..00000000 --- a/.history/src/service/github.oauth.service_20241206235701.ts +++ /dev/null @@ -1,136 +0,0 @@ -import * as express from "express"; -import { Server } from "http"; -import fetch from "node-fetch"; -import { URL, URLSearchParams } from "url"; -import Commons from "../commons"; -import { state } from "../state"; - -export class GitHubOAuthService { - public app: express.Express; - public server: Server; - - constructor(public port: number) { - this.app = express(); - this.app.use(express.json(), express.urlencoded({ extended: false })); - } - - public async StartProcess(cmd?: string) { - const customSettings = await state.commons.GetCustomSettings(); - const host = customSettings.githubEnterpriseUrl - ? new URL(customSettings.githubEnterpriseUrl) - : new URL("https://github.com"); - - this.server = this.app.listen(this.port); - this.app.get("/callback", async (req, res) => { - try { - const params = new URLSearchParams( - await (await this.getToken(req.params("code"), host)).text() - ); - - res.send(` - - - - - - - - -

Success! You may now close this tab.

- - - - `); - this.server.close(); - - const token = params.get("access_token"); - this.saveToken(token); - - const user = await this.getUser(token, host); - - const gists: any = await this.getGists(token, user, host); - - const gistViewList: any[] = gists.map((m) => { - return { - id: m.id, - description: m.description, - updated_at: m.updated_at, - }; - }); - - state.commons.webviewService.OpenGistSelectionpage(gistViewList, cmd); - } catch (err) { - const error = new Error(err); - Commons.LogException(error, state.commons.ERROR_MESSAGE, true); - } - }); - } - - public getToken(code: string, host: URL) { - const params = new URLSearchParams(); - params.append("client_id", "cfd96460d8b110e2351b"); - params.append("client_secret", "ed46bd3a0f736e0da57308e86ca5fa3cf8688582"); - params.append("code", code); - - const promise = fetch(`https://${host.hostname}/login/oauth/access_token`, { - method: "POST", - body: params, - }); - - promise.catch((err) => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - return promise; - } - - public async getGists(token: string, user: string, host: URL) { - const promise = fetch(`https://api.${host.hostname}/users/${user}/gists`, { - method: "GET", - headers: { Authorization: `token ${token}` }, - }); - - promise.catch((err) => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - const res = await promise; - const gists = await res.json(); - return gists; - } - - public async saveToken(token: string) { - const currentSettings = await state.commons.GetCustomSettings(); - currentSettings.token = token; - state.commons.SetCustomSettings(currentSettings); - } - - public async getUser(token: string, host: URL) { - const promise = fetch(`https://api.${host.hostname}/user`, { - method: "GET", - headers: { Authorization: `token ${token}` }, - }); - - promise.catch((err) => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - const res = await promise; - const json = await res.json(); - return json.login; - } -} diff --git a/.history/src/service/github.oauth.service_20241206235709.ts b/.history/src/service/github.oauth.service_20241206235709.ts deleted file mode 100644 index 00dd7df6..00000000 --- a/.history/src/service/github.oauth.service_20241206235709.ts +++ /dev/null @@ -1,136 +0,0 @@ -import * as express from "express"; -import { Server } from "http"; -import fetch from "node-fetch"; -import { URL, URLSearchParams } from "url"; -import Commons from "../commons"; -import { state } from "../state"; - -export class GitHubOAuthService { - public app: express.Express; - public server: Server; - - constructor(public port: number) { - this.app = express(); - this.app.use(express.json(), express.urlencoded({ extended: false })); - } - - public async StartProcess(cmd?: string) { - const customSettings = await state.commons.GetCustomSettings(); - const host = customSettings.githubEnterpriseUrl - ? new URL(customSettings.githubEnterpriseUrl) - : new URL("https://github.com"); - - this.server = this.app.listen(this.port); - this.app.get("/callback", async (req, res) => { - try { - const params = new URLSearchParams( - await (await this.getToken(req.params("code"), host)).text() - ); - - res.send(` - - - - - - - - -

Success! You may now close this tab.

- - - - `); - this.server.close(); - - const token = params.get("access_token"); - this.saveToken(token); - - const user = await this.getUser(token, host); - - const gists: any = await this.getGists(token, user, host); - - const gistViewList: any[] = gists.map((m) => { - return { - id: m.id, - description: m.description, - updated_at: m.updated_at, - }; - }); - - state.commons.webviewService.OpenGistSelectionpage(gistViewList, cmd); - } catch (err) { - const error = new Error(err); - Commons.LogException(error, state.commons.ERROR_MESSAGE, true); - } - }); - } - - public getToken(code: string, host: URL) { - const params = new URLSearchParams(); - params.append("client_id", "cfd96460d8b110e2351b"); - params.append("client_secret", "ed46bd3a0f736e0da57308e86ca5fa3cf8688582"); - params.append("code", code); - - const promise = fetch(`https://${host.hostname}/login/oauth/access_token`, { - method: "POST", - body: params, - }); - - promise.catch((err) => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - return promise; - } - - public async getGists(token: string, user: string, host: URL) { - const promise = fetch(`https://api.${host.hostname}/users/${user}/gists`, { - method: "GET", - headers: { Authorization: `token ${token}` }, - }); - - promise.catch((err) => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - const res = await promise; - const gists = await res.json(); - return gists; - } - - public async saveToken(token: string) { - const currentSettings = await state.commons.GetCustomSettings(); - currentSettings.token = token; - state.commons.SetCustomSettings(currentSettings); - } - - public async getUser(token: string, host: URL) { - const promise = fetch(`https://api.${host.hostname}/user`, { - method: "GET", - headers: { Authorization: `token ${token}` }, - }); - - promise.catch((err) => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - const res = await promise; - const json = await res.json(); - return json?.login; - } -} diff --git a/.history/src/service/github.oauth.service_20241206235714.ts b/.history/src/service/github.oauth.service_20241206235714.ts deleted file mode 100644 index e82b245e..00000000 --- a/.history/src/service/github.oauth.service_20241206235714.ts +++ /dev/null @@ -1,136 +0,0 @@ -import * as express from "express"; -import { Server } from "http"; -import fetch from "node-fetch"; -import { URL, URLSearchParams } from "url"; -import Commons from "../commons"; -import { state } from "../state"; - -export class GitHubOAuthService { - public app: express.Express; - public server: Server; - - constructor(public port: number) { - this.app = express(); - this.app.use(express.json(), express.urlencoded({ extended: false })); - } - - public async StartProcess(cmd?: string) { - const customSettings = await state.commons.GetCustomSettings(); - const host = customSettings.githubEnterpriseUrl - ? new URL(customSettings.githubEnterpriseUrl) - : new URL("https://github.com"); - - this.server = this.app.listen(this.port); - this.app.get("/callback", async (req, res) => { - try { - const params = new URLSearchParams( - await (await this.getToken(req.params("code"), host)).text() - ); - - res.send(` - - - - - - - - -

Success! You may now close this tab.

- - - - `); - this.server.close(); - - const token = params.get("access_token"); - this.saveToken(token); - - const user = await this.getUser(token, host); - - const gists: any = await this.getGists(token, user, host); - - const gistViewList: any[] = gists.map((m) => { - return { - id: m.id, - description: m.description, - updated_at: m.updated_at, - }; - }); - - state.commons.webviewService.OpenGistSelectionpage(gistViewList, cmd); - } catch (err) { - const error = new Error(err); - Commons.LogException(error, state.commons.ERROR_MESSAGE, true); - } - }); - } - - public getToken(code: string, host: URL) { - const params = new URLSearchParams(); - params.append("client_id", "cfd96460d8b110e2351b"); - params.append("client_secret", "ed46bd3a0f736e0da57308e86ca5fa3cf8688582"); - params.append("code", code); - - const promise = fetch(`https://${host.hostname}/login/oauth/access_token`, { - method: "POST", - body: params, - }); - - promise.catch((err) => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - return promise; - } - - public async getGists(token: string, user: string, host: URL) { - const promise = fetch(`https://api.${host.hostname}/users/${user}/gists`, { - method: "GET", - headers: { Authorization: `token ${token}` }, - }); - - promise.catch((err) => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - const res = await promise; - const gists = await res.json(); - return gists; - } - - public async saveToken(token: string) { - const currentSettings = await state.commons.GetCustomSettings(); - currentSettings.token = token; - state.commons.SetCustomSettings(currentSettings); - } - - public async getUser(token: string, host: URL) { - const promise = fetch(`https://api.${host.hostname}/user`, { - method: "GET", - headers: { Authorization: `token ${token}` }, - }); - - promise.catch((err) => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - const res = await promise; - const json: any = await res.json(); - return json?.login; - } -} diff --git a/.history/src/service/github.oauth.service_20241206235715.ts b/.history/src/service/github.oauth.service_20241206235715.ts deleted file mode 100644 index e82b245e..00000000 --- a/.history/src/service/github.oauth.service_20241206235715.ts +++ /dev/null @@ -1,136 +0,0 @@ -import * as express from "express"; -import { Server } from "http"; -import fetch from "node-fetch"; -import { URL, URLSearchParams } from "url"; -import Commons from "../commons"; -import { state } from "../state"; - -export class GitHubOAuthService { - public app: express.Express; - public server: Server; - - constructor(public port: number) { - this.app = express(); - this.app.use(express.json(), express.urlencoded({ extended: false })); - } - - public async StartProcess(cmd?: string) { - const customSettings = await state.commons.GetCustomSettings(); - const host = customSettings.githubEnterpriseUrl - ? new URL(customSettings.githubEnterpriseUrl) - : new URL("https://github.com"); - - this.server = this.app.listen(this.port); - this.app.get("/callback", async (req, res) => { - try { - const params = new URLSearchParams( - await (await this.getToken(req.params("code"), host)).text() - ); - - res.send(` - - - - - - - - -

Success! You may now close this tab.

- - - - `); - this.server.close(); - - const token = params.get("access_token"); - this.saveToken(token); - - const user = await this.getUser(token, host); - - const gists: any = await this.getGists(token, user, host); - - const gistViewList: any[] = gists.map((m) => { - return { - id: m.id, - description: m.description, - updated_at: m.updated_at, - }; - }); - - state.commons.webviewService.OpenGistSelectionpage(gistViewList, cmd); - } catch (err) { - const error = new Error(err); - Commons.LogException(error, state.commons.ERROR_MESSAGE, true); - } - }); - } - - public getToken(code: string, host: URL) { - const params = new URLSearchParams(); - params.append("client_id", "cfd96460d8b110e2351b"); - params.append("client_secret", "ed46bd3a0f736e0da57308e86ca5fa3cf8688582"); - params.append("code", code); - - const promise = fetch(`https://${host.hostname}/login/oauth/access_token`, { - method: "POST", - body: params, - }); - - promise.catch((err) => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - return promise; - } - - public async getGists(token: string, user: string, host: URL) { - const promise = fetch(`https://api.${host.hostname}/users/${user}/gists`, { - method: "GET", - headers: { Authorization: `token ${token}` }, - }); - - promise.catch((err) => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - const res = await promise; - const gists = await res.json(); - return gists; - } - - public async saveToken(token: string) { - const currentSettings = await state.commons.GetCustomSettings(); - currentSettings.token = token; - state.commons.SetCustomSettings(currentSettings); - } - - public async getUser(token: string, host: URL) { - const promise = fetch(`https://api.${host.hostname}/user`, { - method: "GET", - headers: { Authorization: `token ${token}` }, - }); - - promise.catch((err) => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - const res = await promise; - const json: any = await res.json(); - return json?.login; - } -} diff --git a/.history/src/service/github.oauth.service_20241206235727.ts b/.history/src/service/github.oauth.service_20241206235727.ts deleted file mode 100644 index e82b245e..00000000 --- a/.history/src/service/github.oauth.service_20241206235727.ts +++ /dev/null @@ -1,136 +0,0 @@ -import * as express from "express"; -import { Server } from "http"; -import fetch from "node-fetch"; -import { URL, URLSearchParams } from "url"; -import Commons from "../commons"; -import { state } from "../state"; - -export class GitHubOAuthService { - public app: express.Express; - public server: Server; - - constructor(public port: number) { - this.app = express(); - this.app.use(express.json(), express.urlencoded({ extended: false })); - } - - public async StartProcess(cmd?: string) { - const customSettings = await state.commons.GetCustomSettings(); - const host = customSettings.githubEnterpriseUrl - ? new URL(customSettings.githubEnterpriseUrl) - : new URL("https://github.com"); - - this.server = this.app.listen(this.port); - this.app.get("/callback", async (req, res) => { - try { - const params = new URLSearchParams( - await (await this.getToken(req.params("code"), host)).text() - ); - - res.send(` - - - - - - - - -

Success! You may now close this tab.

- - - - `); - this.server.close(); - - const token = params.get("access_token"); - this.saveToken(token); - - const user = await this.getUser(token, host); - - const gists: any = await this.getGists(token, user, host); - - const gistViewList: any[] = gists.map((m) => { - return { - id: m.id, - description: m.description, - updated_at: m.updated_at, - }; - }); - - state.commons.webviewService.OpenGistSelectionpage(gistViewList, cmd); - } catch (err) { - const error = new Error(err); - Commons.LogException(error, state.commons.ERROR_MESSAGE, true); - } - }); - } - - public getToken(code: string, host: URL) { - const params = new URLSearchParams(); - params.append("client_id", "cfd96460d8b110e2351b"); - params.append("client_secret", "ed46bd3a0f736e0da57308e86ca5fa3cf8688582"); - params.append("code", code); - - const promise = fetch(`https://${host.hostname}/login/oauth/access_token`, { - method: "POST", - body: params, - }); - - promise.catch((err) => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - return promise; - } - - public async getGists(token: string, user: string, host: URL) { - const promise = fetch(`https://api.${host.hostname}/users/${user}/gists`, { - method: "GET", - headers: { Authorization: `token ${token}` }, - }); - - promise.catch((err) => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - const res = await promise; - const gists = await res.json(); - return gists; - } - - public async saveToken(token: string) { - const currentSettings = await state.commons.GetCustomSettings(); - currentSettings.token = token; - state.commons.SetCustomSettings(currentSettings); - } - - public async getUser(token: string, host: URL) { - const promise = fetch(`https://api.${host.hostname}/user`, { - method: "GET", - headers: { Authorization: `token ${token}` }, - }); - - promise.catch((err) => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - const res = await promise; - const json: any = await res.json(); - return json?.login; - } -} diff --git a/.history/src/service/github.oauth.service_20241206235731.ts b/.history/src/service/github.oauth.service_20241206235731.ts deleted file mode 100644 index 72189839..00000000 --- a/.history/src/service/github.oauth.service_20241206235731.ts +++ /dev/null @@ -1,136 +0,0 @@ -import * as express from "express"; -import { Server } from "http"; -import fetch from "node-fetch"; -import { URL, URLSearchParams } from "url"; -import Commons from "../commons"; -import { state } from "../state"; - -export class GitHubOAuthService { - public app: express.Express; - public server: Server; - - constructor(public port: number) { - this.app = express(); - this.app.use(express.json(), express.urlencoded({ extended: false })); - } - - public async StartProcess(cmd?: string) { - const customSettings = await state.commons.GetCustomSettings(); - const host = customSettings.githubEnterpriseUrl - ? new URL(customSettings.githubEnterpriseUrl) - : new URL("https://github.com"); - - this.server = this.app.listen(this.port); - this.app.get("/callback", async (req: any, res) => { - try { - const params = new URLSearchParams( - await (await this.getToken(req.params("code"), host)).text() - ); - - res.send(` - - - - - - - - -

Success! You may now close this tab.

- - - - `); - this.server.close(); - - const token = params.get("access_token"); - this.saveToken(token); - - const user = await this.getUser(token, host); - - const gists: any = await this.getGists(token, user, host); - - const gistViewList: any[] = gists.map((m) => { - return { - id: m.id, - description: m.description, - updated_at: m.updated_at, - }; - }); - - state.commons.webviewService.OpenGistSelectionpage(gistViewList, cmd); - } catch (err) { - const error = new Error(err); - Commons.LogException(error, state.commons.ERROR_MESSAGE, true); - } - }); - } - - public getToken(code: string, host: URL) { - const params = new URLSearchParams(); - params.append("client_id", "cfd96460d8b110e2351b"); - params.append("client_secret", "ed46bd3a0f736e0da57308e86ca5fa3cf8688582"); - params.append("code", code); - - const promise = fetch(`https://${host.hostname}/login/oauth/access_token`, { - method: "POST", - body: params, - }); - - promise.catch((err) => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - return promise; - } - - public async getGists(token: string, user: string, host: URL) { - const promise = fetch(`https://api.${host.hostname}/users/${user}/gists`, { - method: "GET", - headers: { Authorization: `token ${token}` }, - }); - - promise.catch((err) => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - const res = await promise; - const gists = await res.json(); - return gists; - } - - public async saveToken(token: string) { - const currentSettings = await state.commons.GetCustomSettings(); - currentSettings.token = token; - state.commons.SetCustomSettings(currentSettings); - } - - public async getUser(token: string, host: URL) { - const promise = fetch(`https://api.${host.hostname}/user`, { - method: "GET", - headers: { Authorization: `token ${token}` }, - }); - - promise.catch((err) => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - const res = await promise; - const json: any = await res.json(); - return json?.login; - } -} diff --git a/.history/src/service/github.oauth.service_20241206235738.ts b/.history/src/service/github.oauth.service_20241206235738.ts deleted file mode 100644 index 0c85e90e..00000000 --- a/.history/src/service/github.oauth.service_20241206235738.ts +++ /dev/null @@ -1,136 +0,0 @@ -import * as express from "express"; -import { Server } from "http"; -import fetch from "node-fetch"; -import { URL, URLSearchParams } from "url"; -import Commons from "../commons"; -import { state } from "../state"; - -export class GitHubOAuthService { - public app: express.Express; - public server: Server; - - constructor(public port: number) { - this.app = express(); - this.app.use(express.json(), express.urlencoded({ extended: false })); - } - - public async StartProcess(cmd?: string) { - const customSettings = await state.commons.GetCustomSettings(); - const host = customSettings.githubEnterpriseUrl - ? new URL(customSettings.githubEnterpriseUrl) - : new URL("https://github.com"); - - this.server = this.app.listen(this.port); - this.app.get("/callback", async (req: any, res: any) => { - try { - const params = new URLSearchParams( - await (await this.getToken(req.params("code"), host)).text() - ); - - res.send(` - - - - - - - - -

Success! You may now close this tab.

- - - - `); - this.server.close(); - - const token = params.get("access_token"); - this.saveToken(token); - - const user = await this.getUser(token, host); - - const gists: any = await this.getGists(token, user, host); - - const gistViewList: any[] = gists.map((m) => { - return { - id: m.id, - description: m.description, - updated_at: m.updated_at, - }; - }); - - state.commons.webviewService.OpenGistSelectionpage(gistViewList, cmd); - } catch (err) { - const error = new Error(err); - Commons.LogException(error, state.commons.ERROR_MESSAGE, true); - } - }); - } - - public getToken(code: string, host: URL) { - const params = new URLSearchParams(); - params.append("client_id", "cfd96460d8b110e2351b"); - params.append("client_secret", "ed46bd3a0f736e0da57308e86ca5fa3cf8688582"); - params.append("code", code); - - const promise = fetch(`https://${host.hostname}/login/oauth/access_token`, { - method: "POST", - body: params, - }); - - promise.catch((err) => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - return promise; - } - - public async getGists(token: string, user: string, host: URL) { - const promise = fetch(`https://api.${host.hostname}/users/${user}/gists`, { - method: "GET", - headers: { Authorization: `token ${token}` }, - }); - - promise.catch((err) => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - const res = await promise; - const gists = await res.json(); - return gists; - } - - public async saveToken(token: string) { - const currentSettings = await state.commons.GetCustomSettings(); - currentSettings.token = token; - state.commons.SetCustomSettings(currentSettings); - } - - public async getUser(token: string, host: URL) { - const promise = fetch(`https://api.${host.hostname}/user`, { - method: "GET", - headers: { Authorization: `token ${token}` }, - }); - - promise.catch((err) => { - Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true); - }); - - const res = await promise; - const json: any = await res.json(); - return json?.login; - } -} diff --git a/.history/src/service/github.service_20241102143121.ts b/.history/src/service/github.service_20241102143121.ts deleted file mode 100644 index aef71c12..00000000 --- a/.history/src/service/github.service_20241102143121.ts +++ /dev/null @@ -1,203 +0,0 @@ -"use strict"; - -import * as GitHubApi from "@octokit/rest"; -import * as HttpsProxyAgent from "https-proxy-agent"; -import * as vscode from "vscode"; -import Commons from "../commons"; -import { CloudSettings } from "../models/cloudSettings.model"; -import { state } from "../state"; -import { File } from "./file.service"; - -interface IEnv { - [key: string]: string | undefined; - http_proxy: string; - HTTP_PROXY: string; -} - -interface IFixGistResponse extends Omit { - files: any | GitHubApi.GistsGetResponseFiles; -} - -export class GitHubService { - public userName: string = null; - public name: string = null; - private github: GitHubApi = null; - private GIST_JSON_EMPTY: any = { - description: "Visual Studio Code Sync Settings Gist", - public: false, - files: { - "settings.json": { - content: "// Empty" - }, - "launch.json": { - content: "// Empty" - }, - "keybindings.json": { - content: "// Empty" - }, - "extensions.json": { - content: "// Empty" - }, - "locale.json": { - content: "// Empty" - }, - "keybindingsMac.json": { - content: "// Empty" - }, - cloudSettings: { - content: "// Empty" - } - } - }; - - constructor(userToken: string, basePath: string) { - const githubApiConfig: GitHubApi.Options = {}; - - const proxyURL: string = - vscode.workspace.getConfiguration("http").get("proxy") || - (process.env as IEnv).http_proxy || - (process.env as IEnv).HTTP_PROXY; - if (basePath) { - githubApiConfig.baseUrl = basePath; - } - - if (proxyURL) { - githubApiConfig.agent = new HttpsProxyAgent(proxyURL); - } - - if (userToken !== null && userToken !== "") { - githubApiConfig.auth = `token ${userToken}`; - } - try { - this.github = new GitHubApi(githubApiConfig); - } catch (err) { - console.error(err); - } - if (userToken !== null && userToken !== "") { - this.github.users - .getAuthenticated({}) - .then(res => { - this.userName = res.data.login; - this.name = res.data.name; - console.log( - "Sync : Connected with user : " + "'" + this.userName + "'" - ); - }) - .catch(err => { - console.error(err); - }); - } - } - - public AddFile(list: File[], GIST_JSON_B: any) { - for (const file of list) { - if (file.content !== "") { - GIST_JSON_B.files[file.gistName] = {}; - GIST_JSON_B.files[file.gistName].content = file.content; - } - } - return GIST_JSON_B; - } - - public async CreateEmptyGIST( - publicGist: boolean, - gistDescription: string - ): Promise { - if (publicGist) { - this.GIST_JSON_EMPTY.public = true; - } else { - this.GIST_JSON_EMPTY.public = false; - } - if (gistDescription !== null && gistDescription !== "") { - this.GIST_JSON_EMPTY.description = gistDescription; - } - - try { - const res = await this.github.gists.create(this.GIST_JSON_EMPTY); - if (res.data && res.data.id) { - return res.data.id.toString(); - } else { - console.error("ID is null"); - console.log("Sync : " + "Response from GitHub is: "); - console.log(res); - } - } catch (err) { - console.error(err); - throw err; - } - } - - // This should return GitHubApi.Response but Types are wrong - public async ReadGist( - GIST: string - ): Promise> { - const promise = this.github.gists.get({ gist_id: GIST }); - const res = await promise.catch(err => { - if (String(err).includes("HttpError: Not Found")) { - return Commons.LogException(err, "Sync: Invalid Gist ID", true); - } - Commons.LogException(err, state.commons.ERROR_MESSAGE, true); - }); - if (res) { - return res; - } - } - - public async IsGistNewer( - GIST: string, - localLastDownload: Date - ): Promise { - const gist = await this.ReadGist(GIST); - if (!gist) { - return; - } - let gistCloudSetting: CloudSettings = null; - try { - gistCloudSetting = JSON.parse(gist.data.files.cloudSettings.content); - const gistLastUpload = new Date(gistCloudSetting.lastUpload); - if (!localLastDownload) { - return false; - } - return gistLastUpload > new Date(localLastDownload); - } catch (err) { - return false; - } - } - - public UpdateGIST(gistObject: any, files: File[]): any { - const allFiles: string[] = Object.keys(gistObject.data.files); - for (const fileName of allFiles) { - let exists = false; - - for (const settingFile of files) { - if (settingFile.gistName === fileName) { - exists = true; - } - } - - if (!exists && !fileName.startsWith("keybindings")) { - gistObject.data.files[fileName] = null; - } - } - - gistObject.data = this.AddFile(files, gistObject.data); - return gistObject; - } - - public async SaveGIST(gistObject: any): Promise { - gistObject.gist_id = gistObject.id; - // tslint:disable-next-line:comment-format - //TODO : use github.gists.update when issue is fixed. - const promise = this.github.request("PATCH /gists/:gist_id", gistObject); - const res = await promise.catch(err => { - if (String(err).includes("HttpError: Not Found")) { - return Commons.LogException(err, "Sync: Invalid Gist ID", true); - } - Commons.LogException(err, state.commons.ERROR_MESSAGE, true); - }); - - if (res) { - return true; - } - } -} diff --git a/.history/src/service/github.service_20241206235854.ts b/.history/src/service/github.service_20241206235854.ts deleted file mode 100644 index 6bcb2836..00000000 --- a/.history/src/service/github.service_20241206235854.ts +++ /dev/null @@ -1,203 +0,0 @@ -"use strict"; - -import * as GitHubApi from "@octokit/rest"; -import * as HttpsProxyAgent from "https-proxy-agent"; -import * as vscode from "vscode"; -import Commons from "../commons"; -import { CloudSettings } from "../models/cloudSettings.model"; -import { state } from "../state"; -import { File } from "./file.service"; - -interface IEnv { - [key: string]: string | undefined; - http_proxy: string; - HTTP_PROXY: string; -} - -interface IFixGistResponse extends Omit { - files: any | GitHubApi.GistsGetResponseFiles; -} - -export class GitHubService { - public userName: string = null; - public name: string = null; - private github: GitHubApi = null; - private GIST_JSON_EMPTY: any = { - description: "Visual Studio Code Sync Settings Gist", - public: false, - files: { - "settings.json": { - content: "// Empty" - }, - "launch.json": { - content: "// Empty" - }, - "keybindings.json": { - content: "// Empty" - }, - "extensions.json": { - content: "// Empty" - }, - "locale.json": { - content: "// Empty" - }, - "keybindingsMac.json": { - content: "// Empty" - }, - cloudSettings: { - content: "// Empty" - } - } - }; - - constructor(userToken: string, basePath: string) { - const githubApiConfig: GitHubApi.Options = {}; - - const proxyURL: string = - vscode.workspace.getConfiguration("http").get("proxy") || - (process.env as IEnv).http_proxy || - (process.env as IEnv).HTTP_PROXY; - if (basePath) { - githubApiConfig.baseUrl = basePath; - } - - if (proxyURL) { - githubApiConfig.agent = new HttpsProxyAgent(proxyURL); - } - - if (userToken !== null && userToken !== "") { - githubApiConfig.auth = `token ${userToken}`; - } - try { - this.github = new GitHubApi(githubApiConfig); - } catch (err) { - console.error(err); - } - if (userToken !== null && userToken !== "") { - this.github.users - .getAuthenticated({}) - .then(res => { - this.userName = res.data.login; - this.name = res.data.name; - console.log( - "Sync : Connected with user : " + "'" + this.userName + "'" - ); - }) - .catch(err => { - console.error(err); - }); - } - } - - public AddFile(list: File[], GIST_JSON_B: any) { - for (const file of list) { - if (file.content !== "") { - GIST_JSON_B.files[file.gistName] = {}; - GIST_JSON_B.files[file.gistName].content = file.content; - } - } - return GIST_JSON_B; - } - - public async CreateEmptyGIST( - publicGist: boolean, - gistDescription: string - ): Promise { - if (publicGist) { - this.GIST_JSON_EMPTY.public = true; - } else { - this.GIST_JSON_EMPTY.public = false; - } - if (gistDescription !== null && gistDescription !== "") { - this.GIST_JSON_EMPTY.description = gistDescription; - } - - try { - const res = await this.github.gists.create(this.GIST_JSON_EMPTY); - if (res.data && res.data.id) { - return res.data.id.toString(); - } else { - console.error("ID is null"); - console.log("Sync : " + "Response from GitHub is: "); - console.log(res); - } - } catch (err) { - console.error(err); - throw err; - } - } - - // This should return GitHubApi.Response but Types are wrong - public async ReadGist( - GIST: string - ): Promise> { - const promise = this.github.gists.get({ gist_id: GIST }); - const res = await promise.catch(err => { - if (String(err).includes("HttpError: Not Found")) { - return Commons.LogException(err, "Sync: Invalid Gist ID", true); - } - Commons.LogException(err, state.commons.ERROR_MESSAGE, true); - }); - if (res) { - return res; - } - } - - public async IsGistNewer( - GIST: string, - localLastDownload: Date - ): Promise { - const gist = await this.ReadGist(GIST); - if (!gist) { - return; - } - let gistCloudSetting: CloudSettings = null; - try { - gistCloudSetting = JSON.parse(gist.data.files.cloudSettings.content); - const gistLastUpload = new Date(gistCloudSetting.lastUpload); - if (!localLastDownload) { - return false; - } - return gistLastUpload > new Date(localLastDownload); - } catch (err) { - return false; - } - } - - public UpdateGIST(gistObject: any, files: File[]): any { - const allFiles: string[] = Object.keys(gistObject.data.files); - for (const fileName of allFiles) { - let exists = false; - - for (const settingFile of files) { - if (settingFile.gistName === fileName) { - exists = true; - } - } - - if (!exists && !fileName.startsWith("keybindings")) { - gistObject.data.files[fileName] = null; - } - } - - gistObject.data = this.AddFile(files, gistObject.data); - return gistObject; - } - - public async SaveGIST(gistObject: any): Promise { - gistObject.gist_id = gistObject.id; - // tslint:disable-next-line:comment-format - //TODO : use github.gists.update when issue is fixed. - const promise = this.github.request("PATCH /gists/:gist_id", gistObject); - const res = await promise.catch(err => { - if (String(err).includes("HttpError: Not Found")) { - return Commons.LogException(err, "Sync: Invalid Gist ID", true); - } - Commons.LogException(err, state.commons.ERROR_MESSAGE, true); - }); - - if (res) { - return true; - } - } -} diff --git a/.history/src/service/github.service_20241206235857.ts b/.history/src/service/github.service_20241206235857.ts deleted file mode 100644 index 8dc6de7e..00000000 --- a/.history/src/service/github.service_20241206235857.ts +++ /dev/null @@ -1,203 +0,0 @@ -"use strict"; - -import * as GitHubApi from "@octokit/rest"; -import * as HttpsProxyAgent from "https-proxy-agent"; -import * as vscode from "vscode"; -import Commons from "../commons"; -import { CloudSettings } from "../models/cloudSettings.model"; -import { state } from "../state"; -import { File } from "./file.service"; - -interface IEnv { - [key: string]: string | undefined; - http_proxy: string; - HTTP_PROXY: string; -} - -interface IFixGistResponse extends Omit { - files: any | GitHubApi.GistsGetResponseFiles; -} - -export class GitHubService { - public userName: string = null; - public name: string = null; - private github: GitHubApi = null; - private GIST_JSON_EMPTY: any = { - description: "Visual Studio Code Sync Settings Gist", - public: false, - files: { - "settings.json": { - content: "// Empty" - }, - "launch.json": { - content: "// Empty" - }, - "keybindings.json": { - content: "// Empty" - }, - "extensions.json": { - content: "// Empty" - }, - "locale.json": { - content: "// Empty" - }, - "keybindingsMac.json": { - content: "// Empty" - }, - cloudSettings: { - content: "// Empty" - } - } - }; - - constructor(userToken: string, basePath: string) { - const githubApiConfig: GitHubApi.Options = {}; - - const proxyURL: string = - vscode.workspace.getConfiguration("http").get("proxy") || - (process.env as IEnv).http_proxy || - (process.env as IEnv).HTTP_PROXY; - if (basePath) { - githubApiConfig.baseUrl = basePath; - } - - if (proxyURL) { - githubApiConfig.agent = new HttpsProxyAgent(proxyURL); - } - - if (userToken !== null && userToken !== "") { - githubApiConfig.auth = `token ${userToken}`; - } - try { - this.github = new GitHubApi(githubApiConfig); - } catch (err) { - console.error(err); - } - if (userToken !== null && userToken !== "") { - this.github.users - .getAuthenticated({}) - .then(res => { - this.userName = res.data.login; - this.name = res.data.name; - console.log( - "Sync : Connected with user : " + "'" + this.userName + "'" - ); - }) - .catch(err => { - console.error(err); - }); - } - } - - public AddFile(list: File[], GIST_JSON_B: any) { - for (const file of list) { - if (file.content !== "") { - GIST_JSON_B.files[file.gistName] = {}; - GIST_JSON_B.files[file.gistName].content = file.content; - } - } - return GIST_JSON_B; - } - - public async CreateEmptyGIST( - publicGist: boolean, - gistDescription: string - ): Promise { - if (publicGist) { - this.GIST_JSON_EMPTY.public = true; - } else { - this.GIST_JSON_EMPTY.public = false; - } - if (gistDescription !== null && gistDescription !== "") { - this.GIST_JSON_EMPTY.description = gistDescription; - } - - try { - const res = await this.github.gists.create(this.GIST_JSON_EMPTY); - if (res.data && res.data.id) { - return res.data.id.toString(); - } else { - console.error("ID is null"); - console.log("Sync : " + "Response from GitHub is: "); - console.log(res); - } - } catch (err) { - console.error(err); - throw err; - } - } - - // This should return GitHubApi.Response but Types are wrong - public async ReadGist( - GIST: string - ): Promise> { - const promise = this.github.gists.get({ gist_id: GIST }); - const res = await promise.catch(err => { - if (String(err).includes("HttpError: Not Found")) { - return Commons.LogException(err, "Sync: Invalid Gist ID", true); - } - Commons.LogException(err, state.commons.ERROR_MESSAGE, true); - }); - if (res) { - return res; - } - } - - public async IsGistNewer( - GIST: string, - localLastDownload: Date - ): Promise { - const gist = await this.ReadGist(GIST); - if (!gist) { - return; - } - let gistCloudSetting: CloudSettings = null; - try { - gistCloudSetting = JSON.parse(gist.data.files.cloudSettings.content); - const gistLastUpload = new Date(gistCloudSetting.lastUpload); - if (!localLastDownload) { - return false; - } - return gistLastUpload > new Date(localLastDownload); - } catch (err) { - return false; - } - } - - public UpdateGIST(gistObject: any, files: File[]): any { - const allFiles: string[] = Object.keys(gistObject.data.files); - for (const fileName of allFiles) { - let exists = false; - - for (const settingFile of files) { - if (settingFile.gistName === fileName) { - exists = true; - } - } - - if (!exists && !fileName.startsWith("keybindings")) { - gistObject.data.files[fileName] = null; - } - } - - gistObject.data = this.AddFile(files, gistObject.data); - return gistObject; - } - - public async SaveGIST(gistObject: any): Promise { - gistObject.gist_id = gistObject.id; - // tslint:disable-next-line:comment-format - //TODO : use github.gists.update when issue is fixed. - const promise = this.github.request("PATCH /gists/:gist_id", gistObject); - const res = await promise.catch(err => { - if (String(err).includes("HttpError: Not Found")) { - return Commons.LogException(err, "Sync: Invalid Gist ID", true); - } - Commons.LogException(err, state.commons.ERROR_MESSAGE, true); - }); - - if (res) { - return true; - } - } -} diff --git a/.history/src/service/github.service_20241206235858.ts b/.history/src/service/github.service_20241206235858.ts deleted file mode 100644 index a48015af..00000000 --- a/.history/src/service/github.service_20241206235858.ts +++ /dev/null @@ -1,203 +0,0 @@ -"use strict"; - -import * as GitHubApi from "@octokit/rest"; -import * as HttpsProxyAgent from "https-proxy-agent"; -import * as vscode from "vscode"; -import Commons from "../commons"; -import { CloudSettings } from "../models/cloudSettings.model"; -import { state } from "../state"; -import { File } from "./file.service"; - -interface IEnv { - [key: string]: string | undefined; - http_proxy: string; - HTTP_PROXY: string; -} - -interface IFixGistResponse extends Omit { - files: any | GitHubApi.GistsGetResponseFiles; -} - -export class GitHubService { - public userName: string = null; - public name: string = null; - private github: GitHubApi = null; - private GIST_JSON_EMPTY: any = { - description: "Visual Studio Code Sync Settings Gist", - public: false, - files: { - "settings.json": { - content: "// Empty" - }, - "launch.json": { - content: "// Empty" - }, - "keybindings.json": { - content: "// Empty" - }, - "extensions.json": { - content: "// Empty" - }, - "locale.json": { - content: "// Empty" - }, - "keybindingsMac.json": { - content: "// Empty" - }, - cloudSettings: { - content: "// Empty" - } - } - }; - - constructor(userToken: string, basePath: string) { - const githubApiConfig: GitHubApi.Options = {}; - - const proxyURL: string = - vscode.workspace.getConfiguration("http").get("proxy") || - (process.env as IEnv).http_proxy || - (process.env as IEnv).HTTP_PROXY; - if (basePath) { - githubApiConfig.baseUrl = basePath; - } - - if (proxyURL) { - githubApiConfig.agent = new HttpsProxyAgent(proxyURL); - } - - if (userToken !== null && userToken !== "") { - githubApiConfig.auth = `token ${userToken}`; - } - try { - this.github = new GitHubApi(githubApiConfig); - } catch (err) { - console.error(err); - } - if (userToken !== null && userToken !== "") { - this.github.users - .getAuthenticated({}) - .then(res => { - this.userName = res.data.login; - this.name = res.data.name; - console.log( - "Sync : Connected with user : " + "'" + this.userName + "'" - ); - }) - .catch(err => { - console.error(err); - }); - } - } - - public AddFile(list: File[], GIST_JSON_B: any) { - for (const file of list) { - if (file.content !== "") { - GIST_JSON_B.files[file.gistName] = {}; - GIST_JSON_B.files[file.gistName].content = file.content; - } - } - return GIST_JSON_B; - } - - public async CreateEmptyGIST( - publicGist: boolean, - gistDescription: string - ): Promise { - if (publicGist) { - this.GIST_JSON_EMPTY.public = true; - } else { - this.GIST_JSON_EMPTY.public = false; - } - if (gistDescription !== null && gistDescription !== "") { - this.GIST_JSON_EMPTY.description = gistDescription; - } - - try { - const res = await this.github.gists.create(this.GIST_JSON_EMPTY); - if (res.data && res.data.id) { - return res.data.id.toString(); - } else { - console.error("ID is null"); - console.log("Sync : " + "Response from GitHub is: "); - console.log(res); - } - } catch (err) { - console.error(err); - throw err; - } - } - - // This should return GitHubApi.Response but Types are wrong - public async ReadGist( - GIST: string - ): Promise> { - const promise = this.github.gists.get({ gist_id: GIST }); - const res = await promise.catch(err => { - if (String(err).includes("HttpError: Not Found")) { - return Commons.LogException(err, "Sync: Invalid Gist ID", true); - } - Commons.LogException(err, state.commons.ERROR_MESSAGE, true); - }); - if (res) { - return res; - } - } - - public async IsGistNewer( - GIST: string, - localLastDownload: Date - ): Promise { - const gist = await this.ReadGist(GIST); - if (!gist) { - return; - } - let gistCloudSetting: CloudSettings = null; - try { - gistCloudSetting = JSON.parse(gist.data.files.cloudSettings.content); - const gistLastUpload = new Date(gistCloudSetting.lastUpload); - if (!localLastDownload) { - return false; - } - return gistLastUpload > new Date(localLastDownload); - } catch (err) { - return false; - } - } - - public UpdateGIST(gistObject: any, files: File[]): any { - const allFiles: string[] = Object.keys(gistObject.data.files); - for (const fileName of allFiles) { - let exists = false; - - for (const settingFile of files) { - if (settingFile.gistName === fileName) { - exists = true; - } - } - - if (!exists && !fileName.startsWith("keybindings")) { - gistObject.data.files[fileName] = null; - } - } - - gistObject.data = this.AddFile(files, gistObject.data); - return gistObject; - } - - public async SaveGIST(gistObject: any): Promise { - gistObject.gist_id = gistObject.id; - // tslint:disable-next-line:comment-format - //TODO : use github.gists.update when issue is fixed. - const promise = this.github.request("PATCH /gists/:gist_id", gistObject); - const res = await promise.catch(err => { - if (String(err).includes("HttpError: Not Found")) { - return Commons.LogException(err, "Sync: Invalid Gist ID", true); - } - Commons.LogException(err, state.commons.ERROR_MESSAGE, true); - }); - - if (res) { - return true; - } - } -} diff --git a/.history/src/service/github.service_20241206235903.ts b/.history/src/service/github.service_20241206235903.ts deleted file mode 100644 index aef71c12..00000000 --- a/.history/src/service/github.service_20241206235903.ts +++ /dev/null @@ -1,203 +0,0 @@ -"use strict"; - -import * as GitHubApi from "@octokit/rest"; -import * as HttpsProxyAgent from "https-proxy-agent"; -import * as vscode from "vscode"; -import Commons from "../commons"; -import { CloudSettings } from "../models/cloudSettings.model"; -import { state } from "../state"; -import { File } from "./file.service"; - -interface IEnv { - [key: string]: string | undefined; - http_proxy: string; - HTTP_PROXY: string; -} - -interface IFixGistResponse extends Omit { - files: any | GitHubApi.GistsGetResponseFiles; -} - -export class GitHubService { - public userName: string = null; - public name: string = null; - private github: GitHubApi = null; - private GIST_JSON_EMPTY: any = { - description: "Visual Studio Code Sync Settings Gist", - public: false, - files: { - "settings.json": { - content: "// Empty" - }, - "launch.json": { - content: "// Empty" - }, - "keybindings.json": { - content: "// Empty" - }, - "extensions.json": { - content: "// Empty" - }, - "locale.json": { - content: "// Empty" - }, - "keybindingsMac.json": { - content: "// Empty" - }, - cloudSettings: { - content: "// Empty" - } - } - }; - - constructor(userToken: string, basePath: string) { - const githubApiConfig: GitHubApi.Options = {}; - - const proxyURL: string = - vscode.workspace.getConfiguration("http").get("proxy") || - (process.env as IEnv).http_proxy || - (process.env as IEnv).HTTP_PROXY; - if (basePath) { - githubApiConfig.baseUrl = basePath; - } - - if (proxyURL) { - githubApiConfig.agent = new HttpsProxyAgent(proxyURL); - } - - if (userToken !== null && userToken !== "") { - githubApiConfig.auth = `token ${userToken}`; - } - try { - this.github = new GitHubApi(githubApiConfig); - } catch (err) { - console.error(err); - } - if (userToken !== null && userToken !== "") { - this.github.users - .getAuthenticated({}) - .then(res => { - this.userName = res.data.login; - this.name = res.data.name; - console.log( - "Sync : Connected with user : " + "'" + this.userName + "'" - ); - }) - .catch(err => { - console.error(err); - }); - } - } - - public AddFile(list: File[], GIST_JSON_B: any) { - for (const file of list) { - if (file.content !== "") { - GIST_JSON_B.files[file.gistName] = {}; - GIST_JSON_B.files[file.gistName].content = file.content; - } - } - return GIST_JSON_B; - } - - public async CreateEmptyGIST( - publicGist: boolean, - gistDescription: string - ): Promise { - if (publicGist) { - this.GIST_JSON_EMPTY.public = true; - } else { - this.GIST_JSON_EMPTY.public = false; - } - if (gistDescription !== null && gistDescription !== "") { - this.GIST_JSON_EMPTY.description = gistDescription; - } - - try { - const res = await this.github.gists.create(this.GIST_JSON_EMPTY); - if (res.data && res.data.id) { - return res.data.id.toString(); - } else { - console.error("ID is null"); - console.log("Sync : " + "Response from GitHub is: "); - console.log(res); - } - } catch (err) { - console.error(err); - throw err; - } - } - - // This should return GitHubApi.Response but Types are wrong - public async ReadGist( - GIST: string - ): Promise> { - const promise = this.github.gists.get({ gist_id: GIST }); - const res = await promise.catch(err => { - if (String(err).includes("HttpError: Not Found")) { - return Commons.LogException(err, "Sync: Invalid Gist ID", true); - } - Commons.LogException(err, state.commons.ERROR_MESSAGE, true); - }); - if (res) { - return res; - } - } - - public async IsGistNewer( - GIST: string, - localLastDownload: Date - ): Promise { - const gist = await this.ReadGist(GIST); - if (!gist) { - return; - } - let gistCloudSetting: CloudSettings = null; - try { - gistCloudSetting = JSON.parse(gist.data.files.cloudSettings.content); - const gistLastUpload = new Date(gistCloudSetting.lastUpload); - if (!localLastDownload) { - return false; - } - return gistLastUpload > new Date(localLastDownload); - } catch (err) { - return false; - } - } - - public UpdateGIST(gistObject: any, files: File[]): any { - const allFiles: string[] = Object.keys(gistObject.data.files); - for (const fileName of allFiles) { - let exists = false; - - for (const settingFile of files) { - if (settingFile.gistName === fileName) { - exists = true; - } - } - - if (!exists && !fileName.startsWith("keybindings")) { - gistObject.data.files[fileName] = null; - } - } - - gistObject.data = this.AddFile(files, gistObject.data); - return gistObject; - } - - public async SaveGIST(gistObject: any): Promise { - gistObject.gist_id = gistObject.id; - // tslint:disable-next-line:comment-format - //TODO : use github.gists.update when issue is fixed. - const promise = this.github.request("PATCH /gists/:gist_id", gistObject); - const res = await promise.catch(err => { - if (String(err).includes("HttpError: Not Found")) { - return Commons.LogException(err, "Sync: Invalid Gist ID", true); - } - Commons.LogException(err, state.commons.ERROR_MESSAGE, true); - }); - - if (res) { - return true; - } - } -}