diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..579aa61
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,28 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+artifacts
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+
+# Config files
+.webextrc
+.webextrc.*
diff --git a/.prettierrc.yml b/.prettierrc.yml
new file mode 100644
index 0000000..7dc5d17
--- /dev/null
+++ b/.prettierrc.yml
@@ -0,0 +1,6 @@
+singleQuote: true
+trailingComma: all
+endOfLine: lf
+printWidth: 100
+tabWidth: 2
+arrowParens: avoid
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..0f98032
--- /dev/null
+++ b/package.json
@@ -0,0 +1,33 @@
+{
+ "name": "web-activity-time-tracker",
+ "private": true,
+ "version": "1.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite build --watch --mode development",
+ "start": "vite build --watch --mode production",
+ "format": "prettier --write .",
+ "script:zip": "vite build --mode production && powershell scripts/zip.ps1"
+ },
+ "dependencies": {
+ "@vueuse/core": "^10.2.1",
+ "chart.js": "^4.3.0",
+ "date-fns": "^2.30.0",
+ "rollup-plugin-copy": "^3.4.0",
+ "vue": "^3.2.47",
+ "vue-chartjs": "^5.2.0",
+ "vue-i18n": "^9.2.2"
+ },
+ "devDependencies": {
+ "@intlify/unplugin-vue-i18n": "^0.12.2",
+ "@kyvg/vue3-notification": "^2.9.1",
+ "@types/webextension-polyfill": "^0.10.0",
+ "@vitejs/plugin-vue": "^4.0.0",
+ "@vuepic/vue-datepicker": "^5.3.0",
+ "typescript": "^5.0.4",
+ "vite": "^4.1.4",
+ "vite-plugin-web-extension": "^3.0.0",
+ "vue-tsc": "^1.2.0",
+ "webextension-polyfill": "^0.10.0"
+ }
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
new file mode 100644
index 0000000..ef8692b
--- /dev/null
+++ b/pnpm-lock.yaml
@@ -0,0 +1,4261 @@
+lockfileVersion: 5.4
+
+specifiers:
+ '@intlify/unplugin-vue-i18n': ^0.12.2
+ '@kyvg/vue3-notification': ^2.9.1
+ '@types/webextension-polyfill': ^0.10.0
+ '@vitejs/plugin-vue': ^4.0.0
+ '@vuepic/vue-datepicker': ^5.3.0
+ '@vueuse/core': ^10.2.1
+ chart.js: ^4.3.0
+ date-fns: ^2.30.0
+ rollup-plugin-copy: ^3.4.0
+ typescript: ^5.0.4
+ vite: ^4.1.4
+ vite-plugin-web-extension: ^3.0.0
+ vue: ^3.2.47
+ vue-chartjs: ^5.2.0
+ vue-i18n: ^9.2.2
+ vue-tsc: ^1.2.0
+ webextension-polyfill: ^0.10.0
+
+dependencies:
+ '@vueuse/core': 10.2.1_vue@3.2.47
+ chart.js: 4.3.0
+ date-fns: 2.30.0
+ rollup-plugin-copy: 3.4.0
+ vue: 3.2.47
+ vue-chartjs: 5.2.0_chart.js@4.3.0+vue@3.2.47
+ vue-i18n: 9.2.2_vue@3.2.47
+
+devDependencies:
+ '@intlify/unplugin-vue-i18n': 0.12.2_vue-i18n@9.2.2
+ '@kyvg/vue3-notification': 2.9.1_vue@3.2.47
+ '@types/webextension-polyfill': 0.10.0
+ '@vitejs/plugin-vue': 4.2.1_vite@4.3.3+vue@3.2.47
+ '@vuepic/vue-datepicker': 5.3.0_vue@3.2.47
+ typescript: 5.0.4
+ vite: 4.3.3
+ vite-plugin-web-extension: 3.0.6_vite@4.3.3
+ vue-tsc: 1.6.1_typescript@5.0.4
+ webextension-polyfill: 0.10.0
+
+packages:
+
+ /@babel/code-frame/7.21.4:
+ resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/highlight': 7.18.6
+ dev: true
+
+ /@babel/helper-string-parser/7.21.5:
+ resolution: {integrity: sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==}
+ engines: {node: '>=6.9.0'}
+
+ /@babel/helper-validator-identifier/7.19.1:
+ resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==}
+ engines: {node: '>=6.9.0'}
+
+ /@babel/highlight/7.18.6:
+ resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-validator-identifier': 7.19.1
+ chalk: 2.4.2
+ js-tokens: 4.0.0
+ dev: true
+
+ /@babel/parser/7.21.5:
+ resolution: {integrity: sha512-J+IxH2IsxV4HbnTrSWgMAQj0UEo61hDA4Ny8h8PCX0MLXiibqHbqIOVneqdocemSBc22VpBKxt4J6FQzy9HarQ==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+ dependencies:
+ '@babel/types': 7.21.5
+
+ /@babel/runtime/7.21.0:
+ resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ regenerator-runtime: 0.13.11
+
+ /@babel/types/7.21.5:
+ resolution: {integrity: sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-string-parser': 7.21.5
+ '@babel/helper-validator-identifier': 7.19.1
+ to-fast-properties: 2.0.0
+
+ /@devicefarmer/adbkit-logcat/2.1.3:
+ resolution: {integrity: sha512-yeaGFjNBc/6+svbDeul1tNHtNChw6h8pSHAt5D+JsedUrMTN7tla7B15WLDyekxsuS2XlZHRxpuC6m92wiwCNw==}
+ engines: {node: '>= 4'}
+ dev: true
+
+ /@devicefarmer/adbkit-monkey/1.2.1:
+ resolution: {integrity: sha512-ZzZY/b66W2Jd6NHbAhLyDWOEIBWC11VizGFk7Wx7M61JZRz7HR9Cq5P+65RKWUU7u6wgsE8Lmh9nE4Mz+U2eTg==}
+ engines: {node: '>= 0.10.4'}
+ dev: true
+
+ /@devicefarmer/adbkit/3.2.3:
+ resolution: {integrity: sha512-wK9rVrabs4QU0oK8Jnwi+HRBEm+s1x/o63kgthUe0y7K1bfcYmgLuQf41/adsj/5enddlSxzkJavl2EwOu+r1g==}
+ engines: {node: '>= 0.10.4'}
+ hasBin: true
+ dependencies:
+ '@devicefarmer/adbkit-logcat': 2.1.3
+ '@devicefarmer/adbkit-monkey': 1.2.1
+ bluebird: 3.7.2
+ commander: 9.5.0
+ debug: 4.3.4
+ node-forge: 1.3.1
+ split: 1.0.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@esbuild/android-arm/0.17.18:
+ resolution: {integrity: sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/android-arm64/0.17.18:
+ resolution: {integrity: sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/android-x64/0.17.18:
+ resolution: {integrity: sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/darwin-arm64/0.17.18:
+ resolution: {integrity: sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/darwin-x64/0.17.18:
+ resolution: {integrity: sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/freebsd-arm64/0.17.18:
+ resolution: {integrity: sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/freebsd-x64/0.17.18:
+ resolution: {integrity: sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-arm/0.17.18:
+ resolution: {integrity: sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-arm64/0.17.18:
+ resolution: {integrity: sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-ia32/0.17.18:
+ resolution: {integrity: sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-loong64/0.17.18:
+ resolution: {integrity: sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ==}
+ engines: {node: '>=12'}
+ cpu: [loong64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-mips64el/0.17.18:
+ resolution: {integrity: sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA==}
+ engines: {node: '>=12'}
+ cpu: [mips64el]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-ppc64/0.17.18:
+ resolution: {integrity: sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-riscv64/0.17.18:
+ resolution: {integrity: sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA==}
+ engines: {node: '>=12'}
+ cpu: [riscv64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-s390x/0.17.18:
+ resolution: {integrity: sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw==}
+ engines: {node: '>=12'}
+ cpu: [s390x]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-x64/0.17.18:
+ resolution: {integrity: sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/netbsd-x64/0.17.18:
+ resolution: {integrity: sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [netbsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/openbsd-x64/0.17.18:
+ resolution: {integrity: sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [openbsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/sunos-x64/0.17.18:
+ resolution: {integrity: sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [sunos]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/win32-arm64/0.17.18:
+ resolution: {integrity: sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/win32-ia32/0.17.18:
+ resolution: {integrity: sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/win32-x64/0.17.18:
+ resolution: {integrity: sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@eslint-community/eslint-utils/4.4.0_eslint@8.36.0:
+ resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+ dependencies:
+ eslint: 8.36.0
+ eslint-visitor-keys: 3.4.0
+ dev: true
+
+ /@eslint-community/regexpp/4.5.1:
+ resolution: {integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==}
+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+ dev: true
+
+ /@eslint/eslintrc/2.0.2:
+ resolution: {integrity: sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ ajv: 6.12.6
+ debug: 4.3.4
+ espree: 9.5.1
+ globals: 13.20.0
+ ignore: 5.2.4
+ import-fresh: 3.3.0
+ js-yaml: 4.1.0
+ minimatch: 3.1.2
+ strip-json-comments: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@eslint/js/8.36.0:
+ resolution: {integrity: sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dev: true
+
+ /@fluent/syntax/0.19.0:
+ resolution: {integrity: sha512-5D2qVpZrgpjtqU4eNOcWGp1gnUCgjfM+vKGE2y03kKN6z5EBhtx0qdRFbg8QuNNj8wXNoX93KJoYb+NqoxswmQ==}
+ engines: {node: '>=14.0.0', npm: '>=7.0.0'}
+ dev: true
+
+ /@humanwhocodes/config-array/0.11.8:
+ resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==}
+ engines: {node: '>=10.10.0'}
+ dependencies:
+ '@humanwhocodes/object-schema': 1.2.1
+ debug: 4.3.4
+ minimatch: 3.1.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@humanwhocodes/module-importer/1.0.1:
+ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+ engines: {node: '>=12.22'}
+ dev: true
+
+ /@humanwhocodes/object-schema/1.2.1:
+ resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==}
+ dev: true
+
+ /@intlify/bundle-utils/7.0.2_vue-i18n@9.2.2:
+ resolution: {integrity: sha512-8wbx9xhbawBFTE5LPTECiK26RRqrNS31jyWSur72ZXZZ4it5jiZTcG6eUJlNirr4+jXYio2DGY299JsGVT4cpw==}
+ engines: {node: '>= 14.16'}
+ peerDependencies:
+ petite-vue-i18n: '*'
+ vue-i18n: '*'
+ peerDependenciesMeta:
+ petite-vue-i18n:
+ optional: true
+ vue-i18n:
+ optional: true
+ dependencies:
+ '@intlify/message-compiler': 9.3.0-beta.24
+ '@intlify/shared': 9.3.0-beta.24
+ acorn: 8.8.2
+ escodegen: 2.1.0
+ estree-walker: 2.0.2
+ jsonc-eslint-parser: 1.4.1
+ magic-string: 0.30.1
+ mlly: 1.4.0
+ source-map-js: 1.0.2
+ vue-i18n: 9.2.2_vue@3.2.47
+ yaml-eslint-parser: 0.3.2
+ dev: true
+
+ /@intlify/core-base/9.2.2:
+ resolution: {integrity: sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==}
+ engines: {node: '>= 14'}
+ dependencies:
+ '@intlify/devtools-if': 9.2.2
+ '@intlify/message-compiler': 9.2.2
+ '@intlify/shared': 9.2.2
+ '@intlify/vue-devtools': 9.2.2
+
+ /@intlify/devtools-if/9.2.2:
+ resolution: {integrity: sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==}
+ engines: {node: '>= 14'}
+ dependencies:
+ '@intlify/shared': 9.2.2
+
+ /@intlify/message-compiler/9.2.2:
+ resolution: {integrity: sha512-IUrQW7byAKN2fMBe8z6sK6riG1pue95e5jfokn8hA5Q3Bqy4MBJ5lJAofUsawQJYHeoPJ7svMDyBaVJ4d0GTtA==}
+ engines: {node: '>= 14'}
+ dependencies:
+ '@intlify/shared': 9.2.2
+ source-map: 0.6.1
+
+ /@intlify/message-compiler/9.3.0-beta.24:
+ resolution: {integrity: sha512-prhHATkgp0mpPqoVgiAtLmUc1JMvs8fMH6w53AVEBn+VF87dLhzanfmWY5FoZWORG51ag54gBDBOoM/VFv3m3A==}
+ engines: {node: '>= 16'}
+ dependencies:
+ '@intlify/shared': 9.3.0-beta.24
+ source-map-js: 1.0.2
+ dev: true
+
+ /@intlify/shared/9.2.2:
+ resolution: {integrity: sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==}
+ engines: {node: '>= 14'}
+
+ /@intlify/shared/9.3.0-beta.24:
+ resolution: {integrity: sha512-AKxJ8s7eKIQWkNaf4wyyoLRwf4puCuQgjSChlDJm5JBEt6T8HGgnYTJLRXu6LD/JACn3Qwu6hM/XRX1c9yvjmQ==}
+ engines: {node: '>= 16'}
+ dev: true
+
+ /@intlify/unplugin-vue-i18n/0.12.2_vue-i18n@9.2.2:
+ resolution: {integrity: sha512-IIgzLRSPUKZM1FBdUAZ9NwVPiLUr4ea5g/HLWe2lB7gNtPDz4FOfUNUllIT504hT+3pDoJmjaYJ6pyqT7F4Wuw==}
+ engines: {node: '>= 14.16'}
+ peerDependencies:
+ petite-vue-i18n: '*'
+ vue-i18n: '*'
+ vue-i18n-bridge: '*'
+ peerDependenciesMeta:
+ petite-vue-i18n:
+ optional: true
+ vue-i18n:
+ optional: true
+ vue-i18n-bridge:
+ optional: true
+ dependencies:
+ '@intlify/bundle-utils': 7.0.2_vue-i18n@9.2.2
+ '@intlify/shared': 9.3.0-beta.24
+ '@rollup/pluginutils': 5.0.2
+ '@vue/compiler-sfc': 3.2.47
+ debug: 4.3.4
+ fast-glob: 3.3.0
+ js-yaml: 4.1.0
+ json5: 2.2.3
+ pathe: 1.1.1
+ picocolors: 1.0.0
+ source-map-js: 1.0.2
+ unplugin: 1.4.0
+ vue-i18n: 9.2.2_vue@3.2.47
+ transitivePeerDependencies:
+ - rollup
+ - supports-color
+ dev: true
+
+ /@intlify/vue-devtools/9.2.2:
+ resolution: {integrity: sha512-+dUyqyCHWHb/UcvY1MlIpO87munedm3Gn6E9WWYdWrMuYLcoIoOEVDWSS8xSwtlPU+kA+MEQTP6Q1iI/ocusJg==}
+ engines: {node: '>= 14'}
+ dependencies:
+ '@intlify/core-base': 9.2.2
+ '@intlify/shared': 9.2.2
+
+ /@jridgewell/sourcemap-codec/1.4.15:
+ resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
+ dev: true
+
+ /@kurkle/color/0.3.2:
+ resolution: {integrity: sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==}
+ dev: false
+
+ /@kyvg/vue3-notification/2.9.1_vue@3.2.47:
+ resolution: {integrity: sha512-FsY8g25tQetr3etnarxHtCeNFKssH8sheFu13LyL2JJmOOel437QqKV5n4RBDDDTIo55iKgIVYXeojliXYdEhw==}
+ peerDependencies:
+ vue: ^3.0.0
+ dependencies:
+ vue: 3.2.47
+ dev: true
+
+ /@mdn/browser-compat-data/5.2.42:
+ resolution: {integrity: sha512-CD/2ai1W45cDN/zN2AcYduDavU+nq9aStyQizi4MHxnwkRvS/H24WIjgc1qD8CISoqXa8AAIe+A+zpWxwV7a2Q==}
+ dev: true
+
+ /@nodelib/fs.scandir/2.1.5:
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
+
+ /@nodelib/fs.stat/2.0.5:
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
+
+ /@nodelib/fs.walk/1.2.8:
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
+ dependencies:
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.15.0
+
+ /@pnpm/config.env-replace/1.1.0:
+ resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==}
+ engines: {node: '>=12.22.0'}
+ dev: true
+
+ /@pnpm/network.ca-file/1.0.2:
+ resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==}
+ engines: {node: '>=12.22.0'}
+ dependencies:
+ graceful-fs: 4.2.10
+ dev: true
+
+ /@pnpm/npm-conf/2.1.1:
+ resolution: {integrity: sha512-yfRcuupmxxeDOSxvw4g+wFCrGiPD0L32f5WMzqMXp7Rl93EOCdFiDcaSNnZ10Up9GdNqkj70UTa8hfhPFphaZA==}
+ engines: {node: '>=12'}
+ dependencies:
+ '@pnpm/config.env-replace': 1.1.0
+ '@pnpm/network.ca-file': 1.0.2
+ config-chain: 1.1.13
+ dev: true
+
+ /@rollup/pluginutils/5.0.2:
+ resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ rollup: ^1.20.0||^2.0.0||^3.0.0
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+ dependencies:
+ '@types/estree': 1.0.1
+ estree-walker: 2.0.2
+ picomatch: 2.3.1
+ dev: true
+
+ /@sindresorhus/is/5.3.0:
+ resolution: {integrity: sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==}
+ engines: {node: '>=14.16'}
+ dev: true
+
+ /@szmarczak/http-timer/5.0.1:
+ resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ defer-to-connect: 2.0.1
+ dev: true
+
+ /@types/estree/1.0.1:
+ resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==}
+ dev: true
+
+ /@types/fs-extra/8.1.2:
+ resolution: {integrity: sha512-SvSrYXfWSc7R4eqnOzbQF4TZmfpNSM9FrSWLU3EUnWBuyZqNBOrv1B1JA3byUDPUl9z4Ab3jeZG2eDdySlgNMg==}
+ dependencies:
+ '@types/node': 18.16.3
+ dev: false
+
+ /@types/glob/7.2.0:
+ resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==}
+ dependencies:
+ '@types/minimatch': 3.0.5
+ '@types/node': 18.16.3
+ dev: false
+
+ /@types/http-cache-semantics/4.0.1:
+ resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==}
+ dev: true
+
+ /@types/minimatch/3.0.5:
+ resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==}
+
+ /@types/node/18.16.3:
+ resolution: {integrity: sha512-OPs5WnnT1xkCBiuQrZA4+YAV4HEJejmHneyraIaxsbev5yCEr6KMwINNFP9wQeFIw8FWcoTqF3vQsa5CDaI+8Q==}
+
+ /@types/web-bluetooth/0.0.17:
+ resolution: {integrity: sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==}
+ dev: false
+
+ /@types/webextension-polyfill/0.10.0:
+ resolution: {integrity: sha512-If4EcaHzYTqcbNMp/FdReVdRmLL/Te42ivnJII551bYjhX19bWem5m14FERCqdJA732OloGuxCRvLBvcMGsn4A==}
+ dev: true
+
+ /@types/yauzl/2.10.0:
+ resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==}
+ dependencies:
+ '@types/node': 18.16.3
+ dev: true
+
+ /@vitejs/plugin-vue/4.2.1_vite@4.3.3+vue@3.2.47:
+ resolution: {integrity: sha512-ZTZjzo7bmxTRTkb8GSTwkPOYDIP7pwuyV+RV53c9PYUouwcbkIZIvWvNWlX2b1dYZqtOv7D6iUAnJLVNGcLrSw==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ vite: ^4.0.0
+ vue: ^3.2.25
+ dependencies:
+ vite: 4.3.3
+ vue: 3.2.47
+ dev: true
+
+ /@volar/language-core/1.4.1:
+ resolution: {integrity: sha512-EIY+Swv+TjsWpxOxujjMf1ZXqOjg9MT2VMXZ+1dKva0wD8W0L6EtptFFcCJdBbcKmGMFkr57Qzz9VNMWhs3jXQ==}
+ dependencies:
+ '@volar/source-map': 1.4.1
+ dev: true
+
+ /@volar/source-map/1.4.1:
+ resolution: {integrity: sha512-bZ46ad72dsbzuOWPUtJjBXkzSQzzSejuR3CT81+GvTEI2E994D8JPXzM3tl98zyCNnjgs4OkRyliImL1dvJ5BA==}
+ dependencies:
+ muggle-string: 0.2.2
+ dev: true
+
+ /@volar/typescript/1.4.1_typescript@5.0.4:
+ resolution: {integrity: sha512-phTy6p9yG6bgMIKQWEeDOi/aeT0njZsb1a/G1mrEuDsLmAn24Le4gDwSsGNhea6Uhu+3gdpUZn2PmZXa+WG2iQ==}
+ peerDependencies:
+ typescript: '*'
+ dependencies:
+ '@volar/language-core': 1.4.1
+ typescript: 5.0.4
+ dev: true
+
+ /@volar/vue-language-core/1.6.1:
+ resolution: {integrity: sha512-lIuxzvIx5U8MfoF+vrXNG1aZgmk8T0uyPEwI8g3EUJdESuU0qIKM84o+L4TUw77IQCYXiSefaJmsSSY87/VWnA==}
+ dependencies:
+ '@volar/language-core': 1.4.1
+ '@volar/source-map': 1.4.1
+ '@vue/compiler-dom': 3.2.47
+ '@vue/compiler-sfc': 3.2.47
+ '@vue/reactivity': 3.2.47
+ '@vue/shared': 3.2.47
+ minimatch: 9.0.0
+ muggle-string: 0.2.2
+ vue-template-compiler: 2.7.14
+ dev: true
+
+ /@volar/vue-typescript/1.6.1_typescript@5.0.4:
+ resolution: {integrity: sha512-5mhG6Lv2niq/AGNvHy4RSAGlJhkR+EcH7zRQ19JlffzhWDVXEdDp8luSSabCkrJzejXIMh0rsTGlKy2EFYy7vQ==}
+ peerDependencies:
+ typescript: '*'
+ dependencies:
+ '@volar/typescript': 1.4.1_typescript@5.0.4
+ '@volar/vue-language-core': 1.6.1
+ typescript: 5.0.4
+ dev: true
+
+ /@vue/compiler-core/3.2.47:
+ resolution: {integrity: sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==}
+ dependencies:
+ '@babel/parser': 7.21.5
+ '@vue/shared': 3.2.47
+ estree-walker: 2.0.2
+ source-map: 0.6.1
+
+ /@vue/compiler-dom/3.2.47:
+ resolution: {integrity: sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==}
+ dependencies:
+ '@vue/compiler-core': 3.2.47
+ '@vue/shared': 3.2.47
+
+ /@vue/compiler-sfc/3.2.47:
+ resolution: {integrity: sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==}
+ dependencies:
+ '@babel/parser': 7.21.5
+ '@vue/compiler-core': 3.2.47
+ '@vue/compiler-dom': 3.2.47
+ '@vue/compiler-ssr': 3.2.47
+ '@vue/reactivity-transform': 3.2.47
+ '@vue/shared': 3.2.47
+ estree-walker: 2.0.2
+ magic-string: 0.25.9
+ postcss: 8.4.23
+ source-map: 0.6.1
+
+ /@vue/compiler-ssr/3.2.47:
+ resolution: {integrity: sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==}
+ dependencies:
+ '@vue/compiler-dom': 3.2.47
+ '@vue/shared': 3.2.47
+
+ /@vue/devtools-api/6.5.0:
+ resolution: {integrity: sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==}
+
+ /@vue/reactivity-transform/3.2.47:
+ resolution: {integrity: sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==}
+ dependencies:
+ '@babel/parser': 7.21.5
+ '@vue/compiler-core': 3.2.47
+ '@vue/shared': 3.2.47
+ estree-walker: 2.0.2
+ magic-string: 0.25.9
+
+ /@vue/reactivity/3.2.47:
+ resolution: {integrity: sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==}
+ dependencies:
+ '@vue/shared': 3.2.47
+
+ /@vue/runtime-core/3.2.47:
+ resolution: {integrity: sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==}
+ dependencies:
+ '@vue/reactivity': 3.2.47
+ '@vue/shared': 3.2.47
+
+ /@vue/runtime-dom/3.2.47:
+ resolution: {integrity: sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==}
+ dependencies:
+ '@vue/runtime-core': 3.2.47
+ '@vue/shared': 3.2.47
+ csstype: 2.6.21
+
+ /@vue/server-renderer/3.2.47_vue@3.2.47:
+ resolution: {integrity: sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==}
+ peerDependencies:
+ vue: 3.2.47
+ dependencies:
+ '@vue/compiler-ssr': 3.2.47
+ '@vue/shared': 3.2.47
+ vue: 3.2.47
+
+ /@vue/shared/3.2.47:
+ resolution: {integrity: sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==}
+
+ /@vuepic/vue-datepicker/5.3.0_vue@3.2.47:
+ resolution: {integrity: sha512-eW5LRa3mH5klbRaKedG96/KY4EZC7ns+Zs7A+4guRBL+dQQthd8HV0xyS9nkI7hjr1K5zU+FQ3TOdo/oX5r3og==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ vue: '>=3.2.0'
+ dependencies:
+ date-fns: 2.30.0
+ date-fns-tz: 1.3.8_date-fns@2.30.0
+ vue: 3.2.47
+ dev: true
+
+ /@vueuse/core/10.2.1_vue@3.2.47:
+ resolution: {integrity: sha512-c441bfMbkAwTNwVRHQ0zdYZNETK//P84rC01aP2Uy/aRFCiie9NE/k9KdIXbno0eDYP5NPUuWv0aA/I4Unr/7w==}
+ dependencies:
+ '@types/web-bluetooth': 0.0.17
+ '@vueuse/metadata': 10.2.1
+ '@vueuse/shared': 10.2.1_vue@3.2.47
+ vue-demi: 0.14.5_vue@3.2.47
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+ - vue
+ dev: false
+
+ /@vueuse/metadata/10.2.1:
+ resolution: {integrity: sha512-3Gt68mY/i6bQvFqx7cuGBzrCCQu17OBaGWS5JdwISpMsHnMKKjC2FeB5OAfMcCQ0oINfADP3i9A4PPRo0peHdQ==}
+ dev: false
+
+ /@vueuse/shared/10.2.1_vue@3.2.47:
+ resolution: {integrity: sha512-QWHq2bSuGptkcxx4f4M/fBYC3Y8d3M2UYyLsyzoPgEoVzJURQ0oJeWXu79OiLlBb8gTKkqe4mO85T/sf39mmiw==}
+ dependencies:
+ vue-demi: 0.14.5_vue@3.2.47
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+ - vue
+ dev: false
+
+ /abort-controller/3.0.0:
+ resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
+ engines: {node: '>=6.5'}
+ dependencies:
+ event-target-shim: 5.0.1
+ dev: true
+
+ /acorn-jsx/5.3.2_acorn@7.4.1:
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ acorn: 7.4.1
+ dev: true
+
+ /acorn-jsx/5.3.2_acorn@8.8.2:
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ acorn: 8.8.2
+ dev: true
+
+ /acorn/7.4.1:
+ resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+ dev: true
+
+ /acorn/8.10.0:
+ resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+ dev: true
+
+ /acorn/8.8.2:
+ resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+ dev: true
+
+ /addons-linter/5.32.0_node-fetch@3.3.1:
+ resolution: {integrity: sha512-Lf6oOyw8X9z5BMd9xhQwSbPlN2PUlzDLnYLAVT5lkrgXEx0fO9hRk4JRxWZ8+rFGz+mCIA2TTClZF2f+MKgJQA==}
+ engines: {node: '>=12.21.0'}
+ hasBin: true
+ dependencies:
+ '@fluent/syntax': 0.19.0
+ '@mdn/browser-compat-data': 5.2.42
+ addons-moz-compare: 1.3.0
+ addons-scanner-utils: 8.5.0_node-fetch@3.3.1
+ ajv: 8.12.0
+ chalk: 4.1.2
+ cheerio: 1.0.0-rc.12
+ columnify: 1.6.0
+ common-tags: 1.8.2
+ deepmerge: 4.3.1
+ eslint: 8.36.0
+ eslint-plugin-no-unsanitized: 4.0.2_eslint@8.36.0
+ eslint-visitor-keys: 3.3.0
+ espree: 9.5.0
+ esprima: 4.0.1
+ fast-json-patch: 3.1.1
+ glob: 9.3.0
+ image-size: 1.0.2
+ is-mergeable-object: 1.1.1
+ jed: 1.1.1
+ json-merge-patch: 1.0.2
+ os-locale: 5.0.0
+ pino: 8.11.0
+ postcss: 8.4.21
+ relaxed-json: 1.0.3
+ semver: 7.3.8
+ sha.js: 2.4.11
+ source-map-support: 0.5.21
+ tosource: 1.0.0
+ upath: 2.0.1
+ yargs: 17.7.1
+ yauzl: 2.10.0
+ transitivePeerDependencies:
+ - body-parser
+ - express
+ - node-fetch
+ - safe-compare
+ - supports-color
+ dev: true
+
+ /addons-moz-compare/1.3.0:
+ resolution: {integrity: sha512-/rXpQeaY0nOKhNx00pmZXdk5Mu+KhVlL3/pSBuAYwrxRrNiTvI/9xfQI8Lmm7DMMl+PDhtfAHY/0ibTpdeoQQQ==}
+ dev: true
+
+ /addons-scanner-utils/8.5.0_node-fetch@3.3.1:
+ resolution: {integrity: sha512-X35SYZRdSnxx7UZuAk+DizKihQp2Ze2c5GV+5nnRr/FFyx/fOgE3Zo8jdhzSne57PENE9w1ZVocBLJTN6UDB3g==}
+ peerDependencies:
+ body-parser: 1.20.2
+ express: 4.18.2
+ node-fetch: 2.6.7
+ safe-compare: 1.1.4
+ peerDependenciesMeta:
+ body-parser:
+ optional: true
+ express:
+ optional: true
+ node-fetch:
+ optional: true
+ safe-compare:
+ optional: true
+ dependencies:
+ '@types/yauzl': 2.10.0
+ common-tags: 1.8.2
+ first-chunk-stream: 3.0.0
+ node-fetch: 3.3.1
+ strip-bom-stream: 4.0.0
+ upath: 2.0.1
+ yauzl: 2.10.0
+ dev: true
+
+ /adm-zip/0.5.10:
+ resolution: {integrity: sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==}
+ engines: {node: '>=6.0'}
+ dev: true
+
+ /ajv/6.12.6:
+ resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-json-stable-stringify: 2.1.0
+ json-schema-traverse: 0.4.1
+ uri-js: 4.4.1
+ dev: true
+
+ /ajv/8.12.0:
+ resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==}
+ dependencies:
+ fast-deep-equal: 3.1.3
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+ uri-js: 4.4.1
+ dev: true
+
+ /ansi-align/3.0.1:
+ resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==}
+ dependencies:
+ string-width: 4.2.3
+ dev: true
+
+ /ansi-regex/5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /ansi-regex/6.0.1:
+ resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /ansi-styles/3.2.1:
+ resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
+ engines: {node: '>=4'}
+ dependencies:
+ color-convert: 1.9.3
+ dev: true
+
+ /ansi-styles/4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+ dependencies:
+ color-convert: 2.0.1
+ dev: true
+
+ /ansi-styles/6.2.1:
+ resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /any-promise/1.3.0:
+ resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
+ dev: true
+
+ /anymatch/3.1.3:
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+ engines: {node: '>= 8'}
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.1
+ dev: true
+
+ /argparse/2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+ dev: true
+
+ /array-differ/4.0.0:
+ resolution: {integrity: sha512-Q6VPTLMsmXZ47ENG3V+wQyZS1ZxXMxFyYzA+Z/GMrJ6yIutAIEf9wTyroTzmGjNfox9/h3GdGBCVh43GVFx4Uw==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dev: true
+
+ /array-union/2.1.0:
+ resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
+ engines: {node: '>=8'}
+ dev: false
+
+ /array-union/3.0.1:
+ resolution: {integrity: sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /asn1/0.2.6:
+ resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==}
+ dependencies:
+ safer-buffer: 2.1.2
+ dev: true
+
+ /assert-plus/1.0.0:
+ resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==}
+ engines: {node: '>=0.8'}
+ dev: true
+
+ /async-lock/1.4.0:
+ resolution: {integrity: sha512-coglx5yIWuetakm3/1dsX9hxCNox22h7+V80RQOu2XUUMidtArxKoZoOtHUPuR84SycKTXzgGzAUR5hJxujyJQ==}
+ dev: true
+
+ /async/3.2.4:
+ resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==}
+ dev: true
+
+ /asynckit/0.4.0:
+ resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
+ dev: true
+
+ /at-least-node/1.0.0:
+ resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==}
+ engines: {node: '>= 4.0.0'}
+ dev: true
+
+ /atomic-sleep/1.0.0:
+ resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==}
+ engines: {node: '>=8.0.0'}
+ dev: true
+
+ /aws-sign2/0.7.0:
+ resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==}
+ dev: true
+
+ /aws4/1.12.0:
+ resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==}
+ dev: true
+
+ /balanced-match/1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+ /base64-js/1.5.1:
+ resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+ dev: true
+
+ /bcrypt-pbkdf/1.0.2:
+ resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==}
+ dependencies:
+ tweetnacl: 0.14.5
+ dev: true
+
+ /binary-extensions/2.2.0:
+ resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /bluebird/3.7.2:
+ resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==}
+ dev: true
+
+ /boolbase/1.0.0:
+ resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
+ dev: true
+
+ /boxen/7.0.2:
+ resolution: {integrity: sha512-1Z4UJabXUP1/R9rLpoU3O2lEMnG3pPLAs/ZD2lF3t2q7qD5lM8rqbtnvtvm4N0wEyNlE+9yZVTVAGmd1V5jabg==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ ansi-align: 3.0.1
+ camelcase: 7.0.1
+ chalk: 5.2.0
+ cli-boxes: 3.0.0
+ string-width: 5.1.2
+ type-fest: 2.19.0
+ widest-line: 4.0.1
+ wrap-ansi: 8.1.0
+ dev: true
+
+ /brace-expansion/1.1.11:
+ resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+
+ /brace-expansion/2.0.1:
+ resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+ dependencies:
+ balanced-match: 1.0.2
+ dev: true
+
+ /braces/3.0.2:
+ resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
+ engines: {node: '>=8'}
+ dependencies:
+ fill-range: 7.0.1
+
+ /buffer-crc32/0.2.13:
+ resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
+ dev: true
+
+ /buffer-equal-constant-time/1.0.1:
+ resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==}
+ dev: true
+
+ /buffer-from/1.1.2:
+ resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+ dev: true
+
+ /buffer/6.0.3:
+ resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+ dev: true
+
+ /bunyan/1.8.15:
+ resolution: {integrity: sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==}
+ engines: {'0': node >=0.10.0}
+ hasBin: true
+ optionalDependencies:
+ dtrace-provider: 0.8.8
+ moment: 2.29.4
+ mv: 2.1.1
+ safe-json-stringify: 1.2.0
+ dev: true
+
+ /cacheable-lookup/7.0.0:
+ resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==}
+ engines: {node: '>=14.16'}
+ dev: true
+
+ /cacheable-request/10.2.10:
+ resolution: {integrity: sha512-v6WB+Epm/qO4Hdlio/sfUn69r5Shgh39SsE9DSd4bIezP0mblOlObI+I0kUEM7J0JFc+I7pSeMeYaOYtX1N/VQ==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ '@types/http-cache-semantics': 4.0.1
+ get-stream: 6.0.1
+ http-cache-semantics: 4.1.1
+ keyv: 4.5.2
+ mimic-response: 4.0.0
+ normalize-url: 8.0.0
+ responselike: 3.0.0
+ dev: true
+
+ /callsites/3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /camelcase/7.0.1:
+ resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==}
+ engines: {node: '>=14.16'}
+ dev: true
+
+ /caseless/0.12.0:
+ resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==}
+ dev: true
+
+ /chalk/2.4.2:
+ resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
+ engines: {node: '>=4'}
+ dependencies:
+ ansi-styles: 3.2.1
+ escape-string-regexp: 1.0.5
+ supports-color: 5.5.0
+ dev: true
+
+ /chalk/4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ engines: {node: '>=10'}
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+ dev: true
+
+ /chalk/5.2.0:
+ resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==}
+ engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+ dev: true
+
+ /charenc/0.0.2:
+ resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==}
+ dev: true
+
+ /chart.js/4.3.0:
+ resolution: {integrity: sha512-ynG0E79xGfMaV2xAHdbhwiPLczxnNNnasrmPEXriXsPJGjmhOBYzFVEsB65w2qMDz+CaBJJuJD0inE/ab/h36g==}
+ engines: {pnpm: '>=7'}
+ dependencies:
+ '@kurkle/color': 0.3.2
+ dev: false
+
+ /cheerio-select/2.1.0:
+ resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==}
+ dependencies:
+ boolbase: 1.0.0
+ css-select: 5.1.0
+ css-what: 6.1.0
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ domutils: 3.1.0
+ dev: true
+
+ /cheerio/1.0.0-rc.12:
+ resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==}
+ engines: {node: '>= 6'}
+ dependencies:
+ cheerio-select: 2.1.0
+ dom-serializer: 2.0.0
+ domhandler: 5.0.3
+ domutils: 3.1.0
+ htmlparser2: 8.0.2
+ parse5: 7.1.2
+ parse5-htmlparser2-tree-adapter: 7.0.0
+ dev: true
+
+ /chokidar/3.5.3:
+ resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
+ engines: {node: '>= 8.10.0'}
+ dependencies:
+ anymatch: 3.1.3
+ braces: 3.0.2
+ glob-parent: 5.1.2
+ is-binary-path: 2.1.0
+ is-glob: 4.0.3
+ normalize-path: 3.0.0
+ readdirp: 3.6.0
+ optionalDependencies:
+ fsevents: 2.3.2
+ dev: true
+
+ /chrome-launcher/0.15.1:
+ resolution: {integrity: sha512-UugC8u59/w2AyX5sHLZUHoxBAiSiunUhZa3zZwMH6zPVis0C3dDKiRWyUGIo14tTbZHGVviWxv3PQWZ7taZ4fg==}
+ engines: {node: '>=12.13.0'}
+ hasBin: true
+ dependencies:
+ '@types/node': 18.16.3
+ escape-string-regexp: 4.0.0
+ is-wsl: 2.2.0
+ lighthouse-logger: 1.3.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /ci-info/3.8.0:
+ resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /cli-boxes/3.0.0:
+ resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /cliui/8.0.1:
+ resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 7.0.0
+ dev: true
+
+ /clone/1.0.4:
+ resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
+ engines: {node: '>=0.8'}
+ dev: true
+
+ /color-convert/1.9.3:
+ resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
+ dependencies:
+ color-name: 1.1.3
+ dev: true
+
+ /color-convert/2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+ dependencies:
+ color-name: 1.1.4
+ dev: true
+
+ /color-name/1.1.3:
+ resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
+ dev: true
+
+ /color-name/1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+ dev: true
+
+ /colorette/1.4.0:
+ resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==}
+ dev: false
+
+ /columnify/1.6.0:
+ resolution: {integrity: sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==}
+ engines: {node: '>=8.0.0'}
+ dependencies:
+ strip-ansi: 6.0.1
+ wcwidth: 1.0.1
+ dev: true
+
+ /combined-stream/1.0.8:
+ resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
+ engines: {node: '>= 0.8'}
+ dependencies:
+ delayed-stream: 1.0.0
+ dev: true
+
+ /commander/2.20.3:
+ resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
+ dev: true
+
+ /commander/2.9.0:
+ resolution: {integrity: sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A==}
+ engines: {node: '>= 0.6.x'}
+ dependencies:
+ graceful-readlink: 1.0.1
+ dev: true
+
+ /commander/9.5.0:
+ resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==}
+ engines: {node: ^12.20.0 || >=14}
+ dev: true
+
+ /common-tags/1.8.2:
+ resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==}
+ engines: {node: '>=4.0.0'}
+ dev: true
+
+ /concat-map/0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+
+ /concat-stream/1.6.2:
+ resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==}
+ engines: {'0': node >= 0.8}
+ dependencies:
+ buffer-from: 1.1.2
+ inherits: 2.0.4
+ readable-stream: 2.3.8
+ typedarray: 0.0.6
+ dev: true
+
+ /config-chain/1.1.13:
+ resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==}
+ dependencies:
+ ini: 1.3.8
+ proto-list: 1.2.4
+ dev: true
+
+ /configstore/6.0.0:
+ resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==}
+ engines: {node: '>=12'}
+ dependencies:
+ dot-prop: 6.0.1
+ graceful-fs: 4.2.11
+ unique-string: 3.0.0
+ write-file-atomic: 3.0.3
+ xdg-basedir: 5.1.0
+ dev: true
+
+ /core-js/3.29.0:
+ resolution: {integrity: sha512-VG23vuEisJNkGl6XQmFJd3rEG/so/CNatqeE+7uZAwTSwFeB/qaO0be8xZYUNWprJ/GIwL8aMt9cj1kvbpTZhg==}
+ requiresBuild: true
+ dev: true
+
+ /core-util-is/1.0.2:
+ resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==}
+ dev: true
+
+ /core-util-is/1.0.3:
+ resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
+ dev: true
+
+ /cross-spawn/7.0.3:
+ resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
+ engines: {node: '>= 8'}
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+ dev: true
+
+ /crypt/0.0.2:
+ resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==}
+ dev: true
+
+ /crypto-random-string/4.0.0:
+ resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==}
+ engines: {node: '>=12'}
+ dependencies:
+ type-fest: 1.4.0
+ dev: true
+
+ /css-select/5.1.0:
+ resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==}
+ dependencies:
+ boolbase: 1.0.0
+ css-what: 6.1.0
+ domhandler: 5.0.3
+ domutils: 3.1.0
+ nth-check: 2.1.1
+ dev: true
+
+ /css-what/6.1.0:
+ resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==}
+ engines: {node: '>= 6'}
+ dev: true
+
+ /cssom/0.5.0:
+ resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==}
+ dev: true
+
+ /csstype/2.6.21:
+ resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==}
+
+ /dashdash/1.14.1:
+ resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==}
+ engines: {node: '>=0.10'}
+ dependencies:
+ assert-plus: 1.0.0
+ dev: true
+
+ /data-uri-to-buffer/4.0.1:
+ resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==}
+ engines: {node: '>= 12'}
+ dev: true
+
+ /date-fns-tz/1.3.8_date-fns@2.30.0:
+ resolution: {integrity: sha512-qwNXUFtMHTTU6CFSFjoJ80W8Fzzp24LntbjFFBgL/faqds4e5mo9mftoRLgr3Vi1trISsg4awSpYVsOQCRnapQ==}
+ peerDependencies:
+ date-fns: '>=2.0.0'
+ dependencies:
+ date-fns: 2.30.0
+ dev: true
+
+ /date-fns/2.30.0:
+ resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==}
+ engines: {node: '>=0.11'}
+ dependencies:
+ '@babel/runtime': 7.21.0
+
+ /de-indent/1.0.2:
+ resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==}
+ dev: true
+
+ /debounce/1.2.1:
+ resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==}
+ dev: true
+
+ /debug/2.6.9:
+ resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: 2.0.0
+ dev: true
+
+ /debug/4.3.4:
+ resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: 2.1.2
+ dev: true
+
+ /decamelize/6.0.0:
+ resolution: {integrity: sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dev: true
+
+ /decompress-response/6.0.0:
+ resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ mimic-response: 3.1.0
+ dev: true
+
+ /deep-extend/0.6.0:
+ resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
+ engines: {node: '>=4.0.0'}
+ dev: true
+
+ /deep-is/0.1.4:
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+ dev: true
+
+ /deepcopy/2.1.0:
+ resolution: {integrity: sha512-8cZeTb1ZKC3bdSCP6XOM1IsTczIO73fdqtwa2B0N15eAz7gmyhQo+mc5gnFuulsgN3vIQYmTgbmQVKalH1dKvQ==}
+ dependencies:
+ type-detect: 4.0.8
+ dev: true
+
+ /deepmerge/4.3.1:
+ resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /defaults/1.0.4:
+ resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==}
+ dependencies:
+ clone: 1.0.4
+ dev: true
+
+ /defer-to-connect/2.0.1:
+ resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /define-lazy-prop/2.0.0:
+ resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /delayed-stream/1.0.0:
+ resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
+ engines: {node: '>=0.4.0'}
+ dev: true
+
+ /dir-glob/3.0.1:
+ resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
+ engines: {node: '>=8'}
+ dependencies:
+ path-type: 4.0.0
+ dev: false
+
+ /doctrine/3.0.0:
+ resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ esutils: 2.0.3
+ dev: true
+
+ /dom-serializer/2.0.0:
+ resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ entities: 4.5.0
+ dev: true
+
+ /domelementtype/2.3.0:
+ resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
+ dev: true
+
+ /domhandler/5.0.3:
+ resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
+ engines: {node: '>= 4'}
+ dependencies:
+ domelementtype: 2.3.0
+ dev: true
+
+ /domutils/3.1.0:
+ resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==}
+ dependencies:
+ dom-serializer: 2.0.0
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ dev: true
+
+ /dot-prop/6.0.1:
+ resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==}
+ engines: {node: '>=10'}
+ dependencies:
+ is-obj: 2.0.0
+ dev: true
+
+ /dtrace-provider/0.8.8:
+ resolution: {integrity: sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==}
+ engines: {node: '>=0.10'}
+ requiresBuild: true
+ dependencies:
+ nan: 2.17.0
+ dev: true
+ optional: true
+
+ /eastasianwidth/0.2.0:
+ resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
+ dev: true
+
+ /ecc-jsbn/0.1.2:
+ resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==}
+ dependencies:
+ jsbn: 0.1.1
+ safer-buffer: 2.1.2
+ dev: true
+
+ /ecdsa-sig-formatter/1.0.11:
+ resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==}
+ dependencies:
+ safe-buffer: 5.2.1
+ dev: true
+
+ /emoji-regex/8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+ dev: true
+
+ /emoji-regex/9.2.2:
+ resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+ dev: true
+
+ /end-of-stream/1.4.4:
+ resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
+ dependencies:
+ once: 1.4.0
+ dev: true
+
+ /entities/4.5.0:
+ resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+ engines: {node: '>=0.12'}
+ dev: true
+
+ /error-ex/1.3.2:
+ resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
+ dependencies:
+ is-arrayish: 0.2.1
+ dev: true
+
+ /es6-error/4.1.1:
+ resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==}
+ dev: true
+
+ /es6-promisify/7.0.0:
+ resolution: {integrity: sha512-ginqzK3J90Rd4/Yz7qRrqUeIpe3TwSXTPPZtPne7tGBPeAaQiU8qt4fpKApnxHcq1AwtUdHVg5P77x/yrggG8Q==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /esbuild/0.17.18:
+ resolution: {integrity: sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==}
+ engines: {node: '>=12'}
+ hasBin: true
+ requiresBuild: true
+ optionalDependencies:
+ '@esbuild/android-arm': 0.17.18
+ '@esbuild/android-arm64': 0.17.18
+ '@esbuild/android-x64': 0.17.18
+ '@esbuild/darwin-arm64': 0.17.18
+ '@esbuild/darwin-x64': 0.17.18
+ '@esbuild/freebsd-arm64': 0.17.18
+ '@esbuild/freebsd-x64': 0.17.18
+ '@esbuild/linux-arm': 0.17.18
+ '@esbuild/linux-arm64': 0.17.18
+ '@esbuild/linux-ia32': 0.17.18
+ '@esbuild/linux-loong64': 0.17.18
+ '@esbuild/linux-mips64el': 0.17.18
+ '@esbuild/linux-ppc64': 0.17.18
+ '@esbuild/linux-riscv64': 0.17.18
+ '@esbuild/linux-s390x': 0.17.18
+ '@esbuild/linux-x64': 0.17.18
+ '@esbuild/netbsd-x64': 0.17.18
+ '@esbuild/openbsd-x64': 0.17.18
+ '@esbuild/sunos-x64': 0.17.18
+ '@esbuild/win32-arm64': 0.17.18
+ '@esbuild/win32-ia32': 0.17.18
+ '@esbuild/win32-x64': 0.17.18
+ dev: true
+
+ /escalade/3.1.1:
+ resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /escape-goat/4.0.0:
+ resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /escape-string-regexp/1.0.5:
+ resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
+ engines: {node: '>=0.8.0'}
+ dev: true
+
+ /escape-string-regexp/4.0.0:
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /escodegen/2.1.0:
+ resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==}
+ engines: {node: '>=6.0'}
+ hasBin: true
+ dependencies:
+ esprima: 4.0.1
+ estraverse: 5.3.0
+ esutils: 2.0.3
+ optionalDependencies:
+ source-map: 0.6.1
+ dev: true
+
+ /eslint-plugin-no-unsanitized/4.0.2_eslint@8.36.0:
+ resolution: {integrity: sha512-Pry0S9YmHoz8NCEMRQh7N0Yexh2MYCNPIlrV52hTmS7qXnTghWsjXouF08bgsrrZqaW9tt1ZiK3j5NEmPE+EjQ==}
+ peerDependencies:
+ eslint: ^6 || ^7 || ^8
+ dependencies:
+ eslint: 8.36.0
+ dev: true
+
+ /eslint-scope/7.2.0:
+ resolution: {integrity: sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 5.3.0
+ dev: true
+
+ /eslint-utils/2.1.0:
+ resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==}
+ engines: {node: '>=6'}
+ dependencies:
+ eslint-visitor-keys: 1.3.0
+ dev: true
+
+ /eslint-visitor-keys/1.3.0:
+ resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /eslint-visitor-keys/3.3.0:
+ resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dev: true
+
+ /eslint-visitor-keys/3.4.0:
+ resolution: {integrity: sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dev: true
+
+ /eslint/8.36.0:
+ resolution: {integrity: sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ hasBin: true
+ dependencies:
+ '@eslint-community/eslint-utils': 4.4.0_eslint@8.36.0
+ '@eslint-community/regexpp': 4.5.1
+ '@eslint/eslintrc': 2.0.2
+ '@eslint/js': 8.36.0
+ '@humanwhocodes/config-array': 0.11.8
+ '@humanwhocodes/module-importer': 1.0.1
+ '@nodelib/fs.walk': 1.2.8
+ ajv: 6.12.6
+ chalk: 4.1.2
+ cross-spawn: 7.0.3
+ debug: 4.3.4
+ doctrine: 3.0.0
+ escape-string-regexp: 4.0.0
+ eslint-scope: 7.2.0
+ eslint-visitor-keys: 3.4.0
+ espree: 9.5.1
+ esquery: 1.5.0
+ esutils: 2.0.3
+ fast-deep-equal: 3.1.3
+ file-entry-cache: 6.0.1
+ find-up: 5.0.0
+ glob-parent: 6.0.2
+ globals: 13.20.0
+ grapheme-splitter: 1.0.4
+ ignore: 5.2.4
+ import-fresh: 3.3.0
+ imurmurhash: 0.1.4
+ is-glob: 4.0.3
+ is-path-inside: 3.0.3
+ js-sdsl: 4.4.0
+ js-yaml: 4.1.0
+ json-stable-stringify-without-jsonify: 1.0.1
+ levn: 0.4.1
+ lodash.merge: 4.6.2
+ minimatch: 3.1.2
+ natural-compare: 1.4.0
+ optionator: 0.9.1
+ strip-ansi: 6.0.1
+ strip-json-comments: 3.1.1
+ text-table: 0.2.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /espree/6.2.1:
+ resolution: {integrity: sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ acorn: 7.4.1
+ acorn-jsx: 5.3.2_acorn@7.4.1
+ eslint-visitor-keys: 1.3.0
+ dev: true
+
+ /espree/9.5.0:
+ resolution: {integrity: sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ acorn: 8.8.2
+ acorn-jsx: 5.3.2_acorn@8.8.2
+ eslint-visitor-keys: 3.4.0
+ dev: true
+
+ /espree/9.5.1:
+ resolution: {integrity: sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ acorn: 8.8.2
+ acorn-jsx: 5.3.2_acorn@8.8.2
+ eslint-visitor-keys: 3.4.0
+ dev: true
+
+ /esprima/4.0.1:
+ resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
+ engines: {node: '>=4'}
+ hasBin: true
+ dev: true
+
+ /esquery/1.5.0:
+ resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==}
+ engines: {node: '>=0.10'}
+ dependencies:
+ estraverse: 5.3.0
+ dev: true
+
+ /esrecurse/4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
+ dependencies:
+ estraverse: 5.3.0
+ dev: true
+
+ /estraverse/5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
+ dev: true
+
+ /estree-walker/2.0.2:
+ resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+
+ /esutils/2.0.3:
+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /event-target-shim/5.0.1:
+ resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /events/3.3.0:
+ resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
+ engines: {node: '>=0.8.x'}
+ dev: true
+
+ /execa/4.1.0:
+ resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==}
+ engines: {node: '>=10'}
+ dependencies:
+ cross-spawn: 7.0.3
+ get-stream: 5.2.0
+ human-signals: 1.1.1
+ is-stream: 2.0.1
+ merge-stream: 2.0.0
+ npm-run-path: 4.0.1
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+ strip-final-newline: 2.0.0
+ dev: true
+
+ /extend/3.0.2:
+ resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
+ dev: true
+
+ /extsprintf/1.3.0:
+ resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==}
+ engines: {'0': node >=0.6.0}
+ dev: true
+
+ /fast-deep-equal/3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+ dev: true
+
+ /fast-glob/3.3.0:
+ resolution: {integrity: sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==}
+ engines: {node: '>=8.6.0'}
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.5
+
+ /fast-json-patch/3.1.1:
+ resolution: {integrity: sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==}
+ dev: true
+
+ /fast-json-stable-stringify/2.1.0:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+ dev: true
+
+ /fast-levenshtein/2.0.6:
+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+ dev: true
+
+ /fast-redact/3.1.2:
+ resolution: {integrity: sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /fastq/1.15.0:
+ resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==}
+ dependencies:
+ reusify: 1.0.4
+
+ /fd-slicer/1.1.0:
+ resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==}
+ dependencies:
+ pend: 1.2.0
+ dev: true
+
+ /fetch-blob/3.2.0:
+ resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==}
+ engines: {node: ^12.20 || >= 14.13}
+ dependencies:
+ node-domexception: 1.0.0
+ web-streams-polyfill: 3.2.1
+ dev: true
+
+ /file-entry-cache/6.0.1:
+ resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
+ engines: {node: ^10.12.0 || >=12.0.0}
+ dependencies:
+ flat-cache: 3.0.4
+ dev: true
+
+ /fill-range/7.0.1:
+ resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ to-regex-range: 5.0.1
+
+ /find-up/5.0.0:
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+ engines: {node: '>=10'}
+ dependencies:
+ locate-path: 6.0.0
+ path-exists: 4.0.0
+ dev: true
+
+ /firefox-profile/4.3.2:
+ resolution: {integrity: sha512-/C+Eqa0YgIsQT2p66p7Ygzqe7NlE/GNTbhw2SBCm5V3OsWDPITNdTPEcH2Q2fe7eMpYYNPKdUcuVioZBZiR6kA==}
+ hasBin: true
+ dependencies:
+ adm-zip: 0.5.10
+ fs-extra: 9.0.1
+ ini: 2.0.0
+ minimist: 1.2.8
+ xml2js: 0.5.0
+ dev: true
+
+ /first-chunk-stream/3.0.0:
+ resolution: {integrity: sha512-LNRvR4hr/S8cXXkIY5pTgVP7L3tq6LlYWcg9nWBuW7o1NMxKZo6oOVa/6GIekMGI0Iw7uC+HWimMe9u/VAeKqw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /flat-cache/3.0.4:
+ resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==}
+ engines: {node: ^10.12.0 || >=12.0.0}
+ dependencies:
+ flatted: 3.2.7
+ rimraf: 3.0.2
+ dev: true
+
+ /flatted/3.2.7:
+ resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==}
+ dev: true
+
+ /forever-agent/0.6.1:
+ resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==}
+ dev: true
+
+ /form-data-encoder/2.1.4:
+ resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==}
+ engines: {node: '>= 14.17'}
+ dev: true
+
+ /form-data/2.3.3:
+ resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==}
+ engines: {node: '>= 0.12'}
+ dependencies:
+ asynckit: 0.4.0
+ combined-stream: 1.0.8
+ mime-types: 2.1.35
+ dev: true
+
+ /formdata-polyfill/4.0.10:
+ resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==}
+ engines: {node: '>=12.20.0'}
+ dependencies:
+ fetch-blob: 3.2.0
+ dev: true
+
+ /fs-extra/10.1.0:
+ resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 6.1.0
+ universalify: 2.0.0
+ dev: true
+
+ /fs-extra/11.1.0:
+ resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==}
+ engines: {node: '>=14.14'}
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 6.1.0
+ universalify: 2.0.0
+ dev: true
+
+ /fs-extra/8.1.0:
+ resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==}
+ engines: {node: '>=6 <7 || >=8'}
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 4.0.0
+ universalify: 0.1.2
+ dev: false
+
+ /fs-extra/9.0.1:
+ resolution: {integrity: sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ at-least-node: 1.0.0
+ graceful-fs: 4.2.11
+ jsonfile: 6.1.0
+ universalify: 1.0.0
+ dev: true
+
+ /fs.realpath/1.0.0:
+ resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+
+ /fsevents/2.3.2:
+ resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /fx-runner/1.3.0:
+ resolution: {integrity: sha512-5b37H4GCyhF+Nf8xk9mylXoDq4wb7pbGAXxlCXp/631UTeeZomWSYcEGXumY4wk8g2QAqjPMGdWW+RbNt8PUcA==}
+ hasBin: true
+ dependencies:
+ commander: 2.9.0
+ shell-quote: 1.7.3
+ spawn-sync: 1.0.15
+ when: 3.7.7
+ which: 1.2.4
+ winreg: 0.0.12
+ dev: true
+
+ /get-caller-file/2.0.5:
+ resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+ engines: {node: 6.* || 8.* || >= 10.*}
+ dev: true
+
+ /get-stream/5.2.0:
+ resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==}
+ engines: {node: '>=8'}
+ dependencies:
+ pump: 3.0.0
+ dev: true
+
+ /get-stream/6.0.1:
+ resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /getpass/0.1.7:
+ resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==}
+ dependencies:
+ assert-plus: 1.0.0
+ dev: true
+
+ /glob-parent/5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+ dependencies:
+ is-glob: 4.0.3
+
+ /glob-parent/6.0.2:
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+ engines: {node: '>=10.13.0'}
+ dependencies:
+ is-glob: 4.0.3
+ dev: true
+
+ /glob-to-regexp/0.4.1:
+ resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==}
+ dev: true
+
+ /glob/6.0.4:
+ resolution: {integrity: sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==}
+ dependencies:
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 3.1.2
+ once: 1.4.0
+ path-is-absolute: 1.0.1
+ dev: true
+ optional: true
+
+ /glob/7.2.3:
+ resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 3.1.2
+ once: 1.4.0
+ path-is-absolute: 1.0.1
+
+ /glob/9.3.0:
+ resolution: {integrity: sha512-EAZejC7JvnQINayvB/7BJbpZpNOJ8Lrw2OZNEvQxe0vaLn1SuwMcfV7/MNaX8L/T0wmptBFI4YMtDvSBxYDc7w==}
+ engines: {node: '>=16 || 14 >=14.17'}
+ dependencies:
+ fs.realpath: 1.0.0
+ minimatch: 7.4.6
+ minipass: 4.2.8
+ path-scurry: 1.7.0
+ dev: true
+
+ /global-dirs/3.0.1:
+ resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==}
+ engines: {node: '>=10'}
+ dependencies:
+ ini: 2.0.0
+ dev: true
+
+ /globals/13.20.0:
+ resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ type-fest: 0.20.2
+ dev: true
+
+ /globby/10.0.1:
+ resolution: {integrity: sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@types/glob': 7.2.0
+ array-union: 2.1.0
+ dir-glob: 3.0.1
+ fast-glob: 3.3.0
+ glob: 7.2.3
+ ignore: 5.2.4
+ merge2: 1.4.1
+ slash: 3.0.0
+ dev: false
+
+ /got/12.6.0:
+ resolution: {integrity: sha512-WTcaQ963xV97MN3x0/CbAriXFZcXCfgxVp91I+Ze6pawQOa7SgzwSx2zIJJsX+kTajMnVs0xcFD1TxZKFqhdnQ==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ '@sindresorhus/is': 5.3.0
+ '@szmarczak/http-timer': 5.0.1
+ cacheable-lookup: 7.0.0
+ cacheable-request: 10.2.10
+ decompress-response: 6.0.0
+ form-data-encoder: 2.1.4
+ get-stream: 6.0.1
+ http2-wrapper: 2.2.0
+ lowercase-keys: 3.0.0
+ p-cancelable: 3.0.0
+ responselike: 3.0.0
+ dev: true
+
+ /graceful-fs/4.2.10:
+ resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==}
+ dev: true
+
+ /graceful-fs/4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+ /graceful-readlink/1.0.1:
+ resolution: {integrity: sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==}
+ dev: true
+
+ /grapheme-splitter/1.0.4:
+ resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==}
+ dev: true
+
+ /growly/1.3.0:
+ resolution: {integrity: sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==}
+ dev: true
+
+ /har-schema/2.0.0:
+ resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /har-validator/5.1.5:
+ resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==}
+ engines: {node: '>=6'}
+ deprecated: this library is no longer supported
+ dependencies:
+ ajv: 6.12.6
+ har-schema: 2.0.0
+ dev: true
+
+ /has-flag/3.0.0:
+ resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /has-flag/4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /has-yarn/3.0.0:
+ resolution: {integrity: sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dev: true
+
+ /he/1.2.0:
+ resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
+ hasBin: true
+ dev: true
+
+ /html-escaper/3.0.3:
+ resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==}
+ dev: true
+
+ /htmlparser2/8.0.2:
+ resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==}
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ domutils: 3.1.0
+ entities: 4.5.0
+ dev: true
+
+ /http-cache-semantics/4.1.1:
+ resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==}
+ dev: true
+
+ /http-signature/1.2.0:
+ resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==}
+ engines: {node: '>=0.8', npm: '>=1.3.7'}
+ dependencies:
+ assert-plus: 1.0.0
+ jsprim: 1.4.2
+ sshpk: 1.17.0
+ dev: true
+
+ /http2-wrapper/2.2.0:
+ resolution: {integrity: sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==}
+ engines: {node: '>=10.19.0'}
+ dependencies:
+ quick-lru: 5.1.1
+ resolve-alpn: 1.2.1
+ dev: true
+
+ /human-signals/1.1.1:
+ resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==}
+ engines: {node: '>=8.12.0'}
+ dev: true
+
+ /ieee754/1.2.1:
+ resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+ dev: true
+
+ /ignore/5.2.4:
+ resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==}
+ engines: {node: '>= 4'}
+
+ /image-size/1.0.2:
+ resolution: {integrity: sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==}
+ engines: {node: '>=14.0.0'}
+ hasBin: true
+ dependencies:
+ queue: 6.0.2
+ dev: true
+
+ /immediate/3.0.6:
+ resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==}
+ dev: true
+
+ /import-fresh/3.3.0:
+ resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
+ engines: {node: '>=6'}
+ dependencies:
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
+ dev: true
+
+ /import-lazy/4.0.0:
+ resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /imurmurhash/0.1.4:
+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+ engines: {node: '>=0.8.19'}
+ dev: true
+
+ /inflight/1.0.6:
+ resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+ dependencies:
+ once: 1.4.0
+ wrappy: 1.0.2
+
+ /inherits/2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+ /ini/1.3.8:
+ resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
+ dev: true
+
+ /ini/2.0.0:
+ resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /invert-kv/3.0.1:
+ resolution: {integrity: sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /is-absolute/0.1.7:
+ resolution: {integrity: sha512-Xi9/ZSn4NFapG8RP98iNPMOeaV3mXPisxKxzKtHVqr3g56j/fBn+yZmnxSVAA8lmZbl2J9b/a4kJvfU3hqQYgA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-relative: 0.1.3
+ dev: true
+
+ /is-arrayish/0.2.1:
+ resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+ dev: true
+
+ /is-binary-path/2.1.0:
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+ engines: {node: '>=8'}
+ dependencies:
+ binary-extensions: 2.2.0
+ dev: true
+
+ /is-buffer/1.1.6:
+ resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==}
+ dev: true
+
+ /is-ci/3.0.1:
+ resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==}
+ hasBin: true
+ dependencies:
+ ci-info: 3.8.0
+ dev: true
+
+ /is-docker/2.2.1:
+ resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
+ engines: {node: '>=8'}
+ hasBin: true
+ dev: true
+
+ /is-extglob/2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+
+ /is-fullwidth-code-point/3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /is-glob/4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-extglob: 2.1.1
+
+ /is-installed-globally/0.4.0:
+ resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ global-dirs: 3.0.1
+ is-path-inside: 3.0.3
+ dev: true
+
+ /is-mergeable-object/1.1.1:
+ resolution: {integrity: sha512-CPduJfuGg8h8vW74WOxHtHmtQutyQBzR+3MjQ6iDHIYdbOnm1YC7jv43SqCoU8OPGTJD4nibmiryA4kmogbGrA==}
+ dev: true
+
+ /is-npm/6.0.0:
+ resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dev: true
+
+ /is-number/7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+
+ /is-obj/2.0.0:
+ resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /is-path-inside/3.0.3:
+ resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /is-plain-object/3.0.1:
+ resolution: {integrity: sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /is-relative/0.1.3:
+ resolution: {integrity: sha512-wBOr+rNM4gkAZqoLRJI4myw5WzzIdQosFAAbnvfXP5z1LyzgAI3ivOKehC5KfqlQJZoihVhirgtCBj378Eg8GA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /is-stream/2.0.1:
+ resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /is-typedarray/1.0.0:
+ resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==}
+ dev: true
+
+ /is-utf8/0.2.1:
+ resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==}
+ dev: true
+
+ /is-wsl/2.2.0:
+ resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
+ engines: {node: '>=8'}
+ dependencies:
+ is-docker: 2.2.1
+ dev: true
+
+ /is-yarn-global/0.4.1:
+ resolution: {integrity: sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /isarray/1.0.0:
+ resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
+ dev: true
+
+ /isexe/1.1.2:
+ resolution: {integrity: sha512-d2eJzK691yZwPHcv1LbeAOa91yMJ9QmfTgSO1oXB65ezVhXQsxBac2vEB4bMVms9cGzaA99n6V2viHMq82VLDw==}
+ dev: true
+
+ /isexe/2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+ dev: true
+
+ /isstream/0.1.2:
+ resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==}
+ dev: true
+
+ /jed/1.1.1:
+ resolution: {integrity: sha512-z35ZSEcXHxLW4yumw0dF6L464NT36vmx3wxJw8MDpraBcWuNVgUPZgPJKcu1HekNgwlMFNqol7i/IpSbjhqwqA==}
+ dev: true
+
+ /jose/4.13.1:
+ resolution: {integrity: sha512-MSJQC5vXco5Br38mzaQKiq9mwt7lwj2eXpgpRyQYNHYt2lq1PjkWa7DLXX0WVcQLE9HhMh3jPiufS7fhJf+CLQ==}
+ dev: true
+
+ /js-sdsl/4.4.0:
+ resolution: {integrity: sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==}
+ dev: true
+
+ /js-tokens/4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+ dev: true
+
+ /js-yaml/4.1.0:
+ resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+ hasBin: true
+ dependencies:
+ argparse: 2.0.1
+ dev: true
+
+ /jsbn/0.1.1:
+ resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==}
+ dev: true
+
+ /json-buffer/3.0.1:
+ resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
+ dev: true
+
+ /json-merge-patch/1.0.2:
+ resolution: {integrity: sha512-M6Vp2GN9L7cfuMXiWOmHj9bEFbeC250iVtcKQbqVgEsDVYnIsrNsbU+h/Y/PkbBQCtEa4Bez+Ebv0zfbC8ObLg==}
+ dependencies:
+ fast-deep-equal: 3.1.3
+ dev: true
+
+ /json-parse-even-better-errors/2.3.1:
+ resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+ dev: true
+
+ /json-schema-traverse/0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+ dev: true
+
+ /json-schema-traverse/1.0.0:
+ resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+ dev: true
+
+ /json-schema/0.4.0:
+ resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==}
+ dev: true
+
+ /json-stable-stringify-without-jsonify/1.0.1:
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+ dev: true
+
+ /json-stringify-safe/5.0.1:
+ resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==}
+ dev: true
+
+ /json5/2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
+ hasBin: true
+ dev: true
+
+ /jsonc-eslint-parser/1.4.1:
+ resolution: {integrity: sha512-hXBrvsR1rdjmB2kQmUjf1rEIa+TqHBGMge8pwi++C+Si1ad7EjZrJcpgwym+QGK/pqTx+K7keFAtLlVNdLRJOg==}
+ engines: {node: '>=8.10.0'}
+ dependencies:
+ acorn: 7.4.1
+ eslint-utils: 2.1.0
+ eslint-visitor-keys: 1.3.0
+ espree: 6.2.1
+ semver: 6.3.1
+ dev: true
+
+ /jsonc-parser/3.2.0:
+ resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==}
+ dev: true
+
+ /jsonfile/4.0.0:
+ resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==}
+ optionalDependencies:
+ graceful-fs: 4.2.11
+ dev: false
+
+ /jsonfile/6.1.0:
+ resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
+ dependencies:
+ universalify: 2.0.0
+ optionalDependencies:
+ graceful-fs: 4.2.11
+ dev: true
+
+ /jsonwebtoken/9.0.0:
+ resolution: {integrity: sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==}
+ engines: {node: '>=12', npm: '>=6'}
+ dependencies:
+ jws: 3.2.2
+ lodash: 4.17.21
+ ms: 2.1.3
+ semver: 7.5.0
+ dev: true
+
+ /jsprim/1.4.2:
+ resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==}
+ engines: {node: '>=0.6.0'}
+ dependencies:
+ assert-plus: 1.0.0
+ extsprintf: 1.3.0
+ json-schema: 0.4.0
+ verror: 1.10.0
+ dev: true
+
+ /jszip/3.10.1:
+ resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==}
+ dependencies:
+ lie: 3.3.0
+ pako: 1.0.11
+ readable-stream: 2.3.8
+ setimmediate: 1.0.5
+ dev: true
+
+ /jwa/1.4.1:
+ resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==}
+ dependencies:
+ buffer-equal-constant-time: 1.0.1
+ ecdsa-sig-formatter: 1.0.11
+ safe-buffer: 5.2.1
+ dev: true
+
+ /jws/3.2.2:
+ resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==}
+ dependencies:
+ jwa: 1.4.1
+ safe-buffer: 5.2.1
+ dev: true
+
+ /keyv/4.5.2:
+ resolution: {integrity: sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==}
+ dependencies:
+ json-buffer: 3.0.1
+ dev: true
+
+ /latest-version/7.0.0:
+ resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ package-json: 8.1.0
+ dev: true
+
+ /lcid/3.1.1:
+ resolution: {integrity: sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==}
+ engines: {node: '>=8'}
+ dependencies:
+ invert-kv: 3.0.1
+ dev: true
+
+ /levn/0.4.1:
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ dev: true
+
+ /lie/3.3.0:
+ resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==}
+ dependencies:
+ immediate: 3.0.6
+ dev: true
+
+ /lighthouse-logger/1.3.0:
+ resolution: {integrity: sha512-BbqAKApLb9ywUli+0a+PcV04SyJ/N1q/8qgCNe6U97KbPCS1BTksEuHFLYdvc8DltuhfxIUBqDZsC0bBGtl3lA==}
+ dependencies:
+ debug: 2.6.9
+ marky: 1.2.5
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /lines-and-columns/2.0.3:
+ resolution: {integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dev: true
+
+ /linkedom/0.14.26:
+ resolution: {integrity: sha512-mK6TrydfFA7phrnp+1j57ycBwFI5bGSW6YXlw9acHoqF+mP/y+FooEYYyniOt5Ot57FSKB3iwmnuQ1UUyNLm5A==}
+ dependencies:
+ css-select: 5.1.0
+ cssom: 0.5.0
+ html-escaper: 3.0.3
+ htmlparser2: 8.0.2
+ uhyphen: 0.2.0
+ dev: true
+
+ /locate-path/6.0.0:
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+ engines: {node: '>=10'}
+ dependencies:
+ p-locate: 5.0.0
+ dev: true
+
+ /lodash.merge/4.6.2:
+ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+ dev: true
+
+ /lodash.uniq/4.5.0:
+ resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==}
+ dev: true
+
+ /lodash.uniqby/4.7.0:
+ resolution: {integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==}
+ dev: true
+
+ /lodash/4.17.21:
+ resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+ dev: true
+
+ /lowercase-keys/3.0.0:
+ resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dev: true
+
+ /lru-cache/6.0.0:
+ resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
+ engines: {node: '>=10'}
+ dependencies:
+ yallist: 4.0.0
+ dev: true
+
+ /lru-cache/9.1.1:
+ resolution: {integrity: sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==}
+ engines: {node: 14 || >=16.14}
+ dev: true
+
+ /magic-string/0.25.9:
+ resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==}
+ dependencies:
+ sourcemap-codec: 1.4.8
+
+ /magic-string/0.30.1:
+ resolution: {integrity: sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==}
+ engines: {node: '>=12'}
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.4.15
+ dev: true
+
+ /make-error/1.3.6:
+ resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
+ dev: true
+
+ /map-age-cleaner/0.1.3:
+ resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==}
+ engines: {node: '>=6'}
+ dependencies:
+ p-defer: 1.0.0
+ dev: true
+
+ /marky/1.2.5:
+ resolution: {integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==}
+ dev: true
+
+ /md5/2.3.0:
+ resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==}
+ dependencies:
+ charenc: 0.0.2
+ crypt: 0.0.2
+ is-buffer: 1.1.6
+ dev: true
+
+ /mem/5.1.1:
+ resolution: {integrity: sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==}
+ engines: {node: '>=8'}
+ dependencies:
+ map-age-cleaner: 0.1.3
+ mimic-fn: 2.1.0
+ p-is-promise: 2.1.0
+ dev: true
+
+ /merge-stream/2.0.0:
+ resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+ dev: true
+
+ /merge2/1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
+
+ /micromatch/4.0.5:
+ resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
+ engines: {node: '>=8.6'}
+ dependencies:
+ braces: 3.0.2
+ picomatch: 2.3.1
+
+ /mime-db/1.52.0:
+ resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+ engines: {node: '>= 0.6'}
+ dev: true
+
+ /mime-types/2.1.35:
+ resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+ engines: {node: '>= 0.6'}
+ dependencies:
+ mime-db: 1.52.0
+ dev: true
+
+ /mimic-fn/2.1.0:
+ resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /mimic-response/3.1.0:
+ resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /mimic-response/4.0.0:
+ resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dev: true
+
+ /minimatch/3.1.2:
+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+ dependencies:
+ brace-expansion: 1.1.11
+
+ /minimatch/7.4.6:
+ resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==}
+ engines: {node: '>=10'}
+ dependencies:
+ brace-expansion: 2.0.1
+ dev: true
+
+ /minimatch/9.0.0:
+ resolution: {integrity: sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==}
+ engines: {node: '>=16 || 14 >=14.17'}
+ dependencies:
+ brace-expansion: 2.0.1
+ dev: true
+
+ /minimist/1.2.8:
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+ dev: true
+
+ /minipass/4.2.8:
+ resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /minipass/5.0.0:
+ resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /mkdirp/0.5.6:
+ resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
+ hasBin: true
+ dependencies:
+ minimist: 1.2.8
+ dev: true
+ optional: true
+
+ /mkdirp/1.0.4:
+ resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==}
+ engines: {node: '>=10'}
+ hasBin: true
+ dev: true
+
+ /mlly/1.4.0:
+ resolution: {integrity: sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==}
+ dependencies:
+ acorn: 8.10.0
+ pathe: 1.1.1
+ pkg-types: 1.0.3
+ ufo: 1.1.2
+ dev: true
+
+ /moment/2.29.4:
+ resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==}
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /ms/2.0.0:
+ resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
+ dev: true
+
+ /ms/2.1.2:
+ resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
+ dev: true
+
+ /ms/2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+ dev: true
+
+ /muggle-string/0.2.2:
+ resolution: {integrity: sha512-YVE1mIJ4VpUMqZObFndk9CJu6DBJR/GB13p3tXuNbwD4XExaI5EOuRl6BHeIDxIqXZVxSfAC+y6U1Z/IxCfKUg==}
+ dev: true
+
+ /multimatch/6.0.0:
+ resolution: {integrity: sha512-I7tSVxHGPlmPN/enE3mS1aOSo6bWBfls+3HmuEeCUBCE7gWnm3cBXCBkpurzFjVRwC6Kld8lLaZ1Iv5vOcjvcQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ '@types/minimatch': 3.0.5
+ array-differ: 4.0.0
+ array-union: 3.0.1
+ minimatch: 3.1.2
+ dev: true
+
+ /mv/2.1.1:
+ resolution: {integrity: sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==}
+ engines: {node: '>=0.8.0'}
+ requiresBuild: true
+ dependencies:
+ mkdirp: 0.5.6
+ ncp: 2.0.0
+ rimraf: 2.4.5
+ dev: true
+ optional: true
+
+ /mz/2.7.0:
+ resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
+ dependencies:
+ any-promise: 1.3.0
+ object-assign: 4.1.1
+ thenify-all: 1.6.0
+ dev: true
+
+ /nan/2.17.0:
+ resolution: {integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==}
+ dev: true
+ optional: true
+
+ /nanoid/3.3.6:
+ resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ /natural-compare/1.4.0:
+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+ dev: true
+
+ /ncp/2.0.0:
+ resolution: {integrity: sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==}
+ hasBin: true
+ dev: true
+ optional: true
+
+ /node-domexception/1.0.0:
+ resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==}
+ engines: {node: '>=10.5.0'}
+ dev: true
+
+ /node-fetch/3.3.1:
+ resolution: {integrity: sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ data-uri-to-buffer: 4.0.1
+ fetch-blob: 3.2.0
+ formdata-polyfill: 4.0.10
+ dev: true
+
+ /node-forge/1.3.1:
+ resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==}
+ engines: {node: '>= 6.13.0'}
+ dev: true
+
+ /node-notifier/10.0.1:
+ resolution: {integrity: sha512-YX7TSyDukOZ0g+gmzjB6abKu+hTGvO8+8+gIFDsRCU2t8fLV/P2unmt+LGFaIa4y64aX98Qksa97rgz4vMNeLQ==}
+ dependencies:
+ growly: 1.3.0
+ is-wsl: 2.2.0
+ semver: 7.5.0
+ shellwords: 0.1.1
+ uuid: 8.3.2
+ which: 2.0.2
+ dev: true
+
+ /normalize-path/3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /normalize-url/8.0.0:
+ resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==}
+ engines: {node: '>=14.16'}
+ dev: true
+
+ /npm-run-path/4.0.1:
+ resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
+ engines: {node: '>=8'}
+ dependencies:
+ path-key: 3.1.1
+ dev: true
+
+ /nth-check/2.1.1:
+ resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
+ dependencies:
+ boolbase: 1.0.0
+ dev: true
+
+ /oauth-sign/0.9.0:
+ resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==}
+ dev: true
+
+ /object-assign/4.1.1:
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /on-exit-leak-free/2.1.0:
+ resolution: {integrity: sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==}
+ dev: true
+
+ /once/1.4.0:
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+ dependencies:
+ wrappy: 1.0.2
+
+ /onetime/5.1.2:
+ resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
+ engines: {node: '>=6'}
+ dependencies:
+ mimic-fn: 2.1.0
+ dev: true
+
+ /open/8.4.2:
+ resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ define-lazy-prop: 2.0.0
+ is-docker: 2.2.1
+ is-wsl: 2.2.0
+ dev: true
+
+ /optionator/0.9.1:
+ resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ deep-is: 0.1.4
+ fast-levenshtein: 2.0.6
+ levn: 0.4.1
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ word-wrap: 1.2.3
+ dev: true
+
+ /os-locale/5.0.0:
+ resolution: {integrity: sha512-tqZcNEDAIZKBEPnHPlVDvKrp7NzgLi7jRmhKiUoa2NUmhl13FtkAGLUVR+ZsYvApBQdBfYm43A4tXXQ4IrYLBA==}
+ engines: {node: '>=10'}
+ dependencies:
+ execa: 4.1.0
+ lcid: 3.1.1
+ mem: 5.1.1
+ dev: true
+
+ /os-shim/0.1.3:
+ resolution: {integrity: sha512-jd0cvB8qQ5uVt0lvCIexBaROw1KyKm5sbulg2fWOHjETisuCzWyt+eTZKEMs8v6HwzoGs8xik26jg7eCM6pS+A==}
+ engines: {node: '>= 0.4.0'}
+ dev: true
+
+ /p-cancelable/3.0.0:
+ resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==}
+ engines: {node: '>=12.20'}
+ dev: true
+
+ /p-defer/1.0.0:
+ resolution: {integrity: sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /p-is-promise/2.1.0:
+ resolution: {integrity: sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /p-limit/3.1.0:
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ yocto-queue: 0.1.0
+ dev: true
+
+ /p-locate/5.0.0:
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+ engines: {node: '>=10'}
+ dependencies:
+ p-limit: 3.1.0
+ dev: true
+
+ /package-json/8.1.0:
+ resolution: {integrity: sha512-hySwcV8RAWeAfPsXb9/HGSPn8lwDnv6fabH+obUZKX169QknRkRhPxd1yMubpKDskLFATkl3jHpNtVtDPFA0Wg==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ got: 12.6.0
+ registry-auth-token: 5.0.2
+ registry-url: 6.0.1
+ semver: 7.5.0
+ dev: true
+
+ /pako/1.0.11:
+ resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==}
+ dev: true
+
+ /parent-module/1.0.1:
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+ engines: {node: '>=6'}
+ dependencies:
+ callsites: 3.1.0
+ dev: true
+
+ /parse-json/6.0.2:
+ resolution: {integrity: sha512-SA5aMiaIjXkAiBrW/yPgLgQAQg42f7K3ACO+2l/zOvtQBwX58DMUsFJXelW2fx3yMBmWOVkR6j1MGsdSbCA4UA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ '@babel/code-frame': 7.21.4
+ error-ex: 1.3.2
+ json-parse-even-better-errors: 2.3.1
+ lines-and-columns: 2.0.3
+ dev: true
+
+ /parse5-htmlparser2-tree-adapter/7.0.0:
+ resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==}
+ dependencies:
+ domhandler: 5.0.3
+ parse5: 7.1.2
+ dev: true
+
+ /parse5/7.1.2:
+ resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==}
+ dependencies:
+ entities: 4.5.0
+ dev: true
+
+ /path-exists/4.0.0:
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /path-is-absolute/1.0.1:
+ resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+ engines: {node: '>=0.10.0'}
+
+ /path-key/3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /path-scurry/1.7.0:
+ resolution: {integrity: sha512-UkZUeDjczjYRE495+9thsgcVgsaCPkaw80slmfVFgllxY+IO8ubTsOpFVjDPROBqJdHfVPUFRHPBV/WciOVfWg==}
+ engines: {node: '>=16 || 14 >=14.17'}
+ dependencies:
+ lru-cache: 9.1.1
+ minipass: 5.0.0
+ dev: true
+
+ /path-type/4.0.0:
+ resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
+ engines: {node: '>=8'}
+ dev: false
+
+ /pathe/1.1.1:
+ resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==}
+ dev: true
+
+ /pend/1.2.0:
+ resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==}
+ dev: true
+
+ /performance-now/2.1.0:
+ resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==}
+ dev: true
+
+ /picocolors/1.0.0:
+ resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
+
+ /picomatch/2.3.1:
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+ engines: {node: '>=8.6'}
+
+ /pino-abstract-transport/1.0.0:
+ resolution: {integrity: sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA==}
+ dependencies:
+ readable-stream: 4.3.0
+ split2: 4.2.0
+ dev: true
+
+ /pino-std-serializers/6.2.0:
+ resolution: {integrity: sha512-IWgSzUL8X1w4BIWTwErRgtV8PyOGOOi60uqv0oKuS/fOA8Nco/OeI6lBuc4dyP8MMfdFwyHqTMcBIA7nDiqEqA==}
+ dev: true
+
+ /pino/8.11.0:
+ resolution: {integrity: sha512-Z2eKSvlrl2rH8p5eveNUnTdd4AjJk8tAsLkHYZQKGHP4WTh2Gi1cOSOs3eWPqaj+niS3gj4UkoreoaWgF3ZWYg==}
+ hasBin: true
+ dependencies:
+ atomic-sleep: 1.0.0
+ fast-redact: 3.1.2
+ on-exit-leak-free: 2.1.0
+ pino-abstract-transport: 1.0.0
+ pino-std-serializers: 6.2.0
+ process-warning: 2.2.0
+ quick-format-unescaped: 4.0.4
+ real-require: 0.2.0
+ safe-stable-stringify: 2.4.3
+ sonic-boom: 3.3.0
+ thread-stream: 2.3.0
+ dev: true
+
+ /pkg-types/1.0.3:
+ resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==}
+ dependencies:
+ jsonc-parser: 3.2.0
+ mlly: 1.4.0
+ pathe: 1.1.1
+ dev: true
+
+ /postcss/8.4.21:
+ resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==}
+ engines: {node: ^10 || ^12 || >=14}
+ dependencies:
+ nanoid: 3.3.6
+ picocolors: 1.0.0
+ source-map-js: 1.0.2
+ dev: true
+
+ /postcss/8.4.23:
+ resolution: {integrity: sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==}
+ engines: {node: ^10 || ^12 || >=14}
+ dependencies:
+ nanoid: 3.3.6
+ picocolors: 1.0.0
+ source-map-js: 1.0.2
+
+ /prelude-ls/1.2.1:
+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+ engines: {node: '>= 0.8.0'}
+ dev: true
+
+ /process-nextick-args/2.0.1:
+ resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
+ dev: true
+
+ /process-warning/2.2.0:
+ resolution: {integrity: sha512-/1WZ8+VQjR6avWOgHeEPd7SDQmFQ1B5mC1eRXsCm5TarlNmx/wCsa5GEaxGm05BORRtyG/Ex/3xq3TuRvq57qg==}
+ dev: true
+
+ /process/0.11.10:
+ resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
+ engines: {node: '>= 0.6.0'}
+ dev: true
+
+ /promise-toolbox/0.21.0:
+ resolution: {integrity: sha512-NV8aTmpwrZv+Iys54sSFOBx3tuVaOBvvrft5PNppnxy9xpU/akHbaWIril22AB22zaPgrgwKdD0KsrM0ptUtpg==}
+ engines: {node: '>=6'}
+ dependencies:
+ make-error: 1.3.6
+ dev: true
+
+ /proto-list/1.2.4:
+ resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==}
+ dev: true
+
+ /psl/1.9.0:
+ resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==}
+ dev: true
+
+ /pump/3.0.0:
+ resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==}
+ dependencies:
+ end-of-stream: 1.4.4
+ once: 1.4.0
+ dev: true
+
+ /punycode/2.3.0:
+ resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /pupa/3.1.0:
+ resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==}
+ engines: {node: '>=12.20'}
+ dependencies:
+ escape-goat: 4.0.0
+ dev: true
+
+ /qs/6.5.3:
+ resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==}
+ engines: {node: '>=0.6'}
+ dev: true
+
+ /queue-microtask/1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
+ /queue/6.0.2:
+ resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==}
+ dependencies:
+ inherits: 2.0.4
+ dev: true
+
+ /quick-format-unescaped/4.0.4:
+ resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==}
+ dev: true
+
+ /quick-lru/5.1.1:
+ resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /rc/1.2.8:
+ resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
+ hasBin: true
+ dependencies:
+ deep-extend: 0.6.0
+ ini: 1.3.8
+ minimist: 1.2.8
+ strip-json-comments: 2.0.1
+ dev: true
+
+ /readable-stream/2.3.8:
+ resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
+ dependencies:
+ core-util-is: 1.0.3
+ inherits: 2.0.4
+ isarray: 1.0.0
+ process-nextick-args: 2.0.1
+ safe-buffer: 5.1.2
+ string_decoder: 1.1.1
+ util-deprecate: 1.0.2
+ dev: true
+
+ /readable-stream/4.3.0:
+ resolution: {integrity: sha512-MuEnA0lbSi7JS8XM+WNJlWZkHAAdm7gETHdFK//Q/mChGyj2akEFtdLZh32jSdkWGbRwCW9pn6g3LWDdDeZnBQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ abort-controller: 3.0.0
+ buffer: 6.0.3
+ events: 3.3.0
+ process: 0.11.10
+ dev: true
+
+ /readdirp/3.6.0:
+ resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+ engines: {node: '>=8.10.0'}
+ dependencies:
+ picomatch: 2.3.1
+ dev: true
+
+ /real-require/0.2.0:
+ resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==}
+ engines: {node: '>= 12.13.0'}
+ dev: true
+
+ /regenerator-runtime/0.13.11:
+ resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==}
+
+ /registry-auth-token/5.0.2:
+ resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==}
+ engines: {node: '>=14'}
+ dependencies:
+ '@pnpm/npm-conf': 2.1.1
+ dev: true
+
+ /registry-url/6.0.1:
+ resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==}
+ engines: {node: '>=12'}
+ dependencies:
+ rc: 1.2.8
+ dev: true
+
+ /relaxed-json/1.0.3:
+ resolution: {integrity: sha512-b7wGPo7o2KE/g7SqkJDDbav6zmrEeP4TK2VpITU72J/M949TLe/23y/ZHJo+pskcGM52xIfFoT9hydwmgr1AEg==}
+ engines: {node: '>= 0.10.0'}
+ hasBin: true
+ dependencies:
+ chalk: 2.4.2
+ commander: 2.20.3
+ dev: true
+
+ /request/2.88.2:
+ resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==}
+ engines: {node: '>= 6'}
+ deprecated: request has been deprecated, see https://github.com/request/request/issues/3142
+ dependencies:
+ aws-sign2: 0.7.0
+ aws4: 1.12.0
+ caseless: 0.12.0
+ combined-stream: 1.0.8
+ extend: 3.0.2
+ forever-agent: 0.6.1
+ form-data: 2.3.3
+ har-validator: 5.1.5
+ http-signature: 1.2.0
+ is-typedarray: 1.0.0
+ isstream: 0.1.2
+ json-stringify-safe: 5.0.1
+ mime-types: 2.1.35
+ oauth-sign: 0.9.0
+ performance-now: 2.1.0
+ qs: 6.5.3
+ safe-buffer: 5.2.1
+ tough-cookie: 2.5.0
+ tunnel-agent: 0.6.0
+ uuid: 3.4.0
+ dev: true
+
+ /require-directory/2.1.1:
+ resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /require-from-string/2.0.2:
+ resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /resolve-alpn/1.2.1:
+ resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==}
+ dev: true
+
+ /resolve-from/4.0.0:
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /responselike/3.0.0:
+ resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ lowercase-keys: 3.0.0
+ dev: true
+
+ /reusify/1.0.4:
+ resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
+ /rimraf/2.4.5:
+ resolution: {integrity: sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==}
+ hasBin: true
+ dependencies:
+ glob: 6.0.4
+ dev: true
+ optional: true
+
+ /rimraf/3.0.2:
+ resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
+ hasBin: true
+ dependencies:
+ glob: 7.2.3
+ dev: true
+
+ /rollup-plugin-copy/3.4.0:
+ resolution: {integrity: sha512-rGUmYYsYsceRJRqLVlE9FivJMxJ7X6jDlP79fmFkL8sJs7VVMSVyA2yfyL+PGyO/vJs4A87hwhgVfz61njI+uQ==}
+ engines: {node: '>=8.3'}
+ dependencies:
+ '@types/fs-extra': 8.1.2
+ colorette: 1.4.0
+ fs-extra: 8.1.0
+ globby: 10.0.1
+ is-plain-object: 3.0.1
+ dev: false
+
+ /rollup/3.21.2:
+ resolution: {integrity: sha512-c4vC+JZ3bbF4Kqq2TtM7zSKtSyMybFOjqmomFax3xpfYaPZDZ4iz8NMIuBRMjnXOcKYozw7bC6vhJjiWD6JpzQ==}
+ engines: {node: '>=14.18.0', npm: '>=8.0.0'}
+ hasBin: true
+ optionalDependencies:
+ fsevents: 2.3.2
+ dev: true
+
+ /run-parallel/1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+ dependencies:
+ queue-microtask: 1.2.3
+
+ /safe-buffer/5.1.2:
+ resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
+ dev: true
+
+ /safe-buffer/5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+ dev: true
+
+ /safe-json-stringify/1.2.0:
+ resolution: {integrity: sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==}
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /safe-stable-stringify/2.4.3:
+ resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /safer-buffer/2.1.2:
+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+ dev: true
+
+ /sax/1.2.4:
+ resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==}
+ dev: true
+
+ /semver-diff/4.0.0:
+ resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==}
+ engines: {node: '>=12'}
+ dependencies:
+ semver: 7.5.0
+ dev: true
+
+ /semver/6.3.1:
+ resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+ hasBin: true
+ dev: true
+
+ /semver/7.3.8:
+ resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==}
+ engines: {node: '>=10'}
+ hasBin: true
+ dependencies:
+ lru-cache: 6.0.0
+ dev: true
+
+ /semver/7.5.0:
+ resolution: {integrity: sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==}
+ engines: {node: '>=10'}
+ hasBin: true
+ dependencies:
+ lru-cache: 6.0.0
+ dev: true
+
+ /setimmediate/1.0.5:
+ resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==}
+ dev: true
+
+ /sha.js/2.4.11:
+ resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==}
+ hasBin: true
+ dependencies:
+ inherits: 2.0.4
+ safe-buffer: 5.2.1
+ dev: true
+
+ /shebang-command/2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+ dependencies:
+ shebang-regex: 3.0.0
+ dev: true
+
+ /shebang-regex/3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /shell-quote/1.7.3:
+ resolution: {integrity: sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==}
+ dev: true
+
+ /shellwords/0.1.1:
+ resolution: {integrity: sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==}
+ dev: true
+
+ /sign-addon/5.3.0:
+ resolution: {integrity: sha512-7nHlCzhQgVMLBNiXVEgbG/raq48awOW0lYMN5uo1BaB3mp0+k8M8pvDwbfTlr3apcxZJsk9HQsAW1POwoJugpQ==}
+ dependencies:
+ common-tags: 1.8.2
+ core-js: 3.29.0
+ deepcopy: 2.1.0
+ es6-error: 4.1.1
+ es6-promisify: 7.0.0
+ jsonwebtoken: 9.0.0
+ mz: 2.7.0
+ request: 2.88.2
+ source-map-support: 0.5.21
+ stream-to-promise: 3.0.0
+ dev: true
+
+ /signal-exit/3.0.7:
+ resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
+ dev: true
+
+ /slash/3.0.0:
+ resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
+ engines: {node: '>=8'}
+ dev: false
+
+ /sonic-boom/3.3.0:
+ resolution: {integrity: sha512-LYxp34KlZ1a2Jb8ZQgFCK3niIHzibdwtwNUWKg0qQRzsDoJ3Gfgkf8KdBTFU3SkejDEIlWwnSnpVdOZIhFMl/g==}
+ dependencies:
+ atomic-sleep: 1.0.0
+ dev: true
+
+ /source-map-js/1.0.2:
+ resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
+ engines: {node: '>=0.10.0'}
+
+ /source-map-support/0.5.21:
+ resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
+ dependencies:
+ buffer-from: 1.1.2
+ source-map: 0.6.1
+ dev: true
+
+ /source-map/0.6.1:
+ resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+ engines: {node: '>=0.10.0'}
+
+ /sourcemap-codec/1.4.8:
+ resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
+ deprecated: Please use @jridgewell/sourcemap-codec instead
+
+ /spawn-sync/1.0.15:
+ resolution: {integrity: sha512-9DWBgrgYZzNghseho0JOuh+5fg9u6QWhAWa51QC7+U5rCheZ/j1DrEZnyE0RBBRqZ9uEXGPgSSM0nky6burpVw==}
+ requiresBuild: true
+ dependencies:
+ concat-stream: 1.6.2
+ os-shim: 0.1.3
+ dev: true
+
+ /split/1.0.1:
+ resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==}
+ dependencies:
+ through: 2.3.8
+ dev: true
+
+ /split2/4.2.0:
+ resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
+ engines: {node: '>= 10.x'}
+ dev: true
+
+ /sshpk/1.17.0:
+ resolution: {integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==}
+ engines: {node: '>=0.10.0'}
+ hasBin: true
+ dependencies:
+ asn1: 0.2.6
+ assert-plus: 1.0.0
+ bcrypt-pbkdf: 1.0.2
+ dashdash: 1.14.1
+ ecc-jsbn: 0.1.2
+ getpass: 0.1.7
+ jsbn: 0.1.1
+ safer-buffer: 2.1.2
+ tweetnacl: 0.14.5
+ dev: true
+
+ /stream-to-array/2.3.0:
+ resolution: {integrity: sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA==}
+ dependencies:
+ any-promise: 1.3.0
+ dev: true
+
+ /stream-to-promise/3.0.0:
+ resolution: {integrity: sha512-h+7wLeFiYegOdgTfTxjRsrT7/Op7grnKEIHWgaO1RTHwcwk7xRreMr3S8XpDfDMesSxzgM2V4CxNCFAGo6ssnA==}
+ engines: {node: '>= 10'}
+ dependencies:
+ any-promise: 1.3.0
+ end-of-stream: 1.4.4
+ stream-to-array: 2.3.0
+ dev: true
+
+ /string-width/4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
+ dependencies:
+ emoji-regex: 8.0.0
+ is-fullwidth-code-point: 3.0.0
+ strip-ansi: 6.0.1
+ dev: true
+
+ /string-width/5.1.2:
+ resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
+ engines: {node: '>=12'}
+ dependencies:
+ eastasianwidth: 0.2.0
+ emoji-regex: 9.2.2
+ strip-ansi: 7.0.1
+ dev: true
+
+ /string_decoder/1.1.1:
+ resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
+ dependencies:
+ safe-buffer: 5.1.2
+ dev: true
+
+ /strip-ansi/6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+ dependencies:
+ ansi-regex: 5.0.1
+ dev: true
+
+ /strip-ansi/7.0.1:
+ resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==}
+ engines: {node: '>=12'}
+ dependencies:
+ ansi-regex: 6.0.1
+ dev: true
+
+ /strip-bom-buf/2.0.0:
+ resolution: {integrity: sha512-gLFNHucd6gzb8jMsl5QmZ3QgnUJmp7qn4uUSHNwEXumAp7YizoGYw19ZUVfuq4aBOQUtyn2k8X/CwzWB73W2lQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ is-utf8: 0.2.1
+ dev: true
+
+ /strip-bom-stream/4.0.0:
+ resolution: {integrity: sha512-0ApK3iAkHv6WbgLICw/J4nhwHeDZsBxIIsOD+gHgZICL6SeJ0S9f/WZqemka9cjkTyMN5geId6e8U5WGFAn3cQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ first-chunk-stream: 3.0.0
+ strip-bom-buf: 2.0.0
+ dev: true
+
+ /strip-bom/5.0.0:
+ resolution: {integrity: sha512-p+byADHF7SzEcVnLvc/r3uognM1hUhObuHXxJcgLCfD194XAkaLbjq3Wzb0N5G2tgIjH0dgT708Z51QxMeu60A==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /strip-final-newline/2.0.0:
+ resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /strip-json-comments/2.0.1:
+ resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /strip-json-comments/3.1.1:
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /strip-json-comments/5.0.0:
+ resolution: {integrity: sha512-V1LGY4UUo0jgwC+ELQ2BNWfPa17TIuwBLg+j1AA/9RPzKINl1lhxVEu2r+ZTTO8aetIsUzE5Qj6LMSBkoGYKKw==}
+ engines: {node: '>=14.16'}
+ dev: true
+
+ /supports-color/5.5.0:
+ resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
+ engines: {node: '>=4'}
+ dependencies:
+ has-flag: 3.0.0
+ dev: true
+
+ /supports-color/7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+ dependencies:
+ has-flag: 4.0.0
+ dev: true
+
+ /text-table/0.2.0:
+ resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
+ dev: true
+
+ /thenify-all/1.6.0:
+ resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
+ engines: {node: '>=0.8'}
+ dependencies:
+ thenify: 3.3.1
+ dev: true
+
+ /thenify/3.3.1:
+ resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
+ dependencies:
+ any-promise: 1.3.0
+ dev: true
+
+ /thread-stream/2.3.0:
+ resolution: {integrity: sha512-kaDqm1DET9pp3NXwR8382WHbnpXnRkN9xGN9dQt3B2+dmXiW8X1SOwmFOxAErEQ47ObhZ96J6yhZNXuyCOL7KA==}
+ dependencies:
+ real-require: 0.2.0
+ dev: true
+
+ /through/2.3.8:
+ resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
+ dev: true
+
+ /tmp/0.2.1:
+ resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==}
+ engines: {node: '>=8.17.0'}
+ dependencies:
+ rimraf: 3.0.2
+ dev: true
+
+ /to-fast-properties/2.0.0:
+ resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
+ engines: {node: '>=4'}
+
+ /to-regex-range/5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+ dependencies:
+ is-number: 7.0.0
+
+ /tosource/1.0.0:
+ resolution: {integrity: sha512-N6g8eQ1eerw6Y1pBhdgkubWIiPFwXa2POSUrlL8jth5CyyEWNWzoGKRkO3CaO7Jx27hlJP54muB3btIAbx4MPg==}
+ engines: {node: '>=0.4.0'}
+ dev: true
+
+ /tough-cookie/2.5.0:
+ resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==}
+ engines: {node: '>=0.8'}
+ dependencies:
+ psl: 1.9.0
+ punycode: 2.3.0
+ dev: true
+
+ /tunnel-agent/0.6.0:
+ resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==}
+ dependencies:
+ safe-buffer: 5.2.1
+ dev: true
+
+ /tweetnacl/0.14.5:
+ resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==}
+ dev: true
+
+ /type-check/0.4.0:
+ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ prelude-ls: 1.2.1
+ dev: true
+
+ /type-detect/4.0.8:
+ resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /type-fest/0.20.2:
+ resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /type-fest/1.4.0:
+ resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /type-fest/2.19.0:
+ resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==}
+ engines: {node: '>=12.20'}
+ dev: true
+
+ /typedarray-to-buffer/3.1.5:
+ resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==}
+ dependencies:
+ is-typedarray: 1.0.0
+ dev: true
+
+ /typedarray/0.0.6:
+ resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==}
+ dev: true
+
+ /typescript/5.0.4:
+ resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==}
+ engines: {node: '>=12.20'}
+ hasBin: true
+ dev: true
+
+ /ufo/1.1.2:
+ resolution: {integrity: sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==}
+ dev: true
+
+ /uhyphen/0.2.0:
+ resolution: {integrity: sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA==}
+ dev: true
+
+ /unique-string/3.0.0:
+ resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ crypto-random-string: 4.0.0
+ dev: true
+
+ /universalify/0.1.2:
+ resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==}
+ engines: {node: '>= 4.0.0'}
+ dev: false
+
+ /universalify/1.0.0:
+ resolution: {integrity: sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==}
+ engines: {node: '>= 10.0.0'}
+ dev: true
+
+ /universalify/2.0.0:
+ resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==}
+ engines: {node: '>= 10.0.0'}
+ dev: true
+
+ /unplugin/1.4.0:
+ resolution: {integrity: sha512-5x4eIEL6WgbzqGtF9UV8VEC/ehKptPXDS6L2b0mv4FRMkJxRtjaJfOWDd6a8+kYbqsjklix7yWP0N3SUepjXcg==}
+ dependencies:
+ acorn: 8.10.0
+ chokidar: 3.5.3
+ webpack-sources: 3.2.3
+ webpack-virtual-modules: 0.5.0
+ dev: true
+
+ /upath/2.0.1:
+ resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /update-notifier/6.0.2:
+ resolution: {integrity: sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ boxen: 7.0.2
+ chalk: 5.2.0
+ configstore: 6.0.0
+ has-yarn: 3.0.0
+ import-lazy: 4.0.0
+ is-ci: 3.0.1
+ is-installed-globally: 0.4.0
+ is-npm: 6.0.0
+ is-yarn-global: 0.4.1
+ latest-version: 7.0.0
+ pupa: 3.1.0
+ semver: 7.5.0
+ semver-diff: 4.0.0
+ xdg-basedir: 5.1.0
+ dev: true
+
+ /uri-js/4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+ dependencies:
+ punycode: 2.3.0
+ dev: true
+
+ /util-deprecate/1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+ dev: true
+
+ /uuid/3.4.0:
+ resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==}
+ deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.
+ hasBin: true
+ dev: true
+
+ /uuid/8.3.2:
+ resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
+ hasBin: true
+ dev: true
+
+ /verror/1.10.0:
+ resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==}
+ engines: {'0': node >=0.6.0}
+ dependencies:
+ assert-plus: 1.0.0
+ core-util-is: 1.0.2
+ extsprintf: 1.3.0
+ dev: true
+
+ /vite-plugin-web-extension/3.0.6_vite@4.3.3:
+ resolution: {integrity: sha512-FglKlPGzsoEajFTJygmcOHtZ8QuN6ElB1cpu9l4uwPjWO7JTvlDZo62hOEzWQPTlZ3rrskPSSTb1d6vqimSNCg==}
+ peerDependencies:
+ vite: ^4
+ dependencies:
+ ajv: 8.12.0
+ async-lock: 1.4.0
+ fs-extra: 10.1.0
+ json5: 2.2.3
+ linkedom: 0.14.26
+ lodash.uniq: 4.5.0
+ lodash.uniqby: 4.7.0
+ md5: 2.3.0
+ vite: 4.3.3
+ web-ext: 7.6.2
+ webextension-polyfill: 0.10.0
+ yaml: 2.2.2
+ transitivePeerDependencies:
+ - body-parser
+ - bufferutil
+ - express
+ - safe-compare
+ - supports-color
+ - utf-8-validate
+ dev: true
+
+ /vite/4.3.3:
+ resolution: {integrity: sha512-MwFlLBO4udZXd+VBcezo3u8mC77YQk+ik+fbc0GZWGgzfbPP+8Kf0fldhARqvSYmtIWoAJ5BXPClUbMTlqFxrA==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': '>= 14'
+ less: '*'
+ sass: '*'
+ stylus: '*'
+ sugarss: '*'
+ terser: ^5.4.0
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ less:
+ optional: true
+ sass:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+ dependencies:
+ esbuild: 0.17.18
+ postcss: 8.4.23
+ rollup: 3.21.2
+ optionalDependencies:
+ fsevents: 2.3.2
+ dev: true
+
+ /vue-chartjs/5.2.0_chart.js@4.3.0+vue@3.2.47:
+ resolution: {integrity: sha512-d3zpKmGZr2OWHQ1xmxBcAn5ShTG917+/UCLaSpaCDDqT0U7DBsvFzTs69ZnHCgKoXT55GZDW8YEj9Av+dlONLA==}
+ peerDependencies:
+ chart.js: ^4.1.1
+ vue: ^3.0.0-0 || ^2.7.0
+ dependencies:
+ chart.js: 4.3.0
+ vue: 3.2.47
+ dev: false
+
+ /vue-demi/0.14.5_vue@3.2.47:
+ resolution: {integrity: sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==}
+ engines: {node: '>=12'}
+ hasBin: true
+ requiresBuild: true
+ peerDependencies:
+ '@vue/composition-api': ^1.0.0-rc.1
+ vue: ^3.0.0-0 || ^2.6.0
+ peerDependenciesMeta:
+ '@vue/composition-api':
+ optional: true
+ dependencies:
+ vue: 3.2.47
+ dev: false
+
+ /vue-i18n/9.2.2_vue@3.2.47:
+ resolution: {integrity: sha512-yswpwtj89rTBhegUAv9Mu37LNznyu3NpyLQmozF3i1hYOhwpG8RjcjIFIIfnu+2MDZJGSZPXaKWvnQA71Yv9TQ==}
+ engines: {node: '>= 14'}
+ peerDependencies:
+ vue: ^3.0.0
+ dependencies:
+ '@intlify/core-base': 9.2.2
+ '@intlify/shared': 9.2.2
+ '@intlify/vue-devtools': 9.2.2
+ '@vue/devtools-api': 6.5.0
+ vue: 3.2.47
+
+ /vue-template-compiler/2.7.14:
+ resolution: {integrity: sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==}
+ dependencies:
+ de-indent: 1.0.2
+ he: 1.2.0
+ dev: true
+
+ /vue-tsc/1.6.1_typescript@5.0.4:
+ resolution: {integrity: sha512-cKKKrv98MdU9kgd434fkjcIpU7a5bUflhklF9usf/GzebjmZpaht7tYGm/MNdBz7V9icySceCzCr3RiG02mOJg==}
+ hasBin: true
+ peerDependencies:
+ typescript: '*'
+ dependencies:
+ '@volar/vue-language-core': 1.6.1
+ '@volar/vue-typescript': 1.6.1_typescript@5.0.4
+ semver: 7.5.0
+ typescript: 5.0.4
+ dev: true
+
+ /vue/3.2.47:
+ resolution: {integrity: sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==}
+ dependencies:
+ '@vue/compiler-dom': 3.2.47
+ '@vue/compiler-sfc': 3.2.47
+ '@vue/runtime-dom': 3.2.47
+ '@vue/server-renderer': 3.2.47_vue@3.2.47
+ '@vue/shared': 3.2.47
+
+ /watchpack/2.4.0:
+ resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==}
+ engines: {node: '>=10.13.0'}
+ dependencies:
+ glob-to-regexp: 0.4.1
+ graceful-fs: 4.2.11
+ dev: true
+
+ /wcwidth/1.0.1:
+ resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
+ dependencies:
+ defaults: 1.0.4
+ dev: true
+
+ /web-ext/7.6.2:
+ resolution: {integrity: sha512-xlxbzgFBIS/UWWlvWxyR1PIqRRzDj1cutoHh+VZu4ZTcJTfv35KVdKkLRZv4PQwHu4dg8VfTg7WEcNP4QLaaFQ==}
+ engines: {node: '>=14.0.0', npm: '>=6.9.0'}
+ hasBin: true
+ dependencies:
+ '@babel/runtime': 7.21.0
+ '@devicefarmer/adbkit': 3.2.3
+ addons-linter: 5.32.0_node-fetch@3.3.1
+ bunyan: 1.8.15
+ camelcase: 7.0.1
+ chrome-launcher: 0.15.1
+ debounce: 1.2.1
+ decamelize: 6.0.0
+ es6-error: 4.1.1
+ firefox-profile: 4.3.2
+ fs-extra: 11.1.0
+ fx-runner: 1.3.0
+ import-fresh: 3.3.0
+ jose: 4.13.1
+ mkdirp: 1.0.4
+ multimatch: 6.0.0
+ mz: 2.7.0
+ node-fetch: 3.3.1
+ node-notifier: 10.0.1
+ open: 8.4.2
+ parse-json: 6.0.2
+ promise-toolbox: 0.21.0
+ sign-addon: 5.3.0
+ source-map-support: 0.5.21
+ strip-bom: 5.0.0
+ strip-json-comments: 5.0.0
+ tmp: 0.2.1
+ update-notifier: 6.0.2
+ watchpack: 2.4.0
+ ws: 8.13.0
+ yargs: 17.7.1
+ zip-dir: 2.0.0
+ transitivePeerDependencies:
+ - body-parser
+ - bufferutil
+ - express
+ - safe-compare
+ - supports-color
+ - utf-8-validate
+ dev: true
+
+ /web-streams-polyfill/3.2.1:
+ resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==}
+ engines: {node: '>= 8'}
+ dev: true
+
+ /webextension-polyfill/0.10.0:
+ resolution: {integrity: sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==}
+ dev: true
+
+ /webpack-sources/3.2.3:
+ resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==}
+ engines: {node: '>=10.13.0'}
+ dev: true
+
+ /webpack-virtual-modules/0.5.0:
+ resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==}
+ dev: true
+
+ /when/3.7.7:
+ resolution: {integrity: sha512-9lFZp/KHoqH6bPKjbWqa+3Dg/K/r2v0X/3/G2x4DBGchVS2QX2VXL3cZV994WQVnTM1/PD71Az25nAzryEUugw==}
+ dev: true
+
+ /which/1.2.4:
+ resolution: {integrity: sha512-zDRAqDSBudazdfM9zpiI30Fu9ve47htYXcGi3ln0wfKu2a7SmrT6F3VDoYONu//48V8Vz4TdCRNPjtvyRO3yBA==}
+ hasBin: true
+ dependencies:
+ is-absolute: 0.1.7
+ isexe: 1.1.2
+ dev: true
+
+ /which/2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+ dependencies:
+ isexe: 2.0.0
+ dev: true
+
+ /widest-line/4.0.1:
+ resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==}
+ engines: {node: '>=12'}
+ dependencies:
+ string-width: 5.1.2
+ dev: true
+
+ /winreg/0.0.12:
+ resolution: {integrity: sha512-typ/+JRmi7RqP1NanzFULK36vczznSNN8kWVA9vIqXyv8GhghUlwhGp1Xj3Nms1FsPcNnsQrJOR10N58/nQ9hQ==}
+ dev: true
+
+ /word-wrap/1.2.3:
+ resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /wrap-ansi/7.0.0:
+ resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+ engines: {node: '>=10'}
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ dev: true
+
+ /wrap-ansi/8.1.0:
+ resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ ansi-styles: 6.2.1
+ string-width: 5.1.2
+ strip-ansi: 7.0.1
+ dev: true
+
+ /wrappy/1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
+ /write-file-atomic/3.0.3:
+ resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==}
+ dependencies:
+ imurmurhash: 0.1.4
+ is-typedarray: 1.0.0
+ signal-exit: 3.0.7
+ typedarray-to-buffer: 3.1.5
+ dev: true
+
+ /ws/8.13.0:
+ resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==}
+ engines: {node: '>=10.0.0'}
+ peerDependencies:
+ bufferutil: ^4.0.1
+ utf-8-validate: '>=5.0.2'
+ peerDependenciesMeta:
+ bufferutil:
+ optional: true
+ utf-8-validate:
+ optional: true
+ dev: true
+
+ /xdg-basedir/5.1.0:
+ resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /xml2js/0.5.0:
+ resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==}
+ engines: {node: '>=4.0.0'}
+ dependencies:
+ sax: 1.2.4
+ xmlbuilder: 11.0.1
+ dev: true
+
+ /xmlbuilder/11.0.1:
+ resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==}
+ engines: {node: '>=4.0'}
+ dev: true
+
+ /y18n/5.0.8:
+ resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /yallist/4.0.0:
+ resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+ dev: true
+
+ /yaml-eslint-parser/0.3.2:
+ resolution: {integrity: sha512-32kYO6kJUuZzqte82t4M/gB6/+11WAuHiEnK7FreMo20xsCKPeFH5tDBU7iWxR7zeJpNnMXfJyXwne48D0hGrg==}
+ dependencies:
+ eslint-visitor-keys: 1.3.0
+ lodash: 4.17.21
+ yaml: 1.10.2
+ dev: true
+
+ /yaml/1.10.2:
+ resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
+ engines: {node: '>= 6'}
+ dev: true
+
+ /yaml/2.2.2:
+ resolution: {integrity: sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==}
+ engines: {node: '>= 14'}
+ dev: true
+
+ /yargs-parser/21.1.1:
+ resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /yargs/17.7.1:
+ resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==}
+ engines: {node: '>=12'}
+ dependencies:
+ cliui: 8.0.1
+ escalade: 3.1.1
+ get-caller-file: 2.0.5
+ require-directory: 2.1.1
+ string-width: 4.2.3
+ y18n: 5.0.8
+ yargs-parser: 21.1.1
+ dev: true
+
+ /yauzl/2.10.0:
+ resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==}
+ dependencies:
+ buffer-crc32: 0.2.13
+ fd-slicer: 1.1.0
+ dev: true
+
+ /yocto-queue/0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /zip-dir/2.0.0:
+ resolution: {integrity: sha512-uhlsJZWz26FLYXOD6WVuq+fIcZ3aBPGo/cFdiLlv3KNwpa52IF3ISV8fLhQLiqVu5No3VhlqlgthN6gehil1Dg==}
+ dependencies:
+ async: 3.2.4
+ jszip: 3.10.1
+ dev: true
diff --git a/src/icons/128x128.png b/public/128x128.png
similarity index 100%
rename from src/icons/128x128.png
rename to public/128x128.png
diff --git a/src/icons/16x16.png b/public/16x16.png
similarity index 100%
rename from src/icons/16x16.png
rename to public/16x16.png
diff --git a/src/icons/32x32.png b/public/32x32.png
similarity index 100%
rename from src/icons/32x32.png
rename to public/32x32.png
diff --git a/src/icons/48x48.png b/public/48x48.png
similarity index 100%
rename from src/icons/48x48.png
rename to public/48x48.png
diff --git a/scripts/zip.ps1 b/scripts/zip.ps1
new file mode 100644
index 0000000..3e258e5
--- /dev/null
+++ b/scripts/zip.ps1
@@ -0,0 +1,7 @@
+$sourceFolder = ".\dist\*"
+$targetFolder = ".\artifacts"
+If (!(test-path -PathType container $targetFolder)) {
+ New-Item -ItemType Directory -Path $targetFolder
+}
+$version = $(node -pe "require('./src/manifest.json').version")
+Compress-Archive -Path $sourceFolder -DestinationPath $targetFolder/web-activity-time-tracker-$version.zip
\ No newline at end of file
diff --git a/src/_locales/de/messages.json b/src/_locales/de/messages.json
new file mode 100644
index 0000000..fc89df6
--- /dev/null
+++ b/src/_locales/de/messages.json
@@ -0,0 +1,229 @@
+{
+ "extName": {
+ "message": "Web Activity Time Tracker - Web Analytics"
+ },
+ "extDescription": {
+ "message": "Verfolgen, beschränken und blockieren Sie die Zeit Ihrer Web-Aktivität. Achte darauf, wie viel Zeit Sie auf Seiten verbringen."
+ },
+ "settings": {
+ "message": "Einstellungen"
+ },
+ "today": {
+ "message": "Heute"
+ },
+ "allTime": {
+ "message": "Die ganze Zeit "
+ },
+ "byDays": {
+ "message": "Täglich"
+ },
+ "noData": {
+ "message": "Keine Daten verfügbar"
+ },
+ "noDataForPeriod": {
+ "message": "Keine Daten für den ausgewählten Zeitraum"
+ },
+ "showAll": {
+ "message": "Alle Websites anzeigen"
+ },
+ "sortBy": {
+ "message": "Nach sortieren"
+ },
+ "usageTime": {
+ "message": "Verwendungszeit"
+ },
+ "session": {
+ "message": "Die Session "
+ },
+ "someSession": {
+ "message": "Die Sessionen"
+ },
+ "sessions": {
+ "message": "Die Sessionen "
+ },
+ "days": {
+ "message": "Tage"
+ },
+ "aggregate": {
+ "message": "Aggregierte Daten seit"
+ },
+ "websites": {
+ "message": "webseiten"
+ },
+ "cannotOpenFile": {
+ "message": "Aus Sicherheitsgründen können Sie keine lokale Datei öffnen"
+ },
+ "document": {
+ "message": "Das Dokument"
+ },
+ "limit": {
+ "message": "Das Limit "
+ },
+ "d": {
+ "message": "d"
+ },
+ "h": {
+ "message": "h"
+ },
+ "m": {
+ "message": "m"
+ },
+ "s": {
+ "message": "s"
+ },
+ "firstActiveDay": {
+ "message": "Der erste aktive Tag"
+ },
+ "numberOfActiveDays": {
+ "message": "Gesamtzahl der aktiven Tage"
+ },
+ "totalNumberOfDays": {
+ "message": "Alle Tage"
+ },
+ "todayTime": {
+ "message": "Gesamtzeit heute"
+ },
+ "averageTime": {
+ "message": "Durchschnittliche Zeit an aktiven Tagen"
+ },
+ "mostActiveDay": {
+ "message": "Der aktivste Tag"
+ },
+ "mostInactiveDay": {
+ "message": "Der inaktivste Tag"
+ },
+ "todayInclude": {
+ "message": "Der heutige Tag ist in der Statistik enthalten. Klicken Sie auf, wenn Sie aus der Statistik ausschließen möchten."
+ },
+ "todayEcclude": {
+ "message": "Der heutige Tag ist aus der Statistik ausgeschlossen. Klicken Sie auf, wenn Sie in die Statistik einbeziehen möchten."
+ },
+ "averageTimeByDays": {
+ "message": "Durchschnittliche Zeit für ausgewählte Tage"
+ },
+ "exportToCsv": {
+ "message": "In CSV exportieren"
+ },
+ "week": {
+ "message": "Diese Woche"
+ },
+ "month": {
+ "message": "In diesem Monat "
+ },
+ "lastMonth": {
+ "message": "Im letzten Monat"
+ },
+ "generalSettings": {
+ "message": "Grundlegende Einstellungen"
+ },
+ "whiteListSettings": {
+ "message": "Weiße Liste"
+ },
+ "limitsSettings": {
+ "message": "Die Beschränkungen"
+ },
+ "notificationsSettings": {
+ "message": "Die Notifikationen"
+ },
+ "aboutSettings": {
+ "message": "Über das Programm"
+ },
+ "viewTimeInBadge": {
+ "message": "Zeitindikator anzeigen",
+ "description": "Sie können die aktuellen Informationen zur verbrauchten Zeit im Kurzformat auf dem Erweiterungssymbol anzeigen"
+ },
+ "deferringDescription": {
+ "message": "Sie können die Sperre nur einmal während des Tages um 5 Minuten verschieben"
+ },
+ "allowDeferringBlock": {
+ "message": "Verzögerung der Sperre um 5 Minuten zulassen",
+ "description": "Nachdem die Site gesperrt wurde, können Sie die Sperrung einmal täglich um 5 Minuten verschieben"
+ },
+ "intervalInactivity": {
+ "message": "Stoppen Sie den Tracker, wenn es keine Aktionen während:",
+ "description": "Dies sind alle Aktionen mit der Maus oder der Tastatur"
+ },
+ "exportToCsvSetting": {
+ "message": "Ihre Webaktivitätsdaten werden in das CSV-Format exportiert",
+ "description": "Sie können Ihre Webaktivität für jeden Datumsbereich exportieren"
+ },
+ "sec": {
+ "message": "sekundenschnelle"
+ },
+ "min": {
+ "message": "minute"
+ },
+ "2min": {
+ "message": "minuten"
+ },
+ "mins": {
+ "message": "minuten"
+ },
+ "whiteList": {
+ "message": "Aktivität und Zeit für diese Websites werden nicht erfasst."
+ },
+ "addWebsite": {
+ "message": "Website hinzufügen"
+ },
+ "enterWebsite": {
+ "message": "Geben Sie Ihre Website ein..."
+ },
+ "enterNotification": {
+ "message": "Geben Sie den Text für die Benachrichtigung ein..."
+ },
+ "limits": {
+ "message": "Tägliche Zugriffsbeschränkungen für die Website",
+ "description": "Legen Sie die maximale Zeit fest, die pro Tag für den Besuch der Website zulässig ist. Nach dieser Zeit wird die Website gesperrt."
+ },
+ "limitsTip": {
+ "message": "Wenn Sie die Blockierungszeit auf 0 Stunden 0 Minuten einstellen, wird die Site sofort blockiert"
+ },
+ "save": {
+ "message": "Speichern"
+ },
+ "showDailyNotifacation": {
+ "message": "Tägliche Zusammenfassungsbenachrichtigungen",
+ "description": "Am Ende jedes Tages erhalten Sie eine Benachrichtigung mit einer Zusammenfassung Ihrer täglichen Nutzung."
+ },
+ "notificationTime": {
+ "message": "Benachrichtigungen für Websites",
+ "description": "Zeigen Sie jedes Mal Benachrichtigungen an, wenn Sie den angegebenen Zeitraum auf der Website verbringen"
+ },
+ "notificationMessage": {
+ "message": "Benachrichtigungstext",
+ "description": "Dieser Text wird in der Benachrichtigung für Websites angezeigt"
+ },
+ "notificationTimeSetting": {
+ "message": "Zeigt eine Benachrichtigung an, die eine Zusammenfassung Ihrer täglichen Nutzung enthält"
+ },
+ "github": {
+ "message": "Wenn Sie eine Frage haben oder ein Problem melden möchten, können Sie dies tun"
+ },
+ "question": {
+ "message": "Sie können auch Fragen stellen oder Ihre Vorschläge hier abgeben (hinterlassen)"
+ },
+ "supportForm": {
+ "message": "unterstützungsformular"
+ },
+ "doYouEnjoy": {
+ "message": "Gefällt Ihnen"
+ },
+ "review": {
+ "message": "Schreiben Sie eine Bewertung"
+ },
+ "block": {
+ "message": "Sie haben heute Ihr Nutzungslimit erreicht"
+ },
+ "5mins": {
+ "message": "+ 5 minuten"
+ },
+ "todayUsageTime": {
+ "message": "Bisherige Gesamtnutzungszeit "
+ },
+ "comparedToYesterday": {
+ "message": " im Vergleich zu gestern "
+ },
+ "mostVisited": {
+ "message": "Die meistbesuchte Website "
+ }
+}
diff --git a/src/_locales/en/messages.json b/src/_locales/en/messages.json
new file mode 100644
index 0000000..0043047
--- /dev/null
+++ b/src/_locales/en/messages.json
@@ -0,0 +1,229 @@
+{
+ "extName": {
+ "message": "Web Activity Time Tracker - Web Analytics"
+ },
+ "extDescription": {
+ "message": "Track and limit the time of your web activity and block access to the web resources. Monitor the time limits and review your web analytics."
+ },
+ "settings": {
+ "message": "Settings"
+ },
+ "today": {
+ "message": "Today"
+ },
+ "allTime": {
+ "message": "Total time"
+ },
+ "byDays": {
+ "message": "Daily"
+ },
+ "noData": {
+ "message": "No data"
+ },
+ "noDataForPeriod": {
+ "message": "No data for the selected period"
+ },
+ "showAll": {
+ "message": "Show all the websites"
+ },
+ "sortBy": {
+ "message": "Sorting by"
+ },
+ "usageTime": {
+ "message": "Usage Time"
+ },
+ "session": {
+ "message": "session"
+ },
+ "someSession": {
+ "message": "sessions"
+ },
+ "sessions": {
+ "message": "Sessions"
+ },
+ "days": {
+ "message": "days"
+ },
+ "aggregate": {
+ "message": "Aggregate data since"
+ },
+ "websites": {
+ "message": "websites"
+ },
+ "cannotOpenFile": {
+ "message": "You cannot open a local file due to security protocol"
+ },
+ "document": {
+ "message": "Document"
+ },
+ "limit": {
+ "message": "Limit"
+ },
+ "d": {
+ "message": "d"
+ },
+ "h": {
+ "message": "h"
+ },
+ "m": {
+ "message": "m"
+ },
+ "s": {
+ "message": "s"
+ },
+ "firstActiveDay": {
+ "message": "The first active day"
+ },
+ "numberOfActiveDays": {
+ "message": "Number of active days"
+ },
+ "totalNumberOfDays": {
+ "message": "Total number of days"
+ },
+ "todayTime": {
+ "message": "All the time today"
+ },
+ "averageTime": {
+ "message": "Average time for active days"
+ },
+ "mostActiveDay": {
+ "message": "The most active day"
+ },
+ "mostInactiveDay": {
+ "message": "The most inactive day"
+ },
+ "todayInclude": {
+ "message": "Today is included in the statistics. Click to exclude."
+ },
+ "todayEcclude": {
+ "message": "Today is excluded from the statistics. Click to include."
+ },
+ "averageTimeByDays": {
+ "message": "Average time on selected days"
+ },
+ "exportToCsv": {
+ "message": "Export to CSV"
+ },
+ "week": {
+ "message": "This week"
+ },
+ "month": {
+ "message": "This month"
+ },
+ "lastMonth": {
+ "message": "Last month"
+ },
+ "generalSettings": {
+ "message": "General Settings"
+ },
+ "whiteListSettings": {
+ "message": "WhiteList"
+ },
+ "limitsSettings": {
+ "message": "Limits"
+ },
+ "notificationsSettings": {
+ "message": "Notifications"
+ },
+ "aboutSettings": {
+ "message": "About"
+ },
+ "viewTimeInBadge": {
+ "message": "Display time tracker in icon",
+ "description": "You are able to see current 'spent time' information in short format on the extension icon"
+ },
+ "deferringDescription": {
+ "message": "You can postpone the blocking for 5 minutes only once during the day"
+ },
+ "allowDeferringBlock": {
+ "message": "Allow deferring block for 5 minutes",
+ "description": "After the site is blocked, you can postpone the blocking for 5 minutes once during the day"
+ },
+ "intervalInactivity": {
+ "message": "Stop the tracker if there is no action during:",
+ "description": "These are any actions with the mouse or keyboard"
+ },
+ "exportToCsvSetting": {
+ "message": "Exporting your web activity data to CSV",
+ "description": "You can export your web activity for any date range"
+ },
+ "sec": {
+ "message": "seconds"
+ },
+ "min": {
+ "message": "minute"
+ },
+ "2min": {
+ "message": "minutes"
+ },
+ "mins": {
+ "message": "minutes"
+ },
+ "whiteList": {
+ "message": "Activity and spent time for these websites will not be tracked"
+ },
+ "addWebsite": {
+ "message": "Add Website"
+ },
+ "enterWebsite": {
+ "message": "Enter website name..."
+ },
+ "enterNotification": {
+ "message": "Enter notification message..."
+ },
+ "limits": {
+ "message": "Daily restrictions on access to websites",
+ "description": "Set the maximum time allowed to visit the site per day. After this time, the site will be blocked."
+ },
+ "limitsTip": {
+ "message": "If you set the blocking time to 0 hours 0 minutes, the website will be blocked immediately"
+ },
+ "save": {
+ "message": "Save"
+ },
+ "showDailyNotifacation": {
+ "message": "Daily Summary Notifications",
+ "description": "At the end of each day, you will receive a notification with a summary of your daily usage"
+ },
+ "notificationTime": {
+ "message": "Notifications for websites",
+ "description": "Show notifications every time you spend a selected period of time on the website"
+ },
+ "notificationMessage": {
+ "message": "Notification message",
+ "description": "You will see this message in notification for websites every time"
+ },
+ "notificationTimeSetting": {
+ "message": "Notification time with summary information about your daily usage"
+ },
+ "github": {
+ "message": "If you have feedback or would like to report an issue, you can do so on the"
+ },
+ "question": {
+ "message": "You can also ask questions or leave your suggestions here"
+ },
+ "supportForm": {
+ "message": "support form"
+ },
+ "doYouEnjoy": {
+ "message": "Do you enjoy using Web Activity Time Tracker?"
+ },
+ "review": {
+ "message": "Leave a review!"
+ },
+ "block": {
+ "message": "You've reached your limit today on "
+ },
+ "5mins": {
+ "message": "+ 5 minutes"
+ },
+ "todayUsageTime": {
+ "message": "Today's total usage time "
+ },
+ "comparedToYesterday": {
+ "message": " compared to yesterday "
+ },
+ "mostVisited": {
+ "message": "Most visited website "
+ }
+}
diff --git a/src/_locales/ru/messages.json b/src/_locales/ru/messages.json
new file mode 100644
index 0000000..0e763cd
--- /dev/null
+++ b/src/_locales/ru/messages.json
@@ -0,0 +1,229 @@
+{
+ "extName": {
+ "message": "Web Activity Time Tracker - \u0412\u0435\u0431 аналитика"
+ },
+ "extDescription": {
+ "message": "Отслеживайте время вашей веб-активности и блокируйте доступ к веб-ресурсам. Следите за тем, сколько времени вы проводите на сайтах."
+ },
+ "settings": {
+ "message": "Настройки"
+ },
+ "today": {
+ "message": "Сегодня"
+ },
+ "allTime": {
+ "message": "\u0417\u0430 все время"
+ },
+ "byDays": {
+ "message": "По дням"
+ },
+ "noData": {
+ "message": "Нет данных"
+ },
+ "noDataForPeriod": {
+ "message": "Нет данных за выбранный период"
+ },
+ "showAll": {
+ "message": "Показать все сайты"
+ },
+ "sortBy": {
+ "message": "Сортировать по"
+ },
+ "usageTime": {
+ "message": "Время использования"
+ },
+ "session": {
+ "message": "сессия"
+ },
+ "someSession": {
+ "message": "сессий"
+ },
+ "sessions": {
+ "message": "Сессии"
+ },
+ "days": {
+ "message": "дней"
+ },
+ "aggregate": {
+ "message": "Данные \u0441 "
+ },
+ "websites": {
+ "message": "сайтов"
+ },
+ "cannotOpenFile": {
+ "message": "Вы не можете открыть локальный файл из-за правил безопасности"
+ },
+ "document": {
+ "message": "Документ"
+ },
+ "limit": {
+ "message": "Лимит"
+ },
+ "d": {
+ "message": "д"
+ },
+ "h": {
+ "message": "ч"
+ },
+ "m": {
+ "message": "мин"
+ },
+ "s": {
+ "message": "\u0441\u0435к"
+ },
+ "firstActiveDay": {
+ "message": "Первый активный день"
+ },
+ "numberOfActiveDays": {
+ "message": "\u0412\u0441\u0435\u0433\u043E активных дней"
+ },
+ "totalNumberOfDays": {
+ "message": "\u0412\u0441\u0435\u0433\u043E дней"
+ },
+ "todayTime": {
+ "message": "Общее время сегодня"
+ },
+ "averageTime": {
+ "message": "Среднее время по активным дням"
+ },
+ "mostActiveDay": {
+ "message": "Самый активный день"
+ },
+ "mostInactiveDay": {
+ "message": "Самый неактивный день"
+ },
+ "todayInclude": {
+ "message": "Сегодняшний день включен в статистику. Нажмите, если хотите исключить из статистики."
+ },
+ "todayEcclude": {
+ "message": "Сегодняшний день исключен из статистику. Нажмите, если хотите включить в статистику."
+ },
+ "averageTimeByDays": {
+ "message": "Среднее время по выбранным дням"
+ },
+ "exportToCsv": {
+ "message": "Экспортировать в CSV"
+ },
+ "week": {
+ "message": "Эта неделя"
+ },
+ "month": {
+ "message": "Этот месяц"
+ },
+ "lastMonth": {
+ "message": "Последний месяц"
+ },
+ "generalSettings": {
+ "message": "Основные настройки"
+ },
+ "whiteListSettings": {
+ "message": "Белый список"
+ },
+ "limitsSettings": {
+ "message": "Лимиты"
+ },
+ "notificationsSettings": {
+ "message": "Уведомления"
+ },
+ "aboutSettings": {
+ "message": "\u041E программе"
+ },
+ "viewTimeInBadge": {
+ "message": "Показывать индикатор времени",
+ "description": "Вы можете увидеть текущее затраченное время в сокращенном формате на значке расширения"
+ },
+ "deferringDescription": {
+ "message": "Вы можете отложить блокировку на 5 минут только один раз в течение дня"
+ },
+ "allowDeferringBlock": {
+ "message": "Разрешить отсрочку блокировки на 5 минут",
+ "description": "После того, как сайт будет заблокирован, вы можете один раз в течение дня отложить блокировку на 5 минут"
+ },
+ "intervalInactivity": {
+ "message": "Остановить трекер, если нет никаких действий в течение:",
+ "description": "Это любые действия \u0441 помощью мыши или клавиатуры"
+ },
+ "exportToCsvSetting": {
+ "message": "Экспорт данных вашей веб-активности в формат CSV",
+ "description": "Вы можете экспортировать свою веб-активность для любого диапазона дат"
+ },
+ "sec": {
+ "message": "секунд"
+ },
+ "min": {
+ "message": "минута"
+ },
+ "2min": {
+ "message": "минуты"
+ },
+ "mins": {
+ "message": "минут"
+ },
+ "whiteList": {
+ "message": "Активность и время для этих сайтов отслеживаться не будут"
+ },
+ "addWebsite": {
+ "message": "Добавить сайт"
+ },
+ "enterWebsite": {
+ "message": "Введите сайт..."
+ },
+ "enterNotification": {
+ "message": "Введите текст уведомления..."
+ },
+ "limits": {
+ "message": "Ежедневные ограничения доступа к сайтам",
+ "description": "Установите максимальное время, разрешенное для посещения сайта в день. По истечении этого времени сайт будет заблокирован."
+ },
+ "limitsTip": {
+ "message": "Если вы установите время блокировки равным 0 часам 0 минутам, сайт будет немедленно заблокирован"
+ },
+ "save": {
+ "message": "Сохранить"
+ },
+ "showDailyNotifacation": {
+ "message": "Ежедневные итоговые уведомления",
+ "description": "\u0412 конце каждого дня вы будете получать уведомление \u0441 краткой информацией \u043E вашем ежедневном использовании"
+ },
+ "notificationTimeSetting": {
+ "message": "Время показа уведомления \u0441 краткой информацией \u043E вашем ежедневном использовании"
+ },
+ "notificationTime": {
+ "message": "Уведомления для сайтов",
+ "description": "Показывать уведомления каждый раз, когда вы проводите указанный период времени на сайте"
+ },
+ "notificationMessage": {
+ "message": "Текст уведомления",
+ "description": "Вы будете видеть это сообщение в уведомлении для сайтов"
+ },
+ "github": {
+ "message": "Если \u0443 вас есть вопрос или вы хотели бы сообщить \u043E проблеме, вы можете сделать это на"
+ },
+ "question": {
+ "message": "Также вы можете задать вопросы или оставить свои предложения здесь"
+ },
+ "supportForm": {
+ "message": "поддержка"
+ },
+ "doYouEnjoy": {
+ "message": "Вам нравится использовать Web Activity Time Tracker?"
+ },
+ "review": {
+ "message": "Оставьте отзыв!"
+ },
+ "block": {
+ "message": "Вы достигли лимита использования сегодня на "
+ },
+ "5mins": {
+ "message": "+ 5 минут"
+ },
+ "todayUsageTime": {
+ "message": "Общее время использования на сегодняшний день "
+ },
+ "comparedToYesterday": {
+ "message": " по сравнению \u0441\u043e вчерашним днем "
+ },
+ "mostVisited": {
+ "message": "Самый посещаемый сайт "
+ }
+}
diff --git a/src/assets/css/dashboard.css b/src/assets/css/dashboard.css
new file mode 100644
index 0000000..32a2f14
--- /dev/null
+++ b/src/assets/css/dashboard.css
@@ -0,0 +1,318 @@
+body {
+ font-family: 'Segoe UI', Tahoma, sans-serif !important;
+ color: #262626;
+ background-color: #eee;
+ margin: 0;
+}
+
+.container {
+ width: 850px;
+ margin: 10px auto;
+}
+
+.title {
+ font-size: 18px;
+ font-weight: 650;
+}
+
+.setting-header {
+ font-weight: 550;
+ font-size: 15px;
+}
+
+.description {
+ font-size: 13px;
+ color: grey;
+ margin: 7px 0 15px 0;
+ font-weight: normal;
+}
+
+.url-list {
+ border-radius: 3px;
+ border: 1px solid #ccc;
+ width: 515px;
+ min-height: 150px;
+ cursor: pointer;
+ list-style: none;
+ padding: 10px;
+ max-height: 300px;
+ overflow: auto;
+}
+
+.url-list li {
+ line-height: 25px;
+ font-size: 14px;
+}
+
+input[type='text'] {
+ height: 36px;
+ padding: 0 0 0 5px;
+ width: 400px;
+ border-radius: 3px;
+ border: 1px solid #ccc;
+}
+
+input[type='button'].small-btn {
+ padding: 0 5px;
+ width: 120px;
+}
+
+.option {
+ min-width: 170px;
+ color: #444;
+ background: #fff;
+ border-radius: 3px;
+ margin: 0;
+ padding: 10px 30px 10px 15px;
+ font-size: 14px;
+ border-color: #ccc;
+ position: relative;
+ cursor: pointer;
+}
+
+.header {
+ grid-area: h;
+ margin: 0 0 10px;
+ font-size: 20px;
+}
+
+a {
+ color: #3477db;
+ text-decoration: none;
+ cursor: pointer;
+}
+
+label {
+ font-size: 14px;
+}
+
+[type='checkbox']:not(:checked),
+[type='checkbox']:checked {
+ position: absolute;
+ opacity: 0;
+ pointer-events: none;
+}
+
+[type='checkbox'] + span {
+ position: relative;
+ padding-left: 30px;
+ cursor: pointer;
+ display: inline-block;
+ height: 25px;
+ line-height: 25px;
+ font-size: 14px;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+[type='checkbox'] + span:before,
+[type='checkbox']:not(.filled-in) + span:after {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 18px;
+ height: 18px;
+ z-index: 0;
+ border: 2px solid #5a5a5a;
+ border-radius: 1px;
+ margin-top: 3px;
+}
+
+[type='checkbox']:not(:checked):disabled + span:before {
+ border: none;
+ background-color: rgba(0, 0, 0, 0.42);
+}
+
+[type='checkbox']:checked:disabled + span:before {
+ border-right: 2px solid rgba(0, 0, 0, 0.42);
+ border-bottom: 2px solid rgba(0, 0, 0, 0.42);
+}
+
+[type='checkbox'].filled-in + span:after {
+ border-radius: 2px;
+}
+
+[type='checkbox'].filled-in + span:before,
+[type='checkbox'].filled-in + span:after {
+ content: '';
+ left: 0;
+ position: absolute;
+ z-index: 1;
+}
+
+[type='checkbox'].filled-in:not(:checked) + span:before {
+ width: 0;
+ height: 0;
+ border: 3px solid transparent;
+ left: 6px;
+ top: 10px;
+ -webkit-transform: rotateZ(37deg);
+ transform: rotateZ(37deg);
+ -webkit-transform-origin: 100% 100%;
+ transform-origin: 100% 100%;
+}
+
+[type='checkbox'].filled-in:not(:checked) + span:after {
+ height: 17px;
+ width: 17px;
+ background-color: transparent;
+ border: 2px solid #5a5a5a;
+ top: 0px;
+ z-index: 0;
+}
+
+[type='checkbox'].filled-in:checked + span:before {
+ top: -3px;
+ left: -2px;
+ width: 7px;
+ height: 12px;
+ border-top: 3px solid transparent;
+ border-left: 3px solid transparent;
+ border-right: 3px solid #fff;
+ border-bottom: 3px solid #fff;
+ -webkit-transform: rotateZ(35deg);
+ transform: rotateZ(35deg);
+ -webkit-transform-origin: 100% 100%;
+ transform-origin: 100% 100%;
+}
+
+[type='checkbox'].filled-in:checked + span:after {
+ top: 0;
+ width: 17px;
+ height: 17px;
+ border: 2px solid #3477db;
+ background-color: #3477db;
+ z-index: 0;
+}
+
+.hidden {
+ display: none !important;
+}
+
+.notify {
+ width: 220px;
+ height: 27px;
+ margin: auto;
+ background-color: rgb(21, 104, 0);
+ color: rgb(255, 255, 255);
+ text-align: center;
+ font-weight: 600;
+ border-radius: 5px;
+ position: fixed;
+ z-index: 1;
+ top: 10px;
+ right: 20px;
+ font-size: 15px;
+ white-space: nowrap;
+ padding: 10px;
+}
+
+.block {
+ display: block;
+}
+
+.readonly-input {
+ cursor: default;
+ border: 0;
+ display: block;
+}
+
+.setting-notify-block {
+ width: 450px;
+ height: 100px;
+ margin-top: 15px;
+ background-color: rgb(175, 175, 175);
+ border-radius: 10px;
+}
+
+.setting-notify-block .setting-notify-title {
+ padding: 15px 20px 5px 0;
+ font-weight: 700;
+ color: #ffffff;
+ font-size: 15px;
+ text-align: left;
+ display: block;
+}
+
+.setting-notify-block .setting-notify-message {
+ padding: 3px 20px 5px 0;
+ font-size: 14px;
+ display: block;
+ width: 320px;
+}
+.setting-notify-block .setting-notify-message-g {
+ padding: 0 30px 5px 0;
+ color: rgb(199, 199, 199);
+ font-size: 11px;
+ display: block;
+}
+
+.setting-notify-block .setting-notify-img {
+ height: 50px;
+ padding: 25px 15px 25px 25px;
+}
+
+.setting-notify-block .setting-notify-message-block {
+ display: inline-block;
+ position: absolute;
+}
+
+.settings-tabs {
+}
+.settings-tab {
+ clear: both;
+ width: 286px;
+}
+.settings-tab label[name='tabName'] {
+ background: #eee;
+ padding: 5px 0 5px 35px;
+ font-size: 16px;
+ vertical-align: middle;
+ width: 250px;
+ height: 40px;
+ display: table-cell;
+ cursor: pointer;
+}
+.settings-tab [type='radio'] {
+ display: none;
+}
+.settings-content {
+ position: absolute;
+ top: 0;
+ left: 286px;
+ background: white;
+ right: 0;
+ bottom: 0;
+ padding: 50px;
+ border-left: 1px solid #ccc;
+}
+.settings-content span {
+ animation: 0.5s ease-out 0s 1 slideInFromTop;
+}
+[type='radio']:checked ~ label {
+ background: white;
+ border-bottom: 2px solid #8bc34a;
+ z-index: 2;
+}
+[type='radio']:checked ~ label ~ .settings-content {
+ z-index: 1;
+}
+.settings-item {
+ margin-bottom: 30px;
+}
+.url-list img {
+ vertical-align: middle;
+ margin-right: 10px;
+ cursor: pointer;
+}
+.url-list {
+ width: 655px !important;
+}
+
+.url-list .time-value {
+ margin-top: 5px;
+ margin-left: 30px;
+}
diff --git a/src/assets/css/general.css b/src/assets/css/general.css
new file mode 100644
index 0000000..3da15dd
--- /dev/null
+++ b/src/assets/css/general.css
@@ -0,0 +1,73 @@
+.float-right {
+ float: right;
+}
+.d-inline-block {
+ display: inline-block;
+}
+.mt-0 {
+ margin-top: 0;
+}
+.mt-20 {
+ margin-top: 20px;
+}
+.ml-10 {
+ margin-left: 10px;
+}
+.mr-10 {
+ margin-right: 10px;
+}
+.mr-5 {
+ margin-right: 5px;
+}
+.pr-5 {
+ padding-right: 5px;
+}
+.p-5 {
+ padding: 5px;
+}
+.text-right {
+ text-align: right;
+}
+.text-center {
+ text-align: center;
+}
+
+.mt-15 {
+ margin-top: 15px;
+}
+select {
+ border-color: #ccc;
+ border-radius: 5px;
+}
+.w-100 {
+ width: 100%;
+}
+.w-80 {
+ width: 80%;
+}
+input[type='button'] {
+ background: #428bff;
+ color: #fff;
+ border-radius: 3px;
+ height: 36px;
+ line-height: 35px;
+ padding: 0 20px;
+ border: 0;
+ font-size: 14px;
+ font-weight: 500;
+ cursor: pointer;
+ min-width: 80px;
+ text-align: center;
+ width: 200px;
+}
+
+input[type='button']:hover {
+ background: #5c9dfe;
+ text-decoration: none;
+}
+
+input[type='button'][disabled] {
+ border: 1px solid #999999;
+ background-color: #cccccc;
+ color: #666666;
+}
diff --git a/src/assets/css/main.css b/src/assets/css/main.css
new file mode 100644
index 0000000..e804281
--- /dev/null
+++ b/src/assets/css/main.css
@@ -0,0 +1,233 @@
+:root {
+ --main-color: #6ebf5d;
+ --popup-header: #efefef;
+ --progress-bar: #428bff;
+}
+::-webkit-scrollbar-track {
+ border-radius: 10px;
+ background-color: #f5f5f5;
+}
+
+::-webkit-scrollbar {
+ width: 7px;
+ background-color: #f5f5f5;
+}
+
+::-webkit-scrollbar-thumb {
+ border-radius: 10px;
+ background-color: #7c7c7c;
+}
+html,
+body {
+ width: 600px;
+ height: 590px;
+ padding: 0;
+ margin: 0;
+}
+.no-data {
+ text-align: center;
+ font-size: 16px;
+ font-weight: 600;
+ margin-top: 30%;
+}
+.tabs {
+}
+.tabs input[name='tab-control'] {
+ display: none;
+}
+.tabs .content section h2,
+.tabs ul li label {
+ font-size: 15px;
+ color: #428bff;
+}
+.tabs ul {
+ list-style-type: none;
+ padding-left: 0;
+ display: flex;
+ flex-direction: row;
+ margin-bottom: 10px;
+ justify-content: space-between;
+ align-items: flex-end;
+ flex-wrap: wrap;
+}
+.tabs ul li {
+ box-sizing: border-box;
+ flex: 1;
+ width: 25%;
+ padding: 0 10px;
+ text-align: center;
+}
+.tabs ul li label {
+ transition: all 0.3s ease-in-out;
+ color: #929daf;
+ padding: 5px auto;
+ overflow: hidden;
+ display: block;
+ cursor: pointer;
+ transition: all 0.2s ease-in-out;
+ white-space: nowrap;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.tabs ul li label br {
+ display: none;
+}
+.tabs ul li label img {
+ filter: brightness(0) saturate(100%) invert(67%) sepia(15%) saturate(342%) hue-rotate(178deg)
+ brightness(91%) contrast(89%);
+ vertical-align: bottom;
+ margin-right: 0.2em;
+ transition: all 0.2s ease-in-out;
+}
+.tabs ul li label:hover,
+.tabs ul li label:focus,
+.tabs ul li label:active {
+ outline: 0;
+ color: #bec5cf;
+}
+.tabs ul li label:hover img,
+.tabs ul li label:focus img,
+.tabs ul li label:active img {
+ filter: #bec5cf;
+}
+.tabs .slider {
+ position: relative;
+ width: 25%;
+ transition: all 0.33s cubic-bezier(0.38, 0.8, 0.32, 1.07);
+}
+.tabs .slider .indicator {
+ position: relative;
+ width: 50px;
+ max-width: 100%;
+ margin: 0 auto;
+ height: 4px;
+ background: #428bff;
+ border-radius: 1px;
+}
+.tabs .content {
+ margin-top: 10px;
+}
+.tabs .content section {
+ display: none;
+ -webkit-animation-name: content;
+ animation-name: content;
+ -webkit-animation-direction: normal;
+ animation-direction: normal;
+ -webkit-animation-duration: 0.3s;
+ animation-duration: 0.3s;
+ -webkit-animation-timing-function: ease-in-out;
+ animation-timing-function: ease-in-out;
+ -webkit-animation-iteration-count: 1;
+ animation-iteration-count: 1;
+ line-height: 1.4;
+}
+.tabs .content section h2 {
+ color: #428bff;
+ display: none;
+}
+.tabs .content section h2::after {
+ content: '';
+ position: relative;
+ display: block;
+ width: 30px;
+ height: 3px;
+ background: #428bff;
+ margin-top: 5px;
+ left: 1px;
+}
+.tabs input[name='tab-control']:nth-of-type(1):checked ~ ul > li:nth-child(1) > label {
+ cursor: default;
+ color: #428bff;
+}
+.tabs input[name='tab-control']:nth-of-type(1):checked ~ ul > li:nth-child(1) > label img {
+ filter: brightness(0) saturate(100%) invert(59%) sepia(82%) saturate(4677%) hue-rotate(202deg)
+ brightness(103%) contrast(101%);
+}
+.tabs input[name='tab-control']:nth-of-type(1):checked ~ .slider {
+ transform: translateX(17%);
+}
+.tabs input[name='tab-control']:nth-of-type(1):checked ~ .content > section:nth-child(1) {
+ display: block;
+}
+.tabs input[name='tab-control']:nth-of-type(2):checked ~ ul > li:nth-child(2) > label {
+ cursor: default;
+ color: #428bff;
+}
+.tabs input[name='tab-control']:nth-of-type(2):checked ~ ul > li:nth-child(2) > label img {
+ filter: brightness(0) saturate(100%) invert(59%) sepia(82%) saturate(4677%) hue-rotate(202deg)
+ brightness(103%) contrast(101%);
+}
+.tabs input[name='tab-control']:nth-of-type(2):checked ~ .slider {
+ transform: translateX(150%);
+}
+.tabs input[name='tab-control']:nth-of-type(2):checked ~ .content > section:nth-child(2) {
+ display: block;
+}
+.tabs input[name='tab-control']:nth-of-type(3):checked ~ ul > li:nth-child(3) > label {
+ cursor: default;
+ color: #428bff;
+}
+.tabs input[name='tab-control']:nth-of-type(3):checked ~ ul > li:nth-child(3) > label img {
+ filter: brightness(0) saturate(100%) invert(59%) sepia(82%) saturate(4677%) hue-rotate(202deg)
+ brightness(103%) contrast(101%);
+}
+.tabs input[name='tab-control']:nth-of-type(3):checked ~ .slider {
+ transform: translateX(290%);
+}
+.tabs input[name='tab-control']:nth-of-type(3):checked ~ .content > section:nth-child(3) {
+ display: block;
+}
+@-webkit-keyframes content {
+ from {
+ opacity: 0;
+ transform: translateY(5%);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0%);
+ }
+}
+@keyframes content {
+ from {
+ opacity: 0;
+ transform: translateY(5%);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0%);
+ }
+}
+.tabs ul li label {
+ white-space: initial;
+}
+.tabs ul li label img {
+ height: 1.2em;
+}
+.tooltip {
+ position: relative;
+ display: inline-block;
+ vertical-align: middle;
+}
+.tooltip .tooltiptext {
+ font-size: 11px;
+ font-weight: 500;
+ visibility: hidden;
+ width: 180px;
+ background-color: #555;
+ color: #fff;
+ text-align: center;
+ padding: 10px 10px;
+ border-radius: 6px;
+ position: absolute;
+ z-index: 1;
+ transform: translate(-55%) translateY(-125%);
+ opacity: 0;
+ transition: opacity 0.3s;
+}
+.tooltip:hover .tooltiptext {
+ visibility: visible;
+ opacity: 1;
+}
diff --git a/src/assets/icons/128x128.png b/src/assets/icons/128x128.png
new file mode 100644
index 0000000..8915f31
Binary files /dev/null and b/src/assets/icons/128x128.png differ
diff --git a/src/assets/icons/16x16.png b/src/assets/icons/16x16.png
new file mode 100644
index 0000000..4916da6
Binary files /dev/null and b/src/assets/icons/16x16.png differ
diff --git a/src/assets/icons/32x32.png b/src/assets/icons/32x32.png
new file mode 100644
index 0000000..f6812bb
Binary files /dev/null and b/src/assets/icons/32x32.png differ
diff --git a/src/assets/icons/48x48.png b/src/assets/icons/48x48.png
new file mode 100644
index 0000000..336d1ef
Binary files /dev/null and b/src/assets/icons/48x48.png differ
diff --git a/src/assets/icons/dark-mode.svg b/src/assets/icons/dark-mode.svg
new file mode 100644
index 0000000..767b50e
--- /dev/null
+++ b/src/assets/icons/dark-mode.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/src/assets/icons/delete.png b/src/assets/icons/delete.png
new file mode 100644
index 0000000..1899aff
Binary files /dev/null and b/src/assets/icons/delete.png differ
diff --git a/src/assets/icons/edit.svg b/src/assets/icons/edit.svg
new file mode 100644
index 0000000..c06b44d
--- /dev/null
+++ b/src/assets/icons/edit.svg
@@ -0,0 +1,27 @@
+
+
+
\ No newline at end of file
diff --git a/src/icons/empty.png b/src/assets/icons/empty.png
similarity index 100%
rename from src/icons/empty.png
rename to src/assets/icons/empty.png
diff --git a/src/assets/icons/no-today.svg b/src/assets/icons/no-today.svg
new file mode 100644
index 0000000..9933b25
--- /dev/null
+++ b/src/assets/icons/no-today.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/preloader.gif b/src/assets/icons/preloader.gif
new file mode 100644
index 0000000..32ac2b4
Binary files /dev/null and b/src/assets/icons/preloader.gif differ
diff --git a/src/assets/icons/settings.svg b/src/assets/icons/settings.svg
new file mode 100644
index 0000000..9b86d3e
--- /dev/null
+++ b/src/assets/icons/settings.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/src/icons/success.png b/src/assets/icons/success.png
similarity index 100%
rename from src/icons/success.png
rename to src/assets/icons/success.png
diff --git a/src/icons/today.svg b/src/assets/icons/today.svg
similarity index 100%
rename from src/icons/today.svg
rename to src/assets/icons/today.svg
diff --git a/src/background.ts b/src/background.ts
new file mode 100644
index 0000000..fa23a17
--- /dev/null
+++ b/src/background.ts
@@ -0,0 +1,37 @@
+import Browser from 'webextension-polyfill';
+import { initTracker } from './tracker';
+import { logger } from './compositions/logger';
+import { scheduleJobs } from './jobs/sheduler';
+import { Settings } from './compositions/settings';
+import { StorageParams } from './storage/storage-params';
+
+logger.log('Start background script');
+
+self.onerror = err => {
+ console.error('Unhandled error:', err);
+};
+
+Browser.runtime.onInstalled.addListener(details => {
+ logger.log('Extension installed:', details);
+});
+
+Browser.storage.onChanged.addListener((changes, namespace) => {
+ for (var key in changes) {
+ if (Object.values(StorageParams).includes(key as StorageParams))
+ Settings.getInstance().reloadSetting(key as StorageParams);
+ }
+});
+
+Browser.runtime.onInstalled.addListener(details => {
+ if (
+ details.reason == 'update' &&
+ details.previousVersion != undefined &&
+ details.previousVersion < '2.0.0'
+ ) {
+ }
+});
+
+Browser.runtime.setUninstallURL('https://webtracker.online/goodbye.html');
+
+scheduleJobs();
+initTracker();
diff --git a/src/block.html b/src/block.html
index e4c2d86..f0075ee 100644
--- a/src/block.html
+++ b/src/block.html
@@ -1,29 +1,16 @@
-
-
+
+
+
+
+
+
+ Access to the site is limited - Web Activity Time Tracker
+
-
-
- Access to the site is limited
-
-
-
-
-
+
+
+
-
-
-

-
Time limit
-
You've reached your limit today on
-
Your current daily limit is
-
-
You have already been here
- times for a total duration of
- today !
-
-
-
- Web Activity Time Tracker
-
-
-
\ No newline at end of file
+
+
+
diff --git a/src/block.ts b/src/block.ts
new file mode 100644
index 0000000..fd1c16d
--- /dev/null
+++ b/src/block.ts
@@ -0,0 +1,7 @@
+import Block from './pages/Block.vue';
+import { createApp } from 'vue';
+import i18n from './plugins/i18n';
+
+const app = createApp(Block);
+app.use(i18n);
+app.mount('body');
diff --git a/src/components/About.vue b/src/components/About.vue
new file mode 100644
index 0000000..367d0e7
--- /dev/null
+++ b/src/components/About.vue
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/components/BadgeIcons.vue b/src/components/BadgeIcons.vue
new file mode 100644
index 0000000..d9ab734
--- /dev/null
+++ b/src/components/BadgeIcons.vue
@@ -0,0 +1,54 @@
+
+
+ {{ t('document.message') }}
+ {{ t('limit.message') }}
+
+
+
+
+
+
+
+
diff --git a/src/components/ByDays.vue b/src/components/ByDays.vue
new file mode 100644
index 0000000..0c0071d
--- /dev/null
+++ b/src/components/ByDays.vue
@@ -0,0 +1,173 @@
+
+
+

+
+
+
+ {{ t('noData.message') }}
+
+
+
+ {{ t('noDataForPeriod.message') }}
+
+
+ {{ label }}
+
+
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
{{ convertSummaryTimeToString(tabsByDays!.averageTime) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/ByDaysChart.vue b/src/components/ByDaysChart.vue
new file mode 100644
index 0000000..71fcaf6
--- /dev/null
+++ b/src/components/ByDaysChart.vue
@@ -0,0 +1,104 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/DonutChart.vue b/src/components/DonutChart.vue
new file mode 100644
index 0000000..60329f5
--- /dev/null
+++ b/src/components/DonutChart.vue
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/Expander.vue b/src/components/Expander.vue
new file mode 100644
index 0000000..b66e900
--- /dev/null
+++ b/src/components/Expander.vue
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/components/Favicon.vue b/src/components/Favicon.vue
new file mode 100644
index 0000000..38132ce
--- /dev/null
+++ b/src/components/Favicon.vue
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/GeneralSettings.vue b/src/components/GeneralSettings.vue
new file mode 100644
index 0000000..12ee14a
--- /dev/null
+++ b/src/components/GeneralSettings.vue
@@ -0,0 +1,184 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ t('intervalInactivity.description') }}
+
+
+
+
{{ t('exportToCsvSetting.description') }}
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/Limits.vue b/src/components/Limits.vue
new file mode 100644
index 0000000..5a9999e
--- /dev/null
+++ b/src/components/Limits.vue
@@ -0,0 +1,34 @@
+
+
+
+
+ {{ t('limits.description') }}
+
+
+ {{ t('limitsTip.message') }}
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/ListWithTime.vue b/src/components/ListWithTime.vue
new file mode 100644
index 0000000..a9f19d9
--- /dev/null
+++ b/src/components/ListWithTime.vue
@@ -0,0 +1,171 @@
+
+
+ -
+
+

+

+ {{ limit.domain }}
+
{{ getTime(limit.time) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/Notifications.vue b/src/components/Notifications.vue
new file mode 100644
index 0000000..442300b
--- /dev/null
+++ b/src/components/Notifications.vue
@@ -0,0 +1,141 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('notificationTime.description') }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/OverallStatistics.vue b/src/components/OverallStatistics.vue
new file mode 100644
index 0000000..e968f2b
--- /dev/null
+++ b/src/components/OverallStatistics.vue
@@ -0,0 +1,192 @@
+
+
+
+
+
+
{{ data.firstDay.toLocaleDateString() }}
+
+
+
+
{{ data.activeDaysTotal }}
+
+
+
+
{{ data.daysTotal }}
+
+
+
+
+
+
{{ convertSummaryTimeToString(data.todaySummaryTime) }}
+
+
+
+
{{ convertSummaryTimeToString(data.summaryTime) }}
+
+
+
+
{{ convertSummaryTimeToString(data.averageTimeByActiveDays) }}
+
+
+
+
+
+
{{ mostActiveDay }}
+
{{ mostActiveDayTime }}
+
+
+
+
{{ mostInActiveDay }}
+
+ {{ mostInActiveDayTime }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/TabItem.vue b/src/components/TabItem.vue
new file mode 100644
index 0000000..3504f81
--- /dev/null
+++ b/src/components/TabItem.vue
@@ -0,0 +1,144 @@
+
+
+
+
+
+
+
{{ summaryTimeForTab }}
+
+
+ {{ t('cannotOpenFile.message') }}
+
+
+
{{ sessions }}
+
+
+
+
+
+
+
+
+
diff --git a/src/components/TabItemHeader.vue b/src/components/TabItemHeader.vue
new file mode 100644
index 0000000..92da4fb
--- /dev/null
+++ b/src/components/TabItemHeader.vue
@@ -0,0 +1,92 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/components/TabList.vue b/src/components/TabList.vue
new file mode 100644
index 0000000..26b7981
--- /dev/null
+++ b/src/components/TabList.vue
@@ -0,0 +1,162 @@
+
+
+

+
+
+
+ {{ t('noData.message') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/WhiteList.vue b/src/components/WhiteList.vue
new file mode 100644
index 0000000..82791b3
--- /dev/null
+++ b/src/components/WhiteList.vue
@@ -0,0 +1,95 @@
+
+
+
+
+ -
+
+

+ {{ url }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/compositions/active-tab.ts b/src/compositions/active-tab.ts
new file mode 100644
index 0000000..0196613
--- /dev/null
+++ b/src/compositions/active-tab.ts
@@ -0,0 +1,33 @@
+import { extractHostname } from './extract-hostname';
+
+export class ActiveTab {
+ private static instance: ActiveTab;
+ private _activeTabUrl: string | null;
+ private _activeTabDomain: string | null;
+
+ constructor() {
+ if (ActiveTab.instance) {
+ throw new Error('Error - use ActiveTab.getInstance()');
+ }
+ this._activeTabUrl = null;
+ this._activeTabDomain = null;
+ }
+
+ static getInstance(): ActiveTab {
+ ActiveTab.instance = ActiveTab.instance || new ActiveTab();
+ return ActiveTab.instance;
+ }
+
+ public setActiveTab(value: string | null): void {
+ this._activeTabUrl = value;
+ this._activeTabDomain = value != null ? extractHostname(value) : null;
+ }
+
+ public getActiveTabUrl(): string | null {
+ return this._activeTabUrl;
+ }
+
+ public getActiveTabDomain(): string | null {
+ return this._activeTabDomain;
+ }
+}
diff --git a/src/compositions/all-tab-list-summary.ts b/src/compositions/all-tab-list-summary.ts
new file mode 100644
index 0000000..aee301b
--- /dev/null
+++ b/src/compositions/all-tab-list-summary.ts
@@ -0,0 +1,146 @@
+import { ActiveDay, OverallStats } from '../dto/tabListSummary';
+import { Tab, TabDay } from '../entity/tab';
+import { injectTabsRepository } from '../repository/inject-tabs-repository';
+import { SortingBy } from '../utils/enums';
+import { daysBetween } from '../utils/time';
+import { todayLocalDate } from '../utils/date';
+
+export async function useAllTabListSummary(sortingBy: SortingBy): Promise {
+ const repo = await injectTabsRepository();
+ const unSortedTabs = repo.getTabs();
+ let tabs: Tab[] = [];
+
+ if (unSortedTabs.length == 0) return null;
+ const todayTabs = unSortedTabs?.filter(x => x.days.find(s => s.date === todayLocalDate()));
+
+ const summaryTimeListForToday = todayTabs.map(function (tab) {
+ return tab.days.find(day => day.date === todayLocalDate())!.summary;
+ });
+
+ const todaySummaryTime =
+ summaryTimeListForToday != undefined && summaryTimeListForToday.length > 0
+ ? summaryTimeListForToday.reduce(function (a, b) {
+ return a + b;
+ })
+ : 0;
+
+ tabs = unSortedTabs.sort(function (a: Tab, b: Tab) {
+ return b.summaryTime - a.summaryTime;
+ });
+
+ let days: TabDay[] = [];
+ tabs.map(function (tab) {
+ return tab.days.forEach(function (day) {
+ const existDay = days.find(x => x.date == day.date);
+ if (!existDay) days.push(day);
+ else {
+ existDay.summary += day.summary;
+ existDay.counter += day.counter;
+ }
+ });
+ });
+
+ days = days.sort(function (a, b) {
+ return new Date(a.date).valueOf() - new Date(b.date).valueOf();
+ });
+
+ const mostDayExceptToday = fillMostListWithoutToday(days);
+
+ const firstDay = new Date(days[0].date);
+ const activeDaysTotal = days.length;
+
+ if (sortingBy == SortingBy.Sessions)
+ tabs = unSortedTabs.sort(function (a: Tab, b: Tab) {
+ return b.counter - a.counter;
+ });
+
+ const summaryTimeList = tabs?.map(function (tab) {
+ return tab.summaryTime;
+ });
+ const siteList = tabs?.map(function (tab) {
+ return tab.url;
+ });
+ const timeForChart = summaryTimeList?.slice(0, 10);
+ const sitesForChart = siteList?.slice(0, 10);
+
+ const summaryTime =
+ summaryTimeList != undefined && summaryTimeList.length > 0
+ ? summaryTimeList.reduce(function (a, b) {
+ return a + b;
+ })
+ : 0;
+
+ const averageTimeByActiveDays = Math.round(summaryTime / activeDaysTotal);
+ const daysTotal = daysBetween(firstDay, new Date(days[days.length - 1].date));
+
+ const mostDay = fillMostList(days);
+
+ return {
+ firstDay: firstDay,
+ daysTotal: daysTotal,
+ activeDaysTotal: activeDaysTotal,
+ todaySummaryTime: todaySummaryTime,
+ averageTimeByActiveDays: averageTimeByActiveDays,
+ mostActiveDay: mostDay.mostActiveDayObj,
+ mostInactiveDay: mostDay.mostInactiveDayObj,
+ mostActiveDayExceptToday:
+ mostDayExceptToday != null ? mostDayExceptToday.mostActiveDayObjExceptToday : null,
+ mostInactiveDayExceptToday:
+ mostDayExceptToday != null ? mostDayExceptToday.mostInactiveDayObjExceptToday : null,
+ tabs: tabs,
+ summaryTime: summaryTime,
+ chart: {
+ timeForChart,
+ sitesForChart,
+ },
+ };
+}
+
+function fillMostDay(mostDat: TabDay): ActiveDay {
+ return {
+ date: new Date(mostDat.date),
+ summaryTime: mostDat.summary,
+ };
+}
+
+function fillMostListWithoutToday(days: TabDay[]) {
+ const daysWithoutToday = days
+ .filter(x => x.date != todayLocalDate())
+ .sort(function (a, b) {
+ return new Date(a.date).valueOf() - new Date(b.date).valueOf();
+ });
+
+ const sortedByTimeDaysWithoutToday = daysWithoutToday.sort(function (a, b) {
+ return a.summary - b.summary;
+ });
+
+ if (sortedByTimeDaysWithoutToday.length == 0) return null;
+ const mostActiveDayExceptToday =
+ sortedByTimeDaysWithoutToday[sortedByTimeDaysWithoutToday.length - 1];
+ const mostActiveDayObjExceptToday = fillMostDay(mostActiveDayExceptToday);
+
+ const mostInactiveDayExceptToday = sortedByTimeDaysWithoutToday[0];
+ const mostInactiveDayObjExceptToday = fillMostDay(mostInactiveDayExceptToday);
+
+ return {
+ mostActiveDayObjExceptToday,
+ mostInactiveDayObjExceptToday,
+ };
+}
+
+function fillMostList(days: TabDay[]) {
+ const sortedByTimeDays = days.sort(function (a, b) {
+ return a.summary - b.summary;
+ });
+
+ const mostActiveDay = sortedByTimeDays[sortedByTimeDays.length - 1];
+ const mostActiveDayObj = fillMostDay(mostActiveDay);
+
+ const mostInactiveDay = sortedByTimeDays[0];
+ const mostInactiveDayObj = fillMostDay(mostInactiveDay);
+
+ return {
+ mostActiveDayObj,
+ mostInactiveDayObj,
+ };
+}
diff --git a/src/compositions/black-list.ts b/src/compositions/black-list.ts
new file mode 100644
index 0000000..53fb2cb
--- /dev/null
+++ b/src/compositions/black-list.ts
@@ -0,0 +1,10 @@
+import { StorageParams } from '../storage/storage-params';
+import { isDomainEquals } from '../utils/common';
+import { extractHostname } from './extract-hostname';
+import { Settings } from './settings';
+
+export async function isInBlackList(url: string): Promise {
+ const blackList = (await Settings.getInstance().getSetting(StorageParams.BLACK_LIST)) as string[];
+ const array = Object.values(blackList);
+ return array?.find(x => isDomainEquals(extractHostname(x), extractHostname(url))) !== undefined;
+}
diff --git a/src/compositions/block-page.ts b/src/compositions/block-page.ts
new file mode 100644
index 0000000..d1ef10a
--- /dev/null
+++ b/src/compositions/block-page.ts
@@ -0,0 +1,21 @@
+import Browser from 'webextension-polyfill';
+import { buildBlockQuery } from '../utils/block-page';
+import { NO_FAVICON_URL } from '../utils/consts';
+
+export async function useBlockPage(
+ domain: string,
+ url: string,
+ liimitTime: number,
+ summaryCounter: number,
+ favIconUrl: string | undefined,
+): Promise {
+ const favicon =
+ favIconUrl == undefined || favIconUrl == '' || favIconUrl.startsWith('chrome://favicon/')
+ ? NO_FAVICON_URL
+ : favIconUrl;
+ const blockUrl =
+ Browser.runtime.getURL('src/block.html') +
+ buildBlockQuery(domain, url, liimitTime, summaryCounter, favicon);
+ const tab = await Browser.tabs.query({ currentWindow: true, active: true });
+ Browser.tabs.update(tab[0].id, { url: blockUrl });
+}
diff --git a/src/compositions/current-tab.ts b/src/compositions/current-tab.ts
new file mode 100644
index 0000000..079be59
--- /dev/null
+++ b/src/compositions/current-tab.ts
@@ -0,0 +1,8 @@
+import Browser from 'webextension-polyfill';
+
+export async function getCurrentTab() {
+ const tabs = await Browser.tabs.query({ active: true, currentWindow: true });
+ // since only one tab should be active and in the current window at once
+ // the return variable should only have one entry
+ return tabs[0];
+}
diff --git a/src/compositions/daily-intervals.ts b/src/compositions/daily-intervals.ts
new file mode 100644
index 0000000..7cf73ae
--- /dev/null
+++ b/src/compositions/daily-intervals.ts
@@ -0,0 +1,41 @@
+import { TimeInterval } from '../entity/time-interval';
+import { injecStorage } from '../storage/inject-storage';
+import { StorageDeserializeParam } from '../storage/storage-params';
+import { todayLocalDate } from '../utils/date';
+
+export async function closeInterval(domain: string | null): Promise {
+ if (domain == null) return;
+ const storage = injecStorage();
+ const timeIntervalList = (await storage.getDeserializeList(
+ StorageDeserializeParam.TIMEINTERVAL_LIST,
+ )) as TimeInterval[];
+ const item = timeIntervalList?.find(x => x.domain === domain && x.day == todayLocalDate());
+ item?.closeInterval();
+ await storage.saveIntervalList(timeIntervalList);
+}
+
+export async function addInterval(domain: string | null): Promise {
+ if (domain == null) return;
+
+ const storage = injecStorage();
+ let timeIntervalList = (await storage.getDeserializeList(
+ StorageDeserializeParam.TIMEINTERVAL_LIST,
+ )) as TimeInterval[];
+ if (timeIntervalList == undefined) timeIntervalList = [];
+ const item = timeIntervalList?.find(x => x.domain === domain && x.day == todayLocalDate());
+ if (item != undefined) {
+ if (item.day == todayLocalDate()) item.addInterval();
+ else {
+ const newInterval = new TimeInterval();
+ newInterval.init(todayLocalDate(), domain);
+ newInterval.addInterval();
+ timeIntervalList.push(newInterval);
+ }
+ } else {
+ const newInterval = new TimeInterval();
+ newInterval.init(todayLocalDate(), domain);
+ newInterval.addInterval();
+ timeIntervalList.push(newInterval);
+ }
+ await storage.saveIntervalList(timeIntervalList);
+}
diff --git a/src/compositions/deferList.ts b/src/compositions/deferList.ts
new file mode 100644
index 0000000..a6ca436
--- /dev/null
+++ b/src/compositions/deferList.ts
@@ -0,0 +1,56 @@
+import { differenceInHours } from 'date-fns';
+import { StorageParams } from '../storage/storage-params';
+import { isDomainEquals } from '../utils/common';
+import { Settings } from './settings';
+import { Deffering } from '../entity/deffering';
+import { injecStorage } from '../storage/inject-storage';
+import { MINUTE } from '../utils/time';
+import { log } from './logger';
+
+export async function isInDeferList(url: string): Promise {
+ const deferList = (await Settings.getInstance().getSetting(
+ StorageParams.BLOCK_DEFERRAL_TIME,
+ )) as Deffering[];
+ const array = Object.values(deferList);
+ const item = array?.find(x => isDomainEquals(x.domain, url));
+ if (item != undefined)
+ log(
+ `Deferring time ${url} ${new Date(item.time)} diff ${differenceInHours(
+ new Date(item.time),
+ new Date(),
+ )}`,
+ );
+ return item != undefined && item.time > Date.now();
+}
+
+export async function canDefering(url: string): Promise {
+ const deferList = (await Settings.getInstance().getSetting(
+ StorageParams.BLOCK_DEFERRAL_TIME,
+ )) as Deffering[];
+ const array = Object.values(deferList);
+ const item = array?.find(x => isDomainEquals(x.domain, url));
+ if (item != undefined)
+ log(
+ `Deferring time ${url} ${new Date(item.time)} diff ${differenceInHours(
+ new Date(item.time),
+ new Date(),
+ )}`,
+ );
+ if (item == undefined) return true;
+
+ return item != undefined && differenceInHours(new Date(item.time), new Date()) > 24;
+}
+
+export async function defering(url: string, timeInMinutes: number): Promise {
+ const settingsStorage = injecStorage();
+
+ const deferList = (await Settings.getInstance().getSetting(
+ StorageParams.BLOCK_DEFERRAL_TIME,
+ )) as Deffering[];
+ const array = Object.values(deferList);
+ const item = array?.find(x => isDomainEquals(x.domain, url));
+ if (item != undefined) item.time = Date.now() + timeInMinutes * MINUTE;
+ else array.push(new Deffering(url, 5));
+
+ await settingsStorage.saveValue(StorageParams.BLOCK_DEFERRAL_TIME, array);
+}
diff --git a/src/compositions/extract-hostname.ts b/src/compositions/extract-hostname.ts
new file mode 100644
index 0000000..b0f70f1
--- /dev/null
+++ b/src/compositions/extract-hostname.ts
@@ -0,0 +1,19 @@
+export function extractHostname(url: string | undefined): string {
+ let hostname;
+ if (url == undefined) return '';
+
+ if (url.startsWith('file:')) {
+ return url;
+ }
+
+ if (url.indexOf('//') > -1) {
+ hostname = url.split('/')[2];
+ } else {
+ hostname = url.split('/')[0];
+ }
+
+ hostname = hostname.split(':')[0];
+ hostname = hostname.split('?')[0];
+
+ return hostname;
+}
diff --git a/src/compositions/limit-list.ts b/src/compositions/limit-list.ts
new file mode 100644
index 0000000..dcced8c
--- /dev/null
+++ b/src/compositions/limit-list.ts
@@ -0,0 +1,55 @@
+import { Restriction } from '../entity/restriction';
+import { Tab } from '../entity/tab';
+import { StorageParams } from '../storage/storage-params';
+import { isDomainEquals } from '../utils/common';
+import { todayLocalDate } from '../utils/date';
+import { isInDeferList } from './deferList';
+import { log } from './logger';
+import { Settings } from './settings';
+
+export type LimitExceed = {
+ IsLimitExceeded: boolean;
+ LimitTime: number | null;
+};
+
+export async function isLimitExceeded(url: string, tab: Tab): Promise {
+ const limitList = (await Settings.getInstance().getSetting(
+ StorageParams.RESTRICTION_LIST,
+ )) as Restriction[];
+ const array = Object.values(limitList);
+ const item = array?.find(x => isDomainEquals(x.domain, url));
+ if (item != undefined) {
+ const date = tab.days.find(x => x.date == todayLocalDate());
+ if (date != undefined) {
+ if (date.summary >= item.time) {
+ log(`Limit Exceeded: website ${url} limit ${item.time} summary time ${date.summary}`);
+ if (await isInDeferList(url)) {
+ log(`Page ${url} is in deffering list`);
+ return {
+ IsLimitExceeded: false,
+ LimitTime: null,
+ };
+ }
+
+ return {
+ IsLimitExceeded: true,
+ LimitTime: item.time,
+ };
+ }
+ }
+ }
+
+ return {
+ IsLimitExceeded: false,
+ LimitTime: null,
+ };
+}
+
+export async function isDomainInLimits(url: string): Promise {
+ const limitList = (await Settings.getInstance().getSetting(
+ StorageParams.RESTRICTION_LIST,
+ )) as Restriction[];
+ const array = Object.values(limitList);
+ const item = array?.find(x => isDomainEquals(x.domain, url));
+ return item != undefined;
+}
diff --git a/src/compositions/loadFile.ts b/src/compositions/loadFile.ts
new file mode 100644
index 0000000..f1a1724
--- /dev/null
+++ b/src/compositions/loadFile.ts
@@ -0,0 +1,14 @@
+export enum FileType {
+ CSV = 'text/csv',
+}
+
+export function useFile(data: string, type: FileType, fileName: string) {
+ const file = new Blob([data], { type: type });
+ let downloadLink;
+ downloadLink = document.createElement('a');
+ downloadLink.download = fileName;
+ downloadLink.href = window.URL.createObjectURL(file);
+ downloadLink.style.display = 'none';
+ document.body.appendChild(downloadLink);
+ downloadLink.click();
+}
diff --git a/src/compositions/logger.ts b/src/compositions/logger.ts
new file mode 100644
index 0000000..ad06cd6
--- /dev/null
+++ b/src/compositions/logger.ts
@@ -0,0 +1,27 @@
+function print(logFn: typeof console.log, style: string, ...args: any[]) {
+ if (typeof args[0] === 'string') {
+ const newArgs = [...args];
+ logFn(
+ `%cWeb Activity Time Tracker%c${new Date().toLocaleTimeString()}%c ${newArgs.shift()}`,
+ style,
+ 'background-color: #eaf1fb; padding: 2px 4px; border-radius: 3px',
+ '',
+ ...newArgs,
+ );
+ } else {
+ logFn('%cWeb Activity Time Tracker', style, ...args);
+ }
+}
+
+export function log(...args: any[]) {
+ if (__DEV__)
+ print(
+ console.log,
+ 'color: white; background-color: #1e8e3e; padding: 2px 4px; border-radius: 3px; font-weight: bold',
+ ...args,
+ );
+}
+
+export const logger = {
+ log,
+};
diff --git a/src/compositions/notification-list.ts b/src/compositions/notification-list.ts
new file mode 100644
index 0000000..3dab441
--- /dev/null
+++ b/src/compositions/notification-list.ts
@@ -0,0 +1,40 @@
+import { Notifications } from '../entity/notification';
+import { Tab } from '../entity/tab';
+import { StorageParams } from '../storage/storage-params';
+import { isDomainEquals } from '../utils/common';
+import { todayLocalDate } from '../utils/date';
+import { log } from './logger';
+import { Settings } from './settings';
+
+export type LimitExceed = {
+ IsLimitExceeded: boolean;
+ LimitTime: number | null;
+};
+
+export async function isNeedToShowNotification(url: string, tab: Tab): Promise {
+ const notificationList = (await Settings.getInstance().getSetting(
+ StorageParams.NOTIFICATION_LIST,
+ )) as Notifications[];
+ const array = Object.values(notificationList);
+ const item = array?.find(x => isDomainEquals(x.domain, url));
+ if (item != undefined) {
+ const date = tab.days.find(x => x.date == todayLocalDate());
+ if (date != undefined) {
+ if (date.summary != 0 && (date.summary == item.time || date.summary % item.time == 0)) {
+ log(`Time for notification: website ${url} time ${item.time} summary time ${date.summary}`);
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+export async function isDomainInNotificationsLimit(url: string): Promise {
+ const notificationList = (await Settings.getInstance().getSetting(
+ StorageParams.NOTIFICATION_LIST,
+ )) as Notifications[];
+ const array = Object.values(notificationList);
+ const item = array?.find(x => isDomainEquals(x.domain, url));
+ return item != undefined;
+}
diff --git a/src/compositions/set-badge.ts b/src/compositions/set-badge.ts
new file mode 100644
index 0000000..4662815
--- /dev/null
+++ b/src/compositions/set-badge.ts
@@ -0,0 +1,22 @@
+import Browser from 'webextension-polyfill';
+
+export interface BadgeState {
+ color: BadgeColor;
+ tabId: number;
+ text: string;
+}
+
+export enum BadgeColor {
+ red = '#fdb8b8',
+ green = '#6ec05e',
+ blue = '#1a73e8',
+ none = '#000',
+}
+
+export function useBadge(badge: BadgeState): void {
+ Browser.action.setBadgeBackgroundColor({ color: badge.color });
+ Browser.action.setBadgeText({
+ tabId: badge.tabId,
+ text: badge.text,
+ });
+}
diff --git a/src/compositions/settings.ts b/src/compositions/settings.ts
new file mode 100644
index 0000000..70ba99c
--- /dev/null
+++ b/src/compositions/settings.ts
@@ -0,0 +1,34 @@
+import { injecStorage } from '../storage/inject-storage';
+import { StorageParams, getDefaultValue } from '../storage/storage-params';
+
+export class Settings {
+ private static instance: Settings;
+ private _settings = new Map();
+
+ constructor() {
+ if (Settings.instance) {
+ throw new Error('Error - use Settings.getInstance()');
+ }
+ }
+
+ static getInstance(): Settings {
+ Settings.instance = Settings.instance || new Settings();
+ return Settings.instance;
+ }
+
+ async getSetting(param: StorageParams) {
+ if (this._settings.has(param)) return this._settings.get(param);
+ else return await this.getValue(param);
+ }
+
+ async reloadSetting(param: StorageParams) {
+ await this.getValue(param);
+ }
+
+ private async getValue(param: StorageParams) {
+ const storage = injecStorage();
+ const value = await storage.getValue(param, getDefaultValue(param));
+ this._settings.set(param, value);
+ return value;
+ }
+}
diff --git a/src/compositions/show-notification.ts b/src/compositions/show-notification.ts
new file mode 100644
index 0000000..c6a3e48
--- /dev/null
+++ b/src/compositions/show-notification.ts
@@ -0,0 +1,23 @@
+import Browser from 'webextension-polyfill';
+import { SECOND } from '../utils/time';
+
+export enum NotificationType {
+ DailySummaryNotification = 'daily-summary-notification',
+ WebSiteNotification = 'website-notification',
+}
+
+export async function showNotification(
+ notificationType: NotificationType,
+ title: string,
+ message: string,
+): Promise {
+ await Browser.notifications.clear(notificationType);
+ await new Promise(res => setTimeout(res, 3 * SECOND));
+ return Browser.notifications.create(notificationType, {
+ type: 'basic',
+ title: title,
+ message: message,
+ iconUrl: Browser.runtime.getURL('128x128.png'),
+ isClickable: false,
+ });
+}
diff --git a/src/compositions/summary-data-today.ts b/src/compositions/summary-data-today.ts
new file mode 100644
index 0000000..9088842
--- /dev/null
+++ b/src/compositions/summary-data-today.ts
@@ -0,0 +1,63 @@
+import { Tab } from '../entity/tab';
+import { injectTabsRepository } from '../repository/inject-tabs-repository';
+import { todayLocalDate } from '../utils/date';
+import { DaySummary } from '../dto/daySummary';
+import { startOfYesterday } from 'date-fns';
+import { getPercentage } from '../utils/common';
+import { ITabsRepository } from '../repository/tabs-repository-interface';
+
+export async function useWebUsageSummaryForDay(): Promise {
+ const repo = await injectTabsRepository();
+
+ const unSortedTabs = repo.getTabs();
+ if (unSortedTabs.length == 0) return null;
+
+ const dataToday = getData(todayLocalDate(), repo);
+ const dataYesterday = getData(startOfYesterday().toLocaleDateString('en-US'), repo);
+
+ return {
+ time: dataToday?.time,
+ mostVisitedSite: dataToday?.mostVisitedSite,
+ mostVisitedSiteTime: dataToday?.mostVisitedSiteTime,
+ timeYesterDay: dataYesterday?.time,
+ percentageFromYesterday:
+ dataToday == null
+ ? '0%'
+ : dataYesterday == null
+ ? '100%'
+ : `${getPercentage(dataToday.time, dataYesterday.time)}%`,
+ };
+}
+
+function getData(date: string, repo: ITabsRepository) {
+ const unSortedTabs = repo.getTabs();
+ if (unSortedTabs.length == 0) return null;
+
+ const targetTabs = unSortedTabs.filter(x => x.days.find(s => s.date === date));
+ if (targetTabs.length == 0) return null;
+
+ const tabs = targetTabs.sort(function (a: Tab, b: Tab) {
+ return b.days.find(s => s.date === date)!.summary - a.days.find(s => s.date === date)!.summary;
+ });
+
+ const summaryTimeList = tabs?.map(function (tab) {
+ return tab.days.find(day => day.date === date)!.summary;
+ });
+
+ const summaryTime =
+ summaryTimeList != undefined && summaryTimeList.length > 0
+ ? summaryTimeList.reduce(function (a, b) {
+ return a + b;
+ })
+ : 0;
+
+ const mostVisitedTab = tabs[0];
+ const mostVisitedSite = mostVisitedTab.url;
+ const mostVisitedSiteTime = mostVisitedTab.days.find(s => s.date === date)?.summary!;
+
+ return {
+ time: summaryTime,
+ mostVisitedSite: mostVisitedSite,
+ mostVisitedSiteTime: mostVisitedSiteTime,
+ };
+}
diff --git a/src/compositions/tab-list-by-days.ts b/src/compositions/tab-list-by-days.ts
new file mode 100644
index 0000000..e755c76
--- /dev/null
+++ b/src/compositions/tab-list-by-days.ts
@@ -0,0 +1,87 @@
+import { CurrentTabItem } from '../dto/currentTabItem';
+import { DayTabs, TabListByDays } from '../dto/tabListSummary';
+import { injectTabsRepository } from '../repository/inject-tabs-repository';
+import { isSameDay } from 'date-fns';
+
+export async function useTabListByDays(
+ dateFrom: Date,
+ dateTo: Date,
+): Promise {
+ const repo = await injectTabsRepository();
+ const unSortedTabs = repo.getTabs();
+ let daysTabs: DayTabs[] = [];
+
+ if (unSortedTabs.length == 0) return null;
+
+ const isTheSameDay = isSameDay(dateFrom, dateTo);
+
+ const unSortedTabsByDays = unSortedTabs.filter(x =>
+ isTheSameDay
+ ? x.days.find(s => isSameDay(new Date(s.date), dateFrom)) != undefined
+ : x.days.find(s => new Date(s.date) >= dateFrom && new Date(s.date) <= dateTo) != undefined,
+ );
+
+ if (unSortedTabsByDays.length == 0)
+ return {
+ days: [],
+ averageTime: 0,
+ summaryTime: 0,
+ };
+
+ unSortedTabsByDays.forEach(tab => {
+ tab.days.forEach(day => {
+ if (
+ (new Date(day.date) >= dateFrom && new Date(day.date) <= dateTo) ||
+ (isTheSameDay && isSameDay(new Date(day.date), dateFrom))
+ ) {
+ let dayTab = daysTabs.find(x => x.day == day.date);
+ if (dayTab == undefined) {
+ dayTab = {
+ day: day.date,
+ tabs: [],
+ time: day.summary,
+ };
+ dayTab.tabs.push({
+ favicon: tab.favicon,
+ url: tab.url,
+ sessions: day.counter,
+ summaryTime: day.summary,
+ });
+ daysTabs.push(dayTab);
+ } else {
+ dayTab.time += day.summary;
+ dayTab.tabs.push({
+ favicon: tab.favicon,
+ url: tab.url,
+ sessions: day.counter,
+ summaryTime: day.summary,
+ });
+ }
+ }
+ });
+ });
+
+ daysTabs.sort(function (a, b) {
+ return new Date(a.day).valueOf() - new Date(b.day).valueOf();
+ });
+
+ daysTabs.forEach(dayTab => {
+ dayTab.tabs.sort(function (a: CurrentTabItem, b: CurrentTabItem) {
+ return b.summaryTime - a.summaryTime;
+ });
+ });
+
+ const summaryTime = daysTabs
+ .map(x => x.time)
+ .reduce(function (a, b) {
+ return a + b;
+ });
+
+ const averageTime = Math.round(summaryTime / daysTabs.length);
+
+ return {
+ days: daysTabs,
+ summaryTime: summaryTime,
+ averageTime: averageTime,
+ };
+}
diff --git a/src/compositions/toCsv.ts b/src/compositions/toCsv.ts
new file mode 100644
index 0000000..edd4b79
--- /dev/null
+++ b/src/compositions/toCsv.ts
@@ -0,0 +1,35 @@
+import { DayTabs } from '../dto/tabListSummary';
+import { useTabListByDays } from './tab-list-by-days';
+
+const CSV_HEADER = 'Date,WebSite,Time(sec),Sessions\r\n';
+
+export async function useImportToCsvWithData(days: DayTabs[] | undefined): Promise {
+ return getCsv(days);
+}
+
+export async function useImportToCsv(dateFrom: Date, dateTo: Date): Promise {
+ const summary = await useTabListByDays(dateFrom, dateTo);
+ if (summary == null) return CSV_HEADER;
+
+ return getCsv(summary.days);
+}
+
+function getCsv(days: DayTabs[] | undefined) {
+ let str = CSV_HEADER;
+
+ if (days != undefined && days.length > 0) {
+ days.forEach(day => {
+ let newLine = '';
+ day.tabs.forEach(tab => {
+ newLine += day.day + ',';
+ newLine += tab.url + ',';
+ newLine += tab.summaryTime + ',';
+ newLine += tab.sessions;
+ newLine += '\r\n';
+ });
+ str += newLine + '\r\n';
+ });
+ }
+
+ return str;
+}
diff --git a/src/compositions/today-tab-list-summary.ts b/src/compositions/today-tab-list-summary.ts
new file mode 100644
index 0000000..fcd6afd
--- /dev/null
+++ b/src/compositions/today-tab-list-summary.ts
@@ -0,0 +1,47 @@
+import { TabListSummary } from '../dto/tabListSummary';
+import { Tab } from '../entity/tab';
+import { injectTabsRepository } from '../repository/inject-tabs-repository';
+import { SortingBy } from '../utils/enums';
+import { todayLocalDate } from '../utils/date';
+
+export async function useTodayTabListSummary(sortingBy: SortingBy): Promise {
+ const repo = await injectTabsRepository();
+ const unSortedTabs = repo.getTodayTabs();
+ let tabs: Tab[] = [];
+
+ if (unSortedTabs.length == 0) return null;
+
+ tabs = unSortedTabs.sort(function (a: Tab, b: Tab) {
+ return sortingBy == SortingBy.UsageTime
+ ? b.days.find(s => s.date === todayLocalDate())!.summary -
+ a.days.find(s => s.date === todayLocalDate())!.summary
+ : b.days.find(s => s.date === todayLocalDate())!.counter -
+ a.days.find(s => s.date === todayLocalDate())!.counter;
+ });
+
+ const summaryTimeList = tabs?.map(function (tab) {
+ return tab.days.find(day => day.date === todayLocalDate())!.summary;
+ });
+
+ const siteList = tabs?.map(function (tab) {
+ return tab.url;
+ });
+
+ const timeForChart = summaryTimeList?.slice(0, 10);
+ const sitesForChart = siteList?.slice(0, 10);
+
+ const summaryTime =
+ summaryTimeList != undefined && summaryTimeList.length > 0
+ ? summaryTimeList.reduce(function (a, b) {
+ return a + b;
+ })
+ : 0;
+ return {
+ tabs,
+ summaryTime,
+ chart: {
+ timeForChart,
+ sitesForChart,
+ },
+ };
+}
diff --git a/src/compositions/valid-page.ts b/src/compositions/valid-page.ts
new file mode 100644
index 0000000..33bc85f
--- /dev/null
+++ b/src/compositions/valid-page.ts
@@ -0,0 +1,15 @@
+import Browser from 'webextension-polyfill';
+
+export function isValidPage(tab: Browser.Tabs.Tab | undefined): boolean {
+ if (tab == null || tab == undefined || !tab.url || !tab.id) return false;
+
+ if (
+ (!tab.url.startsWith('http:') &&
+ !tab.url.startsWith('https:') &&
+ !tab.url.startsWith('file:')) ||
+ tab.url.startsWith('chrome://') ||
+ tab.url.startsWith('chrome-extension://')
+ )
+ return false;
+ return true;
+}
diff --git a/src/dashboard.html b/src/dashboard.html
new file mode 100644
index 0000000..e62fae6
--- /dev/null
+++ b/src/dashboard.html
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+ Web Activity Time Tracker - Dashboard
+
+
+
+
+
+
+
+
+
diff --git a/src/dashboard.ts b/src/dashboard.ts
new file mode 100644
index 0000000..1d55780
--- /dev/null
+++ b/src/dashboard.ts
@@ -0,0 +1,12 @@
+import Settings from './pages/Dashboard.vue';
+import Notifications from '@kyvg/vue3-notification';
+import VueDatePicker from '@vuepic/vue-datepicker';
+import '@vuepic/vue-datepicker/dist/main.css';
+import { createApp } from 'vue';
+import i18n from './plugins/i18n';
+
+const app = createApp(Settings);
+app.use(Notifications);
+app.use(i18n);
+app.component('VueDatePicker', VueDatePicker);
+app.mount('body');
diff --git a/src/dto/currentTabItem.ts b/src/dto/currentTabItem.ts
new file mode 100644
index 0000000..eeed770
--- /dev/null
+++ b/src/dto/currentTabItem.ts
@@ -0,0 +1,6 @@
+export interface CurrentTabItem {
+ url: string;
+ favicon: string | undefined;
+ summaryTime: number;
+ sessions: number;
+}
diff --git a/src/dto/daySummary.ts b/src/dto/daySummary.ts
new file mode 100644
index 0000000..29c136e
--- /dev/null
+++ b/src/dto/daySummary.ts
@@ -0,0 +1,7 @@
+export type DaySummary = {
+ time: number | undefined;
+ timeYesterDay: number | undefined;
+ percentageFromYesterday: string | undefined;
+ mostVisitedSite: string | undefined;
+ mostVisitedSiteTime: number | undefined;
+};
diff --git a/src/dto/tabListSummary.ts b/src/dto/tabListSummary.ts
new file mode 100644
index 0000000..f68266b
--- /dev/null
+++ b/src/dto/tabListSummary.ts
@@ -0,0 +1,42 @@
+import { Tab } from '../entity/tab';
+import { CurrentTabItem } from './currentTabItem';
+
+export interface OverallStats extends TabListSummary {
+ firstDay: Date;
+ activeDaysTotal: number;
+ daysTotal: number;
+ todaySummaryTime: number;
+ averageTimeByActiveDays: number;
+ mostActiveDay: ActiveDay;
+ mostInactiveDay: ActiveDay;
+ mostActiveDayExceptToday: ActiveDay | null;
+ mostInactiveDayExceptToday: ActiveDay | null;
+}
+
+export interface ActiveDay {
+ date: Date;
+ summaryTime: number;
+}
+
+export interface TabListSummary {
+ tabs: Tab[];
+ summaryTime: number;
+ chart: DataForChart;
+}
+
+export interface DataForChart {
+ timeForChart: number[];
+ sitesForChart: string[];
+}
+
+export interface TabListByDays {
+ days: DayTabs[];
+ averageTime: number;
+ summaryTime: number;
+}
+
+export interface DayTabs {
+ day: string;
+ tabs: CurrentTabItem[];
+ time: number;
+}
diff --git a/src/entity/baseTimeList.ts b/src/entity/baseTimeList.ts
new file mode 100644
index 0000000..42dfe28
--- /dev/null
+++ b/src/entity/baseTimeList.ts
@@ -0,0 +1,4 @@
+export interface BaseTimeList {
+ domain: string;
+ time: number;
+}
diff --git a/src/entity/deffering.ts b/src/entity/deffering.ts
new file mode 100644
index 0000000..0e58c8e
--- /dev/null
+++ b/src/entity/deffering.ts
@@ -0,0 +1,12 @@
+import { MINUTE } from '../utils/time';
+import { BaseTimeList } from './baseTimeList';
+
+export class Deffering implements BaseTimeList {
+ domain: string;
+ time: number;
+
+ constructor(domain: string, minutes: number) {
+ this.domain = domain;
+ this.time = Date.now() + minutes * MINUTE;
+ }
+}
diff --git a/src/entity/notification.ts b/src/entity/notification.ts
new file mode 100644
index 0000000..c3ab1d2
--- /dev/null
+++ b/src/entity/notification.ts
@@ -0,0 +1,12 @@
+import { convertHHMMToSeconds } from '../utils/converter';
+import { BaseTimeList } from './baseTimeList';
+
+export class Notifications implements BaseTimeList {
+ domain: string;
+ time: number;
+
+ constructor(domain: string, hours: number, minutes: number) {
+ this.domain = domain;
+ this.time = convertHHMMToSeconds(hours, minutes);
+ }
+}
diff --git a/src/entity/restriction.ts b/src/entity/restriction.ts
new file mode 100644
index 0000000..7fe84ae
--- /dev/null
+++ b/src/entity/restriction.ts
@@ -0,0 +1,11 @@
+import { convertHHMMToSeconds } from '../utils/converter';
+
+export class Restriction {
+ domain: string;
+ time: number;
+
+ constructor(domain: string, hours: number, minutes: number) {
+ this.domain = domain;
+ this.time = convertHHMMToSeconds(hours, minutes);
+ }
+}
diff --git a/src/entity/tab.ts b/src/entity/tab.ts
new file mode 100644
index 0000000..9a2ea79
--- /dev/null
+++ b/src/entity/tab.ts
@@ -0,0 +1,81 @@
+import { todayLocalDate } from '../utils/date';
+import { logger } from '../compositions/logger';
+
+export class Tab implements ISerializable {
+ url: string = '';
+ favicon: string | undefined = '';
+ summaryTime: number = 0;
+ counter: number = 0;
+ days: TabDay[] = [];
+
+ init(url: string) {
+ this.url = url;
+ }
+
+ incSummaryTime(): void {
+ this.summaryTime += 1;
+
+ const day = this.days.find(x => x.date == todayLocalDate());
+ if (day === undefined) {
+ const newTab = this.addNewDay();
+ newTab.incSummaryTime();
+ } else day.incSummaryTime();
+ }
+
+ incCounter(): void {
+ this.counter += 1;
+ if (__DEV__) logger.log(`Counter ${this.url} - ${this.counter}`);
+ const day = this.days.find(x => x.date == todayLocalDate());
+ if (day === undefined) {
+ const newTab = this.addNewDay();
+ newTab.incCounter();
+ } else day.incCounter();
+ }
+
+ addNewDay(): TabDay {
+ const newTabDay = new TabDay();
+ newTabDay.init(todayLocalDate());
+ this.days.push(newTabDay);
+ return newTabDay;
+ }
+
+ deserialize(input: Tab) {
+ this.url = input.url;
+ this.counter = input.counter;
+ this.favicon = input.favicon;
+ this.summaryTime = input.summaryTime;
+ if (input.days?.length > 0) this.days = input.days.map(x => new TabDay().deserialize(x));
+
+ return this;
+ }
+
+ setFavicon(favicon: string | undefined) {
+ this.favicon = favicon;
+ }
+}
+
+export class TabDay implements ISerializable {
+ counter: number = 0;
+ date: string = '';
+ summary: number = 0;
+
+ init(date: string) {
+ this.date = date;
+ }
+
+ incSummaryTime(): void {
+ this.summary += 1;
+ }
+
+ incCounter(): void {
+ this.counter += 1;
+ }
+
+ deserialize(input: TabDay): TabDay {
+ this.counter = input.counter;
+ this.date = input.date;
+ this.summary = input.summary;
+
+ return this;
+ }
+}
diff --git a/src/entity/time-interval.ts b/src/entity/time-interval.ts
new file mode 100644
index 0000000..9a1da38
--- /dev/null
+++ b/src/entity/time-interval.ts
@@ -0,0 +1,46 @@
+import { logger } from '../compositions/logger';
+
+export class TimeInterval implements ISerializable {
+ domain: string = '';
+ intervals: string[] = [];
+ day: string = '';
+
+ init(day: string, domain: string) {
+ this.domain = domain;
+ this.intervals = [];
+ this.day = day;
+ }
+
+ addInterval() {
+ const stringDate = this.getCurrentStringDate();
+ this.intervals.push(stringDate + '-' + stringDate);
+ logger.log(`Add interval ${this.domain} - ${stringDate} - ${stringDate}`);
+ }
+
+ closeInterval() {
+ const stringDate = this.getCurrentStringDate();
+ const currentInterval = this.intervals[this.intervals.length - 1];
+ if (currentInterval != null) {
+ if (currentInterval.split('-')[0] == currentInterval.split('-')[1]) {
+ this.intervals.pop();
+ this.intervals.push(currentInterval.split('-')[0] + '-' + stringDate);
+ logger.log(
+ `Close interval ${this.domain} - ${currentInterval.split('-')[0]} - ${stringDate}`,
+ );
+ }
+ }
+ }
+
+ deserialize(input: TimeInterval): TimeInterval {
+ this.domain = input.domain;
+ this.day = input.day;
+ this.intervals = input.intervals;
+
+ return this;
+ }
+
+ private getCurrentStringDate(): string {
+ const date = new Date();
+ return date.getHours() + ':' + date.getMinutes() + ':' + date.getSeconds();
+ }
+}
diff --git a/src/globals.d.ts b/src/globals.d.ts
new file mode 100644
index 0000000..66fb358
--- /dev/null
+++ b/src/globals.d.ts
@@ -0,0 +1,6 @@
+// Global vars
+declare var __EXTENSION_MODE__: ExtensionMode;
+declare var __DEV__: boolean;
+declare var __PROD__: boolean;
+declare var __EXTENSION_VERSION__: string;
+declare var __REAL_APP_ID__: string;
diff --git a/src/icons/bmc-new-btn-logo.svg b/src/icons/bmc-new-btn-logo.svg
deleted file mode 100644
index d7b9b32..0000000
--- a/src/icons/bmc-new-btn-logo.svg
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
\ No newline at end of file
diff --git a/src/icons/delete.png b/src/icons/delete.png
deleted file mode 100644
index d5160c2..0000000
Binary files a/src/icons/delete.png and /dev/null differ
diff --git a/src/icons/edit.png b/src/icons/edit.png
deleted file mode 100644
index e80f09d..0000000
Binary files a/src/icons/edit.png and /dev/null differ
diff --git a/src/icons/eye.png b/src/icons/eye.png
deleted file mode 100644
index 0a358a7..0000000
Binary files a/src/icons/eye.png and /dev/null differ
diff --git a/src/icons/heat-map-16.png b/src/icons/heat-map-16.png
deleted file mode 100644
index 60afb64..0000000
Binary files a/src/icons/heat-map-16.png and /dev/null differ
diff --git a/src/icons/information.svg b/src/icons/information.svg
deleted file mode 100644
index 0bd40ae..0000000
--- a/src/icons/information.svg
+++ /dev/null
@@ -1,44 +0,0 @@
-
-
-
diff --git a/src/icons/limit.png b/src/icons/limit.png
deleted file mode 100644
index b42bb6c..0000000
Binary files a/src/icons/limit.png and /dev/null differ
diff --git a/src/icons/no-today.svg b/src/icons/no-today.svg
deleted file mode 100644
index 94a6ac5..0000000
--- a/src/icons/no-today.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/icons/pie-chart.png b/src/icons/pie-chart.png
deleted file mode 100644
index fa2f378..0000000
Binary files a/src/icons/pie-chart.png and /dev/null differ
diff --git a/src/icons/preloader.svg b/src/icons/preloader.svg
deleted file mode 100644
index cdd962e..0000000
--- a/src/icons/preloader.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/icons/time.svg b/src/icons/time.svg
deleted file mode 100644
index c4f9923..0000000
--- a/src/icons/time.svg
+++ /dev/null
@@ -1,44 +0,0 @@
-
-
-
diff --git a/src/index.html b/src/index.html
index fcfc431..3688b51 100644
--- a/src/index.html
+++ b/src/index.html
@@ -1,117 +1,140 @@
-
+
-
-
-
+
+
Web Activity Time Tracker
-
+
-
+
+
-
Web Activity Time Tracker
+
Web Activity Time Tracker
-
-
-
-
-
-
-
-
Average by active days
-
-
+
+
+
+
+
+
+
+
Average by active days
+
+
+
+
-
+
-
-
-
+
@@ -119,4 +142,4 @@
-
\ No newline at end of file
+
diff --git a/src/jobs/daily-summary-notification.ts b/src/jobs/daily-summary-notification.ts
new file mode 100644
index 0000000..1968b03
--- /dev/null
+++ b/src/jobs/daily-summary-notification.ts
@@ -0,0 +1,31 @@
+import { useWebUsageSummaryForDay } from '../compositions/summary-data-today';
+import { convertLimitTimeToString } from '../utils/converter';
+import { Settings } from '../compositions/settings';
+import { StorageParams } from '../storage/storage-params';
+import { NotificationType, showNotification } from '../compositions/show-notification';
+import { getMessagesFromLocale } from '../plugins/i18n';
+
+export async function dailySummaryNotification() {
+ const showDailyNotifacation = (await Settings.getInstance().getSetting(
+ StorageParams.DAILY_NOTIFICATION,
+ )) as boolean;
+
+ if (showDailyNotifacation) {
+ const data = await useWebUsageSummaryForDay();
+ if (data == null) return;
+
+ const title = `${
+ getMessagesFromLocale()['todayUsageTime']['message']
+ }${convertLimitTimeToString(data.time!)}`;
+ const message = [
+ `${data?.percentageFromYesterday}${
+ getMessagesFromLocale()['comparedToYesterday']['message']
+ }`,
+ `${data.mostVisitedSite} ${
+ getMessagesFromLocale()['mostVisited']['message']
+ }${convertLimitTimeToString(data.mostVisitedSiteTime!)}`,
+ ].join('\n');
+
+ return await showNotification(NotificationType.DailySummaryNotification, title, message);
+ }
+}
diff --git a/src/jobs/remove-time-intervals.ts b/src/jobs/remove-time-intervals.ts
new file mode 100644
index 0000000..ef86498
--- /dev/null
+++ b/src/jobs/remove-time-intervals.ts
@@ -0,0 +1,23 @@
+import { StorageDeserializeParam } from '../storage/storage-params';
+import { injecStorage } from '../storage/inject-storage';
+import { TimeInterval } from '../entity/time-interval';
+import { todayLocalDate } from '../utils/date';
+
+export async function removeOldTimeIntervals() {
+ const storage = injecStorage();
+ let timeIntervalList = (await storage.getDeserializeList(
+ StorageDeserializeParam.TIMEINTERVAL_LIST,
+ )) as TimeInterval[];
+ if (timeIntervalList == undefined) timeIntervalList = [];
+ const arrayToRemove: number[] = [];
+ timeIntervalList.forEach(interval => {
+ if (new Date(interval.day) < new Date(todayLocalDate()))
+ arrayToRemove.push(timeIntervalList.indexOf(interval));
+ });
+
+ arrayToRemove.forEach(index => {
+ if (index > -1) timeIntervalList.splice(index, 1);
+ });
+
+ await storage.saveIntervalList(timeIntervalList);
+}
diff --git a/src/jobs/sheduler.ts b/src/jobs/sheduler.ts
new file mode 100644
index 0000000..59904fd
--- /dev/null
+++ b/src/jobs/sheduler.ts
@@ -0,0 +1,71 @@
+import Browser, { Alarms } from 'webextension-polyfill';
+import { log } from '../compositions/logger';
+import { StorageParams } from '../storage/storage-params';
+import { DAY_MINUTES, SECOND, getNextTimeOfDay } from '../utils/time';
+import { Settings } from '../compositions/settings';
+import { dailySummaryNotification } from './daily-summary-notification';
+import { removeOldTimeIntervals } from './remove-time-intervals';
+import { startOfTomorrow } from 'date-fns';
+import { Messages } from '../utils/messages';
+
+export enum JobId {
+ DailySummaryNotification = '@alarm/daily-summary-notification',
+ RemoveOldTimeIntervals = '@alarm/remove-old-time-intervals',
+}
+
+export function scheduleJobs(): void {
+ Browser.alarms.onAlarm.addListener(async alarm => {
+ log(`[schedule-jobs] Alarm ${alarm.name} triggered`, alarm);
+ switch (alarm.name) {
+ case JobId.DailySummaryNotification: {
+ await dailySummaryNotification();
+ break;
+ }
+ case JobId.RemoveOldTimeIntervals: {
+ await removeOldTimeIntervals();
+ break;
+ }
+ }
+ log(`[schedule-jobs] ${alarm.name} finished`);
+ });
+
+ Browser.runtime.onMessage.addListener(message => {
+ if (message == Messages.RescheduleJobs) rescheduleJobs();
+ });
+
+ rescheduleJobs();
+}
+
+async function rescheduleJobs(): Promise
{
+ log('Reschedule jobs');
+ const dailySummaryNotificationTime = (await Settings.getInstance().getSetting(
+ StorageParams.DAILY_SUMMARY_NOTIFICATION_TIME,
+ )) as number;
+ await Browser.alarms.clear(JobId.DailySummaryNotification);
+ const nextTime = getNextTimeOfDay(dailySummaryNotificationTime * SECOND);
+ log(`[schedule-jobs] ${JobId.DailySummaryNotification} start time ${new Date(nextTime)}`);
+ Browser.alarms.create(JobId.DailySummaryNotification, {
+ when: nextTime,
+ periodInMinutes: DAY_MINUTES,
+ });
+
+ await createAlarmIfMissing(JobId.RemoveOldTimeIntervals, {
+ when: startOfTomorrow().getTime(),
+ periodInMinutes: DAY_MINUTES,
+ });
+}
+
+async function createAlarmIfMissing(
+ name: string,
+ alarmInfo: Alarms.CreateAlarmInfoType,
+): Promise {
+ const existing = await Browser.alarms.get(name).catch(() => undefined);
+ if (existing == null) {
+ log(
+ `[schedule-jobs] ${name} start time ${
+ alarmInfo.when != undefined ? new Date(alarmInfo.when) : null
+ }`,
+ );
+ Browser.alarms.create(name, alarmInfo);
+ }
+}
diff --git a/src/manifest.json b/src/manifest.json
index 585195d..fd0a524 100644
--- a/src/manifest.json
+++ b/src/manifest.json
@@ -1,50 +1,32 @@
{
- "manifest_version": 2,
-
- "name": "Web Activity Time Tracker",
- "short_name": "Web Time Tracker",
- "version": "1.7.2",
- "minimum_chrome_version": "26",
-
- "description": "Track and limit time your activity in the browser every day.",
-
- "options_page": "options.html",
-
- "icons": {
- "16": "icons/16x16.png",
- "32": "icons/32x32.png",
- "48": "icons/48x48.png",
- "128": "icons/128x128.png"
- },
- "permissions": [
- "tabs",
- "activeTab",
- "storage",
- "idle",
- "chrome://favicon/*",
- "webNavigation",
- "unlimitedStorage",
- "alarms"
- ],
- "optional_permissions": [
- "https://www.youtube.com/*",
- "https://www.netflix.com/*",
- "notifications"
- ],
- "offline_enabled": true,
- "background": {
- "scripts": ["scripts/common.js",
- "scripts/storage.js",
- "scripts/activity.js",
- "scripts/tab.js",
- "scripts/timeInterval.js",
- "scripts/background.js",
- "scripts/restriction.js"],
- "persistent": false
- },
- "browser_action": {
- "default_popup": "index.html",
- "default_title": "Web Activity Time Tracker",
- "default_icon": "icons/48x48.png"
- }
-}
\ No newline at end of file
+ "manifest_version": 3,
+ "name": "__MSG_extName__",
+ "short_name": "Web Tracker",
+ "version": "2.0.0",
+ "description": "__MSG_extDescription__",
+ "options_page": "src/dashboard.html",
+ "default_locale": "en",
+ "icons": {
+ "16": "16x16.png",
+ "32": "32x32.png",
+ "48": "48x48.png",
+ "128": "128x128.png"
+ },
+ "permissions": [
+ "tabs",
+ "activeTab",
+ "storage",
+ "idle",
+ "unlimitedStorage",
+ "alarms",
+ "notifications"
+ ],
+ "offline_enabled": true,
+ "background": {
+ "service_worker": "src/background.ts"
+ },
+ "action": {
+ "default_popup": "src/popup.html",
+ "default_title": "Web Activity Time Tracker"
+ }
+}
diff --git a/src/options.html b/src/options.html
deleted file mode 100644
index 2a29a13..0000000
--- a/src/options.html
+++ /dev/null
@@ -1,270 +0,0 @@
-
-
-
-
-
- Web Activity Time Tracker
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- The site is already in the list
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Backup completed successfully
-
-
- Restore completed successfully
-
-
- Backup file is not valid
-
-
- Please select hour and minute
-
-
- Saved!
-
-
-
-
-
-
-
-
-
-
-

-
-
-
-
-
-
-
-
-

-
-
-
-
-
-
-
-
-
- Data successfully deleted
-
-
-
-
-
-
-
-
-
- The site is already in the list
-
-
-
-
-
-
-
-
-
-
-

-
- Web Activity Time Tracker
-
-
-
-
-
-
-
-
-

-
-
-
-
- The site is already in the notify list
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/pages/Block.vue b/src/pages/Block.vue
new file mode 100644
index 0000000..80a498c
--- /dev/null
+++ b/src/pages/Block.vue
@@ -0,0 +1,148 @@
+
+
+
+
+ {{ t('block.message') }}
+
+
+
![]()
+
{{ webSite }}
+
+
+
+ | {{ t('limit.message') }}: |
+ {{ limitTimeString }} |
+
+
+ | {{ t('sessions.message') }}: |
+ {{ summaryCounter }} |
+
+
+
+
{{ t('deferringDescription.message') }}
+
+
+
+
+
+
diff --git a/src/pages/Dashboard.vue b/src/pages/Dashboard.vue
new file mode 100644
index 0000000..cdf2053
--- /dev/null
+++ b/src/pages/Dashboard.vue
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/Popup.vue b/src/pages/Popup.vue
new file mode 100644
index 0000000..77df4c6
--- /dev/null
+++ b/src/pages/Popup.vue
@@ -0,0 +1,136 @@
+
+
+
+
+
+
+
+
diff --git a/src/plugins/i18n.ts b/src/plugins/i18n.ts
new file mode 100644
index 0000000..b718732
--- /dev/null
+++ b/src/plugins/i18n.ts
@@ -0,0 +1,29 @@
+import { createI18n } from 'vue-i18n';
+import Browser from 'webextension-polyfill';
+import en from '../_locales/en/messages.json';
+import ru from '../_locales/ru/messages.json';
+import de from '../_locales/de/messages.json';
+
+const locales = {
+ en,
+ ru,
+ de,
+};
+
+export type Languages = keyof typeof locales;
+
+const i18n = createI18n({
+ legacy: false,
+ locale: Browser.i18n.getUILanguage(),
+ fallbackLocale: 'en',
+ globalInjection: true,
+ messages: locales,
+});
+
+export default i18n;
+
+export function getMessagesFromLocale() {
+ let locale = i18n.global.locale.value;
+ if (Object.keys(locales).indexOf(locale) == -1) locale = 'en';
+ return i18n.global.getLocaleMessage(locale);
+}
diff --git a/src/popup.html b/src/popup.html
new file mode 100644
index 0000000..c0a5d37
--- /dev/null
+++ b/src/popup.html
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
Popup
+
+
+
+
+
+
+
+
+
diff --git a/src/popup.ts b/src/popup.ts
new file mode 100644
index 0000000..42ccbf5
--- /dev/null
+++ b/src/popup.ts
@@ -0,0 +1,10 @@
+import Popup from './pages/Popup.vue';
+import VueDatePicker from '@vuepic/vue-datepicker';
+import '@vuepic/vue-datepicker/dist/main.css';
+import { createApp } from 'vue';
+import i18n from './plugins/i18n';
+
+const app = createApp(Popup);
+app.component('VueDatePicker', VueDatePicker);
+app.use(i18n);
+app.mount('body');
diff --git a/src/repository/inject-tabs-repository.ts b/src/repository/inject-tabs-repository.ts
new file mode 100644
index 0000000..44de742
--- /dev/null
+++ b/src/repository/inject-tabs-repository.ts
@@ -0,0 +1,21 @@
+import { ITabsRepository } from './tabs-repository-interface';
+import { TabsRepository } from './tabs-repository';
+
+let instanse: ITabsRepository | null = null;
+
+async function createAndInitInstance() {
+ let repo = new TabsRepository();
+ await repo.initAsync();
+ return repo;
+}
+
+export async function injectTabsRepositorySingleton(): Promise
{
+ if (instanse == null) {
+ instanse = await createAndInitInstance();
+ }
+ return instanse;
+}
+
+export async function injectTabsRepository(): Promise {
+ return createAndInitInstance();
+}
diff --git a/src/repository/tabs-repository-interface.ts b/src/repository/tabs-repository-interface.ts
new file mode 100644
index 0000000..a14b124
--- /dev/null
+++ b/src/repository/tabs-repository-interface.ts
@@ -0,0 +1,8 @@
+import { Tab } from '../entity/tab';
+
+export interface ITabsRepository {
+ getTabs(): Tab[];
+ getTodayTabs(): Tab[];
+ getTab(domain: string): Tab | undefined;
+ addTab(domain: string, favicon: string | undefined): Promise;
+}
diff --git a/src/repository/tabs-repository.ts b/src/repository/tabs-repository.ts
new file mode 100644
index 0000000..73b59f3
--- /dev/null
+++ b/src/repository/tabs-repository.ts
@@ -0,0 +1,44 @@
+import { ITabsRepository } from './tabs-repository-interface';
+import { Tab } from '../entity/tab';
+import { injecStorage } from '../storage/inject-storage';
+import { isInBlackList } from '../compositions/black-list';
+import { StorageDeserializeParam } from '../storage/storage-params';
+import { todayLocalDate } from '../utils/date';
+
+export class TabsRepository implements ITabsRepository {
+ private tabs: Tab[];
+
+ constructor() {
+ this.tabs = [];
+ }
+
+ async initAsync() {
+ this.tabs = (await injecStorage().getDeserializeList(StorageDeserializeParam.TABS)) as Tab[];
+ }
+
+ getTabs(): Tab[] {
+ return this.tabs;
+ }
+
+ getTodayTabs(): Tab[] {
+ return this.tabs.filter(x => x.days.find(s => s.date === todayLocalDate()));
+ }
+
+ getTab(domain: string): Tab | undefined {
+ return this.tabs?.find(x => x.url === domain);
+ }
+
+ async addTab(domain: string, favicon: string | undefined): Promise {
+ const tabFromStorage = this.getTab(domain);
+ const isInBlackListFlag = await isInBlackList(domain);
+
+ if (!isInBlackListFlag && !tabFromStorage) {
+ const newTab = new Tab();
+ newTab.init(domain);
+ this.tabs.push(newTab);
+ return newTab;
+ }
+
+ return undefined;
+ }
+}
diff --git a/src/scripts/activity.js b/src/scripts/activity.js
deleted file mode 100644
index 920513c..0000000
--- a/src/scripts/activity.js
+++ /dev/null
@@ -1,160 +0,0 @@
-'use strict';
-
-class Activity {
- addTab(tab) {
- if (this.isValidPage(tab) === true) {
- if (tab.id && (tab.id != 0)) {
- tabs = tabs || [];
- var domain = extractHostname(tab.url);
- var isDifferentUrl = false;
- if (currentTab !== tab.url) {
- isDifferentUrl = true;
- }
-
- if (this.isNewUrl(domain) && !this.isInBlackList(domain)) {
- var favicon = tab.favIconUrl;
- if (favicon === undefined) {
- favicon = 'chrome://favicon/' + domain;
- }
- var newTab = new Tab(domain, favicon);
- tabs.push(newTab);
- }
-
- if (isDifferentUrl && !this.isInBlackList(domain)) {
- this.setCurrentActiveTab(domain);
- var tabUrl = this.getTab(domain);
- if (tabUrl !== undefined)
- tabUrl.incCounter();
- this.addTimeInterval(domain);
- }
- }
- } else this.closeIntervalForCurrentTab();
- }
-
- isValidPage(tab) {
- if (!tab || !tab.url || (tab.url.indexOf('http:') == -1 && tab.url.indexOf('https:') == -1)
- || tab.url.indexOf('chrome://') !== -1
- || tab.url.indexOf('chrome-extension://') !== -1)
- return false;
- return true;
- }
-
- isInBlackList(domain) {
- if (setting_black_list !== undefined && setting_black_list.length > 0)
- return setting_black_list.find(o => isDomainEquals(extractHostname(o), extractHostname(domain))) !== undefined;
- else return false;
- }
-
- isLimitExceeded(domain, tab) {
- if (setting_restriction_list !== undefined && setting_restriction_list.length > 0) {
- var item = setting_restriction_list.find(o => isDomainEquals(extractHostname(o.domain), extractHostname(domain)));
- if (item !== undefined) {
- var data = tab.days.find(x => x.date == todayLocalDate());
- if (data !== undefined) {
- var todayTimeUse = data.summary;
- if (todayTimeUse >= item.time) {
- return true;
- }
- }
- }
- }
- return false;
- }
-
- wasDeferred(domain){
- if (deferredRestrictionsList != undefined){
- let defItem = deferredRestrictionsList.find(x => extractHostname(x.site) == extractHostname(domain));
- if (defItem != null){
- let time = defItem.dateOfDeferred;
- if (time + DEFERRED_TIMEOUT > new Date().getTime()){
- return true;
- }
- else {
- let index = deferredRestrictionsList.indexOf(defItem);
- if (index > -1)
- deferredRestrictionsList.splice(index, 1);
-
- return false;
- }
- }
- }
-
- return false;
- }
-
- isNewUrl(domain) {
- if (tabs.length > 0)
- return tabs.find(o => o.url === domain) === undefined;
- else return true;
- }
-
- getTab(domain) {
- if (tabs !== undefined)
- return tabs.find(o => o.url === domain);
- }
-
-
- updateFavicon(tab) {
- var domain = extractHostname(tab.url);
- var currentTab = this.getTab(domain);
- if (currentTab !== null && currentTab !== undefined) {
- if (tab.favIconUrl !== undefined && tab.favIconUrl !== currentTab.favicon) {
- currentTab.favicon = tab.favIconUrl;
- }
- }
- }
-
- setCurrentActiveTab(domain) {
- this.closeIntervalForCurrentTab();
- currentTab = domain;
- this.addTimeInterval(domain);
- }
-
- clearCurrentActiveTab() {
- this.closeIntervalForCurrentTab();
- currentTab = '';
- }
-
- addTimeInterval(domain) {
- var item = timeIntervalList.find(o => o.domain === domain && o.day == todayLocalDate());
- if (item != undefined) {
- if (item.day == todayLocalDate())
- item.addInterval();
- else {
- var newInterval = new TimeInterval(todayLocalDate(), domain);
- newInterval.addInterval();
- timeIntervalList.push(newInterval);
- }
- } else {
- var newInterval = new TimeInterval(todayLocalDate(), domain);
- newInterval.addInterval();
- timeIntervalList.push(newInterval);
- }
- }
-
- closeIntervalForCurrentTab() {
- if (currentTab !== '' && timeIntervalList != undefined) {
- var item = timeIntervalList.find(o => o.domain === currentTab && o.day == todayLocalDate());
- if (item != undefined)
- item.closeInterval();
- }
- currentTab = '';
- }
-
- isNeedNotifyView(domain, tab){
- if (setting_notification_list !== undefined && setting_notification_list.length > 0) {
- var item = setting_notification_list.find(o => isDomainEquals(extractHostname(o.domain), extractHostname(domain)));
- if (item !== undefined) {
- var today = todayLocalDate();
- var data = tab.days.find(x => x.date == today);
- if (data !== undefined) {
- var todayTimeUse = data.summary;
- if (todayTimeUse == item.time || todayTimeUse % item.time == 0) {
- return true;
- }
- }
- }
- }
- return false;
- }
-};
\ No newline at end of file
diff --git a/src/scripts/background.js b/src/scripts/background.js
deleted file mode 100644
index fcb61bc..0000000
--- a/src/scripts/background.js
+++ /dev/null
@@ -1,476 +0,0 @@
-'use strict';
-
-var tabs;
-var timeIntervalList;
-var currentTab;
-var isNeedDeleteTimeIntervalFromTabs = false;
-var activity = new Activity();
-var storage = new LocalStorage();
-var deferredRestrictionsList;
-
-var setting_black_list;
-var setting_restriction_list;
-var setting_interval_save;
-var setting_interval_inactivity;
-var setting_view_in_badge;
-var setting_block_deferral;
-var setting_dark_mode;
-var setting_notification_list;
-var setting_notification_message;
-
-var isHasPermissioForYouTube;
-var isHasPermissioForNetflix;
-var isHasPermissioForNotification;
-
-function updateSummaryTime() {
- setInterval(backgroundCheck, SETTINGS_INTERVAL_CHECK_DEFAULT);
-}
-
-function updateStorage() {
- setInterval(backgroundUpdateStorage, SETTINGS_INTERVAL_SAVE_STORAGE_DEFAULT);
-}
-
-function backgroundCheck() {
- chrome.windows.getLastFocused({ populate: true }, function(currentWindow) {
- if (currentWindow.focused) {
- var activeTab = currentWindow.tabs.find(t => t.active === true);
- if (activeTab !== undefined && activity.isValidPage(activeTab)) {
- var activeUrl = extractHostname(activeTab.url);
- var tab = activity.getTab(activeUrl);
- if (tab === undefined) {
- activity.addTab(activeTab);
- }
-
- if (activity.isInBlackList(activeUrl)) {
- chrome.browserAction.setBadgeBackgroundColor({ color: '#fdb8b8' })
- chrome.browserAction.setBadgeText({
- tabId: activeTab.id,
- text: 'n/a'
- });
- } else {
- if (tab !== undefined) {
- if (currentTab !== tab.url) {
- activity.setCurrentActiveTab(tab.url);
- }
- chrome.idle.queryState(parseInt(setting_interval_inactivity), function(state) {
- if (state === 'active') {
- mainTRacker(activeUrl, tab, activeTab);
- } else checkDOM(state, activeUrl, tab, activeTab);
- });
- }
- }
- }
- } else activity.closeIntervalForCurrentTab();
- });
-}
-
-function mainTRacker(activeUrl, tab, activeTab) {
- if (activity.isLimitExceeded(activeUrl, tab) && !activity.wasDeferred(activeUrl)) {
- setBlockPageToCurrent(activeTab.url, tab.days.at(-1).summary, tab.days.at(-1).counter);
- }
- if (!activity.isInBlackList(activeUrl)) {
- if (activity.isNeedNotifyView(activeUrl, tab)) {
- if (isHasPermissioForNotification) {
- showNotification(activeUrl, tab);
- } else {
- checkPermissionsForNotifications(showNotification, activeUrl, tab);
- }
- }
- tab.incSummaryTime();
- }
- if (setting_view_in_badge === true) {
- chrome.browserAction.setBadgeBackgroundColor({ color: '#e7e7e7' })
- var summary = tab.days.find(s => s.date === todayLocalDate()).summary;
- chrome.browserAction.setBadgeText({
- tabId: activeTab.id,
- text: String(convertSummaryTimeToBadgeString(summary))
- });
- } else {
- chrome.browserAction.setBadgeBackgroundColor({ color: [0, 0, 0, 0] })
- chrome.browserAction.setBadgeText({
- tabId: activeTab.id,
- text: ''
- });
- }
-}
-
-function showNotification(activeUrl, tab) {
- chrome.notifications.clear('watt-site-notification', function(wasCleared) {
- if (!wasCleared) {
- console.log('!wasCleared');
-
- chrome.notifications.create(
- 'watt-site-notification', {
- type: 'basic',
- iconUrl: 'icons/128x128.png',
- title: "Web Activity Time Tracker",
- contextMessage: activeUrl + ' ' + convertShortSummaryTimeToString(tab.getTodayTime()),
- message: setting_notification_message
- },
- function(notificationId) {
- console.log(notificationId);
- chrome.notifications.clear('watt-site-notification', function(wasCleared) {
- if (wasCleared)
- notificationAction(activeUrl, tab);
- });
- });
- } else {
- notificationAction(activeUrl, tab);
- }
- });
-}
-
-function notificationAction(activeUrl, tab) {
- chrome.notifications.create(
- 'watt-site-notification', {
- type: 'basic',
- iconUrl: 'icons/128x128.png',
- title: "Web Activity Time Tracker",
- contextMessage: activeUrl + ' ' + convertShortSummaryTimeToString(tab.getTodayTime()),
- message: setting_notification_message
- });
-}
-
-function setBlockPageToCurrent(currentUrl, summaryTime, counter) {
- var blockUrl = chrome.runtime.getURL("block.html") + '?url=' + currentUrl
- + '&summaryTime=' + summaryTime
- + '&counter=' + counter;
- chrome.tabs.query({ currentWindow: true, active: true }, function(tab) {
- chrome.tabs.update(tab.id, { url: blockUrl });
- });
-}
-
-function isVideoPlayedOnPage() {
- var videoElement = document.getElementsByTagName('video')[0];
- if (videoElement !== undefined && videoElement.currentTime > 0 && !videoElement.paused && !videoElement.ended && videoElement.readyState > 2) {
- return true;
- } else return false;
-}
-
-function checkDOM(state, activeUrl, tab, activeTab) {
- if (state === 'idle' && isDomainEquals(activeUrl, "youtube.com")) {
- trackForYT(mainTRacker, activeUrl, tab, activeTab);
- } else if (state === 'idle' && isDomainEquals(activeUrl, "netflix.com")) {
- trackForNetflix(mainTRacker, activeUrl, tab, activeTab);
- } else activity.closeIntervalForCurrentTab();
-}
-
-function trackForYT(callback, activeUrl, tab, activeTab) {
- if (isHasPermissioForYouTube) {
- executeScriptYoutube(callback, activeUrl, tab, activeTab);
- } else {
- checkPermissionsForYT(executeScriptYoutube, activity.closeIntervalForCurrentTab, callback, activeUrl, tab, activeTab);
- }
-}
-
-function trackForNetflix(callback, activeUrl, tab, activeTab) {
- if (isHasPermissioForNetflix) {
- executeScriptNetflix(callback, activeUrl, tab, activeTab);
- } else {
- checkPermissionsForNetflix(executeScriptNetflix, activity.closeIntervalForCurrentTab, callback, activeUrl, tab, activeTab);
- }
-}
-
-function executeScriptYoutube(callback, activeUrl, tab, activeTab) {
- chrome.tabs.executeScript({ code: "var videoElement = document.getElementsByTagName('video')[0]; (videoElement !== undefined && videoElement.currentTime > 0 && !videoElement.paused && !videoElement.ended && videoElement.readyState > 2);" }, (results) => {
- if (results !== undefined && results[0] !== undefined && results[0] === true)
- callback(activeUrl, tab, activeTab);
- else activity.closeIntervalForCurrentTab();
- });
-}
-
-function executeScriptNetflix(callback, activeUrl, tab, activeTab) {
- chrome.tabs.executeScript({ code: "var videoElement = document.getElementsByTagName('video')[0]; (videoElement !== undefined && videoElement.currentTime > 0 && !videoElement.paused && !videoElement.ended && videoElement.readyState > 2);" }, (results) => {
- if (results !== undefined && results[0] !== undefined && results[0] === true) {
- callback(activeUrl, tab, activeTab);
- } else {
- activity.closeIntervalForCurrentTab();
- }
- });
-}
-
-function backgroundUpdateStorage() {
- if (tabs != undefined && tabs.length > 0)
- storage.saveTabs(tabs);
- if (timeIntervalList != undefined && timeIntervalList.length > 0)
- storage.saveValue(STORAGE_TIMEINTERVAL_LIST, timeIntervalList);
-}
-
-function setDefaultSettings() {
- storage.saveValue(SETTINGS_INTERVAL_INACTIVITY, SETTINGS_INTERVAL_INACTIVITY_DEFAULT);
- storage.saveValue(SETTINGS_INTERVAL_RANGE, SETTINGS_INTERVAL_RANGE_DEFAULT);
- storage.saveValue(SETTINGS_VIEW_TIME_IN_BADGE, SETTINGS_VIEW_TIME_IN_BADGE_DEFAULT);
- storage.saveValue(SETTINGS_BLOCK_DEFERRAL, SETTINGS_BLOCK_DEFERRAL_DEFAULT);
- storage.saveValue(SETTINGS_DARK_MODE, SETTINGS_DARK_MODE_DEFAULT);
- storage.saveValue(SETTINGS_INTERVAL_SAVE_STORAGE, SETTINGS_INTERVAL_SAVE_STORAGE_DEFAULT);
- storage.saveValue(STORAGE_NOTIFICATION_MESSAGE, STORAGE_NOTIFICATION_MESSAGE_DEFAULT);
-}
-
-function checkSettingsImEmpty() {
- chrome.storage.local.getBytesInUse(['inactivity_interval'], function(item) {
- if (item == 0) {
- setDefaultSettings();
- }
- });
-}
-
-function setDefaultValueForNewSettings() {
- loadNotificationMessage();
-}
-
-function addListener() {
- chrome.tabs.onActivated.addListener(function(info) {
- chrome.tabs.get(info.tabId, function(tab) {
- activity.addTab(tab);
- });
- });
-
- chrome.webNavigation.onCompleted.addListener(function(details) {
- chrome.tabs.get(details.tabId, function(tab) {
- activity.updateFavicon(tab);
- });
- });
- chrome.runtime.onInstalled.addListener(function(details) {
- if (details.reason == 'install') {
- storage.saveValue(SETTINGS_SHOW_HINT, SETTINGS_SHOW_HINT_DEFAULT);
- setDefaultSettings();
- }
- if (details.reason == 'update') {
- storage.saveValue(SETTINGS_SHOW_HINT, SETTINGS_SHOW_HINT_DEFAULT);
- checkSettingsImEmpty();
- setDefaultValueForNewSettings();
- isNeedDeleteTimeIntervalFromTabs = true;
- }
- });
- chrome.storage.onChanged.addListener(function(changes, namespace) {
- for (var key in changes) {
- if (key === STORAGE_BLACK_LIST) {
- loadBlackList();
- }
- if (key === STORAGE_RESTRICTION_LIST) {
- loadRestrictionList();
- }
- if (key === STORAGE_NOTIFICATION_LIST) {
- loadNotificationList();
- }
- if (key === STORAGE_NOTIFICATION_MESSAGE) {
- loadNotificationMessage();
- }
- if (key === SETTINGS_INTERVAL_INACTIVITY) {
- storage.getValue(SETTINGS_INTERVAL_INACTIVITY, function(item) { setting_interval_inactivity = item; });
- }
- if (key === SETTINGS_VIEW_TIME_IN_BADGE) {
- storage.getValue(SETTINGS_VIEW_TIME_IN_BADGE, function(item) { setting_view_in_badge = item; });
- }
- if (key === SETTINGS_BLOCK_DEFERRAL) {
- storage.getValue(SETTINGS_BLOCK_DEFERRAL, function(item) { setting_block_deferral = item; });
- }
- if (key === SETTINGS_DARK_MODE) {
- storage.getValue(SETTINGS_DARK_MODE, function(item) { setting_dark_mode = item; });
- }
- }
- });
-
- chrome.runtime.setUninstallURL("https://docs.google.com/forms/d/e/1FAIpQLSdImHtvey6sg5mzsQwWfAQscgZOOV52blSf9HkywSXJhuQQHg/viewform");
-}
-
-function loadTabs() {
- storage.loadTabs(STORAGE_TABS, function(items) {
- tabs = [];
- if (items != undefined) {
- for (var i = 0; i < items.length; i++) {
- tabs.push(new Tab(items[i].url, items[i].favicon, items[i].days, items[i].summaryTime, items[i].counter));
- }
- if (isNeedDeleteTimeIntervalFromTabs)
- deleteTimeIntervalFromTabs();
- }
- });
-}
-
-function deleteTimeIntervalFromTabs() {
- tabs.forEach(function(item) {
- item.days.forEach(function(day) {
- if (day.time != undefined)
- day.time = [];
- })
- })
-}
-
-function deleteYesterdayTimeInterval() {
- timeIntervalList = timeIntervalList.filter(x => x.day == todayLocalDate());
-}
-
-function loadBlackList() {
- storage.getValue(STORAGE_BLACK_LIST, function(items) {
- setting_black_list = items;
- })
-}
-
-function loadTimeIntervals() {
- storage.getValue(STORAGE_TIMEINTERVAL_LIST, function(items) {
- timeIntervalList = [];
- if (items != undefined) {
- for (var i = 0; i < items.length; i++) {
- timeIntervalList.push(new TimeInterval(items[i].day, items[i].domain, items[i].intervals));
- }
- deleteYesterdayTimeInterval();
- }
- });
-}
-
-function loadRestrictionList() {
- storage.getValue(STORAGE_RESTRICTION_LIST, function(items) {
- setting_restriction_list = items;
- })
-}
-
-function loadNotificationList() {
- storage.getValue(STORAGE_NOTIFICATION_LIST, function(items) {
- setting_notification_list = items;
- });
-}
-
-function loadNotificationMessage() {
- storage.getValue(STORAGE_NOTIFICATION_MESSAGE, function(item) {
- setting_notification_message = item;
- if (isEmpty(setting_notification_message)) {
- storage.saveValue(STORAGE_NOTIFICATION_MESSAGE, STORAGE_NOTIFICATION_MESSAGE_DEFAULT);
- setting_notification_message = STORAGE_NOTIFICATION_MESSAGE_DEFAULT;
- }
- });
-}
-
-function loadSettings() {
- storage.getValue(SETTINGS_INTERVAL_INACTIVITY, function(item) { setting_interval_inactivity = item; });
- storage.getValue(SETTINGS_VIEW_TIME_IN_BADGE, function(item) { setting_view_in_badge = item; });
- storage.getValue(SETTINGS_BLOCK_DEFERRAL, function(item) { setting_block_deferral = item; });
- storage.getValue(SETTINGS_DARK_MODE, function(item) { setting_dark_mode = item; });
-}
-
-function loadAddDataFromStorage() {
- loadTabs();
- loadTimeIntervals();
- loadBlackList();
- loadRestrictionList();
- loadNotificationList();
- loadNotificationMessage();
- loadSettings();
-}
-
-function loadPermissions() {
- checkPermissionsForYT();
- checkPermissionsForNetflix();
- checkPermissionsForNotifications();
-}
-
-function checkPermissionsForYT(callbackIfTrue, callbackIfFalse, ...props) {
- chrome.permissions.contains({
- permissions: ['tabs'],
- origins: ["https://www.youtube.com/*"]
- }, function(result) {
- if (callbackIfTrue != undefined && result)
- callbackIfTrue(...props);
- if (callbackIfFalse != undefined && !result)
- callbackIfFalse();
- isHasPermissioForYouTube = result;
- });
-}
-
-function checkPermissionsForNetflix(callbackIfTrue, callbackIfFalse, ...props) {
- chrome.permissions.contains({
- permissions: ['tabs'],
- origins: ["https://www.netflix.com/*"]
- }, function(result) {
- if (callbackIfTrue != undefined && result)
- callbackIfTrue(...props);
- if (callbackIfFalse != undefined && !result)
- callbackIfFalse();
- isHasPermissioForNetflix = result;
- });
-}
-
-function checkPermissionsForNotifications(callback, ...props) {
- chrome.permissions.contains({
- permissions: ["notifications"]
- }, function(result) {
- if (callback != undefined && result)
- callback(...props);
- isHasPermissioForNotification = result;
- });
-}
-
-function createFile(data, type, fileName) {
- var file = new Blob([data], { type: type });
- var downloadLink;
- downloadLink = document.createElement("a");
- downloadLink.download = fileName;
- downloadLink.href = window.URL.createObjectURL(file);
- downloadLink.style.display = "none";
- document.body.appendChild(downloadLink);
- downloadLink.click();
- }
-
- function toCsv(tabsData) {
- var str = "domain,date,time(sec)\r\n";
- for (var i = 0; i < tabsData.length; i++) {
- for (var y = 0; y < tabsData[i].days.length; y++) {
- var line =
- tabsData[i].url +
- "," +
- new Date(tabsData[i].days[y].date).toLocaleDateString() +
- "," +
- tabsData[i].days[y].summary;
- str += line + "\r\n";
- }
- }
-
- createFile(str, "text/csv", "domains.csv");
- }
-
- function exportToCSV() {
- storage.getValue(STORAGE_TABS, function (item) {
- toCsv(item);
- });
- }
-
- storage.getValue("SETTINGS_PERIODIC_HOUR_DOWNLOAD", function (hour) {
- storage.getValue("SETTINGS_PERIODIC_MINUTE_DOWNLOAD", function (minute) {
- if (typeof hour !== "number" || typeof minute !== "number") {
- return;
- } else {
- autoDownloadCsv(hour, minute);
- }
- });
- });
-
- function autoDownloadCsv(hour, minute) {
- var now = new Date();
- var triggerTime = new Date(
- now.getFullYear(),
- now.getMonth(),
- now.getDate(),
- hour,
- minute,
- 0,
- 0
- );
-
- if (triggerTime < now) {
- triggerTime.setDate(triggerTime.getDate() + 1);
- }
- chrome.alarms.create("periodic_Download", {
- when: triggerTime.getTime(),
- periodInMinutes: 1440, // 24 hours
- });
- chrome.alarms.onAlarm.addListener(function (alarm) {
- if (alarm.name === "periodic_Download") {
- exportToCSV();
- }
- });
- }
-
-loadPermissions();
-addListener();
-loadAddDataFromStorage();
-updateSummaryTime();
-updateStorage();
\ No newline at end of file
diff --git a/src/scripts/block.js b/src/scripts/block.js
deleted file mode 100644
index e2d34d0..0000000
--- a/src/scripts/block.js
+++ /dev/null
@@ -1,56 +0,0 @@
-"use strict";
-
-var storage = new LocalStorage();
-var blockSiteUrl;
-var blockSiteTime;
-var blockSiteCounter;
-var restrictionList = [];
-
-document.addEventListener("DOMContentLoaded", function () {
- var url = new URL(document.URL);
- blockSiteUrl = url.searchParams.get("url");
- blockSiteTime = url.searchParams.get("summaryTime");
- blockSiteCounter = url.searchParams.get("counter");
- document.getElementById("site").innerText = extractHostname(blockSiteUrl);
- document.getElementById("deferredTime").innerText = convertShortSummaryTimeToString(blockSiteTime);
- document.getElementById("deferredCount").innerText = blockSiteCounter;
-
- storage.getValue(STORAGE_RESTRICTION_LIST, function (items) {
- restrictionList = items;
- if (restrictionList === undefined) restrictionList = [];
- var currentItem = restrictionList.find((x) =>
- isDomainEquals(extractHostname(x.domain), extractHostname(blockSiteUrl))
- );
- if (currentItem !== undefined) {
- document.getElementById("limit").innerText =
- convertShortSummaryTimeToString(currentItem.time);
- }
- });
-
- storage.getValue(SETTINGS_BLOCK_DEFERRAL, function (item) {
- var deferBtn = document.getElementById("deffererBtn");
- if (item) {
- deferBtn.addEventListener("click", function () {
- chrome.runtime.getBackgroundPage(function (bg) {
- let defList = bg.deferredRestrictionsList;
- if (defList == undefined) defList = [];
- defList.push({
- site: blockSiteUrl,
- dateOfDeferred: new Date().getTime(),
- });
-
- bg.deferredRestrictionsList = defList;
-
- chrome.tabs.query(
- { currentWindow: true, active: true },
- function (tab) {
- chrome.tabs.update(tab.id, { url: blockSiteUrl });
- }
- );
- });
- });
- } else {
- deferBtn.remove();
- }
- });
-});
diff --git a/src/scripts/chart/chart-core.js b/src/scripts/chart/chart-core.js
deleted file mode 100644
index 7b859ad..0000000
--- a/src/scripts/chart/chart-core.js
+++ /dev/null
@@ -1,528 +0,0 @@
-function donutChart() {
- var width,
- height,
- darkMode,
- margin = { top: 10, right: 10, bottom: 0, left: 10 },
- colour = d3.scaleOrdinal(d3.schemeCategory20), // colour scheme
- variable, // value in data that will dictate proportions on chart
- category, // compare data by
- padAngle, // effectively dictates the gap between slices
- floatFormat = d3.format('.4r'),
- cornerRadius, // sets how rounded the corners are on each slice
- percentFormat = d3.format(',.2%');
-
- function chart(selection) {
- selection.each(function (data) {
- // generate chart
-
- // ===========================================================================================
- // Set up constructors for making donut. See https://github.com/d3/d3-shape/blob/master/README.md
- var radius = 110;
-
- // creates a new pie generator
- var pie = d3.pie()
- .value(function (d) { return floatFormat(d[variable]); })
- .sort(null);
-
- // contructs and arc generator. This will be used for the donut. The difference between outer and inner
- // radius will dictate the thickness of the donut
- var arc = d3.arc()
- .outerRadius(radius)
- .innerRadius(radius * 0.75)
- .cornerRadius(cornerRadius)
- .padAngle(padAngle);
-
- // ===========================================================================================
- // append the svg object to the selection
- var svg = selection.append('svg')
- .attr('width', width + margin.left + margin.right)
- .attr('height', height + margin.top + margin.bottom)
- .attr('class', 'backColorChart')
- .append('g')
- .attr('transform', 'translate(' + (width / 2 - 105) + ',' + (height / 2) + ')');
- // ===========================================================================================
-
- // ===========================================================================================
- // g elements to keep elements within svg modular
- svg.append('g').attr('class', 'slices');
- svg.append('g').attr('class', 'labelName');
- svg.append('g').attr('class', 'lines');
- // ===========================================================================================
-
- // ===========================================================================================
- // add and colour the donut slices
- var path = svg.select('.slices')
- .datum(data).selectAll('path')
- .data(pie)
- .enter().append('path')
- .attr('fill', function (d) { return colour(d.data[category]); })
- .attr('d', arc)
- .attr('id', function (d) { return d.data[category]; });
- // ===========================================================================================
-
- var legendG = svg.selectAll(".legend") // note appending it to mySvg and not svg to make positioning easier
- .data(pie(data))
- .enter().append("g")
- .attr("transform", function (d, i) {
- return "translate(" + (130) + "," + (i * 20 - 100) + ")"; // place each legend on the right and bump each one down 15 pixels
- })
- .attr("class", "legend");
-
- if (darkMode)
- legendG.style("fill", "#ffffff");
- else legendG.style("fill", "black");
-
- legendG.append("rect") // make a matching color rect
- .attr("width", 10)
- .attr("height", 10)
- .attr("fill", function (d, i) {
- return colour(d.data[category]);
- });
-
- if (darkMode)
- legendG.append("text") // add the text
- .text(function (d) {
- return d.data.url;
- })
- .style("font-size", 13)
- .style('fill', '#ffffff')
- .attr("y", 10)
- .attr("x", 13);
- else
- legendG.append("text") // add the text
- .text(function (d) {
- return d.data.url;
- })
- .style("fill", "black")
- .style("font-size", 14)
- .attr("y", 10)
- .attr("x", 15);
-
- // ===========================================================================================
- // add tooltip to mouse events on slices and labels
- d3.selectAll('.labelName text, .slices path').call(toolTip);
- // ===========================================================================================
-
- // ===========================================================================================
- // Functions
-
- // calculates the angle for the middle of a slice
- function midAngle(d) { return d.startAngle + (d.endAngle - d.startAngle) / 2; }
-
- // function that creates and adds the tool tip to a selected element
- function toolTip(selection) {
-
- // add tooltip (svg circle element) when mouse enters label or slice
- selection.on('mouseenter', function (data) {
- d3.selectAll('.toolCircle').remove();
- if (darkMode)
- svg.append('text')
- .attr('class', 'toolCircle')
- .attr('dy', -15) // hard-coded. can adjust this to adjust text vertical alignment in tooltip
- .html(toolTipHTML(data)) // add text to the circle.
- .style('font-size', '.9em')
- .style('fill', '#ffffff')
- .style('text-anchor', 'middle'); // centres text in tooltip
- else
- svg.append('text')
- .attr('class', 'toolCircle')
- .attr('dy', -15)
- .html(toolTipHTML(data))
- .style('font-size', '.9em')
- .style('text-anchor', 'middle');
-
- svg.append('circle')
- .attr('class', 'toolCircle')
- .attr('r', radius * 0.75) // radius of tooltip circle
- .style('fill', 'white') // colour based on category mouse is over
- .style('fill-opacity', 0.35);
-
- });
-
- // remove the tooltip when mouse leaves the slice/label
- // selection.on('mouseout', function () {
- // d3.selectAll('.toolCircle').remove();
- // });
- }
-
- // function to create the HTML string for the tool tip. Loops through each key in data object
- // and returns the html string key: value
- function toolTipHTML(data) {
-
- var tip = '',
- i = 0;
-
- for (var key in data.data) {
-
- // if value is a number, format it as a percentage
- var value = (!isNaN(parseFloat(data.data[key]))) ? percentFormat(data.data[key]) : data.data[key];
- if (key === 'summary')
- value = convertSummaryTimeToString(data.data[key]);
- if (key === 'visits' && data.data[key] !== undefined)
- value = data.data[key] + ' visits';
- var className = '';
- if (key === 'percentage')
- className = 'class="percentageValue"';
-
- // leave off 'dy' attr for first tspan so the 'dy' attr on text element works. The 'dy' attr on
- // tspan effectively imitates a line break.
- if (i === 0) tip += '' + value + '';
- else tip += '' + value + '';
- i++;
- }
-
- return tip;
- }
-
- function angleIsInRangeDifference(tempAngle, currentAngle, difference) {
- return currentAngle < (tempAngle + difference) && currentAngle > (tempAngle - difference);
- }
- // ===========================================================================================
-
- });
- }
-
- chart.width = function (value) {
- if (!arguments.length) return width;
- width = value;
- return chart;
- };
-
- chart.height = function (value) {
- if (!arguments.length) return height;
- height = value;
- return chart;
- };
-
- chart.darkMode = function (value) {
- if (!arguments.length) return darkMode;
- darkMode = value;
- return chart;
- };
-
- chart.margin = function (value) {
- if (!arguments.length) return margin;
- margin = value;
- return chart;
- };
-
- chart.radius = function (value) {
- if (!arguments.length) return radius;
- radius = value;
- return chart;
- };
-
- chart.padAngle = function (value) {
- if (!arguments.length) return padAngle;
- padAngle = value;
- return chart;
- };
-
- chart.cornerRadius = function (value) {
- if (!arguments.length) return cornerRadius;
- cornerRadius = value;
- return chart;
- };
-
- chart.colour = function (value) {
- if (!arguments.length) return colour;
- colour = value;
- return chart;
- };
-
- chart.variable = function (value) {
- if (!arguments.length) return variable;
- variable = value;
- return chart;
- };
-
- chart.category = function (value) {
- if (!arguments.length) return category;
- category = value;
- return chart;
- };
-
- return chart;
-}
-
-function barChart(data, darkMode) {
- var margin = { top: 25, right: 5, bottom: 25, left: 5 },
- width = 555,
- height = 160;
-
- // set the ranges
- var x = d3.scaleBand()
- .range([0, width])
- .padding(0.1);
- var y = d3.scaleLinear()
- .range([height, 0]);
-
- // append the svg object to the body of the page
- // append a 'group' element to 'svg'
- // moves the 'group' element to the top left margin
- var svg = d3.select("#barChart").append("svg")
- .attr("width", width + margin.left + margin.right)
- .attr("height", height + margin.top + margin.bottom)
- .append("g")
- .attr("transform",
- "translate(" + margin.left + "," + margin.top + ")");
-
- var tip = d3.tip()
- .attr('class', 'd3-tip')
- .offset([-10, 0])
- .html(function (d) {
- if (data.length > 9)
- return "" + new Date(d.date).toLocaleDateString() + "" + convertShortSummaryTimeToString(d.total) + "";
- else
- return "" + convertShortSummaryTimeToString(d.total) + "";
- });
-
- svg.call(tip);
-
- // Scale the range of the data in the domains
- x.domain(data.map(function (d) { return new Date(d.date).toLocaleDateString(); }));
- y.domain([0, d3.max(data, function (d) { return d.total; })]);
-
- // append the rectangles for the bar chart
- svg.selectAll(".bar")
- .data(data)
- .enter().append("rect")
- .attr("class", "bar")
- .attr("x", function (d) { return x(new Date(d.date).toLocaleDateString()); })
- .attr("width", x.bandwidth())
- .attr("y", function (d) { return y(d.total); })
- .attr("height", function (d) { return height - y(d.total); })
- .on('mouseover', tip.show)
- .on('mouseout', tip.hide);
-
- // add the x Axis
- svg.append("g")
- .attr("transform", "translate(0," + height + ")")
- .style("stroke", darkMode ? "white" : "")
- .style("stroke-width", darkMode ? "0.5px" : "")
- .call(d3.axisBottom(x));
-
- if (data.length > 9)
- document.querySelectorAll('#barChart g.tick ').forEach(element => { element.remove() });
-
- if (darkMode){
- document.querySelector("#barChart path").setAttribute("stroke", "white");
- document.querySelectorAll('#barChart g.tick line').forEach(element => { element.setAttribute("stroke", "white") });
- }
-}
-
-function drawIntervalChart(data) {
- data.forEach(function (item) {
- var hFrom = getHourFrom(item.interval);
- var hTo = getHourTo(item.interval);
- if (hFrom != hTo) {
- var sourceTimeFrom = item.interval.split('-')[0].split(':');
- var sourceTimeTo = item.interval.split('-')[1].split(':');
- var timeTo = sourceTimeFrom[0] + ":" + 59 + ":" + 59;
- var timeFrom = sourceTimeTo[0] + ":" + 00 + ":" + 00;
- data.push({ "domain": item.domain, "interval": item.interval.split('-')[0] + "-" + timeTo });
- data.push({ "domain": item.domain, "interval": timeFrom + "-" + item.interval.split('-')[1] });
- }
- });
-
- var margin = { top: 5, right: 10, bottom: 20, left: 20 },
- width = 580 - margin.left - margin.right,
- height = 410 - margin.top - margin.bottom;
-
- //linear 24 hour scale
- var y = d3.scaleLinear()
- .domain([0, 60])
- .range([height, 0]);
-
- //vertical axis
- var yAxis = d3.axisLeft()
- .ticks(10)
- .scale(y);
-
- var x = d3.scaleLinear()
- .domain([0, 24])
- .range([0, width]);
-
- //vertical axis
- var xAxis = d3.axisBottom()
- .ticks(24)
- .scale(x)
-
- var tickDistance = 4.38;
-
- var tooltip;
- if (document.body.classList.contains('dark-mode'))
- tooltip = d3.select("#timeChart")
- .append("div")
- .style("opacity", 0)
- .style("display", "none")
- .style("position", "absolute")
- .attr("class", "tooltip")
- .style("background-color", "#cbcbcb")
- .style("color", "black")
- .style("border", "solid")
- .style("border-width", "1px")
- .style("border-radius", "5px")
- .style("padding", "5px")
- else
- tooltip = d3.select("#timeChart")
- .append("div")
- .style("opacity", 0)
- .style("display", "none")
- .style("position", "absolute")
- .attr("class", "tooltip")
- .style("background-color", "white")
- .style("color", "black")
- .style("border", "solid")
- .style("border-width", "1px")
- .style("border-radius", "5px")
- .style("padding", "5px")
-
- // Three function that change the tooltip when user hover / move / leave a cell
- var mouseover = function (d) {
- tooltip
- .style("opacity", 1)
- .style("display", "block")
- d3.select(this)
- .style("stroke", "black")
- .style("stroke-width", "0.5px")
- .style("opacity", 1)
- }
- var mousemove = function (d) {
- tooltip
- .html(d.domain + "
" + d.interval)
- .style("left", (d3.mouse(this)[0]) + 10 + "px")
- .style("top", (d3.mouse(this)[1]) + 30 + "px")
- }
- var mouseleave = function (d) {
- tooltip
- .style("opacity", 0)
- .style("display", "none")
- d3.select(this)
- .style("stroke", "none")
- .style("opacity", 0.8)
- }
-
- //create the svg
- var svg;
- if (document.body.classList.contains('dark-mode'))
- svg = d3.select("#timeChart").append("svg")
- .style('background-color', '#383838')
- .attr("width", width + margin.left + margin.right)
- .attr("height", height + margin.top + margin.bottom)
- .append("g")
- .attr("transform", "translate(" + margin.left + "," + margin.top + ")");
- else
- svg = d3.select("#timeChart").append("svg")
- .attr("width", width + margin.left + margin.right)
- .attr("height", height + margin.top + margin.bottom)
- .append("g")
- .attr("transform", "translate(" + margin.left + "," + margin.top + ")");
-
- //draw the axis.
- svg.append("g")
- .attr("class", "x axis")
- .attr("transform", "translate(0," + height + ")")
- .attr("class", "label")
- .call(xAxis)
- .append("text")
- .text("Value");
-
- // Add a y-axis with label.
- svg.append("g")
- .attr("class", "y axis")
- .call(yAxis)
- .append("text")
- .attr("class", "label")
- .attr("y", 6)
- .attr("dy", ".71em")
- .attr("text-anchor", "end")
- .attr("transform", "rotate(-90)")
- .text("Value");
-
- svg.append("g")
- .attr("class", "grid")
- .attr("transform", "translate(0," + height + ")")
- .call(make_x_axis()
- .tickSize(-height, 0, 0)
- )
-
- svg.append("g")
- .attr("class", "grid")
- .call(make_y_axis()
- .tickSize(-width, 0, 0)
- )
-
- //draw the bars, offset y and bar height based on data
- svg.selectAll(".bar")
- .data(data)
- .enter()
- .append("rect")
- .style("fill", "orangered")
- .style("stroke", "#f1f1f1")
- .style("stroke-width", "1")
- .attr("class", "bar")
- .attr("x", function (d) {
- return x(getHourFrom(d.interval)) + 2;
- })
- .attr("width", 20)
- .attr("y", function (d) {
- return y(getMinutesTo(d.interval)) - 1;
- })
- .attr("height", function (d) {
- var offset = getMinutesTo(d.interval) - getMinutesFrom(d.interval);
- if (offset == 0) {
- var offsetSeconds = getSecondsTo(d.interval) - getSecondsFrom(d.interval);
- if (offsetSeconds <= 3)
- return 0;
- else
- return 1;
- }
- else return offset * tickDistance;
- })
- .on("mouseover", mouseover)
- .on("mousemove", mousemove)
- .on("mouseleave", mouseleave);
-
- function make_x_axis() {
- return d3.axisBottom()
- .scale(x)
- .ticks(24)
- }
-
- function make_y_axis() {
- return d3.axisLeft()
- .scale(y)
- .ticks(10)
- }
-
- function getHourFrom(interval) {
- var time = interval.split('-')[0];
- return time.split(':')[0];
- }
-
- function getHourTo(interval) {
- var time = interval.split('-')[1];
- return time.split(':')[0];
- }
-
- function getMinutesFrom(interval) {
- var time = interval.split('-')[0];
- return time.split(':')[1];
- }
-
- function getMinutesTo(interval) {
- var time = interval.split('-')[1];
- return time.split(':')[1];
- }
-
- function getSecondsFrom(interval) {
- var time = interval.split('-')[0];
- return time.split(':')[2];
- }
-
- function getSecondsTo(interval) {
- var time = interval.split('-')[1];
- return time.split(':')[2];
- }
-}
\ No newline at end of file
diff --git a/src/scripts/chart/d3.v4.min.js b/src/scripts/chart/d3.v4.min.js
deleted file mode 100644
index ffe427c..0000000
--- a/src/scripts/chart/d3.v4.min.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n(t.d3=t.d3||{})}(this,function(I){"use strict";function a(t,n){return t>>1;o(t[i],n)<0?e=i+1:r=i}return e},right:function(t,n,e,r){for(null==e&&(e=0),null==r&&(r=t.length);e>>1;0>8&15|n>>4&240,n>>4&15|240&n,(15&n)<<4|15&n,1):(n=Xs.exec(t))?At(parseInt(n[1],16)):(n=Vs.exec(t))?new Rt(n[1],n[2],n[3],1):(n=$s.exec(t))?new Rt(255*n[1]/100,255*n[2]/100,255*n[3]/100,1):(n=Ws.exec(t))?Ct(n[1],n[2],n[3],n[4]):(n=Zs.exec(t))?Ct(255*n[1]/100,255*n[2]/100,255*n[3]/100,n[4]):(n=Gs.exec(t))?Lt(n[1],n[2]/100,n[3]/100,1):(n=Qs.exec(t))?Lt(n[1],n[2]/100,n[3]/100,n[4]):Js.hasOwnProperty(t)?At(Js[t]):"transparent"===t?new Rt(NaN,NaN,NaN,0):null}function At(t){return new Rt(t>>16&255,t>>8&255,255&t,1)}function Ct(t,n,e,r){return r<=0&&(t=n=e=NaN),new Rt(t,n,e,r)}function zt(t){return t instanceof St||(t=Et(t)),t?new Rt((t=t.rgb()).r,t.g,t.b,t.opacity):new Rt}function Pt(t,n,e,r){return 1===arguments.length?zt(t):new Rt(t,n,e,null==r?1:r)}function Rt(t,n,e,r){this.r=+t,this.g=+n,this.b=+e,this.opacity=+r}function Lt(t,n,e,r){return r<=0?t=n=e=NaN:e<=0||1<=e?t=n=NaN:n<=0&&(t=NaN),new Dt(t,n,e,r)}function qt(t,n,e,r){return 1===arguments.length?function(t){if(t instanceof Dt)return new Dt(t.h,t.s,t.l,t.opacity);if(t instanceof St||(t=Et(t)),!t)return new Dt;if(t instanceof Dt)return t;var n=(t=t.rgb()).r/255,e=t.g/255,r=t.b/255,i=Math.min(n,e,r),o=Math.max(n,e,r),u=NaN,a=o-i,c=(o+i)/2;return a?(u=n===o?(e-r)/a+6*(ea&&(i=r.slice(a,i),s[c]?s[c]+=i:s[++c]=i),(n=n[0])===(e=e[0])?s[c]?s[c]+=e:s[++c]=e:(s[++c]=null,f.push({i:c,x:un(n,e)})),a=Nf.lastIndex;return ae._time&&(r=e._time),(t=e)._next):(n=e._next,e._next=null,t?t._next=n:mf=n);xf=t,Nn(r)}(),Bf=0}}function Tn(){var t=jf.now(),n=t-Yf;IfWf)throw new Error("too late; already scheduled");return e}function An(t,n){var e=Cn(t,n);if(e.state>Gf)throw new Error("too late; already started");return e}function Cn(t,n){var e=t.__transition;if(!e||!(e=e[n]))throw new Error("transition not found");return e}function zn(t,n){var e,r,i,o=t.__transition,u=!0;if(o){for(i in n=null==n?null:n+"",o)(e=o[i]).name===n?(r=e.state>Gf&&e.stateMath.abs(t[1]-C[1])?v=!0:d=!0),C=t,p=!0,Vn(),n()}function n(){var t;switch(l=C[0]-A[0],h=C[1]-A[1],y){case xl:case ml:m&&(l=Math.max(T-r,Math.min(k-a,l)),i=r+l,c=a+l),x&&(h=Math.max(N-o,Math.min(S-s,h)),u=o+h,f=s+h);break;case bl:m<0?(l=Math.max(T-r,Math.min(k-r,l)),i=r+l,c=a):0=o?c=!0:10===(n=r.charCodeAt(u++))?s=!0:13===n&&(s=!0,10===r.charCodeAt(u)&&++u),r.slice(e+1,t-1).replace(/""/g,'"')}for(;u=(o=(v+_)/2))?v=o:_=o,(f=e>=(u=(g+y)/2))?g=u:y=u,!(p=(i=p)[l=f<<1|s]))return i[l]=d,t;if(a=+t._x.call(null,p.data),c=+t._y.call(null,p.data),n===a&&e===c)return d.next=p,i?i[l]=d:t._root=d,t;for(;i=i?i[l]=new Array(4):t._root=new Array(4),(s=n>=(o=(v+_)/2))?v=o:_=o,(f=e>=(u=(g+y)/2))?g=u:y=u,(l=f<<1|s)==(h=(u<=c)<<1|o<=a););return i[h]=p,i[l]=d,t}function xe(t,n,e,r,i){this.node=t,this.x0=n,this.y0=e,this.x1=r,this.y1=i}function be(t){return t[0]}function we(t){return t[1]}function Me(t,n,e){var r=new Te(null==n?be:n,null==e?we:e,NaN,NaN,NaN,NaN);return null==t?r:r.addAll(t)}function Te(t,n,e,r,i,o){this._x=t,this._y=n,this._x0=e,this._y0=r,this._x1=i,this._y1=o,this._root=void 0}function Ne(t){for(var n={data:t.data},e=n;t=t.next;)e=e.next={data:t.data};return n}function ke(t){return t.x+t.vx}function Se(t){return t.y+t.vy}function Ee(t){return t.index}function Ae(t,n){var e=t.get(n);if(!e)throw new Error("missing: "+n);return e}function Ce(t){return t.x}function ze(t){return t.y}function Pe(t,n){if((e=(t=n?t.toExponential(n-1):t.toExponential()).indexOf("e"))<0)return null;var e,r=t.slice(0,e);return[1i+1?r.slice(0,i+1)+"."+r.slice(i+1):r+new Array(i-r.length+2).join("0")}function qe(t){return new De(t)}function De(t){if(!(n=ih.exec(t)))throw new Error("invalid format: "+t);var n,e=n[1]||" ",r=n[2]||">",i=n[3]||"-",o=n[4]||"",u=!!n[5],a=n[6]&&+n[6],c=!!n[7],s=n[8]&&+n[8].slice(1),f=n[9]||"";"n"===f?(c=!0,f="g"):rh[f]||(f=""),(u||"0"===e&&"="===r)&&(u=!0,e="0",r="="),this.fill=e,this.align=r,this.sign=i,this.symbol=o,this.zero=u,this.width=a,this.comma=c,this.precision=s,this.type=f}function Ue(t){return t}function Oe(t){function u(t){function n(t){var n,e,r,i=_,o=y;if("c"===g)o=m(t)+o,t="";else{var u=(t=+t)<0;if(t=m(Math.abs(t),v),u&&0==+t&&(u=!1),i=(u?"("===l?l:"-":"-"===l||"("===l?"":l)+i,o=("s"===g?uh[8+nh/3]:"")+o+(u&&"("===l?")":""),x)for(n=-1,e=t.length;++n>1)+i+t+o+c.slice(a);break;default:t=c+i+t+o}return M(t)}var s=(t=qe(t)).fill,f=t.align,l=t.sign,e=t.symbol,h=t.zero,p=t.width,d=t.comma,v=t.precision,g=t.type,_="$"===e?r[0]:"#"===e&&/[boxX]/.test(g)?"0"+g.toLowerCase():"",y="$"===e?r[1]:/[%p]/.test(g)?i:"",m=rh[g],x=!g||/[defgprs%]/.test(g);return v=null==v?g?6:12:/[gprs]/.test(g)?Math.max(1,Math.min(21,v)):Math.max(0,Math.min(20,v)),n.toString=function(){return t+""},n}var n,a,c,b=t.grouping&&t.thousands?(a=t.grouping,c=t.thousands,function(t,n){for(var e=t.length,r=[],i=0,o=a[0],u=0;0n));)o=a[i=(i+1)%a.length];return r.reverse().join(c)}):Ue,r=t.currency,w=t.decimal,M=t.numerals?(n=t.numerals,function(t){return t.replace(/[0-9]/g,function(t){return n[+t]})}):Ue,i=t.percent||"%";return{format:u,formatPrefix:function(t,n){var e=u(((t=qe(t)).type="f",t)),r=3*Math.max(-8,Math.min(8,Math.floor(Re(n)/3))),i=Math.pow(10,-r),o=uh[8+r/3];return function(t){return e(i*t)+o}}}}function Fe(t){return oh=Oe(t),I.format=oh.format,I.formatPrefix=oh.formatPrefix,oh}function Ie(t){return Math.max(0,-Re(Math.abs(t)))}function Ye(t,n){return Math.max(0,3*Math.max(-8,Math.min(8,Math.floor(Re(n)/3)))-Re(Math.abs(t)))}function Be(t,n){return t=Math.abs(t),n=Math.abs(n)-t,Math.max(0,Re(n)-Re(t))+1}function He(){return new je}function je(){this.reset()}function Xe(t,n,e){var r=t.s=n+e,i=r-n,o=r-i;t.t=n-o+(e-i)}function Ve(t){return 1vh&&(vh=o):s^(a*gh<(c=(c+360)%360-180)&&cyr(hh,dh)&&(dh=t):yr(t,dh)>yr(hh,dh)&&(hh=t):hh<=dh?(tyr(hh,dh)&&(dh=t):yr(t,dh)>yr(hh,dh)&&(hh=t)}else xh.push(bh=[hh=t,dh=t]);nFh&&(hh=-(dh=180)),bh[0]=hh,bh[1]=dh,mh=null}function yr(t,n){return(n-=t)<0?n+360:n}function mr(t,n){return t[0]-n[0]}function xr(t,n){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:nk}function d(t,n,e){var r=[1,0,0],i=ar(or(t),or(n)),o=ur(i,i),u=i[0],a=o-u*u;if(!a)return!e&&t;var c=k*o/a,s=-k*u/a,f=ar(r,i),l=sr(r,c);cr(l,sr(i,s));var h=f,p=ur(l,h),d=ur(h,h),v=p*p-d*(ur(l,l)-1);if(!(v<0)){var g=ep(v),_=sr(h,(-p-g)/d);if(cr(_,l),_=ir(_),!e)return _;var y,m=t[0],x=n[0],b=t[1],w=n[1];xFh;return $r(p,function(a){var c,s,f,l,h;return{lineStart:function(){l=f=!1,h=1},point:function(t,n){var e,r=[t,n],i=p(t,n),o=g?i?0:v(t,n):i?v(t+(t<0?Ih:-Ih),n):0;if(!c&&(l=f=i)&&a.lineStart(),i!==f&&(!(e=d(c,r))||Br(c,e)||Br(r,e))&&(r[0]+=Fh,r[1]+=Fh,i=p(r[0],r[1])),i!==f)h=0,i?(a.lineStart(),e=d(r,c),a.point(e[0],e[1])):(e=d(c,r),a.point(e[0],e[1]),a.lineEnd()),c=e;else if(_&&c&&g^i){var u;o&s||!(u=d(r,c,!0))||(h=0,g?(a.lineStart(),a.point(u[0][0],u[0][1]),a.point(u[1][0],u[1][1]),a.lineEnd()):(a.point(u[1][0],u[1][1]),a.lineEnd(),a.lineStart(),a.point(u[0][0],u[0][1])))}!i||c&&Br(c,r)||a.point(r[0],r[1]),c=r,f=i,s=o},lineEnd:function(){f&&a.lineEnd(),c=null},clean:function(){return h|(l&&f)<<1}}},function(t,n,e,r){Fr(r,i,o,e,t,n)},g?[0,-i]:[-Ih,i-Ih])}function Qr(_,y,m,x){function b(t,n){return _<=t&&t<=m&&y<=n&&n<=x}function w(t,n,e,r){var i=0,o=0;if(null==t||(i=u(t,e))!==(o=u(n,e))||a(t,n)<0^0Fh}).map(f)).concat(N(Gh(a/v)*v,u,v).filter(function(t){return Vh(t%_)>Fh}).map(l))}var e,r,i,o,u,a,c,s,f,l,h,p,d=10,v=d,g=90,_=360,y=2.5;return n.lines=function(){return t().map(function(t){return{type:"LineString",coordinates:t}})},n.outline=function(){return{type:"Polygon",coordinates:[h(o).concat(p(c).slice(1),h(i).reverse().slice(1),p(s).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.extentMajor(t).extentMinor(t):n.extentMinor()},n.extentMajor=function(t){return arguments.length?(o=+t[0][0],i=+t[1][0],s=+t[0][1],c=+t[1][1],id){f-=a;break}d=p}_.push(u={value:f,dice:cvg){var a=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,c=3*t._l01_a*(t._l01_a+t._l12_a);r=(r*a-t._x0*t._l12_2a+t._x2*t._l01_2a)/c,i=(i*a-t._y0*t._l12_2a+t._y2*t._l01_2a)/c}if(t._l23_a>vg){var s=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,f=3*t._l23_a*(t._l23_a+t._l12_a);o=(o*s+t._x1*t._l23_2a-n*t._l12_2a)/f,u=(u*s+t._y1*t._l23_2a-e*t._l12_2a)/f}t._context.bezierCurveTo(r,i,o,u,t._x2,t._y2)}function wc(t,n){this._context=t,this._alpha=n}function Mc(t,n){this._context=t,this._alpha=n}function Tc(t,n){this._context=t,this._alpha=n}function Nc(t){this._context=t}function kc(t){return t<0?-1:1}function Sc(t,n,e){var r=t._x1-t._x0,i=n-t._x1,o=(t._y1-t._y0)/(r||i<0&&-0),u=(e-t._y1)/(i||r<0&&-0),a=(o*i+u*r)/(r+i);return(kc(o)+kc(u))*Math.min(Math.abs(o),Math.abs(u),.5*Math.abs(a))||0}function Ec(t,n){var e=t._x1-t._x0;return e?(3*(t._y1-t._y0)/e-n)/2:n}function Ac(t,n,e){var r=t._x0,i=t._y0,o=t._x1,u=t._y1,a=(o-r)/3;t._context.bezierCurveTo(r+a,i+a*n,o-a,u-a*e,o,u)}function Cc(t){this._context=t}function zc(t){this._context=new Pc(t)}function Pc(t){this._context=t}function Rc(t){this._context=t}function Lc(t){var n,e,r=t.length-1,i=new Array(r),o=new Array(r),u=new Array(r);for(o[i[0]=0]=2,u[0]=t[0]+2*t[1],n=1;n=i)return}else c=[v,e];o=[v,i]}else{if(c){if(c[1]=i)return}else c=[(e-a)/u,e];o=[(i-a)/u,i]}else{if(c){if(c[1]=r)return}else c=[n,u*n+a];o=[r,u*r+a]}else{if(c){if(c[0]Jg)a=a.L;else{if(!((i=o-function(t,n){var e=t.N;if(e)return as(e,n);var r=t.site;return r[1]===n?r[0]:1/0}(a,u))>Jg)){-JgJg||Math.abs(i[0][1]-i[1][1])>Jg)||delete Zg[o]})(u,a,c,s),function(t,n,e,r){var i,o,u,a,c,s,f,l,h,p,d,v,g,_,y=$g.length,m=!0;for(i=0;iJg||Math.abs(v-h)>Jg)&&(c.splice(a,0,Zg.push(Gc(u,p,Math.abs(d-t)h||(o=c.y0)>p||(u=c.x1)=(a=(d+g)/2))?d=a:g=a,(f=u>=(c=(v+_)/2))?v=c:_=c,!(p=(n=p)[l=f<<1|s]))return this;if(!p.length)break;(n[l+1&3]||n[l+2&3]||n[l+3&3])&&(e=n,h=l)}for(;p.data!==t;)if(!(p=(r=p).next))return this;return(i=p.next)&&delete p.next,r?i?r.next=i:delete r.next:n?(i?n[l]=i:delete n[l],(p=n[0]||n[1]||n[2]||n[3])&&p===(n[3]||n[2]||n[1]||n[0])&&!p.length&&(e?e[h]=p:this._root=p)):this._root=i,this},th.removeAll=function(t){for(var n=0,e=t.length;n=^]))?([+\-\( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?([a-z%])?$/i;qe.prototype=De.prototype,De.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(null==this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(null==this.precision?"":"."+Math.max(0,0|this.precision))+this.type};var oh,uh=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];Fe({decimal:".",thousands:",",grouping:[3],currency:["$",""]}),je.prototype={constructor:je,reset:function(){this.s=this.t=0},add:function(t){Xe(Oh,t,this.t),Xe(this,Oh.s,this.s),this.s?this.t+=Oh.t:this.s=Oh.t},valueOf:function(){return this.s}};var ah,ch,sh,fh,lh,hh,ph,dh,vh,gh,_h,yh,mh,xh,bh,wh,Mh,Th,Nh,kh,Sh,Eh,Ah,Ch,zh,Ph,Rh,Lh,qh,Dh,Uh,Oh=new je,Fh=1e-6,Ih=Math.PI,Yh=Ih/2,Bh=Ih/4,Hh=2*Ih,jh=180/Ih,Xh=Ih/180,Vh=Math.abs,$h=Math.atan,Wh=Math.atan2,Zh=Math.cos,Gh=Math.ceil,Qh=Math.exp,Jh=Math.log,Kh=Math.pow,tp=Math.sin,np=Math.sign||function(t){return 0Fh?$h((tp(r)*(a=Zh(o))*tp(i)-tp(o)*(u=Zh(r))*tp(e))/(u*a*c)):(r+o)/2,l.point(v,d),l.lineEnd(),l.lineStart(),l.point(s,d),h=0),l.point(p=t,d=n),v=s},lineEnd:function(){l.lineEnd(),p=d=NaN},clean:function(){return 2-h}}},function(t,n,e,r){var i;if(null==t)i=e*Yh,r.point(-Ih,i),r.point(0,i),r.point(Ih,i),r.point(Ih,0),r.point(Ih,-i),r.point(0,-i),r.point(-Ih,-i),r.point(-Ih,0),r.point(-Ih,i);else if(Vh(t[0]-n[0])>Fh){var o=t[0]Fh&&0<--i);return[t/(.8707+(o=r*r)*(o*(o*o*o*(.003971-.001529*o)-.013791)-.131979)),r]},eo.invert=Vi($e),ro.invert=Vi(function(t){return 2*$h(t)}),io.invert=function(t,n){return[-n,2*$h(Qh(t))-Yh]},po.prototype=so.prototype={constructor:po,count:function(){return this.eachAfter(co)},each:function(t){var n,e,r,i,o=this,u=[o];do{for(n=u.reverse(),u=[];o=n.pop();)if(t(o),e=o.children)for(r=0,i=e.length;r=e)return null;for(var r=u-c.site[0],i=a-c.site[1],l=r*r+i*i;c=s.cells[n=f],f=null,c.halfedges.forEach(function(t){var n=s.edges[t],e=n.left;if(e!==c.site&&e||(e=n.right)){var r=u-e[0],i=a-e[1],o=r*r+i*i;oa;)c.pop(),--s;var f,l=new Array(s+1);for(n=0;n<=s;++n)(f=l[n]=[]).x0=0=v.length)return null!=p&&t.sort(p),null!=d?d(t):t;for(var n,o,u,a=-1,c=t.length,s=v[e++],f=ce(),l=r();++av.length)return t;var i,o=u[r-1];return null!=d&&r>=v.length?i=t.entries():(i=[],t.each(function(t,n){i.push({key:n,values:e(t,r)})})),null!=o?i.sort(function(t,n){return o(t.key,n.key)}):i}(h(t,0,le,he),0)},key:function(t){return v.push(t),n},sortKeys:function(t){return u[v.length-1]=t,n},sortValues:function(t){return p=t,n},rollup:function(t){return d=t,n}}},I.set=de,I.map=ce,I.keys=function(t){var n=[];for(var e in t)n.push(e);return n},I.values=function(t){var n=[];for(var e in t)n.push(t[e]);return n},I.entries=function(t){var n=[];for(var e in t)n.push({key:e,value:t[e]});return n},I.color=Et,I.rgb=Pt,I.hsl=qt,I.lab=Ft,I.hcl=Xt,I.cubehelix=$t,I.dispatch=z,I.drag=function(){function d(t){t.on("mousedown.drag",n).filter(g).on("touchstart.drag",i).on("touchmove.drag",o).on("touchend.drag touchcancel.drag",u).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function n(){if(!l&&h.apply(this,arguments)){var t=a("mouse",p.apply(this,arguments),pt,this,arguments);t&&(ct(I.event.view).on("mousemove.drag",e,!0).on("mouseup.drag",r,!0),_t(I.event.view),vt(),f=!1,c=I.event.clientX,s=I.event.clientY,t("start"))}}function e(){if(gt(),!f){var t=I.event.clientX-c,n=I.event.clientY-s;f=xl.index){var c=h-o.x-o.vx,s=p-o.y-o.vy,f=c*c+s*s;ft.r&&(t.r=t[n].r)}function e(){if(o){var t,n,e=o.length;for(u=new Array(e),t=0;tyr(r[0],r[1])&&(r[1]=i[1]),yr(i[0],r[1])>yr(r[0],r[1])&&(r[0]=i[0])):o.push(r=i);for(u=-1/0,n=0,r=o[e=o.length-1];n<=e;r=i,++n)i=o[n],(a=yr(r[1],i[0]))>u&&(u=a,hh=i[0],dh=r[1])}return xh=bh=null,hh===1/0||ph===1/0?[[NaN,NaN],[NaN,NaN]]:[[hh,ph],[dh,vh]]},I.geoCentroid=function(t){wh=Mh=Th=Nh=kh=Sh=Eh=Ah=Ch=zh=Ph=0,Ke(t,lp);var n=Ch,e=zh,r=Ph,i=n*n+e*e+r*r;return i<1e-12&&(n=Sh,e=Eh,r=Ah,Mhe.x&&(e=t),t.depth>r.depth&&(r=t)});var i=n===e?1:m(n,e)/2,o=i-n.x,u=h/(e.x+i+o),a=p/(r.depth||1);c.eachBefore(function(t){t.x=(t.x+o)*u,t.y=t.depth*a})}return c}function s(u){var t=u.children,n=u.parent.children,e=u.i?n[u.i-1]:null;if(t){!function(t){for(var n,e=0,r=0,i=u.children,o=i.length;0<=--o;)(n=i[o]).z+=e,n.m+=e,e+=n.s+(r+=n.c)}();var r=(t[0].z+t[t.length-1].z)/2;e?(u.z=e.z+m(u._,e._),u.m=u.z-r):u.z=r}else e&&(u.z=e.z+m(u._,e._));u.parent.A=function(t,n,e){if(n){for(var r,i=t,o=t,u=n,a=i.parent.children[0],c=i.m,s=o.m,f=u.m,l=a.m;u=Fo(u),i=Oo(i),u&&i;)a=Oo(a),(o=Fo(o)).a=t,0<(r=u.z+f-i.z-c+m(u._,i._))&&(_=t,y=e,h=(g=u).a.parent===_.parent?g.a:y,void 0,v=(d=r)/((p=t).i-h.i),p.c-=v,p.s+=d,h.c+=v,p.z+=d,p.m+=d,c+=r,s+=r),f+=u.m,c+=i.m,l+=a.m,s+=o.m;u&&!Fo(o)&&(o.t=u,o.m+=f-s),i&&!Oo(a)&&(a.t=i,a.m+=c-l,e=t)}var h,p,d,v,g,_,y;return e}(u,e,u.parent.A||n[0])}function f(t){t._.x=t.z+t.parent.m,t.m+=t.parent.m}function l(t){t.x*=h,t.y=t.depth*p}var m=Uo,h=1,p=1,d=null;return n.separation=function(t){return arguments.length?(m=t,n):m},n.size=function(t){return arguments.length?(d=!1,h=+t[0],p=+t[1],n):d?null:[h,p]},n.nodeSize=function(t){return arguments.length?(d=!0,h=+t[0],p=+t[1],n):d?[h,p]:null},n},I.treemap=function(){function n(t){return t.x0=t.y0=0,t.x1=i,t.y1=o,t.eachBefore(e),a=[0],r&&t.eachBefore(Ro),t}function e(t){var n=a[t.depth],e=t.x0+n,r=t.y0+n,i=t.x1-n,o=t.y1-n;i>>1;m[p]a!=avg?(y+=S*=p?1:-1,m-=S):(x=0,y=m=(f+l)/2),(b-=2*E)>vg?(g+=E*=p?1:-1,_-=E):(b=0,g=_=(f+l)/2)}var A=s*fg(g),C=s*pg(g),z=c*fg(m),P=c*pg(m);if(vgZf&&e.name===n)return new Ln([[t]],yl,n,+r);return null},I.interrupt=zn,I.voronoi=function(){function n(r){return new ss(r.map(function(t,n){var e=[Math.round(i(t,n,r)/Jg)*Jg,Math.round(o(t,n,r)/Jg)*Jg];return e.index=n,e.data=t,e}),e)}var i=Bc,o=Hc,e=null;return n.polygons=function(t){return n(t).polygons()},n.links=function(t){return n(t).links()},n.triangles=function(t){return n(t).triangles()},n.x=function(t){return arguments.length?(i="function"==typeof t?t:Yc(+t),n):i},n.y=function(t){return arguments.length?(o="function"==typeof t?t:Yc(+t),n):o},n.extent=function(t){return arguments.length?(e=null==t?null:[[+t[0][0],+t[0][1]],[+t[1][0],+t[1][1]]],n):e&&[[e[0][0],e[0][1]],[e[1][0],e[1][1]]]},n.size=function(t){return arguments.length?(e=null==t?null:[[0,0],[+t[0],+t[1]]],n):e&&[e[1][0]-e[0][0],e[1][1]-e[0][1]]},n},I.zoom=function(){function u(t){t.property("__zoom",_s).on("wheel.zoom",n).on("mousedown.zoom",e).on("dblclick.zoom",r).filter(x).on("touchstart.zoom",i).on("touchmove.zoom",c).on("touchend.zoom touchcancel.zoom",s).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function p(t,n){return(n=Math.max(b[0],Math.min(b[1],n)))===t.k?t:new ls(n,t.x,t.y)}function d(t,n,e){var r=n[0]-e[0]*t.k,i=n[1]-e[1]*t.k;return r===t.x&&i===t.y?t:new ls(t.k,r,i)}function f(t){return[(+t[0][0]+ +t[1][0])/2,(+t[0][1]+ +t[1][1])/2]}function o(t,c,s){t.on("start.zoom",function(){v(this,arguments).start()}).on("interrupt.zoom end.zoom",function(){v(this,arguments).end()}).tween("zoom",function(){var t=arguments,r=v(this,t),n=_.apply(this,t),i=s||f(n),o=Math.max(n[1][0]-n[0][0],n[1][1]-n[0][1]),e=this.__zoom,u="function"==typeof c?c.apply(this,t):c,a=T(e.invert(i).concat(o/e.k),u.invert(i).concat(o/u.k));return function(t){if(1===t)t=u;else{var n=a(t),e=o/n[2];t=new ls(e,i[0]-n[0]*e,i[1]-n[1]*e)}r.zoom(null,t)}})}function v(t,n){for(var e,r=0,i=N.length;r 0)
- resultTimeValue = hour * 3600;
- resultTimeValue += min * 60;
-
- return resultTimeValue;
-}
-
-function convertSummaryTimeToBadgeString(summaryTime) {
- var sec = (summaryTime);
- var min = (summaryTime / 60).toFixed(0);
- var hours = (summaryTime / (60 * 60)).toFixed(1);
- var days = (summaryTime / (60 * 60 * 24)).toFixed(0);
-
- if (sec < 60) {
- return sec + "s";
- } else if (min < 60) {
- return min + "m";
- } else if (hours < 24) {
- return hours + "h";
- } else {
- return days + "d"
- }
-}
-
-function convertShortSummaryTimeToString(summaryTime) {
- var hours = Math.floor(summaryTime / 3600);
- var totalSeconds = summaryTime % 3600;
- var mins = Math.floor(totalSeconds / 60);
-
- hours = zeroAppend(hours);
- mins = zeroAppend(mins);
-
- return hours + 'h : ' + mins + 'm';
-}
-
-function convertShortSummaryTimeToLongString(summaryTime) {
- var hours = Math.floor(summaryTime / 3600);
- var totalSeconds = summaryTime % 3600;
- var mins = Math.floor(totalSeconds / 60);
-
- hours = zeroAppend(hours);
- mins = zeroAppend(mins);
-
- return `${hours} hour ${mins} minutes`;
-}
-
-function getArrayTime(summaryTime) {
- var days = Math.floor(summaryTime / 3600 / 24);
- var totalHours = summaryTime % (3600 * 24);
- var hours = Math.floor(totalHours / 3600);
- var totalSeconds = summaryTime % 3600;
- var mins = Math.floor(totalSeconds / 60);
- var seconds = totalSeconds % 60;
-
- days = zeroAppend(days);
- hours = zeroAppend(hours);
- mins = zeroAppend(mins);
- seconds = zeroAppend(seconds);
-
- return {
- 'days': days,
- 'hours': hours,
- 'mins': mins,
- 'seconds': seconds
- };
-}
-
-function convertSummaryTimeToString(summaryTime) {
- var days = Math.floor(summaryTime / 3600 / 24);
- var totalHours = summaryTime % (3600 * 24);
- var hours = Math.floor(totalHours / 3600);
- var totalSeconds = summaryTime % 3600;
- var mins = Math.floor(totalSeconds / 60);
- var seconds = totalSeconds % 60;
-
- hours = zeroAppend(hours);
- mins = zeroAppend(mins);
- seconds = zeroAppend(seconds);
-
- if (days > 0)
- return days + 'd ' + hours + 'h ' + mins + 'm ' + seconds + 's';
- else return hours + 'h ' + mins + 'm ' + seconds + 's';
-}
-
-function zeroAppend(time) {
- if (time < 10)
- return '0' + time;
- else return time;
-}
-
-function isDateInRange(dateStr, range) {
- return new Date(dateStr) >= range.from && new Date(dateStr) <= range.to;
-}
-
-function isCorrectDate(range) {
- return range.from.getFullYear() >= 2019 && range.to.getFullYear() >= 2019;
-}
-
-function getDateFromRange(range) {
- switch (range) {
- case 'days2':
- return 2;
- case 'days3':
- return 3;
- case 'days4':
- return 4;
- case 'days5':
- return 5;
- case 'days6':
- return 6;
- case 'days7':
- return 7;
- case 'month1':
- return 30;
- case 'month2':
- return 60;
- case 'month3':
- return 90;
- }
-}
-
-function isDomainEquals(first, second) {
- if (first === second)
- return true;
- else {
- var resultUrl = function(url) {
- if (url.indexOf('www.') > -1)
- return url.split('www.')[1];
- return url;
- };
-
- if (resultUrl(first) === resultUrl(second))
- return true;
- else return false;
- }
-}
-
-function extractHostname(url) {
- var hostname;
-
- if (url.indexOf("//") > -1) {
- hostname = url.split('/')[2];
- }
- else {
- hostname = url.split('/')[0];
- }
-
- hostname = hostname.split(':')[0];
- hostname = hostname.split('?')[0];
-
- return hostname;
-}
-
-function treatAsUTC(date) {
- var result = new Date(date);
- result.setMinutes(result.getMinutes() - result.getTimezoneOffset());
- return result;
-}
-
-function daysBetween(startDate, endDate) {
- var millisecondsPerDay = 24 * 60 * 60 * 1000;
- return ((treatAsUTC(endDate) - treatAsUTC(startDate)) / millisecondsPerDay) + 1;
-}
-
-function todayLocalDate(){
- return new Date().toLocaleDateString('en-US');
-}
\ No newline at end of file
diff --git a/src/scripts/picker/clockpicker.min.js b/src/scripts/picker/clockpicker.min.js
deleted file mode 100644
index 5283942..0000000
--- a/src/scripts/picker/clockpicker.min.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(){var P,t,i,e,x=window.jQuery,o=x(window),S=x(document),s="http://www.w3.org/2000/svg",E="SVGAngle"in window&&((i=document.createElement("div")).innerHTML="",t=(i.firstChild&&i.firstChild.namespaceURI)==s,i.innerHTML="",t),c="transition"in(e=document.createElement("div").style)||"WebkitTransition"in e||"MozTransition"in e||"msTransition"in e||"OTransition"in e,n="ontouchstart"in window,D="mousedown"+(n?" touchstart":""),I="mousemove.clockpicker"+(n?" touchmove.clockpicker":""),B="mouseup.clockpicker"+(n?" touchend.clockpicker":""),d=navigator.vibrate?"vibrate":navigator.webkitVibrate?"webkitVibrate":null;function z(t){return document.createElementNS(s,t)}function O(t){return(t<10?"0":"")+t}var j=0;var L=100,U=80,W=13,N=c?350:1,X=['','
','
',''," : ",'','',"
",'
","
"].join("");function a(t,h){var i,e,s=x(X),u=s.find(".clockpicker-plate"),o=s.find(".clockpicker-hours"),c=s.find(".clockpicker-minutes"),n=s.find(".clockpicker-am-pm-block"),a="INPUT"===t.prop("tagName"),r=a?t:t.find("input"),p=t.find(".input-group-addon"),k=this;if(this.id=(e=++j+"",(i="cp")?i+e:e),this.element=t,this.options=h,this.isAppended=!1,this.isShown=!1,this.currentView="hours",this.isInput=a,this.input=r,this.addon=p,this.popover=s,this.plate=u,this.hoursView=o,this.minutesView=c,this.amPmBlock=n,this.spanHours=s.find(".clockpicker-span-hours"),this.spanMinutes=s.find(".clockpicker-span-minutes"),this.spanAmPm=s.find(".clockpicker-span-am-pm"),this.amOrPm="PM",h.twelvehour){var l=['','",'","
"].join("");x(l);x('').on("click",function(){k.amOrPm="AM",x(".clockpicker-span-am-pm").empty().append("AM")}).appendTo(this.amPmBlock),x('').on("click",function(){k.amOrPm="PM",x(".clockpicker-span-am-pm").empty().append("PM")}).appendTo(this.amPmBlock)}h.autoclose||x('").click(x.proxy(this.done,this)).appendTo(s),"top"!==h.placement&&"bottom"!==h.placement||"top"!==h.align&&"bottom"!==h.align||(h.align="left"),"left"!==h.placement&&"right"!==h.placement||"left"!==h.align&&"right"!==h.align||(h.align="top"),s.addClass(h.placement),s.addClass("clockpicker-align-"+h.align),this.spanHours.click(x.proxy(this.toggleView,this,"hours")),this.spanMinutes.click(x.proxy(this.toggleView,this,"minutes")),r.on("focus.clockpicker click.clockpicker",x.proxy(this.show,this)),p.on("click.clockpicker",x.proxy(this.toggle,this));var d,f,v,m,b=x('');if(h.twelvehour)for(d=1;d<13;d+=1)f=b.clone(),v=d/6*Math.PI,m=U,f.css("font-size","120%"),f.css({left:L+Math.sin(v)*m-W,top:L-Math.cos(v)*m-W}),f.html(0===d?"00":d),o.append(f),f.on(D,w);else for(d=0;d<24;d+=1){f=b.clone(),v=d/6*Math.PI;var g=0=0&&n0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b="sizzle"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n+~]|"+M+")"+M+"*"),z=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),X=new RegExp(W),U=new RegExp("^"+R+"$"),V={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+P+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},G=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Q=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","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(){p()},ie=me(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{L.apply(A=H.call(w.childNodes),w.childNodes),A[w.childNodes.length].nodeType}catch(e){L={apply:A.length?function(e,t){q.apply(e,H.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,s,l,c,f,h,v,m=t&&t.ownerDocument,T=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==T&&9!==T&&11!==T)return r;if(!i&&((t?t.ownerDocument||t:w)!==d&&p(t),t=t||d,g)){if(11!==T&&(f=J.exec(e)))if(o=f[1]){if(9===T){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&x(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return L.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return L.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!S[e+" "]&&(!y||!y.test(e))){if(1!==T)m=t,v=e;else if("object"!==t.nodeName.toLowerCase()){(c=t.getAttribute("id"))?c=c.replace(te,ne):t.setAttribute("id",c=b),s=(h=a(e)).length;while(s--)h[s]="#"+c+" "+ve(h[s]);v=h.join(","),m=K.test(e)&&ge(t.parentNode)||t}if(v)try{return L.apply(r,m.querySelectorAll(v)),r}catch(e){}finally{c===b&&t.removeAttribute("id")}}}return u(e.replace(B,"$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 se(e){return e[b]=!0,e}function ue(e){var t=d.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 pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function de(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 se(function(t){return t=+t,se(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},p=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==d&&9===a.nodeType&&a.documentElement?(d=a,h=d.documentElement,g=!o(d),w!==d&&(i=d.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=ue(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ue(function(e){return e.appendChild(d.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=Q.test(d.getElementsByClassName),n.getById=ue(function(e){return h.appendChild(e).id=b,!d.getElementsByName||!d.getElementsByName(b).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)},v=[],y=[],(n.qsa=Q.test(d.querySelectorAll))&&(ue(function(e){h.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+P+")"),e.querySelectorAll("[id~="+b+"-]").length||y.push("~="),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||y.push(".#.+[+~]")}),ue(function(e){e.innerHTML="";var t=d.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(n.matchesSelector=Q.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),v.push("!=",W)}),y=y.length&&new RegExp(y.join("|")),v=v.length&&new RegExp(v.join("|")),t=Q.test(h.compareDocumentPosition),x=t||Q.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},D=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===d||e.ownerDocument===w&&x(w,e)?-1:t===d||t.ownerDocument===w&&x(w,t)?1:c?O(c,e)-O(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],s=[t];if(!i||!o)return e===d?-1:t===d?1:i?-1:o?1:c?O(c,e)-O(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)s.unshift(n);while(a[r]===s[r])r++;return r?ce(a[r],s[r]):a[r]===w?-1:s[r]===w?1:0},d):d},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&p(e),t=t.replace(z,"='$1']"),n.matchesSelector&&g&&!S[t+" "]&&(!v||!v.test(t))&&(!y||!y.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,d,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==d&&p(e),x(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==d&&p(e);var i=r.attrHandle[t.toLowerCase()],o=i&&N.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(D),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:se,match:V,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 V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.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("(^|"+M+")"+e+"("+M+"|$)"))&&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($," ")+" ").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),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==a?"nextSibling":"previousSibling",y=t.parentNode,v=s&&t.nodeName.toLowerCase(),m=!u&&!s,x=!1;if(y){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?y.firstChild:y.lastChild],a&&m){x=(d=(l=(c=(f=(p=y)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1])&&l[2],p=d&&y.childNodes[d];while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if(1===p.nodeType&&++x&&p===t){c[e]=[T,d,x];break}}else if(m&&(x=d=(l=(c=(f=(p=t)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1]),!1===x)while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===v:1===p.nodeType)&&++x&&(m&&((c=(f=p[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]=[T,x]),p===t))break;return(x-=i)===r||x%r==0&&x/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[b]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?se(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=O(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:se(function(e){var t=[],n=[],r=s(e.replace(B,"$1"));return r[b]?se(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:se(function(e){return function(t){return oe(e,t).length>0}}),contains:se(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:se(function(e){return U.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===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:de(!1),disabled:de(!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 G.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 be(e,t,n){for(var r=0,i=t.length;r-1&&(o[l]=!(a[l]=f))}}else v=we(v===a?v.splice(h,v.length):v),i?i(null,a,v,u):L.apply(a,v)})}function Ce(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.relative[" "],u=a?1:0,c=me(function(e){return e===t},s,!0),f=me(function(e){return O(t,e)>-1},s,!0),p=[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}];u1&&xe(p),u>1&&ve(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(B,"$1"),n,u0,i=e.length>0,o=function(o,a,s,u,c){var f,h,y,v=0,m="0",x=o&&[],b=[],w=l,C=o||i&&r.find.TAG("*",c),E=T+=null==w?1:Math.random()||.1,k=C.length;for(c&&(l=a===d||a||c);m!==k&&null!=(f=C[m]);m++){if(i&&f){h=0,a||f.ownerDocument===d||(p(f),s=!g);while(y=e[h++])if(y(f,a||d,s)){u.push(f);break}c&&(T=E)}n&&((f=!y&&f)&&v--,o&&x.push(f))}if(v+=m,n&&m!==v){h=0;while(y=t[h++])y(x,b,a,s);if(o){if(v>0)while(m--)x[m]||b[m]||(b[m]=j.call(u));b=we(b)}L.apply(u,b),c&&!o&&b.length>0&&v+t.length>1&&oe.uniqueSort(u)}return c&&(T=E,l=w),x};return n?se(o):o}return s=oe.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Ce(t[n]))[b]?r.push(o):i.push(o);(o=S(e,Ee(i,r))).selector=e}return o},u=oe.select=function(e,t,n,i){var o,u,l,c,f,p="function"==typeof e&&e,d=!i&&a(e=p.selector||e);if(n=n||[],1===d.length){if((u=d[0]=d[0].slice(0)).length>2&&"ID"===(l=u[0]).type&&9===t.nodeType&&g&&r.relative[u[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(u.shift().value.length)}o=V.needsContext.test(e)?0:u.length;while(o--){if(l=u[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),K.test(u[0].type)&&ge(t.parentNode)||t))){if(u.splice(o,1),!(e=i.length&&ve(u)))return L.apply(n,i),n;break}}}return(p||s(e,d))(i,t,!g,n,!t||K.test(e)&&ge(t.parentNode)||t),n},n.sortStable=b.split("").sort(D).join("")===b,n.detectDuplicates=!!f,p(),n.sortDetached=ue(function(e){return 1&e.compareDocumentPosition(d.createElement("fieldset"))}),ue(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&&ue(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}),ue(function(e){return null==e.getAttribute("disabled")})||le(P,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 k=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},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},D=w.expr.match.needsContext;function N(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var A=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(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 u.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(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&D.test(e)?w(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:L.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)),A.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,q=w(r);var H=/^(?:parents|prev(?:Until|All))/,O={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?u.call(w(e),this[0]):u.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 P(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 k(e,"parentNode")},parentsUntil:function(e,t,n){return k(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return k(e,"nextSibling")},prevAll:function(e){return k(e,"previousSibling")},nextUntil:function(e,t,n){return k(e,"nextSibling",n)},prevUntil:function(e,t,n){return k(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return N(e,"iframe")?e.contentDocument:(N(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&&(O[e]||w.uniqueSort(i),H.test(e)&&i.reverse()),this.pushStack(i)}});var M=/[^\x20\t\r\n\f]+/g;function R(e){var t={};return w.each(e.match(M)||[],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=[],s=-1,u=function(){for(i=i||e.once,r=t=!0;a.length;s=-1){n=a.shift();while(++s-1)o.splice(n,1),n<=s&&s--}),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||u()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function I(e){return e}function W(e){throw e}function $(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 s=this,u=arguments,l=function(){var e,l;if(!(t=o&&(r!==W&&(s=void 0,u=[e]),n.rejectWith(s,u))}};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:I,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:I)),n[2][3].add(a(0,e,g(r)?r:W))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],s=t[5];i[t[1]]=a.add,s&&a.add(function(){r=s},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(),s=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&&($(e,a.done(s(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)$(i[n],s(n),a.reject);return a.promise()}});var B=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&B.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 _(){r.removeEventListener("DOMContentLoaded",_),e.removeEventListener("load",_),w.ready()}"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener("DOMContentLoaded",_),e.addEventListener("load",_));var z=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n)){i=!0;for(s in n)z(e,t,s,n[s],!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(;s1,null,!0)},removeData:function(e){return this.each(function(){K.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=J.get(e,t),n&&(!r||Array.isArray(n)?r=J.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 J.get(e,n)||J.access(e,n,{empty:w.Callbacks("once memory").add(function(){J.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 ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&N(e,t)?w.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ye(f.appendChild(o),"script"),l&&ve(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 be=r.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function ke(){return!1}function Se(){try{return r.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)De(e,s,n,r,t[s],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=ke;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,s,u,l,c,f,p,d,h,g,y=J.get(e);if(y){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(be,i),n.guid||(n.guid=w.guid++),(u=y.events)||(u=y.events={}),(a=y.handle)||(a=y.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(M)||[""]).length;while(l--)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),w.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.hasData(e)&&J.get(e);if(y&&(u=y.events)){l=(t=(t||"").match(M)||[""]).length;while(l--)if(s=Ce.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){f=w.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||w.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)w.event.remove(e,d+t[l],n,r,!0);w.isEmptyObject(u)&&J.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,s,u=new Array(arguments.length),l=(J.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(u[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&&s.push({elem:l,handlers:o})}return l=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,Ae=/