diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..6f40582 --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,15 @@ +/* eslint-env node */ +require('@rushstack/eslint-patch/modern-module-resolution') + +module.exports = { + root: true, + 'extends': [ + 'plugin:vue/vue3-essential', + 'eslint:recommended', + '@vue/eslint-config-typescript', + '@vue/eslint-config-prettier/skip-formatting' + ], + parserOptions: { + ecmaVersion: 'latest' + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..38adffa --- /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 +.DS_Store +dist +dist-ssr +coverage +*.local + +/cypress/videos/ +/cypress/screenshots/ + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..ecdf3e0 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://json.schemastore.org/prettierrc", + "semi": false, + "tabWidth": 2, + "singleQuote": true, + "printWidth": 100, + "trailingComma": "none" +} diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..c0a6e5a --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"] +} diff --git a/components.d.ts b/components.d.ts new file mode 100644 index 0000000..62272de --- /dev/null +++ b/components.d.ts @@ -0,0 +1,73 @@ +/* eslint-disable */ +/* prettier-ignore */ +// @ts-nocheck +// Generated by unplugin-vue-components +// Read more: https://github.com/vuejs/core/pull/3399 +export {} + +declare module 'vue' { + export interface GlobalComponents { + AButton: typeof import('ant-design-vue/es')['Button'] + AConfigProvider: typeof import('ant-design-vue/es')['ConfigProvider'] + ADivider: typeof import('ant-design-vue/es')['Divider'] + AForm: typeof import('ant-design-vue/es')['Form'] + AFormItem: typeof import('ant-design-vue/es')['FormItem'] + AInput: typeof import('ant-design-vue/es')['Input'] + AInputPassword: typeof import('ant-design-vue/es')['InputPassword'] + AModal: typeof import('ant-design-vue/es')['Modal'] + ARadio: typeof import('ant-design-vue/es')['Radio'] + ARadioButton: typeof import('ant-design-vue/es')['RadioButton'] + ARadioGroup: typeof import('ant-design-vue/es')['RadioGroup'] + ASelect: typeof import('ant-design-vue/es')['Select'] + ASelectOption: typeof import('ant-design-vue/es')['SelectOption'] + ASlider: typeof import('ant-design-vue/es')['Slider'] + ASpin: typeof import('ant-design-vue/es')['Spin'] + ASwitch: typeof import('ant-design-vue/es')['Switch'] + ATag: typeof import('ant-design-vue/es')['Tag'] + ATextarea: typeof import('ant-design-vue/es')['Textarea'] + ATooltip: typeof import('ant-design-vue/es')['Tooltip'] + BaseDatePicker: typeof import('./src/components/BasicPacks/BaseDatePicker/src/BaseDatePicker.vue')['default'] + Basic: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/basic.vue')['default'] + BasicActionSheet: typeof import('./src/components/BasicPacks/BasicActionSheet.vue')['default'] + BasicButton: typeof import('./src/components/BasicPacks/BasicButton.vue')['default'] + BasicDraggableFileUpload: typeof import('./src/components/BasicPacks/BasicUploads/BasicDraggableFileUpload.vue')['default'] + BasicIcon: typeof import('./src/components/BasicPacks/BasicIcon.vue')['default'] + BasicInfoItem: typeof import('./src/components/BasicPacks/BasicInfoItem.vue')['default'] + BasicInput: typeof import('./src/components/BasicPacks/BasicInput.vue')['default'] + BasicModal: typeof import('./src/components/BasicPacks/BasicModal.vue')['default'] + BasicPriceInput: typeof import('./src/components/BasicPacks/BasicPriceInput/src/BasicPriceInput.vue')['default'] + BasicSelect: typeof import('./src/components/BasicPacks/BasicSelect.vue')['default'] + BasicTags: typeof import('./src/components/BasicPacks/BasicTags/index.vue')['default'] + BasicTextArea: typeof import('./src/components/BasicPacks/BasicTextArea.vue')['default'] + BasicToggleTwoItem: typeof import('./src/components/BasicPacks/BasicToggleTwoItem.vue')['default'] + Bg_main: typeof import('./src/components/bg_main.vue')['default'] + Bordered: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/bordered.vue')['default'] + DateRender: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/date-render.vue')['default'] + Demo: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/index.vue')['default'] + DialogVant: typeof import('./src/components/DialogVant.vue')['default'] + DialogVantOneButton: typeof import('./src/components/DialogVantOneButton.vue')['default'] + Disabled: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/disabled.vue')['default'] + DisabledDate: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/disabled-date.vue')['default'] + Empty: typeof import('./src/components/empty.vue')['default'] + ExtraFooter: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/extra-footer.vue')['default'] + Format: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/format.vue')['default'] + GoldLoading: typeof import('./src/components/GoldLoading.vue')['default'] + ListAnim: typeof import('./src/components/ListAnim.vue')['default'] + Mode: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/mode.vue')['default'] + PresettedRanges: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/presetted-ranges.vue')['default'] + RangePicker: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/range-picker.vue')['default'] + RouterLink: typeof import('vue-router')['RouterLink'] + RouterView: typeof import('vue-router')['RouterView'] + SelectInRange: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/select-in-range.vue')['default'] + Size: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/size.vue')['default'] + StartEnd: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/start-end.vue')['default'] + Suffix: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/suffix.vue')['default'] + Switchable: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/switchable.vue')['default'] + Text: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/text.vue')['default'] + Time: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/time.vue')['default'] + TransactionSkeleton: typeof import('./src/components/TransactionSkeleton.vue')['default'] + VanActionSheet: typeof import('vant/es')['ActionSheet'] + VanDialog: typeof import('vant/es')['Dialog'] + VanField: typeof import('vant/es')['Field'] + } +} diff --git a/dev-dist/registerSW.js b/dev-dist/registerSW.js new file mode 100644 index 0000000..1d5625f --- /dev/null +++ b/dev-dist/registerSW.js @@ -0,0 +1 @@ +if('serviceWorker' in navigator) navigator.serviceWorker.register('/dev-sw.js?dev-sw', { scope: '/', type: 'classic' }) \ No newline at end of file diff --git a/dev-dist/sw.js b/dev-dist/sw.js new file mode 100644 index 0000000..dec19de --- /dev/null +++ b/dev-dist/sw.js @@ -0,0 +1,92 @@ +/** + * Copyright 2018 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// If the loader is already loaded, just stop. +if (!self.define) { + let registry = {}; + + // Used for `eval` and `importScripts` where we can't get script URL by other means. + // In both cases, it's safe to use a global var because those functions are synchronous. + let nextDefineUri; + + const singleRequire = (uri, parentUri) => { + uri = new URL(uri + ".js", parentUri).href; + return registry[uri] || ( + + new Promise(resolve => { + if ("document" in self) { + const script = document.createElement("script"); + script.src = uri; + script.onload = resolve; + document.head.appendChild(script); + } else { + nextDefineUri = uri; + importScripts(uri); + resolve(); + } + }) + + .then(() => { + let promise = registry[uri]; + if (!promise) { + throw new Error(`Module ${uri} didn’t register its module`); + } + return promise; + }) + ); + }; + + self.define = (depsNames, factory) => { + const uri = nextDefineUri || ("document" in self ? document.currentScript.src : "") || location.href; + if (registry[uri]) { + // Module is already loading or loaded. + return; + } + let exports = {}; + const require = depUri => singleRequire(depUri, uri); + const specialDeps = { + module: { uri }, + exports, + require + }; + registry[uri] = Promise.all(depsNames.map( + depName => specialDeps[depName] || require(depName) + )).then(deps => { + factory(...deps); + return exports; + }); + }; +} +define(['./workbox-5357ef54'], (function (workbox) { 'use strict'; + + self.skipWaiting(); + workbox.clientsClaim(); + + /** + * The precacheAndRoute() method efficiently caches and responds to + * requests for URLs in the manifest. + * See https://goo.gl/S9QRab + */ + workbox.precacheAndRoute([{ + "url": "registerSW.js", + "revision": "3ca0b8505b4bec776b69afdba2768812" + }, { + "url": "index.html", + "revision": "0.ngs50rhul88" + }], {}); + workbox.cleanupOutdatedCaches(); + workbox.registerRoute(new workbox.NavigationRoute(workbox.createHandlerBoundToURL("index.html"), { + allowlist: [/^\/$/] + })); + +})); diff --git a/dev-dist/workbox-4bbaac62.js b/dev-dist/workbox-4bbaac62.js new file mode 100644 index 0000000..62f106f --- /dev/null +++ b/dev-dist/workbox-4bbaac62.js @@ -0,0 +1,3394 @@ +define(['exports'], (function (exports) { 'use strict'; + + // @ts-ignore + try { + self['workbox:core:7.0.0'] && _(); + } catch (e) {} + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Claim any currently available clients once the service worker + * becomes active. This is normally used in conjunction with `skipWaiting()`. + * + * @memberof workbox-core + */ + function clientsClaim() { + self.addEventListener('activate', () => self.clients.claim()); + } + + /* + Copyright 2019 Google LLC + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const logger = (() => { + // Don't overwrite this value if it's already set. + // See https://github.com/GoogleChrome/workbox/pull/2284#issuecomment-560470923 + if (!('__WB_DISABLE_DEV_LOGS' in globalThis)) { + self.__WB_DISABLE_DEV_LOGS = false; + } + let inGroup = false; + const methodToColorMap = { + debug: `#7f8c8d`, + log: `#2ecc71`, + warn: `#f39c12`, + error: `#c0392b`, + groupCollapsed: `#3498db`, + groupEnd: null // No colored prefix on groupEnd + }; + + const print = function (method, args) { + if (self.__WB_DISABLE_DEV_LOGS) { + return; + } + if (method === 'groupCollapsed') { + // Safari doesn't print all console.groupCollapsed() arguments: + // https://bugs.webkit.org/show_bug.cgi?id=182754 + if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) { + console[method](...args); + return; + } + } + const styles = [`background: ${methodToColorMap[method]}`, `border-radius: 0.5em`, `color: white`, `font-weight: bold`, `padding: 2px 0.5em`]; + // When in a group, the workbox prefix is not displayed. + const logPrefix = inGroup ? [] : ['%cworkbox', styles.join(';')]; + console[method](...logPrefix, ...args); + if (method === 'groupCollapsed') { + inGroup = true; + } + if (method === 'groupEnd') { + inGroup = false; + } + }; + // eslint-disable-next-line @typescript-eslint/ban-types + const api = {}; + const loggerMethods = Object.keys(methodToColorMap); + for (const key of loggerMethods) { + const method = key; + api[method] = (...args) => { + print(method, args); + }; + } + return api; + })(); + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const messages = { + 'invalid-value': ({ + paramName, + validValueDescription, + value + }) => { + if (!paramName || !validValueDescription) { + throw new Error(`Unexpected input to 'invalid-value' error.`); + } + return `The '${paramName}' parameter was given a value with an ` + `unexpected value. ${validValueDescription} Received a value of ` + `${JSON.stringify(value)}.`; + }, + 'not-an-array': ({ + moduleName, + className, + funcName, + paramName + }) => { + if (!moduleName || !className || !funcName || !paramName) { + throw new Error(`Unexpected input to 'not-an-array' error.`); + } + return `The parameter '${paramName}' passed into ` + `'${moduleName}.${className}.${funcName}()' must be an array.`; + }, + 'incorrect-type': ({ + expectedType, + paramName, + moduleName, + className, + funcName + }) => { + if (!expectedType || !paramName || !moduleName || !funcName) { + throw new Error(`Unexpected input to 'incorrect-type' error.`); + } + const classNameStr = className ? `${className}.` : ''; + return `The parameter '${paramName}' passed into ` + `'${moduleName}.${classNameStr}` + `${funcName}()' must be of type ${expectedType}.`; + }, + 'incorrect-class': ({ + expectedClassName, + paramName, + moduleName, + className, + funcName, + isReturnValueProblem + }) => { + if (!expectedClassName || !moduleName || !funcName) { + throw new Error(`Unexpected input to 'incorrect-class' error.`); + } + const classNameStr = className ? `${className}.` : ''; + if (isReturnValueProblem) { + return `The return value from ` + `'${moduleName}.${classNameStr}${funcName}()' ` + `must be an instance of class ${expectedClassName}.`; + } + return `The parameter '${paramName}' passed into ` + `'${moduleName}.${classNameStr}${funcName}()' ` + `must be an instance of class ${expectedClassName}.`; + }, + 'missing-a-method': ({ + expectedMethod, + paramName, + moduleName, + className, + funcName + }) => { + if (!expectedMethod || !paramName || !moduleName || !className || !funcName) { + throw new Error(`Unexpected input to 'missing-a-method' error.`); + } + return `${moduleName}.${className}.${funcName}() expected the ` + `'${paramName}' parameter to expose a '${expectedMethod}' method.`; + }, + 'add-to-cache-list-unexpected-type': ({ + entry + }) => { + return `An unexpected entry was passed to ` + `'workbox-precaching.PrecacheController.addToCacheList()' The entry ` + `'${JSON.stringify(entry)}' isn't supported. You must supply an array of ` + `strings with one or more characters, objects with a url property or ` + `Request objects.`; + }, + 'add-to-cache-list-conflicting-entries': ({ + firstEntry, + secondEntry + }) => { + if (!firstEntry || !secondEntry) { + throw new Error(`Unexpected input to ` + `'add-to-cache-list-duplicate-entries' error.`); + } + return `Two of the entries passed to ` + `'workbox-precaching.PrecacheController.addToCacheList()' had the URL ` + `${firstEntry} but different revision details. Workbox is ` + `unable to cache and version the asset correctly. Please remove one ` + `of the entries.`; + }, + 'plugin-error-request-will-fetch': ({ + thrownErrorMessage + }) => { + if (!thrownErrorMessage) { + throw new Error(`Unexpected input to ` + `'plugin-error-request-will-fetch', error.`); + } + return `An error was thrown by a plugins 'requestWillFetch()' method. ` + `The thrown error message was: '${thrownErrorMessage}'.`; + }, + 'invalid-cache-name': ({ + cacheNameId, + value + }) => { + if (!cacheNameId) { + throw new Error(`Expected a 'cacheNameId' for error 'invalid-cache-name'`); + } + return `You must provide a name containing at least one character for ` + `setCacheDetails({${cacheNameId}: '...'}). Received a value of ` + `'${JSON.stringify(value)}'`; + }, + 'unregister-route-but-not-found-with-method': ({ + method + }) => { + if (!method) { + throw new Error(`Unexpected input to ` + `'unregister-route-but-not-found-with-method' error.`); + } + return `The route you're trying to unregister was not previously ` + `registered for the method type '${method}'.`; + }, + 'unregister-route-route-not-registered': () => { + return `The route you're trying to unregister was not previously ` + `registered.`; + }, + 'queue-replay-failed': ({ + name + }) => { + return `Replaying the background sync queue '${name}' failed.`; + }, + 'duplicate-queue-name': ({ + name + }) => { + return `The Queue name '${name}' is already being used. ` + `All instances of backgroundSync.Queue must be given unique names.`; + }, + 'expired-test-without-max-age': ({ + methodName, + paramName + }) => { + return `The '${methodName}()' method can only be used when the ` + `'${paramName}' is used in the constructor.`; + }, + 'unsupported-route-type': ({ + moduleName, + className, + funcName, + paramName + }) => { + return `The supplied '${paramName}' parameter was an unsupported type. ` + `Please check the docs for ${moduleName}.${className}.${funcName} for ` + `valid input types.`; + }, + 'not-array-of-class': ({ + value, + expectedClass, + moduleName, + className, + funcName, + paramName + }) => { + return `The supplied '${paramName}' parameter must be an array of ` + `'${expectedClass}' objects. Received '${JSON.stringify(value)},'. ` + `Please check the call to ${moduleName}.${className}.${funcName}() ` + `to fix the issue.`; + }, + 'max-entries-or-age-required': ({ + moduleName, + className, + funcName + }) => { + return `You must define either config.maxEntries or config.maxAgeSeconds` + `in ${moduleName}.${className}.${funcName}`; + }, + 'statuses-or-headers-required': ({ + moduleName, + className, + funcName + }) => { + return `You must define either config.statuses or config.headers` + `in ${moduleName}.${className}.${funcName}`; + }, + 'invalid-string': ({ + moduleName, + funcName, + paramName + }) => { + if (!paramName || !moduleName || !funcName) { + throw new Error(`Unexpected input to 'invalid-string' error.`); + } + return `When using strings, the '${paramName}' parameter must start with ` + `'http' (for cross-origin matches) or '/' (for same-origin matches). ` + `Please see the docs for ${moduleName}.${funcName}() for ` + `more info.`; + }, + 'channel-name-required': () => { + return `You must provide a channelName to construct a ` + `BroadcastCacheUpdate instance.`; + }, + 'invalid-responses-are-same-args': () => { + return `The arguments passed into responsesAreSame() appear to be ` + `invalid. Please ensure valid Responses are used.`; + }, + 'expire-custom-caches-only': () => { + return `You must provide a 'cacheName' property when using the ` + `expiration plugin with a runtime caching strategy.`; + }, + 'unit-must-be-bytes': ({ + normalizedRangeHeader + }) => { + if (!normalizedRangeHeader) { + throw new Error(`Unexpected input to 'unit-must-be-bytes' error.`); + } + return `The 'unit' portion of the Range header must be set to 'bytes'. ` + `The Range header provided was "${normalizedRangeHeader}"`; + }, + 'single-range-only': ({ + normalizedRangeHeader + }) => { + if (!normalizedRangeHeader) { + throw new Error(`Unexpected input to 'single-range-only' error.`); + } + return `Multiple ranges are not supported. Please use a single start ` + `value, and optional end value. The Range header provided was ` + `"${normalizedRangeHeader}"`; + }, + 'invalid-range-values': ({ + normalizedRangeHeader + }) => { + if (!normalizedRangeHeader) { + throw new Error(`Unexpected input to 'invalid-range-values' error.`); + } + return `The Range header is missing both start and end values. At least ` + `one of those values is needed. The Range header provided was ` + `"${normalizedRangeHeader}"`; + }, + 'no-range-header': () => { + return `No Range header was found in the Request provided.`; + }, + 'range-not-satisfiable': ({ + size, + start, + end + }) => { + return `The start (${start}) and end (${end}) values in the Range are ` + `not satisfiable by the cached response, which is ${size} bytes.`; + }, + 'attempt-to-cache-non-get-request': ({ + url, + method + }) => { + return `Unable to cache '${url}' because it is a '${method}' request and ` + `only 'GET' requests can be cached.`; + }, + 'cache-put-with-no-response': ({ + url + }) => { + return `There was an attempt to cache '${url}' but the response was not ` + `defined.`; + }, + 'no-response': ({ + url, + error + }) => { + let message = `The strategy could not generate a response for '${url}'.`; + if (error) { + message += ` The underlying error is ${error}.`; + } + return message; + }, + 'bad-precaching-response': ({ + url, + status + }) => { + return `The precaching request for '${url}' failed` + (status ? ` with an HTTP status of ${status}.` : `.`); + }, + 'non-precached-url': ({ + url + }) => { + return `createHandlerBoundToURL('${url}') was called, but that URL is ` + `not precached. Please pass in a URL that is precached instead.`; + }, + 'add-to-cache-list-conflicting-integrities': ({ + url + }) => { + return `Two of the entries passed to ` + `'workbox-precaching.PrecacheController.addToCacheList()' had the URL ` + `${url} with different integrity values. Please remove one of them.`; + }, + 'missing-precache-entry': ({ + cacheName, + url + }) => { + return `Unable to find a precached response in ${cacheName} for ${url}.`; + }, + 'cross-origin-copy-response': ({ + origin + }) => { + return `workbox-core.copyResponse() can only be used with same-origin ` + `responses. It was passed a response with origin ${origin}.`; + }, + 'opaque-streams-source': ({ + type + }) => { + const message = `One of the workbox-streams sources resulted in an ` + `'${type}' response.`; + if (type === 'opaqueredirect') { + return `${message} Please do not use a navigation request that results ` + `in a redirect as a source.`; + } + return `${message} Please ensure your sources are CORS-enabled.`; + } + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const generatorFunction = (code, details = {}) => { + const message = messages[code]; + if (!message) { + throw new Error(`Unable to find message for code '${code}'.`); + } + return message(details); + }; + const messageGenerator = generatorFunction; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Workbox errors should be thrown with this class. + * This allows use to ensure the type easily in tests, + * helps developers identify errors from workbox + * easily and allows use to optimise error + * messages correctly. + * + * @private + */ + class WorkboxError extends Error { + /** + * + * @param {string} errorCode The error code that + * identifies this particular error. + * @param {Object=} details Any relevant arguments + * that will help developers identify issues should + * be added as a key on the context object. + */ + constructor(errorCode, details) { + const message = messageGenerator(errorCode, details); + super(message); + this.name = errorCode; + this.details = details; + } + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /* + * This method throws if the supplied value is not an array. + * The destructed values are required to produce a meaningful error for users. + * The destructed and restructured object is so it's clear what is + * needed. + */ + const isArray = (value, details) => { + if (!Array.isArray(value)) { + throw new WorkboxError('not-an-array', details); + } + }; + const hasMethod = (object, expectedMethod, details) => { + const type = typeof object[expectedMethod]; + if (type !== 'function') { + details['expectedMethod'] = expectedMethod; + throw new WorkboxError('missing-a-method', details); + } + }; + const isType = (object, expectedType, details) => { + if (typeof object !== expectedType) { + details['expectedType'] = expectedType; + throw new WorkboxError('incorrect-type', details); + } + }; + const isInstance = (object, + // Need the general type to do the check later. + // eslint-disable-next-line @typescript-eslint/ban-types + expectedClass, details) => { + if (!(object instanceof expectedClass)) { + details['expectedClassName'] = expectedClass.name; + throw new WorkboxError('incorrect-class', details); + } + }; + const isOneOf = (value, validValues, details) => { + if (!validValues.includes(value)) { + details['validValueDescription'] = `Valid values are ${JSON.stringify(validValues)}.`; + throw new WorkboxError('invalid-value', details); + } + }; + const isArrayOfClass = (value, + // Need general type to do check later. + expectedClass, + // eslint-disable-line + details) => { + const error = new WorkboxError('not-array-of-class', details); + if (!Array.isArray(value)) { + throw error; + } + for (const item of value) { + if (!(item instanceof expectedClass)) { + throw error; + } + } + }; + const finalAssertExports = { + hasMethod, + isArray, + isInstance, + isOneOf, + isType, + isArrayOfClass + }; + + // @ts-ignore + try { + self['workbox:routing:7.0.0'] && _(); + } catch (e) {} + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * The default HTTP method, 'GET', used when there's no specific method + * configured for a route. + * + * @type {string} + * + * @private + */ + const defaultMethod = 'GET'; + /** + * The list of valid HTTP methods associated with requests that could be routed. + * + * @type {Array} + * + * @private + */ + const validMethods = ['DELETE', 'GET', 'HEAD', 'PATCH', 'POST', 'PUT']; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * @param {function()|Object} handler Either a function, or an object with a + * 'handle' method. + * @return {Object} An object with a handle method. + * + * @private + */ + const normalizeHandler = handler => { + if (handler && typeof handler === 'object') { + { + finalAssertExports.hasMethod(handler, 'handle', { + moduleName: 'workbox-routing', + className: 'Route', + funcName: 'constructor', + paramName: 'handler' + }); + } + return handler; + } else { + { + finalAssertExports.isType(handler, 'function', { + moduleName: 'workbox-routing', + className: 'Route', + funcName: 'constructor', + paramName: 'handler' + }); + } + return { + handle: handler + }; + } + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * A `Route` consists of a pair of callback functions, "match" and "handler". + * The "match" callback determine if a route should be used to "handle" a + * request by returning a non-falsy value if it can. The "handler" callback + * is called when there is a match and should return a Promise that resolves + * to a `Response`. + * + * @memberof workbox-routing + */ + class Route { + /** + * Constructor for Route class. + * + * @param {workbox-routing~matchCallback} match + * A callback function that determines whether the route matches a given + * `fetch` event by returning a non-falsy value. + * @param {workbox-routing~handlerCallback} handler A callback + * function that returns a Promise resolving to a Response. + * @param {string} [method='GET'] The HTTP method to match the Route + * against. + */ + constructor(match, handler, method = defaultMethod) { + { + finalAssertExports.isType(match, 'function', { + moduleName: 'workbox-routing', + className: 'Route', + funcName: 'constructor', + paramName: 'match' + }); + if (method) { + finalAssertExports.isOneOf(method, validMethods, { + paramName: 'method' + }); + } + } + // These values are referenced directly by Router so cannot be + // altered by minificaton. + this.handler = normalizeHandler(handler); + this.match = match; + this.method = method; + } + /** + * + * @param {workbox-routing-handlerCallback} handler A callback + * function that returns a Promise resolving to a Response + */ + setCatchHandler(handler) { + this.catchHandler = normalizeHandler(handler); + } + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * RegExpRoute makes it easy to create a regular expression based + * {@link workbox-routing.Route}. + * + * For same-origin requests the RegExp only needs to match part of the URL. For + * requests against third-party servers, you must define a RegExp that matches + * the start of the URL. + * + * @memberof workbox-routing + * @extends workbox-routing.Route + */ + class RegExpRoute extends Route { + /** + * If the regular expression contains + * [capture groups]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#grouping-back-references}, + * the captured values will be passed to the + * {@link workbox-routing~handlerCallback} `params` + * argument. + * + * @param {RegExp} regExp The regular expression to match against URLs. + * @param {workbox-routing~handlerCallback} handler A callback + * function that returns a Promise resulting in a Response. + * @param {string} [method='GET'] The HTTP method to match the Route + * against. + */ + constructor(regExp, handler, method) { + { + finalAssertExports.isInstance(regExp, RegExp, { + moduleName: 'workbox-routing', + className: 'RegExpRoute', + funcName: 'constructor', + paramName: 'pattern' + }); + } + const match = ({ + url + }) => { + const result = regExp.exec(url.href); + // Return immediately if there's no match. + if (!result) { + return; + } + // Require that the match start at the first character in the URL string + // if it's a cross-origin request. + // See https://github.com/GoogleChrome/workbox/issues/281 for the context + // behind this behavior. + if (url.origin !== location.origin && result.index !== 0) { + { + logger.debug(`The regular expression '${regExp.toString()}' only partially matched ` + `against the cross-origin URL '${url.toString()}'. RegExpRoute's will only ` + `handle cross-origin requests if they match the entire URL.`); + } + return; + } + // If the route matches, but there aren't any capture groups defined, then + // this will return [], which is truthy and therefore sufficient to + // indicate a match. + // If there are capture groups, then it will return their values. + return result.slice(1); + }; + super(match, handler, method); + } + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const getFriendlyURL = url => { + const urlObj = new URL(String(url), location.href); + // See https://github.com/GoogleChrome/workbox/issues/2323 + // We want to include everything, except for the origin if it's same-origin. + return urlObj.href.replace(new RegExp(`^${location.origin}`), ''); + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * The Router can be used to process a `FetchEvent` using one or more + * {@link workbox-routing.Route}, responding with a `Response` if + * a matching route exists. + * + * If no route matches a given a request, the Router will use a "default" + * handler if one is defined. + * + * Should the matching Route throw an error, the Router will use a "catch" + * handler if one is defined to gracefully deal with issues and respond with a + * Request. + * + * If a request matches multiple routes, the **earliest** registered route will + * be used to respond to the request. + * + * @memberof workbox-routing + */ + class Router { + /** + * Initializes a new Router. + */ + constructor() { + this._routes = new Map(); + this._defaultHandlerMap = new Map(); + } + /** + * @return {Map>} routes A `Map` of HTTP + * method name ('GET', etc.) to an array of all the corresponding `Route` + * instances that are registered. + */ + get routes() { + return this._routes; + } + /** + * Adds a fetch event listener to respond to events when a route matches + * the event's request. + */ + addFetchListener() { + // See https://github.com/Microsoft/TypeScript/issues/28357#issuecomment-436484705 + self.addEventListener('fetch', event => { + const { + request + } = event; + const responsePromise = this.handleRequest({ + request, + event + }); + if (responsePromise) { + event.respondWith(responsePromise); + } + }); + } + /** + * Adds a message event listener for URLs to cache from the window. + * This is useful to cache resources loaded on the page prior to when the + * service worker started controlling it. + * + * The format of the message data sent from the window should be as follows. + * Where the `urlsToCache` array may consist of URL strings or an array of + * URL string + `requestInit` object (the same as you'd pass to `fetch()`). + * + * ``` + * { + * type: 'CACHE_URLS', + * payload: { + * urlsToCache: [ + * './script1.js', + * './script2.js', + * ['./script3.js', {mode: 'no-cors'}], + * ], + * }, + * } + * ``` + */ + addCacheListener() { + // See https://github.com/Microsoft/TypeScript/issues/28357#issuecomment-436484705 + self.addEventListener('message', event => { + // event.data is type 'any' + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + if (event.data && event.data.type === 'CACHE_URLS') { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + const { + payload + } = event.data; + { + logger.debug(`Caching URLs from the window`, payload.urlsToCache); + } + const requestPromises = Promise.all(payload.urlsToCache.map(entry => { + if (typeof entry === 'string') { + entry = [entry]; + } + const request = new Request(...entry); + return this.handleRequest({ + request, + event + }); + // TODO(philipwalton): TypeScript errors without this typecast for + // some reason (probably a bug). The real type here should work but + // doesn't: `Array | undefined>`. + })); // TypeScript + event.waitUntil(requestPromises); + // If a MessageChannel was used, reply to the message on success. + if (event.ports && event.ports[0]) { + void requestPromises.then(() => event.ports[0].postMessage(true)); + } + } + }); + } + /** + * Apply the routing rules to a FetchEvent object to get a Response from an + * appropriate Route's handler. + * + * @param {Object} options + * @param {Request} options.request The request to handle. + * @param {ExtendableEvent} options.event The event that triggered the + * request. + * @return {Promise|undefined} A promise is returned if a + * registered route can handle the request. If there is no matching + * route and there's no `defaultHandler`, `undefined` is returned. + */ + handleRequest({ + request, + event + }) { + { + finalAssertExports.isInstance(request, Request, { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'handleRequest', + paramName: 'options.request' + }); + } + const url = new URL(request.url, location.href); + if (!url.protocol.startsWith('http')) { + { + logger.debug(`Workbox Router only supports URLs that start with 'http'.`); + } + return; + } + const sameOrigin = url.origin === location.origin; + const { + params, + route + } = this.findMatchingRoute({ + event, + request, + sameOrigin, + url + }); + let handler = route && route.handler; + const debugMessages = []; + { + if (handler) { + debugMessages.push([`Found a route to handle this request:`, route]); + if (params) { + debugMessages.push([`Passing the following params to the route's handler:`, params]); + } + } + } + // If we don't have a handler because there was no matching route, then + // fall back to defaultHandler if that's defined. + const method = request.method; + if (!handler && this._defaultHandlerMap.has(method)) { + { + debugMessages.push(`Failed to find a matching route. Falling ` + `back to the default handler for ${method}.`); + } + handler = this._defaultHandlerMap.get(method); + } + if (!handler) { + { + // No handler so Workbox will do nothing. If logs is set of debug + // i.e. verbose, we should print out this information. + logger.debug(`No route found for: ${getFriendlyURL(url)}`); + } + return; + } + { + // We have a handler, meaning Workbox is going to handle the route. + // print the routing details to the console. + logger.groupCollapsed(`Router is responding to: ${getFriendlyURL(url)}`); + debugMessages.forEach(msg => { + if (Array.isArray(msg)) { + logger.log(...msg); + } else { + logger.log(msg); + } + }); + logger.groupEnd(); + } + // Wrap in try and catch in case the handle method throws a synchronous + // error. It should still callback to the catch handler. + let responsePromise; + try { + responsePromise = handler.handle({ + url, + request, + event, + params + }); + } catch (err) { + responsePromise = Promise.reject(err); + } + // Get route's catch handler, if it exists + const catchHandler = route && route.catchHandler; + if (responsePromise instanceof Promise && (this._catchHandler || catchHandler)) { + responsePromise = responsePromise.catch(async err => { + // If there's a route catch handler, process that first + if (catchHandler) { + { + // Still include URL here as it will be async from the console group + // and may not make sense without the URL + logger.groupCollapsed(`Error thrown when responding to: ` + ` ${getFriendlyURL(url)}. Falling back to route's Catch Handler.`); + logger.error(`Error thrown by:`, route); + logger.error(err); + logger.groupEnd(); + } + try { + return await catchHandler.handle({ + url, + request, + event, + params + }); + } catch (catchErr) { + if (catchErr instanceof Error) { + err = catchErr; + } + } + } + if (this._catchHandler) { + { + // Still include URL here as it will be async from the console group + // and may not make sense without the URL + logger.groupCollapsed(`Error thrown when responding to: ` + ` ${getFriendlyURL(url)}. Falling back to global Catch Handler.`); + logger.error(`Error thrown by:`, route); + logger.error(err); + logger.groupEnd(); + } + return this._catchHandler.handle({ + url, + request, + event + }); + } + throw err; + }); + } + return responsePromise; + } + /** + * Checks a request and URL (and optionally an event) against the list of + * registered routes, and if there's a match, returns the corresponding + * route along with any params generated by the match. + * + * @param {Object} options + * @param {URL} options.url + * @param {boolean} options.sameOrigin The result of comparing `url.origin` + * against the current origin. + * @param {Request} options.request The request to match. + * @param {Event} options.event The corresponding event. + * @return {Object} An object with `route` and `params` properties. + * They are populated if a matching route was found or `undefined` + * otherwise. + */ + findMatchingRoute({ + url, + sameOrigin, + request, + event + }) { + const routes = this._routes.get(request.method) || []; + for (const route of routes) { + let params; + // route.match returns type any, not possible to change right now. + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + const matchResult = route.match({ + url, + sameOrigin, + request, + event + }); + if (matchResult) { + { + // Warn developers that using an async matchCallback is almost always + // not the right thing to do. + if (matchResult instanceof Promise) { + logger.warn(`While routing ${getFriendlyURL(url)}, an async ` + `matchCallback function was used. Please convert the ` + `following route to use a synchronous matchCallback function:`, route); + } + } + // See https://github.com/GoogleChrome/workbox/issues/2079 + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + params = matchResult; + if (Array.isArray(params) && params.length === 0) { + // Instead of passing an empty array in as params, use undefined. + params = undefined; + } else if (matchResult.constructor === Object && + // eslint-disable-line + Object.keys(matchResult).length === 0) { + // Instead of passing an empty object in as params, use undefined. + params = undefined; + } else if (typeof matchResult === 'boolean') { + // For the boolean value true (rather than just something truth-y), + // don't set params. + // See https://github.com/GoogleChrome/workbox/pull/2134#issuecomment-513924353 + params = undefined; + } + // Return early if have a match. + return { + route, + params + }; + } + } + // If no match was found above, return and empty object. + return {}; + } + /** + * Define a default `handler` that's called when no routes explicitly + * match the incoming request. + * + * Each HTTP method ('GET', 'POST', etc.) gets its own default handler. + * + * Without a default handler, unmatched requests will go against the + * network as if there were no service worker present. + * + * @param {workbox-routing~handlerCallback} handler A callback + * function that returns a Promise resulting in a Response. + * @param {string} [method='GET'] The HTTP method to associate with this + * default handler. Each method has its own default. + */ + setDefaultHandler(handler, method = defaultMethod) { + this._defaultHandlerMap.set(method, normalizeHandler(handler)); + } + /** + * If a Route throws an error while handling a request, this `handler` + * will be called and given a chance to provide a response. + * + * @param {workbox-routing~handlerCallback} handler A callback + * function that returns a Promise resulting in a Response. + */ + setCatchHandler(handler) { + this._catchHandler = normalizeHandler(handler); + } + /** + * Registers a route with the router. + * + * @param {workbox-routing.Route} route The route to register. + */ + registerRoute(route) { + { + finalAssertExports.isType(route, 'object', { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'registerRoute', + paramName: 'route' + }); + finalAssertExports.hasMethod(route, 'match', { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'registerRoute', + paramName: 'route' + }); + finalAssertExports.isType(route.handler, 'object', { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'registerRoute', + paramName: 'route' + }); + finalAssertExports.hasMethod(route.handler, 'handle', { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'registerRoute', + paramName: 'route.handler' + }); + finalAssertExports.isType(route.method, 'string', { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'registerRoute', + paramName: 'route.method' + }); + } + if (!this._routes.has(route.method)) { + this._routes.set(route.method, []); + } + // Give precedence to all of the earlier routes by adding this additional + // route to the end of the array. + this._routes.get(route.method).push(route); + } + /** + * Unregisters a route with the router. + * + * @param {workbox-routing.Route} route The route to unregister. + */ + unregisterRoute(route) { + if (!this._routes.has(route.method)) { + throw new WorkboxError('unregister-route-but-not-found-with-method', { + method: route.method + }); + } + const routeIndex = this._routes.get(route.method).indexOf(route); + if (routeIndex > -1) { + this._routes.get(route.method).splice(routeIndex, 1); + } else { + throw new WorkboxError('unregister-route-route-not-registered'); + } + } + } + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + let defaultRouter; + /** + * Creates a new, singleton Router instance if one does not exist. If one + * does already exist, that instance is returned. + * + * @private + * @return {Router} + */ + const getOrCreateDefaultRouter = () => { + if (!defaultRouter) { + defaultRouter = new Router(); + // The helpers that use the default Router assume these listeners exist. + defaultRouter.addFetchListener(); + defaultRouter.addCacheListener(); + } + return defaultRouter; + }; + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Easily register a RegExp, string, or function with a caching + * strategy to a singleton Router instance. + * + * This method will generate a Route for you if needed and + * call {@link workbox-routing.Router#registerRoute}. + * + * @param {RegExp|string|workbox-routing.Route~matchCallback|workbox-routing.Route} capture + * If the capture param is a `Route`, all other arguments will be ignored. + * @param {workbox-routing~handlerCallback} [handler] A callback + * function that returns a Promise resulting in a Response. This parameter + * is required if `capture` is not a `Route` object. + * @param {string} [method='GET'] The HTTP method to match the Route + * against. + * @return {workbox-routing.Route} The generated `Route`. + * + * @memberof workbox-routing + */ + function registerRoute(capture, handler, method) { + let route; + if (typeof capture === 'string') { + const captureUrl = new URL(capture, location.href); + { + if (!(capture.startsWith('/') || capture.startsWith('http'))) { + throw new WorkboxError('invalid-string', { + moduleName: 'workbox-routing', + funcName: 'registerRoute', + paramName: 'capture' + }); + } + // We want to check if Express-style wildcards are in the pathname only. + // TODO: Remove this log message in v4. + const valueToCheck = capture.startsWith('http') ? captureUrl.pathname : capture; + // See https://github.com/pillarjs/path-to-regexp#parameters + const wildcards = '[*:?+]'; + if (new RegExp(`${wildcards}`).exec(valueToCheck)) { + logger.debug(`The '$capture' parameter contains an Express-style wildcard ` + `character (${wildcards}). Strings are now always interpreted as ` + `exact matches; use a RegExp for partial or wildcard matches.`); + } + } + const matchCallback = ({ + url + }) => { + { + if (url.pathname === captureUrl.pathname && url.origin !== captureUrl.origin) { + logger.debug(`${capture} only partially matches the cross-origin URL ` + `${url.toString()}. This route will only handle cross-origin requests ` + `if they match the entire URL.`); + } + } + return url.href === captureUrl.href; + }; + // If `capture` is a string then `handler` and `method` must be present. + route = new Route(matchCallback, handler, method); + } else if (capture instanceof RegExp) { + // If `capture` is a `RegExp` then `handler` and `method` must be present. + route = new RegExpRoute(capture, handler, method); + } else if (typeof capture === 'function') { + // If `capture` is a function then `handler` and `method` must be present. + route = new Route(capture, handler, method); + } else if (capture instanceof Route) { + route = capture; + } else { + throw new WorkboxError('unsupported-route-type', { + moduleName: 'workbox-routing', + funcName: 'registerRoute', + paramName: 'capture' + }); + } + const defaultRouter = getOrCreateDefaultRouter(); + defaultRouter.registerRoute(route); + return route; + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const _cacheNameDetails = { + googleAnalytics: 'googleAnalytics', + precache: 'precache-v2', + prefix: 'workbox', + runtime: 'runtime', + suffix: typeof registration !== 'undefined' ? registration.scope : '' + }; + const _createCacheName = cacheName => { + return [_cacheNameDetails.prefix, cacheName, _cacheNameDetails.suffix].filter(value => value && value.length > 0).join('-'); + }; + const eachCacheNameDetail = fn => { + for (const key of Object.keys(_cacheNameDetails)) { + fn(key); + } + }; + const cacheNames = { + updateDetails: details => { + eachCacheNameDetail(key => { + if (typeof details[key] === 'string') { + _cacheNameDetails[key] = details[key]; + } + }); + }, + getGoogleAnalyticsName: userCacheName => { + return userCacheName || _createCacheName(_cacheNameDetails.googleAnalytics); + }, + getPrecacheName: userCacheName => { + return userCacheName || _createCacheName(_cacheNameDetails.precache); + }, + getPrefix: () => { + return _cacheNameDetails.prefix; + }, + getRuntimeName: userCacheName => { + return userCacheName || _createCacheName(_cacheNameDetails.runtime); + }, + getSuffix: () => { + return _cacheNameDetails.suffix; + } + }; + + /* + Copyright 2020 Google LLC + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * A utility method that makes it easier to use `event.waitUntil` with + * async functions and return the result. + * + * @param {ExtendableEvent} event + * @param {Function} asyncFn + * @return {Function} + * @private + */ + function waitUntil(event, asyncFn) { + const returnPromise = asyncFn(); + event.waitUntil(returnPromise); + return returnPromise; + } + + // @ts-ignore + try { + self['workbox:precaching:7.0.0'] && _(); + } catch (e) {} + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + // Name of the search parameter used to store revision info. + const REVISION_SEARCH_PARAM = '__WB_REVISION__'; + /** + * Converts a manifest entry into a versioned URL suitable for precaching. + * + * @param {Object|string} entry + * @return {string} A URL with versioning info. + * + * @private + * @memberof workbox-precaching + */ + function createCacheKey(entry) { + if (!entry) { + throw new WorkboxError('add-to-cache-list-unexpected-type', { + entry + }); + } + // If a precache manifest entry is a string, it's assumed to be a versioned + // URL, like '/app.abcd1234.js'. Return as-is. + if (typeof entry === 'string') { + const urlObject = new URL(entry, location.href); + return { + cacheKey: urlObject.href, + url: urlObject.href + }; + } + const { + revision, + url + } = entry; + if (!url) { + throw new WorkboxError('add-to-cache-list-unexpected-type', { + entry + }); + } + // If there's just a URL and no revision, then it's also assumed to be a + // versioned URL. + if (!revision) { + const urlObject = new URL(url, location.href); + return { + cacheKey: urlObject.href, + url: urlObject.href + }; + } + // Otherwise, construct a properly versioned URL using the custom Workbox + // search parameter along with the revision info. + const cacheKeyURL = new URL(url, location.href); + const originalURL = new URL(url, location.href); + cacheKeyURL.searchParams.set(REVISION_SEARCH_PARAM, revision); + return { + cacheKey: cacheKeyURL.href, + url: originalURL.href + }; + } + + /* + Copyright 2020 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * A plugin, designed to be used with PrecacheController, to determine the + * of assets that were updated (or not updated) during the install event. + * + * @private + */ + class PrecacheInstallReportPlugin { + constructor() { + this.updatedURLs = []; + this.notUpdatedURLs = []; + this.handlerWillStart = async ({ + request, + state + }) => { + // TODO: `state` should never be undefined... + if (state) { + state.originalRequest = request; + } + }; + this.cachedResponseWillBeUsed = async ({ + event, + state, + cachedResponse + }) => { + if (event.type === 'install') { + if (state && state.originalRequest && state.originalRequest instanceof Request) { + // TODO: `state` should never be undefined... + const url = state.originalRequest.url; + if (cachedResponse) { + this.notUpdatedURLs.push(url); + } else { + this.updatedURLs.push(url); + } + } + } + return cachedResponse; + }; + } + } + + /* + Copyright 2020 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * A plugin, designed to be used with PrecacheController, to translate URLs into + * the corresponding cache key, based on the current revision info. + * + * @private + */ + class PrecacheCacheKeyPlugin { + constructor({ + precacheController + }) { + this.cacheKeyWillBeUsed = async ({ + request, + params + }) => { + // Params is type any, can't change right now. + /* eslint-disable */ + const cacheKey = (params === null || params === void 0 ? void 0 : params.cacheKey) || this._precacheController.getCacheKeyForURL(request.url); + /* eslint-enable */ + return cacheKey ? new Request(cacheKey, { + headers: request.headers + }) : request; + }; + this._precacheController = precacheController; + } + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * @param {string} groupTitle + * @param {Array} deletedURLs + * + * @private + */ + const logGroup = (groupTitle, deletedURLs) => { + logger.groupCollapsed(groupTitle); + for (const url of deletedURLs) { + logger.log(url); + } + logger.groupEnd(); + }; + /** + * @param {Array} deletedURLs + * + * @private + * @memberof workbox-precaching + */ + function printCleanupDetails(deletedURLs) { + const deletionCount = deletedURLs.length; + if (deletionCount > 0) { + logger.groupCollapsed(`During precaching cleanup, ` + `${deletionCount} cached ` + `request${deletionCount === 1 ? ' was' : 's were'} deleted.`); + logGroup('Deleted Cache Requests', deletedURLs); + logger.groupEnd(); + } + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * @param {string} groupTitle + * @param {Array} urls + * + * @private + */ + function _nestedGroup(groupTitle, urls) { + if (urls.length === 0) { + return; + } + logger.groupCollapsed(groupTitle); + for (const url of urls) { + logger.log(url); + } + logger.groupEnd(); + } + /** + * @param {Array} urlsToPrecache + * @param {Array} urlsAlreadyPrecached + * + * @private + * @memberof workbox-precaching + */ + function printInstallDetails(urlsToPrecache, urlsAlreadyPrecached) { + const precachedCount = urlsToPrecache.length; + const alreadyPrecachedCount = urlsAlreadyPrecached.length; + if (precachedCount || alreadyPrecachedCount) { + let message = `Precaching ${precachedCount} file${precachedCount === 1 ? '' : 's'}.`; + if (alreadyPrecachedCount > 0) { + message += ` ${alreadyPrecachedCount} ` + `file${alreadyPrecachedCount === 1 ? ' is' : 's are'} already cached.`; + } + logger.groupCollapsed(message); + _nestedGroup(`View newly precached URLs.`, urlsToPrecache); + _nestedGroup(`View previously precached URLs.`, urlsAlreadyPrecached); + logger.groupEnd(); + } + } + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + let supportStatus; + /** + * A utility function that determines whether the current browser supports + * constructing a new `Response` from a `response.body` stream. + * + * @return {boolean} `true`, if the current browser can successfully + * construct a `Response` from a `response.body` stream, `false` otherwise. + * + * @private + */ + function canConstructResponseFromBodyStream() { + if (supportStatus === undefined) { + const testResponse = new Response(''); + if ('body' in testResponse) { + try { + new Response(testResponse.body); + supportStatus = true; + } catch (error) { + supportStatus = false; + } + } + supportStatus = false; + } + return supportStatus; + } + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Allows developers to copy a response and modify its `headers`, `status`, + * or `statusText` values (the values settable via a + * [`ResponseInit`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Response/Response#Syntax} + * object in the constructor). + * To modify these values, pass a function as the second argument. That + * function will be invoked with a single object with the response properties + * `{headers, status, statusText}`. The return value of this function will + * be used as the `ResponseInit` for the new `Response`. To change the values + * either modify the passed parameter(s) and return it, or return a totally + * new object. + * + * This method is intentionally limited to same-origin responses, regardless of + * whether CORS was used or not. + * + * @param {Response} response + * @param {Function} modifier + * @memberof workbox-core + */ + async function copyResponse(response, modifier) { + let origin = null; + // If response.url isn't set, assume it's cross-origin and keep origin null. + if (response.url) { + const responseURL = new URL(response.url); + origin = responseURL.origin; + } + if (origin !== self.location.origin) { + throw new WorkboxError('cross-origin-copy-response', { + origin + }); + } + const clonedResponse = response.clone(); + // Create a fresh `ResponseInit` object by cloning the headers. + const responseInit = { + headers: new Headers(clonedResponse.headers), + status: clonedResponse.status, + statusText: clonedResponse.statusText + }; + // Apply any user modifications. + const modifiedResponseInit = modifier ? modifier(responseInit) : responseInit; + // Create the new response from the body stream and `ResponseInit` + // modifications. Note: not all browsers support the Response.body stream, + // so fall back to reading the entire body into memory as a blob. + const body = canConstructResponseFromBodyStream() ? clonedResponse.body : await clonedResponse.blob(); + return new Response(body, modifiedResponseInit); + } + + /* + Copyright 2020 Google LLC + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + function stripParams(fullURL, ignoreParams) { + const strippedURL = new URL(fullURL); + for (const param of ignoreParams) { + strippedURL.searchParams.delete(param); + } + return strippedURL.href; + } + /** + * Matches an item in the cache, ignoring specific URL params. This is similar + * to the `ignoreSearch` option, but it allows you to ignore just specific + * params (while continuing to match on the others). + * + * @private + * @param {Cache} cache + * @param {Request} request + * @param {Object} matchOptions + * @param {Array} ignoreParams + * @return {Promise} + */ + async function cacheMatchIgnoreParams(cache, request, ignoreParams, matchOptions) { + const strippedRequestURL = stripParams(request.url, ignoreParams); + // If the request doesn't include any ignored params, match as normal. + if (request.url === strippedRequestURL) { + return cache.match(request, matchOptions); + } + // Otherwise, match by comparing keys + const keysOptions = Object.assign(Object.assign({}, matchOptions), { + ignoreSearch: true + }); + const cacheKeys = await cache.keys(request, keysOptions); + for (const cacheKey of cacheKeys) { + const strippedCacheKeyURL = stripParams(cacheKey.url, ignoreParams); + if (strippedRequestURL === strippedCacheKeyURL) { + return cache.match(cacheKey, matchOptions); + } + } + return; + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * The Deferred class composes Promises in a way that allows for them to be + * resolved or rejected from outside the constructor. In most cases promises + * should be used directly, but Deferreds can be necessary when the logic to + * resolve a promise must be separate. + * + * @private + */ + class Deferred { + /** + * Creates a promise and exposes its resolve and reject functions as methods. + */ + constructor() { + this.promise = new Promise((resolve, reject) => { + this.resolve = resolve; + this.reject = reject; + }); + } + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + // Callbacks to be executed whenever there's a quota error. + // Can't change Function type right now. + // eslint-disable-next-line @typescript-eslint/ban-types + const quotaErrorCallbacks = new Set(); + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Runs all of the callback functions, one at a time sequentially, in the order + * in which they were registered. + * + * @memberof workbox-core + * @private + */ + async function executeQuotaErrorCallbacks() { + { + logger.log(`About to run ${quotaErrorCallbacks.size} ` + `callbacks to clean up caches.`); + } + for (const callback of quotaErrorCallbacks) { + await callback(); + { + logger.log(callback, 'is complete.'); + } + } + { + logger.log('Finished running callbacks.'); + } + } + + /* + Copyright 2019 Google LLC + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Returns a promise that resolves and the passed number of milliseconds. + * This utility is an async/await-friendly version of `setTimeout`. + * + * @param {number} ms + * @return {Promise} + * @private + */ + function timeout(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); + } + + // @ts-ignore + try { + self['workbox:strategies:7.0.0'] && _(); + } catch (e) {} + + /* + Copyright 2020 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + function toRequest(input) { + return typeof input === 'string' ? new Request(input) : input; + } + /** + * A class created every time a Strategy instance instance calls + * {@link workbox-strategies.Strategy~handle} or + * {@link workbox-strategies.Strategy~handleAll} that wraps all fetch and + * cache actions around plugin callbacks and keeps track of when the strategy + * is "done" (i.e. all added `event.waitUntil()` promises have resolved). + * + * @memberof workbox-strategies + */ + class StrategyHandler { + /** + * Creates a new instance associated with the passed strategy and event + * that's handling the request. + * + * The constructor also initializes the state that will be passed to each of + * the plugins handling this request. + * + * @param {workbox-strategies.Strategy} strategy + * @param {Object} options + * @param {Request|string} options.request A request to run this strategy for. + * @param {ExtendableEvent} options.event The event associated with the + * request. + * @param {URL} [options.url] + * @param {*} [options.params] The return value from the + * {@link workbox-routing~matchCallback} (if applicable). + */ + constructor(strategy, options) { + this._cacheKeys = {}; + /** + * The request the strategy is performing (passed to the strategy's + * `handle()` or `handleAll()` method). + * @name request + * @instance + * @type {Request} + * @memberof workbox-strategies.StrategyHandler + */ + /** + * The event associated with this request. + * @name event + * @instance + * @type {ExtendableEvent} + * @memberof workbox-strategies.StrategyHandler + */ + /** + * A `URL` instance of `request.url` (if passed to the strategy's + * `handle()` or `handleAll()` method). + * Note: the `url` param will be present if the strategy was invoked + * from a workbox `Route` object. + * @name url + * @instance + * @type {URL|undefined} + * @memberof workbox-strategies.StrategyHandler + */ + /** + * A `param` value (if passed to the strategy's + * `handle()` or `handleAll()` method). + * Note: the `param` param will be present if the strategy was invoked + * from a workbox `Route` object and the + * {@link workbox-routing~matchCallback} returned + * a truthy value (it will be that value). + * @name params + * @instance + * @type {*|undefined} + * @memberof workbox-strategies.StrategyHandler + */ + { + finalAssertExports.isInstance(options.event, ExtendableEvent, { + moduleName: 'workbox-strategies', + className: 'StrategyHandler', + funcName: 'constructor', + paramName: 'options.event' + }); + } + Object.assign(this, options); + this.event = options.event; + this._strategy = strategy; + this._handlerDeferred = new Deferred(); + this._extendLifetimePromises = []; + // Copy the plugins list (since it's mutable on the strategy), + // so any mutations don't affect this handler instance. + this._plugins = [...strategy.plugins]; + this._pluginStateMap = new Map(); + for (const plugin of this._plugins) { + this._pluginStateMap.set(plugin, {}); + } + this.event.waitUntil(this._handlerDeferred.promise); + } + /** + * Fetches a given request (and invokes any applicable plugin callback + * methods) using the `fetchOptions` (for non-navigation requests) and + * `plugins` defined on the `Strategy` object. + * + * The following plugin lifecycle methods are invoked when using this method: + * - `requestWillFetch()` + * - `fetchDidSucceed()` + * - `fetchDidFail()` + * + * @param {Request|string} input The URL or request to fetch. + * @return {Promise} + */ + async fetch(input) { + const { + event + } = this; + let request = toRequest(input); + if (request.mode === 'navigate' && event instanceof FetchEvent && event.preloadResponse) { + const possiblePreloadResponse = await event.preloadResponse; + if (possiblePreloadResponse) { + { + logger.log(`Using a preloaded navigation response for ` + `'${getFriendlyURL(request.url)}'`); + } + return possiblePreloadResponse; + } + } + // If there is a fetchDidFail plugin, we need to save a clone of the + // original request before it's either modified by a requestWillFetch + // plugin or before the original request's body is consumed via fetch(). + const originalRequest = this.hasCallback('fetchDidFail') ? request.clone() : null; + try { + for (const cb of this.iterateCallbacks('requestWillFetch')) { + request = await cb({ + request: request.clone(), + event + }); + } + } catch (err) { + if (err instanceof Error) { + throw new WorkboxError('plugin-error-request-will-fetch', { + thrownErrorMessage: err.message + }); + } + } + // The request can be altered by plugins with `requestWillFetch` making + // the original request (most likely from a `fetch` event) different + // from the Request we make. Pass both to `fetchDidFail` to aid debugging. + const pluginFilteredRequest = request.clone(); + try { + let fetchResponse; + // See https://github.com/GoogleChrome/workbox/issues/1796 + fetchResponse = await fetch(request, request.mode === 'navigate' ? undefined : this._strategy.fetchOptions); + if ("development" !== 'production') { + logger.debug(`Network request for ` + `'${getFriendlyURL(request.url)}' returned a response with ` + `status '${fetchResponse.status}'.`); + } + for (const callback of this.iterateCallbacks('fetchDidSucceed')) { + fetchResponse = await callback({ + event, + request: pluginFilteredRequest, + response: fetchResponse + }); + } + return fetchResponse; + } catch (error) { + { + logger.log(`Network request for ` + `'${getFriendlyURL(request.url)}' threw an error.`, error); + } + // `originalRequest` will only exist if a `fetchDidFail` callback + // is being used (see above). + if (originalRequest) { + await this.runCallbacks('fetchDidFail', { + error: error, + event, + originalRequest: originalRequest.clone(), + request: pluginFilteredRequest.clone() + }); + } + throw error; + } + } + /** + * Calls `this.fetch()` and (in the background) runs `this.cachePut()` on + * the response generated by `this.fetch()`. + * + * The call to `this.cachePut()` automatically invokes `this.waitUntil()`, + * so you do not have to manually call `waitUntil()` on the event. + * + * @param {Request|string} input The request or URL to fetch and cache. + * @return {Promise} + */ + async fetchAndCachePut(input) { + const response = await this.fetch(input); + const responseClone = response.clone(); + void this.waitUntil(this.cachePut(input, responseClone)); + return response; + } + /** + * Matches a request from the cache (and invokes any applicable plugin + * callback methods) using the `cacheName`, `matchOptions`, and `plugins` + * defined on the strategy object. + * + * The following plugin lifecycle methods are invoked when using this method: + * - cacheKeyWillByUsed() + * - cachedResponseWillByUsed() + * + * @param {Request|string} key The Request or URL to use as the cache key. + * @return {Promise} A matching response, if found. + */ + async cacheMatch(key) { + const request = toRequest(key); + let cachedResponse; + const { + cacheName, + matchOptions + } = this._strategy; + const effectiveRequest = await this.getCacheKey(request, 'read'); + const multiMatchOptions = Object.assign(Object.assign({}, matchOptions), { + cacheName + }); + cachedResponse = await caches.match(effectiveRequest, multiMatchOptions); + { + if (cachedResponse) { + logger.debug(`Found a cached response in '${cacheName}'.`); + } else { + logger.debug(`No cached response found in '${cacheName}'.`); + } + } + for (const callback of this.iterateCallbacks('cachedResponseWillBeUsed')) { + cachedResponse = (await callback({ + cacheName, + matchOptions, + cachedResponse, + request: effectiveRequest, + event: this.event + })) || undefined; + } + return cachedResponse; + } + /** + * Puts a request/response pair in the cache (and invokes any applicable + * plugin callback methods) using the `cacheName` and `plugins` defined on + * the strategy object. + * + * The following plugin lifecycle methods are invoked when using this method: + * - cacheKeyWillByUsed() + * - cacheWillUpdate() + * - cacheDidUpdate() + * + * @param {Request|string} key The request or URL to use as the cache key. + * @param {Response} response The response to cache. + * @return {Promise} `false` if a cacheWillUpdate caused the response + * not be cached, and `true` otherwise. + */ + async cachePut(key, response) { + const request = toRequest(key); + // Run in the next task to avoid blocking other cache reads. + // https://github.com/w3c/ServiceWorker/issues/1397 + await timeout(0); + const effectiveRequest = await this.getCacheKey(request, 'write'); + { + if (effectiveRequest.method && effectiveRequest.method !== 'GET') { + throw new WorkboxError('attempt-to-cache-non-get-request', { + url: getFriendlyURL(effectiveRequest.url), + method: effectiveRequest.method + }); + } + // See https://github.com/GoogleChrome/workbox/issues/2818 + const vary = response.headers.get('Vary'); + if (vary) { + logger.debug(`The response for ${getFriendlyURL(effectiveRequest.url)} ` + `has a 'Vary: ${vary}' header. ` + `Consider setting the {ignoreVary: true} option on your strategy ` + `to ensure cache matching and deletion works as expected.`); + } + } + if (!response) { + { + logger.error(`Cannot cache non-existent response for ` + `'${getFriendlyURL(effectiveRequest.url)}'.`); + } + throw new WorkboxError('cache-put-with-no-response', { + url: getFriendlyURL(effectiveRequest.url) + }); + } + const responseToCache = await this._ensureResponseSafeToCache(response); + if (!responseToCache) { + { + logger.debug(`Response '${getFriendlyURL(effectiveRequest.url)}' ` + `will not be cached.`, responseToCache); + } + return false; + } + const { + cacheName, + matchOptions + } = this._strategy; + const cache = await self.caches.open(cacheName); + const hasCacheUpdateCallback = this.hasCallback('cacheDidUpdate'); + const oldResponse = hasCacheUpdateCallback ? await cacheMatchIgnoreParams( + // TODO(philipwalton): the `__WB_REVISION__` param is a precaching + // feature. Consider into ways to only add this behavior if using + // precaching. + cache, effectiveRequest.clone(), ['__WB_REVISION__'], matchOptions) : null; + { + logger.debug(`Updating the '${cacheName}' cache with a new Response ` + `for ${getFriendlyURL(effectiveRequest.url)}.`); + } + try { + await cache.put(effectiveRequest, hasCacheUpdateCallback ? responseToCache.clone() : responseToCache); + } catch (error) { + if (error instanceof Error) { + // See https://developer.mozilla.org/en-US/docs/Web/API/DOMException#exception-QuotaExceededError + if (error.name === 'QuotaExceededError') { + await executeQuotaErrorCallbacks(); + } + throw error; + } + } + for (const callback of this.iterateCallbacks('cacheDidUpdate')) { + await callback({ + cacheName, + oldResponse, + newResponse: responseToCache.clone(), + request: effectiveRequest, + event: this.event + }); + } + return true; + } + /** + * Checks the list of plugins for the `cacheKeyWillBeUsed` callback, and + * executes any of those callbacks found in sequence. The final `Request` + * object returned by the last plugin is treated as the cache key for cache + * reads and/or writes. If no `cacheKeyWillBeUsed` plugin callbacks have + * been registered, the passed request is returned unmodified + * + * @param {Request} request + * @param {string} mode + * @return {Promise} + */ + async getCacheKey(request, mode) { + const key = `${request.url} | ${mode}`; + if (!this._cacheKeys[key]) { + let effectiveRequest = request; + for (const callback of this.iterateCallbacks('cacheKeyWillBeUsed')) { + effectiveRequest = toRequest(await callback({ + mode, + request: effectiveRequest, + event: this.event, + // params has a type any can't change right now. + params: this.params // eslint-disable-line + })); + } + + this._cacheKeys[key] = effectiveRequest; + } + return this._cacheKeys[key]; + } + /** + * Returns true if the strategy has at least one plugin with the given + * callback. + * + * @param {string} name The name of the callback to check for. + * @return {boolean} + */ + hasCallback(name) { + for (const plugin of this._strategy.plugins) { + if (name in plugin) { + return true; + } + } + return false; + } + /** + * Runs all plugin callbacks matching the given name, in order, passing the + * given param object (merged ith the current plugin state) as the only + * argument. + * + * Note: since this method runs all plugins, it's not suitable for cases + * where the return value of a callback needs to be applied prior to calling + * the next callback. See + * {@link workbox-strategies.StrategyHandler#iterateCallbacks} + * below for how to handle that case. + * + * @param {string} name The name of the callback to run within each plugin. + * @param {Object} param The object to pass as the first (and only) param + * when executing each callback. This object will be merged with the + * current plugin state prior to callback execution. + */ + async runCallbacks(name, param) { + for (const callback of this.iterateCallbacks(name)) { + // TODO(philipwalton): not sure why `any` is needed. It seems like + // this should work with `as WorkboxPluginCallbackParam[C]`. + await callback(param); + } + } + /** + * Accepts a callback and returns an iterable of matching plugin callbacks, + * where each callback is wrapped with the current handler state (i.e. when + * you call each callback, whatever object parameter you pass it will + * be merged with the plugin's current state). + * + * @param {string} name The name fo the callback to run + * @return {Array} + */ + *iterateCallbacks(name) { + for (const plugin of this._strategy.plugins) { + if (typeof plugin[name] === 'function') { + const state = this._pluginStateMap.get(plugin); + const statefulCallback = param => { + const statefulParam = Object.assign(Object.assign({}, param), { + state + }); + // TODO(philipwalton): not sure why `any` is needed. It seems like + // this should work with `as WorkboxPluginCallbackParam[C]`. + return plugin[name](statefulParam); + }; + yield statefulCallback; + } + } + } + /** + * Adds a promise to the + * [extend lifetime promises]{@link https://w3c.github.io/ServiceWorker/#extendableevent-extend-lifetime-promises} + * of the event event associated with the request being handled (usually a + * `FetchEvent`). + * + * Note: you can await + * {@link workbox-strategies.StrategyHandler~doneWaiting} + * to know when all added promises have settled. + * + * @param {Promise} promise A promise to add to the extend lifetime promises + * of the event that triggered the request. + */ + waitUntil(promise) { + this._extendLifetimePromises.push(promise); + return promise; + } + /** + * Returns a promise that resolves once all promises passed to + * {@link workbox-strategies.StrategyHandler~waitUntil} + * have settled. + * + * Note: any work done after `doneWaiting()` settles should be manually + * passed to an event's `waitUntil()` method (not this handler's + * `waitUntil()` method), otherwise the service worker thread my be killed + * prior to your work completing. + */ + async doneWaiting() { + let promise; + while (promise = this._extendLifetimePromises.shift()) { + await promise; + } + } + /** + * Stops running the strategy and immediately resolves any pending + * `waitUntil()` promises. + */ + destroy() { + this._handlerDeferred.resolve(null); + } + /** + * This method will call cacheWillUpdate on the available plugins (or use + * status === 200) to determine if the Response is safe and valid to cache. + * + * @param {Request} options.request + * @param {Response} options.response + * @return {Promise} + * + * @private + */ + async _ensureResponseSafeToCache(response) { + let responseToCache = response; + let pluginsUsed = false; + for (const callback of this.iterateCallbacks('cacheWillUpdate')) { + responseToCache = (await callback({ + request: this.request, + response: responseToCache, + event: this.event + })) || undefined; + pluginsUsed = true; + if (!responseToCache) { + break; + } + } + if (!pluginsUsed) { + if (responseToCache && responseToCache.status !== 200) { + responseToCache = undefined; + } + { + if (responseToCache) { + if (responseToCache.status !== 200) { + if (responseToCache.status === 0) { + logger.warn(`The response for '${this.request.url}' ` + `is an opaque response. The caching strategy that you're ` + `using will not cache opaque responses by default.`); + } else { + logger.debug(`The response for '${this.request.url}' ` + `returned a status code of '${response.status}' and won't ` + `be cached as a result.`); + } + } + } + } + } + return responseToCache; + } + } + + /* + Copyright 2020 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * An abstract base class that all other strategy classes must extend from: + * + * @memberof workbox-strategies + */ + class Strategy { + /** + * Creates a new instance of the strategy and sets all documented option + * properties as public instance properties. + * + * Note: if a custom strategy class extends the base Strategy class and does + * not need more than these properties, it does not need to define its own + * constructor. + * + * @param {Object} [options] + * @param {string} [options.cacheName] Cache name to store and retrieve + * requests. Defaults to the cache names provided by + * {@link workbox-core.cacheNames}. + * @param {Array} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} + * to use in conjunction with this caching strategy. + * @param {Object} [options.fetchOptions] Values passed along to the + * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters) + * of [non-navigation](https://github.com/GoogleChrome/workbox/issues/1796) + * `fetch()` requests made by this strategy. + * @param {Object} [options.matchOptions] The + * [`CacheQueryOptions`]{@link https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions} + * for any `cache.match()` or `cache.put()` calls made by this strategy. + */ + constructor(options = {}) { + /** + * Cache name to store and retrieve + * requests. Defaults to the cache names provided by + * {@link workbox-core.cacheNames}. + * + * @type {string} + */ + this.cacheName = cacheNames.getRuntimeName(options.cacheName); + /** + * The list + * [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} + * used by this strategy. + * + * @type {Array} + */ + this.plugins = options.plugins || []; + /** + * Values passed along to the + * [`init`]{@link https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters} + * of all fetch() requests made by this strategy. + * + * @type {Object} + */ + this.fetchOptions = options.fetchOptions; + /** + * The + * [`CacheQueryOptions`]{@link https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions} + * for any `cache.match()` or `cache.put()` calls made by this strategy. + * + * @type {Object} + */ + this.matchOptions = options.matchOptions; + } + /** + * Perform a request strategy and returns a `Promise` that will resolve with + * a `Response`, invoking all relevant plugin callbacks. + * + * When a strategy instance is registered with a Workbox + * {@link workbox-routing.Route}, this method is automatically + * called when the route matches. + * + * Alternatively, this method can be used in a standalone `FetchEvent` + * listener by passing it to `event.respondWith()`. + * + * @param {FetchEvent|Object} options A `FetchEvent` or an object with the + * properties listed below. + * @param {Request|string} options.request A request to run this strategy for. + * @param {ExtendableEvent} options.event The event associated with the + * request. + * @param {URL} [options.url] + * @param {*} [options.params] + */ + handle(options) { + const [responseDone] = this.handleAll(options); + return responseDone; + } + /** + * Similar to {@link workbox-strategies.Strategy~handle}, but + * instead of just returning a `Promise` that resolves to a `Response` it + * it will return an tuple of `[response, done]` promises, where the former + * (`response`) is equivalent to what `handle()` returns, and the latter is a + * Promise that will resolve once any promises that were added to + * `event.waitUntil()` as part of performing the strategy have completed. + * + * You can await the `done` promise to ensure any extra work performed by + * the strategy (usually caching responses) completes successfully. + * + * @param {FetchEvent|Object} options A `FetchEvent` or an object with the + * properties listed below. + * @param {Request|string} options.request A request to run this strategy for. + * @param {ExtendableEvent} options.event The event associated with the + * request. + * @param {URL} [options.url] + * @param {*} [options.params] + * @return {Array} A tuple of [response, done] + * promises that can be used to determine when the response resolves as + * well as when the handler has completed all its work. + */ + handleAll(options) { + // Allow for flexible options to be passed. + if (options instanceof FetchEvent) { + options = { + event: options, + request: options.request + }; + } + const event = options.event; + const request = typeof options.request === 'string' ? new Request(options.request) : options.request; + const params = 'params' in options ? options.params : undefined; + const handler = new StrategyHandler(this, { + event, + request, + params + }); + const responseDone = this._getResponse(handler, request, event); + const handlerDone = this._awaitComplete(responseDone, handler, request, event); + // Return an array of promises, suitable for use with Promise.all(). + return [responseDone, handlerDone]; + } + async _getResponse(handler, request, event) { + await handler.runCallbacks('handlerWillStart', { + event, + request + }); + let response = undefined; + try { + response = await this._handle(request, handler); + // The "official" Strategy subclasses all throw this error automatically, + // but in case a third-party Strategy doesn't, ensure that we have a + // consistent failure when there's no response or an error response. + if (!response || response.type === 'error') { + throw new WorkboxError('no-response', { + url: request.url + }); + } + } catch (error) { + if (error instanceof Error) { + for (const callback of handler.iterateCallbacks('handlerDidError')) { + response = await callback({ + error, + event, + request + }); + if (response) { + break; + } + } + } + if (!response) { + throw error; + } else { + logger.log(`While responding to '${getFriendlyURL(request.url)}', ` + `an ${error instanceof Error ? error.toString() : ''} error occurred. Using a fallback response provided by ` + `a handlerDidError plugin.`); + } + } + for (const callback of handler.iterateCallbacks('handlerWillRespond')) { + response = await callback({ + event, + request, + response + }); + } + return response; + } + async _awaitComplete(responseDone, handler, request, event) { + let response; + let error; + try { + response = await responseDone; + } catch (error) { + // Ignore errors, as response errors should be caught via the `response` + // promise above. The `done` promise will only throw for errors in + // promises passed to `handler.waitUntil()`. + } + try { + await handler.runCallbacks('handlerDidRespond', { + event, + request, + response + }); + await handler.doneWaiting(); + } catch (waitUntilError) { + if (waitUntilError instanceof Error) { + error = waitUntilError; + } + } + await handler.runCallbacks('handlerDidComplete', { + event, + request, + response, + error: error + }); + handler.destroy(); + if (error) { + throw error; + } + } + } + /** + * Classes extending the `Strategy` based class should implement this method, + * and leverage the {@link workbox-strategies.StrategyHandler} + * arg to perform all fetching and cache logic, which will ensure all relevant + * cache, cache options, fetch options and plugins are used (per the current + * strategy instance). + * + * @name _handle + * @instance + * @abstract + * @function + * @param {Request} request + * @param {workbox-strategies.StrategyHandler} handler + * @return {Promise} + * + * @memberof workbox-strategies.Strategy + */ + + /* + Copyright 2020 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * A {@link workbox-strategies.Strategy} implementation + * specifically designed to work with + * {@link workbox-precaching.PrecacheController} + * to both cache and fetch precached assets. + * + * Note: an instance of this class is created automatically when creating a + * `PrecacheController`; it's generally not necessary to create this yourself. + * + * @extends workbox-strategies.Strategy + * @memberof workbox-precaching + */ + class PrecacheStrategy extends Strategy { + /** + * + * @param {Object} [options] + * @param {string} [options.cacheName] Cache name to store and retrieve + * requests. Defaults to the cache names provided by + * {@link workbox-core.cacheNames}. + * @param {Array} [options.plugins] {@link https://developers.google.com/web/tools/workbox/guides/using-plugins|Plugins} + * to use in conjunction with this caching strategy. + * @param {Object} [options.fetchOptions] Values passed along to the + * {@link https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters|init} + * of all fetch() requests made by this strategy. + * @param {Object} [options.matchOptions] The + * {@link https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions|CacheQueryOptions} + * for any `cache.match()` or `cache.put()` calls made by this strategy. + * @param {boolean} [options.fallbackToNetwork=true] Whether to attempt to + * get the response from the network if there's a precache miss. + */ + constructor(options = {}) { + options.cacheName = cacheNames.getPrecacheName(options.cacheName); + super(options); + this._fallbackToNetwork = options.fallbackToNetwork === false ? false : true; + // Redirected responses cannot be used to satisfy a navigation request, so + // any redirected response must be "copied" rather than cloned, so the new + // response doesn't contain the `redirected` flag. See: + // https://bugs.chromium.org/p/chromium/issues/detail?id=669363&desc=2#c1 + this.plugins.push(PrecacheStrategy.copyRedirectedCacheableResponsesPlugin); + } + /** + * @private + * @param {Request|string} request A request to run this strategy for. + * @param {workbox-strategies.StrategyHandler} handler The event that + * triggered the request. + * @return {Promise} + */ + async _handle(request, handler) { + const response = await handler.cacheMatch(request); + if (response) { + return response; + } + // If this is an `install` event for an entry that isn't already cached, + // then populate the cache. + if (handler.event && handler.event.type === 'install') { + return await this._handleInstall(request, handler); + } + // Getting here means something went wrong. An entry that should have been + // precached wasn't found in the cache. + return await this._handleFetch(request, handler); + } + async _handleFetch(request, handler) { + let response; + const params = handler.params || {}; + // Fall back to the network if we're configured to do so. + if (this._fallbackToNetwork) { + { + logger.warn(`The precached response for ` + `${getFriendlyURL(request.url)} in ${this.cacheName} was not ` + `found. Falling back to the network.`); + } + const integrityInManifest = params.integrity; + const integrityInRequest = request.integrity; + const noIntegrityConflict = !integrityInRequest || integrityInRequest === integrityInManifest; + // Do not add integrity if the original request is no-cors + // See https://github.com/GoogleChrome/workbox/issues/3096 + response = await handler.fetch(new Request(request, { + integrity: request.mode !== 'no-cors' ? integrityInRequest || integrityInManifest : undefined + })); + // It's only "safe" to repair the cache if we're using SRI to guarantee + // that the response matches the precache manifest's expectations, + // and there's either a) no integrity property in the incoming request + // or b) there is an integrity, and it matches the precache manifest. + // See https://github.com/GoogleChrome/workbox/issues/2858 + // Also if the original request users no-cors we don't use integrity. + // See https://github.com/GoogleChrome/workbox/issues/3096 + if (integrityInManifest && noIntegrityConflict && request.mode !== 'no-cors') { + this._useDefaultCacheabilityPluginIfNeeded(); + const wasCached = await handler.cachePut(request, response.clone()); + { + if (wasCached) { + logger.log(`A response for ${getFriendlyURL(request.url)} ` + `was used to "repair" the precache.`); + } + } + } + } else { + // This shouldn't normally happen, but there are edge cases: + // https://github.com/GoogleChrome/workbox/issues/1441 + throw new WorkboxError('missing-precache-entry', { + cacheName: this.cacheName, + url: request.url + }); + } + { + const cacheKey = params.cacheKey || (await handler.getCacheKey(request, 'read')); + // Workbox is going to handle the route. + // print the routing details to the console. + logger.groupCollapsed(`Precaching is responding to: ` + getFriendlyURL(request.url)); + logger.log(`Serving the precached url: ${getFriendlyURL(cacheKey instanceof Request ? cacheKey.url : cacheKey)}`); + logger.groupCollapsed(`View request details here.`); + logger.log(request); + logger.groupEnd(); + logger.groupCollapsed(`View response details here.`); + logger.log(response); + logger.groupEnd(); + logger.groupEnd(); + } + return response; + } + async _handleInstall(request, handler) { + this._useDefaultCacheabilityPluginIfNeeded(); + const response = await handler.fetch(request); + // Make sure we defer cachePut() until after we know the response + // should be cached; see https://github.com/GoogleChrome/workbox/issues/2737 + const wasCached = await handler.cachePut(request, response.clone()); + if (!wasCached) { + // Throwing here will lead to the `install` handler failing, which + // we want to do if *any* of the responses aren't safe to cache. + throw new WorkboxError('bad-precaching-response', { + url: request.url, + status: response.status + }); + } + return response; + } + /** + * This method is complex, as there a number of things to account for: + * + * The `plugins` array can be set at construction, and/or it might be added to + * to at any time before the strategy is used. + * + * At the time the strategy is used (i.e. during an `install` event), there + * needs to be at least one plugin that implements `cacheWillUpdate` in the + * array, other than `copyRedirectedCacheableResponsesPlugin`. + * + * - If this method is called and there are no suitable `cacheWillUpdate` + * plugins, we need to add `defaultPrecacheCacheabilityPlugin`. + * + * - If this method is called and there is exactly one `cacheWillUpdate`, then + * we don't have to do anything (this might be a previously added + * `defaultPrecacheCacheabilityPlugin`, or it might be a custom plugin). + * + * - If this method is called and there is more than one `cacheWillUpdate`, + * then we need to check if one is `defaultPrecacheCacheabilityPlugin`. If so, + * we need to remove it. (This situation is unlikely, but it could happen if + * the strategy is used multiple times, the first without a `cacheWillUpdate`, + * and then later on after manually adding a custom `cacheWillUpdate`.) + * + * See https://github.com/GoogleChrome/workbox/issues/2737 for more context. + * + * @private + */ + _useDefaultCacheabilityPluginIfNeeded() { + let defaultPluginIndex = null; + let cacheWillUpdatePluginCount = 0; + for (const [index, plugin] of this.plugins.entries()) { + // Ignore the copy redirected plugin when determining what to do. + if (plugin === PrecacheStrategy.copyRedirectedCacheableResponsesPlugin) { + continue; + } + // Save the default plugin's index, in case it needs to be removed. + if (plugin === PrecacheStrategy.defaultPrecacheCacheabilityPlugin) { + defaultPluginIndex = index; + } + if (plugin.cacheWillUpdate) { + cacheWillUpdatePluginCount++; + } + } + if (cacheWillUpdatePluginCount === 0) { + this.plugins.push(PrecacheStrategy.defaultPrecacheCacheabilityPlugin); + } else if (cacheWillUpdatePluginCount > 1 && defaultPluginIndex !== null) { + // Only remove the default plugin; multiple custom plugins are allowed. + this.plugins.splice(defaultPluginIndex, 1); + } + // Nothing needs to be done if cacheWillUpdatePluginCount is 1 + } + } + + PrecacheStrategy.defaultPrecacheCacheabilityPlugin = { + async cacheWillUpdate({ + response + }) { + if (!response || response.status >= 400) { + return null; + } + return response; + } + }; + PrecacheStrategy.copyRedirectedCacheableResponsesPlugin = { + async cacheWillUpdate({ + response + }) { + return response.redirected ? await copyResponse(response) : response; + } + }; + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Performs efficient precaching of assets. + * + * @memberof workbox-precaching + */ + class PrecacheController { + /** + * Create a new PrecacheController. + * + * @param {Object} [options] + * @param {string} [options.cacheName] The cache to use for precaching. + * @param {string} [options.plugins] Plugins to use when precaching as well + * as responding to fetch events for precached assets. + * @param {boolean} [options.fallbackToNetwork=true] Whether to attempt to + * get the response from the network if there's a precache miss. + */ + constructor({ + cacheName, + plugins = [], + fallbackToNetwork = true + } = {}) { + this._urlsToCacheKeys = new Map(); + this._urlsToCacheModes = new Map(); + this._cacheKeysToIntegrities = new Map(); + this._strategy = new PrecacheStrategy({ + cacheName: cacheNames.getPrecacheName(cacheName), + plugins: [...plugins, new PrecacheCacheKeyPlugin({ + precacheController: this + })], + fallbackToNetwork + }); + // Bind the install and activate methods to the instance. + this.install = this.install.bind(this); + this.activate = this.activate.bind(this); + } + /** + * @type {workbox-precaching.PrecacheStrategy} The strategy created by this controller and + * used to cache assets and respond to fetch events. + */ + get strategy() { + return this._strategy; + } + /** + * Adds items to the precache list, removing any duplicates and + * stores the files in the + * {@link workbox-core.cacheNames|"precache cache"} when the service + * worker installs. + * + * This method can be called multiple times. + * + * @param {Array} [entries=[]] Array of entries to precache. + */ + precache(entries) { + this.addToCacheList(entries); + if (!this._installAndActiveListenersAdded) { + self.addEventListener('install', this.install); + self.addEventListener('activate', this.activate); + this._installAndActiveListenersAdded = true; + } + } + /** + * This method will add items to the precache list, removing duplicates + * and ensuring the information is valid. + * + * @param {Array} entries + * Array of entries to precache. + */ + addToCacheList(entries) { + { + finalAssertExports.isArray(entries, { + moduleName: 'workbox-precaching', + className: 'PrecacheController', + funcName: 'addToCacheList', + paramName: 'entries' + }); + } + const urlsToWarnAbout = []; + for (const entry of entries) { + // See https://github.com/GoogleChrome/workbox/issues/2259 + if (typeof entry === 'string') { + urlsToWarnAbout.push(entry); + } else if (entry && entry.revision === undefined) { + urlsToWarnAbout.push(entry.url); + } + const { + cacheKey, + url + } = createCacheKey(entry); + const cacheMode = typeof entry !== 'string' && entry.revision ? 'reload' : 'default'; + if (this._urlsToCacheKeys.has(url) && this._urlsToCacheKeys.get(url) !== cacheKey) { + throw new WorkboxError('add-to-cache-list-conflicting-entries', { + firstEntry: this._urlsToCacheKeys.get(url), + secondEntry: cacheKey + }); + } + if (typeof entry !== 'string' && entry.integrity) { + if (this._cacheKeysToIntegrities.has(cacheKey) && this._cacheKeysToIntegrities.get(cacheKey) !== entry.integrity) { + throw new WorkboxError('add-to-cache-list-conflicting-integrities', { + url + }); + } + this._cacheKeysToIntegrities.set(cacheKey, entry.integrity); + } + this._urlsToCacheKeys.set(url, cacheKey); + this._urlsToCacheModes.set(url, cacheMode); + if (urlsToWarnAbout.length > 0) { + const warningMessage = `Workbox is precaching URLs without revision ` + `info: ${urlsToWarnAbout.join(', ')}\nThis is generally NOT safe. ` + `Learn more at https://bit.ly/wb-precache`; + { + logger.warn(warningMessage); + } + } + } + } + /** + * Precaches new and updated assets. Call this method from the service worker + * install event. + * + * Note: this method calls `event.waitUntil()` for you, so you do not need + * to call it yourself in your event handlers. + * + * @param {ExtendableEvent} event + * @return {Promise} + */ + install(event) { + // waitUntil returns Promise + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return waitUntil(event, async () => { + const installReportPlugin = new PrecacheInstallReportPlugin(); + this.strategy.plugins.push(installReportPlugin); + // Cache entries one at a time. + // See https://github.com/GoogleChrome/workbox/issues/2528 + for (const [url, cacheKey] of this._urlsToCacheKeys) { + const integrity = this._cacheKeysToIntegrities.get(cacheKey); + const cacheMode = this._urlsToCacheModes.get(url); + const request = new Request(url, { + integrity, + cache: cacheMode, + credentials: 'same-origin' + }); + await Promise.all(this.strategy.handleAll({ + params: { + cacheKey + }, + request, + event + })); + } + const { + updatedURLs, + notUpdatedURLs + } = installReportPlugin; + { + printInstallDetails(updatedURLs, notUpdatedURLs); + } + return { + updatedURLs, + notUpdatedURLs + }; + }); + } + /** + * Deletes assets that are no longer present in the current precache manifest. + * Call this method from the service worker activate event. + * + * Note: this method calls `event.waitUntil()` for you, so you do not need + * to call it yourself in your event handlers. + * + * @param {ExtendableEvent} event + * @return {Promise} + */ + activate(event) { + // waitUntil returns Promise + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return waitUntil(event, async () => { + const cache = await self.caches.open(this.strategy.cacheName); + const currentlyCachedRequests = await cache.keys(); + const expectedCacheKeys = new Set(this._urlsToCacheKeys.values()); + const deletedURLs = []; + for (const request of currentlyCachedRequests) { + if (!expectedCacheKeys.has(request.url)) { + await cache.delete(request); + deletedURLs.push(request.url); + } + } + { + printCleanupDetails(deletedURLs); + } + return { + deletedURLs + }; + }); + } + /** + * Returns a mapping of a precached URL to the corresponding cache key, taking + * into account the revision information for the URL. + * + * @return {Map} A URL to cache key mapping. + */ + getURLsToCacheKeys() { + return this._urlsToCacheKeys; + } + /** + * Returns a list of all the URLs that have been precached by the current + * service worker. + * + * @return {Array} The precached URLs. + */ + getCachedURLs() { + return [...this._urlsToCacheKeys.keys()]; + } + /** + * Returns the cache key used for storing a given URL. If that URL is + * unversioned, like `/index.html', then the cache key will be the original + * URL with a search parameter appended to it. + * + * @param {string} url A URL whose cache key you want to look up. + * @return {string} The versioned URL that corresponds to a cache key + * for the original URL, or undefined if that URL isn't precached. + */ + getCacheKeyForURL(url) { + const urlObject = new URL(url, location.href); + return this._urlsToCacheKeys.get(urlObject.href); + } + /** + * @param {string} url A cache key whose SRI you want to look up. + * @return {string} The subresource integrity associated with the cache key, + * or undefined if it's not set. + */ + getIntegrityForCacheKey(cacheKey) { + return this._cacheKeysToIntegrities.get(cacheKey); + } + /** + * This acts as a drop-in replacement for + * [`cache.match()`](https://developer.mozilla.org/en-US/docs/Web/API/Cache/match) + * with the following differences: + * + * - It knows what the name of the precache is, and only checks in that cache. + * - It allows you to pass in an "original" URL without versioning parameters, + * and it will automatically look up the correct cache key for the currently + * active revision of that URL. + * + * E.g., `matchPrecache('index.html')` will find the correct precached + * response for the currently active service worker, even if the actual cache + * key is `'/index.html?__WB_REVISION__=1234abcd'`. + * + * @param {string|Request} request The key (without revisioning parameters) + * to look up in the precache. + * @return {Promise} + */ + async matchPrecache(request) { + const url = request instanceof Request ? request.url : request; + const cacheKey = this.getCacheKeyForURL(url); + if (cacheKey) { + const cache = await self.caches.open(this.strategy.cacheName); + return cache.match(cacheKey); + } + return undefined; + } + /** + * Returns a function that looks up `url` in the precache (taking into + * account revision information), and returns the corresponding `Response`. + * + * @param {string} url The precached URL which will be used to lookup the + * `Response`. + * @return {workbox-routing~handlerCallback} + */ + createHandlerBoundToURL(url) { + const cacheKey = this.getCacheKeyForURL(url); + if (!cacheKey) { + throw new WorkboxError('non-precached-url', { + url + }); + } + return options => { + options.request = new Request(url); + options.params = Object.assign({ + cacheKey + }, options.params); + return this.strategy.handle(options); + }; + } + } + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + let precacheController; + /** + * @return {PrecacheController} + * @private + */ + const getOrCreatePrecacheController = () => { + if (!precacheController) { + precacheController = new PrecacheController(); + } + return precacheController; + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Removes any URL search parameters that should be ignored. + * + * @param {URL} urlObject The original URL. + * @param {Array} ignoreURLParametersMatching RegExps to test against + * each search parameter name. Matches mean that the search parameter should be + * ignored. + * @return {URL} The URL with any ignored search parameters removed. + * + * @private + * @memberof workbox-precaching + */ + function removeIgnoredSearchParams(urlObject, ignoreURLParametersMatching = []) { + // Convert the iterable into an array at the start of the loop to make sure + // deletion doesn't mess up iteration. + for (const paramName of [...urlObject.searchParams.keys()]) { + if (ignoreURLParametersMatching.some(regExp => regExp.test(paramName))) { + urlObject.searchParams.delete(paramName); + } + } + return urlObject; + } + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Generator function that yields possible variations on the original URL to + * check, one at a time. + * + * @param {string} url + * @param {Object} options + * + * @private + * @memberof workbox-precaching + */ + function* generateURLVariations(url, { + ignoreURLParametersMatching = [/^utm_/, /^fbclid$/], + directoryIndex = 'index.html', + cleanURLs = true, + urlManipulation + } = {}) { + const urlObject = new URL(url, location.href); + urlObject.hash = ''; + yield urlObject.href; + const urlWithoutIgnoredParams = removeIgnoredSearchParams(urlObject, ignoreURLParametersMatching); + yield urlWithoutIgnoredParams.href; + if (directoryIndex && urlWithoutIgnoredParams.pathname.endsWith('/')) { + const directoryURL = new URL(urlWithoutIgnoredParams.href); + directoryURL.pathname += directoryIndex; + yield directoryURL.href; + } + if (cleanURLs) { + const cleanURL = new URL(urlWithoutIgnoredParams.href); + cleanURL.pathname += '.html'; + yield cleanURL.href; + } + if (urlManipulation) { + const additionalURLs = urlManipulation({ + url: urlObject + }); + for (const urlToAttempt of additionalURLs) { + yield urlToAttempt.href; + } + } + } + + /* + Copyright 2020 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * A subclass of {@link workbox-routing.Route} that takes a + * {@link workbox-precaching.PrecacheController} + * instance and uses it to match incoming requests and handle fetching + * responses from the precache. + * + * @memberof workbox-precaching + * @extends workbox-routing.Route + */ + class PrecacheRoute extends Route { + /** + * @param {PrecacheController} precacheController A `PrecacheController` + * instance used to both match requests and respond to fetch events. + * @param {Object} [options] Options to control how requests are matched + * against the list of precached URLs. + * @param {string} [options.directoryIndex=index.html] The `directoryIndex` will + * check cache entries for a URLs ending with '/' to see if there is a hit when + * appending the `directoryIndex` value. + * @param {Array} [options.ignoreURLParametersMatching=[/^utm_/, /^fbclid$/]] An + * array of regex's to remove search params when looking for a cache match. + * @param {boolean} [options.cleanURLs=true] The `cleanURLs` option will + * check the cache for the URL with a `.html` added to the end of the end. + * @param {workbox-precaching~urlManipulation} [options.urlManipulation] + * This is a function that should take a URL and return an array of + * alternative URLs that should be checked for precache matches. + */ + constructor(precacheController, options) { + const match = ({ + request + }) => { + const urlsToCacheKeys = precacheController.getURLsToCacheKeys(); + for (const possibleURL of generateURLVariations(request.url, options)) { + const cacheKey = urlsToCacheKeys.get(possibleURL); + if (cacheKey) { + const integrity = precacheController.getIntegrityForCacheKey(cacheKey); + return { + cacheKey, + integrity + }; + } + } + { + logger.debug(`Precaching did not find a match for ` + getFriendlyURL(request.url)); + } + return; + }; + super(match, precacheController.strategy); + } + } + + /* + Copyright 2019 Google LLC + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Add a `fetch` listener to the service worker that will + * respond to + * [network requests]{@link https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers#Custom_responses_to_requests} + * with precached assets. + * + * Requests for assets that aren't precached, the `FetchEvent` will not be + * responded to, allowing the event to fall through to other `fetch` event + * listeners. + * + * @param {Object} [options] See the {@link workbox-precaching.PrecacheRoute} + * options. + * + * @memberof workbox-precaching + */ + function addRoute(options) { + const precacheController = getOrCreatePrecacheController(); + const precacheRoute = new PrecacheRoute(precacheController, options); + registerRoute(precacheRoute); + } + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Adds items to the precache list, removing any duplicates and + * stores the files in the + * {@link workbox-core.cacheNames|"precache cache"} when the service + * worker installs. + * + * This method can be called multiple times. + * + * Please note: This method **will not** serve any of the cached files for you. + * It only precaches files. To respond to a network request you call + * {@link workbox-precaching.addRoute}. + * + * If you have a single array of files to precache, you can just call + * {@link workbox-precaching.precacheAndRoute}. + * + * @param {Array} [entries=[]] Array of entries to precache. + * + * @memberof workbox-precaching + */ + function precache(entries) { + const precacheController = getOrCreatePrecacheController(); + precacheController.precache(entries); + } + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * This method will add entries to the precache list and add a route to + * respond to fetch events. + * + * This is a convenience method that will call + * {@link workbox-precaching.precache} and + * {@link workbox-precaching.addRoute} in a single call. + * + * @param {Array} entries Array of entries to precache. + * @param {Object} [options] See the + * {@link workbox-precaching.PrecacheRoute} options. + * + * @memberof workbox-precaching + */ + function precacheAndRoute(entries, options) { + precache(entries); + addRoute(options); + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const SUBSTRING_TO_FIND = '-precache-'; + /** + * Cleans up incompatible precaches that were created by older versions of + * Workbox, by a service worker registered under the current scope. + * + * This is meant to be called as part of the `activate` event. + * + * This should be safe to use as long as you don't include `substringToFind` + * (defaulting to `-precache-`) in your non-precache cache names. + * + * @param {string} currentPrecacheName The cache name currently in use for + * precaching. This cache won't be deleted. + * @param {string} [substringToFind='-precache-'] Cache names which include this + * substring will be deleted (excluding `currentPrecacheName`). + * @return {Array} A list of all the cache names that were deleted. + * + * @private + * @memberof workbox-precaching + */ + const deleteOutdatedCaches = async (currentPrecacheName, substringToFind = SUBSTRING_TO_FIND) => { + const cacheNames = await self.caches.keys(); + const cacheNamesToDelete = cacheNames.filter(cacheName => { + return cacheName.includes(substringToFind) && cacheName.includes(self.registration.scope) && cacheName !== currentPrecacheName; + }); + await Promise.all(cacheNamesToDelete.map(cacheName => self.caches.delete(cacheName))); + return cacheNamesToDelete; + }; + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Adds an `activate` event listener which will clean up incompatible + * precaches that were created by older versions of Workbox. + * + * @memberof workbox-precaching + */ + function cleanupOutdatedCaches() { + // See https://github.com/Microsoft/TypeScript/issues/28357#issuecomment-436484705 + self.addEventListener('activate', event => { + const cacheName = cacheNames.getPrecacheName(); + event.waitUntil(deleteOutdatedCaches(cacheName).then(cachesDeleted => { + { + if (cachesDeleted.length > 0) { + logger.log(`The following out-of-date precaches were cleaned up ` + `automatically:`, cachesDeleted); + } + } + })); + }); + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * NavigationRoute makes it easy to create a + * {@link workbox-routing.Route} that matches for browser + * [navigation requests]{@link https://developers.google.com/web/fundamentals/primers/service-workers/high-performance-loading#first_what_are_navigation_requests}. + * + * It will only match incoming Requests whose + * {@link https://fetch.spec.whatwg.org/#concept-request-mode|mode} + * is set to `navigate`. + * + * You can optionally only apply this route to a subset of navigation requests + * by using one or both of the `denylist` and `allowlist` parameters. + * + * @memberof workbox-routing + * @extends workbox-routing.Route + */ + class NavigationRoute extends Route { + /** + * If both `denylist` and `allowlist` are provided, the `denylist` will + * take precedence and the request will not match this route. + * + * The regular expressions in `allowlist` and `denylist` + * are matched against the concatenated + * [`pathname`]{@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/pathname} + * and [`search`]{@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/search} + * portions of the requested URL. + * + * *Note*: These RegExps may be evaluated against every destination URL during + * a navigation. Avoid using + * [complex RegExps](https://github.com/GoogleChrome/workbox/issues/3077), + * or else your users may see delays when navigating your site. + * + * @param {workbox-routing~handlerCallback} handler A callback + * function that returns a Promise resulting in a Response. + * @param {Object} options + * @param {Array} [options.denylist] If any of these patterns match, + * the route will not handle the request (even if a allowlist RegExp matches). + * @param {Array} [options.allowlist=[/./]] If any of these patterns + * match the URL's pathname and search parameter, the route will handle the + * request (assuming the denylist doesn't match). + */ + constructor(handler, { + allowlist = [/./], + denylist = [] + } = {}) { + { + finalAssertExports.isArrayOfClass(allowlist, RegExp, { + moduleName: 'workbox-routing', + className: 'NavigationRoute', + funcName: 'constructor', + paramName: 'options.allowlist' + }); + finalAssertExports.isArrayOfClass(denylist, RegExp, { + moduleName: 'workbox-routing', + className: 'NavigationRoute', + funcName: 'constructor', + paramName: 'options.denylist' + }); + } + super(options => this._match(options), handler); + this._allowlist = allowlist; + this._denylist = denylist; + } + /** + * Routes match handler. + * + * @param {Object} options + * @param {URL} options.url + * @param {Request} options.request + * @return {boolean} + * + * @private + */ + _match({ + url, + request + }) { + if (request && request.mode !== 'navigate') { + return false; + } + const pathnameAndSearch = url.pathname + url.search; + for (const regExp of this._denylist) { + if (regExp.test(pathnameAndSearch)) { + { + logger.log(`The navigation route ${pathnameAndSearch} is not ` + `being used, since the URL matches this denylist pattern: ` + `${regExp.toString()}`); + } + return false; + } + } + if (this._allowlist.some(regExp => regExp.test(pathnameAndSearch))) { + { + logger.debug(`The navigation route ${pathnameAndSearch} ` + `is being used.`); + } + return true; + } + { + logger.log(`The navigation route ${pathnameAndSearch} is not ` + `being used, since the URL being navigated to doesn't ` + `match the allowlist.`); + } + return false; + } + } + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Helper function that calls + * {@link PrecacheController#createHandlerBoundToURL} on the default + * {@link PrecacheController} instance. + * + * If you are creating your own {@link PrecacheController}, then call the + * {@link PrecacheController#createHandlerBoundToURL} on that instance, + * instead of using this function. + * + * @param {string} url The precached URL which will be used to lookup the + * `Response`. + * @param {boolean} [fallbackToNetwork=true] Whether to attempt to get the + * response from the network if there's a precache miss. + * @return {workbox-routing~handlerCallback} + * + * @memberof workbox-precaching + */ + function createHandlerBoundToURL(url) { + const precacheController = getOrCreatePrecacheController(); + return precacheController.createHandlerBoundToURL(url); + } + + exports.NavigationRoute = NavigationRoute; + exports.cleanupOutdatedCaches = cleanupOutdatedCaches; + exports.clientsClaim = clientsClaim; + exports.createHandlerBoundToURL = createHandlerBoundToURL; + exports.precacheAndRoute = precacheAndRoute; + exports.registerRoute = registerRoute; + +})); diff --git a/dev-dist/workbox-5357ef54.js b/dev-dist/workbox-5357ef54.js new file mode 100644 index 0000000..62f106f --- /dev/null +++ b/dev-dist/workbox-5357ef54.js @@ -0,0 +1,3394 @@ +define(['exports'], (function (exports) { 'use strict'; + + // @ts-ignore + try { + self['workbox:core:7.0.0'] && _(); + } catch (e) {} + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Claim any currently available clients once the service worker + * becomes active. This is normally used in conjunction with `skipWaiting()`. + * + * @memberof workbox-core + */ + function clientsClaim() { + self.addEventListener('activate', () => self.clients.claim()); + } + + /* + Copyright 2019 Google LLC + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const logger = (() => { + // Don't overwrite this value if it's already set. + // See https://github.com/GoogleChrome/workbox/pull/2284#issuecomment-560470923 + if (!('__WB_DISABLE_DEV_LOGS' in globalThis)) { + self.__WB_DISABLE_DEV_LOGS = false; + } + let inGroup = false; + const methodToColorMap = { + debug: `#7f8c8d`, + log: `#2ecc71`, + warn: `#f39c12`, + error: `#c0392b`, + groupCollapsed: `#3498db`, + groupEnd: null // No colored prefix on groupEnd + }; + + const print = function (method, args) { + if (self.__WB_DISABLE_DEV_LOGS) { + return; + } + if (method === 'groupCollapsed') { + // Safari doesn't print all console.groupCollapsed() arguments: + // https://bugs.webkit.org/show_bug.cgi?id=182754 + if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) { + console[method](...args); + return; + } + } + const styles = [`background: ${methodToColorMap[method]}`, `border-radius: 0.5em`, `color: white`, `font-weight: bold`, `padding: 2px 0.5em`]; + // When in a group, the workbox prefix is not displayed. + const logPrefix = inGroup ? [] : ['%cworkbox', styles.join(';')]; + console[method](...logPrefix, ...args); + if (method === 'groupCollapsed') { + inGroup = true; + } + if (method === 'groupEnd') { + inGroup = false; + } + }; + // eslint-disable-next-line @typescript-eslint/ban-types + const api = {}; + const loggerMethods = Object.keys(methodToColorMap); + for (const key of loggerMethods) { + const method = key; + api[method] = (...args) => { + print(method, args); + }; + } + return api; + })(); + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const messages = { + 'invalid-value': ({ + paramName, + validValueDescription, + value + }) => { + if (!paramName || !validValueDescription) { + throw new Error(`Unexpected input to 'invalid-value' error.`); + } + return `The '${paramName}' parameter was given a value with an ` + `unexpected value. ${validValueDescription} Received a value of ` + `${JSON.stringify(value)}.`; + }, + 'not-an-array': ({ + moduleName, + className, + funcName, + paramName + }) => { + if (!moduleName || !className || !funcName || !paramName) { + throw new Error(`Unexpected input to 'not-an-array' error.`); + } + return `The parameter '${paramName}' passed into ` + `'${moduleName}.${className}.${funcName}()' must be an array.`; + }, + 'incorrect-type': ({ + expectedType, + paramName, + moduleName, + className, + funcName + }) => { + if (!expectedType || !paramName || !moduleName || !funcName) { + throw new Error(`Unexpected input to 'incorrect-type' error.`); + } + const classNameStr = className ? `${className}.` : ''; + return `The parameter '${paramName}' passed into ` + `'${moduleName}.${classNameStr}` + `${funcName}()' must be of type ${expectedType}.`; + }, + 'incorrect-class': ({ + expectedClassName, + paramName, + moduleName, + className, + funcName, + isReturnValueProblem + }) => { + if (!expectedClassName || !moduleName || !funcName) { + throw new Error(`Unexpected input to 'incorrect-class' error.`); + } + const classNameStr = className ? `${className}.` : ''; + if (isReturnValueProblem) { + return `The return value from ` + `'${moduleName}.${classNameStr}${funcName}()' ` + `must be an instance of class ${expectedClassName}.`; + } + return `The parameter '${paramName}' passed into ` + `'${moduleName}.${classNameStr}${funcName}()' ` + `must be an instance of class ${expectedClassName}.`; + }, + 'missing-a-method': ({ + expectedMethod, + paramName, + moduleName, + className, + funcName + }) => { + if (!expectedMethod || !paramName || !moduleName || !className || !funcName) { + throw new Error(`Unexpected input to 'missing-a-method' error.`); + } + return `${moduleName}.${className}.${funcName}() expected the ` + `'${paramName}' parameter to expose a '${expectedMethod}' method.`; + }, + 'add-to-cache-list-unexpected-type': ({ + entry + }) => { + return `An unexpected entry was passed to ` + `'workbox-precaching.PrecacheController.addToCacheList()' The entry ` + `'${JSON.stringify(entry)}' isn't supported. You must supply an array of ` + `strings with one or more characters, objects with a url property or ` + `Request objects.`; + }, + 'add-to-cache-list-conflicting-entries': ({ + firstEntry, + secondEntry + }) => { + if (!firstEntry || !secondEntry) { + throw new Error(`Unexpected input to ` + `'add-to-cache-list-duplicate-entries' error.`); + } + return `Two of the entries passed to ` + `'workbox-precaching.PrecacheController.addToCacheList()' had the URL ` + `${firstEntry} but different revision details. Workbox is ` + `unable to cache and version the asset correctly. Please remove one ` + `of the entries.`; + }, + 'plugin-error-request-will-fetch': ({ + thrownErrorMessage + }) => { + if (!thrownErrorMessage) { + throw new Error(`Unexpected input to ` + `'plugin-error-request-will-fetch', error.`); + } + return `An error was thrown by a plugins 'requestWillFetch()' method. ` + `The thrown error message was: '${thrownErrorMessage}'.`; + }, + 'invalid-cache-name': ({ + cacheNameId, + value + }) => { + if (!cacheNameId) { + throw new Error(`Expected a 'cacheNameId' for error 'invalid-cache-name'`); + } + return `You must provide a name containing at least one character for ` + `setCacheDetails({${cacheNameId}: '...'}). Received a value of ` + `'${JSON.stringify(value)}'`; + }, + 'unregister-route-but-not-found-with-method': ({ + method + }) => { + if (!method) { + throw new Error(`Unexpected input to ` + `'unregister-route-but-not-found-with-method' error.`); + } + return `The route you're trying to unregister was not previously ` + `registered for the method type '${method}'.`; + }, + 'unregister-route-route-not-registered': () => { + return `The route you're trying to unregister was not previously ` + `registered.`; + }, + 'queue-replay-failed': ({ + name + }) => { + return `Replaying the background sync queue '${name}' failed.`; + }, + 'duplicate-queue-name': ({ + name + }) => { + return `The Queue name '${name}' is already being used. ` + `All instances of backgroundSync.Queue must be given unique names.`; + }, + 'expired-test-without-max-age': ({ + methodName, + paramName + }) => { + return `The '${methodName}()' method can only be used when the ` + `'${paramName}' is used in the constructor.`; + }, + 'unsupported-route-type': ({ + moduleName, + className, + funcName, + paramName + }) => { + return `The supplied '${paramName}' parameter was an unsupported type. ` + `Please check the docs for ${moduleName}.${className}.${funcName} for ` + `valid input types.`; + }, + 'not-array-of-class': ({ + value, + expectedClass, + moduleName, + className, + funcName, + paramName + }) => { + return `The supplied '${paramName}' parameter must be an array of ` + `'${expectedClass}' objects. Received '${JSON.stringify(value)},'. ` + `Please check the call to ${moduleName}.${className}.${funcName}() ` + `to fix the issue.`; + }, + 'max-entries-or-age-required': ({ + moduleName, + className, + funcName + }) => { + return `You must define either config.maxEntries or config.maxAgeSeconds` + `in ${moduleName}.${className}.${funcName}`; + }, + 'statuses-or-headers-required': ({ + moduleName, + className, + funcName + }) => { + return `You must define either config.statuses or config.headers` + `in ${moduleName}.${className}.${funcName}`; + }, + 'invalid-string': ({ + moduleName, + funcName, + paramName + }) => { + if (!paramName || !moduleName || !funcName) { + throw new Error(`Unexpected input to 'invalid-string' error.`); + } + return `When using strings, the '${paramName}' parameter must start with ` + `'http' (for cross-origin matches) or '/' (for same-origin matches). ` + `Please see the docs for ${moduleName}.${funcName}() for ` + `more info.`; + }, + 'channel-name-required': () => { + return `You must provide a channelName to construct a ` + `BroadcastCacheUpdate instance.`; + }, + 'invalid-responses-are-same-args': () => { + return `The arguments passed into responsesAreSame() appear to be ` + `invalid. Please ensure valid Responses are used.`; + }, + 'expire-custom-caches-only': () => { + return `You must provide a 'cacheName' property when using the ` + `expiration plugin with a runtime caching strategy.`; + }, + 'unit-must-be-bytes': ({ + normalizedRangeHeader + }) => { + if (!normalizedRangeHeader) { + throw new Error(`Unexpected input to 'unit-must-be-bytes' error.`); + } + return `The 'unit' portion of the Range header must be set to 'bytes'. ` + `The Range header provided was "${normalizedRangeHeader}"`; + }, + 'single-range-only': ({ + normalizedRangeHeader + }) => { + if (!normalizedRangeHeader) { + throw new Error(`Unexpected input to 'single-range-only' error.`); + } + return `Multiple ranges are not supported. Please use a single start ` + `value, and optional end value. The Range header provided was ` + `"${normalizedRangeHeader}"`; + }, + 'invalid-range-values': ({ + normalizedRangeHeader + }) => { + if (!normalizedRangeHeader) { + throw new Error(`Unexpected input to 'invalid-range-values' error.`); + } + return `The Range header is missing both start and end values. At least ` + `one of those values is needed. The Range header provided was ` + `"${normalizedRangeHeader}"`; + }, + 'no-range-header': () => { + return `No Range header was found in the Request provided.`; + }, + 'range-not-satisfiable': ({ + size, + start, + end + }) => { + return `The start (${start}) and end (${end}) values in the Range are ` + `not satisfiable by the cached response, which is ${size} bytes.`; + }, + 'attempt-to-cache-non-get-request': ({ + url, + method + }) => { + return `Unable to cache '${url}' because it is a '${method}' request and ` + `only 'GET' requests can be cached.`; + }, + 'cache-put-with-no-response': ({ + url + }) => { + return `There was an attempt to cache '${url}' but the response was not ` + `defined.`; + }, + 'no-response': ({ + url, + error + }) => { + let message = `The strategy could not generate a response for '${url}'.`; + if (error) { + message += ` The underlying error is ${error}.`; + } + return message; + }, + 'bad-precaching-response': ({ + url, + status + }) => { + return `The precaching request for '${url}' failed` + (status ? ` with an HTTP status of ${status}.` : `.`); + }, + 'non-precached-url': ({ + url + }) => { + return `createHandlerBoundToURL('${url}') was called, but that URL is ` + `not precached. Please pass in a URL that is precached instead.`; + }, + 'add-to-cache-list-conflicting-integrities': ({ + url + }) => { + return `Two of the entries passed to ` + `'workbox-precaching.PrecacheController.addToCacheList()' had the URL ` + `${url} with different integrity values. Please remove one of them.`; + }, + 'missing-precache-entry': ({ + cacheName, + url + }) => { + return `Unable to find a precached response in ${cacheName} for ${url}.`; + }, + 'cross-origin-copy-response': ({ + origin + }) => { + return `workbox-core.copyResponse() can only be used with same-origin ` + `responses. It was passed a response with origin ${origin}.`; + }, + 'opaque-streams-source': ({ + type + }) => { + const message = `One of the workbox-streams sources resulted in an ` + `'${type}' response.`; + if (type === 'opaqueredirect') { + return `${message} Please do not use a navigation request that results ` + `in a redirect as a source.`; + } + return `${message} Please ensure your sources are CORS-enabled.`; + } + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const generatorFunction = (code, details = {}) => { + const message = messages[code]; + if (!message) { + throw new Error(`Unable to find message for code '${code}'.`); + } + return message(details); + }; + const messageGenerator = generatorFunction; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Workbox errors should be thrown with this class. + * This allows use to ensure the type easily in tests, + * helps developers identify errors from workbox + * easily and allows use to optimise error + * messages correctly. + * + * @private + */ + class WorkboxError extends Error { + /** + * + * @param {string} errorCode The error code that + * identifies this particular error. + * @param {Object=} details Any relevant arguments + * that will help developers identify issues should + * be added as a key on the context object. + */ + constructor(errorCode, details) { + const message = messageGenerator(errorCode, details); + super(message); + this.name = errorCode; + this.details = details; + } + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /* + * This method throws if the supplied value is not an array. + * The destructed values are required to produce a meaningful error for users. + * The destructed and restructured object is so it's clear what is + * needed. + */ + const isArray = (value, details) => { + if (!Array.isArray(value)) { + throw new WorkboxError('not-an-array', details); + } + }; + const hasMethod = (object, expectedMethod, details) => { + const type = typeof object[expectedMethod]; + if (type !== 'function') { + details['expectedMethod'] = expectedMethod; + throw new WorkboxError('missing-a-method', details); + } + }; + const isType = (object, expectedType, details) => { + if (typeof object !== expectedType) { + details['expectedType'] = expectedType; + throw new WorkboxError('incorrect-type', details); + } + }; + const isInstance = (object, + // Need the general type to do the check later. + // eslint-disable-next-line @typescript-eslint/ban-types + expectedClass, details) => { + if (!(object instanceof expectedClass)) { + details['expectedClassName'] = expectedClass.name; + throw new WorkboxError('incorrect-class', details); + } + }; + const isOneOf = (value, validValues, details) => { + if (!validValues.includes(value)) { + details['validValueDescription'] = `Valid values are ${JSON.stringify(validValues)}.`; + throw new WorkboxError('invalid-value', details); + } + }; + const isArrayOfClass = (value, + // Need general type to do check later. + expectedClass, + // eslint-disable-line + details) => { + const error = new WorkboxError('not-array-of-class', details); + if (!Array.isArray(value)) { + throw error; + } + for (const item of value) { + if (!(item instanceof expectedClass)) { + throw error; + } + } + }; + const finalAssertExports = { + hasMethod, + isArray, + isInstance, + isOneOf, + isType, + isArrayOfClass + }; + + // @ts-ignore + try { + self['workbox:routing:7.0.0'] && _(); + } catch (e) {} + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * The default HTTP method, 'GET', used when there's no specific method + * configured for a route. + * + * @type {string} + * + * @private + */ + const defaultMethod = 'GET'; + /** + * The list of valid HTTP methods associated with requests that could be routed. + * + * @type {Array} + * + * @private + */ + const validMethods = ['DELETE', 'GET', 'HEAD', 'PATCH', 'POST', 'PUT']; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * @param {function()|Object} handler Either a function, or an object with a + * 'handle' method. + * @return {Object} An object with a handle method. + * + * @private + */ + const normalizeHandler = handler => { + if (handler && typeof handler === 'object') { + { + finalAssertExports.hasMethod(handler, 'handle', { + moduleName: 'workbox-routing', + className: 'Route', + funcName: 'constructor', + paramName: 'handler' + }); + } + return handler; + } else { + { + finalAssertExports.isType(handler, 'function', { + moduleName: 'workbox-routing', + className: 'Route', + funcName: 'constructor', + paramName: 'handler' + }); + } + return { + handle: handler + }; + } + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * A `Route` consists of a pair of callback functions, "match" and "handler". + * The "match" callback determine if a route should be used to "handle" a + * request by returning a non-falsy value if it can. The "handler" callback + * is called when there is a match and should return a Promise that resolves + * to a `Response`. + * + * @memberof workbox-routing + */ + class Route { + /** + * Constructor for Route class. + * + * @param {workbox-routing~matchCallback} match + * A callback function that determines whether the route matches a given + * `fetch` event by returning a non-falsy value. + * @param {workbox-routing~handlerCallback} handler A callback + * function that returns a Promise resolving to a Response. + * @param {string} [method='GET'] The HTTP method to match the Route + * against. + */ + constructor(match, handler, method = defaultMethod) { + { + finalAssertExports.isType(match, 'function', { + moduleName: 'workbox-routing', + className: 'Route', + funcName: 'constructor', + paramName: 'match' + }); + if (method) { + finalAssertExports.isOneOf(method, validMethods, { + paramName: 'method' + }); + } + } + // These values are referenced directly by Router so cannot be + // altered by minificaton. + this.handler = normalizeHandler(handler); + this.match = match; + this.method = method; + } + /** + * + * @param {workbox-routing-handlerCallback} handler A callback + * function that returns a Promise resolving to a Response + */ + setCatchHandler(handler) { + this.catchHandler = normalizeHandler(handler); + } + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * RegExpRoute makes it easy to create a regular expression based + * {@link workbox-routing.Route}. + * + * For same-origin requests the RegExp only needs to match part of the URL. For + * requests against third-party servers, you must define a RegExp that matches + * the start of the URL. + * + * @memberof workbox-routing + * @extends workbox-routing.Route + */ + class RegExpRoute extends Route { + /** + * If the regular expression contains + * [capture groups]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#grouping-back-references}, + * the captured values will be passed to the + * {@link workbox-routing~handlerCallback} `params` + * argument. + * + * @param {RegExp} regExp The regular expression to match against URLs. + * @param {workbox-routing~handlerCallback} handler A callback + * function that returns a Promise resulting in a Response. + * @param {string} [method='GET'] The HTTP method to match the Route + * against. + */ + constructor(regExp, handler, method) { + { + finalAssertExports.isInstance(regExp, RegExp, { + moduleName: 'workbox-routing', + className: 'RegExpRoute', + funcName: 'constructor', + paramName: 'pattern' + }); + } + const match = ({ + url + }) => { + const result = regExp.exec(url.href); + // Return immediately if there's no match. + if (!result) { + return; + } + // Require that the match start at the first character in the URL string + // if it's a cross-origin request. + // See https://github.com/GoogleChrome/workbox/issues/281 for the context + // behind this behavior. + if (url.origin !== location.origin && result.index !== 0) { + { + logger.debug(`The regular expression '${regExp.toString()}' only partially matched ` + `against the cross-origin URL '${url.toString()}'. RegExpRoute's will only ` + `handle cross-origin requests if they match the entire URL.`); + } + return; + } + // If the route matches, but there aren't any capture groups defined, then + // this will return [], which is truthy and therefore sufficient to + // indicate a match. + // If there are capture groups, then it will return their values. + return result.slice(1); + }; + super(match, handler, method); + } + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const getFriendlyURL = url => { + const urlObj = new URL(String(url), location.href); + // See https://github.com/GoogleChrome/workbox/issues/2323 + // We want to include everything, except for the origin if it's same-origin. + return urlObj.href.replace(new RegExp(`^${location.origin}`), ''); + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * The Router can be used to process a `FetchEvent` using one or more + * {@link workbox-routing.Route}, responding with a `Response` if + * a matching route exists. + * + * If no route matches a given a request, the Router will use a "default" + * handler if one is defined. + * + * Should the matching Route throw an error, the Router will use a "catch" + * handler if one is defined to gracefully deal with issues and respond with a + * Request. + * + * If a request matches multiple routes, the **earliest** registered route will + * be used to respond to the request. + * + * @memberof workbox-routing + */ + class Router { + /** + * Initializes a new Router. + */ + constructor() { + this._routes = new Map(); + this._defaultHandlerMap = new Map(); + } + /** + * @return {Map>} routes A `Map` of HTTP + * method name ('GET', etc.) to an array of all the corresponding `Route` + * instances that are registered. + */ + get routes() { + return this._routes; + } + /** + * Adds a fetch event listener to respond to events when a route matches + * the event's request. + */ + addFetchListener() { + // See https://github.com/Microsoft/TypeScript/issues/28357#issuecomment-436484705 + self.addEventListener('fetch', event => { + const { + request + } = event; + const responsePromise = this.handleRequest({ + request, + event + }); + if (responsePromise) { + event.respondWith(responsePromise); + } + }); + } + /** + * Adds a message event listener for URLs to cache from the window. + * This is useful to cache resources loaded on the page prior to when the + * service worker started controlling it. + * + * The format of the message data sent from the window should be as follows. + * Where the `urlsToCache` array may consist of URL strings or an array of + * URL string + `requestInit` object (the same as you'd pass to `fetch()`). + * + * ``` + * { + * type: 'CACHE_URLS', + * payload: { + * urlsToCache: [ + * './script1.js', + * './script2.js', + * ['./script3.js', {mode: 'no-cors'}], + * ], + * }, + * } + * ``` + */ + addCacheListener() { + // See https://github.com/Microsoft/TypeScript/issues/28357#issuecomment-436484705 + self.addEventListener('message', event => { + // event.data is type 'any' + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + if (event.data && event.data.type === 'CACHE_URLS') { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + const { + payload + } = event.data; + { + logger.debug(`Caching URLs from the window`, payload.urlsToCache); + } + const requestPromises = Promise.all(payload.urlsToCache.map(entry => { + if (typeof entry === 'string') { + entry = [entry]; + } + const request = new Request(...entry); + return this.handleRequest({ + request, + event + }); + // TODO(philipwalton): TypeScript errors without this typecast for + // some reason (probably a bug). The real type here should work but + // doesn't: `Array | undefined>`. + })); // TypeScript + event.waitUntil(requestPromises); + // If a MessageChannel was used, reply to the message on success. + if (event.ports && event.ports[0]) { + void requestPromises.then(() => event.ports[0].postMessage(true)); + } + } + }); + } + /** + * Apply the routing rules to a FetchEvent object to get a Response from an + * appropriate Route's handler. + * + * @param {Object} options + * @param {Request} options.request The request to handle. + * @param {ExtendableEvent} options.event The event that triggered the + * request. + * @return {Promise|undefined} A promise is returned if a + * registered route can handle the request. If there is no matching + * route and there's no `defaultHandler`, `undefined` is returned. + */ + handleRequest({ + request, + event + }) { + { + finalAssertExports.isInstance(request, Request, { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'handleRequest', + paramName: 'options.request' + }); + } + const url = new URL(request.url, location.href); + if (!url.protocol.startsWith('http')) { + { + logger.debug(`Workbox Router only supports URLs that start with 'http'.`); + } + return; + } + const sameOrigin = url.origin === location.origin; + const { + params, + route + } = this.findMatchingRoute({ + event, + request, + sameOrigin, + url + }); + let handler = route && route.handler; + const debugMessages = []; + { + if (handler) { + debugMessages.push([`Found a route to handle this request:`, route]); + if (params) { + debugMessages.push([`Passing the following params to the route's handler:`, params]); + } + } + } + // If we don't have a handler because there was no matching route, then + // fall back to defaultHandler if that's defined. + const method = request.method; + if (!handler && this._defaultHandlerMap.has(method)) { + { + debugMessages.push(`Failed to find a matching route. Falling ` + `back to the default handler for ${method}.`); + } + handler = this._defaultHandlerMap.get(method); + } + if (!handler) { + { + // No handler so Workbox will do nothing. If logs is set of debug + // i.e. verbose, we should print out this information. + logger.debug(`No route found for: ${getFriendlyURL(url)}`); + } + return; + } + { + // We have a handler, meaning Workbox is going to handle the route. + // print the routing details to the console. + logger.groupCollapsed(`Router is responding to: ${getFriendlyURL(url)}`); + debugMessages.forEach(msg => { + if (Array.isArray(msg)) { + logger.log(...msg); + } else { + logger.log(msg); + } + }); + logger.groupEnd(); + } + // Wrap in try and catch in case the handle method throws a synchronous + // error. It should still callback to the catch handler. + let responsePromise; + try { + responsePromise = handler.handle({ + url, + request, + event, + params + }); + } catch (err) { + responsePromise = Promise.reject(err); + } + // Get route's catch handler, if it exists + const catchHandler = route && route.catchHandler; + if (responsePromise instanceof Promise && (this._catchHandler || catchHandler)) { + responsePromise = responsePromise.catch(async err => { + // If there's a route catch handler, process that first + if (catchHandler) { + { + // Still include URL here as it will be async from the console group + // and may not make sense without the URL + logger.groupCollapsed(`Error thrown when responding to: ` + ` ${getFriendlyURL(url)}. Falling back to route's Catch Handler.`); + logger.error(`Error thrown by:`, route); + logger.error(err); + logger.groupEnd(); + } + try { + return await catchHandler.handle({ + url, + request, + event, + params + }); + } catch (catchErr) { + if (catchErr instanceof Error) { + err = catchErr; + } + } + } + if (this._catchHandler) { + { + // Still include URL here as it will be async from the console group + // and may not make sense without the URL + logger.groupCollapsed(`Error thrown when responding to: ` + ` ${getFriendlyURL(url)}. Falling back to global Catch Handler.`); + logger.error(`Error thrown by:`, route); + logger.error(err); + logger.groupEnd(); + } + return this._catchHandler.handle({ + url, + request, + event + }); + } + throw err; + }); + } + return responsePromise; + } + /** + * Checks a request and URL (and optionally an event) against the list of + * registered routes, and if there's a match, returns the corresponding + * route along with any params generated by the match. + * + * @param {Object} options + * @param {URL} options.url + * @param {boolean} options.sameOrigin The result of comparing `url.origin` + * against the current origin. + * @param {Request} options.request The request to match. + * @param {Event} options.event The corresponding event. + * @return {Object} An object with `route` and `params` properties. + * They are populated if a matching route was found or `undefined` + * otherwise. + */ + findMatchingRoute({ + url, + sameOrigin, + request, + event + }) { + const routes = this._routes.get(request.method) || []; + for (const route of routes) { + let params; + // route.match returns type any, not possible to change right now. + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + const matchResult = route.match({ + url, + sameOrigin, + request, + event + }); + if (matchResult) { + { + // Warn developers that using an async matchCallback is almost always + // not the right thing to do. + if (matchResult instanceof Promise) { + logger.warn(`While routing ${getFriendlyURL(url)}, an async ` + `matchCallback function was used. Please convert the ` + `following route to use a synchronous matchCallback function:`, route); + } + } + // See https://github.com/GoogleChrome/workbox/issues/2079 + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + params = matchResult; + if (Array.isArray(params) && params.length === 0) { + // Instead of passing an empty array in as params, use undefined. + params = undefined; + } else if (matchResult.constructor === Object && + // eslint-disable-line + Object.keys(matchResult).length === 0) { + // Instead of passing an empty object in as params, use undefined. + params = undefined; + } else if (typeof matchResult === 'boolean') { + // For the boolean value true (rather than just something truth-y), + // don't set params. + // See https://github.com/GoogleChrome/workbox/pull/2134#issuecomment-513924353 + params = undefined; + } + // Return early if have a match. + return { + route, + params + }; + } + } + // If no match was found above, return and empty object. + return {}; + } + /** + * Define a default `handler` that's called when no routes explicitly + * match the incoming request. + * + * Each HTTP method ('GET', 'POST', etc.) gets its own default handler. + * + * Without a default handler, unmatched requests will go against the + * network as if there were no service worker present. + * + * @param {workbox-routing~handlerCallback} handler A callback + * function that returns a Promise resulting in a Response. + * @param {string} [method='GET'] The HTTP method to associate with this + * default handler. Each method has its own default. + */ + setDefaultHandler(handler, method = defaultMethod) { + this._defaultHandlerMap.set(method, normalizeHandler(handler)); + } + /** + * If a Route throws an error while handling a request, this `handler` + * will be called and given a chance to provide a response. + * + * @param {workbox-routing~handlerCallback} handler A callback + * function that returns a Promise resulting in a Response. + */ + setCatchHandler(handler) { + this._catchHandler = normalizeHandler(handler); + } + /** + * Registers a route with the router. + * + * @param {workbox-routing.Route} route The route to register. + */ + registerRoute(route) { + { + finalAssertExports.isType(route, 'object', { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'registerRoute', + paramName: 'route' + }); + finalAssertExports.hasMethod(route, 'match', { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'registerRoute', + paramName: 'route' + }); + finalAssertExports.isType(route.handler, 'object', { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'registerRoute', + paramName: 'route' + }); + finalAssertExports.hasMethod(route.handler, 'handle', { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'registerRoute', + paramName: 'route.handler' + }); + finalAssertExports.isType(route.method, 'string', { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'registerRoute', + paramName: 'route.method' + }); + } + if (!this._routes.has(route.method)) { + this._routes.set(route.method, []); + } + // Give precedence to all of the earlier routes by adding this additional + // route to the end of the array. + this._routes.get(route.method).push(route); + } + /** + * Unregisters a route with the router. + * + * @param {workbox-routing.Route} route The route to unregister. + */ + unregisterRoute(route) { + if (!this._routes.has(route.method)) { + throw new WorkboxError('unregister-route-but-not-found-with-method', { + method: route.method + }); + } + const routeIndex = this._routes.get(route.method).indexOf(route); + if (routeIndex > -1) { + this._routes.get(route.method).splice(routeIndex, 1); + } else { + throw new WorkboxError('unregister-route-route-not-registered'); + } + } + } + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + let defaultRouter; + /** + * Creates a new, singleton Router instance if one does not exist. If one + * does already exist, that instance is returned. + * + * @private + * @return {Router} + */ + const getOrCreateDefaultRouter = () => { + if (!defaultRouter) { + defaultRouter = new Router(); + // The helpers that use the default Router assume these listeners exist. + defaultRouter.addFetchListener(); + defaultRouter.addCacheListener(); + } + return defaultRouter; + }; + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Easily register a RegExp, string, or function with a caching + * strategy to a singleton Router instance. + * + * This method will generate a Route for you if needed and + * call {@link workbox-routing.Router#registerRoute}. + * + * @param {RegExp|string|workbox-routing.Route~matchCallback|workbox-routing.Route} capture + * If the capture param is a `Route`, all other arguments will be ignored. + * @param {workbox-routing~handlerCallback} [handler] A callback + * function that returns a Promise resulting in a Response. This parameter + * is required if `capture` is not a `Route` object. + * @param {string} [method='GET'] The HTTP method to match the Route + * against. + * @return {workbox-routing.Route} The generated `Route`. + * + * @memberof workbox-routing + */ + function registerRoute(capture, handler, method) { + let route; + if (typeof capture === 'string') { + const captureUrl = new URL(capture, location.href); + { + if (!(capture.startsWith('/') || capture.startsWith('http'))) { + throw new WorkboxError('invalid-string', { + moduleName: 'workbox-routing', + funcName: 'registerRoute', + paramName: 'capture' + }); + } + // We want to check if Express-style wildcards are in the pathname only. + // TODO: Remove this log message in v4. + const valueToCheck = capture.startsWith('http') ? captureUrl.pathname : capture; + // See https://github.com/pillarjs/path-to-regexp#parameters + const wildcards = '[*:?+]'; + if (new RegExp(`${wildcards}`).exec(valueToCheck)) { + logger.debug(`The '$capture' parameter contains an Express-style wildcard ` + `character (${wildcards}). Strings are now always interpreted as ` + `exact matches; use a RegExp for partial or wildcard matches.`); + } + } + const matchCallback = ({ + url + }) => { + { + if (url.pathname === captureUrl.pathname && url.origin !== captureUrl.origin) { + logger.debug(`${capture} only partially matches the cross-origin URL ` + `${url.toString()}. This route will only handle cross-origin requests ` + `if they match the entire URL.`); + } + } + return url.href === captureUrl.href; + }; + // If `capture` is a string then `handler` and `method` must be present. + route = new Route(matchCallback, handler, method); + } else if (capture instanceof RegExp) { + // If `capture` is a `RegExp` then `handler` and `method` must be present. + route = new RegExpRoute(capture, handler, method); + } else if (typeof capture === 'function') { + // If `capture` is a function then `handler` and `method` must be present. + route = new Route(capture, handler, method); + } else if (capture instanceof Route) { + route = capture; + } else { + throw new WorkboxError('unsupported-route-type', { + moduleName: 'workbox-routing', + funcName: 'registerRoute', + paramName: 'capture' + }); + } + const defaultRouter = getOrCreateDefaultRouter(); + defaultRouter.registerRoute(route); + return route; + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const _cacheNameDetails = { + googleAnalytics: 'googleAnalytics', + precache: 'precache-v2', + prefix: 'workbox', + runtime: 'runtime', + suffix: typeof registration !== 'undefined' ? registration.scope : '' + }; + const _createCacheName = cacheName => { + return [_cacheNameDetails.prefix, cacheName, _cacheNameDetails.suffix].filter(value => value && value.length > 0).join('-'); + }; + const eachCacheNameDetail = fn => { + for (const key of Object.keys(_cacheNameDetails)) { + fn(key); + } + }; + const cacheNames = { + updateDetails: details => { + eachCacheNameDetail(key => { + if (typeof details[key] === 'string') { + _cacheNameDetails[key] = details[key]; + } + }); + }, + getGoogleAnalyticsName: userCacheName => { + return userCacheName || _createCacheName(_cacheNameDetails.googleAnalytics); + }, + getPrecacheName: userCacheName => { + return userCacheName || _createCacheName(_cacheNameDetails.precache); + }, + getPrefix: () => { + return _cacheNameDetails.prefix; + }, + getRuntimeName: userCacheName => { + return userCacheName || _createCacheName(_cacheNameDetails.runtime); + }, + getSuffix: () => { + return _cacheNameDetails.suffix; + } + }; + + /* + Copyright 2020 Google LLC + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * A utility method that makes it easier to use `event.waitUntil` with + * async functions and return the result. + * + * @param {ExtendableEvent} event + * @param {Function} asyncFn + * @return {Function} + * @private + */ + function waitUntil(event, asyncFn) { + const returnPromise = asyncFn(); + event.waitUntil(returnPromise); + return returnPromise; + } + + // @ts-ignore + try { + self['workbox:precaching:7.0.0'] && _(); + } catch (e) {} + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + // Name of the search parameter used to store revision info. + const REVISION_SEARCH_PARAM = '__WB_REVISION__'; + /** + * Converts a manifest entry into a versioned URL suitable for precaching. + * + * @param {Object|string} entry + * @return {string} A URL with versioning info. + * + * @private + * @memberof workbox-precaching + */ + function createCacheKey(entry) { + if (!entry) { + throw new WorkboxError('add-to-cache-list-unexpected-type', { + entry + }); + } + // If a precache manifest entry is a string, it's assumed to be a versioned + // URL, like '/app.abcd1234.js'. Return as-is. + if (typeof entry === 'string') { + const urlObject = new URL(entry, location.href); + return { + cacheKey: urlObject.href, + url: urlObject.href + }; + } + const { + revision, + url + } = entry; + if (!url) { + throw new WorkboxError('add-to-cache-list-unexpected-type', { + entry + }); + } + // If there's just a URL and no revision, then it's also assumed to be a + // versioned URL. + if (!revision) { + const urlObject = new URL(url, location.href); + return { + cacheKey: urlObject.href, + url: urlObject.href + }; + } + // Otherwise, construct a properly versioned URL using the custom Workbox + // search parameter along with the revision info. + const cacheKeyURL = new URL(url, location.href); + const originalURL = new URL(url, location.href); + cacheKeyURL.searchParams.set(REVISION_SEARCH_PARAM, revision); + return { + cacheKey: cacheKeyURL.href, + url: originalURL.href + }; + } + + /* + Copyright 2020 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * A plugin, designed to be used with PrecacheController, to determine the + * of assets that were updated (or not updated) during the install event. + * + * @private + */ + class PrecacheInstallReportPlugin { + constructor() { + this.updatedURLs = []; + this.notUpdatedURLs = []; + this.handlerWillStart = async ({ + request, + state + }) => { + // TODO: `state` should never be undefined... + if (state) { + state.originalRequest = request; + } + }; + this.cachedResponseWillBeUsed = async ({ + event, + state, + cachedResponse + }) => { + if (event.type === 'install') { + if (state && state.originalRequest && state.originalRequest instanceof Request) { + // TODO: `state` should never be undefined... + const url = state.originalRequest.url; + if (cachedResponse) { + this.notUpdatedURLs.push(url); + } else { + this.updatedURLs.push(url); + } + } + } + return cachedResponse; + }; + } + } + + /* + Copyright 2020 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * A plugin, designed to be used with PrecacheController, to translate URLs into + * the corresponding cache key, based on the current revision info. + * + * @private + */ + class PrecacheCacheKeyPlugin { + constructor({ + precacheController + }) { + this.cacheKeyWillBeUsed = async ({ + request, + params + }) => { + // Params is type any, can't change right now. + /* eslint-disable */ + const cacheKey = (params === null || params === void 0 ? void 0 : params.cacheKey) || this._precacheController.getCacheKeyForURL(request.url); + /* eslint-enable */ + return cacheKey ? new Request(cacheKey, { + headers: request.headers + }) : request; + }; + this._precacheController = precacheController; + } + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * @param {string} groupTitle + * @param {Array} deletedURLs + * + * @private + */ + const logGroup = (groupTitle, deletedURLs) => { + logger.groupCollapsed(groupTitle); + for (const url of deletedURLs) { + logger.log(url); + } + logger.groupEnd(); + }; + /** + * @param {Array} deletedURLs + * + * @private + * @memberof workbox-precaching + */ + function printCleanupDetails(deletedURLs) { + const deletionCount = deletedURLs.length; + if (deletionCount > 0) { + logger.groupCollapsed(`During precaching cleanup, ` + `${deletionCount} cached ` + `request${deletionCount === 1 ? ' was' : 's were'} deleted.`); + logGroup('Deleted Cache Requests', deletedURLs); + logger.groupEnd(); + } + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * @param {string} groupTitle + * @param {Array} urls + * + * @private + */ + function _nestedGroup(groupTitle, urls) { + if (urls.length === 0) { + return; + } + logger.groupCollapsed(groupTitle); + for (const url of urls) { + logger.log(url); + } + logger.groupEnd(); + } + /** + * @param {Array} urlsToPrecache + * @param {Array} urlsAlreadyPrecached + * + * @private + * @memberof workbox-precaching + */ + function printInstallDetails(urlsToPrecache, urlsAlreadyPrecached) { + const precachedCount = urlsToPrecache.length; + const alreadyPrecachedCount = urlsAlreadyPrecached.length; + if (precachedCount || alreadyPrecachedCount) { + let message = `Precaching ${precachedCount} file${precachedCount === 1 ? '' : 's'}.`; + if (alreadyPrecachedCount > 0) { + message += ` ${alreadyPrecachedCount} ` + `file${alreadyPrecachedCount === 1 ? ' is' : 's are'} already cached.`; + } + logger.groupCollapsed(message); + _nestedGroup(`View newly precached URLs.`, urlsToPrecache); + _nestedGroup(`View previously precached URLs.`, urlsAlreadyPrecached); + logger.groupEnd(); + } + } + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + let supportStatus; + /** + * A utility function that determines whether the current browser supports + * constructing a new `Response` from a `response.body` stream. + * + * @return {boolean} `true`, if the current browser can successfully + * construct a `Response` from a `response.body` stream, `false` otherwise. + * + * @private + */ + function canConstructResponseFromBodyStream() { + if (supportStatus === undefined) { + const testResponse = new Response(''); + if ('body' in testResponse) { + try { + new Response(testResponse.body); + supportStatus = true; + } catch (error) { + supportStatus = false; + } + } + supportStatus = false; + } + return supportStatus; + } + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Allows developers to copy a response and modify its `headers`, `status`, + * or `statusText` values (the values settable via a + * [`ResponseInit`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Response/Response#Syntax} + * object in the constructor). + * To modify these values, pass a function as the second argument. That + * function will be invoked with a single object with the response properties + * `{headers, status, statusText}`. The return value of this function will + * be used as the `ResponseInit` for the new `Response`. To change the values + * either modify the passed parameter(s) and return it, or return a totally + * new object. + * + * This method is intentionally limited to same-origin responses, regardless of + * whether CORS was used or not. + * + * @param {Response} response + * @param {Function} modifier + * @memberof workbox-core + */ + async function copyResponse(response, modifier) { + let origin = null; + // If response.url isn't set, assume it's cross-origin and keep origin null. + if (response.url) { + const responseURL = new URL(response.url); + origin = responseURL.origin; + } + if (origin !== self.location.origin) { + throw new WorkboxError('cross-origin-copy-response', { + origin + }); + } + const clonedResponse = response.clone(); + // Create a fresh `ResponseInit` object by cloning the headers. + const responseInit = { + headers: new Headers(clonedResponse.headers), + status: clonedResponse.status, + statusText: clonedResponse.statusText + }; + // Apply any user modifications. + const modifiedResponseInit = modifier ? modifier(responseInit) : responseInit; + // Create the new response from the body stream and `ResponseInit` + // modifications. Note: not all browsers support the Response.body stream, + // so fall back to reading the entire body into memory as a blob. + const body = canConstructResponseFromBodyStream() ? clonedResponse.body : await clonedResponse.blob(); + return new Response(body, modifiedResponseInit); + } + + /* + Copyright 2020 Google LLC + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + function stripParams(fullURL, ignoreParams) { + const strippedURL = new URL(fullURL); + for (const param of ignoreParams) { + strippedURL.searchParams.delete(param); + } + return strippedURL.href; + } + /** + * Matches an item in the cache, ignoring specific URL params. This is similar + * to the `ignoreSearch` option, but it allows you to ignore just specific + * params (while continuing to match on the others). + * + * @private + * @param {Cache} cache + * @param {Request} request + * @param {Object} matchOptions + * @param {Array} ignoreParams + * @return {Promise} + */ + async function cacheMatchIgnoreParams(cache, request, ignoreParams, matchOptions) { + const strippedRequestURL = stripParams(request.url, ignoreParams); + // If the request doesn't include any ignored params, match as normal. + if (request.url === strippedRequestURL) { + return cache.match(request, matchOptions); + } + // Otherwise, match by comparing keys + const keysOptions = Object.assign(Object.assign({}, matchOptions), { + ignoreSearch: true + }); + const cacheKeys = await cache.keys(request, keysOptions); + for (const cacheKey of cacheKeys) { + const strippedCacheKeyURL = stripParams(cacheKey.url, ignoreParams); + if (strippedRequestURL === strippedCacheKeyURL) { + return cache.match(cacheKey, matchOptions); + } + } + return; + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * The Deferred class composes Promises in a way that allows for them to be + * resolved or rejected from outside the constructor. In most cases promises + * should be used directly, but Deferreds can be necessary when the logic to + * resolve a promise must be separate. + * + * @private + */ + class Deferred { + /** + * Creates a promise and exposes its resolve and reject functions as methods. + */ + constructor() { + this.promise = new Promise((resolve, reject) => { + this.resolve = resolve; + this.reject = reject; + }); + } + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + // Callbacks to be executed whenever there's a quota error. + // Can't change Function type right now. + // eslint-disable-next-line @typescript-eslint/ban-types + const quotaErrorCallbacks = new Set(); + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Runs all of the callback functions, one at a time sequentially, in the order + * in which they were registered. + * + * @memberof workbox-core + * @private + */ + async function executeQuotaErrorCallbacks() { + { + logger.log(`About to run ${quotaErrorCallbacks.size} ` + `callbacks to clean up caches.`); + } + for (const callback of quotaErrorCallbacks) { + await callback(); + { + logger.log(callback, 'is complete.'); + } + } + { + logger.log('Finished running callbacks.'); + } + } + + /* + Copyright 2019 Google LLC + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Returns a promise that resolves and the passed number of milliseconds. + * This utility is an async/await-friendly version of `setTimeout`. + * + * @param {number} ms + * @return {Promise} + * @private + */ + function timeout(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); + } + + // @ts-ignore + try { + self['workbox:strategies:7.0.0'] && _(); + } catch (e) {} + + /* + Copyright 2020 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + function toRequest(input) { + return typeof input === 'string' ? new Request(input) : input; + } + /** + * A class created every time a Strategy instance instance calls + * {@link workbox-strategies.Strategy~handle} or + * {@link workbox-strategies.Strategy~handleAll} that wraps all fetch and + * cache actions around plugin callbacks and keeps track of when the strategy + * is "done" (i.e. all added `event.waitUntil()` promises have resolved). + * + * @memberof workbox-strategies + */ + class StrategyHandler { + /** + * Creates a new instance associated with the passed strategy and event + * that's handling the request. + * + * The constructor also initializes the state that will be passed to each of + * the plugins handling this request. + * + * @param {workbox-strategies.Strategy} strategy + * @param {Object} options + * @param {Request|string} options.request A request to run this strategy for. + * @param {ExtendableEvent} options.event The event associated with the + * request. + * @param {URL} [options.url] + * @param {*} [options.params] The return value from the + * {@link workbox-routing~matchCallback} (if applicable). + */ + constructor(strategy, options) { + this._cacheKeys = {}; + /** + * The request the strategy is performing (passed to the strategy's + * `handle()` or `handleAll()` method). + * @name request + * @instance + * @type {Request} + * @memberof workbox-strategies.StrategyHandler + */ + /** + * The event associated with this request. + * @name event + * @instance + * @type {ExtendableEvent} + * @memberof workbox-strategies.StrategyHandler + */ + /** + * A `URL` instance of `request.url` (if passed to the strategy's + * `handle()` or `handleAll()` method). + * Note: the `url` param will be present if the strategy was invoked + * from a workbox `Route` object. + * @name url + * @instance + * @type {URL|undefined} + * @memberof workbox-strategies.StrategyHandler + */ + /** + * A `param` value (if passed to the strategy's + * `handle()` or `handleAll()` method). + * Note: the `param` param will be present if the strategy was invoked + * from a workbox `Route` object and the + * {@link workbox-routing~matchCallback} returned + * a truthy value (it will be that value). + * @name params + * @instance + * @type {*|undefined} + * @memberof workbox-strategies.StrategyHandler + */ + { + finalAssertExports.isInstance(options.event, ExtendableEvent, { + moduleName: 'workbox-strategies', + className: 'StrategyHandler', + funcName: 'constructor', + paramName: 'options.event' + }); + } + Object.assign(this, options); + this.event = options.event; + this._strategy = strategy; + this._handlerDeferred = new Deferred(); + this._extendLifetimePromises = []; + // Copy the plugins list (since it's mutable on the strategy), + // so any mutations don't affect this handler instance. + this._plugins = [...strategy.plugins]; + this._pluginStateMap = new Map(); + for (const plugin of this._plugins) { + this._pluginStateMap.set(plugin, {}); + } + this.event.waitUntil(this._handlerDeferred.promise); + } + /** + * Fetches a given request (and invokes any applicable plugin callback + * methods) using the `fetchOptions` (for non-navigation requests) and + * `plugins` defined on the `Strategy` object. + * + * The following plugin lifecycle methods are invoked when using this method: + * - `requestWillFetch()` + * - `fetchDidSucceed()` + * - `fetchDidFail()` + * + * @param {Request|string} input The URL or request to fetch. + * @return {Promise} + */ + async fetch(input) { + const { + event + } = this; + let request = toRequest(input); + if (request.mode === 'navigate' && event instanceof FetchEvent && event.preloadResponse) { + const possiblePreloadResponse = await event.preloadResponse; + if (possiblePreloadResponse) { + { + logger.log(`Using a preloaded navigation response for ` + `'${getFriendlyURL(request.url)}'`); + } + return possiblePreloadResponse; + } + } + // If there is a fetchDidFail plugin, we need to save a clone of the + // original request before it's either modified by a requestWillFetch + // plugin or before the original request's body is consumed via fetch(). + const originalRequest = this.hasCallback('fetchDidFail') ? request.clone() : null; + try { + for (const cb of this.iterateCallbacks('requestWillFetch')) { + request = await cb({ + request: request.clone(), + event + }); + } + } catch (err) { + if (err instanceof Error) { + throw new WorkboxError('plugin-error-request-will-fetch', { + thrownErrorMessage: err.message + }); + } + } + // The request can be altered by plugins with `requestWillFetch` making + // the original request (most likely from a `fetch` event) different + // from the Request we make. Pass both to `fetchDidFail` to aid debugging. + const pluginFilteredRequest = request.clone(); + try { + let fetchResponse; + // See https://github.com/GoogleChrome/workbox/issues/1796 + fetchResponse = await fetch(request, request.mode === 'navigate' ? undefined : this._strategy.fetchOptions); + if ("development" !== 'production') { + logger.debug(`Network request for ` + `'${getFriendlyURL(request.url)}' returned a response with ` + `status '${fetchResponse.status}'.`); + } + for (const callback of this.iterateCallbacks('fetchDidSucceed')) { + fetchResponse = await callback({ + event, + request: pluginFilteredRequest, + response: fetchResponse + }); + } + return fetchResponse; + } catch (error) { + { + logger.log(`Network request for ` + `'${getFriendlyURL(request.url)}' threw an error.`, error); + } + // `originalRequest` will only exist if a `fetchDidFail` callback + // is being used (see above). + if (originalRequest) { + await this.runCallbacks('fetchDidFail', { + error: error, + event, + originalRequest: originalRequest.clone(), + request: pluginFilteredRequest.clone() + }); + } + throw error; + } + } + /** + * Calls `this.fetch()` and (in the background) runs `this.cachePut()` on + * the response generated by `this.fetch()`. + * + * The call to `this.cachePut()` automatically invokes `this.waitUntil()`, + * so you do not have to manually call `waitUntil()` on the event. + * + * @param {Request|string} input The request or URL to fetch and cache. + * @return {Promise} + */ + async fetchAndCachePut(input) { + const response = await this.fetch(input); + const responseClone = response.clone(); + void this.waitUntil(this.cachePut(input, responseClone)); + return response; + } + /** + * Matches a request from the cache (and invokes any applicable plugin + * callback methods) using the `cacheName`, `matchOptions`, and `plugins` + * defined on the strategy object. + * + * The following plugin lifecycle methods are invoked when using this method: + * - cacheKeyWillByUsed() + * - cachedResponseWillByUsed() + * + * @param {Request|string} key The Request or URL to use as the cache key. + * @return {Promise} A matching response, if found. + */ + async cacheMatch(key) { + const request = toRequest(key); + let cachedResponse; + const { + cacheName, + matchOptions + } = this._strategy; + const effectiveRequest = await this.getCacheKey(request, 'read'); + const multiMatchOptions = Object.assign(Object.assign({}, matchOptions), { + cacheName + }); + cachedResponse = await caches.match(effectiveRequest, multiMatchOptions); + { + if (cachedResponse) { + logger.debug(`Found a cached response in '${cacheName}'.`); + } else { + logger.debug(`No cached response found in '${cacheName}'.`); + } + } + for (const callback of this.iterateCallbacks('cachedResponseWillBeUsed')) { + cachedResponse = (await callback({ + cacheName, + matchOptions, + cachedResponse, + request: effectiveRequest, + event: this.event + })) || undefined; + } + return cachedResponse; + } + /** + * Puts a request/response pair in the cache (and invokes any applicable + * plugin callback methods) using the `cacheName` and `plugins` defined on + * the strategy object. + * + * The following plugin lifecycle methods are invoked when using this method: + * - cacheKeyWillByUsed() + * - cacheWillUpdate() + * - cacheDidUpdate() + * + * @param {Request|string} key The request or URL to use as the cache key. + * @param {Response} response The response to cache. + * @return {Promise} `false` if a cacheWillUpdate caused the response + * not be cached, and `true` otherwise. + */ + async cachePut(key, response) { + const request = toRequest(key); + // Run in the next task to avoid blocking other cache reads. + // https://github.com/w3c/ServiceWorker/issues/1397 + await timeout(0); + const effectiveRequest = await this.getCacheKey(request, 'write'); + { + if (effectiveRequest.method && effectiveRequest.method !== 'GET') { + throw new WorkboxError('attempt-to-cache-non-get-request', { + url: getFriendlyURL(effectiveRequest.url), + method: effectiveRequest.method + }); + } + // See https://github.com/GoogleChrome/workbox/issues/2818 + const vary = response.headers.get('Vary'); + if (vary) { + logger.debug(`The response for ${getFriendlyURL(effectiveRequest.url)} ` + `has a 'Vary: ${vary}' header. ` + `Consider setting the {ignoreVary: true} option on your strategy ` + `to ensure cache matching and deletion works as expected.`); + } + } + if (!response) { + { + logger.error(`Cannot cache non-existent response for ` + `'${getFriendlyURL(effectiveRequest.url)}'.`); + } + throw new WorkboxError('cache-put-with-no-response', { + url: getFriendlyURL(effectiveRequest.url) + }); + } + const responseToCache = await this._ensureResponseSafeToCache(response); + if (!responseToCache) { + { + logger.debug(`Response '${getFriendlyURL(effectiveRequest.url)}' ` + `will not be cached.`, responseToCache); + } + return false; + } + const { + cacheName, + matchOptions + } = this._strategy; + const cache = await self.caches.open(cacheName); + const hasCacheUpdateCallback = this.hasCallback('cacheDidUpdate'); + const oldResponse = hasCacheUpdateCallback ? await cacheMatchIgnoreParams( + // TODO(philipwalton): the `__WB_REVISION__` param is a precaching + // feature. Consider into ways to only add this behavior if using + // precaching. + cache, effectiveRequest.clone(), ['__WB_REVISION__'], matchOptions) : null; + { + logger.debug(`Updating the '${cacheName}' cache with a new Response ` + `for ${getFriendlyURL(effectiveRequest.url)}.`); + } + try { + await cache.put(effectiveRequest, hasCacheUpdateCallback ? responseToCache.clone() : responseToCache); + } catch (error) { + if (error instanceof Error) { + // See https://developer.mozilla.org/en-US/docs/Web/API/DOMException#exception-QuotaExceededError + if (error.name === 'QuotaExceededError') { + await executeQuotaErrorCallbacks(); + } + throw error; + } + } + for (const callback of this.iterateCallbacks('cacheDidUpdate')) { + await callback({ + cacheName, + oldResponse, + newResponse: responseToCache.clone(), + request: effectiveRequest, + event: this.event + }); + } + return true; + } + /** + * Checks the list of plugins for the `cacheKeyWillBeUsed` callback, and + * executes any of those callbacks found in sequence. The final `Request` + * object returned by the last plugin is treated as the cache key for cache + * reads and/or writes. If no `cacheKeyWillBeUsed` plugin callbacks have + * been registered, the passed request is returned unmodified + * + * @param {Request} request + * @param {string} mode + * @return {Promise} + */ + async getCacheKey(request, mode) { + const key = `${request.url} | ${mode}`; + if (!this._cacheKeys[key]) { + let effectiveRequest = request; + for (const callback of this.iterateCallbacks('cacheKeyWillBeUsed')) { + effectiveRequest = toRequest(await callback({ + mode, + request: effectiveRequest, + event: this.event, + // params has a type any can't change right now. + params: this.params // eslint-disable-line + })); + } + + this._cacheKeys[key] = effectiveRequest; + } + return this._cacheKeys[key]; + } + /** + * Returns true if the strategy has at least one plugin with the given + * callback. + * + * @param {string} name The name of the callback to check for. + * @return {boolean} + */ + hasCallback(name) { + for (const plugin of this._strategy.plugins) { + if (name in plugin) { + return true; + } + } + return false; + } + /** + * Runs all plugin callbacks matching the given name, in order, passing the + * given param object (merged ith the current plugin state) as the only + * argument. + * + * Note: since this method runs all plugins, it's not suitable for cases + * where the return value of a callback needs to be applied prior to calling + * the next callback. See + * {@link workbox-strategies.StrategyHandler#iterateCallbacks} + * below for how to handle that case. + * + * @param {string} name The name of the callback to run within each plugin. + * @param {Object} param The object to pass as the first (and only) param + * when executing each callback. This object will be merged with the + * current plugin state prior to callback execution. + */ + async runCallbacks(name, param) { + for (const callback of this.iterateCallbacks(name)) { + // TODO(philipwalton): not sure why `any` is needed. It seems like + // this should work with `as WorkboxPluginCallbackParam[C]`. + await callback(param); + } + } + /** + * Accepts a callback and returns an iterable of matching plugin callbacks, + * where each callback is wrapped with the current handler state (i.e. when + * you call each callback, whatever object parameter you pass it will + * be merged with the plugin's current state). + * + * @param {string} name The name fo the callback to run + * @return {Array} + */ + *iterateCallbacks(name) { + for (const plugin of this._strategy.plugins) { + if (typeof plugin[name] === 'function') { + const state = this._pluginStateMap.get(plugin); + const statefulCallback = param => { + const statefulParam = Object.assign(Object.assign({}, param), { + state + }); + // TODO(philipwalton): not sure why `any` is needed. It seems like + // this should work with `as WorkboxPluginCallbackParam[C]`. + return plugin[name](statefulParam); + }; + yield statefulCallback; + } + } + } + /** + * Adds a promise to the + * [extend lifetime promises]{@link https://w3c.github.io/ServiceWorker/#extendableevent-extend-lifetime-promises} + * of the event event associated with the request being handled (usually a + * `FetchEvent`). + * + * Note: you can await + * {@link workbox-strategies.StrategyHandler~doneWaiting} + * to know when all added promises have settled. + * + * @param {Promise} promise A promise to add to the extend lifetime promises + * of the event that triggered the request. + */ + waitUntil(promise) { + this._extendLifetimePromises.push(promise); + return promise; + } + /** + * Returns a promise that resolves once all promises passed to + * {@link workbox-strategies.StrategyHandler~waitUntil} + * have settled. + * + * Note: any work done after `doneWaiting()` settles should be manually + * passed to an event's `waitUntil()` method (not this handler's + * `waitUntil()` method), otherwise the service worker thread my be killed + * prior to your work completing. + */ + async doneWaiting() { + let promise; + while (promise = this._extendLifetimePromises.shift()) { + await promise; + } + } + /** + * Stops running the strategy and immediately resolves any pending + * `waitUntil()` promises. + */ + destroy() { + this._handlerDeferred.resolve(null); + } + /** + * This method will call cacheWillUpdate on the available plugins (or use + * status === 200) to determine if the Response is safe and valid to cache. + * + * @param {Request} options.request + * @param {Response} options.response + * @return {Promise} + * + * @private + */ + async _ensureResponseSafeToCache(response) { + let responseToCache = response; + let pluginsUsed = false; + for (const callback of this.iterateCallbacks('cacheWillUpdate')) { + responseToCache = (await callback({ + request: this.request, + response: responseToCache, + event: this.event + })) || undefined; + pluginsUsed = true; + if (!responseToCache) { + break; + } + } + if (!pluginsUsed) { + if (responseToCache && responseToCache.status !== 200) { + responseToCache = undefined; + } + { + if (responseToCache) { + if (responseToCache.status !== 200) { + if (responseToCache.status === 0) { + logger.warn(`The response for '${this.request.url}' ` + `is an opaque response. The caching strategy that you're ` + `using will not cache opaque responses by default.`); + } else { + logger.debug(`The response for '${this.request.url}' ` + `returned a status code of '${response.status}' and won't ` + `be cached as a result.`); + } + } + } + } + } + return responseToCache; + } + } + + /* + Copyright 2020 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * An abstract base class that all other strategy classes must extend from: + * + * @memberof workbox-strategies + */ + class Strategy { + /** + * Creates a new instance of the strategy and sets all documented option + * properties as public instance properties. + * + * Note: if a custom strategy class extends the base Strategy class and does + * not need more than these properties, it does not need to define its own + * constructor. + * + * @param {Object} [options] + * @param {string} [options.cacheName] Cache name to store and retrieve + * requests. Defaults to the cache names provided by + * {@link workbox-core.cacheNames}. + * @param {Array} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} + * to use in conjunction with this caching strategy. + * @param {Object} [options.fetchOptions] Values passed along to the + * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters) + * of [non-navigation](https://github.com/GoogleChrome/workbox/issues/1796) + * `fetch()` requests made by this strategy. + * @param {Object} [options.matchOptions] The + * [`CacheQueryOptions`]{@link https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions} + * for any `cache.match()` or `cache.put()` calls made by this strategy. + */ + constructor(options = {}) { + /** + * Cache name to store and retrieve + * requests. Defaults to the cache names provided by + * {@link workbox-core.cacheNames}. + * + * @type {string} + */ + this.cacheName = cacheNames.getRuntimeName(options.cacheName); + /** + * The list + * [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} + * used by this strategy. + * + * @type {Array} + */ + this.plugins = options.plugins || []; + /** + * Values passed along to the + * [`init`]{@link https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters} + * of all fetch() requests made by this strategy. + * + * @type {Object} + */ + this.fetchOptions = options.fetchOptions; + /** + * The + * [`CacheQueryOptions`]{@link https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions} + * for any `cache.match()` or `cache.put()` calls made by this strategy. + * + * @type {Object} + */ + this.matchOptions = options.matchOptions; + } + /** + * Perform a request strategy and returns a `Promise` that will resolve with + * a `Response`, invoking all relevant plugin callbacks. + * + * When a strategy instance is registered with a Workbox + * {@link workbox-routing.Route}, this method is automatically + * called when the route matches. + * + * Alternatively, this method can be used in a standalone `FetchEvent` + * listener by passing it to `event.respondWith()`. + * + * @param {FetchEvent|Object} options A `FetchEvent` or an object with the + * properties listed below. + * @param {Request|string} options.request A request to run this strategy for. + * @param {ExtendableEvent} options.event The event associated with the + * request. + * @param {URL} [options.url] + * @param {*} [options.params] + */ + handle(options) { + const [responseDone] = this.handleAll(options); + return responseDone; + } + /** + * Similar to {@link workbox-strategies.Strategy~handle}, but + * instead of just returning a `Promise` that resolves to a `Response` it + * it will return an tuple of `[response, done]` promises, where the former + * (`response`) is equivalent to what `handle()` returns, and the latter is a + * Promise that will resolve once any promises that were added to + * `event.waitUntil()` as part of performing the strategy have completed. + * + * You can await the `done` promise to ensure any extra work performed by + * the strategy (usually caching responses) completes successfully. + * + * @param {FetchEvent|Object} options A `FetchEvent` or an object with the + * properties listed below. + * @param {Request|string} options.request A request to run this strategy for. + * @param {ExtendableEvent} options.event The event associated with the + * request. + * @param {URL} [options.url] + * @param {*} [options.params] + * @return {Array} A tuple of [response, done] + * promises that can be used to determine when the response resolves as + * well as when the handler has completed all its work. + */ + handleAll(options) { + // Allow for flexible options to be passed. + if (options instanceof FetchEvent) { + options = { + event: options, + request: options.request + }; + } + const event = options.event; + const request = typeof options.request === 'string' ? new Request(options.request) : options.request; + const params = 'params' in options ? options.params : undefined; + const handler = new StrategyHandler(this, { + event, + request, + params + }); + const responseDone = this._getResponse(handler, request, event); + const handlerDone = this._awaitComplete(responseDone, handler, request, event); + // Return an array of promises, suitable for use with Promise.all(). + return [responseDone, handlerDone]; + } + async _getResponse(handler, request, event) { + await handler.runCallbacks('handlerWillStart', { + event, + request + }); + let response = undefined; + try { + response = await this._handle(request, handler); + // The "official" Strategy subclasses all throw this error automatically, + // but in case a third-party Strategy doesn't, ensure that we have a + // consistent failure when there's no response or an error response. + if (!response || response.type === 'error') { + throw new WorkboxError('no-response', { + url: request.url + }); + } + } catch (error) { + if (error instanceof Error) { + for (const callback of handler.iterateCallbacks('handlerDidError')) { + response = await callback({ + error, + event, + request + }); + if (response) { + break; + } + } + } + if (!response) { + throw error; + } else { + logger.log(`While responding to '${getFriendlyURL(request.url)}', ` + `an ${error instanceof Error ? error.toString() : ''} error occurred. Using a fallback response provided by ` + `a handlerDidError plugin.`); + } + } + for (const callback of handler.iterateCallbacks('handlerWillRespond')) { + response = await callback({ + event, + request, + response + }); + } + return response; + } + async _awaitComplete(responseDone, handler, request, event) { + let response; + let error; + try { + response = await responseDone; + } catch (error) { + // Ignore errors, as response errors should be caught via the `response` + // promise above. The `done` promise will only throw for errors in + // promises passed to `handler.waitUntil()`. + } + try { + await handler.runCallbacks('handlerDidRespond', { + event, + request, + response + }); + await handler.doneWaiting(); + } catch (waitUntilError) { + if (waitUntilError instanceof Error) { + error = waitUntilError; + } + } + await handler.runCallbacks('handlerDidComplete', { + event, + request, + response, + error: error + }); + handler.destroy(); + if (error) { + throw error; + } + } + } + /** + * Classes extending the `Strategy` based class should implement this method, + * and leverage the {@link workbox-strategies.StrategyHandler} + * arg to perform all fetching and cache logic, which will ensure all relevant + * cache, cache options, fetch options and plugins are used (per the current + * strategy instance). + * + * @name _handle + * @instance + * @abstract + * @function + * @param {Request} request + * @param {workbox-strategies.StrategyHandler} handler + * @return {Promise} + * + * @memberof workbox-strategies.Strategy + */ + + /* + Copyright 2020 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * A {@link workbox-strategies.Strategy} implementation + * specifically designed to work with + * {@link workbox-precaching.PrecacheController} + * to both cache and fetch precached assets. + * + * Note: an instance of this class is created automatically when creating a + * `PrecacheController`; it's generally not necessary to create this yourself. + * + * @extends workbox-strategies.Strategy + * @memberof workbox-precaching + */ + class PrecacheStrategy extends Strategy { + /** + * + * @param {Object} [options] + * @param {string} [options.cacheName] Cache name to store and retrieve + * requests. Defaults to the cache names provided by + * {@link workbox-core.cacheNames}. + * @param {Array} [options.plugins] {@link https://developers.google.com/web/tools/workbox/guides/using-plugins|Plugins} + * to use in conjunction with this caching strategy. + * @param {Object} [options.fetchOptions] Values passed along to the + * {@link https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters|init} + * of all fetch() requests made by this strategy. + * @param {Object} [options.matchOptions] The + * {@link https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions|CacheQueryOptions} + * for any `cache.match()` or `cache.put()` calls made by this strategy. + * @param {boolean} [options.fallbackToNetwork=true] Whether to attempt to + * get the response from the network if there's a precache miss. + */ + constructor(options = {}) { + options.cacheName = cacheNames.getPrecacheName(options.cacheName); + super(options); + this._fallbackToNetwork = options.fallbackToNetwork === false ? false : true; + // Redirected responses cannot be used to satisfy a navigation request, so + // any redirected response must be "copied" rather than cloned, so the new + // response doesn't contain the `redirected` flag. See: + // https://bugs.chromium.org/p/chromium/issues/detail?id=669363&desc=2#c1 + this.plugins.push(PrecacheStrategy.copyRedirectedCacheableResponsesPlugin); + } + /** + * @private + * @param {Request|string} request A request to run this strategy for. + * @param {workbox-strategies.StrategyHandler} handler The event that + * triggered the request. + * @return {Promise} + */ + async _handle(request, handler) { + const response = await handler.cacheMatch(request); + if (response) { + return response; + } + // If this is an `install` event for an entry that isn't already cached, + // then populate the cache. + if (handler.event && handler.event.type === 'install') { + return await this._handleInstall(request, handler); + } + // Getting here means something went wrong. An entry that should have been + // precached wasn't found in the cache. + return await this._handleFetch(request, handler); + } + async _handleFetch(request, handler) { + let response; + const params = handler.params || {}; + // Fall back to the network if we're configured to do so. + if (this._fallbackToNetwork) { + { + logger.warn(`The precached response for ` + `${getFriendlyURL(request.url)} in ${this.cacheName} was not ` + `found. Falling back to the network.`); + } + const integrityInManifest = params.integrity; + const integrityInRequest = request.integrity; + const noIntegrityConflict = !integrityInRequest || integrityInRequest === integrityInManifest; + // Do not add integrity if the original request is no-cors + // See https://github.com/GoogleChrome/workbox/issues/3096 + response = await handler.fetch(new Request(request, { + integrity: request.mode !== 'no-cors' ? integrityInRequest || integrityInManifest : undefined + })); + // It's only "safe" to repair the cache if we're using SRI to guarantee + // that the response matches the precache manifest's expectations, + // and there's either a) no integrity property in the incoming request + // or b) there is an integrity, and it matches the precache manifest. + // See https://github.com/GoogleChrome/workbox/issues/2858 + // Also if the original request users no-cors we don't use integrity. + // See https://github.com/GoogleChrome/workbox/issues/3096 + if (integrityInManifest && noIntegrityConflict && request.mode !== 'no-cors') { + this._useDefaultCacheabilityPluginIfNeeded(); + const wasCached = await handler.cachePut(request, response.clone()); + { + if (wasCached) { + logger.log(`A response for ${getFriendlyURL(request.url)} ` + `was used to "repair" the precache.`); + } + } + } + } else { + // This shouldn't normally happen, but there are edge cases: + // https://github.com/GoogleChrome/workbox/issues/1441 + throw new WorkboxError('missing-precache-entry', { + cacheName: this.cacheName, + url: request.url + }); + } + { + const cacheKey = params.cacheKey || (await handler.getCacheKey(request, 'read')); + // Workbox is going to handle the route. + // print the routing details to the console. + logger.groupCollapsed(`Precaching is responding to: ` + getFriendlyURL(request.url)); + logger.log(`Serving the precached url: ${getFriendlyURL(cacheKey instanceof Request ? cacheKey.url : cacheKey)}`); + logger.groupCollapsed(`View request details here.`); + logger.log(request); + logger.groupEnd(); + logger.groupCollapsed(`View response details here.`); + logger.log(response); + logger.groupEnd(); + logger.groupEnd(); + } + return response; + } + async _handleInstall(request, handler) { + this._useDefaultCacheabilityPluginIfNeeded(); + const response = await handler.fetch(request); + // Make sure we defer cachePut() until after we know the response + // should be cached; see https://github.com/GoogleChrome/workbox/issues/2737 + const wasCached = await handler.cachePut(request, response.clone()); + if (!wasCached) { + // Throwing here will lead to the `install` handler failing, which + // we want to do if *any* of the responses aren't safe to cache. + throw new WorkboxError('bad-precaching-response', { + url: request.url, + status: response.status + }); + } + return response; + } + /** + * This method is complex, as there a number of things to account for: + * + * The `plugins` array can be set at construction, and/or it might be added to + * to at any time before the strategy is used. + * + * At the time the strategy is used (i.e. during an `install` event), there + * needs to be at least one plugin that implements `cacheWillUpdate` in the + * array, other than `copyRedirectedCacheableResponsesPlugin`. + * + * - If this method is called and there are no suitable `cacheWillUpdate` + * plugins, we need to add `defaultPrecacheCacheabilityPlugin`. + * + * - If this method is called and there is exactly one `cacheWillUpdate`, then + * we don't have to do anything (this might be a previously added + * `defaultPrecacheCacheabilityPlugin`, or it might be a custom plugin). + * + * - If this method is called and there is more than one `cacheWillUpdate`, + * then we need to check if one is `defaultPrecacheCacheabilityPlugin`. If so, + * we need to remove it. (This situation is unlikely, but it could happen if + * the strategy is used multiple times, the first without a `cacheWillUpdate`, + * and then later on after manually adding a custom `cacheWillUpdate`.) + * + * See https://github.com/GoogleChrome/workbox/issues/2737 for more context. + * + * @private + */ + _useDefaultCacheabilityPluginIfNeeded() { + let defaultPluginIndex = null; + let cacheWillUpdatePluginCount = 0; + for (const [index, plugin] of this.plugins.entries()) { + // Ignore the copy redirected plugin when determining what to do. + if (plugin === PrecacheStrategy.copyRedirectedCacheableResponsesPlugin) { + continue; + } + // Save the default plugin's index, in case it needs to be removed. + if (plugin === PrecacheStrategy.defaultPrecacheCacheabilityPlugin) { + defaultPluginIndex = index; + } + if (plugin.cacheWillUpdate) { + cacheWillUpdatePluginCount++; + } + } + if (cacheWillUpdatePluginCount === 0) { + this.plugins.push(PrecacheStrategy.defaultPrecacheCacheabilityPlugin); + } else if (cacheWillUpdatePluginCount > 1 && defaultPluginIndex !== null) { + // Only remove the default plugin; multiple custom plugins are allowed. + this.plugins.splice(defaultPluginIndex, 1); + } + // Nothing needs to be done if cacheWillUpdatePluginCount is 1 + } + } + + PrecacheStrategy.defaultPrecacheCacheabilityPlugin = { + async cacheWillUpdate({ + response + }) { + if (!response || response.status >= 400) { + return null; + } + return response; + } + }; + PrecacheStrategy.copyRedirectedCacheableResponsesPlugin = { + async cacheWillUpdate({ + response + }) { + return response.redirected ? await copyResponse(response) : response; + } + }; + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Performs efficient precaching of assets. + * + * @memberof workbox-precaching + */ + class PrecacheController { + /** + * Create a new PrecacheController. + * + * @param {Object} [options] + * @param {string} [options.cacheName] The cache to use for precaching. + * @param {string} [options.plugins] Plugins to use when precaching as well + * as responding to fetch events for precached assets. + * @param {boolean} [options.fallbackToNetwork=true] Whether to attempt to + * get the response from the network if there's a precache miss. + */ + constructor({ + cacheName, + plugins = [], + fallbackToNetwork = true + } = {}) { + this._urlsToCacheKeys = new Map(); + this._urlsToCacheModes = new Map(); + this._cacheKeysToIntegrities = new Map(); + this._strategy = new PrecacheStrategy({ + cacheName: cacheNames.getPrecacheName(cacheName), + plugins: [...plugins, new PrecacheCacheKeyPlugin({ + precacheController: this + })], + fallbackToNetwork + }); + // Bind the install and activate methods to the instance. + this.install = this.install.bind(this); + this.activate = this.activate.bind(this); + } + /** + * @type {workbox-precaching.PrecacheStrategy} The strategy created by this controller and + * used to cache assets and respond to fetch events. + */ + get strategy() { + return this._strategy; + } + /** + * Adds items to the precache list, removing any duplicates and + * stores the files in the + * {@link workbox-core.cacheNames|"precache cache"} when the service + * worker installs. + * + * This method can be called multiple times. + * + * @param {Array} [entries=[]] Array of entries to precache. + */ + precache(entries) { + this.addToCacheList(entries); + if (!this._installAndActiveListenersAdded) { + self.addEventListener('install', this.install); + self.addEventListener('activate', this.activate); + this._installAndActiveListenersAdded = true; + } + } + /** + * This method will add items to the precache list, removing duplicates + * and ensuring the information is valid. + * + * @param {Array} entries + * Array of entries to precache. + */ + addToCacheList(entries) { + { + finalAssertExports.isArray(entries, { + moduleName: 'workbox-precaching', + className: 'PrecacheController', + funcName: 'addToCacheList', + paramName: 'entries' + }); + } + const urlsToWarnAbout = []; + for (const entry of entries) { + // See https://github.com/GoogleChrome/workbox/issues/2259 + if (typeof entry === 'string') { + urlsToWarnAbout.push(entry); + } else if (entry && entry.revision === undefined) { + urlsToWarnAbout.push(entry.url); + } + const { + cacheKey, + url + } = createCacheKey(entry); + const cacheMode = typeof entry !== 'string' && entry.revision ? 'reload' : 'default'; + if (this._urlsToCacheKeys.has(url) && this._urlsToCacheKeys.get(url) !== cacheKey) { + throw new WorkboxError('add-to-cache-list-conflicting-entries', { + firstEntry: this._urlsToCacheKeys.get(url), + secondEntry: cacheKey + }); + } + if (typeof entry !== 'string' && entry.integrity) { + if (this._cacheKeysToIntegrities.has(cacheKey) && this._cacheKeysToIntegrities.get(cacheKey) !== entry.integrity) { + throw new WorkboxError('add-to-cache-list-conflicting-integrities', { + url + }); + } + this._cacheKeysToIntegrities.set(cacheKey, entry.integrity); + } + this._urlsToCacheKeys.set(url, cacheKey); + this._urlsToCacheModes.set(url, cacheMode); + if (urlsToWarnAbout.length > 0) { + const warningMessage = `Workbox is precaching URLs without revision ` + `info: ${urlsToWarnAbout.join(', ')}\nThis is generally NOT safe. ` + `Learn more at https://bit.ly/wb-precache`; + { + logger.warn(warningMessage); + } + } + } + } + /** + * Precaches new and updated assets. Call this method from the service worker + * install event. + * + * Note: this method calls `event.waitUntil()` for you, so you do not need + * to call it yourself in your event handlers. + * + * @param {ExtendableEvent} event + * @return {Promise} + */ + install(event) { + // waitUntil returns Promise + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return waitUntil(event, async () => { + const installReportPlugin = new PrecacheInstallReportPlugin(); + this.strategy.plugins.push(installReportPlugin); + // Cache entries one at a time. + // See https://github.com/GoogleChrome/workbox/issues/2528 + for (const [url, cacheKey] of this._urlsToCacheKeys) { + const integrity = this._cacheKeysToIntegrities.get(cacheKey); + const cacheMode = this._urlsToCacheModes.get(url); + const request = new Request(url, { + integrity, + cache: cacheMode, + credentials: 'same-origin' + }); + await Promise.all(this.strategy.handleAll({ + params: { + cacheKey + }, + request, + event + })); + } + const { + updatedURLs, + notUpdatedURLs + } = installReportPlugin; + { + printInstallDetails(updatedURLs, notUpdatedURLs); + } + return { + updatedURLs, + notUpdatedURLs + }; + }); + } + /** + * Deletes assets that are no longer present in the current precache manifest. + * Call this method from the service worker activate event. + * + * Note: this method calls `event.waitUntil()` for you, so you do not need + * to call it yourself in your event handlers. + * + * @param {ExtendableEvent} event + * @return {Promise} + */ + activate(event) { + // waitUntil returns Promise + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return waitUntil(event, async () => { + const cache = await self.caches.open(this.strategy.cacheName); + const currentlyCachedRequests = await cache.keys(); + const expectedCacheKeys = new Set(this._urlsToCacheKeys.values()); + const deletedURLs = []; + for (const request of currentlyCachedRequests) { + if (!expectedCacheKeys.has(request.url)) { + await cache.delete(request); + deletedURLs.push(request.url); + } + } + { + printCleanupDetails(deletedURLs); + } + return { + deletedURLs + }; + }); + } + /** + * Returns a mapping of a precached URL to the corresponding cache key, taking + * into account the revision information for the URL. + * + * @return {Map} A URL to cache key mapping. + */ + getURLsToCacheKeys() { + return this._urlsToCacheKeys; + } + /** + * Returns a list of all the URLs that have been precached by the current + * service worker. + * + * @return {Array} The precached URLs. + */ + getCachedURLs() { + return [...this._urlsToCacheKeys.keys()]; + } + /** + * Returns the cache key used for storing a given URL. If that URL is + * unversioned, like `/index.html', then the cache key will be the original + * URL with a search parameter appended to it. + * + * @param {string} url A URL whose cache key you want to look up. + * @return {string} The versioned URL that corresponds to a cache key + * for the original URL, or undefined if that URL isn't precached. + */ + getCacheKeyForURL(url) { + const urlObject = new URL(url, location.href); + return this._urlsToCacheKeys.get(urlObject.href); + } + /** + * @param {string} url A cache key whose SRI you want to look up. + * @return {string} The subresource integrity associated with the cache key, + * or undefined if it's not set. + */ + getIntegrityForCacheKey(cacheKey) { + return this._cacheKeysToIntegrities.get(cacheKey); + } + /** + * This acts as a drop-in replacement for + * [`cache.match()`](https://developer.mozilla.org/en-US/docs/Web/API/Cache/match) + * with the following differences: + * + * - It knows what the name of the precache is, and only checks in that cache. + * - It allows you to pass in an "original" URL without versioning parameters, + * and it will automatically look up the correct cache key for the currently + * active revision of that URL. + * + * E.g., `matchPrecache('index.html')` will find the correct precached + * response for the currently active service worker, even if the actual cache + * key is `'/index.html?__WB_REVISION__=1234abcd'`. + * + * @param {string|Request} request The key (without revisioning parameters) + * to look up in the precache. + * @return {Promise} + */ + async matchPrecache(request) { + const url = request instanceof Request ? request.url : request; + const cacheKey = this.getCacheKeyForURL(url); + if (cacheKey) { + const cache = await self.caches.open(this.strategy.cacheName); + return cache.match(cacheKey); + } + return undefined; + } + /** + * Returns a function that looks up `url` in the precache (taking into + * account revision information), and returns the corresponding `Response`. + * + * @param {string} url The precached URL which will be used to lookup the + * `Response`. + * @return {workbox-routing~handlerCallback} + */ + createHandlerBoundToURL(url) { + const cacheKey = this.getCacheKeyForURL(url); + if (!cacheKey) { + throw new WorkboxError('non-precached-url', { + url + }); + } + return options => { + options.request = new Request(url); + options.params = Object.assign({ + cacheKey + }, options.params); + return this.strategy.handle(options); + }; + } + } + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + let precacheController; + /** + * @return {PrecacheController} + * @private + */ + const getOrCreatePrecacheController = () => { + if (!precacheController) { + precacheController = new PrecacheController(); + } + return precacheController; + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Removes any URL search parameters that should be ignored. + * + * @param {URL} urlObject The original URL. + * @param {Array} ignoreURLParametersMatching RegExps to test against + * each search parameter name. Matches mean that the search parameter should be + * ignored. + * @return {URL} The URL with any ignored search parameters removed. + * + * @private + * @memberof workbox-precaching + */ + function removeIgnoredSearchParams(urlObject, ignoreURLParametersMatching = []) { + // Convert the iterable into an array at the start of the loop to make sure + // deletion doesn't mess up iteration. + for (const paramName of [...urlObject.searchParams.keys()]) { + if (ignoreURLParametersMatching.some(regExp => regExp.test(paramName))) { + urlObject.searchParams.delete(paramName); + } + } + return urlObject; + } + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Generator function that yields possible variations on the original URL to + * check, one at a time. + * + * @param {string} url + * @param {Object} options + * + * @private + * @memberof workbox-precaching + */ + function* generateURLVariations(url, { + ignoreURLParametersMatching = [/^utm_/, /^fbclid$/], + directoryIndex = 'index.html', + cleanURLs = true, + urlManipulation + } = {}) { + const urlObject = new URL(url, location.href); + urlObject.hash = ''; + yield urlObject.href; + const urlWithoutIgnoredParams = removeIgnoredSearchParams(urlObject, ignoreURLParametersMatching); + yield urlWithoutIgnoredParams.href; + if (directoryIndex && urlWithoutIgnoredParams.pathname.endsWith('/')) { + const directoryURL = new URL(urlWithoutIgnoredParams.href); + directoryURL.pathname += directoryIndex; + yield directoryURL.href; + } + if (cleanURLs) { + const cleanURL = new URL(urlWithoutIgnoredParams.href); + cleanURL.pathname += '.html'; + yield cleanURL.href; + } + if (urlManipulation) { + const additionalURLs = urlManipulation({ + url: urlObject + }); + for (const urlToAttempt of additionalURLs) { + yield urlToAttempt.href; + } + } + } + + /* + Copyright 2020 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * A subclass of {@link workbox-routing.Route} that takes a + * {@link workbox-precaching.PrecacheController} + * instance and uses it to match incoming requests and handle fetching + * responses from the precache. + * + * @memberof workbox-precaching + * @extends workbox-routing.Route + */ + class PrecacheRoute extends Route { + /** + * @param {PrecacheController} precacheController A `PrecacheController` + * instance used to both match requests and respond to fetch events. + * @param {Object} [options] Options to control how requests are matched + * against the list of precached URLs. + * @param {string} [options.directoryIndex=index.html] The `directoryIndex` will + * check cache entries for a URLs ending with '/' to see if there is a hit when + * appending the `directoryIndex` value. + * @param {Array} [options.ignoreURLParametersMatching=[/^utm_/, /^fbclid$/]] An + * array of regex's to remove search params when looking for a cache match. + * @param {boolean} [options.cleanURLs=true] The `cleanURLs` option will + * check the cache for the URL with a `.html` added to the end of the end. + * @param {workbox-precaching~urlManipulation} [options.urlManipulation] + * This is a function that should take a URL and return an array of + * alternative URLs that should be checked for precache matches. + */ + constructor(precacheController, options) { + const match = ({ + request + }) => { + const urlsToCacheKeys = precacheController.getURLsToCacheKeys(); + for (const possibleURL of generateURLVariations(request.url, options)) { + const cacheKey = urlsToCacheKeys.get(possibleURL); + if (cacheKey) { + const integrity = precacheController.getIntegrityForCacheKey(cacheKey); + return { + cacheKey, + integrity + }; + } + } + { + logger.debug(`Precaching did not find a match for ` + getFriendlyURL(request.url)); + } + return; + }; + super(match, precacheController.strategy); + } + } + + /* + Copyright 2019 Google LLC + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Add a `fetch` listener to the service worker that will + * respond to + * [network requests]{@link https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers#Custom_responses_to_requests} + * with precached assets. + * + * Requests for assets that aren't precached, the `FetchEvent` will not be + * responded to, allowing the event to fall through to other `fetch` event + * listeners. + * + * @param {Object} [options] See the {@link workbox-precaching.PrecacheRoute} + * options. + * + * @memberof workbox-precaching + */ + function addRoute(options) { + const precacheController = getOrCreatePrecacheController(); + const precacheRoute = new PrecacheRoute(precacheController, options); + registerRoute(precacheRoute); + } + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Adds items to the precache list, removing any duplicates and + * stores the files in the + * {@link workbox-core.cacheNames|"precache cache"} when the service + * worker installs. + * + * This method can be called multiple times. + * + * Please note: This method **will not** serve any of the cached files for you. + * It only precaches files. To respond to a network request you call + * {@link workbox-precaching.addRoute}. + * + * If you have a single array of files to precache, you can just call + * {@link workbox-precaching.precacheAndRoute}. + * + * @param {Array} [entries=[]] Array of entries to precache. + * + * @memberof workbox-precaching + */ + function precache(entries) { + const precacheController = getOrCreatePrecacheController(); + precacheController.precache(entries); + } + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * This method will add entries to the precache list and add a route to + * respond to fetch events. + * + * This is a convenience method that will call + * {@link workbox-precaching.precache} and + * {@link workbox-precaching.addRoute} in a single call. + * + * @param {Array} entries Array of entries to precache. + * @param {Object} [options] See the + * {@link workbox-precaching.PrecacheRoute} options. + * + * @memberof workbox-precaching + */ + function precacheAndRoute(entries, options) { + precache(entries); + addRoute(options); + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const SUBSTRING_TO_FIND = '-precache-'; + /** + * Cleans up incompatible precaches that were created by older versions of + * Workbox, by a service worker registered under the current scope. + * + * This is meant to be called as part of the `activate` event. + * + * This should be safe to use as long as you don't include `substringToFind` + * (defaulting to `-precache-`) in your non-precache cache names. + * + * @param {string} currentPrecacheName The cache name currently in use for + * precaching. This cache won't be deleted. + * @param {string} [substringToFind='-precache-'] Cache names which include this + * substring will be deleted (excluding `currentPrecacheName`). + * @return {Array} A list of all the cache names that were deleted. + * + * @private + * @memberof workbox-precaching + */ + const deleteOutdatedCaches = async (currentPrecacheName, substringToFind = SUBSTRING_TO_FIND) => { + const cacheNames = await self.caches.keys(); + const cacheNamesToDelete = cacheNames.filter(cacheName => { + return cacheName.includes(substringToFind) && cacheName.includes(self.registration.scope) && cacheName !== currentPrecacheName; + }); + await Promise.all(cacheNamesToDelete.map(cacheName => self.caches.delete(cacheName))); + return cacheNamesToDelete; + }; + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Adds an `activate` event listener which will clean up incompatible + * precaches that were created by older versions of Workbox. + * + * @memberof workbox-precaching + */ + function cleanupOutdatedCaches() { + // See https://github.com/Microsoft/TypeScript/issues/28357#issuecomment-436484705 + self.addEventListener('activate', event => { + const cacheName = cacheNames.getPrecacheName(); + event.waitUntil(deleteOutdatedCaches(cacheName).then(cachesDeleted => { + { + if (cachesDeleted.length > 0) { + logger.log(`The following out-of-date precaches were cleaned up ` + `automatically:`, cachesDeleted); + } + } + })); + }); + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * NavigationRoute makes it easy to create a + * {@link workbox-routing.Route} that matches for browser + * [navigation requests]{@link https://developers.google.com/web/fundamentals/primers/service-workers/high-performance-loading#first_what_are_navigation_requests}. + * + * It will only match incoming Requests whose + * {@link https://fetch.spec.whatwg.org/#concept-request-mode|mode} + * is set to `navigate`. + * + * You can optionally only apply this route to a subset of navigation requests + * by using one or both of the `denylist` and `allowlist` parameters. + * + * @memberof workbox-routing + * @extends workbox-routing.Route + */ + class NavigationRoute extends Route { + /** + * If both `denylist` and `allowlist` are provided, the `denylist` will + * take precedence and the request will not match this route. + * + * The regular expressions in `allowlist` and `denylist` + * are matched against the concatenated + * [`pathname`]{@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/pathname} + * and [`search`]{@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/search} + * portions of the requested URL. + * + * *Note*: These RegExps may be evaluated against every destination URL during + * a navigation. Avoid using + * [complex RegExps](https://github.com/GoogleChrome/workbox/issues/3077), + * or else your users may see delays when navigating your site. + * + * @param {workbox-routing~handlerCallback} handler A callback + * function that returns a Promise resulting in a Response. + * @param {Object} options + * @param {Array} [options.denylist] If any of these patterns match, + * the route will not handle the request (even if a allowlist RegExp matches). + * @param {Array} [options.allowlist=[/./]] If any of these patterns + * match the URL's pathname and search parameter, the route will handle the + * request (assuming the denylist doesn't match). + */ + constructor(handler, { + allowlist = [/./], + denylist = [] + } = {}) { + { + finalAssertExports.isArrayOfClass(allowlist, RegExp, { + moduleName: 'workbox-routing', + className: 'NavigationRoute', + funcName: 'constructor', + paramName: 'options.allowlist' + }); + finalAssertExports.isArrayOfClass(denylist, RegExp, { + moduleName: 'workbox-routing', + className: 'NavigationRoute', + funcName: 'constructor', + paramName: 'options.denylist' + }); + } + super(options => this._match(options), handler); + this._allowlist = allowlist; + this._denylist = denylist; + } + /** + * Routes match handler. + * + * @param {Object} options + * @param {URL} options.url + * @param {Request} options.request + * @return {boolean} + * + * @private + */ + _match({ + url, + request + }) { + if (request && request.mode !== 'navigate') { + return false; + } + const pathnameAndSearch = url.pathname + url.search; + for (const regExp of this._denylist) { + if (regExp.test(pathnameAndSearch)) { + { + logger.log(`The navigation route ${pathnameAndSearch} is not ` + `being used, since the URL matches this denylist pattern: ` + `${regExp.toString()}`); + } + return false; + } + } + if (this._allowlist.some(regExp => regExp.test(pathnameAndSearch))) { + { + logger.debug(`The navigation route ${pathnameAndSearch} ` + `is being used.`); + } + return true; + } + { + logger.log(`The navigation route ${pathnameAndSearch} is not ` + `being used, since the URL being navigated to doesn't ` + `match the allowlist.`); + } + return false; + } + } + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Helper function that calls + * {@link PrecacheController#createHandlerBoundToURL} on the default + * {@link PrecacheController} instance. + * + * If you are creating your own {@link PrecacheController}, then call the + * {@link PrecacheController#createHandlerBoundToURL} on that instance, + * instead of using this function. + * + * @param {string} url The precached URL which will be used to lookup the + * `Response`. + * @param {boolean} [fallbackToNetwork=true] Whether to attempt to get the + * response from the network if there's a precache miss. + * @return {workbox-routing~handlerCallback} + * + * @memberof workbox-precaching + */ + function createHandlerBoundToURL(url) { + const precacheController = getOrCreatePrecacheController(); + return precacheController.createHandlerBoundToURL(url); + } + + exports.NavigationRoute = NavigationRoute; + exports.cleanupOutdatedCaches = cleanupOutdatedCaches; + exports.clientsClaim = clientsClaim; + exports.createHandlerBoundToURL = createHandlerBoundToURL; + exports.precacheAndRoute = precacheAndRoute; + exports.registerRoute = registerRoute; + +})); diff --git a/env.d.ts b/env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/env.d.ts @@ -0,0 +1 @@ +/// diff --git a/index.html b/index.html new file mode 100644 index 0000000..b9c3222 --- /dev/null +++ b/index.html @@ -0,0 +1,30 @@ + + + + + + + + + + + Samin Gold + + +
+ + + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..d584948 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,9553 @@ +{ + "name": "customer", + "version": "1.0.8", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "customer", + "version": "1.0.8", + "dependencies": { + "@lottiefiles/dotlottie-vue": "^0.4.9", + "@vueuse/core": "^10.5.0", + "ant-design-vue": "^3.2.20", + "apexcharts": "^3.44.0", + "axios": "^1.6.2", + "dayjalali": "^1.0.1", + "echarts": "^5.4.3", + "jalaliday": "^2.3.0", + "lodash": "^4.17.21", + "moment": "^2.29.4", + "moment-jalaali": "^0.10.0", + "odometer": "^0.4.8", + "pinia": "^2.1.4", + "sass": "^1.69.4", + "unocss": "^0.55.1", + "unplugin-vue-components": "^0.25.1", + "vant": "^4.7.2", + "vue": "^3.3.4", + "vue-content-loader": "^2.0.1", + "vue-lodash": "^2.1.2", + "vue-odometer": "^1.0.2", + "vue-router": "^4.2.4", + "vue3-apexcharts": "^1.4.4", + "vue3-lazyload": "^0.3.8", + "vue3-odometer": "^0.1.3", + "vue3-otp-input": "^0.4.1" + }, + "devDependencies": { + "@rushstack/eslint-patch": "^1.3.2", + "@tsconfig/node18": "^18.2.0", + "@types/lodash": "^4.17.7", + "@types/node": "^18.17.0", + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^3.0.1", + "@vue/eslint-config-prettier": "^8.0.0", + "@vue/eslint-config-typescript": "^11.0.3", + "@vue/tsconfig": "^0.4.0", + "eslint": "^8.45.0", + "eslint-plugin-vue": "^9.15.1", + "less": "^4.2.0", + "npm-run-all": "^4.1.5", + "prettier": "^3.0.0", + "typescript": "~5.1.6", + "vite": "^4.4.6", + "vite-plugin-pwa": "^0.16.7", + "vue-tsc": "^2.1.10" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@ant-design/colors": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-6.0.0.tgz", + "integrity": "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==", + "dependencies": { + "@ctrl/tinycolor": "^3.4.0" + } + }, + "node_modules/@ant-design/icons-svg": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.3.1.tgz", + "integrity": "sha512-4QBZg8ccyC6LPIRii7A0bZUk3+lEDCLnhB+FVsflGdcWPPmV+j3fire4AwwoqHV/BibgvBmR9ZIo4s867smv+g==" + }, + "node_modules/@ant-design/icons-vue": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@ant-design/icons-vue/-/icons-vue-6.1.0.tgz", + "integrity": "sha512-EX6bYm56V+ZrKN7+3MT/ubDkvJ5rK/O2t380WFRflDcVFgsvl3NLH7Wxeau6R8DbrO5jWR6DSTC3B6gYFp77AA==", + "dependencies": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons-svg": "^4.2.1" + }, + "peerDependencies": { + "vue": ">=3.0.3" + } + }, + "node_modules/@antfu/install-pkg": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-0.1.1.tgz", + "integrity": "sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ==", + "dependencies": { + "execa": "^5.1.1", + "find-up": "^5.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@antfu/install-pkg/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@antfu/install-pkg/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/@antfu/install-pkg/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@antfu/install-pkg/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@antfu/install-pkg/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@antfu/install-pkg/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@antfu/install-pkg/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@antfu/utils": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.6.tgz", + "integrity": "sha512-pvFiLP2BeOKA/ZOS6jxx4XhKzdVLHDhGlFEaZ2flWWYf2xOqVniqpk38I04DFRyz+L0ASggl7SkItTc+ZLju4w==", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", + "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.10.tgz", + "integrity": "sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-compilation-targets": "^7.22.10", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.10", + "@babel/parser": "^7.22.10", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", + "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.26.5", + "@babel/types": "^7.26.5", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", + "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", + "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz", + "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz", + "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", + "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", + "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz", + "integrity": "sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", + "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", + "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", + "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.3.tgz", + "integrity": "sha512-59GsVNavGxAXCDDbakWSMJhajASb4kBCqDjqJsv+p5nKdbz7istmZ3HrX3L2LuiI80+zsOADCvooqQH3qGCucQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", + "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", + "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.3.tgz", + "integrity": "sha512-QPZxHrThbQia7UdvfpaRRlq/J9ciz1J4go0k+lPBXbgaNeY7IQrBj/9ceWjvMMI07/ZBzHl/F0R/2K0qH7jCVw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", + "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.3.tgz", + "integrity": "sha512-PENDVxdr7ZxKPyi5Ffc0LjXdnJyrJxyqF5T5YjlVg4a0VFfQHW0r8iAtRiDXkfHlu1wwcvdtnndGYIeJLSuRMQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.3.tgz", + "integrity": "sha512-FGEQmugvAEu2QtgtU0uTASXevfLMFfBeVCIIdcQhn/uBQsMTjBajdnAtanQlOcuihWh10PZ7+HWvc7NtBwP74w==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", + "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", + "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", + "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.3.tgz", + "integrity": "sha512-vTG+cTGxPFou12Rj7ll+eD5yWeNl5/8xvQvF08y5Gv3v4mZQoyFf8/n9zg4q5vvCWt5jmgymfzMAldO7orBn7A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", + "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.3.tgz", + "integrity": "sha512-yCLhW34wpJWRdTxxWtFZASJisihrfyMOTOQexhVzA78jlU+dH7Dw+zQgcPepQ5F3C6bAIiblZZ+qBggJdHiBAg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.3.tgz", + "integrity": "sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", + "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.3.tgz", + "integrity": "sha512-H9Ej2OiISIZowZHaBwF0tsJOih1PftXJtE8EWqlEIwpc7LMTGq0rPOrywKLQ4nefzx8/HMR0D3JGXoMHYvhi0A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", + "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.3.tgz", + "integrity": "sha512-+pD5ZbxofyOygEp+zZAfujY2ShNCXRpDRIPOiBmTO693hhyOEteZgl876Xs9SAHPQpcV0vz8LvA/T+w8AzyX8A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", + "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", + "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", + "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", + "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", + "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", + "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.3.tgz", + "integrity": "sha512-xzg24Lnld4DYIdysyf07zJ1P+iIfJpxtVFOzX4g+bsJ3Ng5Le7rXx9KwqKzuyaUeRnt+I1EICwQITqc0E2PmpA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.3.tgz", + "integrity": "sha512-s9GO7fIBi/BLsZ0v3Rftr6Oe4t0ctJ8h4CCXfPoEJwmvAPMyNrfkOOJzm6b9PX9YXcCJWWQd/sBF/N26eBiMVw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.3.tgz", + "integrity": "sha512-VxHt0ANkDmu8TANdE9Kc0rndo/ccsmfe2Cx2y5sI4hu3AukHQ5wAu4cM7j3ba8B9548ijVyclBU+nuDQftZsog==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", + "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.3.tgz", + "integrity": "sha512-LxYSb0iLjUamfm7f1D7GpiS4j0UAC8AOiehnsGAP8BEsIX8EOi3qV6bbctw8M7ZvLtcoZfZX5Z7rN9PlWk0m5A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.3.tgz", + "integrity": "sha512-zvL8vIfIUgMccIAK1lxjvNv572JHFJIKb4MWBz5OGdBQA0fB0Xluix5rmOby48exiJc987neOmP/m9Fnpkz3Tg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", + "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", + "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.3.tgz", + "integrity": "sha512-a5m2oLNFyje2e/rGKjVfAELTVI5mbA0FeZpBnkOWWV7eSmKQ+T/XW0Vf+29ScLzSxX+rnsarvU0oie/4m6hkxA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", + "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", + "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", + "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", + "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", + "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", + "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", + "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", + "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.10.tgz", + "integrity": "sha512-7++c8I/ymsDo4QQBAgbraXLzIM6jmfao11KgIBEYZRReWzNWH9NtNgJcyrZiXsOPh523FQm6LfpLyy/U5fn46A==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.10", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", + "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", + "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", + "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", + "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.3.tgz", + "integrity": "sha512-ovzGc2uuyNfNAs/jyjIGxS8arOHS5FENZaNn4rtE7UdKMMkqHCvboHfcuhWLZNX5cB44QfcGNWjaevxMzzMf+Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.3", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.23.3", + "@babel/plugin-syntax-import-attributes": "^7.23.3", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.23.3", + "@babel/plugin-transform-async-generator-functions": "^7.23.3", + "@babel/plugin-transform-async-to-generator": "^7.23.3", + "@babel/plugin-transform-block-scoped-functions": "^7.23.3", + "@babel/plugin-transform-block-scoping": "^7.23.3", + "@babel/plugin-transform-class-properties": "^7.23.3", + "@babel/plugin-transform-class-static-block": "^7.23.3", + "@babel/plugin-transform-classes": "^7.23.3", + "@babel/plugin-transform-computed-properties": "^7.23.3", + "@babel/plugin-transform-destructuring": "^7.23.3", + "@babel/plugin-transform-dotall-regex": "^7.23.3", + "@babel/plugin-transform-duplicate-keys": "^7.23.3", + "@babel/plugin-transform-dynamic-import": "^7.23.3", + "@babel/plugin-transform-exponentiation-operator": "^7.23.3", + "@babel/plugin-transform-export-namespace-from": "^7.23.3", + "@babel/plugin-transform-for-of": "^7.23.3", + "@babel/plugin-transform-function-name": "^7.23.3", + "@babel/plugin-transform-json-strings": "^7.23.3", + "@babel/plugin-transform-literals": "^7.23.3", + "@babel/plugin-transform-logical-assignment-operators": "^7.23.3", + "@babel/plugin-transform-member-expression-literals": "^7.23.3", + "@babel/plugin-transform-modules-amd": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.23.3", + "@babel/plugin-transform-modules-umd": "^7.23.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.23.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.3", + "@babel/plugin-transform-numeric-separator": "^7.23.3", + "@babel/plugin-transform-object-rest-spread": "^7.23.3", + "@babel/plugin-transform-object-super": "^7.23.3", + "@babel/plugin-transform-optional-catch-binding": "^7.23.3", + "@babel/plugin-transform-optional-chaining": "^7.23.3", + "@babel/plugin-transform-parameters": "^7.23.3", + "@babel/plugin-transform-private-methods": "^7.23.3", + "@babel/plugin-transform-private-property-in-object": "^7.23.3", + "@babel/plugin-transform-property-literals": "^7.23.3", + "@babel/plugin-transform-regenerator": "^7.23.3", + "@babel/plugin-transform-reserved-words": "^7.23.3", + "@babel/plugin-transform-shorthand-properties": "^7.23.3", + "@babel/plugin-transform-spread": "^7.23.3", + "@babel/plugin-transform-sticky-regex": "^7.23.3", + "@babel/plugin-transform-template-literals": "^7.23.3", + "@babel/plugin-transform-typeof-symbol": "^7.23.3", + "@babel/plugin-transform-unicode-escapes": "^7.23.3", + "@babel/plugin-transform-unicode-property-regex": "^7.23.3", + "@babel/plugin-transform-unicode-regex": "^7.23.3", + "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, + "node_modules/@babel/runtime": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz", + "integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.5.tgz", + "integrity": "sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.5", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.5", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", + "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", + "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz", + "integrity": "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==" + }, + "node_modules/@iconify/utils": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.1.8.tgz", + "integrity": "sha512-XoaEvkh96MfeJaDftOwz7MG3zXOfDlgbHGGVcOEVPpccsqK3yGn3vFcBC3H5ddEPVU9AXOH1sTRqBVa7AFlqCw==", + "dependencies": { + "@antfu/install-pkg": "^0.1.1", + "@antfu/utils": "^0.7.5", + "@iconify/types": "^2.0.0", + "debug": "^4.3.4", + "kolorist": "^1.8.0", + "local-pkg": "^0.4.3" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "devOptional": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@lottiefiles/dotlottie-vue": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/@lottiefiles/dotlottie-vue/-/dotlottie-vue-0.4.9.tgz", + "integrity": "sha512-sumrYZpY954FY43tZVtsxViV+7qxHT7NXUqHkBylYF8nwddxZjBLiJZ82XmkMuUFR4X/dGMxOPgg/tLhR2CwFg==", + "dependencies": { + "@lottiefiles/dotlottie-web": "0.30.2" + }, + "peerDependencies": { + "vue": "^3.3.4" + } + }, + "node_modules/@lottiefiles/dotlottie-web": { + "version": "0.30.2", + "resolved": "https://registry.npmjs.org/@lottiefiles/dotlottie-web/-/dotlottie-web-0.30.2.tgz", + "integrity": "sha512-HAUDPouNGqSIB+6b72bSmv6AC+RpMKk5RAzd9G2Wj9m/+pZRlQTFRUYBMqcRgkCtXIOagkgtwQw9fMg1/a4gxQ==" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgr/utils": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", + "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "fast-glob": "^3.3.0", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.21", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", + "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==" + }, + "node_modules/@rollup/pluginutils": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.3.tgz", + "integrity": "sha512-hfllNN4a80rwNQ9QCxhxuHCGHMAvabXqxNdaChUSSadMre7t4iEUI6fFAhBOn/eIYTgYVhBv7vCLsAJ4u3lf3g==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.3.tgz", + "integrity": "sha512-0xd7qez0AQ+MbHatZTlI1gu5vkG8r7MYRUJAHPAHJBmGLs16zpkrpAVLvjQKQOqaXPDUBwOiJzNc00znHSCVBw==", + "dev": true + }, + "node_modules/@simonwep/pickr": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@simonwep/pickr/-/pickr-1.8.2.tgz", + "integrity": "sha512-/l5w8BIkrpP6n1xsetx9MWPWlU6OblN5YgZZphxan0Tq4BByTCETL6lyIeY8lagalS2Nbt4F2W034KHLIiunKA==", + "dependencies": { + "core-js": "^3.15.1", + "nanopop": "^2.1.0" + } + }, + "node_modules/@surma/rollup-plugin-off-main-thread": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", + "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", + "dev": true, + "dependencies": { + "ejs": "^3.1.6", + "json5": "^2.2.0", + "magic-string": "^0.25.0", + "string.prototype.matchall": "^4.0.6" + } + }, + "node_modules/@surma/rollup-plugin-off-main-thread/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/@tsconfig/node18": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@tsconfig/node18/-/node18-18.2.0.tgz", + "integrity": "sha512-yhxwIlFVSVcMym3O31HoMnRXpoenmpIxcj4Yoes2DUpe+xCJnA7ECQP1Vw889V0jTt/2nzvpLQ/UuMYCd3JPIg==", + "dev": true + }, + "node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" + }, + "node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "node_modules/@types/lodash": { + "version": "4.17.7", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.7.tgz", + "integrity": "sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.17.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.5.tgz", + "integrity": "sha512-xNbS75FxH6P4UXTPUJp/zNPq6/xsfdJKussCWNOnz4aULWIRwMgP1LgaB5RiBnMX1DPCYenuqGZfnIAx5mbFLA==", + "devOptional": true + }, + "node_modules/@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "dev": true + }, + "node_modules/@types/trusted-types": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.6.tgz", + "integrity": "sha512-HYtNooPvUY9WAVRBr4u+4Qa9fYD1ze2IUlAD3HoA6oehn1taGwBx3Oa52U4mTslTS+GAExKpaFu39Y5xUEwfjg==", + "dev": true + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@unocss/astro": { + "version": "0.55.1", + "resolved": "https://registry.npmjs.org/@unocss/astro/-/astro-0.55.1.tgz", + "integrity": "sha512-t3eibW16Dx+Wck8rkQ2+Xt4z1y5XoiS5jXcKqHRV9GqhbG9IyY7/Rp3nyBoHGZSAnZhdczjgBB9xnU2W6X7tAA==", + "dependencies": { + "@unocss/core": "0.55.1", + "@unocss/reset": "0.55.1", + "@unocss/vite": "0.55.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/@unocss/cli": { + "version": "0.55.1", + "resolved": "https://registry.npmjs.org/@unocss/cli/-/cli-0.55.1.tgz", + "integrity": "sha512-qH18Coozb/5XeoU/kiByppHayVXcnDWcKJecdz90u2OusQQjsPuJcfNdbh2EbSdOv44QVvyEHmHsO/gBn42DRw==", + "dependencies": { + "@ampproject/remapping": "^2.2.1", + "@rollup/pluginutils": "^5.0.3", + "@unocss/config": "0.55.1", + "@unocss/core": "0.55.1", + "@unocss/preset-uno": "0.55.1", + "cac": "^6.7.14", + "chokidar": "^3.5.3", + "colorette": "^2.0.20", + "consola": "^3.2.3", + "fast-glob": "^3.3.1", + "magic-string": "^0.30.2", + "pathe": "^1.1.1", + "perfect-debounce": "^1.0.0" + }, + "bin": { + "unocss": "bin/unocss.mjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/config": { + "version": "0.55.1", + "resolved": "https://registry.npmjs.org/@unocss/config/-/config-0.55.1.tgz", + "integrity": "sha512-4wfNagEgROxb8RAw3X8oKoyZijJaI34QGp1kblqJXHh1eoRhmvL8UIx/8Lhmb2JA6xaZa2CYl9uOBqlChw5MIQ==", + "dependencies": { + "@unocss/core": "0.55.1", + "unconfig": "^0.3.10" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/core": { + "version": "0.55.1", + "resolved": "https://registry.npmjs.org/@unocss/core/-/core-0.55.1.tgz", + "integrity": "sha512-hZffURZtvH72UvobL9anzE1t7PDldBa89fxWVIsjLb8KHReNfcOv8uEepce0ODUfGrdWPbij017XG/HY5YUexg==", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/extractor-arbitrary-variants": { + "version": "0.55.1", + "resolved": "https://registry.npmjs.org/@unocss/extractor-arbitrary-variants/-/extractor-arbitrary-variants-0.55.1.tgz", + "integrity": "sha512-8PMN4web1Fwk6LtJKgYJy0Kw16bPn49jTKdlPCN3CGpNN8th1ORFwMpESMRHDKhQ42PdA7+aJOTeLLJ9oY3Jrg==", + "dependencies": { + "@unocss/core": "0.55.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/inspector": { + "version": "0.55.1", + "resolved": "https://registry.npmjs.org/@unocss/inspector/-/inspector-0.55.1.tgz", + "integrity": "sha512-Rfi0UUUbkaapKDcF68t7DvKUYLC3PD2bwK69/uXSE3z4C7X1S9BRDmgzYuBlL3cZlhof47z79m4kfUXxupmhmA==", + "dependencies": { + "gzip-size": "^6.0.0", + "sirv": "^2.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/postcss": { + "version": "0.55.1", + "resolved": "https://registry.npmjs.org/@unocss/postcss/-/postcss-0.55.1.tgz", + "integrity": "sha512-eQ6kixUujbvUGZaPM56Qxqau4Fie9uSyJiR/s26j77tq2GdOhKIURk0oRgjh4jjyQyE6V6SlypJ5HPoyclpelQ==", + "dependencies": { + "@unocss/config": "0.55.1", + "@unocss/core": "0.55.1", + "css-tree": "^2.3.1", + "fast-glob": "^3.3.1", + "magic-string": "^0.30.2", + "postcss": "^8.4.28" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/@unocss/preset-attributify": { + "version": "0.55.1", + "resolved": "https://registry.npmjs.org/@unocss/preset-attributify/-/preset-attributify-0.55.1.tgz", + "integrity": "sha512-DX3PMeW0atZiCu3YULVbVAhuvy2bx27hAbE9Wo+QGs+MY0hK6+ilsWqsDzNmScHze5zW2HlNwucdtPs8TiV7dA==", + "dependencies": { + "@unocss/core": "0.55.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/preset-icons": { + "version": "0.55.1", + "resolved": "https://registry.npmjs.org/@unocss/preset-icons/-/preset-icons-0.55.1.tgz", + "integrity": "sha512-gml2I6hGbBDrGaqq4TJu81pIeUvR3m/y/wH2BovIYicVhuk5NyBLTXJ7NxJY5y5FmE0AmNM1/Ctju3ZiDvj/pA==", + "dependencies": { + "@iconify/utils": "^2.1.7", + "@unocss/core": "0.55.1", + "ofetch": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/preset-mini": { + "version": "0.55.1", + "resolved": "https://registry.npmjs.org/@unocss/preset-mini/-/preset-mini-0.55.1.tgz", + "integrity": "sha512-HPq/jGD4Y21eCAbhEGkxxdEMXW+phuU897vVoYcwO8pIB6cO5ORXl8x/M70MU1LetyfEX5/1bkh7EX4+689JIg==", + "dependencies": { + "@unocss/core": "0.55.1", + "@unocss/extractor-arbitrary-variants": "0.55.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/preset-tagify": { + "version": "0.55.1", + "resolved": "https://registry.npmjs.org/@unocss/preset-tagify/-/preset-tagify-0.55.1.tgz", + "integrity": "sha512-0avQOWUFJru7aTrOcJL1xhSTVIOk4CCuVHRgy9kW9w29iKsuY3ZoAT2xjpfyQrA6Is4u87eobR34X7SrHG32zQ==", + "dependencies": { + "@unocss/core": "0.55.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/preset-typography": { + "version": "0.55.1", + "resolved": "https://registry.npmjs.org/@unocss/preset-typography/-/preset-typography-0.55.1.tgz", + "integrity": "sha512-AB4I5KE1HN3WjkPAnqQ5iJ2fZMOd2cNEExajQDgdj4MaAeWMZCwlgTCaCDULxiaHy+0n4fM9pm/5ABQdLHxxFA==", + "dependencies": { + "@unocss/core": "0.55.1", + "@unocss/preset-mini": "0.55.1" + } + }, + "node_modules/@unocss/preset-uno": { + "version": "0.55.1", + "resolved": "https://registry.npmjs.org/@unocss/preset-uno/-/preset-uno-0.55.1.tgz", + "integrity": "sha512-4xqSvsuzsyFe97x93sFloYvd5+yly5KYx8+zvk19ZXrNbkft/ewGyZyzgZ8tyGjuNg0lcEiE3PhKv4mjqFPG2g==", + "dependencies": { + "@unocss/core": "0.55.1", + "@unocss/preset-mini": "0.55.1", + "@unocss/preset-wind": "0.55.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/preset-web-fonts": { + "version": "0.55.1", + "resolved": "https://registry.npmjs.org/@unocss/preset-web-fonts/-/preset-web-fonts-0.55.1.tgz", + "integrity": "sha512-ggYOWBQwJIKpU/8MAXzYd1gEHIzP7ajScKx8UkGYePL3ZOww42G6PvovEIZ9BFm8vlx/EWH1HEjBXFzsZIF5GQ==", + "dependencies": { + "@unocss/core": "0.55.1", + "ofetch": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/preset-wind": { + "version": "0.55.1", + "resolved": "https://registry.npmjs.org/@unocss/preset-wind/-/preset-wind-0.55.1.tgz", + "integrity": "sha512-ah7qJ9uBG0NlTMs67mMEBxRogWMgysXoElQaqtlaJjYllVVIuGWgTj5weF6iQJn6Jup6DXOHXYJ0A49Fh7DRug==", + "dependencies": { + "@unocss/core": "0.55.1", + "@unocss/preset-mini": "0.55.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/reset": { + "version": "0.55.1", + "resolved": "https://registry.npmjs.org/@unocss/reset/-/reset-0.55.1.tgz", + "integrity": "sha512-WMMxun0HtS8WD4q7F3nWM9Yal/eDt0KviMlVIqcCdlQYdaOHyVDwpON3htZrGL/HwrbofUYYgJXp59yyrAmrRw==", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/scope": { + "version": "0.55.1", + "resolved": "https://registry.npmjs.org/@unocss/scope/-/scope-0.55.1.tgz", + "integrity": "sha512-Je4kAdnMnDFaxHlMjmhjhmRqRVIdDslSxSU2Gj8gxAm2bEOrYcBya0T51UgTH51Hpm3nBoq8Qhldcpott7aC6w==" + }, + "node_modules/@unocss/transformer-attributify-jsx": { + "version": "0.55.1", + "resolved": "https://registry.npmjs.org/@unocss/transformer-attributify-jsx/-/transformer-attributify-jsx-0.55.1.tgz", + "integrity": "sha512-xyjnOnr9TE1Ejeg6HfAS3Mtsr3WaLdm+LhBZSvpfSgq3sZy85NAZHM/VG7iTwQdH0ysDDScvQkZR4g/WehhN+Q==", + "dependencies": { + "@unocss/core": "0.55.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/transformer-attributify-jsx-babel": { + "version": "0.55.1", + "resolved": "https://registry.npmjs.org/@unocss/transformer-attributify-jsx-babel/-/transformer-attributify-jsx-babel-0.55.1.tgz", + "integrity": "sha512-EzSxzxMvBAfwYXjSCE0o6gV4x0Ok15B/dZOAl996AN/AwvoL3c0rLIYxqBGOpg3AA8c7xlZJyB7VkzidcZKoTw==", + "dependencies": { + "@unocss/core": "0.55.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/transformer-compile-class": { + "version": "0.55.1", + "resolved": "https://registry.npmjs.org/@unocss/transformer-compile-class/-/transformer-compile-class-0.55.1.tgz", + "integrity": "sha512-5IrJtScYJN5xBmmPqseFHwF0UaIdUEbdn/ASYHV5nx/7FXban+Igx3fVC9xrS+D/W8UN9TcXsBIaq5qoRK9t4w==", + "dependencies": { + "@unocss/core": "0.55.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/transformer-directives": { + "version": "0.55.1", + "resolved": "https://registry.npmjs.org/@unocss/transformer-directives/-/transformer-directives-0.55.1.tgz", + "integrity": "sha512-MRySoH06AHfKXmNBudYqElRNcOtP9BR3x/M/qKtFaJmQ2QC6fyune3lYGWKZcTl64YPbBpfaw+XXn1NFO9JYDw==", + "dependencies": { + "@unocss/core": "0.55.1", + "css-tree": "^2.3.1" + } + }, + "node_modules/@unocss/transformer-variant-group": { + "version": "0.55.1", + "resolved": "https://registry.npmjs.org/@unocss/transformer-variant-group/-/transformer-variant-group-0.55.1.tgz", + "integrity": "sha512-DYu11I6gTygImxe+jehgftIp2pX7YL9ge+W+8hIihkQnRBFX6HozTOSzWx5i1W8o2werLSlWorXaaDG0qbl7Qg==", + "dependencies": { + "@unocss/core": "0.55.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/vite": { + "version": "0.55.1", + "resolved": "https://registry.npmjs.org/@unocss/vite/-/vite-0.55.1.tgz", + "integrity": "sha512-wf1YZBk/Pw0poo3QBXXCCwM7qq83lXoKNdqKVui5H+iCa0haRkscHX6/2PmJVRgczdpCG9/kFl3tDI3KzQdOkA==", + "dependencies": { + "@ampproject/remapping": "^2.2.1", + "@rollup/pluginutils": "^5.0.3", + "@unocss/config": "0.55.1", + "@unocss/core": "0.55.1", + "@unocss/inspector": "0.55.1", + "@unocss/scope": "0.55.1", + "@unocss/transformer-directives": "0.55.1", + "chokidar": "^3.5.3", + "fast-glob": "^3.3.1", + "magic-string": "^0.30.2" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0" + } + }, + "node_modules/@vant/popperjs": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@vant/popperjs/-/popperjs-1.3.0.tgz", + "integrity": "sha512-hB+czUG+aHtjhaEmCJDuXOep0YTZjdlRR+4MSmIFnkCQIxJaXLQdSsR90XWvAI2yvKUI7TCGqR8pQg2RtvkMHw==" + }, + "node_modules/@vant/use": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vant/use/-/use-1.6.0.tgz", + "integrity": "sha512-PHHxeAASgiOpSmMjceweIrv2AxDZIkWXyaczksMoWvKV2YAYEhoizRuk/xFnKF+emUIi46TsQ+rvlm/t2BBCfA==", + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.3.1.tgz", + "integrity": "sha512-tUBEtWcF7wFtII7ayNiLNDTCE1X1afySEo+XNVMNkFXaThENyCowIEX095QqbJZGTgoOcSVDJGlnde2NG4jtbQ==", + "dev": true, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vitejs/plugin-vue-jsx": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-3.0.2.tgz", + "integrity": "sha512-obF26P2Z4Ogy3cPp07B4VaW6rpiu0ue4OT2Y15UxT5BZZ76haUY9guOsZV3uWh/I6xc+VeiW+ZVabRE82FyzWw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.22.10", + "@babel/plugin-transform-typescript": "^7.22.10", + "@vue/babel-plugin-jsx": "^1.1.5" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0", + "vue": "^3.0.0" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.11.tgz", + "integrity": "sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==", + "dev": true, + "dependencies": { + "@volar/source-map": "2.4.11" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.11.tgz", + "integrity": "sha512-ZQpmafIGvaZMn/8iuvCFGrW3smeqkq/IIh9F1SdSx9aUl0J4Iurzd6/FhmjNO5g2ejF3rT45dKskgXWiofqlZQ==", + "dev": true + }, + "node_modules/@volar/typescript": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.11.tgz", + "integrity": "sha512-2DT+Tdh88Spp5PyPbqhyoYavYCPDsqbHLFwcUI9K1NlY1YgUJvujGdrqUp0zWxnW7KWNTr3xSpMuv2WnaTKDAw==", + "dev": true, + "dependencies": { + "@volar/language-core": "2.4.11", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.1.5.tgz", + "integrity": "sha512-SgUymFpMoAyWeYWLAY+MkCK3QEROsiUnfaw5zxOVD/M64KQs8D/4oK6Q5omVA2hnvEOE0SCkH2TZxs/jnnUj7w==", + "dev": true + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.5.tgz", + "integrity": "sha512-nKs1/Bg9U1n3qSWnsHhCVQtAzI6aQXqua8j/bZrau8ywT1ilXQbK4FwEJGmU8fV7tcpuFvWmmN7TMmV1OBma1g==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", + "@vue/babel-helper-vue-transform-on": "^1.1.5", + "camelcase": "^6.3.0", + "html-tags": "^3.3.1", + "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.4.tgz", + "integrity": "sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==", + "dependencies": { + "@babel/parser": "^7.21.3", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz", + "integrity": "sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==", + "dependencies": { + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz", + "integrity": "sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==", + "dependencies": { + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-ssr": "3.3.4", + "@vue/reactivity-transform": "3.3.4", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.0", + "postcss": "^8.1.10", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz", + "integrity": "sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==", + "dependencies": { + "@vue/compiler-dom": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", + "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", + "dev": true, + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz", + "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" + }, + "node_modules/@vue/eslint-config-prettier": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-8.0.0.tgz", + "integrity": "sha512-55dPqtC4PM/yBjhAr+yEw6+7KzzdkBuLmnhBrDfp4I48+wy+Giqqj9yUr5T2uD/BkBROjjmqnLZmXRdOx/VtQg==", + "dev": true, + "dependencies": { + "eslint-config-prettier": "^8.8.0", + "eslint-plugin-prettier": "^5.0.0" + }, + "peerDependencies": { + "eslint": ">= 8.0.0", + "prettier": ">= 3.0.0" + } + }, + "node_modules/@vue/eslint-config-typescript": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-11.0.3.tgz", + "integrity": "sha512-dkt6W0PX6H/4Xuxg/BlFj5xHvksjpSlVjtkQCpaYJBIEuKj2hOVU7r+TIe+ysCwRYFz/lGqvklntRkCAibsbPw==", + "dev": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "^5.59.1", + "@typescript-eslint/parser": "^5.59.1", + "vue-eslint-parser": "^9.1.1" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0", + "eslint-plugin-vue": "^9.0.0", + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/language-core": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.0.tgz", + "integrity": "sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==", + "dev": true, + "dependencies": { + "@volar/language-core": "~2.4.11", + "@vue/compiler-dom": "^3.5.0", + "@vue/compiler-vue2": "^2.7.16", + "@vue/shared": "^3.5.0", + "alien-signals": "^0.4.9", + "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/language-core/node_modules/@vue/compiler-core": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz", + "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/shared": "3.5.13", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/language-core/node_modules/@vue/compiler-dom": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz", + "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==", + "dev": true, + "dependencies": { + "@vue/compiler-core": "3.5.13", + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/language-core/node_modules/@vue/shared": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", + "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==", + "dev": true + }, + "node_modules/@vue/language-core/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@vue/language-core/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.4.tgz", + "integrity": "sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==", + "dependencies": { + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/reactivity-transform": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz", + "integrity": "sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==", + "dependencies": { + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.0" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.4.tgz", + "integrity": "sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==", + "dependencies": { + "@vue/reactivity": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz", + "integrity": "sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==", + "dependencies": { + "@vue/runtime-core": "3.3.4", + "@vue/shared": "3.3.4", + "csstype": "^3.1.1" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.4.tgz", + "integrity": "sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==", + "dependencies": { + "@vue/compiler-ssr": "3.3.4", + "@vue/shared": "3.3.4" + }, + "peerDependencies": { + "vue": "3.3.4" + } + }, + "node_modules/@vue/shared": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.4.tgz", + "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==" + }, + "node_modules/@vue/tsconfig": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.4.0.tgz", + "integrity": "sha512-CPuIReonid9+zOG/CGTT05FXrPYATEqoDGNrEaqS4hwcw5BUNM2FguC0mOwJD4Jr16UpRVl9N0pY3P+srIbqmg==", + "dev": true + }, + "node_modules/@vueuse/core": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.6.0.tgz", + "integrity": "sha512-+Yee+g9+9BEbvkyGdn4Bf4yZx9EfocAytpV2ZlrlP7xcz+qznLmZIDqDroTvc5vtMkWZicisgEv8dt3+jL+HQg==", + "dependencies": { + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "10.6.0", + "@vueuse/shared": "10.6.0", + "vue-demi": ">=0.14.6" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.6.0.tgz", + "integrity": "sha512-mzKHkHoiK6xVz01VzQjM2l6ofUanEaofgEGPgDHcAzlvOTccPRTIdEuzneOUTYxgfm1vkDikS6rtrEw/NYlaTQ==", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.6.0.tgz", + "integrity": "sha512-0t4MVE18sO+/4Gh0jfeOXBTjKeV4606N9kIrDOLPjFl8Rwnlodn+QC5A4LfJuysK7aOsTMjF3KnzNeueaI0xlQ==", + "dependencies": { + "vue-demi": ">=0.14.6" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@yr/monotone-cubic-spline": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@yr/monotone-cubic-spline/-/monotone-cubic-spline-1.0.3.tgz", + "integrity": "sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==" + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/alien-signals": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-0.4.14.tgz", + "integrity": "sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==", + "dev": true + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ant-design-vue": { + "version": "3.2.20", + "resolved": "https://registry.npmjs.org/ant-design-vue/-/ant-design-vue-3.2.20.tgz", + "integrity": "sha512-YWpMfGaGoRastIXEYfCoJiaRiDHk4chqtYhlKQM5GqPt6NfvrM1Vg2e60yHtjxlZjed91wCMm0rAmyUr7Hwzdg==", + "dependencies": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons-vue": "^6.1.0", + "@babel/runtime": "^7.10.5", + "@ctrl/tinycolor": "^3.4.0", + "@simonwep/pickr": "~1.8.0", + "array-tree-filter": "^2.1.0", + "async-validator": "^4.0.0", + "dayjs": "^1.10.5", + "dom-align": "^1.12.1", + "dom-scroll-into-view": "^2.0.0", + "lodash": "^4.17.21", + "lodash-es": "^4.17.15", + "resize-observer-polyfill": "^1.5.1", + "scroll-into-view-if-needed": "^2.2.25", + "shallow-equal": "^1.0.0", + "vue-types": "^3.0.0", + "warning": "^4.0.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ant-design-vue" + }, + "peerDependencies": { + "vue": ">=3.2.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/apexcharts": { + "version": "3.44.0", + "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-3.44.0.tgz", + "integrity": "sha512-u7Xzrbcxc2yWznN78Jh5NMCYVAsWDfBjRl5ea++rVzFAqjU2hLz4RgKIFwYOBDRQtW1e/Qz8azJTqIJ1+Vu9Qg==", + "dependencies": { + "@yr/monotone-cubic-spline": "^1.0.3", + "svg.draggable.js": "^2.2.2", + "svg.easing.js": "^2.0.0", + "svg.filter.js": "^2.0.2", + "svg.pathmorphing.js": "^0.1.3", + "svg.resize.js": "^1.4.3", + "svg.select.js": "^3.0.1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-tree-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", + "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "dev": true + }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", + "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", + "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.3", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz", + "integrity": "sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.3", + "core-js-compat": "^3.33.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", + "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.3" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "devOptional": true + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "dev": true, + "dependencies": { + "run-applescript": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001561", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz", + "integrity": "sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "devOptional": true + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/compute-scroll-into-view": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz", + "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/consola": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", + "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "devOptional": true, + "dependencies": { + "is-what": "^3.14.1" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/core-js": { + "version": "3.32.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.1.tgz", + "integrity": "sha512-lqufgNn9NLnESg5mQeYsxQP5w7wrViSj0jr/kv6ECQiByzQkrn1MKvV0L3acttpDqfQrHLwr2KCMgX5b8X+lyQ==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.33.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.2.tgz", + "integrity": "sha512-axfo+wxFVxnqf8RvxTzoAlzW4gRoacrHeoFlc9n0x50+7BEyZL/Rt3hicaED1/CEd7I6tPCPVUYcJwCMO5XUYw==", + "dev": true, + "dependencies": { + "browserslist": "^4.22.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "node_modules/dayjalali": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dayjalali/-/dayjalali-1.0.1.tgz", + "integrity": "sha512-f+uDwP9kQSjlDdGTJjMpWaHe9BaIkQjZRkk32SNj6pRNkJRc2bTmIW5AbEwVX3vwa5INDwi6K7+Cik67/PzWqA==", + "license": "MIT", + "dependencies": { + "jalaali-js": "^1.2.8" + } + }, + "node_modules/dayjs": { + "version": "1.11.9", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.9.tgz", + "integrity": "sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "dev": true, + "dependencies": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dev": true, + "dependencies": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/defu": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.2.tgz", + "integrity": "sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/destr": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.1.tgz", + "integrity": "sha512-M1Ob1zPSIvlARiJUkKqvAZ3VAqQY6Jcuth/pBKQ2b1dX/Qx0OnJ8Vux6J2H5PTMQeRzWrrbTu70VxBfv/OPDJA==" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-align": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.4.tgz", + "integrity": "sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==" + }, + "node_modules/dom-scroll-into-view": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/dom-scroll-into-view/-/dom-scroll-into-view-2.0.1.tgz", + "integrity": "sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==" + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "node_modules/echarts": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.4.3.tgz", + "integrity": "sha512-mYKxLxhzy6zyTi/FaEbJMOZU1ULGEQHaeIeuMR5L+JnJTpz+YR03mnnpBhbR4+UYJAgiXgpyTVLffPAjOTLkZA==", + "dependencies": { + "tslib": "2.3.0", + "zrender": "5.4.4" + } + }, + "node_modules/echarts/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.581", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.581.tgz", + "integrity": "sha512-6uhqWBIapTJUxgPTCHH9sqdbxIMPt7oXl0VcAL1kOtlU6aECdcMncCrX5Z7sHQ/invtrC9jUQUef7+HhO8vVFw==", + "dev": true + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz", + "integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "^8.47.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "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.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", + "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz", + "integrity": "sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.5" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-vue": { + "version": "9.17.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.17.0.tgz", + "integrity": "sha512-r7Bp79pxQk9I5XDP0k2dpUC7Ots3OSWgvGZNu3BxmKK6Zg7NgVtcOB6OCna5Kb9oQwJPl5hq183WD0SY5tZtIQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^6.0.13", + "semver": "^7.5.4", + "vue-eslint-parser": "^9.3.1", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-vue/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-vue/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-vue/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "devOptional": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", + "dev": true + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", + "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.1.tgz", + "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "devOptional": true + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-wsl/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "dev": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jake/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jake/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jake/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jake/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jake/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jalaali-js": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/jalaali-js/-/jalaali-js-1.2.8.tgz", + "integrity": "sha512-Jl/EwY84JwjW2wsWqeU4pNd22VNQ7EkjI36bDuLw31wH98WQW4fPjD0+mG7cdCK+Y8D6s9R3zLiQ3LaKu6bD8A==", + "license": "MIT" + }, + "node_modules/jalaliday": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/jalaliday/-/jalaliday-2.3.0.tgz", + "integrity": "sha512-B/m3TqsRrTFED/HBDqON6rPKe0MpoLxNICZ5uZeZ/scHJUHKQNr1n+wdZSj8MxrY1Bmo05gllZeNEw4beXd2oQ==" + }, + "node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jiti": { + "version": "1.19.3", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.3.tgz", + "integrity": "sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w==", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==" + }, + "node_modules/less": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", + "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", + "devOptional": true, + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.2.tgz", + "integrity": "sha512-lNZdu7pewtq/ZvWUp9Wpf/x7WzMTsR26TWV03BRZrXFsv+BI6dy8RAiKgm1uM/kyR0rCfUcqvOlXKG66KhIGug==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==" + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "optional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mlly": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.0.tgz", + "integrity": "sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==", + "dependencies": { + "acorn": "^8.9.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.1.2" + } + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "engines": { + "node": "*" + } + }, + "node_modules/moment-jalaali": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/moment-jalaali/-/moment-jalaali-0.10.0.tgz", + "integrity": "sha512-XICH1+UHd3zyaE1bXWQBlhoXBqbzEyFfT0TrifNobHxLALRuTSwXn376bX8FmkYg9mZimevwwdd6EB57s5wuFA==", + "dependencies": { + "jalaali-js": "^1.1.0", + "moment": "^2.22.2", + "moment-timezone": "^0.5.21", + "rimraf": "^3.0.2" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.44", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.44.tgz", + "integrity": "sha512-nv3YpzI/8lkQn0U6RkLd+f0W/zy/JnoR5/EyPz/dNkPTBjA2jNLCVxaiQ8QpeLymhSZvX0wCL5s27NQWdOPwAw==", + "dependencies": { + "moment": "^2.29.4" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanopop": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/nanopop/-/nanopop-2.3.0.tgz", + "integrity": "sha512-fzN+T2K7/Ah25XU02MJkPZ5q4Tj5FpjmIYq4rvoHX4yb16HzFdCO6JxFFn5Y/oBhQ8no8fUZavnyIv9/+xkBBw==" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "node_modules/needle": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz", + "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==", + "optional": true, + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "optional": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/node-fetch-native": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.2.0.tgz", + "integrity": "sha512-5IAMBTl9p6PaAjYCnMv5FmqIF6GcZnawAVnzaCG0rX2aYZJ4CxEkZNtVPuTRug7fL7wyM5BQYTlAzcyMPi6oTQ==" + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm-run-all/node_modules/cross-spawn": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/npm-run-all/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/npm-run-all/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/odometer": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/odometer/-/odometer-0.4.8.tgz", + "integrity": "sha512-bfKuAhWE/qMCiX9bwX90c5bTpt7MDVeq1e6YsOHQrYokNhv9jhS5JbR9kg6i+FeWmDgalf3VUtwNx1aVaZ8cgg==" + }, + "node_modules/ofetch": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.1.1.tgz", + "integrity": "sha512-SSMoktrp9SNLi20BWfB/BnnKcL0RDigXThD/mZBeQxkIRv1xrd9183MtLdsqRYLYSqW0eTr5t8w8MqjNhvoOQQ==", + "dependencies": { + "destr": "^2.0.0", + "node-fetch-native": "^1.2.0", + "ufo": "^1.1.2" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", + "dev": true, + "dependencies": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "devOptional": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", + "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==" + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pinia": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.1.6.tgz", + "integrity": "sha512-bIU6QuE5qZviMmct5XwCesXelb5VavdOWKWaB17ggk++NUwQWWbP5YnsONTk3b752QkW9sACiR81rorpeOMSvQ==", + "dependencies": { + "@vue/devtools-api": "^6.5.0", + "vue-demi": ">=0.14.5" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@vue/composition-api": "^1.4.0", + "typescript": ">=4.4.4", + "vue": "^2.6.14 || ^3.3.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/pinia/node_modules/vue-demi": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz", + "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "node_modules/postcss": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", + "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.2.tgz", + "integrity": "sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-bytes": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz", + "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==", + "dev": true, + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "optional": true + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, + "node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.29.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz", + "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/run-applescript/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/run-applescript/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/run-applescript/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/run-applescript/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "optional": true + }, + "node_modules/sass": { + "version": "1.69.5", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.5.tgz", + "integrity": "sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==", + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "optional": true + }, + "node_modules/scroll-into-view-if-needed": { + "version": "2.2.31", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz", + "integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==", + "dependencies": { + "compute-scroll-into-view": "^1.0.20" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shallow-equal": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz", + "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/sirv": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz", + "integrity": "sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==", + "dependencies": { + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "devOptional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "devOptional": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.padend": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz", + "integrity": "sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, + "node_modules/svg.draggable.js": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/svg.draggable.js/-/svg.draggable.js-2.2.2.tgz", + "integrity": "sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw==", + "dependencies": { + "svg.js": "^2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svg.easing.js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/svg.easing.js/-/svg.easing.js-2.0.0.tgz", + "integrity": "sha512-//ctPdJMGy22YoYGV+3HEfHbm6/69LJUTAqI2/5qBvaNHZ9uUFVC82B0Pl299HzgH13rKrBgi4+XyXXyVWWthA==", + "dependencies": { + "svg.js": ">=2.3.x" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svg.filter.js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/svg.filter.js/-/svg.filter.js-2.0.2.tgz", + "integrity": "sha512-xkGBwU+dKBzqg5PtilaTb0EYPqPfJ9Q6saVldX+5vCRy31P6TlRCP3U9NxH3HEufkKkpNgdTLBJnmhDHeTqAkw==", + "dependencies": { + "svg.js": "^2.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svg.js": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/svg.js/-/svg.js-2.7.1.tgz", + "integrity": "sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA==" + }, + "node_modules/svg.pathmorphing.js": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/svg.pathmorphing.js/-/svg.pathmorphing.js-0.1.3.tgz", + "integrity": "sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww==", + "dependencies": { + "svg.js": "^2.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svg.resize.js": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/svg.resize.js/-/svg.resize.js-1.4.3.tgz", + "integrity": "sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw==", + "dependencies": { + "svg.js": "^2.6.5", + "svg.select.js": "^2.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svg.resize.js/node_modules/svg.select.js": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/svg.select.js/-/svg.select.js-2.1.2.tgz", + "integrity": "sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ==", + "dependencies": { + "svg.js": "^2.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svg.select.js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/svg.select.js/-/svg.select.js-3.0.1.tgz", + "integrity": "sha512-h5IS/hKkuVCbKSieR9uQCj9w+zLHoPh+ce19bBYyqF53g6mnPB8sAtIbe1s9dh2S2fCmYX2xel1Ln3PJBbK4kw==", + "dependencies": { + "svg.js": "^2.6.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/synckit": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "dev": true, + "dependencies": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tempy": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", + "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", + "dev": true, + "dependencies": { + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", + "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", + "devOptional": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "devOptional": true + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "devOptional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.2.0.tgz", + "integrity": "sha512-RsPyTbqORDNDxqAdQPQBpgqhWle1VcTSou/FraClYlHf6TZnQcGslpLcAphNR+sQW4q5lLWLbOsRlh9j24baQg==" + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unconfig": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/unconfig/-/unconfig-0.3.10.tgz", + "integrity": "sha512-tj317lhIq2iZF/NXrJnU1t2UaGUKKz1eL1sK2t63Oq66V9BxqvZV12m55fp/fpQJ+DDmVlLgo7cnLVOZkhlO/A==", + "dependencies": { + "@antfu/utils": "^0.7.5", + "defu": "^6.1.2", + "jiti": "^1.19.1", + "mlly": "^1.4.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unocss": { + "version": "0.55.1", + "resolved": "https://registry.npmjs.org/unocss/-/unocss-0.55.1.tgz", + "integrity": "sha512-WyLlrkB1m37LT3jmT51BOmvcd2/aFL0/QuJLn0gYQUWHi28uPtGFTL2kEvivqxzEgDgDrzbQl8VBgy1RssbRHQ==", + "dependencies": { + "@unocss/astro": "0.55.1", + "@unocss/cli": "0.55.1", + "@unocss/core": "0.55.1", + "@unocss/extractor-arbitrary-variants": "0.55.1", + "@unocss/postcss": "0.55.1", + "@unocss/preset-attributify": "0.55.1", + "@unocss/preset-icons": "0.55.1", + "@unocss/preset-mini": "0.55.1", + "@unocss/preset-tagify": "0.55.1", + "@unocss/preset-typography": "0.55.1", + "@unocss/preset-uno": "0.55.1", + "@unocss/preset-web-fonts": "0.55.1", + "@unocss/preset-wind": "0.55.1", + "@unocss/reset": "0.55.1", + "@unocss/transformer-attributify-jsx": "0.55.1", + "@unocss/transformer-attributify-jsx-babel": "0.55.1", + "@unocss/transformer-compile-class": "0.55.1", + "@unocss/transformer-directives": "0.55.1", + "@unocss/transformer-variant-group": "0.55.1", + "@unocss/vite": "0.55.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@unocss/webpack": "0.55.1", + "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "@unocss/webpack": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/unplugin": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.4.0.tgz", + "integrity": "sha512-5x4eIEL6WgbzqGtF9UV8VEC/ehKptPXDS6L2b0mv4FRMkJxRtjaJfOWDd6a8+kYbqsjklix7yWP0N3SUepjXcg==", + "dependencies": { + "acorn": "^8.9.0", + "chokidar": "^3.5.3", + "webpack-sources": "^3.2.3", + "webpack-virtual-modules": "^0.5.0" + } + }, + "node_modules/unplugin-vue-components": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-0.25.1.tgz", + "integrity": "sha512-kzS2ZHVMaGU2XEO2keYQcMjNZkanDSGDdY96uQT9EPe+wqSZwwgbFfKVJ5ti0+8rGAcKHColwKUvctBhq2LJ3A==", + "dependencies": { + "@antfu/utils": "^0.7.4", + "@rollup/pluginutils": "^5.0.2", + "chokidar": "^3.5.3", + "debug": "^4.3.4", + "fast-glob": "^3.2.12", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.0", + "minimatch": "^9.0.1", + "resolve": "^1.22.2", + "unplugin": "^1.3.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@babel/parser": "^7.15.8", + "@nuxt/kit": "^3.2.2", + "vue": "2 || 3" + }, + "peerDependenciesMeta": { + "@babel/parser": { + "optional": true + }, + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/unplugin-vue-components/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/unplugin-vue-components/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vant": { + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/vant/-/vant-4.7.3.tgz", + "integrity": "sha512-nb0pXxKSOaE9CvH//KozKDivqhjE4ZRvx1b/RCWFL4H3tZ5l+HhWtwK1yJx5AkO1Pm/IYQY86yZa1tums8DfsQ==", + "dependencies": { + "@vant/popperjs": "^1.3.0", + "@vant/use": "^1.6.0", + "@vue/shared": "^3.0.0" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/vite": { + "version": "4.5.14", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.14.tgz", + "integrity": "sha512-+v57oAaoYNnO3hIu5Z/tJRZjq5aHM2zDve9YZ8HngVHbhk66RStobhb1sqPMIPEleV6cNKYK4eGrAbE9Ulbl2g==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-plugin-pwa": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.16.7.tgz", + "integrity": "sha512-4WMA5unuKlHs+koNoykeuCfTcqEGbiTRr8sVYUQMhc6tWxZpSRnv9Ojk4LKmqVhoPGHfBVCdGaMo8t9Qidkc1Q==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "fast-glob": "^3.3.1", + "pretty-bytes": "^6.1.1", + "workbox-build": "^7.0.0", + "workbox-window": "^7.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^3.1.0 || ^4.0.0 || ^5.0.0-0", + "workbox-build": "^7.0.0", + "workbox-window": "^7.0.0" + } + }, + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "dev": true + }, + "node_modules/vue": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.4.tgz", + "integrity": "sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==", + "dependencies": { + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-sfc": "3.3.4", + "@vue/runtime-dom": "3.3.4", + "@vue/server-renderer": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/vue-content-loader": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/vue-content-loader/-/vue-content-loader-2.0.1.tgz", + "integrity": "sha512-pkof4+q2xmzNEdhqelxtJejeP/vQUJtLle4/v2ueG+HURqM9Q/GIGC8GJ2bVVWeLfTDET51jqimwQdmxJTlu0g==", + "peerDependencies": { + "vue": "^3" + } + }, + "node_modules/vue-eslint-parser": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.1.tgz", + "integrity": "sha512-Clr85iD2XFZ3lJ52/ppmUDG/spxQu6+MAeHXjjyI4I1NUYZ9xmenQp4N0oaHJhrA8OOxltCVxMRfANGa70vU0g==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/vue-eslint-parser/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vue-eslint-parser/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vue-eslint-parser/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/vue-lodash": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/vue-lodash/-/vue-lodash-2.1.2.tgz", + "integrity": "sha512-6QsNC7/XjrK4xKxFhh6Ppvcrfm0uAeR/lFsySsMgfEFUWkvRztcAIS3MsqAI4bBnAaLo9ou+8tUfJ8d+yrljQg==", + "license": "MIT", + "peerDependencies": { + "vue": ">= 2.0.0" + } + }, + "node_modules/vue-odometer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/vue-odometer/-/vue-odometer-1.0.2.tgz", + "integrity": "sha512-xQj1kdRrQDGhjZ9nb66I6wykR9lG5yvy74PLBpTHw7raGqahBgZOCvPWvC4nol8B8bJQeFWmpCBUidVjtouyng==", + "dependencies": { + "lodash": "latest" + }, + "peerDependencies": { + "odometer": "latest", + "vue": "latest" + } + }, + "node_modules/vue-router": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.4.tgz", + "integrity": "sha512-9PISkmaCO02OzPVOMq2w82ilty6+xJmQrarYZDkjZBfl4RvYAlt4PKnEX21oW4KTtWfa9OuO/b3qk1Od3AEdCQ==", + "dependencies": { + "@vue/devtools-api": "^6.5.0" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/vue-tsc": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.0.tgz", + "integrity": "sha512-gtmM1sUuJ8aSb0KoAFmK9yMxb8TxjewmxqTJ1aKphD5Cbu0rULFY6+UQT51zW7SpUcenfPUuflKyVwyx9Qdnxg==", + "dev": true, + "dependencies": { + "@volar/typescript": "~2.4.11", + "@vue/language-core": "2.2.0" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + } + }, + "node_modules/vue-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/vue-types/-/vue-types-3.0.2.tgz", + "integrity": "sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw==", + "dependencies": { + "is-plain-object": "3.0.1" + }, + "engines": { + "node": ">=10.15.0" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/vue3-apexcharts": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/vue3-apexcharts/-/vue3-apexcharts-1.4.4.tgz", + "integrity": "sha512-TH89uZrxGjaDvkaYAISvj8+k6Bf1rUKFillc8oJirs5XZEPiwM1ELKZQ786wz0rfPqkSHHny2lqqUCK7Rw+LcQ==", + "peerDependencies": { + "apexcharts": "> 3.0.0", + "vue": "> 3.0.0" + } + }, + "node_modules/vue3-lazyload": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/vue3-lazyload/-/vue3-lazyload-0.3.8.tgz", + "integrity": "sha512-UiJHRT7mzry102WbhtrRgJh+f8Z8u4Z+H1RU4dvPmQeq7wFSDFxZB9iJOWGihH2FscXN/8rMGLDOQJAmjwqpCg==", + "dependencies": { + "vue-demi": "^0.12.5" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^2.0.0 || >=3.0.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/vue3-lazyload/node_modules/vue-demi": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.12.5.tgz", + "integrity": "sha512-BREuTgTYlUr0zw0EZn3hnhC3I6gPWv+Kwh4MCih6QcAeaTlaIX0DwOVN0wHej7hSvDPecz4jygy/idsgKfW58Q==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/vue3-odometer": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/vue3-odometer/-/vue3-odometer-0.1.3.tgz", + "integrity": "sha512-WhsDgLv9LWiD6N12OOwLmLCYni1oR3gBXGnyn/vZ2I4TnXpGB5WgnNiNXGAcXcGf5aGhBRrkc7KyV13PCdSxCQ==", + "dependencies": { + "odometer": "^0.4.8", + "vue": "^3.2.25" + }, + "peerDependencies": { + "odometer": "latest", + "vue": ">=3.2.0" + } + }, + "node_modules/vue3-otp-input": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/vue3-otp-input/-/vue3-otp-input-0.4.1.tgz", + "integrity": "sha512-wVl9i3DcWlO0C7fBI9V+RIP3crm/1tY72fuhvb3YM2JfbLoYofB96aPl5AgFhA0Cse5bQEMYtIvOeiqW3rfbAw==", + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "peerDependencies": { + "vue": "^3.0.*" + } + }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz", + "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==" + }, + "node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/workbox-background-sync": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-7.0.0.tgz", + "integrity": "sha512-S+m1+84gjdueM+jIKZ+I0Lx0BDHkk5Nu6a3kTVxP4fdj3gKouRNmhO8H290ybnJTOPfBDtTMXSQA/QLTvr7PeA==", + "dev": true, + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "7.0.0" + } + }, + "node_modules/workbox-broadcast-update": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-7.0.0.tgz", + "integrity": "sha512-oUuh4jzZrLySOo0tC0WoKiSg90bVAcnE98uW7F8GFiSOXnhogfNDGZelPJa+6KpGBO5+Qelv04Hqx2UD+BJqNQ==", + "dev": true, + "dependencies": { + "workbox-core": "7.0.0" + } + }, + "node_modules/workbox-build": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-7.0.0.tgz", + "integrity": "sha512-CttE7WCYW9sZC+nUYhQg3WzzGPr4IHmrPnjKiu3AMXsiNQKx+l4hHl63WTrnicLmKEKHScWDH8xsGBdrYgtBzg==", + "dev": true, + "dependencies": { + "@apideck/better-ajv-errors": "^0.3.1", + "@babel/core": "^7.11.1", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.2", + "@rollup/plugin-babel": "^5.2.0", + "@rollup/plugin-node-resolve": "^11.2.1", + "@rollup/plugin-replace": "^2.4.1", + "@surma/rollup-plugin-off-main-thread": "^2.2.3", + "ajv": "^8.6.0", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "lodash": "^4.17.20", + "pretty-bytes": "^5.3.0", + "rollup": "^2.43.1", + "rollup-plugin-terser": "^7.0.0", + "source-map": "^0.8.0-beta.0", + "stringify-object": "^3.3.0", + "strip-comments": "^2.0.1", + "tempy": "^0.6.0", + "upath": "^1.2.0", + "workbox-background-sync": "7.0.0", + "workbox-broadcast-update": "7.0.0", + "workbox-cacheable-response": "7.0.0", + "workbox-core": "7.0.0", + "workbox-expiration": "7.0.0", + "workbox-google-analytics": "7.0.0", + "workbox-navigation-preload": "7.0.0", + "workbox-precaching": "7.0.0", + "workbox-range-requests": "7.0.0", + "workbox-recipes": "7.0.0", + "workbox-routing": "7.0.0", + "workbox-strategies": "7.0.0", + "workbox-streams": "7.0.0", + "workbox-sw": "7.0.0", + "workbox-window": "7.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", + "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", + "dev": true, + "dependencies": { + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "ajv": ">=8" + } + }, + "node_modules/workbox-build/node_modules/@rollup/plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + } + } + }, + "node_modules/workbox-build/node_modules/@rollup/plugin-node-resolve": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", + "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/workbox-build/node_modules/@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, + "node_modules/workbox-build/node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/workbox-build/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "node_modules/workbox-build/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/workbox-build/node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + }, + "node_modules/workbox-build/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/workbox-build/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/workbox-build/node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/workbox-build/node_modules/rollup": { + "version": "2.79.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/workbox-build/node_modules/rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0" + } + }, + "node_modules/workbox-build/node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dev": true, + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/workbox-cacheable-response": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-7.0.0.tgz", + "integrity": "sha512-0lrtyGHn/LH8kKAJVOQfSu3/80WDc9Ma8ng0p2i/5HuUndGttH+mGMSvOskjOdFImLs2XZIimErp7tSOPmu/6g==", + "dev": true, + "dependencies": { + "workbox-core": "7.0.0" + } + }, + "node_modules/workbox-core": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.0.0.tgz", + "integrity": "sha512-81JkAAZtfVP8darBpfRTovHg8DGAVrKFgHpOArZbdFd78VqHr5Iw65f2guwjE2NlCFbPFDoez3D3/6ZvhI/rwQ==", + "dev": true + }, + "node_modules/workbox-expiration": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-7.0.0.tgz", + "integrity": "sha512-MLK+fogW+pC3IWU9SFE+FRStvDVutwJMR5if1g7oBJx3qwmO69BNoJQVaMXq41R0gg3MzxVfwOGKx3i9P6sOLQ==", + "dev": true, + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "7.0.0" + } + }, + "node_modules/workbox-google-analytics": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-7.0.0.tgz", + "integrity": "sha512-MEYM1JTn/qiC3DbpvP2BVhyIH+dV/5BjHk756u9VbwuAhu0QHyKscTnisQuz21lfRpOwiS9z4XdqeVAKol0bzg==", + "dev": true, + "dependencies": { + "workbox-background-sync": "7.0.0", + "workbox-core": "7.0.0", + "workbox-routing": "7.0.0", + "workbox-strategies": "7.0.0" + } + }, + "node_modules/workbox-navigation-preload": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-7.0.0.tgz", + "integrity": "sha512-juWCSrxo/fiMz3RsvDspeSLGmbgC0U9tKqcUPZBCf35s64wlaLXyn2KdHHXVQrb2cqF7I0Hc9siQalainmnXJA==", + "dev": true, + "dependencies": { + "workbox-core": "7.0.0" + } + }, + "node_modules/workbox-precaching": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-7.0.0.tgz", + "integrity": "sha512-EC0vol623LJqTJo1mkhD9DZmMP604vHqni3EohhQVwhJlTgyKyOkMrZNy5/QHfOby+39xqC01gv4LjOm4HSfnA==", + "dev": true, + "dependencies": { + "workbox-core": "7.0.0", + "workbox-routing": "7.0.0", + "workbox-strategies": "7.0.0" + } + }, + "node_modules/workbox-range-requests": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-7.0.0.tgz", + "integrity": "sha512-SxAzoVl9j/zRU9OT5+IQs7pbJBOUOlriB8Gn9YMvi38BNZRbM+RvkujHMo8FOe9IWrqqwYgDFBfv6sk76I1yaQ==", + "dev": true, + "dependencies": { + "workbox-core": "7.0.0" + } + }, + "node_modules/workbox-recipes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-7.0.0.tgz", + "integrity": "sha512-DntcK9wuG3rYQOONWC0PejxYYIDHyWWZB/ueTbOUDQgefaeIj1kJ7pdP3LZV2lfrj8XXXBWt+JDRSw1lLLOnww==", + "dev": true, + "dependencies": { + "workbox-cacheable-response": "7.0.0", + "workbox-core": "7.0.0", + "workbox-expiration": "7.0.0", + "workbox-precaching": "7.0.0", + "workbox-routing": "7.0.0", + "workbox-strategies": "7.0.0" + } + }, + "node_modules/workbox-routing": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-7.0.0.tgz", + "integrity": "sha512-8YxLr3xvqidnbVeGyRGkaV4YdlKkn5qZ1LfEePW3dq+ydE73hUUJJuLmGEykW3fMX8x8mNdL0XrWgotcuZjIvA==", + "dev": true, + "dependencies": { + "workbox-core": "7.0.0" + } + }, + "node_modules/workbox-strategies": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-7.0.0.tgz", + "integrity": "sha512-dg3qJU7tR/Gcd/XXOOo7x9QoCI9nk74JopaJaYAQ+ugLi57gPsXycVdBnYbayVj34m6Y8ppPwIuecrzkpBVwbA==", + "dev": true, + "dependencies": { + "workbox-core": "7.0.0" + } + }, + "node_modules/workbox-streams": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-7.0.0.tgz", + "integrity": "sha512-moVsh+5to//l6IERWceYKGiftc+prNnqOp2sgALJJFbnNVpTXzKISlTIsrWY+ogMqt+x1oMazIdHj25kBSq/HQ==", + "dev": true, + "dependencies": { + "workbox-core": "7.0.0", + "workbox-routing": "7.0.0" + } + }, + "node_modules/workbox-sw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-7.0.0.tgz", + "integrity": "sha512-SWfEouQfjRiZ7GNABzHUKUyj8pCoe+RwjfOIajcx6J5mtgKkN+t8UToHnpaJL5UVVOf5YhJh+OHhbVNIHe+LVA==", + "dev": true + }, + "node_modules/workbox-window": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-7.0.0.tgz", + "integrity": "sha512-j7P/bsAWE/a7sxqTzXo3P2ALb1reTfZdvVp6OJ/uLr/C2kZAMvjeWGm8V4htQhor7DOvYg0sSbFN2+flT5U0qA==", + "dev": true, + "dependencies": { + "@types/trusted-types": "^2.0.2", + "workbox-core": "7.0.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zrender": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.4.4.tgz", + "integrity": "sha512-0VxCNJ7AGOMCWeHVyTrGzUgrK4asT4ml9PEkeGirAkKNYXYzoPJCLvmyfdoOXcjTHPs10OZVMfD1Rwg16AZyYw==", + "dependencies": { + "tslib": "2.3.0" + } + }, + "node_modules/zrender/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..e167ce3 --- /dev/null +++ b/package.json @@ -0,0 +1,62 @@ +{ + "name": "customer", + "version": "1.0.8", + "private": true, + "scripts": { + "dev": "vite", + "build": "run-p build-only", + "preview": "vite preview", + "build-only": "vite build", + "type-check": "vue-tsc --noEmit -p tsconfig.app.json --composite false", + "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore", + "format": "prettier --write src/" + }, + "dependencies": { + "@lottiefiles/dotlottie-vue": "^0.4.9", + "@vueuse/core": "^10.5.0", + "ant-design-vue": "^3.2.20", + "apexcharts": "^3.44.0", + "axios": "^1.6.2", + "dayjalali": "^1.0.1", + "echarts": "^5.4.3", + "jalaliday": "^2.3.0", + "lodash": "^4.17.21", + "moment": "^2.29.4", + "moment-jalaali": "^0.10.0", + "odometer": "^0.4.8", + "pinia": "^2.1.4", + "sass": "^1.69.4", + "unocss": "^0.55.1", + "unplugin-vue-components": "^0.25.1", + "vant": "^4.7.2", + "vue": "^3.3.4", + "vue-content-loader": "^2.0.1", + "vue-lodash": "^2.1.2", + "vue-odometer": "^1.0.2", + "vue-router": "^4.2.4", + "vue3-apexcharts": "^1.4.4", + "vue3-lazyload": "^0.3.8", + "vue3-odometer": "^0.1.3", + "vue3-otp-input": "^0.4.1" + }, + "devDependencies": { + "@rushstack/eslint-patch": "^1.3.2", + "@tsconfig/node18": "^18.2.0", + "@types/lodash": "^4.17.7", + "@types/node": "^18.17.0", + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^3.0.1", + "@vue/eslint-config-prettier": "^8.0.0", + "@vue/eslint-config-typescript": "^11.0.3", + "@vue/tsconfig": "^0.4.0", + "eslint": "^8.45.0", + "eslint-plugin-vue": "^9.15.1", + "less": "^4.2.0", + "npm-run-all": "^4.1.5", + "prettier": "^3.0.0", + "typescript": "~5.1.6", + "vite": "^4.4.6", + "vite-plugin-pwa": "^0.16.7", + "vue-tsc": "^2.1.10" + } +} diff --git a/public/.well-known/assetlinks.json b/public/.well-known/assetlinks.json new file mode 100644 index 0000000..551b179 --- /dev/null +++ b/public/.well-known/assetlinks.json @@ -0,0 +1,10 @@ +[ + { + "relation": ["delegate_permission/common.handle_all_urls"], + "target": { + "namespace": "android_app", + "package_name": "ir.samingold.app", + "sha256_cert_fingerprints": ["60:54:C6:C1:22:6C:2E:EA:A1:05:02:B1:17:F5:7D:49:1A:C0:84:FF:4C:ED:FD:42:D9:7F:DF:B2:70:37:8E:03"] + } + } +] diff --git a/public/192-logo.png b/public/192-logo.png new file mode 100644 index 0000000..4df3dc5 Binary files /dev/null and b/public/192-logo.png differ diff --git a/public/192.png b/public/192.png new file mode 100644 index 0000000..4bcab99 Binary files /dev/null and b/public/192.png differ diff --git a/public/32.png b/public/32.png new file mode 100644 index 0000000..86f1e38 Binary files /dev/null and b/public/32.png differ diff --git a/public/36-logo.png b/public/36-logo.png new file mode 100644 index 0000000..69399fc Binary files /dev/null and b/public/36-logo.png differ diff --git a/public/512-logo.png b/public/512-logo.png new file mode 100644 index 0000000..8f803b5 Binary files /dev/null and b/public/512-logo.png differ diff --git a/public/512.png b/public/512.png new file mode 100644 index 0000000..d670c73 Binary files /dev/null and b/public/512.png differ diff --git a/public/animIsTracking.json b/public/animIsTracking.json new file mode 100644 index 0000000..568761c --- /dev/null +++ b/public/animIsTracking.json @@ -0,0 +1 @@ +{"v":"5.7.4","fr":29.9700012207031,"ip":0,"op":100.000004073084,"w":500,"h":500,"nm":"animation-deliver","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"star2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[44.643,395.975,0],"ix":2,"l":2},"a":{"a":0,"k":[27.712,27.691,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.691,0],[0,0.691],[0,0],[0.691,0],[0,-0.691],[0,0]],"o":[[0.691,0],[0,0],[0,-0.691],[-0.691,0],[0,0],[0,0.691]],"v":[[0,5.038],[1.25,3.786],[1.25,-3.788],[0,-5.038],[-1.25,-3.788],[-1.25,3.786]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.991999966491,0.651000019148,0.352999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[43.868,50.094],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.69,0],[0,0],[0,0.691],[0.691,0],[0,0],[0,-0.69]],"o":[[0,0],[0.691,0],[0,-0.69],[0,0],[-0.69,0],[0,0.691]],"v":[[-3.788,1.251],[3.788,1.251],[5.038,-0.001],[3.788,-1.251],[-3.788,-1.251],[-5.038,-0.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.991999966491,0.651000019148,0.352999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[37.599,44.348],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.69,0],[0,0],[0,0.691],[0.691,0],[0,0],[0,-0.69]],"o":[[0,0],[0.691,0],[0,-0.69],[0,0],[-0.69,0],[0,0.691]],"v":[[-3.787,1.251],[3.788,1.251],[5.038,-0.001],[3.788,-1.251],[-3.787,-1.251],[-5.037,-0.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.991999966491,0.651000019148,0.352999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[50.137,44.348],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.691,0],[0,0.69],[0,0],[0.691,0],[0,-0.691],[0,0]],"o":[[0.691,0],[0,0],[0,-0.691],[-0.691,0],[0,0],[0,0.69]],"v":[[0,5.038],[1.25,3.786],[1.25,-3.788],[0,-5.038],[-1.25,-3.788],[-1.25,3.786]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.991999966491,0.651000019148,0.352999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[43.868,38.08],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.691,0],[0,0.69],[0,0],[0.691,0],[0,-0.691],[0,0]],"o":[[0.691,0],[0,0],[0,-0.691],[-0.691,0],[0,0],[0,0.69]],"v":[[0,5.037],[1.25,3.787],[1.25,-3.787],[0,-5.037],[-1.25,-3.787],[-1.25,3.787]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980000035903,0.442999985639,0.375999989229,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[11.556,27.016],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.69,0],[0,0],[0,0.69],[0.691,0],[0,0],[0,-0.69]],"o":[[0,0],[0.691,0],[0,-0.69],[0,0],[-0.69,0],[0,0.69]],"v":[[-3.788,1.25],[3.788,1.25],[5.038,0],[3.788,-1.25],[-3.788,-1.25],[-5.038,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980000035903,0.442999985639,0.375999989229,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[5.288,21.27],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.69,0],[0,0],[0,0.69],[0.691,0],[0,0],[0,-0.69]],"o":[[0,0],[0.691,0],[0,-0.69],[0,0],[-0.69,0],[0,0.69]],"v":[[-3.788,1.25],[3.788,1.25],[5.038,0],[3.788,-1.25],[-3.788,-1.25],[-5.038,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980000035903,0.442999985639,0.375999989229,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[17.825,21.27],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.691,0],[0,0.69],[0,0],[0.691,0],[0,-0.692],[0,0]],"o":[[0.691,0],[0,0],[0,-0.692],[-0.691,0],[0,0],[0,0.69]],"v":[[0,5.038],[1.25,3.788],[1.25,-3.786],[0,-5.038],[-1.25,-3.786],[-1.25,3.788]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980000035903,0.442999985639,0.375999989229,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[11.556,15.001],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-3.864],[-3.865,0],[0,3.865],[3.864,0]],"o":[[0,3.865],[3.864,0],[0,-3.864],[-3.865,0]],"v":[[-7.008,-0.001],[0.001,7.008],[7.008,-0.001],[0.001,-7.008]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,5.356],[-5.356,0],[0,-5.355],[5.355,0]],"o":[[0,-5.355],[5.355,0],[0,5.356],[-5.356,0]],"v":[[-9.714,-0.001],[0.001,-9.714],[9.714,-0.001],[0.001,9.714]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325,0.419999994016,0.795999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[43.868,9.964],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":4,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":30,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":50,"s":[0]},{"t":70.0000028511585,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3,"x":"var $bm_rt;\n$bm_rt = content('Trim Paths 1').offset;"},"m":1,"ix":10,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":100.000004073084,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"star Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[345.161,128.371,0],"ix":2,"l":2},"a":{"a":0,"k":[27.712,27.691,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.69,0],[0,0.69],[0,0],[-0.691,0],[0,-0.691],[0,0]],"o":[[-0.691,0],[0,0],[0,-0.691],[0.69,0],[0,0],[0,0.69]],"v":[[0.001,5.037],[-1.251,3.787],[-1.251,-3.787],[0.001,-5.037],[1.251,-3.787],[1.251,3.787]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325,0.419999994016,0.795999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[11.556,50.094],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.69,0],[0,0],[0,0.69],[-0.691,0],[0,0],[0,-0.691]],"o":[[0,0],[-0.691,0],[0,-0.691],[0,0],[0.69,0],[0,0.69]],"v":[[3.788,1.25],[-3.788,1.25],[-5.038,0],[-3.788,-1.25],[3.788,-1.25],[5.038,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325,0.419999994016,0.795999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[17.825,44.348],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.69,0],[0,0],[0,0.69],[-0.691,0],[0,0],[0,-0.691]],"o":[[0,0],[-0.691,0],[0,-0.691],[0,0],[0.69,0],[0,0.69]],"v":[[3.788,1.25],[-3.788,1.25],[-5.038,0],[-3.788,-1.25],[3.788,-1.25],[5.038,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325,0.419999994016,0.795999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[5.288,44.348],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.69,0],[0,0.69],[0,0],[-0.691,0],[0,-0.691],[0,0]],"o":[[-0.691,0],[0,0],[0,-0.691],[0.69,0],[0,0],[0,0.69]],"v":[[0.001,5.037],[-1.251,3.787],[-1.251,-3.786],[0.001,-5.037],[1.251,-3.786],[1.251,3.787]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325,0.419999994016,0.795999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[11.556,38.079],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.69,0],[0,0.69],[0,0],[-0.69,0],[0,-0.69],[0,0]],"o":[[-0.69,0],[0,0],[0,-0.69],[0.69,0],[0,0],[0,0.69]],"v":[[0.001,5.037],[-1.251,3.787],[-1.251,-3.787],[0.001,-5.037],[1.251,-3.787],[1.251,3.787]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980000035903,0.442999985639,0.375999989229,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[43.868,27.016],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.69,0],[0,0],[0,0.69],[-0.692,0],[0,0],[0,-0.691]],"o":[[0,0],[-0.692,0],[0,-0.691],[0,0],[0.69,0],[0,0.69]],"v":[[3.787,1.25],[-3.787,1.25],[-5.038,0],[-3.787,-1.25],[3.787,-1.25],[5.038,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980000035903,0.442999985639,0.375999989229,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[50.137,21.27],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.69,0],[0,0],[0,0.69],[-0.692,0],[0,0],[0,-0.691]],"o":[[0,0],[-0.692,0],[0,-0.691],[0,0],[0.69,0],[0,0.69]],"v":[[3.787,1.25],[-3.787,1.25],[-5.038,0],[-3.787,-1.25],[3.787,-1.25],[5.038,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980000035903,0.442999985639,0.375999989229,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[37.6,21.27],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.69,0],[0,0.691],[0,0],[-0.69,0],[0,-0.691],[0,0]],"o":[[-0.69,0],[0,0],[0,-0.691],[0.69,0],[0,0],[0,0.691]],"v":[[0.001,5.037],[-1.251,3.787],[-1.251,-3.786],[0.001,-5.037],[1.251,-3.786],[1.251,3.787]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980000035903,0.442999985639,0.375999989229,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[43.868,15.001],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.864,0],[0,-3.864],[-3.864,0],[0,3.865]],"o":[[-3.864,0],[0,3.865],[3.864,0],[0,-3.864]],"v":[[0.001,-7.008],[-7.008,0],[0.001,7.008],[7.009,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[5.355,0],[0,5.356],[-5.356,0],[0,-5.356]],"o":[[-5.356,0],[0,-5.356],[5.355,0],[0,5.356]],"v":[[0.001,9.713],[-9.714,0],[0.001,-9.713],[9.714,0]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.991999966491,0.651000019148,0.352999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[11.556,9.963],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":4,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[0]},{"t":80.0000032584668,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3,"x":"var $bm_rt;\n$bm_rt = content('Trim Paths 1').offset;"},"m":1,"ix":10,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":100.000004073084,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"men Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[299.564,277.306,0],"ix":2,"l":2},"a":{"a":0,"k":[192.066,204.884,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":34,"nm":"Puppet","np":6,"mn":"ADBE FreePin3","ix":1,"en":1,"ef":[{"ty":7,"nm":"Puppet Engine","mn":"ADBE FreePin3 Puppet Engine","ix":1,"v":{"a":0,"k":2,"ix":1}},{"ty":0,"nm":"Mesh Rotation Refinement","mn":"ADBE FreePin3 Auto Rotate Pins","ix":2,"v":{"a":0,"k":20,"ix":2}},{"ty":7,"nm":"On Transparent","mn":"ADBE FreePin3 On Transparent","ix":3,"v":{"a":0,"k":0,"ix":3}},{"ty":29.9700012207031,"nm":"arap","np":3,"mn":"ADBE FreePin3 ARAP Group","ix":4,"en":1,"ef":[{"ty":6,"nm":"Auto-traced Shapes","mn":"ADBE FreePin3 Outlines","ix":1,"v":0},{"ty":1,"nm":"Mesh","np":2,"mn":"ADBE FreePin3 Mesh Group","ix":2,"en":1,"ef":[{"nm":"Mesh 1","np":8,"mn":"ADBE FreePin3 Mesh Atom","ix":1,"en":1,"ef":[{"ty":6,"nm":"Mesh","mn":"ADBE FreePin3 Mesh","ix":1,"v":0},{"ty":0,"nm":"Triangles","mn":"ADBE FreePin3 Mesh Tri Count","ix":2,"v":{"a":0,"k":50,"ix":2}},{"ty":0,"nm":"Density","mn":"ADBE FreePin3 Mesh Tri Density","ix":3,"v":{"a":0,"k":10,"ix":3}},{"ty":0,"nm":"Expansion","mn":"ADBE FreePin3 Mesh Expansion","ix":4,"v":{"a":0,"k":3,"ix":4}},{"nm":"Deform","np":9,"mn":"ADBE FreePin3 PosPins","ix":5,"en":1,"ef":[{"nm":"Puppet Pin 8","np":7,"mn":"ADBE FreePin3 PosPin Atom","ix":1,"en":1,"ef":[{"ty":3,"nm":"Vertex Offset","mn":"ADBE FreePin3 PosPin Vtx Offset","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":0,"nm":"Vertex Index","mn":"ADBE FreePin3 PosPin Vtx Index","ix":2,"v":{"a":0,"k":73,"ix":2}},{"ty":7,"nm":"Pin Type","mn":"ADBE FreePin3 PosPin Type","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":3,"nm":"Position","mn":"ADBE FreePin3 PosPin Position","ix":4,"v":{"a":1,"k":[{"i":{"x":0,"y":0},"o":{"x":0,"y":0},"t":0,"s":[240,101],"to":[3.333,0],"ti":[0,0]},{"i":{"x":0,"y":0},"o":{"x":0,"y":0},"t":0,"s":[260,101],"to":[0,0],"ti":[3.333,0]},{"i":{"x":0.667,"y":0},"o":{"x":0.333,"y":0},"t":0,"s":[240,101],"to":[0,0],"ti":[0,0]},{"i":{"x":0,"y":0},"o":{"x":0,"y":0},"t":0,"s":[240,101],"to":[3.333,0],"ti":[0,0]},{"i":{"x":0,"y":0},"o":{"x":0,"y":0},"t":0,"s":[260,101],"to":[0,0],"ti":[3.333,0]},{"t":null,"s":[240,101]}],"ix":4}},{"ty":0,"nm":"Scale","mn":"ADBE FreePin3 PosPin Scale","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Rotation","mn":"ADBE FreePin3 PosPin Rotation","ix":6,"v":{"a":0,"k":0,"ix":6}}]},{"nm":"Puppet Pin 7","np":7,"mn":"ADBE FreePin3 PosPin Atom","ix":2,"en":1,"ef":[{"ty":3,"nm":"Vertex Offset","mn":"ADBE FreePin3 PosPin Vtx Offset","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":0,"nm":"Vertex Index","mn":"ADBE FreePin3 PosPin Vtx Index","ix":2,"v":{"a":0,"k":74,"ix":2}},{"ty":7,"nm":"Pin Type","mn":"ADBE FreePin3 PosPin Type","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":3,"nm":"Position","mn":"ADBE FreePin3 PosPin Position","ix":4,"v":{"a":0,"k":[245,434],"ix":4}},{"ty":0,"nm":"Scale","mn":"ADBE FreePin3 PosPin Scale","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Rotation","mn":"ADBE FreePin3 PosPin Rotation","ix":6,"v":{"a":0,"k":0,"ix":6}}]},{"nm":"Puppet Pin 6","np":7,"mn":"ADBE FreePin3 PosPin Atom","ix":3,"en":1,"ef":[{"ty":3,"nm":"Vertex Offset","mn":"ADBE FreePin3 PosPin Vtx Offset","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":0,"nm":"Vertex Index","mn":"ADBE FreePin3 PosPin Vtx Index","ix":2,"v":{"a":0,"k":75,"ix":2}},{"ty":7,"nm":"Pin Type","mn":"ADBE FreePin3 PosPin Type","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":3,"nm":"Position","mn":"ADBE FreePin3 PosPin Position","ix":4,"v":{"a":1,"k":[{"i":{"x":0,"y":0},"o":{"x":0,"y":0},"t":0,"s":[433,269],"to":[0,5.167],"ti":[0,0]},{"i":{"x":0,"y":0},"o":{"x":0,"y":0},"t":0,"s":[433,300],"to":[0,0],"ti":[0,5.167]},{"i":{"x":0.667,"y":0},"o":{"x":0.167,"y":0},"t":0,"s":[433,269],"to":[0,0],"ti":[0,0]},{"i":{"x":0,"y":0},"o":{"x":0,"y":0},"t":0,"s":[433,269],"to":[0,5.167],"ti":[0,0]},{"i":{"x":0,"y":0},"o":{"x":0,"y":0},"t":0,"s":[433,300],"to":[0,0],"ti":[0,5.167]},{"t":null,"s":[433,269]}],"ix":4}},{"ty":0,"nm":"Scale","mn":"ADBE FreePin3 PosPin Scale","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Rotation","mn":"ADBE FreePin3 PosPin Rotation","ix":6,"v":{"a":0,"k":0,"ix":6}}]},{"nm":"Puppet Pin 5","np":7,"mn":"ADBE FreePin3 PosPin Atom","ix":4,"en":1,"ef":[{"ty":3,"nm":"Vertex Offset","mn":"ADBE FreePin3 PosPin Vtx Offset","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":0,"nm":"Vertex Index","mn":"ADBE FreePin3 PosPin Vtx Index","ix":2,"v":{"a":0,"k":76,"ix":2}},{"ty":7,"nm":"Pin Type","mn":"ADBE FreePin3 PosPin Type","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":3,"nm":"Position","mn":"ADBE FreePin3 PosPin Position","ix":4,"v":{"a":0,"k":[305,298],"ix":4}},{"ty":0,"nm":"Scale","mn":"ADBE FreePin3 PosPin Scale","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Rotation","mn":"ADBE FreePin3 PosPin Rotation","ix":6,"v":{"a":0,"k":0,"ix":6}}]},{"nm":"Puppet Pin 4","np":7,"mn":"ADBE FreePin3 PosPin Atom","ix":5,"en":1,"ef":[{"ty":3,"nm":"Vertex Offset","mn":"ADBE FreePin3 PosPin Vtx Offset","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":0,"nm":"Vertex Index","mn":"ADBE FreePin3 PosPin Vtx Index","ix":2,"v":{"a":0,"k":77,"ix":2}},{"ty":7,"nm":"Pin Type","mn":"ADBE FreePin3 PosPin Type","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":3,"nm":"Position","mn":"ADBE FreePin3 PosPin Position","ix":4,"v":{"a":0,"k":[240,211],"ix":4}},{"ty":0,"nm":"Scale","mn":"ADBE FreePin3 PosPin Scale","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Rotation","mn":"ADBE FreePin3 PosPin Rotation","ix":6,"v":{"a":0,"k":0,"ix":6}}]},{"nm":"Puppet Pin 3","np":7,"mn":"ADBE FreePin3 PosPin Atom","ix":6,"en":1,"ef":[{"ty":3,"nm":"Vertex Offset","mn":"ADBE FreePin3 PosPin Vtx Offset","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":0,"nm":"Vertex Index","mn":"ADBE FreePin3 PosPin Vtx Index","ix":2,"v":{"a":0,"k":78,"ix":2}},{"ty":7,"nm":"Pin Type","mn":"ADBE FreePin3 PosPin Type","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":3,"nm":"Position","mn":"ADBE FreePin3 PosPin Position","ix":4,"v":{"a":0,"k":[251,318],"ix":4}},{"ty":0,"nm":"Scale","mn":"ADBE FreePin3 PosPin Scale","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Rotation","mn":"ADBE FreePin3 PosPin Rotation","ix":6,"v":{"a":0,"k":0,"ix":6}}]},{"nm":"Puppet Pin 2","np":7,"mn":"ADBE FreePin3 PosPin Atom","ix":7,"en":1,"ef":[{"ty":3,"nm":"Vertex Offset","mn":"ADBE FreePin3 PosPin Vtx Offset","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":0,"nm":"Vertex Index","mn":"ADBE FreePin3 PosPin Vtx Index","ix":2,"v":{"a":0,"k":79,"ix":2}},{"ty":7,"nm":"Pin Type","mn":"ADBE FreePin3 PosPin Type","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":3,"nm":"Position","mn":"ADBE FreePin3 PosPin Position","ix":4,"v":{"a":0,"k":[142,367],"ix":4}},{"ty":0,"nm":"Scale","mn":"ADBE FreePin3 PosPin Scale","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Rotation","mn":"ADBE FreePin3 PosPin Rotation","ix":6,"v":{"a":0,"k":0,"ix":6}}]},{"nm":"Puppet Pin 1","np":7,"mn":"ADBE FreePin3 PosPin Atom","ix":8,"en":1,"ef":[{"ty":3,"nm":"Vertex Offset","mn":"ADBE FreePin3 PosPin Vtx Offset","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":0,"nm":"Vertex Index","mn":"ADBE FreePin3 PosPin Vtx Index","ix":2,"v":{"a":0,"k":80,"ix":2}},{"ty":7,"nm":"Pin Type","mn":"ADBE FreePin3 PosPin Type","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":3,"nm":"Position","mn":"ADBE FreePin3 PosPin Position","ix":4,"v":{"a":0,"k":[138,315],"ix":4}},{"ty":0,"nm":"Scale","mn":"ADBE FreePin3 PosPin Scale","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Rotation","mn":"ADBE FreePin3 PosPin Rotation","ix":6,"v":{"a":0,"k":0,"ix":6}}]}]},{"nm":"Overlap","np":1,"mn":"ADBE FreePin3 HghtPins","ix":6,"en":1,"ef":[]},{"nm":"Stiffness","np":1,"mn":"ADBE FreePin3 StarchPins","ix":7,"en":1,"ef":[]}]}]}]}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.074,0],[0.108,0.525],[-0.599,0.122],[0,0],[-0.122,-0.599],[0.599,-0.123],[0,0]],"o":[[-0.514,0],[-0.122,-0.597],[0,0],[0.594,-0.12],[0.122,0.599],[0,0],[-0.075,0.014]],"v":[[-3.707,1.912],[-4.79,1.026],[-3.926,-0.277],[3.485,-1.792],[4.79,-0.929],[3.927,0.376],[-3.484,1.89]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.078000005086,0.216000007181,0.569000004787,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[92.977,202.9],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.395,0],[0.166,0.088],[-0.287,0.539],[0,0],[-0.538,-0.287],[0.287,-0.539],[0,0]],"o":[[-0.176,0],[-0.539,-0.286],[0,0],[0.287,-0.541],[0.539,0.286],[0,0],[-0.199,0.374]],"v":[[-12.014,23.779],[-12.534,23.649],[-12.991,22.154],[11.037,-23.034],[12.533,-23.492],[12.99,-21.996],[-11.038,23.192]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.078000005086,0.216000007181,0.569000004787,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[83.044,215.339],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3.278,-7.4],[-0.048,-0.933],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-5.162,10.907],[-0.47,0.973],[-5.089,10.225],[-3.568,3.629],[-0.385,0.352],[-2.567,1.557],[-8.952,-5.429]],"o":[[0.126,0.875],[1.181,23.294],[0,0],[0,0],[0,0],[0,0],[0,0],[1.525,-4.942],[0.421,-0.891],[2.916,-6.094],[3.62,-7.278],[0.377,-0.382],[2.251,-2.109],[9.252,-5.608],[5.549,5.97]],"v":[[41.04,-23.547],[41.295,-20.839],[14.163,49.078],[10.562,47.646],[9.131,47.079],[-14.787,37.557],[-16.254,36.973],[-42.476,26.531],[-33.835,5.699],[-32.502,2.913],[-20.678,-21.171],[-10.128,-36.93],[-8.985,-38.042],[-1.816,-43.389],[27.875,-43.65]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325,0.419999994016,0.795999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[56.872,188.934],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.174,-2.662],[2.515,3.944],[-4.174,2.663],[-2.515,-3.945]],"o":[[-4.175,2.663],[-2.515,-3.945],[4.175,-2.662],[2.515,3.943]],"v":[[4.562,7.152],[-7.571,4.828],[-4.562,-7.154],[7.571,-4.828]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[115.15,261.246],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":3,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3.5,-5.488],[5.809,-3.705],[3.5,5.487],[-5.81,3.705]],"o":[[3.5,5.488],[-5.81,3.706],[-3.501,-5.489],[5.809,-3.705]],"v":[[10.52,-6.709],[6.338,9.937],[-10.519,6.709],[-6.338,-9.938]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.224000010771,0.004000000393,0.156999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[115.15,261.246],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":3,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.808,-2.99],[-13.854,-11.899],[-2.027,2.455],[7.457,21.854]],"o":[[0,0],[3.082,-0.081],[0,0],[-3.507,0.809]],"v":[[-14.896,-13.869],[6.334,19.586],[14.896,14.721],[-6.922,-19.586]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.224000010771,0.004000000393,0.156999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[120.22,263.323],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":3,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.363,0],[0.185,0.119],[0.076,-0.006],[0.054,0.608],[-0.608,0.055],[-4.909,-3.16],[0.33,-0.513]],"o":[[-0.206,0],[-4.265,-2.745],[-0.608,0.053],[-0.056,-0.609],[0.341,-0.031],[0.514,0.331],[-0.212,0.328]],"v":[[6.265,2.598],[5.667,2.422],[-6.27,0.328],[-7.469,-0.674],[-6.468,-1.875],[6.864,0.562],[7.196,2.09]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.987999949736,0.501999978458,0.426999978458,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[39.252,270.64],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":3,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.2,0],[0.21,0.336],[-0.518,0.323],[-0.431,0.126],[-0.171,-0.585],[0.587,-0.171],[6.087,-3.806]],"o":[[-0.369,0],[-0.324,-0.517],[6.349,-3.969],[0.586,-0.171],[0.171,0.587],[-0.102,0.03],[-0.182,0.114]],"v":[[-8.341,4.658],[-9.28,4.137],[-8.928,2.614],[8.061,-4.487],[9.433,-3.736],[8.681,-2.364],[-7.756,4.489]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.987999949736,0.501999978458,0.426999978458,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[38.276,275.557],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":3,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[2.702,6.729],[-0.935,3.72],[-5.942,3.558],[0,0],[-3.648,0.406],[1.082,-4.038],[2.198,-8.786],[1.081,-7.668],[0,-5.545]],"o":[[-7.075,10.388],[-13.747,-0.349],[-1.429,-3.559],[2.741,-10.901],[4.564,-2.733],[0,0],[3.649,-0.405],[0,0],[0,0],[0,0],[0,2.299]],"v":[[23.82,18.274],[0.29,30.952],[-22.419,14.233],[-23.535,3.003],[-22.879,-28.219],[-11.665,-11.332],[8.276,-27.407],[13.817,-18.606],[20.07,-7.539],[25.576,3.309],[28.82,9.895]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.991999966491,0.681999954523,0.564999988032,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[139.735,238.772],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":3,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.532,-1.095],[1.33,-2.862],[0,0],[-0.912,2.101]],"o":[[-0.531,1.095],[-1.374,2.858],[0,0],[0.896,-2.116],[0,0]],"v":[[23.652,1.193],[22.058,4.481],[17.991,13.064],[-23.652,-6.738],[-20.936,-13.063]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.987999949736,0.501999978458,0.426999978458,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[42.395,228.488],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 10","np":3,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[8.879,-6.001],[0,0],[0,0],[0,0],[2.242,-1.345],[4.638,-2.495],[10.477,-3.884],[5.891,-1.375],[7.177,-0.024],[4.059,0.803],[4.262,2.169],[1.999,1.48],[0.937,0.82],[0.446,0.425],[0,0],[0.243,0.275],[0.402,0.535],[0.5,0.92],[0.214,0.458],[0.178,0.447],[0,0],[0,0],[0.117,0.394],[0.166,0.701],[0.094,0.596],[0.008,1.464],[-0.101,1.111],[-0.134,0.969],[-0.754,2.907],[-0.84,2.627],[-1.849,4.861],[-2.802,6.597],[-0.913,2.101],[-0.264,0.601],[-4.225,9.058],[-2.153,4.517],[0,0],[0,0],[-12.103,-5.92],[5.923,-12.095],[0.151,-0.276],[0,0],[0,0],[0,0],[2.21,-4.29],[3.665,-7.525],[0.531,-1.095],[1.33,-2.862],[2.416,-5.701],[1.48,-4.068],[0.024,-0.074],[-1.894,0.369],[-4.01,1.309],[-8.158,4.018],[-4.01,2.237],[-1.959,1.163],[0,0],[0,0],[0,0],[-5.835,-9.406]],"o":[[0,0],[0,0],[0,0],[-2.226,1.408],[-4.48,2.697],[-9.289,4.987],[-5.242,1.934],[-5.899,1.355],[-3.584,0],[-4.05,-0.795],[-2.133,-1.094],[-0.989,-0.73],[-0.47,-0.409],[0,0],[-0.259,-0.259],[-0.486,-0.528],[-0.778,-1.013],[-0.267,-0.486],[-0.203,-0.438],[0,0],[0,0],[-0.142,-0.384],[-0.227,-0.753],[-0.126,-0.612],[-0.34,-2.214],[0,-1.455],[0.098,-1.139],[0.572,-3.791],[0.762,-2.887],[1.687,-5.231],[2.62,-6.868],[0.896,-2.116],[0.259,-0.604],[4.034,-9.232],[2.108,-4.533],[0,0],[0,0],[5.92,-12.103],[12.099,5.923],[-0.135,0.283],[0,0],[0,0],[0,0],[-2.262,4.26],[-3.864,7.489],[-0.532,1.095],[-1.375,2.858],[-2.692,5.758],[-1.801,4.257],[-0.024,0.072],[1.698,-0.15],[3.706,-0.71],[8.052,-2.644],[4.083,-2.015],[1.999,-1.119],[0,0],[0,0],[0,0],[9.406,-5.839],[5.704,9.179]],"v":[[61.759,49.07],[59.943,50.299],[58.26,51.415],[54.923,53.555],[48.229,57.686],[34.561,65.464],[5.157,78.969],[-11.446,84.025],[-30.835,86.432],[-42.301,85.363],[-54.931,81.061],[-61.155,77.197],[-64.05,74.853],[-65.416,73.589],[-65.631,73.385],[-66.385,72.592],[-67.776,70.937],[-69.824,67.823],[-70.585,66.343],[-71.165,65.017],[-71.433,64.348],[-71.64,63.764],[-72.025,62.592],[-72.568,60.517],[-72.897,58.733],[-73.29,53.405],[-73.112,49.59],[-72.747,46.476],[-70.687,36.749],[-68.266,28.535],[-62.947,13.496],[-54.797,-6.651],[-52.08,-12.976],[-51.298,-14.781],[-38.887,-42.181],[-32.493,-55.743],[-29.245,-62.498],[-25.901,-69.326],[6.739,-80.512],[17.926,-47.877],[17.499,-47.05],[17.325,-46.739],[13.927,-40.466],[10.521,-34.079],[3.807,-21.251],[-7.492,1.28],[-9.086,4.568],[-13.153,13.151],[-20.852,30.359],[-25.84,42.921],[-25.908,43.127],[-20.475,42.348],[-8.794,39.243],[15.699,29.017],[27.851,22.607],[33.803,19.185],[36.722,17.429],[39.406,15.771],[39.978,15.41],[67.586,21.873]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.991999966491,0.681999954523,0.564999988032,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[73.54,228.401],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 11","np":3,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-17.991,-15.264],[15.519,11.895],[21.23,-28.86]],"o":[[0,0],[-15.517,-11.894],[0,0]],"v":[[14.594,19.125],[28.63,-11.143],[-44.149,23.038]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.851000019148,0.277999997606,0.234999997008,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[151.261,23.288],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 12","np":3,"cix":2,"bm":0,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[12.505,-6.618],[0,0],[-8.705,0.262]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[10.597,-3.955],[-11.566,-0.212],[-9.144,6.83],[11.566,1.808]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.851000019148,0.277999997606,0.234999997008,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[124.404,23.004],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 13","np":3,"cix":2,"bm":0,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-4.764,-5.067],[0,0],[-1.141,7.956],[-0.893,2.366],[0.842,-0.799],[0.343,-2.39]],"o":[[0,0],[-4.475,-4.647],[0.505,-3.545],[-0.961,0.716],[-0.593,1.941],[-1.212,8.433]],"v":[[2.625,14.665],[4.009,13.423],[-1.013,-5.538],[1.389,-14.665],[-1.316,-12.391],[-2.797,-5.83]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.851000019148,0.277999997606,0.234999997008,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[99.224,36.078],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 14","np":3,"cix":2,"bm":0,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[25.916,-0.306],[5.563,-4.159],[0.843,-0.799],[0.904,-6.012]],"o":[[0,0],[0,0],[0,0],[21.467,-11.664],[0,0],[-9.388,0.109],[-0.961,0.715],[-5.015,4.726],[-1.933,12.886]],"v":[[-30.067,23.133],[-19.349,13.503],[-17.964,12.26],[-14.932,9.534],[34.12,-1.86],[1.861,-22.827],[-20.585,-15.827],[-23.29,-13.554],[-32.187,3.196]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980000035903,0.442999985639,0.375999989229,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[121.197,37.24],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 15","np":3,"cix":2,"bm":0,"ix":15,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[5.162,0],[0,0.481],[-0.48,0],[-0.498,0.731],[0.035,0.075],[-0.433,0.208],[-0.208,-0.434],[-3.54,-7.294],[0.11,-0.238]],"o":[[-0.48,0],[0,-0.481],[3.204,0],[-3.474,-7.163],[-0.207,-0.433],[0.435,-0.208],[0.035,0.075],[0.114,0.236],[-0.072,0.153]],"v":[[-2.558,9.995],[-3.429,9.124],[-2.558,8.253],[2.641,5.829],[-4.321,-8.626],[-3.911,-9.787],[-2.748,-9.377],[4.412,5.488],[4.419,6.237]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.102000000898,0.325,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[148.474,69.114],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 16","np":3,"cix":2,"bm":0,"ix":16,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.193,0],[0.172,0.212],[-0.373,0.303],[-2.616,-0.669],[0.119,-0.465],[0.466,0.12],[0.758,-0.615]],"o":[[-0.254,0],[-0.302,-0.373],[0.347,-0.283],[0.466,0.119],[-0.12,0.467],[-1.504,-0.384],[-0.161,0.131]],"v":[[-2.652,2.144],[-3.329,1.822],[-3.204,0.598],[2.883,-1.476],[3.512,-0.416],[2.451,0.212],[-2.105,1.951]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.102000000898,0.325,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[102.189,82.826],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 17","np":3,"cix":2,"bm":0,"ix":17,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.032,0],[0.05,0.446],[0.307,0.123],[-0.178,0.446],[-0.447,-0.179],[-1.058,-9.671],[0.478,-0.052]],"o":[[-0.438,0],[-0.94,-8.606],[-0.446,-0.18],[0.179,-0.446],[0.345,0.138],[0.052,0.479],[-0.033,0.003]],"v":[[4.533,7.151],[3.667,6.376],[-4.79,-5.354],[-5.273,-6.487],[-4.143,-6.973],[5.4,6.186],[4.629,7.147]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.102000000898,0.325,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[103.132,83.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 18","np":3,"cix":2,"bm":0,"ix":18,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[6.202,-8.935],[-10.116,6.576]],"o":[[0,0],[-5.11,7.364],[0,0]],"v":[[9.889,-6.374],[-4.779,-8.809],[9.889,11.169]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.991999966491,0.681999954523,0.564999988032,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[98.933,82.506],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 19","np":3,"cix":2,"bm":0,"ix":19,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3.678,3.527],[4.007,-1.893],[0,0],[0,0]],"o":[[-0.1,0.235],[-0.013,-0.013],[0,0],[0,0]],"v":[[3.578,-4.296],[-3.317,4.296],[-3.339,4.274],[-3.578,-0.176]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.102000000898,0.325,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[109.122,95.133],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 20","np":3,"cix":2,"bm":0,"ix":20,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-2.117],[1.185,0],[0,2.117],[-1.184,0]],"o":[[0,2.117],[-1.184,0],[0,-2.117],[1.185,0]],"v":[[2.145,0],[-0.001,3.833],[-2.145,0],[-0.001,-3.833]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.102000000898,0.325,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[154.706,68.451],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 21","np":3,"cix":2,"bm":0,"ix":21,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-2.117],[1.185,0],[0,2.117],[-1.184,0]],"o":[[0,2.117],[-1.184,0],[0,-2.117],[1.185,0]],"v":[[2.145,0],[-0.001,3.833],[-2.146,0],[-0.001,-3.833]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.102000000898,0.325,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[133.43,68.451],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 22","np":3,"cix":2,"bm":0,"ix":22,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.216,-0.273],[5.383,-2.365],[7.69,3.931],[-2.622,-3.589],[2.905,-4.576],[4.642,-3.589],[-0.79,-2.106],[2.411,0.449],[0,0],[0,0],[-21.125,4.054],[-7.303,-8.052]],"o":[[-3.456,-1.223],[-7.782,3.418],[-7.69,-3.93],[2.618,3.588],[-2.906,4.573],[-1.955,1.512],[0.862,2.297],[-2.505,-0.636],[0,0],[0,0],[15.436,-2.963],[0.236,0.26]],"v":[[29.51,-12.143],[18.175,-9.862],[-5.999,-13.452],[-15.68,-8.324],[-16.251,2.745],[-15.398,13.036],[-16.445,18.911],[-20.012,23.108],[-26.046,18.034],[-26.714,5.689],[-8.385,-20.595],[28.828,-12.943]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.102000000898,0.325,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[130.346,53.827],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 23","np":3,"cix":2,"bm":0,"ix":23,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-4.699,-5.725],[0,0],[2.494,1.073],[1.811,0.395],[-0.694,2.535]],"o":[[0,0],[-1.118,2.475],[-1.457,-0.627],[-2.57,-0.559],[0,0]],"v":[[7.824,1.061],[7.824,1.061],[1.318,3.59],[-3.669,1.954],[-7.13,-3.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.102000000898,0.325,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[156.127,56.489],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 24","np":3,"cix":2,"bm":0,"ix":24,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.7,-5.725],[0,0],[-2.495,1.073],[-1.812,0.395],[0.695,2.535]],"o":[[0,0],[1.118,2.475],[1.457,-0.627],[2.569,-0.559],[0,0]],"v":[[-7.824,1.061],[-7.824,1.061],[-1.319,3.59],[3.669,1.954],[7.129,-3.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.102000000898,0.325,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[131.948,56.489],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 25","np":3,"cix":2,"bm":0,"ix":25,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.655,-0.12],[0.091,0.089],[-0.35,0.359],[-0.36,-0.349],[-9.646,7.564],[-0.311,-0.395],[0.394,-0.31]],"o":[[-8.06,0.366],[-0.359,-0.35],[0.35,-0.359],[0.452,0.439],[0.394,-0.309],[0.31,0.395],[-2.701,2.118]],"v":[[3.416,2.485],[-11.65,-3.852],[-11.667,-5.136],[-10.383,-5.154],[10.432,-2.061],[11.707,-1.907],[11.553,-0.631]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.187999994615,0.349000010771,0.611999990426,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[146.388,87.207],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 26","np":3,"cix":2,"bm":0,"ix":26,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-6.926,2.426],[-6.516,-2.684],[-6.591,-4.118],[14.898,-4.901],[5.549,14.006],[0,0]],"o":[[0,0],[6.927,-2.427],[0,0],[4.418,2.761],[-14.899,4.901],[-5.55,-14.006],[0,0]],"v":[[-25.112,-25.107],[-11.649,-14.142],[10.114,-14.142],[26.986,-16.839],[15.39,20.206],[-25.619,6.723],[-31.404,-19.408]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.102000000898,0.325,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[138.408,95.378],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 27","np":3,"cix":2,"bm":0,"ix":27,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.588,0],[0,1.541],[-3.913,0],[-0.496,-0.044]],"o":[[-0.547,0.055],[-3.913,0],[0,-1.541],[0.53,0],[0,0]],"v":[[4.399,2.71],[2.689,2.792],[-4.399,0.001],[2.689,-2.792],[4.231,-2.725]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.987999949736,0.501999978458,0.426999978458,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[160.464,76.935],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 28","np":3,"cix":2,"bm":0,"ix":28,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-1.541],[3.917,0],[0,1.542],[-3.916,0]],"o":[[0,1.542],[-3.916,0],[0,-1.541],[3.917,0]],"v":[[7.092,0],[0,2.792],[-7.092,0],[0,-2.792]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.987999949736,0.501999978458,0.426999978458,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[128.878,76.935],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 29","np":3,"cix":2,"bm":0,"ix":29,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[22.023,0.048],[0.776,0.796],[0,0],[0,0],[0,0],[0,0],[-21.126,4.054],[-7.304,-8.052],[-0.216,-0.273],[-0.393,-4.07],[0,0],[0,0]],"o":[[0,0],[-21.888,-0.041],[-0.013,-0.014],[0,0],[0,0],[0,0],[0,0],[15.435,-2.963],[0.235,0.259],[2.299,2.831],[0,0],[0,0],[0,0]],"v":[[32.256,22.443],[10.263,43.568],[-27.316,25.543],[-27.339,25.523],[-27.579,21.072],[-28.823,-2.025],[-29.49,-14.37],[-11.16,-40.653],[26.053,-33],[26.734,-32.201],[30.889,-21.848],[31.572,0.326],[31.74,5.761]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.991999966491,0.681999954523,0.564999988032,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[133.122,73.885],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 30","np":3,"cix":2,"bm":0,"ix":30,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-3.288,-6.872],[8.85,2.276]],"o":[[0,0],[3.288,6.872],[0,0]],"v":[[-6.196,-6.955],[2.908,-6.955],[-5.184,11.55]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.987999949736,0.501999978458,0.426999978458,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[165.371,79.184],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 31","np":3,"cix":2,"bm":0,"ix":31,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.216,-0.729],[0,0],[0,0]],"o":[[0,0],[-1.198,0.968],[-15.142,-5.994],[0,0],[0,0]],"v":[[14.894,-2.135],[14.894,8.401],[11.269,10.94],[-14.894,-10.94],[10.053,-4.854]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.102000000898,0.325,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[131.483,119.456],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 32","np":3,"cix":2,"bm":0,"ix":32,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.216,-0.729],[0,0],[0,0],[0,0]],"o":[[0,0],[-1.198,0.968],[-17.783,10.68],[0,0],[0,0],[0,0]],"v":[[20.296,0.903],[20.296,11.144],[16.671,13.684],[-20.296,11.144],[-20.296,-24.364],[15.455,-2.11]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.991999966491,0.681999954523,0.564999988032,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[126.081,116.712],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 33","np":3,"cix":2,"bm":0,"ix":33,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[9.087,-14.793],[-3.168,-3.432],[-4.232,-3.287],[0,0],[-3.188,3.344]],"o":[[0,0],[3.168,3.431],[4.231,3.288],[0,0],[0,0]],"v":[[-9.322,-5.594],[-8.395,4.818],[-4.43,17.191],[6.596,18.441],[11.563,-20.479]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.102000000898,0.325,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[101.138,59.8],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 34","np":3,"cix":2,"bm":0,"ix":34,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-18.615,-4.847],[0.092,-6.61],[0.91,-6.009],[0,0],[6.51,1.441],[0,0]],"o":[[0,0],[0,0],[-0.911,6.009],[0,0],[-6.509,-1.442],[0,0]],"v":[[6.558,-17.079],[11.949,-4.844],[14.573,8.124],[10.632,21.926],[-0.933,-7.936],[-15.483,-14.195]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.102000000898,0.325,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[153.906,47.257],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 35","np":3,"cix":2,"bm":0,"ix":35,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.347,0],[-5.637,4.317],[0.365,0.477],[0.475,-0.366],[7.374,1.012],[0.155,0.206],[0.481,-0.36],[-0.36,-0.48],[-19.46,-2.677]],"o":[[6.459,0],[0.478,-0.365],[-0.366,-0.477],[-6.333,4.849],[-18.556,-2.549],[-0.36,-0.479],[-0.48,0.361],[0.652,0.869],[1.376,0.19]],"v":[[10.663,13.075],[28.866,6.584],[29.069,5.061],[27.545,4.859],[6.881,10.639],[-27.335,-12.498],[-28.857,-12.715],[-29.074,-11.193],[6.578,12.791]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.078000005086,0.216000007181,0.569000004787,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[128.12,144.51],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 36","np":3,"cix":2,"bm":0,"ix":36,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-12.305,0],[-2.619,0.468],[0.105,0.591],[0.595,-0.109],[0.145,0.287],[0.537,-0.272],[-0.272,-0.536],[-7.586,-6.719]],"o":[[2.389,0],[0.591,-0.106],[-0.106,-0.59],[-29.229,5.232],[-0.272,-0.535],[-0.534,0.272],[0.156,0.307],[5.897,5.221]],"v":[[15.343,12.25],[22.856,11.569],[23.734,10.307],[22.472,9.429],[-21.628,-13.911],[-23.09,-14.389],[-23.567,-12.927],[-12.076,1.392]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.078000005086,0.216000007181,0.569000004787,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[139.186,313.758],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 37","np":3,"cix":2,"bm":0,"ix":37,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-24.418,0],[-9.952,2.159],[0.127,0.587],[0.586,-0.128],[16.6,9.71],[0.092,0.126],[0.486,-0.35],[-0.351,-0.488],[-18.379,-10.773]],"o":[[8.571,0],[0.587,-0.127],[-0.128,-0.586],[-37.57,8.151],[-18.013,-10.537],[-0.351,-0.487],[-0.487,0.352],[0.381,0.529],[12.543,7.354]],"v":[[27.615,18.786],[55.405,15.71],[56.237,14.417],[54.944,13.585],[-26.898,2.164],[-54.251,-21.14],[-55.768,-21.386],[-56.014,-19.868],[-28.084,3.989]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.078000005086,0.216000007181,0.569000004787,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[133.325,325.917],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 38","np":3,"cix":2,"bm":0,"ix":38,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.444,0],[-0.123,0.045],[0.207,0.565],[0.92,29.927],[-0.026,0.23],[0.597,0.068],[0.067,-0.596],[-0.999,-32.602],[-14.979,-41.018]],"o":[[0.124,0],[0.564,-0.206],[-14.875,-40.733],[-0.997,-32.455],[0.067,-0.596],[-0.591,-0.07],[-0.026,0.231],[0.922,30.097],[0.161,0.442]],"v":[[10.468,99.1],[10.841,99.034],[11.489,97.639],[-8.523,-17.247],[-6.933,-73.039],[-7.892,-74.241],[-9.094,-73.283],[-10.697,-17.219],[9.447,98.385]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.078000005086,0.216000007181,0.569000004787,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[62.431,291.255],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 39","np":3,"cix":2,"bm":0,"ix":39,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.136,0],[-0.171,0.422],[0,0],[0.555,0.225],[0.224,-0.556],[0,0],[-0.557,-0.225]],"o":[[0.43,0],[0,0],[0.226,-0.557],[-0.558,-0.226],[0,0],[-0.225,0.556],[0.134,0.055]],"v":[[-2.031,6.174],[-1.023,5.496],[3.038,-4.532],[2.44,-5.948],[1.024,-5.348],[-3.039,4.68],[-2.439,6.095]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.078000005086,0.216000007181,0.569000004787,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[192.45,194.739],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 40","np":3,"cix":2,"bm":0,"ix":40,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.592,0],[0,0],[0.011,0.6],[0,0],[0.592,0],[0,0],[-0.011,-0.6],[0,0]],"o":[[0,0],[0.6,-0.01],[0,0],[-0.011,-0.595],[0,0],[-0.601,0.011],[0,0],[0.011,0.593]],"v":[[0.544,31.725],[0.564,31.725],[1.631,30.62],[0.544,-30.657],[-0.543,-31.725],[-0.562,-31.725],[-1.631,-30.619],[-0.543,30.658]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.078000005086,0.216000007181,0.569000004787,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[190.389,211.776],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 41","np":3,"cix":2,"bm":0,"ix":41,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-40.443,14.023],[-2.094,0.332],[-1.473,0.32],[0,0],[-3.962,1.876],[-0.549,0.282],[0,0],[0,0],[-4.707,-2.246],[-0.533,-0.233],[-1,-0.358],[-3.609,-1.038],[-2.327,-11.677],[-0.87,-45.161],[-0.168,-3.566],[-0.267,-3.571],[-0.054,-0.696],[-0.283,-2.794],[-0.392,-3.24],[-0.5,-3.496],[-3.034,-24.954],[1.794,-1.408],[56.984,0.418],[0.336,2.784],[4.045,24.119],[0.343,3.375],[0.228,3.425],[-0.799,17.378],[-0.049,0.951],[1.056,16.52]],"o":[[1.886,-0.767],[1.603,-0.255],[0,0],[6.256,-1.365],[0.598,-0.282],[5.827,-2.968],[0,0],[3.469,5.056],[0.517,0.245],[0.984,0.424],[3.696,1.348],[9.616,2.767],[2.163,10.822],[0.065,3.315],[0.159,3.332],[0.049,0.685],[0.206,2.663],[0.304,3.082],[0.402,3.327],[2.686,18.775],[1.494,12.231],[-11.615,25.942],[-0.222,-1.2],[-4.74,-12.943],[-0.994,-5.892],[-0.348,-3.419],[-1.087,-16.481],[0.044,-0.94],[0.702,-14.291],[0,0]],"v":[[-49.479,-107.632],[-43.51,-109.285],[-38.895,-110.154],[-38.89,-110.154],[-23.567,-115.297],[-21.854,-116.139],[-12.733,-121.781],[25.9,-120.461],[40.104,-111.301],[41.681,-110.584],[44.664,-109.41],[55.754,-106.045],[76.095,-88.389],[70.828,-10.124],[71.174,0.187],[71.811,10.537],[71.969,12.603],[72.703,20.801],[73.746,30.286],[75.1,40.511],[82.493,98.364],[88.128,139.791],[-56.54,147.315],[-57.427,142.711],[-72.464,67.425],[-74.276,52.93],[-75,42.239],[-76.811,-8.379],[-76.674,-11.217],[-82.067,-61.767]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325,0.419999994016,0.795999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[120.368,243.786],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 42","np":3,"cix":2,"bm":0,"ix":42,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.089,0],[0.127,0.503],[-0.593,0.15],[0,0],[-0.149,-0.593],[0.593,-0.149],[0,0]],"o":[[-0.496,0],[-0.149,-0.593],[0,0],[0.595,-0.145],[0.149,0.593],[0,0],[-0.091,0.022]],"v":[[-4.869,2.385],[-5.943,1.548],[-5.138,0.204],[4.6,-2.24],[5.944,-1.436],[5.139,-0.092],[-4.599,2.353]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.987999949736,0.501999978458,0.426999978458,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[220.823,220.367],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 43","np":3,"cix":2,"bm":0,"ix":43,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.509,0],[0.08,0.018],[-0.132,0.598],[-0.247,0.247],[-0.434,-0.43],[0.431,-0.434],[2.11,-9.633]],"o":[[-0.078,0],[-0.597,-0.131],[2.255,-10.295],[0.43,-0.431],[0.433,0.431],[-0.057,0.055],[-0.113,0.517]],"v":[[-4.006,9.116],[-4.244,9.091],[-5.088,7.772],[3.221,-8.684],[4.785,-8.686],[4.79,-7.12],[-2.926,8.247]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.987999949736,0.501999978458,0.426999978458,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[221.689,227.102],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 44","np":3,"cix":2,"bm":0,"ix":44,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-28.81,-2.689],[-4.168,-8.568],[0,0],[0,0],[0.362,22.371]],"o":[[0,0],[4.167,8.567],[0,0],[0,0],[-0.362,-22.371]],"v":[[1.906,-48.083],[14.271,-22.256],[26.904,-1.211],[-4.641,50.772],[-22.217,9.951]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325,0.419999994016,0.795999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[192.961,198.426],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 45","np":3,"cix":2,"bm":0,"ix":45,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-7.011,-0.19],[-2.273,-6.064],[0,0],[0,0]],"o":[[0,0],[7.011,0.189],[2.275,6.064],[0,0],[0,0]],"v":[[-18.841,-1.479],[-1.815,-9.853],[16.565,3.98],[3.68,2.274],[-9.585,-1.781]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.991999966491,0.681999954523,0.564999988032,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[319.208,177.951],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 46","np":3,"cix":2,"bm":0,"ix":46,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.854,-0.008],[0,0],[0.008,0.854],[0,0],[-0.853,0.009],[0,0],[-0.008,-0.853],[0,0]],"o":[[0,0],[-0.852,0.008],[0,0],[-0.008,-0.853],[0,0],[0.854,-0.008],[0,0],[0.008,0.854]],"v":[[37.715,4.589],[-37.621,5.322],[-39.181,3.792],[-39.246,-3.029],[-37.715,-4.589],[37.621,-5.322],[39.181,-3.792],[39.246,3.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980000035903,0.442999985639,0.375999989229,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[329.466,181.145],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 47","np":3,"cix":2,"bm":0,"ix":47,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.416,-1.68],[0,0],[-0.659,2.921],[0,0]],"o":[[0,0],[1.298,-5.683],[0,0],[0.286,1.155]],"v":[[35.151,-2.748],[-35.151,7.021],[-32.138,-6.253],[34.094,-7.021]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.851000019148,0.277999997606,0.234999997008,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[328.495,190.193],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 48","np":3,"cix":2,"bm":0,"ix":48,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.257,-0.894],[15.466,-0.151],[10.094,0.924],[-0.253,0.981],[-43.819,5.147]],"o":[[-18.005,2.136],[-22.902,0.222],[0.239,-0.898],[17.004,1.529],[0.272,0.972]],"v":[[51.266,-0.278],[0.39,2.858],[-51.266,0.852],[-50.524,-1.968],[50.469,-3.08]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.851000019148,0.277999997606,0.234999997008,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[330.182,256.476],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 49","np":3,"cix":2,"bm":0,"ix":49,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.095,-9.744],[9.745,-0.094],[0.095,9.744],[-9.745,0.095]],"o":[[0.095,9.745],[-9.744,0.095],[-0.095,-9.744],[9.744,-0.094]],"v":[[17.644,-0.173],[0.171,17.643],[-17.644,0.171],[-0.171,-17.645]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.851000019148,0.277999997606,0.234999997008,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[329.053,223.343],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 50","np":3,"cix":2,"bm":0,"ix":50,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[7.328,33.667],[-8.379,-33.421],[-7.327,-33.667],[8.379,33.422]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.851000019148,0.277999997606,0.234999997008,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[366.625,220.674],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 51","np":3,"cix":2,"bm":0,"ix":51,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-6.098,31.118],[-7.154,30.891],[6.098,-31.118],[7.154,-30.892]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.851000019148,0.277999997606,0.234999997008,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[293.214,224.068],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 52","np":3,"cix":2,"bm":0,"ix":52,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.659,-1.933],[35.768,3.049],[-0.868,3.243],[-0.253,0.982],[-3.781,16.566],[-0.66,2.921],[0,0],[-0.416,-1.68],[-5.274,-18.741],[-0.256,-0.894]],"o":[[-35.701,3.743],[0.611,-1.92],[0.239,-0.898],[4.062,-15.56],[1.298,-5.682],[0,0],[0.285,1.156],[3.607,14.612],[0.271,0.972],[0.947,3.286]],"v":[[53.604,38.439],[-53.604,39.481],[-51.362,31.627],[-50.62,28.806],[-36.934,-28.487],[-33.921,-41.76],[32.311,-42.53],[33.368,-38.255],[50.373,27.695],[51.169,30.497]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980000035903,0.442999985639,0.375999989229,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[330.278,225.701],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 53","np":3,"cix":2,"bm":0,"ix":53,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.843,7.958],[-9.665,-3.129],[0,0]],"o":[[0,0],[9.664,3.129],[0,0]],"v":[[-18.192,-1.307],[8.528,-4.436],[16.408,7.565]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.991999966491,0.681999954523,0.564999988032,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[341.838,175.658],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 54","np":3,"cix":2,"bm":0,"ix":54,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0.295,0.244],[0.788,0.788],[1.736,2.433],[1.682,2.903],[1.606,3.153],[1.485,3.328],[1.372,3.433],[0.947,2.493],[0.363,0.977],[0.614,1.728],[0,0],[0,0],[0,0],[3.965,2.669]],"o":[[0,0],[0,0],[0,0],[-0.204,-0.144],[-0.591,-0.461],[-1.577,-1.576],[-1.766,-2.433],[-1.684,-2.903],[-1.592,-3.161],[-1.494,-3.319],[-1.016,-2.456],[-0.363,-0.978],[-0.661,-1.736],[0,0],[0,0],[0,0],[-1.683,-4.783],[0,0]],"v":[[21.918,39.317],[21.909,39.309],[21.909,39.301],[21.826,39.241],[21.06,38.672],[18.953,36.77],[13.874,30.585],[8.684,22.52],[3.771,13.394],[-0.815,3.638],[-5.113,-6.503],[-8.047,-13.939],[-9.145,-16.872],[-11.056,-22.08],[-11.979,-24.657],[-12.798,-27.007],[-13.125,-27.947],[-21.918,-39.317]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.991999966491,0.681999954523,0.564999988032,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[204.54,179.178],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 55","np":3,"cix":2,"bm":0,"ix":55,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[2.031,-0.561],[-3.358,-12.18],[0,0],[0,0],[-0.667,-2.047],[-1.508,-4.032],[-1.735,-4.002],[-2.015,-3.987],[-2.418,-3.973],[-3.017,-3.987],[-4.244,-3.919],[-0.016,-0.008],[-2.645,-1.842],[-1.515,-0.864],[0,0],[-0.227,-0.115],[0,0],[-0.978,-0.401],[-3.759,-0.403],[-3.275,0.333],[-4.987,1.925],[-4.184,2.365],[-3.699,2.616],[-6.359,5.829],[-2.978,3.085],[-1.463,1.584],[0,0],[0,0],[5.594,6.883],[7.67,-6.231],[0,0],[0,0],[0,0],[1.478,-1.137],[3.025,-2.145],[6.049,-3.449],[2.91,-1.349],[2.555,-0.705],[1.41,0.038],[0.197,0.091],[-0.212,-0.015],[-0.075,0.008],[-0.023,-0.015],[-0.007,-0.007]],"o":[[0,0],[-2.009,0],[-12.181,3.358],[0,0],[0,0],[0.63,2.068],[1.334,4.078],[1.555,4.018],[1.751,3.995],[2.009,3.987],[2.418,3.972],[3.07,3.964],[0.015,0.015],[2.115,1.947],[1.335,0.933],[0,0],[0.182,0.106],[0,0],[0.948,0.485],[3.911,1.547],[3.783,0.401],[6.579,-0.69],[5.01,-1.925],[4.192,-2.349],[7.414,-5.222],[3.154,-2.949],[1.493,-1.539],[0,0],[0,0],[5.685,-6.434],[-6.238,-7.671],[0,0],[0,0],[0,0],[-1.449,1.161],[-2.964,2.274],[-6.004,4.321],[-3.025,1.72],[-2.911,1.326],[-2.553,0.721],[-0.705,-0.008],[-0.197,-0.091],[0.061,-0.008],[0.038,0.008],[0.007,0],[0,0]],"v":[[-61.477,-63.948],[-61.485,-63.948],[-67.564,-63.121],[-83.542,-34.986],[-82.61,-31.59],[-81.701,-28.451],[-79.76,-22.288],[-75.47,-10.146],[-70.558,1.883],[-64.904,13.844],[-58.287,25.775],[-50.221,37.714],[-39.511,49.568],[-39.465,49.606],[-32.386,55.321],[-28.119,58.027],[-27.557,58.354],[-26.875,58.711],[-25.45,59.422],[-22.547,60.695],[-10.867,63.547],[-0.262,63.539],[16.861,59.302],[30.497,52.774],[42.253,45.262],[62.711,28.587],[71.936,19.59],[76.371,14.921],[78.553,12.503],[80.842,9.902],[81.305,-13.215],[56.125,-15.823],[55.313,-15.163],[53.336,-13.549],[51.168,-11.822],[46.771,-8.365],[37.804,-1.687],[19.62,10.092],[10.661,14.693],[2.337,17.831],[-3.885,18.885],[-5.265,18.688],[-5.159,18.536],[-4.985,18.558],[-4.893,18.589],[-4.871,18.596]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.991999966491,0.681999954523,0.564999988032,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[231.32,199.891],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 56","np":3,"cix":2,"bm":0,"ix":56,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":100.000004073084,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"clock Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[88.96,186.779,0],"ix":2,"l":2},"a":{"a":0,"k":[86.199,91.642,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.714,-0.794],[0.794,1.714],[-1.715,0.794],[-0.793,-1.714]],"o":[[-1.714,0.794],[-0.795,-1.714],[1.713,-0.795],[0.795,1.714]],"v":[[1.441,3.108],[-3.108,1.44],[-1.44,-3.107],[3.107,-1.439]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.337000020345,0.349000010771,0.375999989229,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[86.043,96.747],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.366,-2.946],[2.946,-1.365],[1.365,2.946],[-2.946,1.365]],"o":[[1.365,2.946],[-2.947,1.365],[-1.365,-2.946],[2.946,-1.365]],"v":[[5.335,-2.472],[2.472,5.335],[-5.335,2.472],[-2.472,-5.335]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.102000000898,0.325,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[86.043,96.747],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.209,0.452],[-0.452,0.209],[0,0],[0,0],[-0.452,0.209],[-0.209,-0.452]],"o":[[0,0],[-0.451,0.209],[-0.209,-0.452],[0,0],[0,0],[-0.209,-0.452],[0.452,-0.209],[0,0]],"v":[[15.159,5.468],[-13.754,18.865],[-14.95,18.426],[-14.51,17.23],[12.766,4.591],[2.452,-17.668],[2.891,-18.865],[4.087,-18.426]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.102000000898,0.325,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[86.08,97.218],"ix":2},"a":{"a":0,"k":[14,5.5],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":48,"s":[360]},{"t":71.0000028918893,"s":[720]}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.498,-0.029],[0,0],[0,0],[0,0],[-0.029,-0.497]],"o":[[0,0],[0,0],[0,0],[0.496,-0.029],[0.029,0.497]],"v":[[9.821,0.313],[-10.591,1.516],[-10.697,-0.284],[9.716,-1.487],[10.668,-0.639]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325,0.419999994016,0.795999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[101.959,95.606],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.2,-0.545],[0,0],[0.546,0.2],[0,0],[-0.2,0.545],[-0.546,-0.2],[0,0]],"o":[[0,0],[-0.2,0.545],[0,0],[-0.545,-0.2],[0.199,-0.545],[0,0],[0.545,0.2]],"v":[[5.5,2.017],[5.5,2.017],[4.15,2.642],[-4.875,-0.668],[-5.5,-2.017],[-4.151,-2.642],[4.875,0.668]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.102000000898,0.325,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[133.976,114.637],"ix":2},"a":{"a":0,"k":[5.625,2.375],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.2,-0.545],[0,0],[0.545,0.2],[0,0],[-0.2,0.545],[-0.546,-0.2],[0,0]],"o":[[0,0],[-0.2,0.545],[0,0],[-0.545,-0.2],[0.2,-0.546],[0,0],[0.545,0.201]],"v":[[5.5,2.017],[5.5,2.017],[4.151,2.642],[-4.875,-0.668],[-5.5,-2.017],[-4.15,-2.642],[4.875,0.667]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.102000000898,0.325,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[43.734,81.232],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":3,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.545,0.2],[0,0],[-0.201,0.545],[0,0],[-0.545,-0.2],[0,0],[0.2,-0.546],[0,0]],"o":[[0,0],[-0.546,-0.2],[0,0],[0.2,-0.545],[0,0],[0.545,0.2],[0,0],[-0.2,0.545]],"v":[[-2.016,5.5],[-2.016,5.5],[-2.641,4.15],[0.668,-4.875],[2.017,-5.5],[2.018,-5.5],[2.643,-4.151],[-0.667,4.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.102000000898,0.325,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[70.527,139.056],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":3,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.03,5.862],[-3.004,5.138],[1.03,-5.862],[3.004,-5.138]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.102000000898,0.325,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[101.558,54.439],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":3,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.244,-0.527],[0,0],[0.527,-0.244],[0,0],[0.243,0.527],[-0.527,0.244],[0,0]],"o":[[0,0],[0.244,0.527],[0,0],[-0.527,0.245],[-0.245,-0.528],[0,0],[0.527,-0.244]],"v":[[5.316,-2.463],[5.316,-2.463],[4.803,-1.067],[-3.919,2.974],[-5.314,2.463],[-4.803,1.067],[3.919,-2.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.102000000898,0.325,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[126.93,77.801],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":3,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.244,-0.527],[0,0],[0.527,-0.244],[0,0],[0.244,0.527],[-0.527,0.244],[0,0]],"o":[[0,0],[0.244,0.527],[0,0],[-0.527,0.244],[-0.244,-0.527],[0,0],[0.527,-0.244]],"v":[[5.316,-2.463],[5.316,-2.463],[4.803,-1.067],[-3.919,2.975],[-5.316,2.463],[-4.803,1.067],[3.919,-2.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.102000000898,0.325,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[45.155,115.693],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 10","np":3,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.527,-0.244],[0,0],[0.243,0.527],[0,0],[-0.527,0.244],[0,0],[-0.244,-0.527],[0,0]],"o":[[0,0],[-0.527,0.245],[0,0],[-0.245,-0.527],[0,0],[0.527,-0.245],[0,0],[0.244,0.527]],"v":[[2.464,5.315],[2.464,5.315],[1.068,4.803],[-2.975,-3.919],[-2.464,-5.315],[-2.463,-5.315],[-1.067,-4.804],[2.975,3.919]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.102000000898,0.325,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[104.988,137.634],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 11","np":3,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.527,-0.244],[0,0],[0.244,0.527],[0,0],[-0.527,0.244],[-0.244,-0.528],[0,0]],"o":[[0,0],[-0.527,0.245],[0,0],[-0.244,-0.527],[0.527,-0.245],[0,0],[0.244,0.527]],"v":[[2.463,5.315],[2.463,5.315],[1.067,4.803],[-2.975,-3.919],[-2.463,-5.315],[-1.067,-4.803],[2.975,3.919]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.102000000898,0.325,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[67.097,55.859],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 12","np":3,"cix":2,"bm":0,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.062,-2.057],[-0.25,-7.435],[2.793,-7.617],[5.425,-5.979],[7.653,-3.546],[3.072,-0.885],[5.131,-0.173],[0.953,0.014],[6.716,2.463],[1.059,0.452],[5.126,4.649],[2.438,3.314],[1.516,2.939],[0.251,7.433],[-2.795,7.618],[-5.422,5.98],[-7.652,3.545],[-4.06,0.965],[-4.147,0.14],[-6.61,-2.025],[-1.09,-0.399],[-5.46,-4.518],[-0.707,-0.644],[-2.824,-4.248]],"o":[[2.845,6.903],[0.274,8.069],[-2.793,7.619],[-5.612,6.188],[-2.95,1.367],[-4.902,1.415],[-0.955,0.033],[-7.087,-0.08],[-1.088,-0.399],[-6.351,-2.729],[-3.073,-2.787],[-1.938,-2.632],[-2.841,-6.9],[-0.273,-8.07],[2.793,-7.618],[5.616,-6.19],[3.853,-1.785],[4.003,-0.952],[6.917,-0.233],[1.101,0.336],[6.714,2.463],[0.734,0.607],[3.805,3.45],[1.271,1.908]],"v":[[56.612,-26.134],[61.273,-4.547],[57.475,19.094],[45.089,39.587],[25.097,54.257],[16.056,57.638],[0.979,60.026],[-1.883,60.055],[-22.663,56.226],[-25.882,54.947],[-43.156,43.841],[-51.43,34.68],[-56.615,26.319],[-61.275,4.737],[-57.475,-18.904],[-45.092,-39.396],[-25.098,-54.068],[-13.215,-58.195],[-0.98,-59.836],[19.379,-57.139],[22.663,-56.036],[40.991,-45.526],[43.154,-43.651],[53.113,-32.082]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[87.203,99.155],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 13","np":2,"cix":2,"bm":0,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.366,-2.949],[-0.349,-0.849],[-0.25,-7.436],[2.794,-7.616],[5.425,-5.979],[7.653,-3.546],[3.072,-0.886],[5.131,-0.172],[0.953,0.013],[6.716,2.462],[1.058,0.452],[5.126,4.649],[2.439,3.315],[1.515,2.939],[0.387,0.835],[0.282,8.351],[-2.795,7.618],[-5.423,5.98],[-7.652,3.546],[-4.06,0.965],[-4.146,0.14],[-6.609,-2.024],[-1.089,-0.4],[-5.459,-4.518],[-0.707,-0.645],[-2.824,-4.249]],"o":[[0.389,0.837],[2.846,6.903],[0.274,8.069],[-2.792,7.619],[-5.612,6.188],[-2.95,1.368],[-4.902,1.414],[-0.954,0.034],[-7.086,-0.08],[-1.088,-0.4],[-6.352,-2.729],[-3.073,-2.787],[-1.938,-2.632],[-0.42,-0.812],[-3.545,-7.652],[-0.274,-8.069],[2.792,-7.618],[5.616,-6.189],[3.852,-1.785],[4.003,-0.952],[6.917,-0.234],[1.101,0.336],[6.715,2.462],[0.734,0.606],[3.804,3.449],[1.773,2.662]],"v":[[56.665,-26.162],[57.771,-23.631],[62.434,-2.044],[58.634,21.597],[46.249,42.09],[26.257,56.76],[17.215,60.142],[2.139,62.529],[-0.723,62.559],[-21.503,58.73],[-24.721,57.45],[-41.994,46.344],[-50.27,37.183],[-55.454,28.821],[-56.665,26.351],[-62.434,2.235],[-58.635,-21.407],[-46.251,-41.899],[-26.257,-56.571],[-14.374,-60.699],[-2.139,-62.338],[18.219,-59.643],[21.503,-58.538],[39.831,-48.028],[41.994,-46.153],[51.953,-34.584]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.922000002394,0.922000002394,0.984000052658,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[86.042,96.651],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 14","np":2,"cix":2,"bm":0,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-17.513,-37.796],[37.796,-17.514],[17.514,37.796],[-37.797,17.514]],"o":[[17.514,37.796],[-37.796,17.513],[-17.513,-37.796],[37.795,-17.513]],"v":[[68.436,-31.711],[31.711,68.436],[-68.436,31.711],[-31.711,-68.436]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9607843137254902,0.43529411764705883,0.27450980392156865,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[86.199,97.085],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 15","np":2,"cix":2,"bm":0,"ix":15,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.16,-0.074],[0,0],[0,0],[-2.269,1.051],[0,0],[-0.978,-2.109],[0,0]],"o":[[0,0],[0,0],[-1.051,-2.269],[0,0],[2.109,-0.978],[0,0],[0.074,0.159]],"v":[[21.071,-2.375],[-16.072,14.836],[-20.249,5.824],[-18.044,-0.188],[11.458,-13.857],[17.049,-11.809],[21.226,-2.797]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.102000000898,0.325,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[48.417,15.086],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 16","np":2,"cix":2,"bm":0,"ix":16,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[14.855,6.265],[-4.824,15.385],[-14.855,-6.266],[4.824,-15.385]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.996078431372549,0.7137254901960784,0.28627450980392155,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[54.323,28.292],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 17","np":2,"cix":2,"bm":0,"ix":17,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":100.000004073084,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"bg Outlines","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[208.096,256.678,0],"ix":2,"l":2},"a":{"a":0,"k":[265.742,190.84,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":34,"nm":"Puppet","np":6,"mn":"ADBE FreePin3","ix":1,"en":1,"ef":[{"ty":7,"nm":"Puppet Engine","mn":"ADBE FreePin3 Puppet Engine","ix":1,"v":{"a":0,"k":2,"ix":1}},{"ty":0,"nm":"Mesh Rotation Refinement","mn":"ADBE FreePin3 Auto Rotate Pins","ix":2,"v":{"a":0,"k":20,"ix":2}},{"ty":7,"nm":"On Transparent","mn":"ADBE FreePin3 On Transparent","ix":3,"v":{"a":0,"k":0,"ix":3}},{"ty":29.9700012207031,"nm":"arap","np":3,"mn":"ADBE FreePin3 ARAP Group","ix":4,"en":1,"ef":[{"ty":6,"nm":"Auto-traced Shapes","mn":"ADBE FreePin3 Outlines","ix":1,"v":0},{"ty":1,"nm":"Mesh","np":1,"mn":"ADBE FreePin3 Mesh Group","ix":2,"en":1,"ef":[]}]}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-63.878,-12.775],[-43.118,35.931],[-6.587,26.35],[54.767,-29.828],[72.923,73.98],[-91.026,-164.486]],"o":[[89.368,17.873],[17.763,-14.803],[23.954,-95.817],[-89.428,48.707],[-55.094,-55.893],[37.007,66.871]],"v":[[-40.275,172.716],[170.521,134.389],[212.84,70.512],[111.434,-74.811],[-64.231,-134.697],[-203.165,52.147]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.7764705882352941,0.6509803921568628,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[294.44,190.84],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":100.000004073084,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/public/favicon.png b/public/favicon.png new file mode 100644 index 0000000..51e0d8b Binary files /dev/null and b/public/favicon.png differ diff --git a/public/favicon_.png b/public/favicon_.png new file mode 100644 index 0000000..51e0d8b Binary files /dev/null and b/public/favicon_.png differ diff --git a/public/icon-192.png b/public/icon-192.png new file mode 100644 index 0000000..96df113 Binary files /dev/null and b/public/icon-192.png differ diff --git a/public/icon-36.png b/public/icon-36.png new file mode 100644 index 0000000..0188382 Binary files /dev/null and b/public/icon-36.png differ diff --git a/public/icon-512.png b/public/icon-512.png new file mode 100644 index 0000000..63f5d4f Binary files /dev/null and b/public/icon-512.png differ diff --git a/public/icon.png b/public/icon.png new file mode 100644 index 0000000..eef391c Binary files /dev/null and b/public/icon.png differ diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..39c0587 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,146 @@ + + + + + diff --git a/src/api/address.ts b/src/api/address.ts new file mode 100644 index 0000000..7bff11f --- /dev/null +++ b/src/api/address.ts @@ -0,0 +1,36 @@ + +import type { TableEngineOutput, TableInput, TableOutput } from '@/model/table' +import useAxios from '@/utils/useAxios' +import type { Address } from '@/models/address' + +export async function createAddress(data: Address) { + return await useAxios.post('customer/address', data) +} +export async function getOneAddress(id: number) { + return await useAxios.get(`customer/address/${id}`) +} +export async function updateAddress(id: number, data: Address) { + return await useAxios.put(`customer/address/${id}`, data) +} +export async function deleteAddress(id: number) { + return await useAxios.delete(`customer/address/${id}`) +} +export async function tableAddress(tbl: TableInput) { + return await useAxios.post>('customer/address/table', tbl) +} + +export async function getDefaultAddress(): Promise
{ + const data = await useAxios.post>('customer/address/table', { + filters: [{ cr: 'and', field: 'default_address', type: 'boolean', op: 'eq', value: true }] + }) + if (data.rows && data.rows.length > 0) return data.rows[0] + else return null +} + +export async function getProvince() { + return await useAxios.get(`api/city/state`) +} + +export async function getCity(id: number) { + return await useAxios.get(`api/city/${id}`) +} \ No newline at end of file diff --git a/src/api/const.ts b/src/api/const.ts new file mode 100644 index 0000000..1a5f1d9 --- /dev/null +++ b/src/api/const.ts @@ -0,0 +1,6 @@ +import useAxios from "@/utils/useAxios"; +import type {Const} from "@/models/const"; + +export async function getConstByKey(key:string){ + return await useAxios.get(`/api/const/key/${key}`) +} diff --git a/src/api/earnMoney.ts b/src/api/earnMoney.ts new file mode 100644 index 0000000..2956dcd --- /dev/null +++ b/src/api/earnMoney.ts @@ -0,0 +1,4 @@ +import useAxios from '@/utils/useAxios' +import type { EarnMoney } from '@/models/earnMoney' + +export const getEarnMoney = async () => await useAxios.get(`/customer/i_have_referrals`) \ No newline at end of file diff --git a/src/api/fund.ts b/src/api/fund.ts new file mode 100644 index 0000000..ffdb8c0 --- /dev/null +++ b/src/api/fund.ts @@ -0,0 +1,30 @@ +import type {TableInput, TableOutput} from "@/models/table"; +import type {Fund, FundTransaction} from "@/models/fund"; +import useAxios from "@/utils/useAxios"; +import type {Transaction} from "@/models/transaction"; + +export const getFundTable = async (tbl?: TableInput): Promise> => { + return await useAxios.post>(`/customer/fund/table`, tbl) +} + +export const getFundTransactionTable = async (tbl?: TableInput): Promise> => { + return await useAxios.post>(`/customer/fund/transaction/table`, tbl) +} + +export const getFundById = async (id: number) => await useAxios.get(`/customer/fund/${id}`) + +export const createFund = async (obj: Fund): Promise => { + return await useAxios.post(`/customer/fund`, obj) +} + +export const editFund = async (id: number, obj: Fund): Promise => { + return await useAxios.put(`/customer/fund/${id}`, obj) +} +export const fundDeposit = async (obj: FundTransaction): Promise => { + return await useAxios.post(`/customer/fund/deposit`, obj) +} +export const fundWithdraw = async (obj: FundTransaction): Promise => { + return await useAxios.post(`/customer/fund/withdraw`, obj) +} + +export const deleteFund = async (id?: number) => await useAxios.delete(`/customer/fund/${id}`) diff --git a/src/api/home.ts b/src/api/home.ts new file mode 100644 index 0000000..97e784d --- /dev/null +++ b/src/api/home.ts @@ -0,0 +1,10 @@ +import useAxios from "@/utils/useAxios"; +import type {Price} from "@/models/home"; + +export const getChart = async () => await useAxios.get>>(`/api/candle`) + +export const getPrice = async () => await useAxios.get(`/api/price/up`) + +export const getLastPrice = async () => await useAxios.get(`/api/price/last`) + +export const getAllPrices = async () => await useAxios.post('/customer/prices/all') \ No newline at end of file diff --git a/src/api/login.ts b/src/api/login.ts new file mode 100644 index 0000000..65c39f8 --- /dev/null +++ b/src/api/login.ts @@ -0,0 +1,9 @@ +import useAxios from "@/utils/useAxios"; +import type {Login, User} from "@/models/login"; + + +//customer +export const registerCustomer = async (obj: User) => await useAxios.post(`/auth/register`, obj) +export const loginCustomer = async (obj: Login) => await useAxios.post(`/auth/login`, obj) +// export const loginCustomerWithSMS = async (obj: User) => await useAxios.post(`/auth/login`, obj) +export const verifyToken = async (obj: Login) => await useAxios.post(`/auth/verify`, obj) \ No newline at end of file diff --git a/src/api/me.ts b/src/api/me.ts new file mode 100644 index 0000000..0f427c1 --- /dev/null +++ b/src/api/me.ts @@ -0,0 +1,8 @@ +import useAxios from "@/utils/useAxios"; +import type {Password, User} from "@/models/login"; +// import {Login} from "@/models/login"; + +export const getMe = async () => await useAxios.get(`/customer/me`) + +export const updateMe = async (obj: User) => await useAxios.post(`/customer/me/update`, obj) +export const updatePass = async (obj: User) => await useAxios.post(`/customer/me/update`, obj) diff --git a/src/api/order.ts b/src/api/order.ts new file mode 100644 index 0000000..4117e51 --- /dev/null +++ b/src/api/order.ts @@ -0,0 +1,16 @@ +import useAxios from "@/utils/useAxios"; +import type {Order} from "@/models/order"; +import type {TableInput, TableOutput} from "@/models/table"; +import type {Ref, UnwrapRef} from "vue"; +import type {Transaction} from "@/models/transaction"; +import {useUserStore} from "@/store/userStore"; + +const userStore = useUserStore() + +export const createOrder = async (obj: Order): Promise => { + return await useAxios.post(`/customer${!userStore.isSingle ? '' : '/single'}/order`, obj) +} + +export const getOrders = async (tbl: Ref>): Promise> => { + return await useAxios.post>(`/customer${!userStore.isSingle ? '' : '/single'}/order/table`, tbl) +} diff --git a/src/api/physicalreceive.ts b/src/api/physicalreceive.ts new file mode 100644 index 0000000..add815a --- /dev/null +++ b/src/api/physicalreceive.ts @@ -0,0 +1,4 @@ +import useAxios from '@/utils/useAxios' +import type {Physicalreceive} from "@/models/physicalreceive"; +export const physicalReceiveApi = async (obj:Object) => await useAxios.post(`/customer/wallet/withdraw_physical`, obj) +export const getPhysicalReceiveList = async (obj?:Object) => await useAxios.post(`/customer/wallet/withdraw_physical/table`, obj) \ No newline at end of file diff --git a/src/api/products.ts b/src/api/products.ts new file mode 100644 index 0000000..f9f376d --- /dev/null +++ b/src/api/products.ts @@ -0,0 +1,14 @@ +import useAxios from "@/utils/useAxios"; +import type {PInventory, Product} from "@/models/products"; +import type { PWallet, Wallet } from '@/models/wallet' + + +export const getProducts = async (): Promise => { + return await useAxios.get(`/customer/product/list`) +} +export const getProductInventory = async (): Promise => { + return await useAxios.post(`/customer/wallet/product/table`) +} +export const getOneProductWallet = async (id: number): Promise => { + return await useAxios.get(`/customer/wallet/product/${id}`) +} \ No newline at end of file diff --git a/src/api/transaction.ts b/src/api/transaction.ts new file mode 100644 index 0000000..a5ba643 --- /dev/null +++ b/src/api/transaction.ts @@ -0,0 +1,19 @@ +import type {TableInput, TableOutput} from "@/models/table"; +import useAxios from "@/utils/useAxios"; +import type {Transaction} from "@/models/transaction"; +import type {Card} from "@/models/wallet"; + +export const getTransactionTable = async (tbl: TableInput): Promise> => { + return await useAxios.post>(`/customer/transaction/table`, tbl) +} + +export const getTransactionTable2 = async (tbl: TableInput): Promise> => { + return await useAxios.post>(`/customer/withdraw/table`, tbl) +} + +export const getCardsTable = async (tbl?: TableInput): Promise> => { + return await useAxios.post>(`/customer/account/table`, tbl) +} +// export const getProducts = async (tbl: TableInput): Promise> => { +// return await axios.post>('/site/product', tbl) +// } diff --git a/src/api/triggerPrice.ts b/src/api/triggerPrice.ts new file mode 100644 index 0000000..685eb6a --- /dev/null +++ b/src/api/triggerPrice.ts @@ -0,0 +1,17 @@ +import type { Login, User } from '@/models/login' +import useAxios from '@/utils/useAxios' +import type { PriceTrigger } from '@/models/PriceTrigger' +import type { Ref, UnwrapRef } from 'vue' +import type { TableInput, TableOutput } from '@/models/table' +import type { Transaction } from '@/models/transaction' +import type { Order } from '@/models/order' +import type { Card } from '@/models/wallet' + +export const createPriceTrigger = async (obj: PriceTrigger) => await useAxios.post(`/customer/price_triggers`, obj) +export const updatePriceTrigger = async (id?: number, obj?: PriceTrigger | { + is_active: boolean +}) => await useAxios.put(`/customer/price_triggers/${id}`, obj) + +export const getPriceTriggers = async () => await useAxios.get(`/customer/price_triggers`) + +export const deletePriceTrigger = async (id?: number) => await useAxios.delete(`/customer/price_triggers/${id}`) diff --git a/src/api/wallet.ts b/src/api/wallet.ts new file mode 100644 index 0000000..ab1bbef --- /dev/null +++ b/src/api/wallet.ts @@ -0,0 +1,23 @@ +import useAxios from '@/utils/useAxios' +import type { Card, Wallet } from '@/models/wallet' +import type {Transaction} from '@/models/transaction' + +export const getWallet = async () => await useAxios.get(`/customer/wallet/me`) + +export const withdraw = async (obj: Transaction): Promise => { + return await useAxios.post(`/customer/wallet/withdraw`, obj) +} + +export const deposit = async (obj: Transaction): Promise => { + return await useAxios.post(`/customer/charge_account`, obj) +} + +export const createCard = async (obj: Card): Promise => { + return await useAxios.post(`/customer/account`, obj) +} + +export const getActivatedCards = async () => await useAxios.get(`/customer/account/active`) + +export const confirmCode = async (params: WithdrawConfirm): Promise => { + return await useAxios.post(`/customer/wallet/withdraw/otp` , params) +} diff --git a/src/assets/css/fonts.less b/src/assets/css/fonts.less new file mode 100644 index 0000000..2615ae1 --- /dev/null +++ b/src/assets/css/fonts.less @@ -0,0 +1,44 @@ +@import (less) './var.less'; + +@font-face { + font-family: @prefixCls-font-family; + src: url("../fonts/iranSans/woff2/IRANSansWeb(FaNum).woff2") format("woff2"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: @prefixCls-font-family; + src: url("../fonts/iranSans/woff2/IRANSansWeb(FaNum)_Light.woff2") format("woff2"); + font-weight: 100; + font-style: normal; +} + +@font-face { + font-family: @prefixCls-font-family; + src: url("../fonts/iranSans/woff2/IRANSansWeb(FaNum)_UltraLight.woff2") format("woff2"); + font-weight: 300; + font-style: normal; +} + +@font-face { + font-family: @prefixCls-font-family; + src: url("../fonts/iranSans/woff2/IRANSansWeb(FaNum)_Medium.woff2") format("woff2"); + font-weight: 500; + font-style: normal; +} + +@font-face { + font-family: @prefixCls-font-family; + src: url("../fonts/iranSans/woff2/IRANSansWeb(FaNum)_Bold.woff2") format("woff"); + font-weight: 700; + font-style: normal; +} + +@font-face { + font-family: @prefixCls-font-family; + src: url("../fonts/iranSans/woff2/IRANSansWeb(FaNum)_primary.woff2") format("woff"); + font-weight: 900; + font-style: normal; +} + diff --git a/src/assets/css/main.less b/src/assets/css/main.less new file mode 100644 index 0000000..17e7845 --- /dev/null +++ b/src/assets/css/main.less @@ -0,0 +1,354 @@ +@import (less) './var.less'; +@import (less) './fonts.less'; + +html { + scroll-behavior: smooth; +} + +body { + font-family: @prefixCls-font-family !important; + background-color: @prefixCls-background-color !important; + //color:#555 !important; +} +body { + color-scheme: only light; + @apply flex justify-center relative; + position: relative; +} +@media screen and (min-width: 426px) { + .van-popup--bottom.van-popup--round { + width: 426px; + left: calc(50vw - 213px); + } +} +.wrap-fix { + position: fixed; + right: 0; + left: 0; + @media screen and (min-width: 426px) { + width: 426px; + left: auto; + right: auto; + } +} + +#goftino_w { + right: 20px; + @media screen and (min-width: 768px) { + right: 30vw !important; + } + @media screen and (min-width: 1024px) { + right: 34vw !important; + } + @media screen and (min-width: 1200px) { + right: 36vw !important; + } + @media screen and (min-width: 1400px) { + right: 40vw !important; + } +} + +:root { + color-scheme: only light; +} + +.ant-form-item { + margin-bottom: 10px !important; + + &:last-child { + margin-bottom: 24px !important; + } + + .ant-form-item-label { + text-align: right !important; + } +} + +.fade-enter-active, +.fade-leave-active { + transition: opacity 0.3s ease; +} + +.fade-enter-from, +.fade-leave-to { + opacity: 0; +} + +/*.van-action-sheet{ + z-index: 2001 !important; +} + +.van-overlay{ + z-index: 2000 !important; +}*/ + +.color-transition { + transition: color 0.3s ease; +} + +.background-color-transition { + transition: background-color 0.3s ease; +} + +.slide-left-enter-active, +.slide-left-leave-active, +.slide-right-enter-active, +.slide-right-leave-active { + transition-duration: 0.7s; + transition-property: height, opacity, transform; + transition-timing-function: cubic-bezier(0.75, 0, 0.1, 1); + overflow: hidden; +} + +.slide-left-enter, +.slide-right-leave-active { + opacity: 0; + transform: translate(100%, 0) !important; +} + +.slide-left-leave-active, +.slide-right-enter { + opacity: 0; + transform: translate(-100%, 0) !important; +} + +::-webkit-scrollbar { + width: 0px; + display: none; /* Safari and Chrome */ +} + +.otp-input { + width: 52px; + height: 52px; + padding: 3px; + margin: 0 8px; + font-size: 20px; + text-align: center; + border: 1px solid #d1d5db; + border-radius: 4px; + background-color: white; + //@apply bg-gray-50; + + &:focus-visible { + background-color: #fff; + //display: none; + outline: none; + border: 1px solid #20514b !important; + } +} + +.number-ltr { + @apply flex flex-row-reverse gap-1; + direction: ltr; +} + +.ant-message { + z-index: 1000000; +} + +@keyframes fadein { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +/* Firefox < 16 */ +@-moz-keyframes fadein { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +/* Safari, Chrome and Opera > 12.1 */ +@-webkit-keyframes fadein { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +/* Internet Explorer */ +@-ms-keyframes fadein { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +/* Opera < 12.1 */ +@-o-keyframes fadein { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +.home_appear_fade_in { + -webkit-animation: fadein 0.7s; /* Safari, Chrome and Opera > 12.1 */ + -moz-animation: fadein 0.7s; /* Firefox < 16 */ + -ms-animation: fadein 0.7s; /* Internet Explorer */ + -o-animation: fadein 0.7s; /* Opera < 12.1 */ + animation: fadein 0.7s; +} + +.splash_appear_fade_in { + -webkit-animation: fadein 3s; /* Safari, Chrome and Opera > 12.1 */ + -moz-animation: fadein 3s; /* Firefox < 16 */ + -ms-animation: fadein 3s; /* Internet Explorer */ + -o-animation: fadein 3s; /* Opera < 12.1 */ + animation: fadein 3s; +} + +@keyframes fadeinUp { + from { + transform: translateY(10px); + } + to { + transform: translateY(0); + } +} + +/* Firefox < 16 */ +@-moz-keyframes fadeinUp { + from { + transform: translateY(10px); + } + to { + transform: translateY(0); + } +} + +/* Safari, Chrome and Opera > 12.1 */ +@-webkit-keyframes fadeinUp { + from { + transform: translateY(10px); + } + to { + transform: translateY(0); + } +} + +/* Internet Explorer */ +@-ms-keyframes fadeinUp { + from { + transform: translateY(10px); + } + to { + transform: translateY(0); + } +} + +/* Opera < 12.1 */ +@-o-keyframes fadeinUp { + from { + transform: translateY(10px); + } + to { + transform: translateY(0); + } +} + +.home_appear_fade_in_up { + -webkit-animation: fadeinUp 0.7s; /* Safari, Chrome and Opera > 12.1 */ + -moz-animation: fadeinUp 0.7s; /* Firefox < 16 */ + -ms-animation: fadeinUp 0.7s; /* Internet Explorer */ + -o-animation: fadeinUp 0.7s; /* Opera < 12.1 */ + animation: fadeinUp 0.7s; +} + +@keyframes fadeinDown { + from { + transform: translateY(-10px); + } + to { + transform: translateY(0); + } +} + +/* Firefox < 16 */ +@-moz-keyframes fadeinDown { + from { + transform: translateY(-10px); + } + to { + transform: translateY(0); + } +} + +/* Safari, Chrome and Opera > 12.1 */ +@-webkit-keyframes fadeinDown { + from { + transform: translateY(-10px); + } + to { + transform: translateY(0); + } +} + +/* Internet Explorer */ +@-ms-keyframes fadeinDown { + from { + transform: translateY(-10px); + } + to { + transform: translateY(0); + } +} + +/* Opera < 12.1 */ +@-o-keyframes fadeinDown { + from { + transform: translateY(-10px); + } + to { + transform: translateY(0); + } +} + +.home_appear_fade_in_down { + -webkit-animation: fadeinDown 0.7s; /* Safari, Chrome and Opera > 12.1 */ + -moz-animation: fadeinDown 0.7s; /* Firefox < 16 */ + -ms-animation: fadeinDown 0.7s; /* Internet Explorer */ + -o-animation: fadeinDown 0.7s; /* Opera < 12.1 */ + animation: fadeinDown 0.7s; +} +.ant-select-dropdown, +.ant-picker-dropdown { + z-index: 99999 !important; + position: fixed !important; +} +.ant-radio-group-solid +.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover{ + color: #20514b !important; +} +.ant-input-group-addon{ + background-color: #20514b !important; + color: #e0be7f !important; +} +.ant-slider-track{ + background-color: #20514b !important; + +} +.ant-slider-handle { + background-color: #20514b !important; + +} + +.ant-drawer-body{ + padding: 0px !important; +} +.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover{ + color: white !important; +} \ No newline at end of file diff --git a/src/assets/css/var.less b/src/assets/css/var.less new file mode 100644 index 0000000..5eb1cb2 --- /dev/null +++ b/src/assets/css/var.less @@ -0,0 +1,8 @@ +@prefixCls: 'noname'; + +@primary-color: #20514b; +@secondary-color: #20514b; +@prefixCls-font-family: 'iran-sans'; +@prefixCls-background-color: #fff; + +@border-radius-base: 8px; diff --git a/src/assets/fonts/iranSans/eot/IRANSansWeb(FaNum).eot b/src/assets/fonts/iranSans/eot/IRANSansWeb(FaNum).eot new file mode 100644 index 0000000..389ec4b Binary files /dev/null and b/src/assets/fonts/iranSans/eot/IRANSansWeb(FaNum).eot differ diff --git a/src/assets/fonts/iranSans/eot/IRANSansWeb(FaNum)_Black.eot b/src/assets/fonts/iranSans/eot/IRANSansWeb(FaNum)_Black.eot new file mode 100644 index 0000000..a9c2bef Binary files /dev/null and b/src/assets/fonts/iranSans/eot/IRANSansWeb(FaNum)_Black.eot differ diff --git a/src/assets/fonts/iranSans/eot/IRANSansWeb(FaNum)_Bold.eot b/src/assets/fonts/iranSans/eot/IRANSansWeb(FaNum)_Bold.eot new file mode 100644 index 0000000..7ce9b1b Binary files /dev/null and b/src/assets/fonts/iranSans/eot/IRANSansWeb(FaNum)_Bold.eot differ diff --git a/src/assets/fonts/iranSans/eot/IRANSansWeb(FaNum)_Light.eot b/src/assets/fonts/iranSans/eot/IRANSansWeb(FaNum)_Light.eot new file mode 100644 index 0000000..ee72989 Binary files /dev/null and b/src/assets/fonts/iranSans/eot/IRANSansWeb(FaNum)_Light.eot differ diff --git a/src/assets/fonts/iranSans/eot/IRANSansWeb(FaNum)_Medium.eot b/src/assets/fonts/iranSans/eot/IRANSansWeb(FaNum)_Medium.eot new file mode 100644 index 0000000..3c20c14 Binary files /dev/null and b/src/assets/fonts/iranSans/eot/IRANSansWeb(FaNum)_Medium.eot differ diff --git a/src/assets/fonts/iranSans/eot/IRANSansWeb(FaNum)_UltraLight.eot b/src/assets/fonts/iranSans/eot/IRANSansWeb(FaNum)_UltraLight.eot new file mode 100644 index 0000000..c789bb3 Binary files /dev/null and b/src/assets/fonts/iranSans/eot/IRANSansWeb(FaNum)_UltraLight.eot differ diff --git a/src/assets/fonts/iranSans/ttf/IRANSansWeb(FaNum).ttf b/src/assets/fonts/iranSans/ttf/IRANSansWeb(FaNum).ttf new file mode 100644 index 0000000..3835c1d Binary files /dev/null and b/src/assets/fonts/iranSans/ttf/IRANSansWeb(FaNum).ttf differ diff --git a/src/assets/fonts/iranSans/ttf/IRANSansWeb(FaNum)_Black.ttf b/src/assets/fonts/iranSans/ttf/IRANSansWeb(FaNum)_Black.ttf new file mode 100644 index 0000000..42af658 Binary files /dev/null and b/src/assets/fonts/iranSans/ttf/IRANSansWeb(FaNum)_Black.ttf differ diff --git a/src/assets/fonts/iranSans/ttf/IRANSansWeb(FaNum)_Bold.ttf b/src/assets/fonts/iranSans/ttf/IRANSansWeb(FaNum)_Bold.ttf new file mode 100644 index 0000000..adbf9e4 Binary files /dev/null and b/src/assets/fonts/iranSans/ttf/IRANSansWeb(FaNum)_Bold.ttf differ diff --git a/src/assets/fonts/iranSans/ttf/IRANSansWeb(FaNum)_Light.ttf b/src/assets/fonts/iranSans/ttf/IRANSansWeb(FaNum)_Light.ttf new file mode 100644 index 0000000..fae92bd Binary files /dev/null and b/src/assets/fonts/iranSans/ttf/IRANSansWeb(FaNum)_Light.ttf differ diff --git a/src/assets/fonts/iranSans/ttf/IRANSansWeb(FaNum)_Medium.ttf b/src/assets/fonts/iranSans/ttf/IRANSansWeb(FaNum)_Medium.ttf new file mode 100644 index 0000000..9622928 Binary files /dev/null and b/src/assets/fonts/iranSans/ttf/IRANSansWeb(FaNum)_Medium.ttf differ diff --git a/src/assets/fonts/iranSans/ttf/IRANSansWeb(FaNum)_UltraLight.ttf b/src/assets/fonts/iranSans/ttf/IRANSansWeb(FaNum)_UltraLight.ttf new file mode 100644 index 0000000..59dfb58 Binary files /dev/null and b/src/assets/fonts/iranSans/ttf/IRANSansWeb(FaNum)_UltraLight.ttf differ diff --git a/src/assets/fonts/iranSans/woff/IRANSansWeb(FaNum).woff b/src/assets/fonts/iranSans/woff/IRANSansWeb(FaNum).woff new file mode 100644 index 0000000..1e6eb36 Binary files /dev/null and b/src/assets/fonts/iranSans/woff/IRANSansWeb(FaNum).woff differ diff --git a/src/assets/fonts/iranSans/woff/IRANSansWeb(FaNum)_Black.woff b/src/assets/fonts/iranSans/woff/IRANSansWeb(FaNum)_Black.woff new file mode 100644 index 0000000..019c556 Binary files /dev/null and b/src/assets/fonts/iranSans/woff/IRANSansWeb(FaNum)_Black.woff differ diff --git a/src/assets/fonts/iranSans/woff/IRANSansWeb(FaNum)_Bold.woff b/src/assets/fonts/iranSans/woff/IRANSansWeb(FaNum)_Bold.woff new file mode 100644 index 0000000..7008b60 Binary files /dev/null and b/src/assets/fonts/iranSans/woff/IRANSansWeb(FaNum)_Bold.woff differ diff --git a/src/assets/fonts/iranSans/woff/IRANSansWeb(FaNum)_Light.woff b/src/assets/fonts/iranSans/woff/IRANSansWeb(FaNum)_Light.woff new file mode 100644 index 0000000..ecea926 Binary files /dev/null and b/src/assets/fonts/iranSans/woff/IRANSansWeb(FaNum)_Light.woff differ diff --git a/src/assets/fonts/iranSans/woff/IRANSansWeb(FaNum)_Medium.woff b/src/assets/fonts/iranSans/woff/IRANSansWeb(FaNum)_Medium.woff new file mode 100644 index 0000000..587883a Binary files /dev/null and b/src/assets/fonts/iranSans/woff/IRANSansWeb(FaNum)_Medium.woff differ diff --git a/src/assets/fonts/iranSans/woff/IRANSansWeb(FaNum)_UltraLight.woff b/src/assets/fonts/iranSans/woff/IRANSansWeb(FaNum)_UltraLight.woff new file mode 100644 index 0000000..c815b45 Binary files /dev/null and b/src/assets/fonts/iranSans/woff/IRANSansWeb(FaNum)_UltraLight.woff differ diff --git a/src/assets/fonts/iranSans/woff2/IRANSansWeb(FaNum).woff2 b/src/assets/fonts/iranSans/woff2/IRANSansWeb(FaNum).woff2 new file mode 100644 index 0000000..c3dcbab Binary files /dev/null and b/src/assets/fonts/iranSans/woff2/IRANSansWeb(FaNum).woff2 differ diff --git a/src/assets/fonts/iranSans/woff2/IRANSansWeb(FaNum)_Black.woff2 b/src/assets/fonts/iranSans/woff2/IRANSansWeb(FaNum)_Black.woff2 new file mode 100644 index 0000000..fc008ef Binary files /dev/null and b/src/assets/fonts/iranSans/woff2/IRANSansWeb(FaNum)_Black.woff2 differ diff --git a/src/assets/fonts/iranSans/woff2/IRANSansWeb(FaNum)_Bold.woff2 b/src/assets/fonts/iranSans/woff2/IRANSansWeb(FaNum)_Bold.woff2 new file mode 100644 index 0000000..69f7c66 Binary files /dev/null and b/src/assets/fonts/iranSans/woff2/IRANSansWeb(FaNum)_Bold.woff2 differ diff --git a/src/assets/fonts/iranSans/woff2/IRANSansWeb(FaNum)_Light.woff2 b/src/assets/fonts/iranSans/woff2/IRANSansWeb(FaNum)_Light.woff2 new file mode 100644 index 0000000..40f5b09 Binary files /dev/null and b/src/assets/fonts/iranSans/woff2/IRANSansWeb(FaNum)_Light.woff2 differ diff --git a/src/assets/fonts/iranSans/woff2/IRANSansWeb(FaNum)_Medium.woff2 b/src/assets/fonts/iranSans/woff2/IRANSansWeb(FaNum)_Medium.woff2 new file mode 100644 index 0000000..8273b0a Binary files /dev/null and b/src/assets/fonts/iranSans/woff2/IRANSansWeb(FaNum)_Medium.woff2 differ diff --git a/src/assets/fonts/iranSans/woff2/IRANSansWeb(FaNum)_UltraLight.woff2 b/src/assets/fonts/iranSans/woff2/IRANSansWeb(FaNum)_UltraLight.woff2 new file mode 100644 index 0000000..8b77d17 Binary files /dev/null and b/src/assets/fonts/iranSans/woff2/IRANSansWeb(FaNum)_UltraLight.woff2 differ diff --git a/src/assets/img/anim/anim1.json b/src/assets/img/anim/anim1.json new file mode 100644 index 0000000..3229c91 --- /dev/null +++ b/src/assets/img/anim/anim1.json @@ -0,0 +1 @@ +{"nm":"Pre-comp 1","ddd":0,"h":1200,"w":1200,"meta":{"g":"LottieFiles AE 0.1.21"},"layers":[{"ty":4,"nm":"arrow down Outlines","sr":1,"st":0,"op":1020,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[256,256,0],"ix":1},"s":{"a":0,"k":[46.875,46.875,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[600,528,0],"t":0,"ti":[0,0,0],"to":[0,-15.333,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[600,436,0],"t":13,"ti":[0,-15.333,0],"to":[0,0,0]},{"s":[600,528,0],"t":27}],"ix":2,"x":"var $bm_rt;\n$bm_rt = loopOut('cycle');"},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":4,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[7.831,7.793],[7.792,-7.828],[0,0],[0,0],[11.045,0],[0,-11.046],[0,0],[0,0],[7.829,-7.792],[-7.791,-7.829],[0,0],[-0.005,-0.006],[-7.819,7.833],[-0.005,0.006],[0,0]],"o":[[-7.829,-7.792],[0,0],[0,0],[0,-11.046],[-11.046,0],[0,0],[0,0],[-7.792,-7.828],[-7.83,7.793],[0,0],[0.006,0.007],[7.792,7.809],[0.006,-0.007],[0,0],[7.79,-7.828]],"v":[[118.109,117.328],[89.825,117.394],[20.001,187.557],[20.001,-236],[0.001,-256],[-19.999,-236],[-19.999,187.557],[-89.824,117.393],[-118.107,117.327],[-118.175,145.612],[-14.175,250.116],[-14.157,250.134],[14.158,250.135],[14.176,250.117],[118.176,145.613]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.1608,0.1608,0.3843],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[255.999,256],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":1},{"ty":4,"nm":"Shape Layer 1","sr":1,"st":0,"op":1020,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[141,141,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[622.56,380.04,0],"t":0,"ti":[0,0,0],"to":[0,-15.333,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[622.56,288.04,0],"t":13,"ti":[0,-15.333,0],"to":[0,0,0]},{"s":[622.56,380.04,0],"t":27}],"ix":2,"x":"var $bm_rt;\n$bm_rt = loopOut('cycle');"},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Ellipse 1","ix":1,"cix":2,"np":3,"it":[{"ty":"el","bm":0,"hd":false,"mn":"ADBE Vector Shape - Ellipse","nm":"Ellipse Path 1","d":1,"p":{"a":0,"k":[0,0],"ix":3},"s":{"a":0,"k":[144,144],"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[1,1,1],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[-16,156],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":2}],"v":"5.5.7","fr":30,"op":1020,"ip":0,"assets":[]} \ No newline at end of file diff --git a/src/assets/img/banner/banner1.png b/src/assets/img/banner/banner1.png new file mode 100644 index 0000000..3540f92 Binary files /dev/null and b/src/assets/img/banner/banner1.png differ diff --git a/src/assets/img/banner/banner2.png b/src/assets/img/banner/banner2.png new file mode 100644 index 0000000..5c9d48a Binary files /dev/null and b/src/assets/img/banner/banner2.png differ diff --git a/src/assets/img/cash_circulation.svg b/src/assets/img/cash_circulation.svg new file mode 100644 index 0000000..3720b0b --- /dev/null +++ b/src/assets/img/cash_circulation.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/img/cash_empty.svg b/src/assets/img/cash_empty.svg new file mode 100644 index 0000000..9313953 --- /dev/null +++ b/src/assets/img/cash_empty.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/img/cash_gift.svg b/src/assets/img/cash_gift.svg new file mode 100644 index 0000000..57dfe93 --- /dev/null +++ b/src/assets/img/cash_gift.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/img/cash_home.svg b/src/assets/img/cash_home.svg new file mode 100644 index 0000000..06f35b6 --- /dev/null +++ b/src/assets/img/cash_home.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/img/cash_img.svg b/src/assets/img/cash_img.svg new file mode 100644 index 0000000..29cb5ec --- /dev/null +++ b/src/assets/img/cash_img.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/img/cash_love.svg b/src/assets/img/cash_love.svg new file mode 100644 index 0000000..8510a92 --- /dev/null +++ b/src/assets/img/cash_love.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/img/cash_repairs.svg b/src/assets/img/cash_repairs.svg new file mode 100644 index 0000000..ff58dd5 --- /dev/null +++ b/src/assets/img/cash_repairs.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/img/cash_saving.svg b/src/assets/img/cash_saving.svg new file mode 100644 index 0000000..3a23067 --- /dev/null +++ b/src/assets/img/cash_saving.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/img/coin.png b/src/assets/img/coin.png new file mode 100644 index 0000000..c400e84 Binary files /dev/null and b/src/assets/img/coin.png differ diff --git a/src/assets/img/defaultAbshodeh.svg b/src/assets/img/defaultAbshodeh.svg new file mode 100644 index 0000000..b0af151 --- /dev/null +++ b/src/assets/img/defaultAbshodeh.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/img/dollar_pattern.svg b/src/assets/img/dollar_pattern.svg new file mode 100644 index 0000000..9127ca5 --- /dev/null +++ b/src/assets/img/dollar_pattern.svg @@ -0,0 +1,452 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/img/empty.svg b/src/assets/img/empty.svg new file mode 100644 index 0000000..7cd6f6a --- /dev/null +++ b/src/assets/img/empty.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/img/goyImg.svg b/src/assets/img/goyImg.svg new file mode 100644 index 0000000..ed6663d --- /dev/null +++ b/src/assets/img/goyImg.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/img/gradiant_card_white.svg b/src/assets/img/gradiant_card_white.svg new file mode 100644 index 0000000..1d2825c --- /dev/null +++ b/src/assets/img/gradiant_card_white.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/img/home_ly1.svg b/src/assets/img/home_ly1.svg new file mode 100644 index 0000000..1676175 --- /dev/null +++ b/src/assets/img/home_ly1.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/assets/img/home_ly2.svg b/src/assets/img/home_ly2.svg new file mode 100644 index 0000000..5152a75 --- /dev/null +++ b/src/assets/img/home_ly2.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/img/image.svg b/src/assets/img/image.svg new file mode 100644 index 0000000..2ed9c6f --- /dev/null +++ b/src/assets/img/image.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/img/logo.png b/src/assets/img/logo.png new file mode 100644 index 0000000..7c5cde5 Binary files /dev/null and b/src/assets/img/logo.png differ diff --git a/src/assets/img/logo_full_.png b/src/assets/img/logo_full_.png new file mode 100644 index 0000000..909036c Binary files /dev/null and b/src/assets/img/logo_full_.png differ diff --git a/src/assets/img/mokaabImg.svg b/src/assets/img/mokaabImg.svg new file mode 100644 index 0000000..6103285 --- /dev/null +++ b/src/assets/img/mokaabImg.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/img/parsianImg.svg b/src/assets/img/parsianImg.svg new file mode 100644 index 0000000..8bd8e52 --- /dev/null +++ b/src/assets/img/parsianImg.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/img/registerDelay.svg b/src/assets/img/registerDelay.svg new file mode 100644 index 0000000..a4295ab --- /dev/null +++ b/src/assets/img/registerDelay.svg @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/img/saminLogo.png b/src/assets/img/saminLogo.png new file mode 100644 index 0000000..da853a8 Binary files /dev/null and b/src/assets/img/saminLogo.png differ diff --git a/src/assets/img/sekkeImg.svg b/src/assets/img/sekkeImg.svg new file mode 100644 index 0000000..c1bc7c0 --- /dev/null +++ b/src/assets/img/sekkeImg.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/img/telegram.png b/src/assets/img/telegram.png new file mode 100644 index 0000000..d955219 Binary files /dev/null and b/src/assets/img/telegram.png differ diff --git a/src/assets/img/user_ly1.svg b/src/assets/img/user_ly1.svg new file mode 100644 index 0000000..7fd8b1d --- /dev/null +++ b/src/assets/img/user_ly1.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/img/wallet_ly1.svg b/src/assets/img/wallet_ly1.svg new file mode 100644 index 0000000..74186e9 --- /dev/null +++ b/src/assets/img/wallet_ly1.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/img/wallet_ly2.svg b/src/assets/img/wallet_ly2.svg new file mode 100644 index 0000000..550b8a2 --- /dev/null +++ b/src/assets/img/wallet_ly2.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/assets/lottie/anim1.json b/src/assets/lottie/anim1.json new file mode 100644 index 0000000..aa47411 --- /dev/null +++ b/src/assets/lottie/anim1.json @@ -0,0 +1 @@ +{"nm":"NEW sin movs","ddd":0,"h":642,"w":642,"meta":{"g":"@lottiefiles/toolkit-js 0.26.1"},"layers":[{"ty":3,"nm":"escalador papel","sr":1,"st":0,"op":421,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[60,60,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[321,161.5,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":0,"ix":11}},"ef":[],"ind":1},{"ty":3,"nm":"lupa Outlines 3","sr":1,"st":18,"op":12647,"ip":34,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[47.206,48.054,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.15,"y":0},"i":{"x":0.2,"y":1},"s":[0,0,100],"t":34},{"o":{"x":0.167,"y":0},"i":{"x":0.53,"y":1},"s":[240,240,100],"t":60},{"o":{"x":0.42,"y":0},"i":{"x":0.16,"y":1},"s":[240,240,100],"t":133},{"s":[400,400,100],"t":183}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.222,"y":1},"s":[240.252,377.045,0],"t":34,"ti":[-5.248,0.545,0],"to":[13.917,-18.667,0]},{"o":{"x":0.785,"y":0},"i":{"x":0.453,"y":0.528},"s":[323.752,265.045,0],"t":88,"ti":[-24.248,-17.455,0],"to":[5.248,-0.545,0]},{"o":{"x":0.423,"y":0.345},"i":{"x":0.156,"y":1},"s":[334.252,403.045,0],"t":133,"ti":[-27.5,-2,0],"to":[24.248,17.455,0]},{"s":[499.252,415.045,0],"t":183.03515625}],"ix":2},"r":{"a":1,"k":[{"o":{"x":0.3,"y":0},"i":{"x":0.3,"y":1},"s":[64],"t":34},{"o":{"x":0.7,"y":0},"i":{"x":0.437,"y":0.995},"s":[23],"t":92},{"o":{"x":0.544,"y":0},"i":{"x":0.358,"y":1},"s":[-21],"t":133},{"o":{"x":0.595,"y":0},"i":{"x":0.326,"y":0.985},"s":[16],"t":183},{"s":[0],"t":220}],"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"ind":2},{"ty":4,"nm":"LUPA rotacion 3D","sr":1,"st":0,"op":421,"ip":34,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[48.528,49.656,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[26.162,29.375,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.25,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.438,-0.004],[0.027,3.406],[0.01,3.421],[0.056,3.461],[-3.375,0.031],[-3.421,-0.01],[-3.397,-0.021],[0.014,-3.432],[-0.01,-3.421],[0.024,-3.444],[3.454,-0.013],[3.421,0.011]]}],"t":202},{"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[12.204,8.794],[8.792,12.204],[0.01,3.422],[-8.706,12.137],[-12.137,8.707],[-3.421,-0.01],[-12.204,-8.793],[-8.792,-12.204],[-0.01,-3.421],[8.706,-12.137],[12.137,-8.706],[3.421,0.011]]}],"t":232}],"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.1569,0.1804,0.2588],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[46.174,44.297],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0],"t":202},{"s":[100],"t":205}],"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":3,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.2,"y":1},"s":[{"c":true,"i":[[-2.46,0.083],[-0.259,19.058],[1.377,0.116],[0,-19.883]],"o":[[3.106,-0.105],[0.271,-19.881],[-1.276,-0.107],[0,19.882]],"v":[[0.001,36],[2.204,2.371],[0.001,-36],[-3.43,1.971]]}],"t":35},{"o":{"x":0.8,"y":0},"i":{"x":0.765,"y":0.384},"s":[{"c":true,"i":[[-19.923,0],[0,19.882],[19.923,0],[0,-19.883]],"o":[[19.923,0],[0,-19.883],[-19.923,0],[0,19.882]],"v":[[0.001,36],[36.074,0],[0.001,-36],[-36.074,0]]}],"t":60},{"o":{"x":0.21,"y":0.549},"i":{"x":0.2,"y":1},"s":[{"c":true,"i":[[-2.46,0.083],[-0.259,19.058],[1.377,0.116],[0,-19.883]],"o":[[3.106,-0.105],[0.271,-19.881],[-1.276,-0.107],[0,19.882]],"v":[[0.001,36],[2.204,2.371],[0.001,-36],[-3.43,1.971]]}],"t":84},{"o":{"x":0.167,"y":0},"i":{"x":0.2,"y":1},"s":[{"c":true,"i":[[-19.923,0],[0,19.882],[19.923,0],[0,-19.883]],"o":[[19.923,0],[0,-19.883],[-19.923,0],[0,19.882]],"v":[[0.001,36],[36.074,0],[0.001,-36],[-36.074,0]]}],"t":110},{"o":{"x":0.167,"y":0},"i":{"x":0.765,"y":0.384},"s":[{"c":true,"i":[[-19.923,0],[0,19.882],[19.923,0],[0,-19.883]],"o":[[19.923,0],[0,-19.883],[-19.923,0],[0,19.882]],"v":[[0.001,36],[36.074,0],[0.001,-36],[-36.074,0]]}],"t":126},{"o":{"x":0.21,"y":0.549},"i":{"x":0.2,"y":1},"s":[{"c":true,"i":[[-2.46,0.083],[-0.259,19.058],[1.377,0.116],[0,-19.883]],"o":[[3.106,-0.105],[0.271,-19.881],[-1.276,-0.107],[0,19.882]],"v":[[0.001,36],[2.204,2.371],[0.001,-36],[-3.43,1.971]]}],"t":147},{"s":[{"c":true,"i":[[-19.923,0],[0,19.882],[19.923,0],[0,-19.883]],"o":[[19.923,0],[0,-19.883],[-19.923,0],[0,19.882]],"v":[[0.001,36],[36.074,0],[0.001,-36],[-36.074,0]]}],"t":173}],"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.2,"y":1},"s":[5.6],"t":35},{"o":{"x":0.8,"y":0},"i":{"x":0.833,"y":0.833},"s":[3.6],"t":60},{"o":{"x":0.167,"y":0.167},"i":{"x":0.2,"y":1},"s":[5.6],"t":84},{"o":{"x":0.167,"y":0},"i":{"x":0.2,"y":1},"s":[3.6],"t":110},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":0.833},"s":[3.6],"t":126},{"o":{"x":0.167,"y":0.167},"i":{"x":0.2,"y":1},"s":[5.6],"t":147},{"s":[3.6],"t":173}],"ix":5},"c":{"a":0,"k":[0.1569,0.1804,0.2588],"ix":3}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[1,1,1],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[45.074,45],"ix":2},"r":{"a":0,"k":-42.5,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-1.883,-1.88],[0,0],[1.874,-1.878],[0,0],[1.884,1.881],[0,0],[-1.874,1.877]],"o":[[1.885,-1.879],[0,0],[1.877,1.874],[0,0],[-1.885,1.878],[0,0],[-1.877,-1.875],[0,0]],"v":[[-15.301,-15.277],[-8.483,-15.273],[15.305,8.476],[15.31,15.269],[15.302,15.277],[8.483,15.273],[-15.305,-8.475],[-15.31,-15.268]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.1569,0.1804,0.2588],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[79.622,81.906],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":3,"parent":2},{"ty":4,"nm":"line 1 Outlines","sr":1,"st":0,"op":421,"ip":17,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[36.006,1.8,0],"ix":1},"s":{"a":0,"k":[200,200,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[299.82,224.817,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[1.8,1.8],[70.211,1.8]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":2,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3.6,"ix":5},"c":{"a":0,"k":[0.1569,0.1804,0.2588],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"tm","bm":0,"hd":false,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 1","ix":2,"e":{"a":1,"k":[{"o":{"x":0.15,"y":0},"i":{"x":0.2,"y":1},"s":[0],"t":17},{"s":[100],"t":39}],"ix":2},"o":{"a":0,"k":0,"ix":3},"s":{"a":0,"k":0,"ix":1},"m":1}],"ind":4},{"ty":4,"nm":"line 2 Outlines","sr":1,"st":7,"op":428,"ip":24,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[32.463,1.8,0],"ix":1},"s":{"a":0,"k":[200,200,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[292.734,278.817,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[1.8,1.8],[63.125,1.8]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":2,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3.6,"ix":5},"c":{"a":0,"k":[0.1569,0.1804,0.2588],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"tm","bm":0,"hd":false,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 1","ix":2,"e":{"a":1,"k":[{"o":{"x":0.15,"y":0},"i":{"x":0.2,"y":1},"s":[0],"t":24},{"s":[100],"t":46}],"ix":2},"o":{"a":0,"k":0,"ix":3},"s":{"a":0,"k":0,"ix":1},"m":1}],"ind":5},{"ty":4,"nm":"line 3 Outlines","sr":1,"st":14,"op":435,"ip":31,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[15.327,1.8,0],"ix":1},"s":{"a":0,"k":[200,200,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[258.464,329.218,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[1.8,1.8],[28.855,1.8]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":2,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3.6,"ix":5},"c":{"a":0,"k":[0.1569,0.1804,0.2588],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"tm","bm":0,"hd":false,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 1","ix":2,"e":{"a":1,"k":[{"o":{"x":0.15,"y":0},"i":{"x":0.2,"y":1},"s":[0],"t":31},{"s":[100],"t":53}],"ix":2},"o":{"a":0,"k":0,"ix":3},"s":{"a":0,"k":0,"ix":1},"m":1}],"ind":6},{"ty":4,"nm":"line 4 Outlines","sr":1,"st":21,"op":442,"ip":38,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[15.327,1.8,0],"ix":1},"s":{"a":0,"k":[200,200,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[258.464,379.618,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[1.8,1.8],[28.855,1.8]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":2,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3.6,"ix":5},"c":{"a":0,"k":[0.1569,0.1804,0.2588],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"tm","bm":0,"hd":false,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 1","ix":2,"e":{"a":1,"k":[{"o":{"x":0.15,"y":0},"i":{"x":0.2,"y":1},"s":[0],"t":38},{"s":[100],"t":60}],"ix":2},"o":{"a":0,"k":0,"ix":3},"s":{"a":0,"k":0,"ix":1},"m":1}],"ind":7},{"ty":0,"nm":"Sombra lupa","sr":1,"st":0,"op":421,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":true,"ao":0,"ks":{"a":{"a":0,"k":[321,321,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[321,321,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"masksProperties":[{"nm":"Mask 1","inv":false,"mode":"a","x":{"a":0,"k":0,"ix":4},"o":{"a":0,"k":100,"ix":3},"pt":{"a":0,"k":{"c":true,"i":[[-7.5,3.5],[0,0],[0,0],[0,0],[0,0],[-4,0],[0,-2.5],[-29.5,0],[0,15],[0,5]],"o":[[-13,0],[0,0],[0,0],[0,0],[0,0],[4,0],[0,2.5],[29.5,0],[0,-15],[0,-5]],"v":[[412.5,169.5],[231.5,169.5],[202,190.5],[191,254],[191,428.5],[329,428.5],[333.5,434.5],[365.5,478.5],[399,436.5],[399,193]]},"ix":1}}],"w":642,"h":642,"refId":"comp_0","ind":8},{"ty":4,"nm":"papel bot Outlines","sr":1,"st":0,"op":421,"ip":25,"hd":false,"ddd":0,"bm":0,"hasMask":true,"ao":0,"ks":{"a":{"a":0,"k":[57.389,18.529,0],"ix":1},"s":{"a":0,"k":[200,200,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[-8.861,353.102,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"masksProperties":[{"nm":"Mask 1","inv":false,"mode":"a","x":{"a":0,"k":0,"ix":4},"o":{"a":0,"k":100,"ix":3},"pt":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.35,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[114.817,36.647],[1.381,36.647],[1.32,36.478],[114.756,36.478]]}],"t":25},{"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[114.756,5.022],[1.32,5.022],[1.32,36.478],[114.756,36.478]]}],"t":45}],"ix":1}}],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 2","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.013,-9.145],[0,0],[0,0],[7.994,-2.105],[1.814,0.473],[-0.022,8.366],[0,0],[1.528,0.009],[0,0],[0,0],[0,0],[0,0],[0,0],[0,-1.541],[0,0],[-13.061,-0.011],[0,0],[0,0],[0,0],[-0.609,0.093],[-1.049,0.261],[-0.013,11.099],[0,0],[0,0],[-5.938,0.542],[-0.345,-0.019],[-0.011,-6.47],[0,0],[0,0],[0,1.541],[0,0],[9.485,0.042]],"o":[[0,0],[-9.048,0.552],[0,0],[0,0],[-0.017,8.335],[-1.815,0.473],[-8.019,-2.135],[0,0],[0.011,-1.541],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.527,0],[0,0],[-0.012,13.175],[0,0],[0,0],[0,0],[0.609,0],[1.076,-0.099],[10.716,-2.516],[0,0],[0,0],[0.079,-6.014],[0.344,-0.019],[6.414,0.01],[0,0],[0,0],[1.528,0],[0,0],[0.04,-9.569],[0,0]],"v":[[89.342,-145.931],[88.309,-145.931],[72.188,-128.68],[72.188,-128.419],[72.188,-6.1],[58.594,11.617],[53.059,11.617],[39.481,-6.211],[39.481,-9.933],[36.734,-12.743],[19.195,-12.743],[5.094,-12.743],[-16.645,-12.743],[-39.406,-12.743],[-53.01,-12.743],[-55.777,-9.951],[-55.777,-6.006],[-32.146,17.869],[-32.111,17.869],[-2.276,17.869],[54.109,17.869],[56.268,17.776],[59.46,17.237],[77.777,-6.006],[77.777,-128.586],[77.777,-128.717],[88.365,-140.254],[89.398,-140.254],[101.02,-128.531],[101.02,-115.262],[103.787,-115.262],[106.555,-118.053],[106.555,-128.531],[89.454,-145.931]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.8706,0.902,0.9255],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[58.74,18.119],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":9,"parent":1},{"ty":4,"nm":"Papel front Outlines","sr":1,"st":0,"op":421,"ip":10,"hd":false,"ddd":0,"bm":0,"hasMask":true,"ao":0,"ks":{"a":{"a":0,"k":[74.219,89.605,0],"ix":1},"s":{"a":0,"k":[200,200,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[42.09,219.148,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"masksProperties":[{"nm":"Mask 1","inv":false,"mode":"a","x":{"a":0,"k":0,"ix":4},"o":{"a":0,"k":100,"ix":3},"pt":{"a":1,"k":[{"o":{"x":0.28,"y":0},"i":{"x":0.99,"y":1},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[152.276,7.781],[-1.326,7.781],[-1.326,9.031],[152.276,9.031]]}],"t":10},{"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[152.276,7.781],[-1.326,7.781],[-1.326,175.031],[152.276,175.031]]}],"t":25}],"ix":1}}],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.012,-9.145],[0,0],[0,0],[7.994,-2.106],[0.894,-0.009],[0,0],[0,0],[0,0],[0,0],[-5.953,-0.005],[0,0],[0,0],[0,0],[-0.61,0.093],[-1.049,0.26],[-0.014,11.099],[0,0],[0,0],[-5.937,0.544],[-0.326,-0.016]],"o":[[0,0],[-9.048,0.551],[0,0],[0,0],[-0.017,8.335],[-0.874,0.227],[0,0],[0,0],[0,0],[0,0],[4.154,3.667],[0,0],[0,0],[0,0],[0.608,0],[1.075,-0.099],[10.716,-2.517],[0,0],[0,0],[0.079,-6.015],[0.328,-0.018],[0,0]],"v":[[68.364,-81.9],[67.331,-81.9],[51.208,-64.649],[51.208,-64.388],[51.208,57.931],[37.614,75.648],[34.951,75.996],[34.951,75.999],[34.882,75.999],[34.811,75.999],[-68.667,75.999],[-53.126,81.9],[-53.089,81.9],[-23.254,81.9],[33.132,81.9],[35.29,81.807],[38.48,81.268],[56.799,58.024],[56.799,-64.556],[56.799,-64.686],[67.385,-76.224],[68.667,-76.224]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.8706,0.902,0.9255],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[71.074,92.141],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":5,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-57.614,-15.262],[-57.614,-11.587]]},"ix":2}},{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 2","ix":2,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,3.997],[0,8.289]],"o":[[5.953,0],[0,-32.687],[0,0]],"v":[[-65.219,79.059],[-58.189,68.737],[-58.135,4.655]]},"ix":2}},{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 3","ix":3,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0],[-13.063,0.021],[0,0]],"o":[[0,0],[0.021,-13.171],[0,0],[0,0]],"v":[[-58.135,-24.607],[-58.135,-55.195],[-34.467,-79.059],[65.219,-79.059]]},"ix":2}},{"ty":"mm","bm":0,"hd":false,"mn":"ADBE Vector Filter - Merge","nm":"Merge Paths 1","mm":1},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":2,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3.6,"ix":5},"c":{"a":0,"k":[0.8706,0.902,0.9255],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[74.219,91.151],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.02,-13.17],[0,0],[0,0]],"o":[[-13.063,0.021],[0,0],[0,0],[0,0]],"v":[[-6.133,-52.006],[-29.801,-28.142],[-29.801,52.08],[29.801,-52.08]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9412,0.9412,0.9412],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[45.83,62.33],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 4","ix":4,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0.02,-13.17],[0,0],[-1.527,0],[0,0],[-0.009,13.153],[0,0],[0,0],[-6.363,0.009],[-0.025,0.001]],"o":[[0,0],[0,0],[-13.062,0.02],[0,0],[0,1.54],[0,0],[13.045,-0.041],[0,0],[0,0],[0.081,-6.417],[0.026,0],[0,0]],"v":[[61.639,-76.59],[61.639,-81.84],[-38.048,-81.84],[-61.714,-57.977],[-61.714,79.05],[-58.947,81.84],[26.406,81.84],[50.018,57.977],[50.018,-64.542],[50.018,-64.673],[61.639,-76.581],[61.714,-76.59]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[1,1,1],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[77.799,92.164],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":10,"parent":1},{"ty":4,"nm":"Papel top Outlines","sr":1,"st":0,"op":421,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":true,"ao":0,"ks":{"a":{"a":0,"k":[69.157,27.261,0],"ix":1},"s":{"a":0,"k":[200,200,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[89.026,94.609,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"masksProperties":[{"nm":"Mask 1","inv":false,"mode":"a","x":{"a":0,"k":0,"ix":4},"o":{"a":0,"k":100,"ix":3},"pt":{"a":1,"k":[{"o":{"x":0.4,"y":0},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[133.251,43.755],[8.394,43.755],[8.394,45.207],[133.251,45.207]]}],"t":0},{"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[133.324,9.505],[8.466,9.505],[8.394,45.207],[133.251,45.207]]}],"t":10}],"ix":1}}],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-1.544],[-1.545,0],[-0.018,-0.001],[-0.01,-6.471],[0,0],[0,0],[0,1.541],[0,0],[9.485,0.041],[0,0],[0,0],[0.251,-0.027],[0,0]],"o":[[0,1.544],[97.877,0],[6.414,0.011],[0,0],[0,0],[1.527,0],[0,0],[0.041,-9.569],[0,0],[0,0],[-0.254,0.015],[0,0],[-1.544,0]],"v":[[-58.955,-12.455],[-56.155,-9.658],[41.758,-9.658],[53.379,2.066],[53.379,15.334],[56.147,15.334],[58.914,12.543],[58.914,2.066],[41.814,-15.334],[41.703,-15.334],[40.67,-15.334],[39.918,-15.251],[-56.159,-15.251]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.8706,0.902,0.9255],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[69.205,25.502],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-0.67,0],[0,-9.44],[0,0],[-1.527,0],[0,0],[0,1.632],[0,0],[9.475,0]],"o":[[16,0],[0,0],[0,1.632],[0,0],[1.528,0],[0,0],[0,-10.128],[-0.642,0]],"v":[[-58.571,-15.544],[-40.571,3.353],[-40.571,13.652],[-37.803,16.61],[56.472,15.79],[59.24,12.833],[59.24,1.73],[42.083,-16.61]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.8706,0.902,0.9255],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[68.824,26.86],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":11,"parent":1},{"ty":4,"nm":"circulito Outlines","sr":1,"st":145,"op":566,"ip":232,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[7.194,7.198,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.233,"y":0},"i":{"x":0.434,"y":1},"s":[0,0,100],"t":232},{"o":{"x":0.172,"y":0},"i":{"x":0.196,"y":1},"s":[240,240,100],"t":252},{"s":[200,200,100],"t":284}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[516.83,232.086,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":4,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-1.643,0],[0,1.652],[1.642,0],[0,-1.652]],"o":[[1.642,0],[0,-1.652],[-1.643,0],[0,1.652]],"v":[[0,2.988],[2.976,0],[0,-2.988],[-2.977,0]]},"ix":2}},{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 2","ix":2,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[3.837,0],[0,3.836],[-3.837,0],[0,-3.836]],"o":[[-3.837,0],[0,-3.836],[3.837,0],[0,3.836]],"v":[[0,6.948],[-6.944,0],[0,-6.948],[6.944,0]]},"ix":2}},{"ty":"mm","bm":0,"hd":false,"mn":"ADBE Vector Filter - Merge","nm":"Merge Paths 1","mm":1},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.1569,0.1804,0.2588],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[7.194,7.198],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":12},{"ty":4,"nm":"x 2 Outlines","sr":1,"st":20,"op":441,"ip":252,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[6.515,6.515,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.233,"y":0},"i":{"x":0.434,"y":1},"s":[0,0,100],"t":252},{"o":{"x":0.172,"y":0},"i":{"x":0.196,"y":1},"s":[240,240,100],"t":272},{"s":[200,200,100],"t":304}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[96.613,416.097,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[6.258,3.885],[3.885,6.258],[0.001,2.372],[-3.891,6.264],[-6.264,3.891],[-2.374,-0.001],[-6.258,-3.885],[-3.885,-6.26],[-0.001,-2.374],[3.891,-6.264],[6.264,-3.891],[2.374,0.001]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.1569,0.1804,0.2588],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[6.515,6.515],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":13},{"ty":4,"nm":"bg Outlines","sr":1,"st":0,"op":421,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[119.513,102.602,0],"ix":1},"s":{"a":0,"k":[200,200,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[318.455,325.042,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.44,"y":0},"i":{"x":0.5,"y":1},"s":[0],"t":7},{"s":[100],"t":49}],"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-34.357,-7.157],[-2.441,47.062],[17.957,18.605],[34.584,38.554],[38.389,-25.44],[-24.266,-40.899]],"o":[[79.337,8.029],[3.66,-70.593],[-17.958,-18.605],[-23.057,-25.703],[-30.965,25.202],[24.266,40.898]],"v":[[-7.063,94.323],[115.603,35.774],[39.645,-45.798],[7.22,-76.517],[-84.949,-76.912],[-94.997,22.24]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9333,0.949,0.9569],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[119.513,102.602],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":14}],"v":"5.4.4","fr":60,"op":316,"ip":0,"assets":[{"nm":"","id":"comp_0","layers":[{"ty":3,"nm":"parent sombra","sr":1,"st":18,"op":12647,"ip":34,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[47.206,48.054,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.15,"y":0},"i":{"x":0.2,"y":1},"s":[0,0,100],"t":34},{"o":{"x":0.167,"y":0},"i":{"x":0.53,"y":1},"s":[240,240,100],"t":60},{"o":{"x":0.42,"y":0},"i":{"x":0.16,"y":1},"s":[240,240,100],"t":133},{"s":[400,400,100],"t":183}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":0.222,"y":1},"s":[240.252,377.045,0],"t":34,"ti":[-5.248,0.545,0],"to":[13.917,-18.667,0]},{"o":{"x":0.785,"y":0},"i":{"x":0.453,"y":0.528},"s":[323.752,265.045,0],"t":88,"ti":[-24.248,-17.455,0],"to":[5.248,-0.545,0]},{"o":{"x":0.423,"y":0.345},"i":{"x":0.156,"y":1},"s":[334.252,403.045,0],"t":133,"ti":[-27.5,-2,0],"to":[24.248,17.455,0]},{"s":[499.252,415.045,0],"t":183.03515625}],"ix":2},"r":{"a":1,"k":[{"o":{"x":0.3,"y":0},"i":{"x":0.3,"y":1},"s":[64],"t":34},{"o":{"x":0.7,"y":0},"i":{"x":0.437,"y":0.995},"s":[23],"t":92},{"o":{"x":0.544,"y":0},"i":{"x":0.358,"y":1},"s":[-21],"t":133},{"o":{"x":0.595,"y":0},"i":{"x":0.326,"y":0.985},"s":[16],"t":183},{"s":[0],"t":220}],"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"ind":1},{"ty":4,"nm":"LUPA sombra","sr":1,"st":0,"op":421,"ip":34,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0.33,"y":0},"i":{"x":0.67,"y":1},"s":[59.528,35.656,0],"t":133},{"s":[55.428,43.556,0],"t":183}],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[26.162,29.375,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":1,"cix":2,"np":3,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.2,"y":1},"s":[{"c":true,"i":[[-2.46,0.083],[-0.259,19.058],[1.377,0.116],[0,-19.883]],"o":[[3.106,-0.105],[0.271,-19.881],[-1.276,-0.107],[0,19.882]],"v":[[0.001,36],[2.204,2.371],[0.001,-36],[-3.43,1.971]]}],"t":35},{"o":{"x":0.8,"y":0},"i":{"x":0.765,"y":0.384},"s":[{"c":true,"i":[[-19.923,0],[0,19.882],[19.923,0],[0,-19.883]],"o":[[19.923,0],[0,-19.883],[-19.923,0],[0,19.882]],"v":[[0.001,36],[36.074,0],[0.001,-36],[-36.074,0]]}],"t":60},{"o":{"x":0.21,"y":0.549},"i":{"x":0.2,"y":1},"s":[{"c":true,"i":[[-2.46,0.083],[-0.259,19.058],[1.377,0.116],[0,-19.883]],"o":[[3.106,-0.105],[0.271,-19.881],[-1.276,-0.107],[0,19.882]],"v":[[0.001,36],[2.204,2.371],[0.001,-36],[-3.43,1.971]]}],"t":84},{"o":{"x":0.167,"y":0},"i":{"x":0.2,"y":1},"s":[{"c":true,"i":[[-19.923,0],[0,19.882],[19.923,0],[0,-19.883]],"o":[[19.923,0],[0,-19.883],[-19.923,0],[0,19.882]],"v":[[0.001,36],[36.074,0],[0.001,-36],[-36.074,0]]}],"t":110},{"o":{"x":0.167,"y":0},"i":{"x":0.765,"y":0.384},"s":[{"c":true,"i":[[-19.923,0],[0,19.882],[19.923,0],[0,-19.883]],"o":[[19.923,0],[0,-19.883],[-19.923,0],[0,19.882]],"v":[[0.001,36],[36.074,0],[0.001,-36],[-36.074,0]]}],"t":126},{"o":{"x":0.21,"y":0.549},"i":{"x":0.2,"y":1},"s":[{"c":true,"i":[[-2.46,0.083],[-0.259,19.058],[1.377,0.116],[0,-19.883]],"o":[[3.106,-0.105],[0.271,-19.881],[-1.276,-0.107],[0,19.882]],"v":[[0.001,36],[2.204,2.371],[0.001,-36],[-3.43,1.971]]}],"t":147},{"s":[{"c":true,"i":[[-19.923,0],[0,19.882],[19.923,0],[0,-19.883]],"o":[[19.923,0],[0,-19.883],[-19.923,0],[0,19.882]],"v":[[0.001,36],[36.074,0],[0.001,-36],[-36.074,0]]}],"t":173}],"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.2,"y":1},"s":[5.6],"t":35},{"o":{"x":0.8,"y":0},"i":{"x":0.833,"y":0.833},"s":[3.6],"t":60},{"o":{"x":0.167,"y":0.167},"i":{"x":0.2,"y":1},"s":[5.6],"t":84},{"o":{"x":0.167,"y":0},"i":{"x":0.2,"y":1},"s":[3.6],"t":110},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":0.833},"s":[3.6],"t":126},{"o":{"x":0.167,"y":0.167},"i":{"x":0.2,"y":1},"s":[5.6],"t":147},{"s":[3.6],"t":173}],"ix":5},"c":{"a":0,"k":[0.851,0.851,0.851],"ix":3}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.851,0.851,0.851],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[45.074,45],"ix":2},"r":{"a":0,"k":-42.5,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-1.883,-1.88],[0,0],[1.874,-1.878],[0,0],[1.884,1.881],[0,0],[-1.874,1.877]],"o":[[1.885,-1.879],[0,0],[1.877,1.874],[0,0],[-1.885,1.878],[0,0],[-1.877,-1.875],[0,0]],"v":[[-15.301,-15.277],[-8.483,-15.273],[15.305,8.476],[15.31,15.269],[15.302,15.277],[8.483,15.273],[-15.305,-8.475],[-15.31,-15.268]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.851,0.851,0.851],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[79.622,81.906],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":2,"parent":1}]}]} \ No newline at end of file diff --git a/src/assets/lottie/animInfo.json b/src/assets/lottie/animInfo.json new file mode 100644 index 0000000..4886862 --- /dev/null +++ b/src/assets/lottie/animInfo.json @@ -0,0 +1 @@ +{"v":"5.5.7","meta":{"g":"LottieFiles AE ","a":"","k":"","d":"","tc":""},"fr":48,"ip":0,"op":57,"w":500,"h":500,"nm":"47 - Information","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"47 - Information","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[249.623,242.642,0],"ix":2},"a":{"a":0,"k":[60,60,0],"ix":1},"s":{"a":0,"k":[160,160,100],"ix":6}},"ao":0,"ip":0,"op":168,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Dot Outlines","parent":6,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":28,"s":[107.457,101.224,0],"to":[-2.283,-8.047,0],"ti":[2.283,8.047,0]},{"t":48,"s":[93.759,52.941,0]}],"ix":2},"a":{"a":0,"k":[12.612,13.404,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,16.667]},"t":28,"s":[0,0,100]},{"t":48,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-1.819],[2.3,-2.538],[3.641,0],[2.299,2.541],[0,3.643],[-0.625,1.581],[-1.056,1.2],[-1.534,0.718],[-1.821,0],[-1.533,-0.72],[-1.055,-1.197],[-0.624,-1.582]],"o":[[0,3.643],[-2.3,2.541],[-3.643,0],[-2.3,-2.538],[0,-1.819],[0.623,-1.582],[1.053,-1.197],[1.532,-0.72],[1.82,0],[1.533,0.718],[1.054,1.2],[0.623,1.581]],"v":[[12.363,0.072],[8.912,9.344],[-0.001,13.154],[-8.913,9.344],[-12.363,0.072],[-11.428,-5.032],[-8.913,-9.201],[-5.032,-12.075],[-0.001,-13.154],[5.031,-12.075],[8.912,-9.201],[11.427,-5.032]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[12.612,13.404],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":32,"op":168,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Line","parent":6,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":18,"s":[180]},{"t":48,"s":[0]}],"ix":10},"p":{"a":0,"k":[93.829,113.876,0],"ix":2},"a":{"a":0,"k":[-2,41.5,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,16.667]},"t":18,"s":[0,0,100]},{"t":48,"s":[62.5,62.5,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2,79],[-2,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":38,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":21,"op":168,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Bubble Outlines","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[45]},{"t":20,"s":[0]}],"ix":10,"x":"var $bm_rt;\nvar amp, freq, decay, n, t, v;\ntry {\n amp = $bm_div(effect('Rotation - Overshoot')('ADBE Slider Control-0001'), 2.5), freq = $bm_div(effect('Rotation - Bounce')('ADBE Slider Control-0001'), 20), decay = $bm_div(effect('Rotation - Friction')('ADBE Slider Control-0001'), 20), n = 0, 0 < numKeys && (n = nearestKey(time).index, key(n).time > time && n--), t = 0 === n ? 0 : $bm_sub(time, key(n).time), $bm_rt = 0 < n ? (v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10))), $bm_sum(value, $bm_div($bm_mul($bm_mul($bm_div(v, 100), amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))))) : value;\n} catch (e$$4) {\n $bm_rt = value = value;\n}"},"p":{"a":0,"k":[-23.915,153.358,0],"ix":2},"a":{"a":0,"k":[10.304,176.698,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":10,"s":[0,0,100]},{"t":20,"s":[100,100,100]}],"ix":6,"x":"var $bm_rt;\nvar amp, freq, decay, n, t, v;\ntry {\n amp = $bm_div(effect('Scale - Overshoot')('ADBE Slider Control-0001'), 2.5), freq = $bm_div(effect('Scale - Bounce')('ADBE Slider Control-0001'), 20), decay = $bm_div(effect('Scale - Friction')('ADBE Slider Control-0001'), 20), n = 0, 0 < numKeys && (n = nearestKey(time).index, key(n).time > time && n--), t = 0 === n ? 0 : $bm_sub(time, key(n).time), $bm_rt = 0 < n ? (v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10))), $bm_sum(value, $bm_div($bm_mul($bm_mul($bm_div(v, 100), amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))))) : value;\n} catch (e$$4) {\n $bm_rt = value = value;\n}"}},"ao":0,"ef":[{"ty":5,"nm":"Scale - Overshoot","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":10,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Scale - Bounce","np":3,"mn":"ADBE Slider Control","ix":2,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":25,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Scale - Friction","np":3,"mn":"ADBE Slider Control","ix":3,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":65,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Rotation - Overshoot","np":3,"mn":"ADBE Slider Control","ix":4,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":10,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Rotation - Bounce","np":3,"mn":"ADBE Slider Control","ix":5,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":25,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Rotation - Friction","np":3,"mn":"ADBE Slider Control","ix":6,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":65,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[25.054,0],[0.514,-0.008],[-0.079,-51.004],[-7.046,-13.343],[0.469,-1.364],[0,0],[-2.099,-2.942],[-3.556,0],[-1.181,0.405],[0,0],[-0.575,0],[-0.791,-0.418],[-15.176,-0.023],[0,0],[-0.806,50.898],[18.122,18.12]],"o":[[-0.513,0],[-50.978,0.809],[0.024,15.174],[0.697,1.321],[0,0],[-1.179,3.433],[2.089,2.925],[1.228,0],[0,0],[0.539,-0.185],[0.873,0],[13.344,7.044],[0,0],[50.926,0],[0.406,-25.648],[-17.723,-17.721]],"v":[[0.217,-93.948],[-1.319,-93.936],[-93.625,0.031],[-82.82,43.623],[-82.461,47.847],[-93.25,79.245],[-91.803,89.276],[-82.789,93.948],[-79.159,93.336],[-47.76,82.547],[-46.081,82.268],[-43.537,82.907],[0.057,93.711],[0.203,93.711],[94.023,1.405],[66.552,-66.467]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-0.481,0],[-16.622,-16.62],[0.38,-24.009],[47.685,0],[0,0],[12.487,6.594],[1.843,0],[1.181,-0.406],[0,0],[0.547,0],[-1.182,3.438],[0,0],[1.462,2.77],[0.022,14.208],[-47.715,0.757]],"o":[[23.468,0],[16.962,16.962],[-0.756,47.672],[0,0],[-14.207,-0.022],[-1.667,-0.879],[-1.222,0],[0,0],[-0.568,0.195],[-3.31,0],[0,0],[1.018,-2.963],[-6.593,-12.488],[-0.074,-47.743],[0.482,-0.007]],"v":[[0.217,-87.948],[62.31,-62.225],[88.024,1.31],[0.203,87.711],[0.066,87.711],[-40.735,77.6],[-46.081,76.268],[-49.71,76.872],[-81.11,87.661],[-82.789,87.948],[-87.576,81.196],[-76.786,49.796],[-77.514,40.823],[-87.625,0.021],[-1.225,-87.937]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[94.679,94.198],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.896,0],[1.526,2.138],[-0.86,2.504],[0,0],[1.082,2.05],[0.023,14.691],[-49.346,0.783],[-0.497,0],[-17.157,-17.154],[0.394,-24.828],[49.298,0],[0,0],[12.916,6.818],[1.359,0],[0.854,-0.293],[0,0]],"o":[[-2.588,0],[-1.53,-2.144],[0,0],[0.736,-2.145],[-6.819,-12.915],[-0.077,-49.374],[0.497,-0.008],[24.253,0],[17.542,17.541],[-0.78,49.27],[0,0],[-14.694,-0.023],[-1.221,-0.646],[-0.908,0],[0,0],[-0.866,0.298]],"v":[[-82.861,90.947],[-89.432,87.533],[-90.485,80.221],[-79.695,48.822],[-80.239,42.223],[-90.696,0.027],[-1.344,-90.935],[0.145,-90.947],[64.359,-64.345],[90.951,1.358],[0.131,90.712],[-0.006,90.712],[-42.208,80.255],[-46.153,79.268],[-48.807,79.71],[-80.206,90.499]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[94.751,94.197],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":168,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":3,"nm":"Bubble","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[45]},{"t":20,"s":[0]}],"ix":10,"x":"var $bm_rt;\nvar amp, freq, decay, n, t, v;\ntry {\n amp = $bm_div(effect('Rotation - Overshoot')('ADBE Slider Control-0001'), 2.5), freq = $bm_div(effect('Rotation - Bounce')('ADBE Slider Control-0001'), 20), decay = $bm_div(effect('Rotation - Friction')('ADBE Slider Control-0001'), 20), n = 0, 0 < numKeys && (n = nearestKey(time).index, key(n).time > time && n--), t = 0 === n ? 0 : $bm_sub(time, key(n).time), $bm_rt = 0 < n ? (v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10))), $bm_sum(value, $bm_div($bm_mul($bm_mul($bm_div(v, 100), amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))))) : value;\n} catch (e$$4) {\n $bm_rt = value = value;\n}"},"p":{"a":0,"k":[-23.915,153.358,0],"ix":2},"a":{"a":0,"k":[10.304,176.698,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":10,"s":[0,0,100]},{"t":20,"s":[100,100,100]}],"ix":6,"x":"var $bm_rt;\nvar amp, freq, decay, n, t, v;\ntry {\n amp = $bm_div(effect('Scale - Overshoot')('ADBE Slider Control-0001'), 2.5), freq = $bm_div(effect('Scale - Bounce')('ADBE Slider Control-0001'), 20), decay = $bm_div(effect('Scale - Friction')('ADBE Slider Control-0001'), 20), n = 0, 0 < numKeys && (n = nearestKey(time).index, key(n).time > time && n--), t = 0 === n ? 0 : $bm_sub(time, key(n).time), $bm_rt = 0 < n ? (v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10))), $bm_sum(value, $bm_div($bm_mul($bm_mul($bm_div(v, 100), amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))))) : value;\n} catch (e$$4) {\n $bm_rt = value = value;\n}"}},"ao":0,"ef":[{"ty":5,"nm":"Scale - Overshoot","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":10,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Scale - Bounce","np":3,"mn":"ADBE Slider Control","ix":2,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":25,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Scale - Friction","np":3,"mn":"ADBE Slider Control","ix":3,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":65,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Rotation - Overshoot","np":3,"mn":"ADBE Slider Control","ix":4,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":10,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Rotation - Bounce","np":3,"mn":"ADBE Slider Control","ix":5,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":25,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Rotation - Friction","np":3,"mn":"ADBE Slider Control","ix":6,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":65,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]}],"ip":10,"op":168,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":1,"nm":"Plate_white","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[250,250,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"sw":500,"sh":500,"sc":"#ffffff","ip":0,"op":168,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/src/baseColor.json b/src/baseColor.json new file mode 100644 index 0000000..0266f19 --- /dev/null +++ b/src/baseColor.json @@ -0,0 +1,47 @@ +{ + "primary":"#81d8d0", + "primary-rgba":"#81d8d0", + "secondary": "#135953", + "secondary-rgba": "#135953", + "tertiary": "#feb701", + "tertiary-rgba": "#fec94114", + "gray": { + "50": "#f9fafd", + "70": "#f9f9f9", + "100": "#e8eaee", + "200": "#caced8", + "300": "#D1D5DB", + "400": "#9CA3AF", + "500": "#949db0", + "700": "#374151", + "900": "#656f87" + }, + "green": { + "100": "#ecf5ef", + "900": "#0f7f36" + }, + "green-rgba": "#ecf5ef", + "primary": "#1e2229", + "white": "#ffffff", + "red": { + "100": "#fee2e2", + "500": "#f4474d", + "600": "#dc2626" + }, + "red-rgba": "#fce6e6", + "yellow": { + "100": "#FFF6E1", + "900": "#FEB701" + }, + "blue": { + "100": "#ebf4fd", + "600": "#0891B2", + "900": "#0891B2" + }, + "cyan": { + "50": "#ECFEFF", + "300": "#67E8F9", + "600": "#0891B2", + "800": "#155E75" + } +} diff --git a/src/components/BasicPacks/BaseDatePicker/index.ts b/src/components/BasicPacks/BaseDatePicker/index.ts new file mode 100644 index 0000000..40211b5 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/index.ts @@ -0,0 +1,2 @@ +import BaseDatePicker from './src/BaseDatePicker.vue' +export default BaseDatePicker diff --git a/src/components/BasicPacks/BaseDatePicker/src/BaseDatePicker.vue b/src/components/BasicPacks/BaseDatePicker/src/BaseDatePicker.vue new file mode 100644 index 0000000..ff8db80 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/BaseDatePicker.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/src/components/BasicPacks/BaseDatePicker/src/configDayjs.ts b/src/components/BasicPacks/BaseDatePicker/src/configDayjs.ts new file mode 100644 index 0000000..3bff94c --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/configDayjs.ts @@ -0,0 +1,26 @@ +/* +import dayjs from 'dayjs' +import updateLocale from 'dayjs/plugin/updateLocale' +import jalaliday from 'jalaliday' +dayjs.extend(jalaliday) +dayjs.extend(updateLocale) +dayjs.calendar('jalali') // Jalali Calendar +const months = [ + 'فروردین', + 'اردیبهشت', + 'خرداد', + 'تیر', + 'مرداد', + 'شهریور', + 'مهر', + 'آبان', + 'آذر', + 'دی', + 'بهمن', + 'اسفند', +] +dayjs.updateLocale('fa', { + monthsShort: months, + months, +}) +*/ diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/PickerButton.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/PickerButton.tsx new file mode 100644 index 0000000..ef8404f --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/PickerButton.tsx @@ -0,0 +1,8 @@ +import type { FunctionalComponent } from 'vue'; +import type { ButtonProps } from 'ant-design-vue/es/button'; +import Button from 'ant-design-vue/es/button'; + +const PickerButton: FunctionalComponent = (props: ButtonProps, { attrs, slots }) => { + return ; +}; +export default PickerButton; diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/PickerTag.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/PickerTag.tsx new file mode 100644 index 0000000..eab4746 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/PickerTag.tsx @@ -0,0 +1,6 @@ +import type { TagProps } from 'ant-design-vue/es/tag'; +import Tag from 'ant-design-vue/es/tag'; + +export default function PickerTag(props: TagProps, { slots, attrs }) { + return ; +} diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/DatePicker.test.js b/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/DatePicker.test.js new file mode 100644 index 0000000..0a66f68 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/DatePicker.test.js @@ -0,0 +1,66 @@ +import { mount } from '@vue/test-utils' +import { asyncExpect } from '../../../tests/utils' +import dayjs from 'dayjs' +import MockDate from 'mockdate' +import DatePicker from '../index' +import focusTest from '../../../tests/shared/focusTest' +jest.mock('../../_util/Portal') +describe('DatePicker', () => { + focusTest(DatePicker) + + beforeEach(() => { + document.body.outerHTML = '' + MockDate.set(dayjs('2016-11-22')) + }) + + afterEach(() => { + MockDate.reset() + }) + + it('prop locale should works', async () => { + const locale = { + lang: { + locale: 'mk', + placeholder: 'Избери дата', + rangePlaceholder: ['Начална дата', 'Крайна дата'], + today: 'Днес', + now: 'Сега', + backToToday: 'Към днес', + ok: 'Добре', + clear: 'Изчистване', + month: 'Месец', + year: 'Година', + timeSelect: 'Избор на час', + dateSelect: 'Избор на дата', + monthSelect: 'Избор на месец', + yearSelect: 'Избор на година', + decadeSelect: 'Десетилетие', + previousMonth: 'Предишен месец (PageUp)', + nextMonth: 'Следващ месец (PageDown)', + previousYear: 'Последна година (Control + left)', + nextYear: 'Следваща година (Control + right)', + previousDecade: 'Предишно десетилетие', + nextDecade: 'Следващо десетилетие', + previousCentury: 'Последен век', + nextCentury: 'Следващ век', + yearFormat: 'YYYY', + dateFormat: 'D M YYYY', + dayFormat: 'D', + dateTimeFormat: 'D M YYYY HH:mm:ss', + monthBeforeYear: true + }, + timePickerLocale: { + placeholder: 'Избор на час' + } + } + const birthday = dayjs('2000-01-01', 'YYYY-MM-DD') + const wrapper = mount({ + render() { + return + } + }) + await asyncExpect(() => { + expect(wrapper.html()).toMatchSnapshot() + }) + }) +}) diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/QuarterPicker.test.js b/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/QuarterPicker.test.js new file mode 100644 index 0000000..b77cabb --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/QuarterPicker.test.js @@ -0,0 +1,17 @@ +import { mount } from '@vue/test-utils' +import DatePicker from '../index' +import focusTest from '../../../tests/shared/focusTest' + +const { QuarterPicker } = DatePicker +jest.mock('../../_util/Portal') +describe('QuarterPicker', () => { + focusTest(QuarterPicker) + fit('reset select item when popup close', async () => { + const wrapper = mount(DatePicker, { + props: { style: { width: '400px' }, picker: 'quarter' }, + sync: false, + attachTo: 'body' + }) + expect(wrapper.html()).toMatchSnapshot() + }) +}) diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/RangePicker.test.js b/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/RangePicker.test.js new file mode 100644 index 0000000..3afa4f2 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/RangePicker.test.js @@ -0,0 +1,72 @@ +import { mount } from '@vue/test-utils' +import { asyncExpect, setMockDate, resetMockDate, sleep } from '../../../tests/utils' +import dayjs from 'dayjs' +import DatePicker from '../index' +import { openPicker, selectCell, closePicker } from './utils' +import focusTest from '../../../tests/shared/focusTest' +jest.mock('../../_util/Portal') +const { RangePicker } = DatePicker + +describe('RangePicker', () => { + focusTest(RangePicker) + + beforeEach(() => { + document.body.outerHTML = '' + setMockDate() + }) + + afterEach(() => { + resetMockDate() + }) + // issue: https://github.com/ant-design/ant-design/issues/5872 + xit('should not throw error when value is reset to `[]`', async () => { + const birthday = dayjs('2000-01-01', 'YYYY-MM-DD') + const wrapper = mount( + { + props: ['value'], + setup(props) { + return () => + } + }, + { attachTo: 'body', sync: 'false' } + ) + wrapper.setProps({ value: [birthday, birthday] }) + wrapper.setProps({ value: [] }) + await sleep(0) + expect(() => { + openPicker(wrapper) + selectCell(wrapper, 3) + closePicker(wrapper) + + openPicker(wrapper, 1) + selectCell(wrapper, 5, 1) + closePicker(wrapper, 1) + }).not.toThrow() + }) + + it('show month panel according to value', async () => { + const birthday = dayjs('2000-01-01', 'YYYY-MM-DD').locale('zh-cn') + const wrapper = mount(RangePicker, { + props: { + getPopupContainer: (trigger) => trigger, + format: 'YYYY/MM/DD', + showTime: true, + open: true + }, + sync: false, + attachTo: 'body' + }) + await asyncExpect(() => { + wrapper.setProps({ value: [birthday, birthday] }) + }) + await asyncExpect(() => { + expect(document.body.innerHTML).toMatchSnapshot() + }) + }) + + fit('customize separator', async () => { + const wrapper = mount(RangePicker, { props: { separator: 'test' } }) + await sleep() + expect(wrapper.html()).toMatchSnapshot() + }) +}) diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/WeekPicker.test.js b/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/WeekPicker.test.js new file mode 100644 index 0000000..7701b86 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/WeekPicker.test.js @@ -0,0 +1,27 @@ +import { mount } from '@vue/test-utils' +import { asyncExpect, setMockDate } from '../../../tests/utils' +import DatePicker from '../index' +import focusTest from '../../../tests/shared/focusTest' + +const { WeekPicker } = DatePicker +jest.mock('../../_util/Portal') +describe('WeekPicker', () => { + beforeEach(() => { + setMockDate() + }) + focusTest(WeekPicker) + + it('should support style prop', async () => { + const wrapper = mount( + { + render() { + return + } + }, + { sync: false } + ) + await asyncExpect(() => { + expect(wrapper.html()).toMatchSnapshot() + }) + }) +}) diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/__snapshots__/DatePicker.test.js.snap b/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/__snapshots__/DatePicker.test.js.snap new file mode 100644 index 0000000..6c3b99d --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/__snapshots__/DatePicker.test.js.snap @@ -0,0 +1,180 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`DatePicker prop locale should works 1`] = ` +
+
+
+ + +
+
+`; diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/__snapshots__/QuarterPicker.test.js.snap b/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/__snapshots__/QuarterPicker.test.js.snap new file mode 100644 index 0000000..b4f4686 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/__snapshots__/QuarterPicker.test.js.snap @@ -0,0 +1,47 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`QuarterPicker reset select item when popup close 1`] = ` +
+
+ +
+
+ + +
+
+`; diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/__snapshots__/RangePicker.test.js.snap b/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/__snapshots__/RangePicker.test.js.snap new file mode 100644 index 0000000..e4fc4f5 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/__snapshots__/RangePicker.test.js.snap @@ -0,0 +1,557 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`RangePicker customize separator 1`] = ` +
+
+
test
+
+
+ +
+ + +
+
+`; + +exports[`RangePicker show month panel according to value 1`] = ` +
+
+ + +
+
+
+
+
+
+
+
+`; diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/__snapshots__/WeekPicker.test.js.snap b/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/__snapshots__/WeekPicker.test.js.snap new file mode 100644 index 0000000..3e6a5f9 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/__snapshots__/WeekPicker.test.js.snap @@ -0,0 +1,186 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`WeekPicker should support style prop 1`] = ` +
+
+ +
+
+ + +
+
+`; diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/__snapshots__/demo.test.js.snap b/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/__snapshots__/demo.test.js.snap new file mode 100644 index 0000000..bccf1ab --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/__snapshots__/demo.test.js.snap @@ -0,0 +1,710 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`renders ./components/date-picker/demo/basic.vue correctly 1`] = ` +
+
+
+
+ +
+ +
+
+ +
+
+
+ +
+ +
+
+ +
+
+
+ +
+ +
+
+ +
+
+
+ +
+ +
+
+ +
+
+
+ +
+ +
+
+ +
+`; + +exports[`renders ./components/date-picker/demo/bordered.vue correctly 1`] = ` +
+
+
+
+ +
+ +
+
+ +
+
+
+ +
+ +
+
+ +
+
+
+ +
+ +
+
+ +
+
+
+ +
+ +
+
+ +
+
+
+ +
+ +
+
+ +
+
+
+
+
+
+ + +
+
+ +
+
+
+
+
+
+ + +
+
+ +
+
+
+
+
+
+ + +
+
+ +
+
+
+
+
+
+ + +
+
+ +
+`; + +exports[`renders ./components/date-picker/demo/date-render.vue correctly 1`] = ` +
+
+
+
+ +
+ +
+
+ +
+
+
+
+
+
+ + +
+
+ +
+`; + +exports[`renders ./components/date-picker/demo/disabled.vue correctly 1`] = ` +
+
+
+
+ +
+
+ +
+
+
+ +
+ +
+
+ +
+
+
+
+
+
+ + +
+
+ +
+
+
+
+
+
+ +
+
+ +
+`; + +exports[`renders ./components/date-picker/demo/disabled-date.vue correctly 1`] = ` +
+
+
+
+ +
+ +
+
+ +
+
+
+ +
+ +
+
+ +
+
+
+
+
+
+ + +
+
+ +
+
+
+
+
+
+ + +
+
+ +
+`; + +exports[`renders ./components/date-picker/demo/extra-footer.vue correctly 1`] = ` +
+
+
+
+ +
+ +
+
+ +
+
+
+ +
+ +
+
+ +
+
+
+
+
+
+ + +
+
+ +
+
+
+
+
+
+ + +
+
+ +
+
+
+ +
+ +
+
+ +
+`; + +exports[`renders ./components/date-picker/demo/format.vue correctly 1`] = ` +
+
+
+
+ +
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+ +
+
+
+
+
+
+ +
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+ +
+`; + +exports[`renders ./components/date-picker/demo/mode.vue correctly 1`] = ` +
+
+
+
+ +
+ +
+
+ +
+
+
+
+
+
+ + +
+
+ +
+`; + +exports[`renders ./components/date-picker/demo/presetted-ranges.vue correctly 1`] = ` +
+
+
+
+
+
+
+ + +
+
+ +
+
+
+
+
+
+ + +
+
+ +
+`; + +exports[`renders ./components/date-picker/demo/range-picker.vue correctly 1`] = ` +
+
+
+
+
+
+
+ + +
+
+ +
+
+
+
+
+
+ + +
+
+ +
+
+
+
+
+
+ + +
+
+ +
+
+
+
+
+
+ + +
+
+ +
+
+
+
+
+
+ + +
+
+ +
+`; + +exports[`renders ./components/date-picker/demo/select-in-range.vue correctly 1`] = ` +
+
+
+
+
+ + +
+`; + +exports[`renders ./components/date-picker/demo/size.vue correctly 1`] = ` +
+
+
+
+ +
+
+
+ +
+ +
+
+ +
+
+
+ +
+ +
+
+ +
+
+
+
+
+
+ + +
+
+ +
+
+
+ +
+ +
+
+ +
+`; + +exports[`renders ./components/date-picker/demo/start-end.vue correctly 1`] = ` +
+
+
+
+ +
+ +
+
+ +
+
+
+ +
+ +
+
+ +
+`; + +exports[`renders ./components/date-picker/demo/suffix.vue correctly 1`] = ` +
+
+
+
+ +
+ +
+
+ +
+
+
+ +
+ +
+
+ +
+
+
+
+
+
+ + +
+
+ +
+
+
+ +
+ +
+
+ +
+
+
ab + +
+ +
+
+ +
+
+
ab + +
+ +
+
+ +
+
+
+
+
+
ab + + +
+
+ +
+
+
ab + +
+ +
+
+ +
+`; + +exports[`renders ./components/date-picker/demo/switchable.vue correctly 1`] = ` +
+
+
+ + +
Time + +
+ +
+
+ +
+
+
+ +
+ +
+
+ +
+`; + +exports[`renders ./components/date-picker/demo/text.vue correctly 1`] = ` +
+
+
+
+ +
+ +
+
+ +
+
+
+
+
+
+ + +
+
+ +
+`; + +exports[`renders ./components/date-picker/demo/time.vue correctly 1`] = ` +
+
+
+
+ +
+ +
+
+ +
+
+
+
+
+
+ + +
+
+ +
+`; diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/__snapshots__/other.test.js.snap b/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/__snapshots__/other.test.js.snap new file mode 100644 index 0000000..2c5b62e --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/__snapshots__/other.test.js.snap @@ -0,0 +1,1077 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`MonthPicker and WeekPicker render MonthPicker 1`] = `""`; + +exports[`MonthPicker and WeekPicker render WeekPicker 1`] = `""`; + +exports[`Picker format by locale date 1`] = ` +
+
+
+ + +
+
+`; + +exports[`Picker format by locale dateTime 1`] = ` +
+
+
+ + +
+
+`; + +exports[`Picker format by locale month 1`] = ` +
+
+
+ + +
+
+`; + +exports[`Picker format by locale week 1`] = ` +
+
+
+ + +
+
+`; diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/demo.test.js b/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/demo.test.js new file mode 100644 index 0000000..a4e7a91 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/demo.test.js @@ -0,0 +1,3 @@ +import demoTest from '../../../tests/shared/demoTest'; + +demoTest('date-picker'); diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/mount.test.js b/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/mount.test.js new file mode 100644 index 0000000..6ed966b --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/mount.test.js @@ -0,0 +1,11 @@ +import DatePicker from '../index' +import mountTest from '../../../tests/shared/mountTest' + +const { MonthPicker, WeekPicker, RangePicker } = DatePicker + +describe('mount', () => { + mountTest(DatePicker) + mountTest(MonthPicker) + mountTest(WeekPicker) + mountTest(RangePicker) +}) diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/other.test.js b/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/other.test.js new file mode 100644 index 0000000..2e6260f --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/other.test.js @@ -0,0 +1,73 @@ +import { mount } from '@vue/test-utils' +import { asyncExpect, sleep } from '../../../tests/utils' +import dayjs from 'dayjs' +import DatePicker from '../index' +import LocaleProvider from '../../locale-provider' +import locale from '../../locale-provider/zh_CN' +jest.mock('../../_util/Portal') +const { MonthPicker, WeekPicker } = DatePicker + +describe('Picker format by locale', () => { + const myLocale = { + ...locale, + DatePicker: { + ...locale.DatePicker, + dateFormat: 'YYYY 年 M 月 D 日', + dateTimeFormat: 'YYYY 年 M 月 D 日 H 时 m 分 s 秒', + weekFormat: 'YYYY 年 W 周', + monthFormat: 'YYYY 年 M 月' + } + } + + const date = dayjs('2000-01-01', 'YYYY-MM-DD') + function matchPicker(name, Picker, props) { + it(name, async () => { + const wrapper = mount( + { + render() { + return ( + + + + ) + } + }, + { sync: false } + ) + await asyncExpect(() => { + expect(wrapper.html()).toMatchSnapshot() + }) + }) + } + + matchPicker('date', DatePicker) + matchPicker('dateTime', DatePicker, { showTime: true }) + matchPicker('week', WeekPicker) + matchPicker('month', MonthPicker) +}) + +describe('MonthPicker and WeekPicker', () => { + beforeEach(() => { + document.body.innerHTML = '' + }) + it('render MonthPicker', async () => { + const birthday = dayjs('2000-01-01', 'YYYY-MM-DD').locale('zh-cn') + const wrapper = mount(MonthPicker, { props: { open: true }, sync: false }) + await asyncExpect(() => { + wrapper.setProps({ value: birthday }) + }) + + await asyncExpect(() => { + expect(document.body.innerHTML).toMatchSnapshot() + }) + }) + + it('render WeekPicker', async () => { + const birthday = dayjs('2000-01-01', 'YYYY-MM-DD').locale('zh-cn') + const wrapper = mount(WeekPicker, { props: { open: false }, sync: false }) + await sleep(10) + wrapper.setProps({ value: birthday, open: true }) + await sleep(1000) + expect(document.body.innerHTML).toMatchSnapshot() + }) +}) diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/utils.js b/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/utils.js new file mode 100644 index 0000000..55c1665 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/__tests__/utils.js @@ -0,0 +1,60 @@ +export function $$(className) { + return document.body.querySelectorAll(className); +} +export function hasSelected(wrapper, date) { + return document.body + .querySelector(`[title="${date.format('LL')}"][role="gridcell"]`) + .getAttribute('class') + .split(' ') + .includes('ant-calendar-selected-day'); +} + +export function openPanel(wrapper) { + wrapper.find('.ant-calendar-picker-input').trigger('click'); +} + +export function clearInput(wrapper) { + wrapper.find('.ant-calendar-picker-clear').trigger('click'); +} + +export function nextYear() { + $$('.ant-calendar-next-year-btn')[0].click(); +} + +export function nextMonth() { + $$('.ant-calendar-next-month-btn')[0].click(); +} + +export function selectDateFromBody(date, index) { + let calendar = document.body; + if (index !== undefined) { + calendar = document.body.querySelectorAll('.ant-calendar-range-part')[index]; + } + calendar.querySelector(`[title="${date.format('LL')}"][role="gridcell"]`).click(); +} + +export function openPicker(wrapper, index = 0) { + wrapper.findAll('input')[index].trigger('mousedown'); + wrapper.findAll('input')[index].trigger('focus'); +} +export function closePicker(wrapper, index = 0) { + wrapper.findAll('input')[index].trigger('blur'); +} + +export function selectCell(wrapper, text, index = 0) { + let matchCell; + $$('table') + [index].querySelectorAll('td') + .forEach(td => { + if (td.textContent === String(text) && td.className.includes('-in-view')) { + matchCell = td; + td.click('click'); + } + }); + + if (!matchCell) { + throw new Error('Cell not match in picker panel.'); + } + + return matchCell; +} diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/date-fns.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/date-fns.tsx new file mode 100644 index 0000000..5ab86df --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/date-fns.tsx @@ -0,0 +1,37 @@ +import type { App } from 'vue' +import dataFnsGenerateConfig from '@core/components/BaseDatePicker/src/vc-picker/generate/dateFns' +import type { + PickerProps, + PickerDateProps, + RangePickerProps as BaseRangePickerProps +} from './generatePicker' +import generatePicker from './generatePicker' +import type { ExtraDatePickerProps, ExtraRangePickerProps } from './generatePicker/props' + +export type DatePickerProps = PickerProps & ExtraDatePickerProps +export type MonthPickerProps = Omit, 'picker'> & ExtraDatePickerProps +export type WeekPickerProps = Omit, 'picker'> & ExtraDatePickerProps +export type RangePickerProps = BaseRangePickerProps & ExtraRangePickerProps + +const { DatePicker, WeekPicker, MonthPicker, YearPicker, TimePicker, QuarterPicker, RangePicker } = + generatePicker(dataFnsGenerateConfig) + +/* istanbul ignore next */ +export { RangePicker, WeekPicker, MonthPicker, QuarterPicker } + +export default Object.assign(DatePicker, { + WeekPicker, + MonthPicker, + YearPicker, + RangePicker, + TimePicker, + QuarterPicker, + install: (app: App) => { + app.component(DatePicker.name, DatePicker) + app.component(RangePicker.name, RangePicker) + app.component(MonthPicker.name, MonthPicker) + app.component(WeekPicker.name, WeekPicker) + app.component(QuarterPicker.name, QuarterPicker) + return app + } +}) diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/dayjs.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/dayjs.tsx new file mode 100644 index 0000000..c9d4dbd --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/dayjs.tsx @@ -0,0 +1,38 @@ +import type { Dayjs } from 'dayjs' +import type { App } from 'vue' +import dayjsGenerateConfig from '@/components/BasicPacks/BaseDatePicker/src/vc-picker/generate/dayjs' +import type { + PickerProps, + PickerDateProps, + RangePickerProps as BaseRangePickerProps +} from './generatePicker' +import generatePicker from './generatePicker' +import type { ExtraDatePickerProps, ExtraRangePickerProps } from './generatePicker/props' + +export type DatePickerProps = PickerProps & ExtraDatePickerProps +export type MonthPickerProps = Omit, 'picker'> & ExtraDatePickerProps +export type WeekPickerProps = Omit, 'picker'> & ExtraDatePickerProps +export type RangePickerProps = BaseRangePickerProps & ExtraRangePickerProps + +const { DatePicker, WeekPicker, MonthPicker, YearPicker, TimePicker, QuarterPicker, RangePicker } = + generatePicker(dayjsGenerateConfig) + +/* istanbul ignore next */ +export { RangePicker, WeekPicker, MonthPicker, QuarterPicker } + +export default Object.assign(DatePicker, { + WeekPicker, + MonthPicker, + YearPicker, + RangePicker, + TimePicker, + QuarterPicker, + install: (app: App) => { + app.component(DatePicker.name, DatePicker) + app.component(RangePicker.name, RangePicker) + app.component(MonthPicker.name, MonthPicker) + app.component(WeekPicker.name, WeekPicker) + app.component(QuarterPicker.name, QuarterPicker) + return app + } +}) diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/basic.vue b/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/basic.vue new file mode 100644 index 0000000..f51e4b7 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/basic.vue @@ -0,0 +1,42 @@ + +--- +order: 0 +title: + zh-CN: 基本用法 + en-US: Basic Usage +--- + +## zh-CN + +最简单的用法,在浮层中可以选择或者输入日期。 + +## en-US + +Basic use case. Users can select or input a date in panel. + + + + + diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/bordered.vue b/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/bordered.vue new file mode 100644 index 0000000..65a6e1b --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/bordered.vue @@ -0,0 +1,51 @@ + +--- +order: 23 +title: + zh-CN: 无边框 + en-US: Bordered-less +--- + +## zh-CN + +无边框样式。 + +## en-US + +Bordered-less style component. + + + + + diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/date-render.vue b/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/date-render.vue new file mode 100644 index 0000000..939cc1a --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/date-render.vue @@ -0,0 +1,60 @@ + +--- +order: 9 +title: + zh-CN: 定制日期单元格 + en-US: Customized Date Rendering +--- + +## zh-CN + +使用 `dateRender` 可以自定义日期单元格的内容和样式。 + +## en-US + +We can customize the rendering of date cells in the calendar by providing a `dateRender` function to `DatePicker`. + + + + diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/disabled-date.vue b/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/disabled-date.vue new file mode 100644 index 0000000..7f21b53 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/disabled-date.vue @@ -0,0 +1,98 @@ + +--- +order: 4 +title: + zh-CN: 不可选择日期和时间 + en-US: Disabled Date & Time +--- + +## zh-CN + +可用 `disabledDate` 和 `disabledTime` 分别禁止选择部分日期和时间,其中 `disabledTime` 需要和 `showTime` 一起使用。 + +## en-US + +Disabled part of dates and time by `disabledDate` and `disabledTime` respectively, and `disabledTime` only works with `showTime`. + + + + + diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/disabled.vue b/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/disabled.vue new file mode 100644 index 0000000..9e14f78 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/disabled.vue @@ -0,0 +1,47 @@ + +--- +order: 3 +title: + zh-CN: 禁用 + en-US: Disabled +--- + +## zh-CN + +选择框的不可用状态。 + +## en-US + +A disabled state of the `DatePicker`. + + + + + diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/extra-footer.vue b/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/extra-footer.vue new file mode 100644 index 0000000..63be974 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/extra-footer.vue @@ -0,0 +1,37 @@ + +--- +order: 7 +title: + zh-CN: 额外的页脚 + en-US: Extra Footer +--- + +## zh-CN + +在浮层中加入额外的页脚,以满足某些定制信息的需求。 + +## en-US + +Render extra footer in panel for customized requirements. + + + + diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/format.vue b/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/format.vue new file mode 100644 index 0000000..9aef11c --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/format.vue @@ -0,0 +1,61 @@ + +--- +order: 1 +title: + zh-CN: 日期格式 + en-US: Date Format +--- + +## zh-CN + +使用 `format` 属性,可以自定义日期显示格式。 + +## en-US + +We can set the date format by `format`. + + + + + diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/index.vue b/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/index.vue new file mode 100644 index 0000000..3bfbe80 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/index.vue @@ -0,0 +1,66 @@ + + + diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/mode.vue b/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/mode.vue new file mode 100644 index 0000000..f61482e --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/mode.vue @@ -0,0 +1,79 @@ + +--- +order: 10 +title: + zh-CN: 受控面板 + en-US: Controlled Panels +--- + +## zh-CN + +通过组合 `mode` 与 `onPanelChange` 控制要展示的面板。 + +## en-US + +Determing which panel to show with `mode` and `onPanelChange`. + + + + + diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/presetted-ranges.vue b/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/presetted-ranges.vue new file mode 100644 index 0000000..a825beb --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/presetted-ranges.vue @@ -0,0 +1,47 @@ + +--- +order: 6 +title: + zh-CN: 预设范围 + en-US: Preset Ranges +--- + +## zh-CN + +可以预设常用的日期范围以提高用户体验。 + +## en-US + +We can set presetted ranges to RangePicker to improve user experience. + + + + + diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/range-picker.vue b/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/range-picker.vue new file mode 100644 index 0000000..68f25e6 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/range-picker.vue @@ -0,0 +1,43 @@ + +--- +order: 1 +title: + zh-CN: 范围选择器 + en-US: Range Picker +--- + +## zh-CN + +通过设置 `picker` 属性,指定范围选择器类型。 + +## en-US + +Set range picker type by `picker` prop. + + + + + diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/select-in-range.vue b/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/select-in-range.vue new file mode 100644 index 0000000..be52039 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/select-in-range.vue @@ -0,0 +1,74 @@ + +--- +order: 5 +title: + zh-CN: 选择不超过七天的范围 + en-US: Select range dates in 7 days +--- + +## zh-CN + +这里举例如何用 `onCalendarChange` 和 `disabledDate` 来限制动态的日期区间选择。 + +## en-US + +A example shows how to select a dynamic range by using `onCalendarChange` and `disabledDate`. + + + + diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/size.vue b/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/size.vue new file mode 100644 index 0000000..120591f --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/size.vue @@ -0,0 +1,41 @@ + +--- +order: 8 +title: + zh-CN: 三种大小 + en-US: Three Sizes +--- + +## zh-CN + +三种大小的输入框,若不设置,则为 `default`。 + +## en-US + +The input box comes in three sizes. `default` will be used if `size` is omitted. + + + + + diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/start-end.vue b/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/start-end.vue new file mode 100644 index 0000000..f1fe901 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/start-end.vue @@ -0,0 +1,98 @@ + +--- +order: 11 +title: + zh-CN: 自定义日期范围选择 + en-US: Customized Range Picker +--- + +## zh-CN + +当 `RangePicker` 无法满足业务需求时,可以使用两个 `DatePicker` 实现类似的功能。 +> - 通过设置 `disabledDate` 方法,来约束开始和结束日期。 +> - 通过 `open` `openChange` 来优化交互。 + +## en-US + +When `RangePicker` does not satisfied your requirements, try to implement similar functionality with two `DatePicker`. +> - Use the `disabledDate` property to limit the start and end dates. +> - Improve user experience with `open` and `openChange`. + + + + + diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/suffix.vue b/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/suffix.vue new file mode 100644 index 0000000..42ed119 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/suffix.vue @@ -0,0 +1,69 @@ + +--- +order: 13 +title: + zh-CN: 后缀图标 + en-US: Suffix +--- + +## zh-CN + +通过 `suffixIcon` 自定义后缀图标 + +## en-US + +Customize the suffix icon through `suffixIcon` + + + + + diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/switchable.vue b/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/switchable.vue new file mode 100644 index 0000000..b396de9 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/switchable.vue @@ -0,0 +1,44 @@ + +--- +order: 1.1 +title: + zh-CN: 切换不同的选择器 + en-US: Switchable picker +--- + +## zh-CN + +提供选择器,自由切换不同类型的日期选择器,常用于日期筛选场合。 + +## en-US + +Switch in different types of pickers by Select. + + + diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/text.vue b/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/text.vue new file mode 100644 index 0000000..30baf83 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/text.vue @@ -0,0 +1,55 @@ + +--- +order: 12 +title: + zh-CN: 自定义渲染 + en-US: Custum Time +--- + +## zh-CN + +增加自定义渲染功能,在默认 `slot` 中,你可以设置任何你想渲染的组件。 + +## en-US + +Added custom rendering function, in the default `slot`, you can set any component you want to render. + + + + + diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/time.vue b/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/time.vue new file mode 100644 index 0000000..41f64c0 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/demo/time.vue @@ -0,0 +1,62 @@ + +--- +order: 2 +title: + zh-CN: 日期时间选择 + en-US: Choose Time +--- + +## zh-CN + +增加选择时间功能,当 `showTime` 为一个对象时,其属性会传递给内建的 `TimePicker`。 + +## en-US + +This property provide an additional time selection. When `showTime` is an Object, its properties will be passed on to built-in `TimePicker`. + + + + + diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/generatePicker/generateRangePicker.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/generatePicker/generateRangePicker.tsx new file mode 100644 index 0000000..5a647ad --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/generatePicker/generateRangePicker.tsx @@ -0,0 +1,217 @@ +import CalendarOutlined from '@ant-design/icons-vue/CalendarOutlined' +import ClockCircleOutlined from '@ant-design/icons-vue/ClockCircleOutlined' +import CloseCircleFilled from '@ant-design/icons-vue/CloseCircleFilled' +import SwapRightOutlined from '@ant-design/icons-vue/SwapRightOutlined' +import { RangePicker as VCRangePicker } from '../../vc-picker' +import type { GenerateConfig } from '@core/components/BaseDatePicker/src/vc-picker/generate' +import enUS from '../locale/en_US' +import { useLocaleReceiver } from 'ant-design-vue/es/locale-provider/LocaleReceiver' +import { getRangePlaceholder } from '../util' +import { getTimeProps, Components } from './index' +import { computed, defineComponent, ref } from 'vue' +import useConfigInject from 'ant-design-vue/es/_util/hooks/useConfigInject' +import classNames from 'ant-design-vue/es/_util/classNames' +import type { CommonProps, RangePickerProps } from './props' +import { commonProps, rangePickerProps } from './props' +import type { PanelMode, RangeValue } from '@core/components/BaseDatePicker/src/vc-picker/interface' +import type { RangePickerSharedProps } from '@core/components/BaseDatePicker/src/vc-picker/RangePicker' +import devWarning from 'ant-design-vue/es/vc-util/devWarning' +import { useInjectFormItemContext } from 'ant-design-vue/es/form/FormItemContext' +import omit from 'ant-design-vue/es/_util/omit' + +export default function generateRangePicker( + generateConfig: GenerateConfig, + extraProps: ExtraProps +) { + const RangePicker = defineComponent({ + name: 'ARangePicker', + inheritAttrs: false, + props: { + ...commonProps(), + ...rangePickerProps(), + ...extraProps + }, + slots: [ + 'suffixIcon', + // 'clearIcon', + 'prevIcon', + 'nextIcon', + 'superPrevIcon', + 'superNextIcon', + // 'panelRender', + 'dateRender', + 'renderExtraFooter' + // 'separator', + ], + setup(_props, { expose, slots, attrs, emit }) { + const props = _props as unknown as CommonProps & RangePickerProps + const formItemContext = useInjectFormItemContext() + devWarning( + !attrs.getCalendarContainer, + 'DatePicker', + '`getCalendarContainer` is deprecated. Please use `getPopupContainer"` instead.' + ) + const { prefixCls, direction, getPopupContainer, size, rootPrefixCls } = useConfigInject( + 'picker', + props + ) + const pickerRef = ref() + expose({ + focus: () => { + pickerRef.value?.focus() + }, + blur: () => { + pickerRef.value?.blur() + } + }) + const maybeToStrings = (dates: DateType[]) => { + return props.valueFormat ? generateConfig.toString(dates, props.valueFormat) : dates + } + const onChange = (dates: [DateType, DateType], dateStrings: [string, string]) => { + const values = maybeToStrings(dates) + emit('update:value', values) + emit('change', values, dateStrings) + formItemContext.onFieldChange() + } + const onOpenChange = (open: boolean) => { + emit('update:open', open) + emit('openChange', open) + } + const onFocus = (e: FocusEvent) => { + emit('focus', e) + } + const onBlur = (e: FocusEvent) => { + emit('blur', e) + formItemContext.onFieldBlur() + } + const onPanelChange = (dates: RangeValue, modes: [PanelMode, PanelMode]) => { + const values = maybeToStrings(dates) + emit('panelChange', values, modes) + } + const onOk = (dates: DateType[]) => { + const value = maybeToStrings(dates) + emit('ok', value) + } + const onCalendarChange: RangePickerSharedProps['onCalendarChange'] = ( + dates: [DateType, DateType], + dateStrings: [string, string], + info + ) => { + const values = maybeToStrings(dates) + emit('calendarChange', values, dateStrings, info) + } + const [contextLocale] = useLocaleReceiver('DatePicker', enUS) + + const value = computed(() => { + if (props.value) { + return props.valueFormat + ? generateConfig.toDate(props.value, props.valueFormat) + : props.value + } + return props.value + }) + const defaultValue = computed(() => { + if (props.defaultValue) { + return props.valueFormat + ? generateConfig.toDate(props.defaultValue, props.valueFormat) + : props.defaultValue + } + return props.defaultValue + }) + const defaultPickerValue = computed(() => { + if (props.defaultPickerValue) { + return props.valueFormat + ? generateConfig.toDate(props.defaultPickerValue, props.valueFormat) + : props.defaultPickerValue + } + return props.defaultPickerValue + }) + return () => { + const locale = { ...contextLocale.value, ...props.locale } + const p = { ...props, ...attrs } + const { + prefixCls: customizePrefixCls, + bordered = true, + placeholder, + suffixIcon = slots.suffixIcon?.(), + picker = 'date', + transitionName, + allowClear = true, + dateRender = slots.dateRender, + renderExtraFooter = slots.renderExtraFooter, + separator = slots.separator?.(), + clearIcon = slots.clearIcon?.(), + id = formItemContext.id.value, + ...restProps + } = p + delete restProps['onUpdate:value'] + delete restProps['onUpdate:open'] + const { format, showTime } = p as any + + let additionalOverrideProps: any = {} + additionalOverrideProps = { + ...additionalOverrideProps, + ...(showTime ? getTimeProps({ format, picker, ...showTime }) : {}), + ...(picker === 'time' + ? getTimeProps({ format, ...omit(restProps, ['disabledTime']), picker }) + : {}) + } + const pre = prefixCls.value + return ( + + + + ) + } + ref={pickerRef} + placeholder={getRangePlaceholder(picker, locale, placeholder as [string, string])} + suffixIcon={ + suffixIcon || (picker === 'time' ? : ) + } + clearIcon={clearIcon || } + allowClear={allowClear} + transitionName={transitionName || `${rootPrefixCls.value}-slide-up`} + {...restProps} + {...additionalOverrideProps} + id={id} + value={value.value} + defaultValue={defaultValue.value} + defaultPickerValue={defaultPickerValue.value} + picker={picker} + class={classNames( + { + [`${pre}-${size.value}`]: size.value, + [`${pre}-borderless`]: !bordered + }, + attrs.class + )} + locale={locale!.lang} + prefixCls={pre} + getPopupContainer={attrs.getCalendarContainer || getPopupContainer.value} + generateConfig={generateConfig} + prevIcon={slots.prevIcon?.() || } + nextIcon={slots.nextIcon?.() || } + superPrevIcon={slots.superPrevIcon?.() || } + superNextIcon={slots.superNextIcon?.() || } + components={Components} + direction={direction.value} + onChange={onChange} + onOpenChange={onOpenChange} + onFocus={onFocus} + onBlur={onBlur} + onPanelChange={onPanelChange} + onOk={onOk} + onCalendarChange={onCalendarChange} + /> + ) + } + } + }) + + return RangePicker +} diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/generatePicker/generateSinglePicker.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/generatePicker/generateSinglePicker.tsx new file mode 100644 index 0000000..0d555df --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/generatePicker/generateSinglePicker.tsx @@ -0,0 +1,246 @@ +import CalendarOutlined from '@ant-design/icons-vue/CalendarOutlined' +import ClockCircleOutlined from '@ant-design/icons-vue/ClockCircleOutlined' +import CloseCircleFilled from '@ant-design/icons-vue/CloseCircleFilled' +import RCPicker from '../../vc-picker' +import type { PanelMode, PickerMode } from '@core/components/BaseDatePicker/src/vc-picker/interface' +import type { GenerateConfig } from '@core/components/BaseDatePicker/src/vc-picker/generate' +import enUS from '../locale/en_US' +import { getPlaceholder } from '../util' +import { useLocaleReceiver } from 'ant-design-vue/es/locale-provider/LocaleReceiver' +import { getTimeProps, Components } from './index' +import { computed, defineComponent, ref } from 'vue' +import useConfigInject from 'ant-design-vue/es/_util/hooks/useConfigInject' +import classNames from 'ant-design-vue/es/_util/classNames' +import type { CommonProps, DatePickerProps } from './props' +import { commonProps, datePickerProps } from './props' + +import devWarning from 'ant-design-vue/es/vc-util/devWarning' +import { useInjectFormItemContext } from 'ant-design-vue/es/form/FormItemContext' + +export default function generateSinglePicker( + generateConfig: GenerateConfig, + extraProps: ExtraProps +) { + function getPicker(picker?: PickerMode, displayName?: string) { + const comProps = { + ...commonProps(), + ...datePickerProps(), + ...extraProps + } + return defineComponent({ + name: displayName, + inheritAttrs: false, + props: comProps, + slots: [ + 'suffixIcon', + // 'clearIcon', + 'prevIcon', + 'nextIcon', + 'superPrevIcon', + 'superNextIcon', + // 'panelRender', + 'dateRender', + 'renderExtraFooter', + 'monthCellRender' + ], + setup(_props, { slots, expose, attrs, emit }) { + // 兼容 vue 3.2.7 + const props = _props as unknown as CommonProps & + DatePickerProps & + ExtraProps + const formItemContext = useInjectFormItemContext() + devWarning( + !(props.monthCellContentRender || slots.monthCellContentRender), + 'DatePicker', + '`monthCellContentRender` is deprecated. Please use `monthCellRender"` instead.' + ) + + devWarning( + !attrs.getCalendarContainer, + 'DatePicker', + '`getCalendarContainer` is deprecated. Please use `getPopupContainer"` instead.' + ) + const { prefixCls, direction, getPopupContainer, size, rootPrefixCls } = useConfigInject( + 'picker', + props + ) + const pickerRef = ref() + expose({ + focus: () => { + pickerRef.value?.focus() + }, + blur: () => { + pickerRef.value?.blur() + } + }) + const maybeToString = (date: DateType) => { + return props.valueFormat ? generateConfig.toString(date, props.valueFormat) : date + } + const onChange = (date: DateType, dateString: string) => { + const value = maybeToString(date) + emit('update:value', value) + emit('change', value, dateString) + formItemContext.onFieldChange() + } + const onOpenChange = (open: boolean) => { + emit('update:open', open) + emit('openChange', open) + } + const onFocus = (e: FocusEvent) => { + emit('focus', e) + } + const onBlur = (e: FocusEvent) => { + emit('blur', e) + formItemContext.onFieldBlur() + } + const onPanelChange = (date: DateType, mode: PanelMode | null) => { + const value = maybeToString(date) + emit('panelChange', value, mode) + } + const onOk = (date: DateType) => { + const value = maybeToString(date) + emit('ok', value) + } + + const [contextLocale] = useLocaleReceiver('DatePicker', enUS) + + const value = computed(() => { + if (props.value) { + return props.valueFormat + ? generateConfig.toDate(props.value as string | DateType, props.valueFormat) + : props.value + } + return (props.value === '' ? undefined : props.value) as DateType + }) + const defaultValue = computed(() => { + if (props.defaultValue) { + return props.valueFormat + ? generateConfig.toDate(props.defaultValue as string | DateType, props.valueFormat) + : props.defaultValue + } + return (props.defaultValue === '' ? undefined : props.defaultValue) as DateType + }) + const defaultPickerValue = computed(() => { + if (props.defaultPickerValue) { + return props.valueFormat + ? generateConfig.toDate( + props.defaultPickerValue as string | DateType, + props.valueFormat + ) + : props.defaultPickerValue + } + return ( + props.defaultPickerValue === '' ? undefined : props.defaultPickerValue + ) as DateType + }) + + return () => { + const locale = { ...contextLocale.value, ...props.locale } + const p = { ...props, ...attrs } + const { + bordered = true, + placeholder, + suffixIcon = slots.suffixIcon?.(), + showToday = true, + transitionName, + allowClear = true, + dateRender = slots.dateRender, + renderExtraFooter = slots.renderExtraFooter, + monthCellRender = slots.monthCellRender || + (props as any).monthCellContentRender || + slots.monthCellContentRender, + clearIcon = slots.clearIcon?.(), + id = formItemContext.id.value, + ...restProps + } = p + const showTime = p.showTime === '' ? true : p.showTime + const { format } = p as any + + let additionalOverrideProps: any = {} + if (picker) { + additionalOverrideProps.picker = picker + } + const mergedPicker = picker || p.picker || 'date' + + additionalOverrideProps = { + ...additionalOverrideProps, + ...(showTime + ? getTimeProps({ + format, + picker: mergedPicker, + ...(typeof showTime === 'object' ? showTime : {}) + }) + : {}), + ...(mergedPicker === 'time' + ? getTimeProps({ format, ...restProps, picker: mergedPicker }) + : {}) + } + const pre = prefixCls.value + return ( + : ) + } + clearIcon={clearIcon || } + allowClear={allowClear} + transitionName={transitionName || `${rootPrefixCls.value}-slide-up`} + {...restProps} + {...additionalOverrideProps} + id={id} + picker={mergedPicker} + value={value.value} + defaultValue={defaultValue.value} + defaultPickerValue={defaultPickerValue.value} + showToday={showToday} + locale={locale!.lang} + class={classNames( + { + [`${pre}-${size.value}`]: size.value, + [`${pre}-borderless`]: !bordered + }, + attrs.class + )} + prefixCls={pre} + getPopupContainer={attrs.getCalendarContainer || getPopupContainer.value} + generateConfig={generateConfig} + prevIcon={slots.prevIcon?.() || } + nextIcon={slots.nextIcon?.() || } + superPrevIcon={slots.superPrevIcon?.() || } + superNextIcon={slots.superNextIcon?.() || } + components={Components} + direction={direction.value} + onChange={onChange} + onOpenChange={onOpenChange} + onFocus={onFocus} + onBlur={onBlur} + onPanelChange={onPanelChange} + onOk={onOk} + /> + ) + } + } + }) + } + + const DatePicker = getPicker(undefined, 'ADatePicker') + const WeekPicker = getPicker('week', 'AWeekPicker') + const MonthPicker = getPicker('month', 'AMonthPicker') + const YearPicker = getPicker('year', 'AYearPicker') + const TimePicker = getPicker('time', 'TimePicker') // 给独立组件 TimePicker 使用,此处名称不用更改 + const QuarterPicker = getPicker('quarter', 'AQuarterPicker') + + return { + DatePicker, + WeekPicker, + MonthPicker, + YearPicker, + TimePicker, + QuarterPicker + } +} diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/generatePicker/index.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/generatePicker/index.tsx new file mode 100644 index 0000000..ef62e6a --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/generatePicker/index.tsx @@ -0,0 +1,80 @@ +import type { GenerateConfig } from '@core/components/BaseDatePicker/src/vc-picker/generate' +import type { SharedTimeProps } from '@core/components/BaseDatePicker/src/vc-picker/panels/TimePanel' +import type { PickerMode } from '@core/components/BaseDatePicker/src/vc-picker/interface' +import PickerButton from '../PickerButton' +import PickerTag from '../PickerTag' +import generateSinglePicker from './generateSinglePicker' +import generateRangePicker from './generateRangePicker' + +export * from './interface' + +export const Components = { button: PickerButton, rangeItem: PickerTag } + +function toArray(list: T | T[]): T[] { + if (!list) { + return [] + } + return Array.isArray(list) ? list : [list] +} + +export function getTimeProps( + props: { format?: string; picker?: PickerMode } & SharedTimeProps +) { + const { format, picker, showHour, showMinute, showSecond, use12Hours } = props + + const firstFormat = toArray(format)[0] + const showTimeObj: SharedTimeProps = { ...props } + + if (firstFormat && typeof firstFormat === 'string') { + if (!firstFormat.includes('s') && showSecond === undefined) { + showTimeObj.showSecond = false + } + if (!firstFormat.includes('m') && showMinute === undefined) { + showTimeObj.showMinute = false + } + if (!firstFormat.includes('H') && !firstFormat.includes('h') && showHour === undefined) { + showTimeObj.showHour = false + } + + if ((firstFormat.includes('a') || firstFormat.includes('A')) && use12Hours === undefined) { + showTimeObj.use12Hours = true + } + } + + if (picker === 'time') { + return showTimeObj + } + + if (typeof firstFormat === 'function') { + // format of showTime should use default when format is custom format function + delete showTimeObj.format + } + + return { + showTime: showTimeObj + } +} + +function generatePicker( + generateConfig: GenerateConfig, + extraProps?: ExtraProps +) { + // =========================== Picker =========================== + const { DatePicker, WeekPicker, MonthPicker, YearPicker, TimePicker, QuarterPicker } = + generateSinglePicker(generateConfig, extraProps) + + // ======================== Range Picker ======================== + const RangePicker = generateRangePicker(generateConfig, extraProps) + + return { + DatePicker, + WeekPicker, + MonthPicker, + YearPicker, + TimePicker, + QuarterPicker, + RangePicker + } +} + +export default generatePicker diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/generatePicker/interface.ts b/src/components/BasicPacks/BaseDatePicker/src/datePick/generatePicker/interface.ts new file mode 100644 index 0000000..54ecdb9 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/generatePicker/interface.ts @@ -0,0 +1,74 @@ +import type { + PickerBaseProps as RCPickerBaseProps, + PickerDateProps as RCPickerDateProps, + PickerTimeProps as RCPickerTimeProps +} from '@core/components/BaseDatePicker/src/vc-picker/Picker' +import type { + RangePickerBaseProps as RCRangePickerBaseProps, + RangePickerDateProps as RCRangePickerDateProps, + RangePickerTimeProps as RCRangePickerTimeProps +} from '@core/components/BaseDatePicker/src/vc-picker/RangePicker' +import type { Locale as RcPickerLocale } from '@core/components/BaseDatePicker/src/vc-picker/interface' +import type { TimePickerLocale } from 'ant-design-vue/es/time-picker' +import type { SizeType } from 'ant-design-vue/es/config-provider' + +type InjectDefaultProps = Omit< + Props, + | 'locale' + | 'generateConfig' + | 'prevIcon' + | 'nextIcon' + | 'superPrevIcon' + | 'superNextIcon' + | 'hideHeader' + | 'components' +> & { + locale?: PickerLocale + size?: SizeType + bordered?: boolean +} + +export type PickerLocale = { + lang: RcPickerLocale & AdditionalPickerLocaleLangProps + timePickerLocale: TimePickerLocale +} & AdditionalPickerLocaleProps + +export type AdditionalPickerLocaleProps = { + dateFormat?: string + dateTimeFormat?: string + weekFormat?: string + monthFormat?: string +} + +export type AdditionalPickerLocaleLangProps = { + placeholder: string + yearPlaceholder?: string + quarterPlaceholder?: string + monthPlaceholder?: string + weekPlaceholder?: string + rangeYearPlaceholder?: [string, string] + rangeQuarterPlaceholder?: [string, string] + rangeMonthPlaceholder?: [string, string] + rangeWeekPlaceholder?: [string, string] + rangePlaceholder?: [string, string] +} + +// Picker Props +export type PickerBaseProps = InjectDefaultProps> +export type PickerDateProps = InjectDefaultProps> +export type PickerTimeProps = InjectDefaultProps> + +export type PickerProps = + | PickerBaseProps + | PickerDateProps + | PickerTimeProps + +// Range Picker Props +export type RangePickerBaseProps = InjectDefaultProps> +export type RangePickerDateProps = InjectDefaultProps> +export type RangePickerTimeProps = InjectDefaultProps> + +export type RangePickerProps = + | RangePickerBaseProps + | RangePickerDateProps + | RangePickerTimeProps diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/generatePicker/props.ts b/src/components/BasicPacks/BaseDatePicker/src/datePick/generatePicker/props.ts new file mode 100644 index 0000000..120905d --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/generatePicker/props.ts @@ -0,0 +1,289 @@ +import type { FocusEventHandler, MouseEventHandler } from 'ant-design-vue/es/_util/EventInterface' +import type { CSSProperties, PropType } from 'vue' +import type { PickerLocale } from './index' +import type { SizeType } from 'ant-design-vue/es/config-provider' +import type { AlignType } from 'ant-design-vue/es/vc-align/interface' +import type { + CustomFormat, + DisabledTime, + DisabledTimes, + EventValue, + PanelMode, + PickerMode, + RangeValue +} from '@core/components/BaseDatePicker/src/vc-picker/interface' +import type { DateRender } from '@core/components/BaseDatePicker/src/vc-picker/panels/DatePanel/DateBody' +import type { MonthCellRender } from '@core/components/BaseDatePicker/src/vc-picker/panels/MonthPanel/MonthBody' +import type { SharedTimeProps } from '@core/components/BaseDatePicker/src/vc-picker/panels/TimePanel' +import type { + RangeDateRender, + RangeInfo, + RangeType +} from '@core/components/BaseDatePicker/src/vc-picker/RangePicker' +import type { VueNode } from 'ant-design-vue/es/_util/type' + +function commonProps() { + return { + id: String, + dropdownClassName: String, + dropdownAlign: { type: Object as PropType }, + popupStyle: { type: Object as PropType }, + transitionName: String, + placeholder: String, + allowClear: { type: Boolean, default: undefined }, + autofocus: { type: Boolean, default: undefined }, + disabled: { type: Boolean, default: undefined }, + tabindex: Number, + open: { type: Boolean, default: undefined }, + defaultOpen: { type: Boolean, default: undefined }, + /** Make input readOnly to avoid popup keyboard in mobile */ + inputReadOnly: { type: Boolean, default: undefined }, + // Value + // format: string | CustomFormat | (string | CustomFormat)[]; + // Render + // suffixIcon?: VueNode; + // clearIcon?: VueNode; + // prevIcon?: VueNode; + // nextIcon?: VueNode; + // superPrevIcon?: VueNode; + // superNextIcon?: VueNode; + getPopupContainer: { type: Function as PropType<(node: HTMLElement) => HTMLElement> }, + panelRender: { type: Function as PropType<(originPanel: VueNode) => VueNode> }, + // // Events + onChange: { + type: Function as PropType<(value: DateType | string | null, dateString: string) => void> + }, + 'onUpdate:value': { type: Function as PropType<(value: DateType | string | null) => void> }, + onOk: { type: Function as PropType<(value: DateType | string | null) => void> }, + onOpenChange: { type: Function as PropType<(open: boolean) => void> }, + 'onUpdate:open': { type: Function as PropType<(open: boolean) => void> }, + onFocus: { type: Function as PropType }, + onBlur: { type: Function as PropType }, + onMousedown: { type: Function as PropType }, + onMouseup: { type: Function as PropType }, + onMouseenter: { type: Function as PropType }, + onMouseleave: { type: Function as PropType }, + onClick: { type: Function as PropType }, + onContextmenu: { type: Function as PropType }, + onKeydown: { + type: Function as PropType<(event: KeyboardEvent, preventDefault: () => void) => void> + }, + // WAI-ARIA + role: String, + name: String, + autocomplete: String, + direction: { type: String as PropType<'ltr' | 'rtl'> }, + showToday: { type: Boolean, default: undefined }, + showTime: { + type: [Boolean, Object] as PropType>, + default: undefined + }, + locale: { type: Object as PropType }, + size: { type: String as PropType }, + bordered: { type: Boolean, default: undefined }, + dateRender: { type: Function as PropType> }, + disabledDate: { type: Function as PropType<(date: DateType) => boolean> }, + mode: { type: String as PropType }, + picker: { type: String as PropType }, + valueFormat: String, + + /** @deprecated Please use `disabledTime` instead. */ + disabledHours: Function as PropType, + /** @deprecated Please use `disabledTime` instead. */ + disabledMinutes: Function as PropType, + /** @deprecated Please use `disabledTime` instead. */ + disabledSeconds: Function as PropType + } +} + +export interface CommonProps { + id?: string + prefixCls?: string + dropdownClassName?: string + dropdownAlign?: AlignType + popupStyle?: CSSProperties + transitionName?: string + placeholder?: string + allowClear?: boolean + autofocus?: boolean + disabled?: boolean + tabindex?: number + open?: boolean + defaultOpen?: boolean + inputReadOnly?: boolean + suffixIcon?: VueNode + clearIcon?: VueNode + prevIcon?: VueNode + nextIcon?: VueNode + superPrevIcon?: VueNode + superNextIcon?: VueNode + getPopupContainer?: (triggerNode: HTMLElement) => HTMLElement + panelRender?: (originPanel: VueNode) => VueNode + onChange?: (value: DateType | string | null, dateString: string) => void + 'onUpdate:value'?: (value: DateType | string | null) => void + onOk?: (value: DateType | string | null) => void + onOpenChange?: (open: boolean) => void + 'onUpdate:open'?: (open: boolean) => void + onFocus?: FocusEventHandler + onBlur?: FocusEventHandler + onMousedown?: MouseEventHandler + onMouseup?: MouseEventHandler + onMouseenter?: MouseEventHandler + onMouseleave?: MouseEventHandler + onClick?: MouseEventHandler + onContextmenu?: MouseEventHandler + onKeydown?: (event: KeyboardEvent, preventDefault: () => void) => void + role?: string + name?: string + autocomplete?: string + direction?: 'ltr' | 'rtl' + showToday?: boolean + showTime?: boolean | SharedTimeProps + locale?: PickerLocale + size?: SizeType + bordered?: boolean + dateRender?: DateRender + disabledDate?: (date: DateType) => boolean + mode?: PanelMode + picker?: PickerMode + valueFormat?: string +} + +function datePickerProps() { + return { + defaultPickerValue: { type: [String, Object] as PropType }, + defaultValue: { type: [String, Object] as PropType }, + value: { type: [String, Object] as PropType }, + disabledTime: { type: Function as PropType> }, + format: { + type: [String, Function, Array] as PropType< + string | CustomFormat | (string | CustomFormat)[] + > + }, + renderExtraFooter: { type: Function as PropType<(mode: PanelMode) => VueNode> }, + showNow: { type: Boolean, default: undefined }, + monthCellRender: { type: Function as PropType> }, + // deprecated Please use `monthCellRender"` instead.', + monthCellContentRender: { type: Function as PropType> } + } +} + +export interface DatePickerProps { + defaultPickerValue?: DateType | string + defaultValue?: DateType | string + value?: DateType | string + disabledTime?: DisabledTime + format?: string | CustomFormat | (string | CustomFormat)[] + renderExtraFooter?: (mode: PanelMode) => VueNode + showNow?: boolean + monthCellRender?: MonthCellRender + // deprecated Please use `monthCellRender"` instead.', + monthCellContentRender?: MonthCellRender +} + +function rangePickerProps() { + return { + allowEmpty: { type: Array as unknown as PropType<[boolean, boolean]> }, + dateRender: { type: Function as PropType> }, + defaultPickerValue: { + type: Array as unknown as PropType | RangeValue> + }, + defaultValue: { type: Array as unknown as PropType | RangeValue> }, + value: { type: Array as unknown as PropType | RangeValue> }, + disabledTime: { + type: Function as PropType<(date: EventValue, type: RangeType) => DisabledTimes> + }, + disabled: { type: [Boolean, Array] as unknown as PropType }, + format: String, + renderExtraFooter: { type: Function as PropType<() => VueNode> }, + separator: { type: String }, + ranges: { + type: Object as PropType< + Record< + string, + Exclude, null> | (() => Exclude, null>) + > + > + }, + placeholder: Array, + mode: { type: Array as unknown as PropType<[PanelMode, PanelMode]> }, + onChange: { + type: Function as PropType< + ( + value: RangeValue | RangeValue | null, + dateString: [string, string] + ) => void + > + }, + 'onUpdate:value': { + type: Function as PropType<(value: RangeValue | RangeValue | null) => void> + }, + onCalendarChange: { + type: Function as PropType< + ( + values: RangeValue | RangeValue, + formatString: [string, string], + info: RangeInfo + ) => void + > + }, + onPanelChange: { + type: Function as PropType< + (values: RangeValue | RangeValue, modes: [PanelMode, PanelMode]) => void + > + }, + onOk: { + type: Function as PropType<(dates: RangeValue | RangeValue) => void> + } + } +} + +export interface RangePickerProps { + allowEmpty?: [boolean, boolean] + dateRender?: RangeDateRender + defaultPickerValue?: RangeValue | RangeValue + defaultValue?: RangeValue | RangeValue + value?: RangeValue | RangeValue + disabledTime?: (date: EventValue, type: RangeType) => DisabledTimes + disabled?: [boolean, boolean] + format?: string + renderExtraFooter?: () => VueNode + separator?: string + ranges?: Record< + string, + Exclude, null> | (() => Exclude, null>) + > + placeholder?: [string, string] + mode?: [PanelMode, PanelMode] + onChange?: ( + value: RangeValue | RangeValue | null, + dateString: [string, string] + ) => void + 'onUpdate:value'?: (value: RangeValue | RangeValue | null) => void + onCalendarChange?: ( + values: RangeValue | RangeValue, + formatString: [string, string], + info: RangeInfo + ) => void + onPanelChange?: ( + values: RangeValue | RangeValue, + modes: [PanelMode, PanelMode] + ) => void + onOk?: (dates: RangeValue | RangeValue) => void +} + +export type ExtraDatePickerProps = { + valueFormat?: string + defaultPickerValue?: DateType | string + defaultValue?: DateType | string + value?: DateType | string +} + +export type ExtraRangePickerProps = { + valueFormat?: string + defaultPickerValue?: RangeValue | RangeValue + defaultValue?: RangeValue | RangeValue + value?: RangeValue | RangeValue +} + +export { commonProps, datePickerProps, rangePickerProps } diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/index.en-US.md b/src/components/BasicPacks/BaseDatePicker/src/datePick/index.en-US.md new file mode 100644 index 0000000..094beb1 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/index.en-US.md @@ -0,0 +1,196 @@ +--- +category: Components +type: Data Entry +title: DatePicker +cover: https://gw.alipayobjects.com/zos/alicdn/RT_USzA48/DatePicker.svg +--- + +To select or input a date. + +## When To Use + +By clicking the input box, you can select a date from a popup calendar. + +## API + +There are five kinds of picker: + +- DatePicker +- DatePicker\[picker="month"] +- DatePicker\[picker="week"] +- DatePicker\[picker="year"] +- DatePicker\[picker="quarter"] +- RangePicker + +### Localization + +The default locale is en-US, if you need to use other languages, recommend to use internationalized components provided by us at the entrance. Look at: [ConfigProvider](/components/config-provider/). + +If there are special needs (only modifying single component language), Please use the property: local. Example: [default](https://github.com/vueComponent/ant-design-vue/blob/main/components/date-picker/locale/example.json). + +```html + + +``` + +```html + + +``` + +### Common API + +The following APIs are shared by DatePicker, RangePicker. + +| Property | Description | Type | Default | Version | +| --- | --- | --- | --- | --- | +| allowClear | Whether to show clear button | boolean | true | | +| autofocus | If get focus when component mounted | boolean | false | | +| bordered | Whether has border style | boolean | true | | +| dateRender | Custom rendering function for date cells | v-slot:dateRender="{current, today}" | - | | +| disabled | Determine whether the DatePicker is disabled | boolean | false | | +| disabledDate | Specify the date that cannot be selected | (currentDate: dayjs) => boolean | - | | +| dropdownClassName | To customize the className of the popup calendar | string | - | | +| getPopupContainer | To set the container of the floating layer, while the default is to create a `div` element in `body` | function(trigger) | - | | +| inputReadOnly | Set the `readonly` attribute of the input tag (avoids virtual keyboard on touch devices) | boolean | false | | +| locale | Localization configuration | object | [default](https://github.com/vueComponent/ant-design-vue/blob/main/components/date-picker/locale/example.json) | | +| mode | The picker panel mode | `time` \| `date` \| `month` \| `year` \| `decade` | - | | +| nextIcon | The custom next icon | slot | - | 3.0 | +| open | The open state of picker | boolean | - | | +| picker | Set picker type | `date` \| `week` \| `month` \| `quarter` \| `year` | `date` | `quarter` | +| placeholder | The placeholder of date input | string \| \[string,string] | - | | +| popupStyle | To customize the style of the popup calendar | CSSProperties | {} | | +| prevIcon | The custom prev icon | slot | - | 3.0 | +| size | To determine the size of the input box, the height of `large` and `small`, are 40px and 24px respectively, while default size is 32px | `large` \| `middle` \| `small` | - | | +| suffixIcon | The custom suffix icon | v-slot:suffixIcon | - | | +| superNextIcon | The custom super next icon | slot | - | 3.0 | +| superPrevIcon | The custom super prev icon | slot | - | 3.0 | +| valueFormat | optional, format of binding value. If not specified, the binding value will be a Date object | string,[date formats](https://day.js.org/docs/en/display/format) | - | | + +### Common Events + +| Events Name | Description | Arguments | Version | +| --- | --- | --- | --- | +| openChange | a callback function, can be executed whether the popup calendar is popped up or closed | function(status) | | +| panelChange | callback when picker panel mode is changed | function(value, mode) | | + +### Common Methods + +| Name | Description | Version | +| ------- | ------------ | ------- | +| blur() | remove focus | | +| focus() | get focus | | + +### DatePicker + +| Property | Description | Type | Default | Version | +| --- | --- | --- | --- | --- | +| defaultPickerValue | To set default picker date | [dayjs](https://day.js.org/) | - | | +| disabledTime | To specify the time that cannot be selected | function(date) | - | | +| format | To set the date format, refer to [dayjs](https://day.js.org/). When an array is provided, all values are used for parsing and first value is used for formatting, support [Custom Format](#components-date-picker-demo-format) | string \| (value: dayjs) => string \| (string \| (value: dayjs) => string)\[] | `YYYY-MM-DD` | | +| renderExtraFooter | Render extra footer in panel | v-slot:renderExtraFooter="mode" | - | | +| showNow | Whether to show 'Now' button on panel when `showTime` is set | boolean | - | | +| showTime | To provide an additional time selection | object \| boolean | [TimePicker Options](/components/time-picker/#API) | | +| showTime.defaultValue | To set default time of selected date, [demo](#components-date-picker-demo-disabled-date) | [dayjs](https://day.js.org/) | dayjs() | | +| showToday | Whether to show `Today` button | boolean | true | | +| value(v-model) | To set date | [dayjs](https://day.js.org/) | - | | + +### DatePicker Events + +| Events Name | Description | Arguments | Version | +| --- | --- | --- | --- | +| change | a callback function, can be executed when the selected time is changing | function(date: dayjs \| string, dateString: string) | | +| ok | callback when click ok button | function(date: dayjs \| string) | | + +### DatePicker\[picker=year] + +| Property | Description | Type | Default | Version | +| --- | --- | --- | --- | --- | +| format | To set the date format, refer to [dayjs](https://day.js.org/) | string | `YYYY` | | + +### DatePicker\[picker=quarter] + +| Property | Description | Type | Default | Version | +| --- | --- | --- | --- | --- | +| format | To set the date format, refer to [dayjs](https://day.js.org/) | string | `YYYY-\QQ` | | + +### DatePicker\[picker=month] + +| Property | Description | Type | Default | Version | +| --- | --- | --- | --- | --- | +| format | To set the date format, refer to [dayjs](https://day.js.org/) | string | `YYYY-MM` | | +| monthCellRender | Custom month cell content render method | v-slot:monthCellRender="{current, locale}" | - | | + +### DatePicker\[picker=week] + +| Property | Description | Type | Default | Version | +| --- | --- | --- | --- | --- | +| format | To set the date format, refer to [dayjs](https://day.js.org/) | string | `YYYY-wo` | | + +### RangePicker + +| Property | Description | Type | Default | Version | +| --- | --- | --- | --- | --- | +| allowEmpty | Allow start or end input leave empty | \[boolean, boolean] | \[false, false] | | +| dateRender | Customize date cell. | v-slot:dateRender="{current: dayjs, today: dayjs, info: { range: `start` \| `end` }}" | - | | +| defaultPickerValue | To set default picker date | \[[dayjs](https://day.js.org/), [dayjs](https://day.js.org/)] | - | | +| disabled | If disable start or end | \[boolean, boolean] | - | | +| disabledTime | To specify the time that cannot be selected | function(date: dayjs, partial: `start` \| `end`) | - | | +| format | To set the date format, refer to [dayjs](https://day.js.org/). When an array is provided, all values are used for parsing and first value is used for formatting | string \| string\[] | `YYYY-MM-DD HH:mm:ss` | | +| ranges | The preseted ranges for quick selection | { \[range: string]: [dayjs](https://day.js.org/)\[] } \| { \[range: string]: () => [dayjs](https://day.js.org/)\[] } | - | | +| renderExtraFooter | Render extra footer in panel | v-slot:renderExtraFooter | - | | +| separator | Set separator between inputs | string \| v-slot:separator | `` | | +| showTime | To provide an additional time selection | object \| boolean | [TimePicker Options](/components/time-picker/#API) | | +| showTime.defaultValue | To set default time of selected date, [demo](#components-date-picker-demo-disabled-date) | [dayjs](https://day.js.org/)\[] | \[dayjs(), dayjs()] | | +| value(v-model) | To set date | \[[dayjs](https://day.js.org/), [dayjs](https://day.js.org/)] | - | | + +### RangePicker Events + +| Events Name | Description | Arguments | Version | | +| --- | --- | --- | --- | --- | +| calendarChange | Callback function, can be executed when the start time or the end time of the range is changing. | function(dates: \[dayjs, dayjs], dateStrings: \[string, string], info: { range:`start`\|`end` }) | - | | +| change | a callback function, can be executed when the selected time is changing | function(dates: \[dayjs, dayjs] \| \[string, string], dateStrings: \[string, string]) | | | +| ok | callback when click ok button | function(dates: \[dayjs, dayjs] \| \[string, string]) | | | + +## FAQ + +### How to use DatePicker with customize date library(like moment.js \| dayjs \| date-fns)? + +Please refer [replace date](/docs/vue/replace-date) + +### Why config dayjs.locale globally not work? + +DatePicker default set `locale` as `en` in v4. You can config DatePicker `locale` prop or [ConfigProvider `locale`](/components/config-provider) prop instead. diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/index.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/index.tsx new file mode 100644 index 0000000..c5f053b --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/index.tsx @@ -0,0 +1,4 @@ +import DatePicker from './dayjs'; +export * from './dayjs'; + +export default DatePicker; diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/index.zh-CN.md b/src/components/BasicPacks/BaseDatePicker/src/datePick/index.zh-CN.md new file mode 100644 index 0000000..b1ff2a0 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/index.zh-CN.md @@ -0,0 +1,197 @@ +--- +category: Components +type: 数据录入 +title: DatePicker +subtitle: 日期选择框 +cover: https://gw.alipayobjects.com/zos/alicdn/RT_USzA48/DatePicker.svg +--- + +输入或选择日期的控件。 + +## 何时使用 + +当用户需要输入一个日期,可以点击标准输入框,弹出日期面板进行选择。 + +## API + +日期类组件包括以下五种形式。 + +- DatePicker +- DatePicker\[picker="month"] +- DatePicker\[picker="week"] +- DatePicker\[picker="year"] +- DatePicker\[picker="quarter"] +- RangePicker + +### 国际化配置 + +默认配置为 en-US,如果你需要设置其他语言,推荐在入口处使用我们提供的国际化组件,详见:[ConfigProvider 国际化](/components/config-provider-cn/)。 + +如有特殊需求(仅修改单一组件的语言),请使用 locale 参数,参考:[默认配置](https://github.com/vueComponent/ant-design-vue/blob/main/components/date-picker/locale/example.json)。 + +```html + + +``` + +```html + + +``` + +### 共同的 API + +以下 API 为 DatePicker、 RangePicker 共享的 API。 + +| 参数 | 说明 | 类型 | 默认值 | 版本 | +| --- | --- | --- | --- | --- | +| allowClear | 是否显示清除按钮 | boolean | true | | +| autofocus | 自动获取焦点 | boolean | false | | +| bordered | 是否有边框 | boolean | true | | +| dateRender | 自定义日期单元格的内容 | v-slot:dateRender="{current, today}" | - | | +| disabled | 禁用 | boolean | false | | +| disabledDate | 不可选择的日期 | (currentDate: dayjs) => boolean | - | | +| dropdownClassName | 额外的弹出日历 className | string | - | | +| getPopupContainer | 定义浮层的容器,默认为 body 上新建 div | function(trigger) | - | | +| inputReadOnly | 设置输入框为只读(避免在移动设备上打开虚拟键盘) | boolean | false | | +| locale | 国际化配置 | object | [默认配置](https://github.com/vueComponent/ant-design-vue/blob/main/components/date-picker/locale/example.json) | - | +| mode | 日期面板的状态 | `time` \| `date` \| `month` \| `year` \| `decade` | - | | +| nextIcon | 自定义下一个图标 | slot | - | 3.0 | +| open | 控制弹层是否展开 | boolean | - | | +| picker | 设置选择器类型 | `date` \| `week` \| `month` \| `quarter` \| `year` | `date` | `quarter` | +| placeholder | 输入框提示文字 | string \| \[string, string] | - | | +| popupStyle | 额外的弹出日历样式 | CSSProperties | {} | | +| prevIcon | 自定义上一个图标 | slot | - | 3.0 | +| size | 输入框大小,`large` 高度为 40px,`small` 为 24px,默认是 32px | `large` \| `middle` \| `small` | - | | +| suffixIcon | 自定义的选择框后缀图标 | v-slot:suffixIcon | - | | +| superNextIcon | 自定义 `<<` 切换图标 | slot | - | 3.0 | +| superPrevIcon | 自定义 `>>` 切换图标 | slot | - | 3.0 | +| valueFormat | 可选,绑定值的格式,对 value、defaultValue、defaultPickerValue 起作用。不指定则绑定值为 dayjs 对象 | string,[具体格式](https://day.js.org/docs/zh-CN/display/format) | - | | + +### 共有的事件 + +| 事件名称 | 说明 | 回调参数 | | +| ----------- | ------------------------ | --------------------- | --- | +| openChange | 弹出日历和关闭日历的回调 | function(status) | | +| panelChange | 日期面板变化时的回调 | function(value, mode) | - | + +### 共同的方法 + +| 名称 | 描述 | +| ------- | -------- | +| blur() | 移除焦点 | +| focus() | 获取焦点 | + +### DatePicker + +| 参数 | 说明 | 类型 | 默认值 | 版本 | +| --- | --- | --- | --- | --- | +| defaultPickerValue | 默认面板日期 | [dayjs](https://day.js.org/) | - | | +| disabledTime | 不可选择的时间 | function(date) | - | | +| format | 设置日期格式,为数组时支持多格式匹配,展示以第一个为准。配置参考 [dayjs](https://day.js.org/docs/zh-CN/display/format),支持[自定义格式](#components-date-picker-demo-format) | string \| (value: dayjs) => string \| (string \| (value: dayjs) => string)\[] | `YYYY-MM-DD` | | +| renderExtraFooter | 在面板中添加额外的页脚 | v-slot:renderExtraFooter="mode" | - | | +| showNow | 当设定了 `showTime` 的时候,面板是否显示“此刻”按钮 | boolean | - | | +| showTime | 增加时间选择功能 | Object \| boolean | [TimePicker Options](/components/time-picker/#API) | | +| showTime.defaultValue | 设置用户选择日期时默认的时分秒,[例子](#components-date-picker-demo-disabled-date) | [dayjs](https://day.js.org/) | dayjs() | | +| showToday | 是否展示“今天”按钮 | boolean | true | | +| value(v-model) | 日期 | [dayjs](https://day.js.org/) | - | | + +### DatePicker 事件 + +| 事件名称 | 说明 | 回调参数 | +| -------- | ------------------ | --------------------------------------------------- | +| change | 时间发生变化的回调 | function(date: dayjs \| string, dateString: string) | +| ok | 点击确定按钮的回调 | function(date: dayjs \| string) | + +### DatePicker\[picker=year] + +| 参数 | 说明 | 类型 | 默认值 | 版本 | +| --- | --- | --- | --- | --- | +| format | 展示的日期格式,配置参考 [dayjs](https://day.js.org/docs/zh-CN/display/format) | string | `YYYY` | | + +### DatePicker\[picker=quarter] + +| 参数 | 说明 | 类型 | 默认值 | 版本 | +| --- | --- | --- | --- | --- | +| format | 展示的日期格式,配置参考 [dayjs](https://day.js.org/docs/zh-CN/display/format) | string | `YYYY-\QQ` | | + +### DatePicker\[picker=month] + +| 参数 | 说明 | 类型 | 默认值 | 版本 | +| --- | --- | --- | --- | --- | +| format | 展示的日期格式,配置参考 [dayjs](https://day.js.org/docs/zh-CN/display/format) | string | `YYYY-MM` | | +| monthCellRender | 自定义的月份内容渲染方法 | v-slot:monthCellRender="{current, locale}" | - | | + +### DatePicker\[picker=week] + +| 参数 | 说明 | 类型 | 默认值 | 版本 | +| --- | --- | --- | --- | --- | +| format | 展示的日期格式,配置参考 [dayjs](https://day.js.org/docs/zh-CN/display/format) | string | `YYYY-wo` | | + +### RangePicker + +| 参数 | 说明 | 类型 | 默认值 | 版本 | +| --- | --- | --- | --- | --- | +| allowEmpty | 允许起始项部分为空 | \[boolean, boolean] | \[false, false] | | +| dateRender | 自定义日期单元格的内容。 | v-slot:dateRender="{current: dayjs, today: dayjs, info: { range: `start` \| `end` }}" | - | | +| defaultPickerValue | 默认面板日期 | [dayjs](https://day.js.org/)\[] | - | | +| disabled | 禁用起始项 | \[boolean, boolean] | - | | +| disabledTime | 不可选择的时间 | function(date: dayjs, partial: `start` \| `end`) | - | | +| format | 展示的日期格式 | string | `YYYY-MM-DD HH:mm:ss` | | +| ranges | 预设时间范围快捷选择 | { \[range: string]: [dayjs](https://day.js.org/)\[] } \| { \[range: string]: () => [dayjs](https://day.js.org/)\[] } | - | | +| renderExtraFooter | 在面板中添加额外的页脚 | () => React.ReactNode | - | | +| separator | 设置分隔符 | string \| v-slot:separator | `` | | +| showTime | 增加时间选择功能 | Object\|boolean | [TimePicker Options](/components/time-picker/#API) | | +| showTime.defaultValue | 设置用户选择日期时默认的时分秒,[例子](#components-date-picker-demo-disabled-date) | [dayjs](https://day.js.org/)\[] | \[dayjs(), dayjs()] | | +| value(v-model) | 日期 | [dayjs](https://day.js.org/)\[] | - | | + +### RangePicker 事件 + +| 事件名称 | 说明 | 回调参数 | +| --- | --- | --- | +| calendarChange | 待选日期发生变化的回调 | function(dates: \[dayjs, dayjs] \| \[string, string], dateStrings: \[string, string], info: { range:`start`\|`end` }) | +| change | 日期范围发生变化的回调 | function(dates: \[dayjs, dayjs] \| \[string, string], dateStrings: \[string, string]) | +| ok | 点击确定按钮的回调 | function(dates: \[dayjs, dayjs] \| \[string, string]) | + +## FAQ + +### 如何在 DatePicker 中使用自定义日期库(如 moment.js \| dayjs \| date-fns)? + +请参考[《自定义日期库》](/docs/vue/replace-date-cn) + +### 为何全局修改 dayjs.locale 不生效? + +DatePicker 默认 `locale` 为 `en`。你可以通过 DatePicker 的 `locale` 属性来单独设置,也可以通过 [ConfigProvider `locale`](/components/config-provider-cn) 属性来配置。 diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/ar_EG.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/ar_EG.tsx new file mode 100644 index 0000000..ed6a129 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/ar_EG.tsx @@ -0,0 +1,24 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/ar_EG' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/ar_EG' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'اختيار التاريخ', + rangePlaceholder: ['البداية', 'النهاية'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + }, + dateFormat: 'DD-MM-YYYY', + monthFormat: 'MM-YYYY', + dateTimeFormat: 'DD-MM-YYYY HH:mm:ss', + weekFormat: 'wo-YYYY' +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/az_AZ.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/az_AZ.tsx new file mode 100644 index 0000000..014e91d --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/az_AZ.tsx @@ -0,0 +1,16 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/az_AZ' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/az_AZ' +import type { PickerLocale } from '../generatePicker' + +const locale: PickerLocale = { + lang: { + placeholder: 'Tarix seçin', + rangePlaceholder: ['Başlama tarixi', 'Bitmə tarixi'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/bg_BG.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/bg_BG.tsx new file mode 100644 index 0000000..bd15134 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/bg_BG.tsx @@ -0,0 +1,20 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/bg_BG' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/bg_BG' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'Избор на дата', + rangePlaceholder: ['Начална', 'Крайна'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/bn_BD.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/bn_BD.tsx new file mode 100644 index 0000000..51b60d4 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/bn_BD.tsx @@ -0,0 +1,27 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/bn_BD' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/bn_BD' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'তারিখ নির্বাচন', + yearPlaceholder: 'বছর নির্বাচন', + quarterPlaceholder: 'কোয়ার্টার নির্বাচন', + monthPlaceholder: 'মাস নির্বাচন', + weekPlaceholder: 'সপ্তাহ নির্বাচন', + rangePlaceholder: ['শুরুর তারিখ', 'শেষ তারিখ'], + rangeYearPlaceholder: ['শুরুর বছর', 'শেষ বছর'], + rangeMonthPlaceholder: ['শুরুর মাস', 'শেষ মাস'], + rangeWeekPlaceholder: ['শুরুর সপ্তাহ', 'শেষ সপ্তাহ'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/by_BY.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/by_BY.tsx new file mode 100644 index 0000000..4cbfb11 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/by_BY.tsx @@ -0,0 +1,23 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/by_BY' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/by_BY' +import type { PickerLocale } from '../generatePicker' + +const locale: PickerLocale = { + lang: { + placeholder: 'Выберыце дату', + yearPlaceholder: 'Выберыце год', + quarterPlaceholder: 'Выберыце квартал', + monthPlaceholder: 'Выберыце месяц', + weekPlaceholder: 'Выберыце тыдзень', + rangePlaceholder: ['Пачатковая дата', 'Канчатковая дата'], + rangeYearPlaceholder: ['Пачатковы год', 'Год заканчэння'], + rangeMonthPlaceholder: ['Пачатковы месяц', 'Канчатковы месяц'], + rangeWeekPlaceholder: ['Пачатковы тыдзень', 'Канчатковы тыдзень'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/ca_ES.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/ca_ES.tsx new file mode 100644 index 0000000..fcbc81f --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/ca_ES.tsx @@ -0,0 +1,20 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/ca_ES' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/ca_ES' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'Seleccionar data', + rangePlaceholder: ['Data inicial', 'Data final'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/cs_CZ.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/cs_CZ.tsx new file mode 100644 index 0000000..9463232 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/cs_CZ.tsx @@ -0,0 +1,20 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/cs_CZ' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/cs_CZ' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'Vybrat datum', + rangePlaceholder: ['Od', 'Do'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/da_DK.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/da_DK.tsx new file mode 100644 index 0000000..d4c9bb7 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/da_DK.tsx @@ -0,0 +1,20 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/da_DK' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/da_DK' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'Vælg dato', + rangePlaceholder: ['Startdato', 'Slutdato'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/de_DE.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/de_DE.tsx new file mode 100644 index 0000000..c666ea8 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/de_DE.tsx @@ -0,0 +1,20 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/de_DE' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/de_DE' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'Datum auswählen', + rangePlaceholder: ['Startdatum', 'Enddatum'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/issues/424 + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/el_GR.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/el_GR.tsx new file mode 100644 index 0000000..dd7c1ee --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/el_GR.tsx @@ -0,0 +1,20 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/el_GR' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/el_GR' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'Επιλέξτε ημερομηνία', + rangePlaceholder: ['Αρχική ημερομηνία', 'Τελική ημερομηνία'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/issues/424 + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/en_GB.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/en_GB.tsx new file mode 100644 index 0000000..61769aa --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/en_GB.tsx @@ -0,0 +1,28 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/en_GB' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/en_GB' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'Select date', + yearPlaceholder: 'Select year', + quarterPlaceholder: 'Select quarter', + monthPlaceholder: 'Select month', + weekPlaceholder: 'Select week', + rangePlaceholder: ['Start date', 'End date'], + rangeYearPlaceholder: ['Start year', 'End year'], + rangeQuarterPlaceholder: ['Start quarter', 'End quarter'], + rangeMonthPlaceholder: ['Start month', 'End month'], + rangeWeekPlaceholder: ['Start week', 'End week'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/en_US.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/en_US.tsx new file mode 100644 index 0000000..e4be5d5 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/en_US.tsx @@ -0,0 +1,28 @@ +import CalendarLocale from 'ant-design-vue/es/vc-picker/locale/en_US'; +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/en_US'; +import type { PickerLocale } from '../generatePicker'; + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'Select date', + yearPlaceholder: 'Select year', + quarterPlaceholder: 'Select quarter', + monthPlaceholder: 'Select month', + weekPlaceholder: 'Select week', + rangePlaceholder: ['Start date', 'End date'], + rangeYearPlaceholder: ['Start year', 'End year'], + rangeQuarterPlaceholder: ['Start quarter', 'End quarter'], + rangeMonthPlaceholder: ['Start month', 'End month'], + rangeWeekPlaceholder: ['Start week', 'End week'], + ...CalendarLocale, + }, + timePickerLocale: { + ...TimePickerLocale, + }, +}; + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/es_ES.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/es_ES.tsx new file mode 100644 index 0000000..c1fe019 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/es_ES.tsx @@ -0,0 +1,20 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/es_ES' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/es_ES' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'Seleccionar fecha', + rangePlaceholder: ['Fecha inicial', 'Fecha final'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/et_EE.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/et_EE.tsx new file mode 100644 index 0000000..9a2eb77 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/et_EE.tsx @@ -0,0 +1,20 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/et_EE' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/et_EE' +import type { PickerLocale } from '../generatePicker' + +// 统一合并为完整的 Locale +const locale: PickerLocale = { + lang: { + placeholder: 'Vali kuupäev', + rangePlaceholder: ['Algus kuupäev', 'Lõpu kuupäev'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/example.json b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/example.json new file mode 100644 index 0000000..5a6fcf2 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/example.json @@ -0,0 +1,40 @@ +{ + "lang": { + "locale": "en_US", + "placeholder": "Select date", + "rangePlaceholder": ["Start date", "End date"], + "today": "Today", + "now": "Now", + "backToToday": "Back to today", + "ok": "OK", + "clear": "Clear", + "month": "Month", + "year": "Year", + "timeSelect": "Select time", + "dateSelect": "Select date", + "monthSelect": "Choose a month", + "yearSelect": "Choose a year", + "decadeSelect": "Choose a decade", + "yearFormat": "YYYY", + "dateFormat": "M/D/YYYY", + "dayFormat": "D", + "dateTimeFormat": "M/D/YYYY HH:mm:ss", + "monthFormat": "MMMM", + "monthBeforeYear": true, + "previousMonth": "Previous month (PageUp)", + "nextMonth": "Next month (PageDown)", + "previousYear": "Last year (Control + left)", + "nextYear": "Next year (Control + right)", + "previousDecade": "Last decade", + "nextDecade": "Next decade", + "previousCentury": "Last century", + "nextCentury": "Next century" + }, + "timePickerLocale": { + "placeholder": "Select time" + }, + "dateFormat": "YYYY-MM-DD", + "dateTimeFormat": "YYYY-MM-DD HH:mm:ss", + "weekFormat": "YYYY-wo", + "monthFormat": "YYYY-MM" +} diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/fa_IR.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/fa_IR.tsx new file mode 100644 index 0000000..01f8c1b --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/fa_IR.tsx @@ -0,0 +1,27 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/fa_IR' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/fa_IR' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'انتخاب تاریخ', + yearPlaceholder: 'انتخاب سال', + quarterPlaceholder: 'انتخاب فصل', + monthPlaceholder: 'انتخاب ماه', + weekPlaceholder: 'انتخاب هفته', + rangePlaceholder: ['تاریخ شروع', 'تاریخ پایان'], + rangeYearPlaceholder: ['سال شروع', 'سال پایان'], + rangeMonthPlaceholder: ['ماه شروع', 'ماه پایان'], + rangeWeekPlaceholder: ['هفته شروع', 'هفته پایان'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/fi_FI.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/fi_FI.tsx new file mode 100644 index 0000000..d548890 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/fi_FI.tsx @@ -0,0 +1,20 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/fi_FI' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/fi_FI' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'Valitse päivä', + rangePlaceholder: ['Alkamispäivä', 'Päättymispäivä'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/fr_BE.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/fr_BE.tsx new file mode 100644 index 0000000..7e98cd5 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/fr_BE.tsx @@ -0,0 +1,20 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/fr_BE' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/fr_BE' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'Sélectionner une date', + rangePlaceholder: ['Date de début', 'Date de fin'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/issues/424 + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/fr_CA.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/fr_CA.tsx new file mode 100644 index 0000000..d8e7764 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/fr_CA.tsx @@ -0,0 +1,27 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/fr_CA' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/fr_CA' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'Sélectionner une date', + yearPlaceholder: 'Sélectionner une année', + quarterPlaceholder: 'Sélectionner un trimestre', + monthPlaceholder: 'Sélectionner un mois', + weekPlaceholder: 'Sélectionner une semaine', + rangePlaceholder: ['Date de début', 'Date de fin'], + rangeYearPlaceholder: ['Année de début', 'Année de fin'], + rangeMonthPlaceholder: ['Mois de début', 'Mois de fin'], + rangeWeekPlaceholder: ['Semaine de début', 'Semaine de fin'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/issues/424 + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/fr_FR.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/fr_FR.tsx new file mode 100644 index 0000000..b9e6dc7 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/fr_FR.tsx @@ -0,0 +1,27 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/fr_FR' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/fr_FR' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'Sélectionner une date', + yearPlaceholder: 'Sélectionner une année', + quarterPlaceholder: 'Sélectionner un trimestre', + monthPlaceholder: 'Sélectionner un mois', + weekPlaceholder: 'Sélectionner une semaine', + rangePlaceholder: ['Date de début', 'Date de fin'], + rangeYearPlaceholder: ['Année de début', 'Année de fin'], + rangeMonthPlaceholder: ['Mois de début', 'Mois de fin'], + rangeWeekPlaceholder: ['Semaine de début', 'Semaine de fin'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/issues/424 + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/ga_IE.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/ga_IE.tsx new file mode 100644 index 0000000..6a5c191 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/ga_IE.tsx @@ -0,0 +1,27 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/ga_IE' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/ga_IE' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'Roghnaigh dáta', + yearPlaceholder: 'Roghnaigh bliain', + quarterPlaceholder: 'Roghnaigh ráithe', + monthPlaceholder: 'Roghnaigh mí', + weekPlaceholder: 'Roghnaigh seachtain', + rangePlaceholder: ['Dáta tosaigh', 'Dáta deiridh'], + rangeYearPlaceholder: ['Tús na bliana', 'Deireadh na bliana'], + rangeMonthPlaceholder: ['Tosaigh mhí', 'Deireadh mhí'], + rangeWeekPlaceholder: ['Tosaigh an tseachtain', 'Deireadh na seachtaine'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/gl_ES.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/gl_ES.tsx new file mode 100644 index 0000000..0994d8b --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/gl_ES.tsx @@ -0,0 +1,20 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/gl_ES' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/gl_ES' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'Escolla data', + rangePlaceholder: ['Data inicial', 'Data final'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/he_IL.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/he_IL.tsx new file mode 100644 index 0000000..1d560ad --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/he_IL.tsx @@ -0,0 +1,20 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/he_IL' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/he_IL' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'בחר תאריך', + rangePlaceholder: ['תאריך התחלה', 'תאריך סיום'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/hi_IN.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/hi_IN.tsx new file mode 100644 index 0000000..2f83531 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/hi_IN.tsx @@ -0,0 +1,27 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/hi_IN' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/hi_IN' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'तारीख़ चुनें', + yearPlaceholder: 'वर्ष चुनें', + quarterPlaceholder: 'तिमाही चुनें', + monthPlaceholder: 'महीना चुनिए', + weekPlaceholder: 'सप्ताह चुनें', + rangePlaceholder: ['प्रारंभ तिथि', 'समाप्ति तिथि'], + rangeYearPlaceholder: ['आरंभिक वर्ष', 'अंत वर्ष'], + rangeMonthPlaceholder: ['आरंभिक महीना', 'अंत महीना'], + rangeWeekPlaceholder: ['आरंभिक सप्ताह', 'अंत सप्ताह'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/hr_HR.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/hr_HR.tsx new file mode 100644 index 0000000..e46a0c1 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/hr_HR.tsx @@ -0,0 +1,27 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/hr_HR' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/hr_HR' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'Odaberite datum', + yearPlaceholder: 'Odaberite godinu', + quarterPlaceholder: 'Odaberite četvrtinu', + monthPlaceholder: 'Odaberite mjesec', + weekPlaceholder: 'Odaberite tjedan', + rangePlaceholder: ['Početni datum', 'Završni datum'], + rangeYearPlaceholder: ['Početna godina', 'Završna godina'], + rangeMonthPlaceholder: ['Početni mjesec', 'Završni mjesec'], + rangeWeekPlaceholder: ['Početni tjedan', 'Završni tjedan'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/hu_HU.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/hu_HU.tsx new file mode 100644 index 0000000..35194c9 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/hu_HU.tsx @@ -0,0 +1,20 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/hu_HU' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/hu_HU' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'Válasszon dátumot', + rangePlaceholder: ['Kezdő dátum', 'Befejezés dátuma'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/id_ID.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/id_ID.tsx new file mode 100644 index 0000000..c4d8a05 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/id_ID.tsx @@ -0,0 +1,20 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/id_ID' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/id_ID' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'Pilih tanggal', + rangePlaceholder: ['Mulai tanggal', 'Tanggal akhir'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/is_IS.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/is_IS.tsx new file mode 100644 index 0000000..64115a9 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/is_IS.tsx @@ -0,0 +1,20 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/is_IS' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/is_IS' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'Veldu dag', + rangePlaceholder: ['Upphafsdagur', 'Lokadagur'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/it_IT.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/it_IT.tsx new file mode 100644 index 0000000..5b341a9 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/it_IT.tsx @@ -0,0 +1,20 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/it_IT' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/it_IT' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'Selezionare la data', + rangePlaceholder: ["Data d'inizio", 'Data di fine'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/issues/424 + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/ja_JP.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/ja_JP.tsx new file mode 100644 index 0000000..561c5e6 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/ja_JP.tsx @@ -0,0 +1,20 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/ja_JP' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/ja_JP' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: '日付を選択', + rangePlaceholder: ['開始日付', '終了日付'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/ka_GE.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/ka_GE.tsx new file mode 100644 index 0000000..aee1fec --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/ka_GE.tsx @@ -0,0 +1,23 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/ka_GE' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/ka_GE' +import type { PickerLocale } from '../generatePicker' + +const locale: PickerLocale = { + lang: { + placeholder: 'აირჩიეთ თარიღი', + yearPlaceholder: 'აირჩიეთ წელი', + quarterPlaceholder: 'აირჩიეთ მეოთხედი', + monthPlaceholder: 'აირჩიეთ თვე', + weekPlaceholder: 'აირჩიეთ კვირა', + rangePlaceholder: ['საწყისი თარიღი', 'საბოლოო თარიღი'], + rangeYearPlaceholder: ['საწყისი წელი', 'საბოლოო წელი'], + rangeMonthPlaceholder: ['საწყისი თვე', 'საბოლოო თვე'], + rangeWeekPlaceholder: ['საწყისი კვირა', 'საბოლოო კვირა'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/kk_KZ.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/kk_KZ.tsx new file mode 100644 index 0000000..f505d15 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/kk_KZ.tsx @@ -0,0 +1,27 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/kk_KZ' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/kk_KZ' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'Күнді таңдаңыз', + yearPlaceholder: 'Жылды таңдаңыз', + quarterPlaceholder: 'Тоқсанды таңдаңыз', + monthPlaceholder: 'Айды таңдаңыз', + weekPlaceholder: 'Аптаны таңдаңыз', + rangePlaceholder: ['Бастау күні', 'Аяқталу күні'], + rangeYearPlaceholder: ['Бастау жылы', 'Аяқталу жылы'], + rangeMonthPlaceholder: ['Бастау айы', 'Аяқталу айы'], + rangeWeekPlaceholder: ['Бастау апта', 'Аяқталу апта'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/km_KH.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/km_KH.tsx new file mode 100644 index 0000000..6ae99d4 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/km_KH.tsx @@ -0,0 +1,27 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/km_KH' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/km_KH' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'រើសថ្ងៃ', + yearPlaceholder: 'រើសឆ្នាំ', + quarterPlaceholder: 'រើសត្រីមាស', + monthPlaceholder: 'រើសខែ', + weekPlaceholder: 'រើសសប្តាហ៍', + rangePlaceholder: ['ថ្ងៃចាប់ផ្ដើម', 'ថ្ងៃបញ្ចប់'], + rangeYearPlaceholder: ['ឆ្នាំចាប់ផ្ដើម', 'ឆ្នាំបញ្ចប់'], + rangeMonthPlaceholder: ['ខែចាប់ផ្ដើម', 'ខែបញ្ចប់'], + rangeWeekPlaceholder: ['សប្ដាហ៍ចាប់ផ្ដើម', 'សប្ដាហ៍បញ្ចប់'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/kmr_IQ.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/kmr_IQ.tsx new file mode 100644 index 0000000..9e1d38d --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/kmr_IQ.tsx @@ -0,0 +1,19 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/kmr_IQ' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/kmr_IQ' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'Dîrok hilbijêre', + rangePlaceholder: ['Dîroka destpêkê', 'Dîroka dawîn'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/kn_IN.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/kn_IN.tsx new file mode 100644 index 0000000..c1afb3e --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/kn_IN.tsx @@ -0,0 +1,20 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/kn_IN' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/kn_IN' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'ದಿನಾಂಕ ಆಯ್ಕೆಮಾಡಿ', + rangePlaceholder: ['ಪ್ರಾರಂಭ ದಿನಾಂಕ', 'ಅಂತಿಮ ದಿನಾಂಕ'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/ko_KR.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/ko_KR.tsx new file mode 100644 index 0000000..ab3499f --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/ko_KR.tsx @@ -0,0 +1,20 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/ko_KR' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/ko_KR' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: '날짜 선택', + rangePlaceholder: ['시작일', '종료일'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/lt_LT.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/lt_LT.tsx new file mode 100644 index 0000000..a5e78aa --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/lt_LT.tsx @@ -0,0 +1,27 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/lt_LT' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/lt_LT' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'Pasirinkite datą', + yearPlaceholder: 'Pasirinkite metus', + quarterPlaceholder: 'Pasirinkite ketvirtį', + monthPlaceholder: 'Pasirinkite mėnesį', + weekPlaceholder: 'Pasirinkite savaitę', + rangePlaceholder: ['Pradžios data', 'Pabaigos data'], + rangeYearPlaceholder: ['Pradžios metai', 'Pabaigos metai'], + rangeMonthPlaceholder: ['Pradžios mėnesis', 'Pabaigos mėnesis'], + rangeWeekPlaceholder: ['Pradžios savaitė', 'Pabaigos savaitė'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/lv_LV.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/lv_LV.tsx new file mode 100644 index 0000000..25e7351 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/lv_LV.tsx @@ -0,0 +1,20 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/lv_LV' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/lv_LV' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'Izvēlieties datumu', + rangePlaceholder: ['Sākuma datums', 'Beigu datums'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/mk_MK.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/mk_MK.tsx new file mode 100644 index 0000000..ef8c7a3 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/mk_MK.tsx @@ -0,0 +1,20 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/mk_MK' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/mk_MK' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'Избери датум', + rangePlaceholder: ['Од датум', 'До датум'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/ml_IN.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/ml_IN.tsx new file mode 100644 index 0000000..25d07cf --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/ml_IN.tsx @@ -0,0 +1,27 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/ml_IN' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/ml_IN' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'തിയതി തിരഞ്ഞെടുക്കുക', + yearPlaceholder: 'വർഷം തിരഞ്ഞെടുക്കുക', + quarterPlaceholder: 'ത്രൈമാസം തിരഞ്ഞെടുക്കുക', + monthPlaceholder: 'മാസം തിരഞ്ഞെടുക്കുക', + weekPlaceholder: 'വാരം തിരഞ്ഞെടുക്കുക', + rangePlaceholder: ['ആരംഭ ദിനം', 'അവസാന ദിനം'], + rangeYearPlaceholder: ['ആരംഭ വർഷം', 'അവസാന വർഷം'], + rangeMonthPlaceholder: ['ആരംഭ മാസം', 'അവസാന മാസം'], + rangeWeekPlaceholder: ['ആരംഭ വാരം', 'അവസാന വാരം'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/mn_MN.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/mn_MN.tsx new file mode 100644 index 0000000..ff9f3e4 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/mn_MN.tsx @@ -0,0 +1,20 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/mn_MN' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/mn_MN' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'Огноо сонгох', + rangePlaceholder: ['Эхлэх огноо', 'Дуусах огноо'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/ms_MY.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/ms_MY.tsx new file mode 100644 index 0000000..d21ab5f --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/ms_MY.tsx @@ -0,0 +1,20 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/ms_MY' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/ms_MY' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'Pilih tarikh', + rangePlaceholder: ['Tarikh mula', 'Tarikh akhir'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/nb_NO.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/nb_NO.tsx new file mode 100644 index 0000000..1fc4afb --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/nb_NO.tsx @@ -0,0 +1,27 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/nb_NO' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/nb_NO' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'Velg dato', + yearPlaceholder: 'Velg år', + quarterPlaceholder: 'Velg kvartal', + monthPlaceholder: 'Velg måned', + weekPlaceholder: 'Velg uke', + rangePlaceholder: ['Startdato', 'Sluttdato'], + rangeYearPlaceholder: ['Startår', 'Sluttår'], + rangeMonthPlaceholder: ['Startmåned', 'Sluttmåned'], + rangeWeekPlaceholder: ['Start uke', 'Sluttuke'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/nl_BE.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/nl_BE.tsx new file mode 100644 index 0000000..301aa92 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/nl_BE.tsx @@ -0,0 +1,27 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/nl_BE' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/nl_BE' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + monthPlaceholder: 'Selecteer maand', + placeholder: 'Selecteer datum', + quarterPlaceholder: 'Selecteer kwartaal', + rangeMonthPlaceholder: ['Begin maand', 'Eind maand'], + rangePlaceholder: ['Begin datum', 'Eind datum'], + rangeWeekPlaceholder: ['Begin week', 'Eind week'], + rangeYearPlaceholder: ['Begin jaar', 'Eind jaar'], + weekPlaceholder: 'Selecteer week', + yearPlaceholder: 'Selecteer jaar', + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/issues/424 + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/nl_NL.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/nl_NL.tsx new file mode 100644 index 0000000..297e629 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/nl_NL.tsx @@ -0,0 +1,27 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/nl_NL' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/nl_NL' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + monthPlaceholder: 'Selecteer maand', + placeholder: 'Selecteer datum', + quarterPlaceholder: 'Selecteer kwartaal', + rangeMonthPlaceholder: ['Begin maand', 'Eind maand'], + rangePlaceholder: ['Begin datum', 'Eind datum'], + rangeWeekPlaceholder: ['Begin week', 'Eind week'], + rangeYearPlaceholder: ['Begin jaar', 'Eind jaar'], + weekPlaceholder: 'Selecteer week', + yearPlaceholder: 'Selecteer jaar', + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/issues/424 + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/pl_PL.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/pl_PL.tsx new file mode 100644 index 0000000..e9c776f --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/pl_PL.tsx @@ -0,0 +1,20 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/pl_PL' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/pl_PL' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'Wybierz datę', + rangePlaceholder: ['Data początkowa', 'Data końcowa'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/pt_BR.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/pt_BR.tsx new file mode 100644 index 0000000..6e245df --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/pt_BR.tsx @@ -0,0 +1,20 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/pt_BR' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/pt_BR' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'Selecionar data', + rangePlaceholder: ['Data inicial', 'Data final'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/pt_PT.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/pt_PT.tsx new file mode 100644 index 0000000..5a6d738 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/pt_PT.tsx @@ -0,0 +1,47 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/pt_PT' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/pt_PT' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + ...CalendarLocale, + placeholder: 'Data', + rangePlaceholder: ['Data inicial', 'Data final'], + today: 'Hoje', + now: 'Agora', + backToToday: 'Hoje', + ok: 'OK', + clear: 'Limpar', + month: 'Mês', + year: 'Ano', + timeSelect: 'Hora', + dateSelect: 'Selecionar data', + monthSelect: 'Selecionar mês', + yearSelect: 'Selecionar ano', + decadeSelect: 'Selecionar década', + yearFormat: 'YYYY', + dateFormat: 'D/M/YYYY', + dayFormat: 'D', + dateTimeFormat: 'D/M/YYYY HH:mm:ss', + monthFormat: 'MMMM', + monthBeforeYear: false, + previousMonth: 'Mês anterior (PageUp)', + nextMonth: 'Mês seguinte (PageDown)', + previousYear: 'Ano anterior (Control + left)', + nextYear: 'Ano seguinte (Control + right)', + previousDecade: 'Última década', + nextDecade: 'Próxima década', + previousCentury: 'Último século', + nextCentury: 'Próximo século' + }, + timePickerLocale: { + ...TimePickerLocale, + placeholder: 'Hora' + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/ro_RO.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/ro_RO.tsx new file mode 100644 index 0000000..46bccd9 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/ro_RO.tsx @@ -0,0 +1,20 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/ro_RO' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/ro_RO' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'Selectează data', + rangePlaceholder: ['Data start', 'Data sfârșit'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/ru_RU.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/ru_RU.tsx new file mode 100644 index 0000000..41006df --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/ru_RU.tsx @@ -0,0 +1,29 @@ +/** Created by Andrey Gayvoronsky on 13/04/16. */ + +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/ru_RU' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/ru_RU' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'Выберите дату', + yearPlaceholder: 'Выберите год', + quarterPlaceholder: 'Выберите квартал', + monthPlaceholder: 'Выберите месяц', + weekPlaceholder: 'Выберите неделю', + rangePlaceholder: ['Начальная дата', 'Конечная дата'], + rangeYearPlaceholder: ['Начальный год', 'Год окончания'], + rangeMonthPlaceholder: ['Начальный месяц', 'Конечный месяц'], + rangeWeekPlaceholder: ['Начальная неделя', 'Конечная неделя'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/sk_SK.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/sk_SK.tsx new file mode 100644 index 0000000..5691c97 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/sk_SK.tsx @@ -0,0 +1,20 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/sk_SK' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/sk_SK' +import type { PickerLocale } from '../generatePicker' + +// 统一合并为完整的 Locale +const locale: PickerLocale = { + lang: { + placeholder: 'Vybrať dátum', + rangePlaceholder: ['Od', 'Do'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/sl_SI.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/sl_SI.tsx new file mode 100644 index 0000000..b478fd1 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/sl_SI.tsx @@ -0,0 +1,45 @@ +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/sl_SI'; +import type { PickerLocale } from '../generatePicker'; + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + locale: 'sl', + placeholder: 'Izberite datum', + rangePlaceholder: ['Začetni datum', 'Končni datum'], + today: 'Danes', + now: 'Trenutno', + backToToday: 'Nazaj na trenutni datum', + ok: 'OK', + clear: 'Počisti', + month: 'Mesec', + year: 'Leto', + timeSelect: 'Izberi čas', + dateSelect: 'Izberi datum', + monthSelect: 'Izberite mesec', + yearSelect: 'Izberite leto', + decadeSelect: 'Izberite desetletje', + yearFormat: 'YYYY', + dateFormat: 'D.M.YYYY', + dayFormat: 'D', + dateTimeFormat: 'D.M.YYYY HH:mm:ss', + monthFormat: 'MMMM', + monthBeforeYear: true, + previousMonth: 'Prejšnji mesec (PageUp)', + nextMonth: 'Naslednji mesec (PageDown)', + previousYear: 'Lansko leto (Control + left)', + nextYear: 'Naslednje leto (Control + right)', + previousDecade: 'Prejšnje desetletje', + nextDecade: 'Naslednje desetletje', + previousCentury: 'Zadnje stoletje', + nextCentury: 'Naslednje stoletje', + }, + timePickerLocale: { + ...TimePickerLocale, + }, +}; + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/sr_RS.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/sr_RS.tsx new file mode 100644 index 0000000..3877c75 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/sr_RS.tsx @@ -0,0 +1,27 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/sr_RS' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/sr_RS' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'Izaberi datum', + yearPlaceholder: 'Izaberi godinu', + quarterPlaceholder: 'Izaberi tromesečje', + monthPlaceholder: 'Izaberi mesec', + weekPlaceholder: 'Izaberi sedmicu', + rangePlaceholder: ['Datum početka', 'Datum završetka'], + rangeYearPlaceholder: ['Godina početka', 'Godina završetka'], + rangeMonthPlaceholder: ['Mesec početka', 'Mesec završetka'], + rangeWeekPlaceholder: ['Sedmica početka', 'Sedmica završetka'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/sv_SE.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/sv_SE.tsx new file mode 100644 index 0000000..19f4822 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/sv_SE.tsx @@ -0,0 +1,27 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/sv_SE' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/sv_SE' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'Välj datum', + yearPlaceholder: 'Välj år', + quarterPlaceholder: 'Välj kvartal', + monthPlaceholder: 'Välj månad', + weekPlaceholder: 'Välj vecka', + rangePlaceholder: ['Startdatum', 'Slutdatum'], + rangeYearPlaceholder: ['Startår', 'Slutår'], + rangeMonthPlaceholder: ['Startmånad', 'Slutmånad'], + rangeWeekPlaceholder: ['Startvecka', 'Slutvecka'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/ta_IN.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/ta_IN.tsx new file mode 100644 index 0000000..7083bc5 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/ta_IN.tsx @@ -0,0 +1,21 @@ +// Tamil Locale added to rc-calendar +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/ta_IN' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/ta_IN' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'தேதியைத் தேர்ந்தெடுக்கவும்', + rangePlaceholder: ['தொடக்க தேதி', 'கடைசி தேதி'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/th_TH.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/th_TH.tsx new file mode 100644 index 0000000..1a8330b --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/th_TH.tsx @@ -0,0 +1,27 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/th_TH' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/th_TH' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'เลือกวันที่', + yearPlaceholder: 'เลือกปี', + quarterPlaceholder: 'เลือกไตรมาส', + monthPlaceholder: 'เลือกเดือน', + weekPlaceholder: 'เลือกสัปดาห์', + rangePlaceholder: ['วันเริ่มต้น', 'วันสิ้นสุด'], + rangeYearPlaceholder: ['ปีเริ่มต้น', 'ปีสิ้นสุด'], + rangeMonthPlaceholder: ['เดือนเริ่มต้น', 'เดือนสิ้นสุด'], + rangeWeekPlaceholder: ['สัปดาห์เริ่มต้น', 'สัปดาห์สิ้นสุด'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/tr_TR.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/tr_TR.tsx new file mode 100644 index 0000000..2faf05a --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/tr_TR.tsx @@ -0,0 +1,28 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/tr_TR' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/tr_TR' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'Tarih seç', + yearPlaceholder: 'Yıl seç', + quarterPlaceholder: 'Çeyrek seç', + monthPlaceholder: 'Ay seç', + weekPlaceholder: 'Hafta seç', + rangePlaceholder: ['Başlangıç tarihi', 'Bitiş tarihi'], + rangeYearPlaceholder: ['Başlangıç yılı', 'Bitiş yılı'], + rangeMonthPlaceholder: ['Başlangıç ayı', 'Bitiş ayı'], + rangeWeekPlaceholder: ['Başlangıç haftası', 'Bitiş haftası'], + + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/uk_UA.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/uk_UA.tsx new file mode 100644 index 0000000..04a3bfd --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/uk_UA.tsx @@ -0,0 +1,20 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/uk_UA' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/uk_UA' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'Оберіть дату', + rangePlaceholder: ['Початкова дата', 'Кінцева дата'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/ur_PK.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/ur_PK.tsx new file mode 100644 index 0000000..3726938 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/ur_PK.tsx @@ -0,0 +1,27 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/ur_PK' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/ur_PK' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'تاریخ منتخب کریں', + yearPlaceholder: 'سال کو منتخب کریں', + quarterPlaceholder: 'کوارٹر منتخب کریں', + monthPlaceholder: 'ماہ منتخب کریں', + weekPlaceholder: 'ہفتہ منتخب کریں', + rangePlaceholder: ['شروع کرنے کی تاریخ', 'آخری تاریخ'], + rangeYearPlaceholder: ['آغاز سال', 'آخر سال'], + rangeMonthPlaceholder: ['مہینہ شروع', 'اختتامی مہینہ'], + rangeWeekPlaceholder: ['ہفتے شروع کریں', 'اختتام ہفتہ'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/vi_VN.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/vi_VN.tsx new file mode 100644 index 0000000..3cb1e08 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/vi_VN.tsx @@ -0,0 +1,20 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/vi_VN' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/vi_VN' +import type { PickerLocale } from '../generatePicker' + +// Merge into a locale object +const locale: PickerLocale = { + lang: { + placeholder: 'Chọn thời điểm', + rangePlaceholder: ['Ngày bắt đầu', 'Ngày kết thúc'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/zh_CN.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/zh_CN.tsx new file mode 100644 index 0000000..fa0a1d2 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/zh_CN.tsx @@ -0,0 +1,31 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/zh_CN' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/zh_CN' +import type { PickerLocale } from '../generatePicker' + +// 统一合并为完整的 Locale +const locale: PickerLocale = { + lang: { + placeholder: '请选择日期', + yearPlaceholder: '请选择年份', + quarterPlaceholder: '请选择季度', + monthPlaceholder: '请选择月份', + weekPlaceholder: '请选择周', + rangePlaceholder: ['开始日期', '结束日期'], + rangeYearPlaceholder: ['开始年份', '结束年份'], + rangeMonthPlaceholder: ['开始月份', '结束月份'], + rangeQuarterPlaceholder: ['开始季度', '结束季度'], + rangeWeekPlaceholder: ['开始周', '结束周'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +// should add whitespace between char in Button +locale.lang.ok = '确定' + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/zh_TW.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/zh_TW.tsx new file mode 100644 index 0000000..d392045 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/locale/zh_TW.tsx @@ -0,0 +1,30 @@ +import CalendarLocale from '@core/components/BaseDatePicker/src/vc-picker/locale/zh_TW' +import TimePickerLocale from 'ant-design-vue/es/time-picker/locale/zh_TW' +import type { PickerLocale } from '../generatePicker' + +// 统一合并为完整的 Locale +const locale: PickerLocale = { + lang: { + placeholder: '請選擇日期', + yearPlaceholder: '請選擇年份', + quarterPlaceholder: '請選擇季度', + monthPlaceholder: '請選擇月份', + weekPlaceholder: '請選擇周', + rangePlaceholder: ['開始日期', '結束日期'], + rangeYearPlaceholder: ['開始年份', '結束年份'], + rangeMonthPlaceholder: ['開始月份', '結束月份'], + rangeQuarterPlaceholder: ['開始季度', '結束季度'], + rangeWeekPlaceholder: ['開始周', '結束周'], + ...CalendarLocale + }, + timePickerLocale: { + ...TimePickerLocale + } +} + +locale.lang.ok = '確 定' + +// All settings at: +// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json + +export default locale diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/moment.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/moment.tsx new file mode 100644 index 0000000..dcde098 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/moment.tsx @@ -0,0 +1,39 @@ +import type { Moment } from 'moment' +import type { App } from 'vue' +import momentGenerateConfig from '@core/components/BaseDatePicker/src/vc-picker/generate/moment' +import type { + PickerProps, + PickerDateProps, + RangePickerProps as BaseRangePickerProps +} from './generatePicker' +import generatePicker from './generatePicker' +import type { ExtraDatePickerProps, ExtraRangePickerProps } from './generatePicker/props' + +export type DatePickerProps = PickerProps & ExtraDatePickerProps +export type MonthPickerProps = Omit, 'picker'> & + ExtraDatePickerProps +export type WeekPickerProps = Omit, 'picker'> & ExtraDatePickerProps +export type RangePickerProps = BaseRangePickerProps & ExtraRangePickerProps + +const { DatePicker, WeekPicker, MonthPicker, YearPicker, TimePicker, QuarterPicker, RangePicker } = + generatePicker(momentGenerateConfig) + +/* istanbul ignore next */ +export { RangePicker, WeekPicker, MonthPicker, QuarterPicker } + +export default Object.assign(DatePicker, { + WeekPicker, + MonthPicker, + YearPicker, + RangePicker, + TimePicker, + QuarterPicker, + install: (app: App) => { + app.component(DatePicker.name, DatePicker) + app.component(RangePicker.name, RangePicker) + app.component(MonthPicker.name, MonthPicker) + app.component(WeekPicker.name, WeekPicker) + app.component(QuarterPicker.name, QuarterPicker) + return app + } +}) diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/style/index.less b/src/components/BasicPacks/BaseDatePicker/src/datePick/style/index.less new file mode 100644 index 0000000..a7d769c --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/style/index.less @@ -0,0 +1,362 @@ +@import 'index'; +@import 'index'; +@import 'mixin'; + +@picker-prefix-cls: ~'@{ant-prefix}-picker'; + +.picker-padding(@input-height, @font-size, @padding-horizontal) { + // font height probably 22.0001, So use floor better + @font-height: floor(@font-size * @line-height-base) + 2; + @padding-top: max(((@input-height - @font-height) / 2), 0); + @padding-bottom: max(@input-height - @font-height - @padding-top, 0); + padding: @padding-top @padding-horizontal @padding-bottom; +} + +.@{picker-prefix-cls} { + @arrow-size: 10px; + + .reset-component(); + .picker-padding(@input-height-base, @font-size-base, @input-padding-horizontal-base); + position: relative; + display: inline-flex; + align-items: center; + background: @picker-bg; + border: @border-width-base @border-style-base @select-border-color; + border-radius: @border-radius-base; + transition: border @animation-duration-slow, box-shadow @animation-duration-slow; + + &:hover, + &-focused { + .hover(); + } + + &-focused { + .active(); + } + + &&-disabled { + background: @input-disabled-bg; + border-color: @select-border-color; + cursor: not-allowed; + } + + &&-disabled &-suffix { + color: @disabled-color; + } + + &&-borderless { + background-color: transparent !important; + border-color: transparent !important; + box-shadow: none !important; + } + + // ======================== Input ========================= + &-input { + position: relative; + display: inline-flex; + align-items: center; + width: 100%; + + > input { + .input(); + flex: auto; + + // Fix Firefox flex not correct: + // https://github.com/ant-design/ant-design/pull/20023#issuecomment-564389553 + min-width: 1px; + height: auto; + padding: 0; + background: transparent; + + border: 0; + + &:focus { + box-shadow: none; + } + + &[disabled] { + background: transparent; + } + } + + &:hover { + .@{picker-prefix-cls}-clear { + opacity: 1; + } + } + + &-placeholder { + > input { + color: @input-placeholder-color; + } + } + } + + // Size + &-large { + .picker-padding(@input-height-lg, @font-size-lg, @input-padding-horizontal-lg); + + .@{picker-prefix-cls}-input > input { + font-size: @font-size-lg; + } + } + + &-small { + .picker-padding(@input-height-sm, @font-size-base, @input-padding-horizontal-sm); + } + + &-suffix { + align-self: center; + margin-left: (@padding-xs / 2); + color: @disabled-color; + line-height: 1; + pointer-events: none; + + > * { + vertical-align: top; + } + } + + &-clear { + position: absolute; + top: 50%; + right: 0; + color: @disabled-color; + line-height: 1; + background: @component-background; + transform: translateY(-50%); + cursor: pointer; + opacity: 0; + transition: opacity @animation-duration-slow, color @animation-duration-slow; + + > * { + vertical-align: top; + } + + &:hover { + color: @text-color-secondary; + } + } + + &-separator { + position: relative; + display: inline-block; + width: 1em; + height: @font-size-lg; + color: @disabled-color; + font-size: @font-size-lg; + vertical-align: top; + cursor: default; + + .@{picker-prefix-cls}-focused & { + color: @text-color-secondary; + } + + .@{picker-prefix-cls}-range-separator & { + .@{picker-prefix-cls}-disabled & { + cursor: not-allowed; + } + } + } + + // ======================== Range ========================= + &-range { + position: relative; + display: inline-flex; + + // Clear + .@{picker-prefix-cls}-clear { + right: @input-padding-horizontal-base; + } + + &:hover { + .@{picker-prefix-cls}-clear { + opacity: 1; + } + } + + // Active bar + .@{picker-prefix-cls}-active-bar { + bottom: -@border-width-base; + height: 2px; + margin-left: @input-padding-horizontal-base; + background: @primary-color; + opacity: 0; + transition: all @animation-duration-slow ease-out; + pointer-events: none; + } + + &.@{picker-prefix-cls}-focused { + .@{picker-prefix-cls}-active-bar { + opacity: 1; + } + } + + &-separator { + align-items: center; + padding: 0 @padding-xs; + line-height: 1; + } + + &.@{picker-prefix-cls}-small { + .@{picker-prefix-cls}-clear { + right: @input-padding-horizontal-sm; + } + + .@{picker-prefix-cls}-active-bar { + margin-left: @input-padding-horizontal-sm; + } + } + } + + // ======================= Dropdown ======================= + &-dropdown { + .reset-component(); + position: absolute; + z-index: @zindex-picker; + + &-hidden { + display: none; + } + + &-placement-bottomLeft { + .@{picker-prefix-cls}-range-arrow { + top: (@arrow-size / 2) - (@arrow-size / 3); + display: block; + transform: rotate(-45deg); + } + } + + &-placement-topLeft { + .@{picker-prefix-cls}-range-arrow { + bottom: (@arrow-size / 2) - (@arrow-size / 3); + display: block; + transform: rotate(135deg); + } + } + + &.@{ant-prefix}-slide-up-enter.@{ant-prefix}-slide-up-enter-active&-placement-topLeft, + &.@{ant-prefix}-slide-up-enter.@{ant-prefix}-slide-up-enter-active&-placement-topRight, + &.@{ant-prefix}-slide-up-appear.@{ant-prefix}-slide-up-appear-active&-placement-topLeft, + &.@{ant-prefix}-slide-up-appear.@{ant-prefix}-slide-up-appear-active&-placement-topRight { + animation-name: antSlideDownIn; + } + + &.@{ant-prefix}-slide-up-enter.@{ant-prefix}-slide-up-enter-active&-placement-bottomLeft, + &.@{ant-prefix}-slide-up-enter.@{ant-prefix}-slide-up-enter-active&-placement-bottomRight, + &.@{ant-prefix}-slide-up-appear.@{ant-prefix}-slide-up-appear-active&-placement-bottomLeft, + &.@{ant-prefix}-slide-up-appear.@{ant-prefix}-slide-up-appear-active&-placement-bottomRight { + animation-name: antSlideUpIn; + } + + &.@{ant-prefix}-slide-up-leave.@{ant-prefix}-slide-up-leave-active&-placement-topLeft, + &.@{ant-prefix}-slide-up-leave.@{ant-prefix}-slide-up-leave-active&-placement-topRight { + animation-name: antSlideDownOut; + } + + &.@{ant-prefix}-slide-up-leave.@{ant-prefix}-slide-up-leave-active&-placement-bottomLeft, + &.@{ant-prefix}-slide-up-leave.@{ant-prefix}-slide-up-leave-active&-placement-bottomRight { + animation-name: antSlideUpOut; + } + } + + &-dropdown-range { + padding: (@arrow-size * 2 / 3) 0; + + &-hidden { + display: none; + } + } + + // Time picker with additional style + &-dropdown &-panel > &-time-panel { + padding-top: (@padding-xs / 2); + } + + // ======================== Ranges ======================== + &-ranges { + margin-bottom: 0; + padding: (@padding-xs / 2) @padding-sm; + overflow: hidden; + line-height: @picker-text-height - 2 * @border-width-base - (@padding-xs / 2); + text-align: left; + list-style: none; + + > li { + display: inline-block; + } + + // https://github.com/ant-design/ant-design/issues/23687 + .@{picker-prefix-cls}-preset > .@{ant-prefix}-tag-blue { + color: @primary-color; + background: @primary-1; + border-color: @primary-3; + cursor: pointer; + } + + .@{picker-prefix-cls}-ok { + float: right; + margin-left: @padding-xs; + } + } + + &-range-wrapper { + display: flex; + } + + &-range-arrow { + position: absolute; + z-index: 1; + display: none; + width: @arrow-size; + height: @arrow-size; + margin-left: @input-padding-horizontal-base * 1.5; + box-shadow: 2px -2px 6px fade(@black, 6%); + transition: left @animation-duration-slow ease-out; + + &::after { + position: absolute; + top: @border-width-base; + right: @border-width-base; + width: @arrow-size; + height: @arrow-size; + border: (@arrow-size / 2) solid @border-color-split; + border-color: @calendar-bg @calendar-bg transparent transparent; + content: ''; + } + } + + &-panel-container { + overflow: hidden; + vertical-align: top; + background: @calendar-bg; + border-radius: @border-radius-base; + box-shadow: @box-shadow-base; + transition: margin @animation-duration-slow; + + .@{picker-prefix-cls}-panels { + display: inline-flex; + flex-wrap: nowrap; + direction: ltr; + } + + .@{picker-prefix-cls}-panel { + vertical-align: top; + background: transparent; + border-width: 0 0 @border-width-base 0; + border-radius: 0; + + .@{picker-prefix-cls}-content, + table { + text-align: center; + } + + &-focused { + border-color: @border-color-split; + } + } + } +} + +@import 'panel'; +@import 'rtl'; diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/style/index.tsx b/src/components/BasicPacks/BaseDatePicker/src/datePick/style/index.tsx new file mode 100644 index 0000000..cc44242 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/style/index.tsx @@ -0,0 +1,5 @@ +import './index.less'; + +// style dependencies +import '../../tag/style'; +import '../../button/style'; diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/style/panel.less b/src/components/BasicPacks/BaseDatePicker/src/datePick/style/panel.less new file mode 100644 index 0000000..fec6899 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/style/panel.less @@ -0,0 +1,677 @@ +@picker-cell-inner-cls: ~'@{picker-prefix-cls}-cell-inner'; + +.@{picker-prefix-cls} { + @picker-arrow-size: 7px; + @picker-year-month-cell-width: 60px; + @picker-panel-width: @picker-panel-cell-width * 7 + @padding-sm * 2 + 4; + + &-panel { + display: inline-flex; + flex-direction: column; + text-align: center; + background: @calendar-bg; + border: @border-width-base @border-style-base @picker-border-color; + border-radius: @border-radius-base; + outline: none; + + &-focused { + border-color: @primary-color; + } + } + + // ======================================================== + // = Shared Panel = + // ======================================================== + &-decade-panel, + &-year-panel, + &-quarter-panel, + &-month-panel, + &-week-panel, + &-date-panel, + &-time-panel { + display: flex; + flex-direction: column; + width: @picker-panel-width; + } + + // ======================= Header ======================= + &-header { + display: flex; + padding: 0 @padding-xs; + color: @heading-color; + border-bottom: @border-width-base @border-style-base @picker-border-color; + + > * { + flex: none; + } + + button { + padding: 0; + color: @disabled-color; + line-height: @picker-text-height; + background: transparent; + border: 0; + cursor: pointer; + transition: color @animation-duration-slow; + } + + > button { + min-width: 1.6em; + font-size: @font-size-base; + + &:hover { + color: @text-color; + } + } + + &-view { + flex: auto; + font-weight: 500; + line-height: @picker-text-height; + + button { + color: inherit; + font-weight: inherit; + + &:not(:first-child) { + margin-left: @padding-xs; + } + + &:hover { + color: @primary-color; + } + } + } + } + + // Arrow button + &-prev-icon, + &-next-icon, + &-super-prev-icon, + &-super-next-icon { + position: relative; + display: inline-block; + width: @picker-arrow-size; + height: @picker-arrow-size; + + &::before { + position: absolute; + top: 0; + left: 0; + display: inline-block; + width: @picker-arrow-size; + height: @picker-arrow-size; + border: 0 solid currentcolor; + border-width: 1.5px 0 0 1.5px; + content: ''; + } + } + + &-super-prev-icon, + &-super-next-icon { + &::after { + position: absolute; + top: ceil((@picker-arrow-size / 2)); + left: ceil((@picker-arrow-size / 2)); + display: inline-block; + width: @picker-arrow-size; + height: @picker-arrow-size; + border: 0 solid currentcolor; + border-width: 1.5px 0 0 1.5px; + content: ''; + } + } + + &-prev-icon, + &-super-prev-icon { + transform: rotate(-45deg); + } + + &-next-icon, + &-super-next-icon { + transform: rotate(135deg); + } + + // ======================== Body ======================== + &-content { + width: 100%; + table-layout: fixed; + border-collapse: collapse; + + th, + td { + position: relative; + min-width: 24px; + font-weight: 400; + } + + th { + height: 30px; + color: @text-color; + line-height: 30px; + } + } + + .picker-cell-inner(@cellClassName) { + &::before { + position: absolute; + top: 50%; + right: 0; + left: 0; + z-index: 1; + height: @picker-panel-cell-height; + transform: translateY(-50%); + transition: all @animation-duration-slow; + content: ''; + } + + // >>> Default + .@{cellClassName} { + position: relative; + z-index: 2; + display: inline-block; + min-width: @picker-panel-cell-height; + height: @picker-panel-cell-height; + line-height: @picker-panel-cell-height; + border-radius: @border-radius-base; + transition: background @animation-duration-slow, border @animation-duration-slow; + } + + // >>> Hover + &:hover:not(&-in-view), + &:hover:not(&-selected):not(&-range-start):not(&-range-end):not(&-range-hover-start):not(&-range-hover-end) { + .@{cellClassName} { + background: @picker-basic-cell-hover-color; + } + } + + // >>> Today + &-in-view&-today .@{cellClassName} { + &::before { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1; + border: @border-width-base @border-style-base @primary-color; + border-radius: @border-radius-base; + content: ''; + } + } + + // >>> In Range + &-in-view&-in-range { + position: relative; + + &::before { + background: @picker-basic-cell-active-with-range-color; + } + } + + // >>> Selected + &-in-view&-selected .@{cellClassName}, + &-in-view&-range-start .@{cellClassName}, + &-in-view&-range-end .@{cellClassName} { + color: @text-color-inverse; + background: @primary-color; + } + + &-in-view&-range-start:not(&-range-start-single), + &-in-view&-range-end:not(&-range-end-single) { + &::before { + background: @picker-basic-cell-active-with-range-color; + } + } + + &-in-view&-range-start::before { + left: 50%; + } + + &-in-view&-range-end::before { + right: 50%; + } + + // >>> Range Hover + &-in-view&-range-hover-start:not(&-in-range):not(&-range-start):not(&-range-end), + &-in-view&-range-hover-end:not(&-in-range):not(&-range-start):not(&-range-end), + &-in-view&-range-hover-start&-range-start-single, + &-in-view&-range-hover-start&-range-start&-range-end&-range-end-near-hover, + &-in-view&-range-hover-end&-range-start&-range-end&-range-start-near-hover, + &-in-view&-range-hover-end&-range-end-single, + &-in-view&-range-hover:not(&-in-range) { + &::after { + position: absolute; + top: 50%; + z-index: 0; + height: 24px; + border-top: @border-width-base dashed @picker-date-hover-range-border-color; + border-bottom: @border-width-base dashed @picker-date-hover-range-border-color; + transform: translateY(-50%); + transition: all @animation-duration-slow; + content: ''; + } + } + + // Add space for stash + &-range-hover-start::after, + &-range-hover-end::after, + &-range-hover::after { + right: 0; + left: 2px; + } + + // Hover with in range + &-in-view&-in-range&-range-hover::before, + &-in-view&-range-start&-range-hover::before, + &-in-view&-range-end&-range-hover::before, + &-in-view&-range-start:not(&-range-start-single)&-range-hover-start::before, + &-in-view&-range-end:not(&-range-end-single)&-range-hover-end::before, + .@{picker-prefix-cls}-panel + > :not(.@{picker-prefix-cls}-date-panel) + &-in-view&-in-range&-range-hover-start::before, + .@{picker-prefix-cls}-panel + > :not(.@{picker-prefix-cls}-date-panel) + &-in-view&-in-range&-range-hover-end::before { + background: @picker-date-hover-range-color; + } + + // range start border-radius + &-in-view&-range-start:not(&-range-start-single):not(&-range-end) .@{cellClassName} { + border-radius: @border-radius-base 0 0 @border-radius-base; + } + + // range end border-radius + &-in-view&-range-end:not(&-range-end-single):not(&-range-start) .@{cellClassName} { + border-radius: 0 @border-radius-base @border-radius-base 0; + } + + // DatePanel only + .@{picker-prefix-cls}-date-panel &-in-view&-in-range&-range-hover-start .@{cellClassName}, + .@{picker-prefix-cls}-date-panel &-in-view&-in-range&-range-hover-end .@{cellClassName} { + &::after { + position: absolute; + top: 0; + bottom: 0; + z-index: -1; + background: @picker-date-hover-range-color; + transition: all @animation-duration-slow; + content: ''; + } + } + + .@{picker-prefix-cls}-date-panel + &-in-view&-in-range&-range-hover-start + .@{cellClassName}::after { + right: -5px - @border-width-base; + left: 0; + } + + .@{picker-prefix-cls}-date-panel &-in-view&-in-range&-range-hover-end .@{cellClassName}::after { + right: 0; + left: -5px - @border-width-base; + } + + // Hover with range start & end + &-range-hover&-range-start::after { + right: 50%; + } + + &-range-hover&-range-end::after { + left: 50%; + } + + // Edge start + tr > &-in-view&-range-hover:first-child::after, + tr > &-in-view&-range-hover-end:first-child::after, + &-in-view&-start&-range-hover-edge-start&-range-hover-edge-start-near-range::after, + &-in-view&-range-hover-edge-start:not(&-range-hover-edge-start-near-range)::after, + &-in-view&-range-hover-start::after { + left: 6px; + border-left: @border-width-base dashed @picker-date-hover-range-border-color; + border-top-left-radius: @border-radius-base; + border-bottom-left-radius: @border-radius-base; + } + + // Edge end + tr > &-in-view&-range-hover:last-child::after, + tr > &-in-view&-range-hover-start:last-child::after, + &-in-view&-end&-range-hover-edge-end&-range-hover-edge-end-near-range::after, + &-in-view&-range-hover-edge-end:not(&-range-hover-edge-end-near-range)::after, + &-in-view&-range-hover-end::after { + right: 6px; + border-right: @border-width-base dashed @picker-date-hover-range-border-color; + border-top-right-radius: @border-radius-base; + border-bottom-right-radius: @border-radius-base; + } + + // >>> Disabled + &-disabled { + color: @disabled-color; + pointer-events: none; + + .@{cellClassName} { + background: transparent; + } + + &::before { + background: @picker-basic-cell-disabled-bg; + } + } + &-disabled&-today .@{cellClassName}::before { + border-color: @disabled-color; + } + } + + &-cell { + padding: 3px 0; + color: @disabled-color; + cursor: pointer; + + // In view + &-in-view { + color: @text-color; + } + + .picker-cell-inner(~'@{picker-cell-inner-cls}'); + } + + &-decade-panel, + &-year-panel, + &-quarter-panel, + &-month-panel { + .@{picker-prefix-cls}-content { + height: @picker-panel-without-time-cell-height * 4; + } + + .@{picker-cell-inner-cls} { + padding: 0 @padding-xs; + } + } + + &-quarter-panel { + .@{picker-prefix-cls}-content { + height: 56px; + } + } + + // ======================== Footer ======================== + &-footer { + width: min-content; + min-width: 100%; + line-height: @picker-text-height - 2 * @border-width-base; + text-align: center; + border-bottom: @border-width-base @border-style-base transparent; + + .@{picker-prefix-cls}-panel & { + border-top: @border-width-base @border-style-base @picker-border-color; + } + + &-extra { + padding: 0 @padding-sm; + line-height: @picker-text-height - 2 * @border-width-base; + text-align: left; + + &:not(:last-child) { + border-bottom: @border-width-base @border-style-base @picker-border-color; + } + } + } + + &-now { + text-align: left; + } + + &-today-btn { + color: @link-color; + + &:hover { + color: @link-hover-color; + } + + &:active { + color: @link-active-color; + } + + &&-disabled { + color: @disabled-color; + cursor: not-allowed; + } + } + + // ======================================================== + // = Special = + // ======================================================== + + // ===================== Decade Panel ===================== + &-decade-panel { + .@{picker-cell-inner-cls} { + padding: 0 (@padding-xs / 2); + } + + .@{picker-prefix-cls}-cell::before { + display: none; + } + } + + // ============= Year & Quarter & Month Panel ============= + &-year-panel, + &-quarter-panel, + &-month-panel { + @hover-cell-fixed-distance: ( + (((@picker-panel-width - @padding-xs * 2) / 3) - @picker-year-month-cell-width) / 2 + ); + + .@{picker-prefix-cls}-body { + padding: 0 @padding-xs; + } + + .@{picker-cell-inner-cls} { + width: @picker-year-month-cell-width; + } + + .@{picker-prefix-cls}-cell-range-hover-start::after { + left: @hover-cell-fixed-distance; + border-left: @border-width-base dashed @picker-date-hover-range-border-color; + border-radius: @border-radius-base 0 0 @border-radius-base; + + .@{picker-prefix-cls}-panel-rtl & { + right: @hover-cell-fixed-distance; + border-right: @border-width-base dashed @picker-date-hover-range-border-color; + border-radius: 0 @border-radius-base @border-radius-base 0; + } + } + .@{picker-prefix-cls}-cell-range-hover-end::after { + right: @hover-cell-fixed-distance; + border-right: @border-width-base dashed @picker-date-hover-range-border-color; + border-radius: 0 @border-radius-base @border-radius-base 0; + + .@{picker-prefix-cls}-panel-rtl & { + left: @hover-cell-fixed-distance; + border-left: @border-width-base dashed @picker-date-hover-range-border-color; + border-radius: @border-radius-base 0 0 @border-radius-base; + } + } + } + + // ====================== Week Panel ====================== + &-week-panel { + .@{picker-prefix-cls}-body { + padding: @padding-xs @padding-sm; + } + + // Clear cell style + .@{picker-prefix-cls}-cell { + &:hover .@{picker-cell-inner-cls}, + &-selected .@{picker-cell-inner-cls}, + .@{picker-cell-inner-cls} { + background: transparent !important; + } + } + + &-row { + td { + transition: background @animation-duration-slow; + } + + &:hover td { + background: @picker-basic-cell-hover-color; + } + + &-selected td, + &-selected:hover td { + background: @primary-color; + + &.@{picker-prefix-cls}-cell-week { + color: fade(@text-color-inverse, 50%); + } + + &.@{picker-prefix-cls}-cell-today .@{picker-cell-inner-cls}::before { + border-color: @text-color-inverse; + } + + .@{picker-cell-inner-cls} { + color: @text-color-inverse; + } + } + } + } + + // ====================== Date Panel ====================== + &-date-panel { + .@{picker-prefix-cls}-body { + padding: @padding-xs @padding-sm; + } + + .@{picker-prefix-cls}-content { + width: @picker-panel-cell-width * 7; + + th { + width: @picker-panel-cell-width; + } + } + } + + // ==================== Datetime Panel ==================== + &-datetime-panel { + display: flex; + + .@{picker-prefix-cls}-time-panel { + border-left: @border-width-base @border-style-base @picker-border-color; + } + + .@{picker-prefix-cls}-date-panel, + .@{picker-prefix-cls}-time-panel { + transition: opacity @animation-duration-slow; + } + + // Keyboard + &-active { + .@{picker-prefix-cls}-date-panel, + .@{picker-prefix-cls}-time-panel { + opacity: 0.3; + + &-active { + opacity: 1; + } + } + } + } + + // ====================== Time Panel ====================== + &-time-panel { + width: auto; + min-width: auto; + + .@{picker-prefix-cls}-content { + display: flex; + flex: auto; + height: @picker-time-panel-column-height; + } + + &-column { + flex: 1 0 auto; + width: @picker-time-panel-column-width; + margin: 0; + padding: 0; + overflow-y: hidden; + text-align: left; + list-style: none; + transition: background @animation-duration-slow; + + &::after { + display: block; + height: @picker-time-panel-column-height - @picker-time-panel-cell-height; + content: ''; + .@{picker-prefix-cls}-datetime-panel & { + height: @picker-time-panel-column-height - @picker-time-panel-cell-height + 2 * + @border-width-base; + } + } + + &:not(:first-child) { + border-left: @border-width-base @border-style-base @picker-border-color; + } + + &-active { + background: @calendar-column-active-bg; + } + + &:hover { + overflow-y: auto; + } + + > li { + margin: 0; + padding: 0; + + &.@{picker-prefix-cls}-time-panel-cell { + .@{picker-prefix-cls}-time-panel-cell-inner { + display: block; + width: 100%; + height: @picker-time-panel-cell-height; + margin: 0; + padding: 0 0 0 ((@picker-time-panel-column-width - 28px) / 2); + color: @text-color; + line-height: @picker-time-panel-cell-height; + border-radius: 0; + cursor: pointer; + transition: background @animation-duration-slow; + + &:hover { + background: @item-hover-bg; + } + } + + &-selected { + .@{picker-prefix-cls}-time-panel-cell-inner { + background: @calendar-item-active-bg; + } + } + + &-disabled { + .@{picker-prefix-cls}-time-panel-cell-inner { + color: @disabled-color; + background: transparent; + cursor: not-allowed; + } + } + } + } + } + } +} + +// Fix IE11 render bug by css hacks +// https://github.com/ant-design/ant-design/issues/21559 +// https://codepen.io/afc163-1472555193/pen/mdJRaNj?editors=0110 +/* stylelint-disable-next-line selector-type-no-unknown,selector-no-vendor-prefix */ +_:-ms-fullscreen, +:root { + .@{picker-prefix-cls}-range-wrapper { + .@{picker-prefix-cls}-month-panel .@{picker-prefix-cls}-cell, + .@{picker-prefix-cls}-year-panel .@{picker-prefix-cls}-cell { + padding: 21px 0; + } + } +} diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/style/rtl.less b/src/components/BasicPacks/BaseDatePicker/src/datePick/style/rtl.less new file mode 100644 index 0000000..3a74800 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/style/rtl.less @@ -0,0 +1,246 @@ +.@{picker-prefix-cls} { + &-rtl { + direction: rtl; + } + + &-suffix { + .@{picker-prefix-cls}-rtl & { + margin-right: (@padding-xs / 2); + margin-left: 0; + } + } + + &-clear { + .@{picker-prefix-cls}-rtl & { + right: auto; + left: 0; + } + } + + &-separator { + .@{picker-prefix-cls}-rtl & { + transform: rotate(180deg); + } + } + + &-header { + &-view { + button { + &:not(:first-child) { + .@{picker-prefix-cls}-panel-rtl & { + margin-right: @padding-xs; + margin-left: 0; + } + } + } + } + } + + // ======================== Range ========================= + &-range { + // Clear + .@{picker-prefix-cls}-clear { + .@{picker-prefix-cls}-rtl& { + right: auto; + left: @input-padding-horizontal-base; + } + } + + // Active bar + .@{picker-prefix-cls}-active-bar { + .@{picker-prefix-cls}-rtl& { + margin-right: @input-padding-horizontal-base; + margin-left: 0; + } + } + + &.@{picker-prefix-cls}-small { + .@{picker-prefix-cls}-active-bar { + .@{picker-prefix-cls}-rtl& { + margin-right: @input-padding-horizontal-sm; + } + } + } + } + + // ======================== Ranges ======================== + &-ranges { + .@{picker-prefix-cls}-dropdown-rtl & { + text-align: right; + } + + .@{picker-prefix-cls}-ok { + .@{picker-prefix-cls}-dropdown-rtl & { + float: left; + margin-right: @padding-xs; + margin-left: 0; + } + } + } + + // ======================== Panel ======================== + &-panel { + &-rtl { + direction: rtl; + } + } + + &-prev-icon, + &-super-prev-icon { + .@{picker-prefix-cls}-panel-rtl & { + transform: rotate(135deg); + } + } + + &-next-icon, + &-super-next-icon { + .@{picker-prefix-cls}-panel-rtl & { + transform: rotate(-45deg); + } + } + + &-cell { + .picker-cell-inner(~'@{picker-cell-inner-cls}'); + } + + // ======================== Body ========================== + .picker-cell-inner(@cellClassName) { + .@{cellClassName} { + position: relative; + z-index: 2; + display: inline-block; + min-width: @picker-panel-cell-height; + height: @picker-panel-cell-height; + line-height: @picker-panel-cell-height; + border-radius: @border-radius-base; + transition: background @animation-duration-slow, border @animation-duration-slow; + } + + &-in-view&-range-start::before { + .@{picker-prefix-cls}-panel-rtl & { + right: 50%; + left: 0; + } + } + + &-in-view&-range-end::before { + .@{picker-prefix-cls}-panel-rtl & { + right: 0; + left: 50%; + } + } + + &-in-view&-range-start&-range-end::before { + .@{picker-prefix-cls}-panel-rtl & { + right: 50%; + left: 50%; + } + } + + .@{picker-prefix-cls}-date-panel + &-in-view&-in-range&-range-hover-start + .@{cellClassName}::after { + .@{picker-prefix-cls}-panel-rtl & { + right: 0; + left: -5px - @border-width-base; + } + } + + .@{picker-prefix-cls}-date-panel &-in-view&-in-range&-range-hover-end .@{cellClassName}::after { + .@{picker-prefix-cls}-panel-rtl & { + right: -5px - @border-width-base; + left: 0; + } + } + + // Hover with range start & end + &-range-hover&-range-start::after { + .@{picker-prefix-cls}-panel-rtl & { + right: 0; + left: 50%; + } + } + + &-range-hover&-range-end::after { + .@{picker-prefix-cls}-panel-rtl & { + right: 50%; + left: 0; + } + } + + // range start border-radius + &-in-view&-range-start:not(&-range-start-single):not(&-range-end) .@{cellClassName} { + .@{picker-prefix-cls}-panel-rtl & { + border-radius: 0 @border-radius-base @border-radius-base 0; + } + } + + // range end border-radius + &-in-view&-range-end:not(&-range-end-single):not(&-range-start) .@{cellClassName} { + .@{picker-prefix-cls}-panel-rtl & { + border-radius: @border-radius-base 0 0 @border-radius-base; + } + } + + // Edge start + tr > &-in-view&-range-hover:not(&-selected):first-child::after, + &-in-view&-start&-range-hover-edge-start&-range-hover-edge-start-near-range::after, + &-in-view&-range-hover-edge-start:not(&-range-hover-edge-start-near-range)::after, + &-in-view&-range-hover-start::after { + .@{picker-prefix-cls}-panel-rtl & { + right: 6px; + left: 0; + border-right: @border-width-base dashed @picker-date-hover-range-border-color; + border-left: none; + border-radius: 0 @border-radius-base @border-radius-base 0; + } + } + + // Edge end + tr > &-in-view&-range-hover:not(&-selected):last-child::after, + &-in-view&-end&-range-hover-edge-end&-range-hover-edge-end-near-range::after, + &-in-view&-range-hover-edge-end:not(&-range-hover-edge-end-near-range)::after, + &-in-view&-range-hover-end::after { + .@{picker-prefix-cls}-panel-rtl & { + right: 0; + left: 6px; + border-right: none; + border-left: @border-width-base dashed @picker-date-hover-range-border-color; + border-radius: @border-radius-base 0 0 @border-radius-base; + } + } + + tr > &-in-view&-range-hover-start:last-child::after, + tr > &-in-view&-range-hover-end:first-child::after, + &-in-view&-start&-range-hover-edge-start:not(&-range-hover)::after, + &-in-view&-start&-range-hover-end&-range-hover-edge-start:not(&-range-hover)::after, + &-in-view&-end&-range-hover-start&-range-hover-edge-end:not(&-range-hover)::after, + tr > &-in-view&-start&-range-hover&-range-hover-edge-start:last-child::after, + tr > &-in-view&-end&-range-hover&-range-hover-edge-end:first-child::after { + .@{picker-prefix-cls}-panel-rtl & { + right: 6px; + left: 6px; + border-right: @border-width-base dashed @picker-date-hover-range-border-color; + border-left: @border-width-base dashed @picker-date-hover-range-border-color; + border-radius: @border-radius-base; + } + } + } + + // ======================== Footer ======================== + &-footer { + &-extra { + .@{picker-prefix-cls}-dropdown-rtl & { + direction: rtl; + text-align: right; + } + } + } + + // ====================== Time Panel ====================== + &-time-panel { + .@{picker-prefix-cls}-panel-rtl & { + direction: ltr; + } + } +} diff --git a/src/components/BasicPacks/BaseDatePicker/src/datePick/util.ts b/src/components/BasicPacks/BaseDatePicker/src/datePick/util.ts new file mode 100644 index 0000000..aa7b7fe --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/datePick/util.ts @@ -0,0 +1,53 @@ +import type { PickerMode } from '@core/components/BaseDatePicker/src/vc-picker/interface' +import type { PickerLocale } from './generatePicker' + +export function getPlaceholder( + picker: PickerMode | undefined, + locale: PickerLocale, + customizePlaceholder?: string +): string { + if (customizePlaceholder !== undefined) { + return customizePlaceholder + } + + if (picker === 'year' && locale.lang.yearPlaceholder) { + return locale.lang.yearPlaceholder + } + if (picker === 'quarter' && locale.lang.quarterPlaceholder) { + return locale.lang.quarterPlaceholder + } + if (picker === 'month' && locale.lang.monthPlaceholder) { + return locale.lang.monthPlaceholder + } + if (picker === 'week' && locale.lang.weekPlaceholder) { + return locale.lang.weekPlaceholder + } + if (picker === 'time' && locale.timePickerLocale.placeholder) { + return locale!.timePickerLocale.placeholder + } + return locale.lang.placeholder +} + +export function getRangePlaceholder( + picker: PickerMode | undefined, + locale: PickerLocale, + customizePlaceholder?: [string, string] +) { + if (customizePlaceholder !== undefined) { + return customizePlaceholder + } + + if (picker === 'year' && locale.lang.yearPlaceholder) { + return locale.lang.rangeYearPlaceholder + } + if (picker === 'month' && locale.lang.monthPlaceholder) { + return locale.lang.rangeMonthPlaceholder + } + if (picker === 'week' && locale.lang.weekPlaceholder) { + return locale.lang.rangeWeekPlaceholder + } + if (picker === 'time' && locale.timePickerLocale.placeholder) { + return locale!.timePickerLocale.rangePlaceholder + } + return locale.lang.rangePlaceholder +} diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/PanelContext.tsx b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/PanelContext.tsx new file mode 100644 index 0000000..5ea2f23 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/PanelContext.tsx @@ -0,0 +1,38 @@ +import type { InjectionKey, Ref } from 'vue'; +import { inject, provide } from 'vue'; +import type { OnSelect, PanelMode } from './interface'; + +export type ContextOperationRefProps = { + onKeydown?: (e: KeyboardEvent) => boolean; + onClose?: () => void; +}; + +export type PanelContextProps = { + operationRef?: Ref; + /** Only work with time panel */ + hideHeader?: Ref; + panelRef?: Ref; + hidePrevBtn?: Ref; + hideNextBtn?: Ref; + onDateMouseenter?: (date: any) => void; + onDateMouseleave?: (date: any) => void; + onSelect?: OnSelect; + hideRanges?: Ref; + open?: Ref; + mode?: Ref; + + /** Only used for TimePicker and this is a deprecated prop */ + defaultOpenValue?: Ref; +}; + +const PanelContextKey: InjectionKey = Symbol('PanelContextProps'); + +export const useProvidePanel = (props: PanelContextProps) => { + provide(PanelContextKey, props); +}; + +export const useInjectPanel = () => { + return inject(PanelContextKey, {}); +}; + +export default PanelContextKey; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/Picker.tsx b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/Picker.tsx new file mode 100644 index 0000000..25f32c0 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/Picker.tsx @@ -0,0 +1,639 @@ +/** + * Removed: + * - getCalendarContainer: use `getPopupContainer` instead + * - onOk + * + * New Feature: + * - picker + * - allowEmpty + * - selectable + * + * Tips: Should add faq about `datetime` mode with `defaultValue` + */ + +import type { + PickerPanelBaseProps, + PickerPanelDateProps, + PickerPanelTimeProps +} from './PickerPanel' +import PickerPanel from './PickerPanel' +import PickerTrigger from './PickerTrigger' +import { formatValue, isEqual, parseValue } from './utils/dateUtil' +import getDataOrAriaProps, { toArray } from './utils/miscUtil' +import type { ContextOperationRefProps } from './PanelContext' +import { useProvidePanel } from './PanelContext' +import type { CustomFormat, PickerMode } from './interface' +import { getDefaultFormat, getInputSize, elementsContains } from './utils/uiUtil' +import usePickerInput from './hooks/usePickerInput' +import useTextValueMapping from './hooks/useTextValueMapping' +import useValueTexts from './hooks/useValueTexts' +import useHoverValue from './hooks/useHoverValue' +import type { CSSProperties, HTMLAttributes, Ref } from 'vue' +import { computed, defineComponent, ref, toRef, watch } from 'vue' +import type { + ChangeEvent, + FocusEventHandler, + MouseEventHandler +} from 'ant-design-vue/es/_util/EventInterface' +import type { VueNode } from 'ant-design-vue/es/_util/type' +import type { AlignType } from 'ant-design-vue/es/vc-align/interface' +import useMergedState from 'ant-design-vue/es/_util/hooks/useMergedState' +import { warning } from 'ant-design-vue/es/vc-util/warning' +import classNames from 'ant-design-vue/es/_util/classNames' +import type { SharedTimeProps } from './panels/TimePanel' +import { useProviderTrigger } from 'ant-design-vue/es/vc-trigger/context' +import { legacyPropsWarning } from './utils/warnUtil' + +export type PickerRefConfig = { + focus: () => void + blur: () => void +} + +export type PickerSharedProps = { + dropdownClassName?: string + dropdownAlign?: AlignType + popupStyle?: CSSProperties + transitionName?: string + placeholder?: string + allowClear?: boolean + autofocus?: boolean + disabled?: boolean + tabindex?: number + open?: boolean + defaultOpen?: boolean + /** Make input readOnly to avoid popup keyboard in mobile */ + inputReadOnly?: boolean + id?: string + + presets?: PresetDate[] + + // Value + format?: string | CustomFormat | (string | CustomFormat)[] + + // Render + suffixIcon?: VueNode + clearIcon?: VueNode + prevIcon?: VueNode + nextIcon?: VueNode + superPrevIcon?: VueNode + superNextIcon?: VueNode + getPopupContainer?: (node: HTMLElement) => HTMLElement + panelRender?: (originPanel: VueNode) => VueNode + inputRender?: (props: HTMLAttributes) => VueNode + + // Events + onChange?: (value: DateType | null, dateString: string) => void + onOpenChange?: (open: boolean) => void + onFocus?: FocusEventHandler + onBlur?: FocusEventHandler + onMousedown?: MouseEventHandler + onMouseup?: MouseEventHandler + onMouseenter?: MouseEventHandler + onMouseleave?: MouseEventHandler + onClick?: MouseEventHandler + onContextmenu?: MouseEventHandler + onKeydown?: (event: KeyboardEvent, preventDefault: () => void) => void + + // WAI-ARIA + role?: string + name?: string + + autocomplete?: string + direction?: 'ltr' | 'rtl' + showToday?: boolean + showTime?: boolean | SharedTimeProps +} + +type OmitPanelProps = Omit< + Props, + 'onChange' | 'hideHeader' | 'pickerValue' | 'onPickerValueChange' +> + +export type PickerBaseProps = {} & PickerSharedProps & + OmitPanelProps> + +export type PickerDateProps = {} & PickerSharedProps & + OmitPanelProps> + +export type PickerTimeProps = { + picker: 'time' + /** + * @deprecated Please use `defaultValue` directly instead + * since `defaultOpenValue` will confuse user of current value status + */ + defaultOpenValue?: DateType +} & PickerSharedProps & + Omit>, 'format'> + +export type PickerProps = + | PickerBaseProps + | PickerDateProps + | PickerTimeProps + +// TMP type to fit for ts 3.9.2 +type OmitType = Omit, 'picker'> & + Omit, 'picker'> & + Omit, 'picker'> +type MergedPickerProps = { + picker?: PickerMode +} & OmitType + +function Picker() { + return defineComponent>({ + name: 'Picker', + inheritAttrs: false, + props: [ + 'prefixCls', + 'id', + 'tabindex', + 'dropdownClassName', + 'dropdownAlign', + 'popupStyle', + 'transitionName', + 'generateConfig', + 'locale', + 'inputReadOnly', + 'allowClear', + 'autofocus', + 'showTime', + 'showNow', + 'showHour', + 'showMinute', + 'showSecond', + 'picker', + 'format', + 'use12Hours', + 'value', + 'defaultValue', + 'open', + 'defaultOpen', + 'defaultOpenValue', + 'suffixIcon', + 'presets', + 'clearIcon', + 'disabled', + 'disabledDate', + 'placeholder', + 'getPopupContainer', + 'panelRender', + 'inputRender', + 'onChange', + 'onOpenChange', + 'onFocus', + 'onBlur', + 'onMousedown', + 'onMouseup', + 'onMouseenter', + 'onMouseleave', + 'onContextmenu', + 'onClick', + 'onKeydown', + 'onSelect', + 'direction', + 'autocomplete', + 'showToday', + 'renderExtraFooter', + 'dateRender', + 'minuteStep', + 'hourStep', + 'secondStep', + 'hideDisabledOptions' + ] as any, + // slots: [ + // 'suffixIcon', + // 'clearIcon', + // 'prevIcon', + // 'nextIcon', + // 'superPrevIcon', + // 'superNextIcon', + // 'panelRender', + // ], + setup(props, { attrs, expose }) { + const inputRef = ref(null) + const picker = computed(() => props.picker ?? 'date') + const needConfirmButton = computed( + () => (picker.value === 'date' && !!props.showTime) || picker.value === 'time' + ) + // ============================ Warning ============================ + if (process.env.NODE_ENV !== 'production') { + legacyPropsWarning(props) + } + // ============================= State ============================= + const formatList = computed(() => + toArray(getDefaultFormat(props.format, picker.value, props.showTime, props.use12Hours)) + ) + + // Panel ref + const panelDivRef = ref(null) + const inputDivRef = ref(null) + const containerRef = ref(null) + + // Real value + const [mergedValue, setInnerValue] = useMergedState(null, { + value: toRef(props, 'value'), + defaultValue: props.defaultValue + }) + const selectedValue = ref(mergedValue.value) as Ref + const setSelectedValue = (val: DateType) => { + selectedValue.value = val + } + + // Operation ref + const operationRef = ref(null) + + // Open + const [mergedOpen, triggerInnerOpen] = useMergedState(false, { + value: toRef(props, 'open'), + defaultValue: props.defaultOpen, + postState: (postOpen) => (props.disabled ? false : postOpen), + onChange: (newOpen) => { + if (props.onOpenChange) { + props.onOpenChange(newOpen) + } + + if (!newOpen && operationRef.value && operationRef.value.onClose) { + operationRef.value.onClose() + } + } + }) + + // ============================= Text ============================== + const [valueTexts, firstValueText] = useValueTexts(selectedValue, { + formatList, + generateConfig: toRef(props, 'generateConfig'), + locale: toRef(props, 'locale') + }) + const [text, triggerTextChange, resetText] = useTextValueMapping({ + valueTexts, + onTextChange: (newText) => { + const inputDate = parseValue(newText, { + locale: props.locale, + formatList: formatList.value, + generateConfig: props.generateConfig + }) + if (inputDate && (!props.disabledDate || !props.disabledDate(inputDate))) { + setSelectedValue(inputDate) + } + } + }) + + // ============================ Trigger ============================ + const triggerChange = (newValue: DateType | null) => { + const { onChange, generateConfig, locale } = props + setSelectedValue(newValue) + setInnerValue(newValue) + + if (onChange && !isEqual(generateConfig, mergedValue.value, newValue)) { + onChange( + newValue, + newValue + ? formatValue(newValue, { + generateConfig, + locale, + format: formatList.value[0] + }) + : '' + ) + } + } + + const triggerOpen = (newOpen: boolean) => { + if (props.disabled && newOpen) { + return + } + triggerInnerOpen(newOpen) + } + + const forwardKeydown = (e: KeyboardEvent) => { + if (mergedOpen.value && operationRef.value && operationRef.value.onKeydown) { + // Let popup panel handle keyboard + return operationRef.value.onKeydown(e) + } + + /* istanbul ignore next */ + /* eslint-disable no-lone-blocks */ + { + warning( + false, + 'Picker not correct forward Keydown operation. Please help to fire issue about this.' + ) + return false + } + } + + const onInternalMouseup: MouseEventHandler = (...args) => { + if (props.onMouseup) { + props.onMouseup(...args) + } + + if (inputRef.value) { + inputRef.value.focus() + triggerOpen(true) + } + } + + // ============================= Input ============================= + const [inputProps, { focused, typing }] = usePickerInput({ + blurToCancel: needConfirmButton, + open: mergedOpen, + value: text, + triggerOpen, + forwardKeydown, + isClickOutside: (target) => + !elementsContains( + [panelDivRef.value, inputDivRef.value, containerRef.value], + target as HTMLElement + ), + onSubmit: () => { + if ( + // When user typing disabledDate with keyboard and enter, this value will be empty + !selectedValue.value || + // Normal disabled check + (props.disabledDate && props.disabledDate(selectedValue.value)) + ) { + return false + } + + triggerChange(selectedValue.value) + triggerOpen(false) + resetText() + return true + }, + onCancel: () => { + triggerOpen(false) + setSelectedValue(mergedValue.value) + resetText() + }, + onKeydown: (e, preventDefault) => { + props.onKeydown?.(e, preventDefault) + }, + onFocus: (e: FocusEvent) => { + props.onFocus?.(e) + }, + onBlur: (e: FocusEvent) => { + props.onBlur?.(e) + } + }) + + // ============================= Sync ============================== + // Close should sync back with text value + watch([mergedOpen, valueTexts], () => { + if (!mergedOpen.value) { + setSelectedValue(mergedValue.value) + + if (!valueTexts.value.length || valueTexts.value[0] === '') { + triggerTextChange('') + } else if (firstValueText.value !== text.value) { + resetText() + } + } + }) + + // Change picker should sync back with text value + watch(picker, () => { + if (!mergedOpen.value) { + resetText() + } + }) + + // Sync innerValue with control mode + watch(mergedValue, () => { + // Sync select value + setSelectedValue(mergedValue.value) + }) + + const [hoverValue, onEnter, onLeave] = useHoverValue(text, { + formatList, + generateConfig: toRef(props, 'generateConfig'), + locale: toRef(props, 'locale') + }) + + const onContextSelect = (date: DateType, type: 'key' | 'mouse' | 'submit') => { + if (type === 'submit' || (type !== 'key' && !needConfirmButton.value)) { + // triggerChange will also update selected values + triggerChange(date) + triggerOpen(false) + } + } + + useProvidePanel({ + operationRef, + hideHeader: computed(() => picker.value === 'time'), + panelRef: panelDivRef, + onSelect: onContextSelect, + open: mergedOpen, + defaultOpenValue: toRef(props, 'defaultOpenValue'), + onDateMouseenter: onEnter, + onDateMouseleave: onLeave + }) + + expose({ + focus: () => { + if (inputRef.value) { + inputRef.value.focus() + } + }, + blur: () => { + if (inputRef.value) { + inputRef.value.blur() + } + } + }) + + const getPortal = useProviderTrigger() + + return () => { + const { + prefixCls = 'rc-picker', + id, + tabindex, + dropdownClassName, + dropdownAlign, + popupStyle, + transitionName, + generateConfig, + locale, + inputReadOnly, + allowClear, + autofocus, + picker = 'date', + defaultOpenValue, + suffixIcon, + clearIcon, + disabled, + placeholder, + getPopupContainer, + panelRender, + onMousedown, + onMouseenter, + onMouseleave, + onContextmenu, + onClick, + onSelect, + direction, + autocomplete = 'off' + } = props + + // ============================= Panel ============================= + //todo check + const panelProps = { + // Remove `picker` & `format` here since TimePicker is little different with other panel + ...(props as Omit, 'picker' | 'format'>), + ...attrs, + class: classNames({ + [`${prefixCls}-panel-focused`]: !typing.value + }), + style: undefined, + pickerValue: undefined, + onPickerValueChange: undefined, + onChange: null + } + //todo check + let panelNode: VueNode = ( + { + onSelect?.(date) + setSelectedValue(date) + }} + direction={direction} + /*onPanelChange={(viewDate, mode) => { + const { onPanelChange } = props; + onLeave(true); + onPanelChange?.(viewDate, mode); + }}*/ + /> + ) + + if (panelRender) { + panelNode = panelRender(panelNode) + } + + const panel = ( +
{ + e.preventDefault() + }} + > + {panelNode} +
+ ) + + let suffixNode: VueNode + if (suffixIcon) { + suffixNode = {suffixIcon} + } + + let clearNode: VueNode + if (allowClear && mergedValue.value && !disabled) { + clearNode = ( + { + e.preventDefault() + e.stopPropagation() + }} + onMouseup={(e) => { + e.preventDefault() + e.stopPropagation() + triggerChange(null) + triggerOpen(false) + }} + class={`${prefixCls}-clear`} + role="button" + > + {clearIcon || } + + ) + } + + const mergedInputProps: HTMLAttributes = { + id, + tabindex, + disabled, + readonly: inputReadOnly || typeof formatList.value[0] === 'function' || !typing.value, + value: hoverValue.value || text.value, + onInput: (e: ChangeEvent) => { + triggerTextChange(e.target.value) + }, + autofocus, + placeholder, + ref: inputRef, + title: text.value, + ...inputProps.value, + size: getInputSize(picker, formatList.value[0], generateConfig), + ...getDataOrAriaProps(props), + autocomplete + } + + const inputNode = props.inputRender ? ( + props.inputRender(mergedInputProps) + ) : ( + + ) + + // ============================ Warning ============================ + if (process.env.NODE_ENV !== 'production') { + warning( + !defaultOpenValue, + '`defaultOpenValue` may confuse user for the current value status. Please use `defaultValue` instead.' + ) + } + + // ============================ Return ============================= + + const popupPlacement = direction === 'rtl' ? 'bottomRight' : 'bottomLeft' + return ( + panel + }} + > +
+
+ {inputNode} + {suffixNode} + {clearNode} +
+ {getPortal()} +
+
+ ) + } + } + }) +} + +export default Picker() diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/PickerPanel.tsx b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/PickerPanel.tsx new file mode 100644 index 0000000..26e02fa --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/PickerPanel.tsx @@ -0,0 +1,624 @@ +/** + * Logic: + * When `mode` === `picker`, + * click will trigger `onSelect` (if value changed trigger `onChange` also). + * Panel change will not trigger `onSelect` but trigger `onPanelChange` + */ +import type { SharedTimeProps } from './panels/TimePanel'; +import TimePanel from './panels/TimePanel'; +import DatetimePanel from './panels/DatetimePanel'; +import DatePanel from './panels/DatePanel'; +import WeekPanel from './panels/WeekPanel'; +import MonthPanel from './panels/MonthPanel'; +import QuarterPanel from './panels/QuarterPanel'; +import YearPanel from './panels/YearPanel'; +import DecadePanel from './panels/DecadePanel'; +import type { GenerateConfig } from './generate'; +import type { + Locale, + PanelMode, + PanelRefProps, + PickerMode, + DisabledTime, + OnPanelChange, + Components, +} from './interface'; +import { isEqual } from './utils/dateUtil'; +import { useInjectPanel, useProvidePanel } from './PanelContext'; +import type { DateRender } from './panels/DatePanel/DateBody'; +import { PickerModeMap } from './utils/uiUtil'; +import type { MonthCellRender } from './panels/MonthPanel/MonthBody'; +import { useInjectRange } from './RangeContext'; +import getExtraFooter from './utils/getExtraFooter'; +import getRanges from './utils/getRanges'; +import { getLowerBoundTime, setDateTime, setTime } from './utils/timeUtil'; +import type { VueNode } from 'ant-design-vue/es/_util/type'; +import type { CSSProperties } from 'vue'; +import { computed, createVNode, defineComponent, ref, toRef, watch, watchEffect } from 'vue'; +import useMergedState from 'ant-design-vue/es/_util/hooks/useMergedState'; +import { warning } from 'ant-design-vue/es/vc-util/warning'; +import KeyCode from 'ant-design-vue/es/_util/KeyCode'; +import classNames from 'ant-design-vue/es/_util/classNames'; + +export type PickerPanelSharedProps = { + prefixCls?: string; + // className?: string; + // style?: React.CSSProperties; + /** @deprecated Will be removed in next big version. Please use `mode` instead */ + mode?: PanelMode; + tabindex?: number; + + // Locale + locale: Locale; + generateConfig: GenerateConfig; + + // Value + value?: DateType | null; + defaultValue?: DateType; + /** [Legacy] Set default display picker view date */ + pickerValue?: DateType; + /** [Legacy] Set default display picker view date */ + defaultPickerValue?: DateType; + + // Date + disabledDate?: (date: DateType) => boolean; + + // Render + dateRender?: DateRender; + monthCellRender?: MonthCellRender; + renderExtraFooter?: (mode: PanelMode) => VueNode; + + // Event + onSelect?: (value: DateType) => void; + onChange?: (value: DateType) => void; + onPanelChange?: OnPanelChange; + onMousedown?: (e: MouseEvent) => void; + onOk?: (date: DateType) => void; + + direction?: 'ltr' | 'rtl'; + + /** @private This is internal usage. Do not use in your production env */ + hideHeader?: boolean; + /** @private This is internal usage. Do not use in your production env */ + onPickerValueChange?: (date: DateType) => void; + + /** @private Internal usage. Do not use in your production env */ + components?: Components; +}; + +export type PickerPanelBaseProps = { + picker: Exclude; +} & PickerPanelSharedProps; + +export type PickerPanelDateProps = { + picker?: 'date'; + showToday?: boolean; + showNow?: boolean; + + // Time + showTime?: boolean | SharedTimeProps; + disabledTime?: DisabledTime; +} & PickerPanelSharedProps; + +export type PickerPanelTimeProps = { + picker: 'time'; +} & PickerPanelSharedProps & + SharedTimeProps; + +export type PickerPanelProps = + | PickerPanelBaseProps + | PickerPanelDateProps + | PickerPanelTimeProps; + +// TMP type to fit for ts 3.9.2 +type OmitType = Omit, 'picker'> & + Omit, 'picker'> & + Omit, 'picker'>; +type MergedPickerPanelProps = { + picker?: PickerMode; +} & OmitType; + +function PickerPanel() { + return defineComponent>({ + name: 'PickerPanel', + inheritAttrs: false, + props: { + prefixCls: String, + locale: Object, + generateConfig: Object, + value: Object, + defaultValue: Object, + pickerValue: Object, + defaultPickerValue: Object, + disabledDate: Function, + mode: String, + picker: { type: String, default: 'date' }, + tabindex: { type: [Number, String], default: 0 }, + showNow: { type: Boolean, default: undefined }, + showTime: [Boolean, Object], + showToday: Boolean, + renderExtraFooter: Function, + dateRender: Function, + hideHeader: { type: Boolean, default: undefined }, + onSelect: Function, + onChange: Function, + onPanelChange: Function, + onMousedown: Function, + onPickerValueChange: Function, + onOk: Function, + components: Object, + direction: String, + hourStep: { type: Number, default: 1 }, + minuteStep: { type: Number, default: 1 }, + secondStep: { type: Number, default: 1 }, + } as any, + setup(props, { attrs }) { + const needConfirmButton = computed( + () => (props.picker === 'date' && !!props.showTime) || props.picker === 'time', + ); + + const isHourStepValid = computed(() => 24 % props.hourStep === 0); + const isMinuteStepValid = computed(() => 60 % props.minuteStep === 0); + const isSecondStepValid = computed(() => 60 % props.secondStep === 0); + if (process.env.NODE_ENV !== 'production') { + watchEffect(() => { + const { generateConfig, value, hourStep = 1, minuteStep = 1, secondStep = 1 } = props; + warning(!value || generateConfig.isValidate(value), 'Invalidate date pass to `value`.'); + warning( + !value || generateConfig.isValidate(value), + 'Invalidate date pass to `defaultValue`.', + ); + warning( + isHourStepValid.value, + `\`hourStep\` ${hourStep} is invalid. It should be a factor of 24.`, + ); + warning( + isMinuteStepValid.value, + `\`minuteStep\` ${minuteStep} is invalid. It should be a factor of 60.`, + ); + warning( + isSecondStepValid.value, + `\`secondStep\` ${secondStep} is invalid. It should be a factor of 60.`, + ); + }); + } + + const panelContext = useInjectPanel(); + const { + operationRef, + panelRef: panelDivRef, + onSelect: onContextSelect, + hideRanges, + defaultOpenValue, + } = panelContext; + const { inRange, panelPosition, rangedValue, hoverRangedValue } = useInjectRange(); + const panelRef = ref({}); + // Value + const [mergedValue, setInnerValue] = useMergedState(null, { + value: toRef(props, 'value'), + defaultValue: props.defaultValue, + postState: val => { + if (!val && defaultOpenValue?.value && props.picker === 'time') { + return defaultOpenValue.value; + } + return val; + }, + }); + + // View date control + const [viewDate, setInnerViewDate] = useMergedState(null, { + value: toRef(props, 'pickerValue'), + defaultValue: props.defaultPickerValue || mergedValue.value, + postState: date => { + const { generateConfig, showTime, defaultValue } = props; + + const now = generateConfig.getNow(); + if (!date) return now; + // When value is null and set showTime + if (!mergedValue.value && props.showTime) { + if (typeof showTime === 'object') { + return setDateTime( + generateConfig, + Array.isArray(date) ? date[0] : date, + showTime.defaultValue || now, + ); + } + if (defaultValue) { + return setDateTime( + generateConfig, + Array.isArray(date) ? date[0] : date, + defaultValue, + ); + } + return setDateTime(generateConfig, Array.isArray(date) ? date[0] : date, now); + } + return date; + }, + }); + + + const setViewDate = (date: DateType) => { + setInnerViewDate(date); + if (props.onPickerValueChange) { + props.onPickerValueChange(date); + } + }; + + // Panel control + const getInternalNextMode = (nextMode: PanelMode): PanelMode => { + const getNextMode = PickerModeMap[props.picker!]; + if (getNextMode) { + return getNextMode(nextMode); + } + + return nextMode; + }; + + // Save panel is changed from which panel + const [mergedMode, setInnerMode] = useMergedState( + () => { + if (props.picker === 'time') { + return 'time'; + } + return getInternalNextMode('date'); + }, + { + value: toRef(props, 'mode'), + }, + ); + watch( + () => props.picker, + () => { + setInnerMode(props.picker); + }, + ); + + const sourceMode = ref(mergedMode.value); + const setSourceMode = (val: PanelMode) => { + sourceMode.value = val; + }; + + const onInternalPanelChange = (newMode: PanelMode | null, viewValue: DateType) => { + const { onPanelChange, generateConfig } = props; + const nextMode = getInternalNextMode(newMode || mergedMode.value); + setSourceMode(mergedMode.value); + setInnerMode(nextMode); + + if ( + onPanelChange && + (mergedMode.value !== nextMode || isEqual(generateConfig, viewDate.value, viewDate.value)) + ) { + onPanelChange(viewValue, nextMode); + } + }; + + const triggerSelect = ( + date: DateType, + type: 'key' | 'mouse' | 'submit', + forceTriggerSelect = false, + ) => { + const { picker, generateConfig, onSelect, onChange, disabledDate } = props; + if (mergedMode.value === picker || forceTriggerSelect) { + setInnerValue(date); + + if (onSelect) { + onSelect(date); + } + + if (onContextSelect) { + onContextSelect(date, type); + } + + if ( + onChange && + !isEqual(generateConfig, date, mergedValue.value) && + !disabledDate?.(date) + ) { + onChange(date); + } + } + }; + + // ========================= Interactive ========================== + const onInternalKeydown = (e: KeyboardEvent) => { + if (panelRef.value && panelRef.value.onKeydown) { + if ( + [ + KeyCode.LEFT, + KeyCode.RIGHT, + KeyCode.UP, + KeyCode.DOWN, + KeyCode.PAGE_UP, + KeyCode.PAGE_DOWN, + KeyCode.ENTER, + ].includes(e.which) + ) { + e.preventDefault(); + } + return panelRef.value.onKeydown(e); + } + + /* istanbul ignore next */ + /* eslint-disable no-lone-blocks */ + { + warning( + false, + 'Panel not correct handle keyDown event. Please help to fire issue about this.', + ); + return false; + } + /* eslint-enable no-lone-blocks */ + }; + + const onInternalBlur = (e: FocusEvent) => { + if (panelRef.value && panelRef.value.onBlur) { + panelRef.value.onBlur(e); + } + }; + const onNow = () => { + const { generateConfig, hourStep, minuteStep, secondStep } = props; + const now = generateConfig.getNow(); + const lowerBoundTime = getLowerBoundTime( + generateConfig.getHour(now), + generateConfig.getMinute(now), + generateConfig.getSecond(now), + isHourStepValid.value ? hourStep : 1, + isMinuteStepValid.value ? minuteStep : 1, + isSecondStepValid.value ? secondStep : 1, + ); + const adjustedNow = setTime( + generateConfig, + now, + lowerBoundTime[0], // hour + lowerBoundTime[1], // minute + lowerBoundTime[2], // second + ); + triggerSelect(adjustedNow, 'submit'); + }; + + const classString = computed(() => { + const { prefixCls, direction } = props; + return classNames(`${prefixCls}-panel`, { + [`${prefixCls}-panel-has-range`]: + rangedValue && rangedValue.value && rangedValue.value[0] && rangedValue.value[1], + [`${prefixCls}-panel-has-range-hover`]: + hoverRangedValue && + hoverRangedValue.value && + hoverRangedValue.value[0] && + hoverRangedValue.value[1], + [`${prefixCls}-panel-rtl`]: direction === 'rtl', + }); + }); + useProvidePanel({ + ...panelContext, + mode: mergedMode, + hideHeader: computed(() => + props.hideHeader !== undefined ? props.hideHeader : panelContext.hideHeader?.value, + ), + hidePrevBtn: computed(() => inRange.value && panelPosition.value === 'right'), + hideNextBtn: computed(() => inRange.value && panelPosition.value === 'left'), + }); + + watch( + () => props.value, + () => { + if (props.value) { + setInnerViewDate(props.value); + } + }, + ); + + return () => { + const { + prefixCls = 'ant-picker', + locale, + generateConfig, + disabledDate, + picker = 'date', + tabindex = 0, + showNow, + showTime, + showToday, + renderExtraFooter, + onMousedown, + onOk, + components, + } = props; + if (operationRef && panelPosition.value !== 'right') { + operationRef.value = { + onKeydown: onInternalKeydown, + onClose: () => { + if (panelRef.value && panelRef.value.onClose) { + panelRef.value.onClose(); + } + }, + }; + } + + // ============================ Panels ============================ + let panelNode: VueNode; + const pickerProps = { + ...attrs, + ...(props as MergedPickerPanelProps), + operationRef: panelRef, + prefixCls, + viewDate: viewDate.value, + value: mergedValue.value, + onViewDateChange: setViewDate, + sourceMode: sourceMode.value, + onPanelChange: onInternalPanelChange, + disabledDate, + }; + delete pickerProps.onChange; + delete pickerProps.onSelect; + switch (mergedMode.value) { + case 'decade': + panelNode = ( + + {...pickerProps} + onSelect={(date, type) => { + setViewDate(date); + triggerSelect(date, type); + }} + /> + ); + break; + + case 'year': + panelNode = ( + + {...pickerProps} + onSelect={(date, type) => { + setViewDate(date); + triggerSelect(date, type); + }} + /> + ); + break; + + case 'month': + panelNode = ( + + {...pickerProps} + onSelect={(date, type) => { + setViewDate(date); + triggerSelect(date, type); + }} + /> + ); + break; + + case 'quarter': + panelNode = ( + + {...pickerProps} + onSelect={(date, type) => { + setViewDate(date); + triggerSelect(date, type); + }} + /> + ); + break; + + case 'week': + panelNode = ( + { + setViewDate(date); + triggerSelect(date, type); + }} + /> + ); + break; + + case 'time': + delete pickerProps.showTime; + panelNode = ( + + {...pickerProps} + {...(typeof showTime === 'object' ? showTime : null)} + onSelect={(date, type) => { + setViewDate(date); + triggerSelect(date, type); + }} + /> + ); + break; + + default: + if (showTime) { + panelNode = ( + { + setViewDate(date); + triggerSelect(date, type); + }} + /> + ); + } else { + panelNode = ( + + {...pickerProps} + onSelect={(date, type) => { + setViewDate(date); + triggerSelect(date, type); + }} + /> + ); + } + } + + // ============================ Footer ============================ + let extraFooter: VueNode; + let rangesNode: VueNode; + + if (!hideRanges?.value) { + extraFooter = getExtraFooter(prefixCls, mergedMode.value, renderExtraFooter); + rangesNode = getRanges({ + prefixCls, + components, + needConfirmButton: needConfirmButton.value, + okDisabled: !mergedValue.value || (disabledDate && disabledDate(mergedValue.value)), + locale, + showNow, + onNow: needConfirmButton.value && onNow, + onOk: () => { + if (mergedValue.value) { + triggerSelect(mergedValue.value, 'submit', true); + if (onOk) { + onOk(mergedValue.value); + } + } + }, + }); + } + + let todayNode: VueNode; + + if (showToday && mergedMode.value === 'date' && picker === 'date' && !showTime) { + const now = generateConfig.getNow(); + const todayCls = `${prefixCls}-today-btn`; + const disabled = disabledDate && disabledDate(now); + todayNode = ( + { + if (!disabled) { + triggerSelect(now, 'mouse', true); + } + }} + > + {locale.today} + + ); + } + return ( +
+ {panelNode} + {extraFooter || rangesNode || todayNode ? ( +
+ {extraFooter} + {rangesNode} + {todayNode} +
+ ) : null} +
+ ); + }; + }, + }); +} +const InterPickerPanel = PickerPanel(); +export default (props: MergedPickerPanelProps): JSX.Element => + createVNode(InterPickerPanel, props); diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/PickerTrigger.tsx b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/PickerTrigger.tsx new file mode 100644 index 0000000..3a4d206 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/PickerTrigger.tsx @@ -0,0 +1,103 @@ +import type { CSSProperties } from 'vue'; +import type { AlignType } from 'ant-design-vue/es/vc-align/interface'; +import Trigger from 'ant-design-vue/es/vc-trigger'; +import classNames from 'ant-design-vue/es/_util/classNames'; +import useMergeProps from './hooks/useMergeProps'; + +const BUILT_IN_PLACEMENTS = { + bottomLeft: { + points: ['tl', 'bl'], + offset: [0, 4], + overflow: { + adjustX: 1, + adjustY: 1, + }, + }, + bottomRight: { + points: ['tr', 'br'], + offset: [0, 4], + overflow: { + adjustX: 1, + adjustY: 1, + }, + }, + topLeft: { + points: ['bl', 'tl'], + offset: [0, -4], + overflow: { + adjustX: 0, + adjustY: 1, + }, + }, + topRight: { + points: ['br', 'tr'], + offset: [0, -4], + overflow: { + adjustX: 0, + adjustY: 1, + }, + }, +}; + +type Placement = 'bottomLeft' | 'bottomRight' | 'topLeft' | 'topRight'; + +export type PickerTriggerProps = { + prefixCls: string; + visible: boolean; + popupStyle?: CSSProperties; + dropdownClassName?: string; + transitionName?: string; + getPopupContainer?: (node: HTMLElement) => HTMLElement; + dropdownAlign?: AlignType; + range?: boolean; + popupPlacement?: Placement; + direction?: 'ltr' | 'rtl'; +}; + +function PickerTrigger(props: PickerTriggerProps, { slots }) { + const { + prefixCls, + popupStyle, + visible, + dropdownClassName, + dropdownAlign, + transitionName, + getPopupContainer, + range, + popupPlacement, + direction, + } = useMergeProps(props); + const dropdownPrefixCls = `${prefixCls}-dropdown`; + + const getPopupPlacement = () => { + if (popupPlacement !== undefined) { + return popupPlacement; + } + return direction === 'rtl' ? 'bottomRight' : 'bottomLeft'; + }; + + return ( + + ); +} + +export default PickerTrigger; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/RangeContext.tsx b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/RangeContext.tsx new file mode 100644 index 0000000..17146b3 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/RangeContext.tsx @@ -0,0 +1,74 @@ +import type { InjectionKey, PropType, Ref } from 'vue'; +import { defineComponent, inject, provide, ref, toRef, watch } from 'vue'; +import type { NullableDateType, RangeValue } from './interface'; + +export type RangeContextProps = { + /** + * Set displayed range value style. + * Panel only has one value, this is only style effect. + */ + rangedValue?: Ref<[NullableDateType, NullableDateType] | null>; + hoverRangedValue?: Ref>; + inRange?: Ref; + panelPosition?: Ref<'left' | 'right' | false>; +}; + +type RangeContextProviderValue = { + /** + * Set displayed range value style. + * Panel only has one value, this is only style effect. + */ + rangedValue?: [NullableDateType, NullableDateType] | null; + hoverRangedValue?: RangeValue; + inRange?: boolean; + panelPosition?: 'left' | 'right' | false; +}; + +const RangeContextKey: InjectionKey = Symbol('RangeContextProps'); + +export const useProvideRange = (props: RangeContextProps) => { + provide(RangeContextKey, props); +}; + +export const useInjectRange = () => { + return inject(RangeContextKey, { + rangedValue: ref(), + hoverRangedValue: ref(), + inRange: ref(), + panelPosition: ref(), + }); +}; + +export const RangeContextProvider = defineComponent({ + name: 'PanelContextProvider', + inheritAttrs: false, + props: { + value: { + type: Object as PropType, + default: () => ({} as RangeContextProviderValue), + }, + }, + setup(props, { slots }) { + const value: RangeContextProps = { + rangedValue: ref(props.value.rangedValue), + hoverRangedValue: ref(props.value.hoverRangedValue), + inRange: ref(props.value.inRange), + panelPosition: ref(props.value.panelPosition), + }; + useProvideRange(value); + toRef; + watch( + () => props.value, + () => { + Object.keys(props.value).forEach(key => { + if (value[key]) { + value[key].value = props.value[key]; + } + }); + }, + ); + return () => slots.default?.(); + }, +}); + +export default RangeContextKey; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/RangePicker.tsx b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/RangePicker.tsx new file mode 100644 index 0000000..e2bbab8 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/RangePicker.tsx @@ -0,0 +1,1285 @@ +import type { DisabledTimes, PanelMode, PickerMode, RangeValue, EventValue } from './interface' +import type { PickerBaseProps, PickerDateProps, PickerTimeProps } from './Picker' +import type { SharedTimeProps } from './panels/TimePanel' +import PickerTrigger from './PickerTrigger' +import PickerPanel from './PickerPanel' +import usePickerInput from './hooks/usePickerInput' +import getDataOrAriaProps, { toArray, getValue, updateValues } from './utils/miscUtil' +import { getDefaultFormat, getInputSize, elementsContains } from './utils/uiUtil' +import type { ContextOperationRefProps } from './PanelContext' +import { useProvidePanel } from './PanelContext' +import { + isEqual, + getClosingViewDate, + isSameDate, + isSameWeek, + isSameQuarter, + formatValue, + parseValue +} from './utils/dateUtil' +import useValueTexts from './hooks/useValueTexts' +import useTextValueMapping from './hooks/useTextValueMapping' +import type { GenerateConfig } from './generate' +import type { PickerPanelProps } from './index' +import { RangeContextProvider } from './RangeContext' +import useRangeDisabled from './hooks/useRangeDisabled' +import getExtraFooter from './utils/getExtraFooter' +import getRanges from './utils/getRanges' +import useRangeViewDates from './hooks/useRangeViewDates' +import type { DateRender } from './panels/DatePanel/DateBody' +import useHoverValue from './hooks/useHoverValue' +import type { VueNode } from 'ant-design-vue/es/_util/type' +import type { + ChangeEvent, + FocusEventHandler, + MouseEventHandler +} from 'ant-design-vue/es/_util/EventInterface' +import { computed, defineComponent, ref, toRef, watch, watchEffect } from 'vue' +import useMergedState from 'ant-design-vue/es/_util/hooks/useMergedState' +import { warning } from 'ant-design-vue/es/vc-util/warning' +import useState from 'ant-design-vue/es/_util/hooks/useState' +import classNames from 'ant-design-vue/es/_util/classNames' +import { useProviderTrigger } from 'ant-design-vue/es/vc-trigger/context' +import { legacyPropsWarning } from './utils/warnUtil' + +function reorderValues( + values: RangeValue, + generateConfig: GenerateConfig +): RangeValue { + if (values && values[0] && values[1] && generateConfig.isAfter(values[0], values[1])) { + return [values[1], values[0]] + } + + return values +} + +function canValueTrigger( + value: EventValue, + index: number, + disabled: [boolean, boolean], + allowEmpty?: [boolean, boolean] | null +): boolean { + if (value) { + return true + } + + if (allowEmpty && allowEmpty[index]) { + return true + } + + if (disabled[(index + 1) % 2]) { + return true + } + + return false +} + +export type RangeType = 'start' | 'end' + +export type RangeInfo = { + range: RangeType +} + +export type RangeDateRender = (props: { + current: DateType + today: DateType + info: RangeInfo +}) => VueNode + +export type RangePickerSharedProps = { + id?: string + value?: RangeValue + defaultValue?: RangeValue + defaultPickerValue?: [DateType, DateType] + placeholder?: [string, string] + disabled?: boolean | [boolean, boolean] + disabledTime?: (date: EventValue, type: RangeType) => DisabledTimes + ranges?: Record< + string, + Exclude, null> | (() => Exclude, null>) + > + separator?: VueNode + allowEmpty?: [boolean, boolean] + mode?: [PanelMode, PanelMode] + onChange?: (values: RangeValue, formatString: [string, string]) => void + onCalendarChange?: ( + values: RangeValue, + formatString: [string, string], + info: RangeInfo + ) => void + onPanelChange?: (values: RangeValue, modes: [PanelMode, PanelMode]) => void + onFocus?: FocusEventHandler + onBlur?: FocusEventHandler + onMousedown?: MouseEventHandler + onMouseup?: MouseEventHandler + onMouseenter?: MouseEventHandler + onMouseleave?: MouseEventHandler + onClick?: MouseEventHandler + onOk?: (dates: RangeValue) => void + direction?: 'ltr' | 'rtl' + autocomplete?: string + /** @private Internal control of active picker. Do not use since it's private usage */ + activePickerIndex?: 0 | 1 + dateRender?: RangeDateRender + panelRender?: (originPanel: VueNode) => VueNode +} + +type OmitPickerProps = Omit< + Props, + | 'value' + | 'defaultValue' + | 'defaultPickerValue' + | 'placeholder' + | 'disabled' + | 'disabledTime' + | 'showToday' + | 'showTime' + | 'mode' + | 'onChange' + | 'onSelect' + | 'onPanelChange' + | 'pickerValue' + | 'onPickerValueChange' + | 'onOk' + | 'dateRender' +> + +type RangeShowTimeObject = Omit, 'defaultValue'> & { + defaultValue?: DateType[] +} + +export type RangePickerBaseProps = {} & RangePickerSharedProps & + OmitPickerProps> + +export type RangePickerDateProps = { + showTime?: boolean | RangeShowTimeObject +} & RangePickerSharedProps & + OmitPickerProps> + +export type RangePickerTimeProps = { + order?: boolean +} & RangePickerSharedProps & + OmitPickerProps> + +export type RangePickerProps = + | RangePickerBaseProps + | RangePickerDateProps + | RangePickerTimeProps + +// TMP type to fit for ts 3.9.2 +type OmitType = Omit, 'picker'> & + Omit, 'picker'> & + Omit, 'picker'> + +type MergedRangePickerProps = { + picker?: PickerMode +} & OmitType +function RangerPicker() { + return defineComponent>({ + name: 'RangerPicker', + inheritAttrs: false, + props: [ + 'prefixCls', + 'id', + 'popupStyle', + 'dropdownClassName', + 'transitionName', + 'dropdownAlign', + 'getPopupContainer', + 'generateConfig', + 'locale', + 'placeholder', + 'autofocus', + 'disabled', + 'format', + 'picker', + 'showTime', + 'showNow', + 'showHour', + 'showMinute', + 'showSecond', + 'use12Hours', + 'separator', + 'value', + 'defaultValue', + 'defaultPickerValue', + 'open', + 'defaultOpen', + 'disabledDate', + 'disabledTime', + 'dateRender', + 'panelRender', + 'ranges', + 'allowEmpty', + 'allowClear', + 'suffixIcon', + 'clearIcon', + 'pickerRef', + 'inputReadOnly', + 'mode', + 'renderExtraFooter', + 'onChange', + 'onOpenChange', + 'onPanelChange', + 'onCalendarChange', + 'onFocus', + 'onBlur', + 'onMousedown', + 'onMouseup', + 'onMouseenter', + 'onMouseleave', + 'onClick', + 'onOk', + 'onKeydown', + 'components', + 'order', + 'direction', + 'activePickerIndex', + 'autocomplete', + 'minuteStep', + 'hourStep', + 'secondStep', + 'hideDisabledOptions', + 'disabledMinutes' + ] as any, + setup(props, { attrs, expose }) { + const needConfirmButton = computed( + () => (props.picker === 'date' && !!props.showTime) || props.picker === 'time' + ) + const getPortal = useProviderTrigger() + // We record opened status here in case repeat open with picker + const openRecordsRef = ref>({}) + + const containerRef = ref(null) + const panelDivRef = ref(null) + const startInputDivRef = ref(null) + const endInputDivRef = ref(null) + const separatorRef = ref(null) + const startInputRef = ref(null) + const endInputRef = ref(null) + const arrowRef = ref(null) + + // ============================ Warning ============================ + if (process.env.NODE_ENV !== 'production') { + legacyPropsWarning(props) + } + + // ============================= Misc ============================== + const formatList = computed(() => + toArray( + getDefaultFormat(props.format, props.picker, props.showTime, props.use12Hours) + ) + ) + + // Active picker + const [mergedActivePickerIndex, setMergedActivePickerIndex] = useMergedState<0 | 1>(0, { + value: toRef(props, 'activePickerIndex') + }) + + // Operation ref + const operationRef = ref(null) + + const mergedDisabled = computed<[boolean, boolean]>(() => { + const { disabled } = props + if (Array.isArray(disabled)) { + return disabled + } + + return [disabled || false, disabled || false] + }) + + // ============================= Value ============================= + const [mergedValue, setInnerValue] = useMergedState>(null, { + value: toRef(props, 'value'), + defaultValue: props.defaultValue, + postState: (values) => + props.picker === 'time' && !props.order + ? values + : reorderValues(values, props.generateConfig) + }) + + // =========================== View Date =========================== + // Config view panel + const [startViewDate, endViewDate, setViewDate] = useRangeViewDates({ + values: mergedValue, + picker: toRef(props, 'picker'), + defaultDates: props.defaultPickerValue, + generateConfig: toRef(props, 'generateConfig') + }) + + // ========================= Select Values ========================= + const [selectedValue, setSelectedValue] = useMergedState(mergedValue.value, { + postState: (values) => { + let postValues = values + + if (mergedDisabled.value[0] && mergedDisabled.value[1]) { + return postValues + } + + // Fill disabled unit + for (let i = 0; i < 2; i += 1) { + if (mergedDisabled[i] && !getValue(postValues, i) && !getValue(props.allowEmpty, i)) { + postValues = updateValues(postValues, props.generateConfig.getNow(), i) + } + } + return postValues + } + }) + + // ============================= Modes ============================= + const [mergedModes, setInnerModes] = useMergedState<[PanelMode, PanelMode]>( + [props.picker, props.picker], + { + value: toRef(props, 'mode') + } + ) + + watch( + () => props.picker, + () => { + setInnerModes([props.picker, props.picker]) + } + ) + + const triggerModesChange = (modes: [PanelMode, PanelMode], values: RangeValue) => { + setInnerModes(modes) + props.onPanelChange?.(values, modes) + } + + // ========================= Disable Date ========================== + const [disabledStartDate, disabledEndDate] = useRangeDisabled( + { + picker: toRef(props, 'picker'), + selectedValue, + locale: toRef(props, 'locale'), + disabled: mergedDisabled, + disabledDate: toRef(props, 'disabledDate'), + generateConfig: toRef(props, 'generateConfig') + }, + openRecordsRef + ) + + // ============================= Open ============================== + const [mergedOpen, triggerInnerOpen] = useMergedState(false, { + value: toRef(props, 'open'), + defaultValue: props.defaultOpen, + postState: (postOpen) => + mergedDisabled.value[mergedActivePickerIndex.value] ? false : postOpen, + onChange: (newOpen) => { + props.onOpenChange?.(newOpen) + + if (!newOpen && operationRef.value && operationRef.value.onClose) { + operationRef.value.onClose() + } + } + }) + + const startOpen = computed(() => mergedOpen.value && mergedActivePickerIndex.value === 0) + const endOpen = computed(() => mergedOpen.value && mergedActivePickerIndex.value === 1) + + // ============================= Popup ============================= + // Popup min width + const popupMinWidth = ref(0) + watch(mergedOpen, () => { + if (!mergedOpen.value && containerRef.value) { + popupMinWidth.value = containerRef.value.offsetWidth + } + }) + + // ============================ Trigger ============================ + const triggerRef = ref() + + function triggerOpen(newOpen: boolean, index: 0 | 1) { + if (newOpen) { + clearTimeout(triggerRef.value) + openRecordsRef.value[index] = true + + setMergedActivePickerIndex(index) + triggerInnerOpen(newOpen) + + // Open to reset view date + if (!mergedOpen.value) { + setViewDate(null, index) + } + } else if (mergedActivePickerIndex.value === index) { + triggerInnerOpen(newOpen) + + // Clean up async + // This makes ref not quick refresh in case user open another input with blur trigger + const openRecords = openRecordsRef.value + triggerRef.value = setTimeout(() => { + if (openRecords === openRecordsRef.value) { + openRecordsRef.value = {} + } + }) + } + } + + function triggerOpenAndFocus(index: 0 | 1) { + triggerOpen(true, index) + // Use setTimeout to make sure panel DOM exists + setTimeout(() => { + const inputRef = [startInputRef, endInputRef][index] + if (inputRef.value) { + inputRef.value.focus() + } + }, 0) + } + + function triggerChange(newValue: RangeValue, sourceIndex: 0 | 1) { + let values = newValue + let startValue = getValue(values, 0) + let endValue = getValue(values, 1) + const { + generateConfig, + locale, + picker, + order, + onCalendarChange, + allowEmpty, + onChange, + showTime + } = props + + // >>>>> Format start & end values + if (startValue && endValue && generateConfig.isAfter(startValue, endValue)) { + if ( + // WeekPicker only compare week + (picker === 'week' && + !isSameWeek(generateConfig, locale.locale, startValue, endValue)) || + // QuotaPicker only compare week + (picker === 'quarter' && !isSameQuarter(generateConfig, startValue, endValue)) || + // Other non-TimePicker compare date + (picker !== 'week' && + picker !== 'quarter' && + picker !== 'time' && + !(showTime + ? isEqual(generateConfig, startValue, endValue) + : isSameDate(generateConfig, startValue, endValue))) + ) { + // Clean up end date when start date is after end date + if (sourceIndex === 0) { + values = [startValue, null] + endValue = null + } else { + startValue = null + values = [null, endValue] + } + + // Clean up cache since invalidate + openRecordsRef.value = { + [sourceIndex]: true + } + } else if (picker !== 'time' || order !== false) { + // Reorder when in same date + values = reorderValues(values, generateConfig) + } + } + + setSelectedValue(values) + + const startStr = + values && values[0] + ? formatValue(values[0], { generateConfig, locale, format: formatList.value[0] }) + : '' + const endStr = + values && values[1] + ? formatValue(values[1], { generateConfig, locale, format: formatList.value[0] }) + : '' + if (onCalendarChange) { + const info: RangeInfo = { range: sourceIndex === 0 ? 'start' : 'end' } + + onCalendarChange(values, [startStr, endStr], info) + } + + // >>>>> Trigger `onChange` event + const canStartValueTrigger = canValueTrigger( + startValue, + 0, + mergedDisabled.value, + allowEmpty + ) + const canEndValueTrigger = canValueTrigger(endValue, 1, mergedDisabled.value, allowEmpty) + + const canTrigger = values === null || (canStartValueTrigger && canEndValueTrigger) + + if (canTrigger) { + // Trigger onChange only when value is validate + setInnerValue(values) + + if ( + onChange && + (!isEqual(generateConfig, getValue(mergedValue.value, 0), startValue) || + !isEqual(generateConfig, getValue(mergedValue.value, 1), endValue)) + ) { + onChange(values, [startStr, endStr]) + } + } + + // >>>>> Open picker when + + // Always open another picker if possible + let nextOpenIndex: 0 | 1 = null + if (sourceIndex === 0 && !mergedDisabled.value[1]) { + nextOpenIndex = 1 + } else if (sourceIndex === 1 && !mergedDisabled.value[0]) { + nextOpenIndex = 0 + } + + if ( + nextOpenIndex !== null && + nextOpenIndex !== mergedActivePickerIndex.value && + (!openRecordsRef.value[nextOpenIndex] || !getValue(values, nextOpenIndex)) && + getValue(values, sourceIndex) + ) { + // Delay to focus to avoid input blur trigger expired selectedValues + triggerOpenAndFocus(nextOpenIndex) + } else { + triggerOpen(false, sourceIndex) + } + } + + const forwardKeydown = (e: KeyboardEvent) => { + if (mergedOpen && operationRef.value && operationRef.value.onKeydown) { + // Let popup panel handle keyboard + return operationRef.value.onKeydown(e) + } + + /* istanbul ignore next */ + /* eslint-disable no-lone-blocks */ + { + warning( + false, + 'Picker not correct forward Keydown operation. Please help to fire issue about this.' + ) + return false + } + } + + // ============================= Text ============================== + const sharedTextHooksProps = { + formatList, + generateConfig: toRef(props, 'generateConfig'), + locale: toRef(props, 'locale') + } + + const [startValueTexts, firstStartValueText] = useValueTexts( + computed(() => getValue(selectedValue.value, 0)), + sharedTextHooksProps + ) + + const [endValueTexts, firstEndValueText] = useValueTexts( + computed(() => getValue(selectedValue.value, 1)), + sharedTextHooksProps + ) + + const onTextChange = (newText: string, index: 0 | 1) => { + const inputDate = parseValue(newText, { + locale: props.locale, + formatList: formatList.value, + generateConfig: props.generateConfig + }) + + const disabledFunc = index === 0 ? disabledStartDate : disabledEndDate + + if (inputDate && !disabledFunc(inputDate)) { + setSelectedValue(updateValues(selectedValue.value, inputDate, index)) + setViewDate(inputDate, index) + } + } + + const [startText, triggerStartTextChange, resetStartText] = useTextValueMapping({ + valueTexts: startValueTexts, + onTextChange: (newText) => onTextChange(newText, 0) + }) + + const [endText, triggerEndTextChange, resetEndText] = useTextValueMapping({ + valueTexts: endValueTexts, + onTextChange: (newText) => onTextChange(newText, 1) + }) + + const [rangeHoverValue, setRangeHoverValue] = useState>(null) + + // ========================== Hover Range ========================== + const [hoverRangedValue, setHoverRangedValue] = useState>(null) + + const [startHoverValue, onStartEnter, onStartLeave] = useHoverValue( + startText, + sharedTextHooksProps + ) + + const [endHoverValue, onEndEnter, onEndLeave] = useHoverValue(endText, sharedTextHooksProps) + + const onDateMouseenter = (date: DateType) => { + setHoverRangedValue(updateValues(selectedValue.value, date, mergedActivePickerIndex.value)) + if (mergedActivePickerIndex.value === 0) { + onStartEnter(date) + } else { + onEndEnter(date) + } + } + + const onDateMouseleave = () => { + setHoverRangedValue(updateValues(selectedValue.value, null, mergedActivePickerIndex.value)) + if (mergedActivePickerIndex.value === 0) { + onStartLeave() + } else { + onEndLeave() + } + } + + // ============================= Input ============================= + const getSharedInputHookProps = (index: 0 | 1, resetText: () => void) => ({ + forwardKeydown, + onBlur: (e: FocusEvent) => { + props.onBlur?.(e) + }, + isClickOutside: (target: EventTarget | null) => + !elementsContains( + [panelDivRef.value, startInputDivRef.value, endInputDivRef.value, containerRef.value], + target as HTMLElement + ), + onFocus: (e: FocusEvent) => { + setMergedActivePickerIndex(index) + props.onFocus?.(e) + }, + triggerOpen: (newOpen: boolean) => { + triggerOpen(newOpen, index) + }, + onSubmit: () => { + if ( + // When user typing disabledDate with keyboard and enter, this value will be empty + !selectedValue.value || + // Normal disabled check + (props.disabledDate && props.disabledDate(selectedValue.value[index])) + ) { + return false + } + triggerChange(selectedValue.value, index) + resetText() + }, + onCancel: () => { + triggerOpen(false, index) + setSelectedValue(mergedValue.value) + resetText() + } + }) + + const [startInputProps, { focused: startFocused, typing: startTyping }] = usePickerInput({ + ...getSharedInputHookProps(0, resetStartText), + blurToCancel: needConfirmButton, + open: startOpen, + value: startText, + onKeydown: (e, preventDefault) => { + props.onKeydown?.(e, preventDefault) + } + }) + + const [endInputProps, { focused: endFocused, typing: endTyping }] = usePickerInput({ + ...getSharedInputHookProps(1, resetEndText), + blurToCancel: needConfirmButton, + open: endOpen, + value: endText, + onKeydown: (e, preventDefault) => { + props.onKeydown?.(e, preventDefault) + } + }) + + // ========================== Click Picker ========================== + const onPickerClick = (e: MouseEvent) => { + // When click inside the picker & outside the picker's input elements + // the panel should still be opened + props.onClick?.(e) + if ( + !mergedOpen.value && + !startInputRef.value.contains(e.target as Node) && + !endInputRef.value.contains(e.target as Node) + ) { + if (!mergedDisabled.value[0]) { + triggerOpenAndFocus(0) + } else if (!mergedDisabled.value[1]) { + triggerOpenAndFocus(1) + } + } + } + + const onPickerMousedown = (e: MouseEvent) => { + // shouldn't affect input elements if picker is active + props.onMousedown?.(e) + if ( + mergedOpen.value && + (startFocused.value || endFocused.value) && + !startInputRef.value.contains(e.target as Node) && + !endInputRef.value.contains(e.target as Node) + ) { + e.preventDefault() + } + } + + // ============================= Sync ============================== + // Close should sync back with text value + const startStr = computed(() => + mergedValue.value?.[0] + ? formatValue(mergedValue.value[0], { + locale: props.locale, + format: 'YYYYMMDDHHmmss', + generateConfig: props.generateConfig + }) + : '' + ) + const endStr = computed(() => + mergedValue.value?.[1] + ? formatValue(mergedValue.value[1], { + locale: props.locale, + format: 'YYYYMMDDHHmmss', + generateConfig: props.generateConfig + }) + : '' + ) + + watch([mergedOpen, startValueTexts, endValueTexts], () => { + if (!mergedOpen.value) { + setSelectedValue(mergedValue.value) + + if (!startValueTexts.value.length || startValueTexts.value[0] === '') { + triggerStartTextChange('') + } else if (firstStartValueText.value !== startText.value) { + resetStartText() + } + if (!endValueTexts.value.length || endValueTexts.value[0] === '') { + triggerEndTextChange('') + } else if (firstEndValueText.value !== endText.value) { + resetEndText() + } + } + }) + + // Sync innerValue with control mode + watch([startStr, endStr], () => { + setSelectedValue(mergedValue.value) + }) + + // ============================ Warning ============================ + if (process.env.NODE_ENV !== 'production') { + watchEffect(() => { + const { value, disabled } = props + if ( + value && + Array.isArray(disabled) && + ((getValue(disabled, 0) && !getValue(value, 0)) || + (getValue(disabled, 1) && !getValue(value, 1))) + ) { + warning( + false, + '`disabled` should not set with empty `value`. You should set `allowEmpty` or `value` instead.' + ) + } + }) + } + + expose({ + focus: () => { + if (startInputRef.value) { + startInputRef.value.focus() + } + }, + blur: () => { + if (startInputRef.value) { + startInputRef.value.blur() + } + if (endInputRef.value) { + endInputRef.value.blur() + } + } + }) + + // ============================ Ranges ============================= + + const rangeList = computed(() => + Object.keys(props.ranges || {}).map((label) => { + const range = props.ranges![label] + const newValues = typeof range === 'function' ? range() : range + + return { + label, + onClick: () => { + triggerChange(newValues, null) + triggerOpen(false, mergedActivePickerIndex.value) + }, + onMouseenter: () => { + setRangeHoverValue(newValues) + }, + onMouseleave: () => { + setRangeHoverValue(null) + } + } + }) + ) + // ============================= Panel ============================= + const panelHoverRangedValue = computed(() => { + if ( + mergedOpen.value && + hoverRangedValue.value && + hoverRangedValue.value[0] && + hoverRangedValue.value[1] && + props.generateConfig.isAfter(hoverRangedValue.value[1], hoverRangedValue.value[0]) + ) { + return hoverRangedValue.value + } else { + return null + } + }) + function renderPanel( + panelPosition: 'left' | 'right' | false = false, + panelProps: Partial> = {} + ) { + const { generateConfig, showTime, dateRender, direction, disabledTime, prefixCls, locale } = + props + + let panelShowTime: boolean | SharedTimeProps | undefined = + showTime as SharedTimeProps + if (showTime && typeof showTime === 'object' && showTime.defaultValue) { + const timeDefaultValues: DateType[] = showTime.defaultValue! + panelShowTime = { + ...showTime, + defaultValue: getValue(timeDefaultValues, mergedActivePickerIndex.value) || undefined + } + } + + let panelDateRender: DateRender | null = null + if (dateRender) { + panelDateRender = ({ current: date, today }) => + dateRender({ + current: date, + today, + info: { + range: mergedActivePickerIndex.value ? 'end' : 'start' + } + }) + } + + return ( + + + {...(props as any)} + {...panelProps} + dateRender={panelDateRender} + showTime={panelShowTime} + mode={mergedModes.value[mergedActivePickerIndex.value]} + generateConfig={generateConfig} + style={undefined} + direction={direction} + disabledDate={ + mergedActivePickerIndex.value === 0 ? disabledStartDate : disabledEndDate + } + disabledTime={(date) => { + if (disabledTime) { + return disabledTime(date, mergedActivePickerIndex.value === 0 ? 'start' : 'end') + } + return false + }} + class={classNames({ + [`${prefixCls}-panel-focused`]: + mergedActivePickerIndex.value === 0 ? !startTyping.value : !endTyping.value + })} + value={getValue(selectedValue.value, mergedActivePickerIndex.value)} + locale={locale} + tabIndex={-1} + onPanelChange={(date, newMode) => { + // clear hover value when panel change + if (mergedActivePickerIndex.value === 0) { + onStartLeave(true) + } + if (mergedActivePickerIndex.value === 1) { + onEndLeave(true) + } + triggerModesChange( + updateValues(mergedModes.value, newMode, mergedActivePickerIndex.value), + updateValues(selectedValue.value, date, mergedActivePickerIndex.value) + ) + + let viewDate = date + if ( + panelPosition === 'right' && + mergedModes.value[mergedActivePickerIndex.value] === newMode + ) { + viewDate = getClosingViewDate(viewDate, newMode as any, generateConfig, -1) + } + setViewDate(viewDate, mergedActivePickerIndex.value) + }} + onOk={null} + onSelect={undefined} + onChange={undefined} + defaultValue={ + mergedActivePickerIndex.value === 0 + ? getValue(selectedValue.value, 1) + : getValue(selectedValue.value, 0) + } + /> + + ) + } + + const onContextSelect = (date: DateType, type: 'key' | 'mouse' | 'submit') => { + const values = updateValues(selectedValue.value, date, mergedActivePickerIndex.value) + + if (type === 'submit' || (type !== 'key' && !needConfirmButton.value)) { + // triggerChange will also update selected values + triggerChange(values, mergedActivePickerIndex.value) + // clear hover value style + if (mergedActivePickerIndex.value === 0) { + onStartLeave() + } else { + onEndLeave() + } + } else { + setSelectedValue(values) + } + } + + useProvidePanel({ + operationRef, + hideHeader: computed(() => props.picker === 'time'), + onDateMouseenter, + onDateMouseleave, + hideRanges: computed(() => true), + onSelect: onContextSelect, + open: mergedOpen + }) + + return () => { + const { + prefixCls = 'rc-picker', + id, + popupStyle, + dropdownClassName, + transitionName, + dropdownAlign, + getPopupContainer, + generateConfig, + locale, + placeholder, + autofocus, + picker = 'date', + showTime, + separator = '~', + disabledDate, + panelRender, + allowClear, + suffixIcon, + clearIcon, + inputReadOnly, + renderExtraFooter, + onMouseenter, + onMouseleave, + onMouseup, + onOk, + components, + direction, + autocomplete = 'off' + } = props + let arrowLeft = 0 + let panelLeft = 0 + if ( + mergedActivePickerIndex.value && + startInputDivRef.value && + separatorRef.value && + panelDivRef.value + ) { + // Arrow offset + arrowLeft = startInputDivRef.value.offsetWidth + separatorRef.value.offsetWidth + if ( + panelDivRef.value.offsetWidth && + arrowRef.value.offsetWidth && + arrowLeft > + panelDivRef.value.offsetWidth - + arrowRef.value.offsetWidth - + (direction === 'rtl' || arrowRef.value.offsetLeft > arrowLeft + ? 0 + : arrowRef.value.offsetLeft) + ) { + panelLeft = arrowLeft + } + } + + const arrowPositionStyle = + direction === 'rtl' ? { right: `${arrowLeft}px` } : { left: `${arrowLeft}px` } + + function renderPanels() { + let panels: VueNode + const extraNode = getExtraFooter( + prefixCls, + mergedModes.value[mergedActivePickerIndex.value], + renderExtraFooter + ) + + const rangesNode = getRanges({ + prefixCls, + components, + needConfirmButton: needConfirmButton.value, + okDisabled: + !getValue(selectedValue.value, mergedActivePickerIndex.value) || + (disabledDate && disabledDate(selectedValue.value[mergedActivePickerIndex.value])), + locale, + rangeList: rangeList.value, + onOk: () => { + if (getValue(selectedValue.value, mergedActivePickerIndex.value)) { + // triggerChangeOld(selectedValue.value); + triggerChange(selectedValue.value, mergedActivePickerIndex.value) + if (onOk) { + onOk(selectedValue.value) + } + } + } + }) + + if (picker !== 'time' && !showTime) { + const viewDate = + mergedActivePickerIndex.value === 0 ? startViewDate.value : endViewDate.value + const nextViewDate = getClosingViewDate(viewDate, picker, generateConfig) + const currentMode = mergedModes.value[mergedActivePickerIndex.value] + + const showDoublePanel = currentMode === picker + const leftPanel = renderPanel(showDoublePanel ? 'left' : false, { + pickerValue: viewDate, + onPickerValueChange: (newViewDate) => { + setViewDate(newViewDate, mergedActivePickerIndex.value) + } + }) + const rightPanel = renderPanel('right', { + pickerValue: nextViewDate, + onPickerValueChange: (newViewDate) => { + setViewDate( + getClosingViewDate(newViewDate, picker, generateConfig, -1), + mergedActivePickerIndex.value + ) + } + }) + + if (direction === 'rtl') { + panels = ( + <> + {rightPanel} + {showDoublePanel && leftPanel} + + ) + } else { + panels = ( + <> + {leftPanel} + {showDoublePanel && rightPanel} + + ) + } + } else { + panels = renderPanel() + } + + let mergedNodes: VueNode = ( + <> +
{panels}
+ {(extraNode || rangesNode) && ( +
+ {extraNode} + {rangesNode} +
+ )} + + ) + + if (panelRender) { + mergedNodes = panelRender(mergedNodes) + } + + return ( +
{ + e.preventDefault() + }} + > + {mergedNodes} +
+ ) + } + + const rangePanel = ( +
+
+ {renderPanels()} +
+ ) + + // ============================= Icons ============================= + let suffixNode: VueNode + if (suffixIcon) { + suffixNode = {suffixIcon} + } + + let clearNode: VueNode + if ( + allowClear && + ((getValue(mergedValue.value, 0) && !mergedDisabled.value[0]) || + (getValue(mergedValue.value, 1) && !mergedDisabled.value[1])) + ) { + clearNode = ( + { + e.preventDefault() + e.stopPropagation() + }} + onMouseup={(e) => { + e.preventDefault() + e.stopPropagation() + let values = mergedValue.value + + if (!mergedDisabled.value[0]) { + values = updateValues(values, null, 0) + } + if (!mergedDisabled.value[1]) { + values = updateValues(values, null, 1) + } + + triggerChange(values, null) + triggerOpen(false, mergedActivePickerIndex.value) + }} + class={`${prefixCls}-clear`} + > + {clearIcon || } + + ) + } + + const inputSharedProps = { + size: getInputSize(picker, formatList.value[0], generateConfig) + } + + let activeBarLeft = 0 + let activeBarWidth = 0 + if (startInputDivRef.value && endInputDivRef.value && separatorRef.value) { + if (mergedActivePickerIndex.value === 0) { + activeBarWidth = startInputDivRef.value.offsetWidth + } else { + activeBarLeft = arrowLeft + activeBarWidth = endInputDivRef.value.offsetWidth + } + } + const activeBarPositionStyle = + direction === 'rtl' ? { right: `${activeBarLeft}px` } : { left: `${activeBarLeft}px` } + // ============================ Return ============================= + + return ( + rangePanel + }} + > +
+
+ { + triggerStartTextChange(e.target.value) + }} + autofocus={autofocus} + placeholder={getValue(placeholder, 0) || ''} + ref={startInputRef} + {...startInputProps.value} + {...inputSharedProps} + autocomplete={autocomplete} + /> +
+
+ {separator} +
+
+ { + triggerEndTextChange(e.target.value) + }} + placeholder={getValue(placeholder, 1) || ''} + ref={endInputRef} + {...endInputProps.value} + {...inputSharedProps} + autocomplete={autocomplete} + /> +
+
+ {suffixNode} + {clearNode} + {getPortal()} +
+ + ) + } + } + }) +} + +const InterRangerPicker = RangerPicker() +export default InterRangerPicker diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/generate/dateFns.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/generate/dateFns.ts new file mode 100644 index 0000000..4f3a8e9 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/generate/dateFns.ts @@ -0,0 +1,140 @@ +import { + getDay, + getYear, + getMonth, + getDate, + endOfMonth, + getHours, + getMinutes, + getSeconds, + addYears, + addMonths, + addDays, + setYear, + setMonth, + setDate, + setHours, + setMinutes, + setSeconds, + isAfter, + isValid, + getWeek, + startOfWeek, + format as formatDate, + parse as parseDate, + isDate, + isMatch +} from 'date-fns' + +import * as Locale from 'date-fns/locale' +import type { GenerateConfig } from './index' + +const dealLocal = (str: string) => { + return str.replace(/_/g, '') +} + +const localeParse = (format: string) => { + return format + .replace(/Y/g, 'y') + .replace(/D/g, 'd') + .replace(/gggg/, 'yyyy') + .replace(/g/g, 'G') + .replace(/([Ww])o/g, 'wo') +} + +const generateConfig: GenerateConfig = { + // get + getNow: () => new Date(), + getFixedDate: (string) => new Date(string), + getEndDate: (date) => endOfMonth(date), + getWeekDay: (date) => getDay(date), + getYear: (date) => getYear(date), + getMonth: (date) => getMonth(date), + getDate: (date) => getDate(date), + getHour: (date) => getHours(date), + getMinute: (date) => getMinutes(date), + getSecond: (date) => getSeconds(date), + + // set + addYear: (date, diff) => addYears(date, diff), + addMonth: (date, diff) => addMonths(date, diff), + addDate: (date, diff) => addDays(date, diff), + setYear: (date, year) => setYear(date, year), + setMonth: (date, month) => setMonth(date, month), + setDate: (date, num) => setDate(date, num), + setHour: (date, hour) => setHours(date, hour), + setMinute: (date, minute) => setMinutes(date, minute), + setSecond: (date, second) => setSeconds(date, second), + + // Compare + isAfter: (date1, date2) => isAfter(date1, date2), + isValidate: (date) => isValid(date), + + locale: { + getWeekFirstDay: (locale) => { + const clone = Locale[dealLocal(locale)] + return clone.options.weekStartsOn + }, + getWeekFirstDate: (locale, date) => { + return startOfWeek(date, { locale: Locale[dealLocal(locale)] }) + }, + getWeek: (locale, date) => { + return getWeek(date, { locale: Locale[dealLocal(locale)] }) + }, + getShortWeekDays: (locale) => { + const clone = Locale[dealLocal(locale)] + return Array.from({ length: 7 }).map((_, i) => clone.localize.day(i, { width: 'short' })) + }, + getShortMonths: (locale) => { + const clone = Locale[dealLocal(locale)] + return Array.from({ length: 12 }).map((_, i) => + clone.localize.month(i, { width: 'abbreviated' }) + ) + }, + format: (locale, date, format) => { + if (!isValid(date)) { + return null + } + return formatDate(date, localeParse(format), { + locale: Locale[dealLocal(locale)] + }) + }, + parse: (locale, text, formats) => { + for (let i = 0; i < formats.length; i += 1) { + const format = localeParse(formats[i]) + const formatText = text + const date = parseDate(formatText, format, new Date(), { + locale: Locale[dealLocal(locale)] + }) + if (isValid(date) && formatText.length === format.length && isMatch(formatText, format)) { + return date + } + } + return null + } + }, + toDate: (value, valueFormat) => { + if (Array.isArray(value)) { + return value.map((val: any) => + typeof val === 'string' && val ? parseDate(val, valueFormat, new Date()) : val || null + ) as Date[] + } else { + return ( + typeof value === 'string' && value + ? parseDate(value, valueFormat, new Date()) + : value || null + ) as Date + } + }, + toString: (value, valueFormat) => { + if (Array.isArray(value)) { + return value.map((val: any) => + isDate(val) ? formatDate(val as Date, valueFormat) : val + ) as string[] + } else { + return (isDate(value) ? formatDate(value as Date, valueFormat) : value) as string + } + } +} + +export default generateConfig diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/generate/dayjs.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/generate/dayjs.ts new file mode 100644 index 0000000..482132d --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/generate/dayjs.ts @@ -0,0 +1,296 @@ +import type { Dayjs } from 'dayjs' +import dayjs from 'dayjs' +import weekday from 'dayjs/plugin/weekday' +import localeData from 'dayjs/plugin/localeData' +import weekOfYear from 'dayjs/plugin/weekOfYear' +import weekYear from 'dayjs/plugin/weekYear' +import advancedFormat from 'dayjs/plugin/advancedFormat' +import customParseFormat from 'dayjs/plugin/customParseFormat' +import type { GenerateConfig } from './index' +import { noteOnce } from 'ant-design-vue/es/vc-util/warning' +import jalaliday from "dayjalali" +import updateLocale from 'dayjs/plugin/updateLocale' +dayjs.extend(updateLocale) +dayjs.extend(jalaliday) +//@ts-ignore +dayjs.calendar('jalali') +//import jalali from 'jalali-dayjs' +//import {de} from "date-fns/locale"; +//dayjs.extend(jalali) +dayjs.extend(customParseFormat) +dayjs.extend(advancedFormat) +dayjs.extend(weekday) +dayjs.extend(localeData) +dayjs.extend(weekOfYear) +dayjs.extend(weekYear) + +dayjs.extend((_o, c) => { + // todo support Wo (ISO week) + const proto = c.prototype + const oldFormat = proto.format + proto.format = function f(formatStr: string) { + const str = (formatStr || '').replace('Wo', 'wo') + return oldFormat.bind(this)(str) + } +}) + +type IlocaleMapObject = Record +const monthsShort = [ + 'فروردین', + 'اردیبهشت', + 'خرداد', + 'تیر', + 'مرداد', + 'شهریور', + 'مهر', + 'آبان', + 'آذر', + 'دی', + 'بهمن', + 'اسفند' +] +const months = [ + 'فروردین', + 'اردیبهشت', + 'خرداد', + 'تیر', + 'مرداد', + 'شهریور', + 'مهر', + 'آبان', + 'آذر', + 'دی', + 'بهمن', + 'اسفند' +] + +//const weekdays = ['Sunday', 'Monday', 'Tuesday', 'سشیشسی', 'Thursday', 'جمعه', 'شنبه'] + +/*dayjs.updateLocale('en', { + +})*/ + +dayjs.updateLocale('fa', { + months: months, + monthsShort: monthsShort + // weekdays: weekdays, +}) + +const localeMap: IlocaleMapObject = { + // ar_EG: + // az_AZ: + // bg_BG: + bn_BD: 'bn-bd', + by_BY: 'be', + // ca_ES: + // cs_CZ: + // da_DK: + // de_DE: + // el_GR: + en_GB: 'en-gb', + en_US: 'en', + // es_ES: + // et_EE: + fa_IR: 'fa', + // fi_FI: + fr_BE: 'fr', // todo: dayjs has no fr_BE locale, use fr at present + fr_CA: 'fr-ca', + // fr_FR: + // ga_IE: + // gl_ES: + // he_IL: + // hi_IN: + // hr_HR: + // hu_HU: + hy_AM: 'hy-am', + // id_ID: + // is_IS: + // it_IT: + // ja_JP: + // ka_GE: + // kk_KZ: + // km_KH: + kmr_IQ: 'ku', + // kn_IN: + // ko_KR: + // ku_IQ: // previous ku in antd + // lt_LT: + // lv_LV: + // mk_MK: + // ml_IN: + // mn_MN: + // ms_MY: + // nb_NO: + // ne_NP: + nl_BE: 'nl-be', + // nl_NL: + // pl_PL: + pt_BR: 'pt-br', + // pt_PT: + // ro_RO: + // ru_RU: + // sk_SK: + // sl_SI: + // sr_RS: + // sv_SE: + // ta_IN: + // th_TH: + // tr_TR: + // uk_UA: + // ur_PK: + // vi_VN: + zh_CN: 'zh-cn', + zh_HK: 'zh-hk', + zh_TW: 'zh-tw' +} + +const parseLocale = (locale: string) => { + const mapLocale = localeMap[locale] + return mapLocale || locale.split('_')[0] +} + +const parseNoMatchNotice = () => { + /* istanbul ignore next */ + noteOnce(false, 'Not match any format. Please help to fire a issue about this.') +} + +const generateConfig: GenerateConfig = { + // get + getNow: () => { + //todo check + return dayjs().locale('fa') + }, + getFixedDate: (string) => { + return dayjs(string, ['YYYY-M-DD', 'YYYY-MM-DD']) + }, + getEndDate: (date) => { + return date.endOf('month') + }, + getWeekDay: (date) => { + const clone = date.locale('en') + return clone.weekday() + clone.localeData().firstDayOfWeek() + }, + getYear: (date) => { + return date.year() + }, + getMonth: (date) => { + return date.month() + }, + getDate: (date) => { + return date.locale('fa').date() + }, + getHour: (date) => { + return date.hour() + }, + getMinute: (date) => { + return date.minute() + }, + getSecond: (date) => { + return date.second() + }, + + // set + addYear: (date, diff) => { + return date.add(diff, 'year') + }, + addMonth: (date, diff) => { + return date.add(diff, 'month') + }, + addDate: (date, diff) => { + return date.add(diff, 'day') + }, + setYear: (date, year) => { + return date.year(year) + }, + setMonth: (date, month) => { + return date.month(month) + }, + setDate: (date, num) => { + return date.date(num) + }, + setHour: (date, hour) => { + return date.hour(hour) + }, + setMinute: (date, minute) => { + return date.minute(minute) + }, + setSecond: (date, second) => { + return date.second(second) + }, + + // Compare + isAfter: (date1, date2) => date1.isAfter(date2), + isValidate: (date) => date.isValid(), + + locale: { + getWeekFirstDay: (locale) => { + return dayjs().locale(parseLocale(locale)).localeData().firstDayOfWeek() + }, + getWeekFirstDate: (locale, date) => { + return date.locale(parseLocale(locale)).weekday(0) + }, + getWeek: (locale, date) => { + return date.locale(parseLocale(locale)).week() + }, + getShortWeekDays: (locale) => { + return dayjs().locale(parseLocale(locale)).localeData().weekdaysMin() + }, + getShortMonths: (locale) => { + return dayjs().locale(parseLocale(locale)).localeData().monthsShort() + }, + format: (locale, date, format) => { + return date.locale(parseLocale(locale)).format(format) + }, + parse: (locale, text, formats) => { + const localeStr = parseLocale(locale) + for (let i = 0; i < formats.length; i += 1) { + const format = formats[i] + const formatText = text + if (format.includes('wo') || format.includes('Wo')) { + // parse Wo + const year = formatText.split('-')[0] + const weekStr = formatText.split('-')[1] + const firstWeek = dayjs(year, 'YYYY').startOf('year').locale(localeStr) + for (let j = 0; j <= 52; j += 1) { + const nextWeek = firstWeek.add(j, 'week') + if (nextWeek.format('Wo') === weekStr) { + return nextWeek + } + } + parseNoMatchNotice() + return null + } + const date = dayjs(formatText, format, true).locale(localeStr) + if (date.isValid()) { + return date + } + } + + if (!text) { + parseNoMatchNotice() + } + return null + } + }, + + toDate: (value, valueFormat) => { + if (Array.isArray(value)) { + return value.map((val: any) => + typeof val === 'string' && val ? dayjs(val, valueFormat) : val || null + ) as Dayjs[] + } else { + return ( + typeof value === 'string' && value ? dayjs(value, valueFormat) : value || null + ) as Dayjs + } + }, + toString: (value, valueFormat) => { + if (Array.isArray(value)) { + return value.map((val: any) => (dayjs.isDayjs(val) ? val.format(valueFormat) : val)) + } else { + return dayjs.isDayjs(value) ? value.format(valueFormat) : value + } + } +} + +export default generateConfig diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/generate/index.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/generate/index.ts new file mode 100644 index 0000000..4e3e7ca --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/generate/index.ts @@ -0,0 +1,52 @@ +export type GenerateConfig = { + // Get + getWeekDay: (value: DateType) => number; + getSecond: (value: DateType) => number; + getMinute: (value: DateType) => number; + getHour: (value: DateType) => number; + getDate: (value: DateType) => number; + getMonth: (value: DateType) => number; + getYear: (value: DateType) => number; + getNow: () => DateType; + getFixedDate: (fixed: string) => DateType; + getEndDate: (value: DateType) => DateType; + + // Set + addYear: (value: DateType, diff: number) => DateType; + addMonth: (value: DateType, diff: number) => DateType; + addDate: (value: DateType, diff: number) => DateType; + setYear: (value: DateType, year: number) => DateType; + setMonth: (value: DateType, month: number) => DateType; + setDate: (value: DateType, date: number) => DateType; + setHour: (value: DateType, hour: number) => DateType; + setMinute: (value: DateType, minute: number) => DateType; + setSecond: (value: DateType, second: number) => DateType; + + // Compare + isAfter: (date1: DateType, date2: DateType) => boolean; + isValidate: (date: DateType) => boolean; + + toDate: ( + value: string | string[] | DateType | DateType[], + valueFormat: string, + ) => DateType | DateType[]; + toString: ( + value: string | string[] | DateType | DateType[], + valueFormat: string, + ) => string | string[]; + locale: { + getWeekFirstDay: (locale: string) => number; + getWeekFirstDate: (locale: string, value: DateType) => DateType; + getWeek: (locale: string, value: DateType) => number; + + format: (locale: string, date: DateType, format: string) => string; + + /** Should only return validate date instance */ + parse: (locale: string, text: string, formats: string[]) => DateType | null; + + /** A proxy for getting locale with moment or other locale library */ + getShortWeekDays?: (locale: string) => string[]; + /** A proxy for getting locale with moment or other locale library */ + getShortMonths?: (locale: string) => string[]; + }; +}; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/generate/moment.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/generate/moment.ts new file mode 100644 index 0000000..ac34543 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/generate/moment.ts @@ -0,0 +1,158 @@ +import { noteOnce } from 'ant-design-vue/es/vc-util/warning' +import type { Moment } from 'moment' +import moment from 'moment' +import type { GenerateConfig } from './index' + +const generateConfig: GenerateConfig = { + // get + getNow: () => moment(), + getFixedDate: (string) => moment(string, 'YYYY-MM-DD'), + getEndDate: (date) => { + const clone = date.clone() + return clone.endOf('month') + }, + getWeekDay: (date) => { + const clone = date.clone().locale('en_US') + return clone.weekday() + clone.localeData().firstDayOfWeek() + }, + getYear: (date) => date.year(), + getMonth: (date) => date.month(), + getDate: (date) => date.date(), + getHour: (date) => date.hour(), + getMinute: (date) => date.minute(), + getSecond: (date) => date.second(), + + // set + addYear: (date, diff) => { + const clone = date.clone() + return clone.add(diff, 'year') + }, + addMonth: (date, diff) => { + const clone = date.clone() + return clone.add(diff, 'month') + }, + addDate: (date, diff) => { + const clone = date.clone() + return clone.add(diff, 'day') + }, + setYear: (date, year) => { + const clone = date.clone() + return clone.year(year) + }, + setMonth: (date, month) => { + const clone = date.clone() + return clone.month(month) + }, + setDate: (date, num) => { + const clone = date.clone() + return clone.date(num) + }, + setHour: (date, hour) => { + const clone = date.clone() + return clone.hour(hour) + }, + setMinute: (date, minute) => { + const clone = date.clone() + return clone.minute(minute) + }, + setSecond: (date, second) => { + const clone = date.clone() + return clone.second(second) + }, + + // Compare + isAfter: (date1, date2) => date1.isAfter(date2), + isValidate: (date) => date.isValid(), + + locale: { + getWeekFirstDay: (locale) => { + const date = moment().locale(locale) + return date.localeData().firstDayOfWeek() + }, + getWeekFirstDate: (locale, date) => { + const clone = date.clone() + const result = clone.locale(locale) + return result.weekday(0) + }, + getWeek: (locale, date) => { + const clone = date.clone() + const result = clone.locale(locale) + return result.week() + }, + getShortWeekDays: (locale) => { + const date = moment().locale(locale) + return date.localeData().weekdaysMin() + }, + getShortMonths: (locale) => { + const date = moment().locale(locale) + return date.localeData().monthsShort() + }, + format: (locale, date, format) => { + const clone = date.clone() + const result = clone.locale(locale) + return result.format(format) + }, + parse: (locale, text, formats) => { + const fallbackFormatList: string[] = [] + + for (let i = 0; i < formats.length; i += 1) { + let format = formats[i] + let formatText = text + + if (format.includes('wo') || format.includes('Wo')) { + format = format.replace(/wo/g, 'w').replace(/Wo/g, 'W') + const matchFormat = format.match(/[-YyMmDdHhSsWwGg]+/g) + const matchText = formatText.match(/[-\d]+/g) + + if (matchFormat && matchText) { + format = matchFormat.join('') + formatText = matchText.join('') + } else { + fallbackFormatList.push(format.replace(/o/g, '')) + } + } + + const date = moment(formatText, format, locale, true) + if (date.isValid()) { + return date + } + } + + // Fallback to fuzzy matching, this should always not reach match or need fire a issue + for (let i = 0; i < fallbackFormatList.length; i += 1) { + const date = moment(text, fallbackFormatList[i], locale, false) + + /* istanbul ignore next */ + if (date.isValid()) { + noteOnce( + false, + 'Not match any format strictly and fallback to fuzzy match. Please help to fire a issue about this.' + ) + return date + } + } + + return null + } + }, + toDate: (value, valueFormat) => { + if (Array.isArray(value)) { + return value.map((val: any) => + typeof val === 'string' && val ? moment(val, valueFormat) : val || null + ) as Moment[] + } else { + return ( + typeof value === 'string' && value ? moment(value, valueFormat) : value || null + ) as Moment + } + }, + toString: (value, valueFormat) => { + if (Array.isArray(value)) { + return value.map((val: any) => (moment.isMoment(val) ? val.format(valueFormat) : val)) + } else { + return moment.isMoment(value) ? value.format(valueFormat) : value + } + } +} + +export default generateConfig diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/hooks/useCellClassName.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/hooks/useCellClassName.ts new file mode 100644 index 0000000..5c9bc4b --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/hooks/useCellClassName.ts @@ -0,0 +1,97 @@ +import { isInRange } from '../utils/dateUtil'; +import type { GenerateConfig } from '../generate'; +import type { RangeValue, NullableDateType } from '../interface'; +import { getValue } from '../utils/miscUtil'; + +export default function useCellClassName({ + cellPrefixCls, + generateConfig, + rangedValue, + hoverRangedValue, + isInView, + isSameCell, + offsetCell, + today, + value, +}: { + cellPrefixCls: string; + generateConfig: GenerateConfig; + isSameCell: (current: NullableDateType, target: NullableDateType) => boolean; + offsetCell: (date: DateType, offset: number) => DateType; + isInView: (date: DateType) => boolean; + rangedValue?: RangeValue; + hoverRangedValue?: RangeValue; + today?: NullableDateType; + value?: NullableDateType; +}) { + function getClassName(currentDate: DateType) { + const prevDate = offsetCell(currentDate, -1); + const nextDate = offsetCell(currentDate, 1); + + const rangeStart = getValue(rangedValue, 0); + const rangeEnd = getValue(rangedValue, 1); + + const hoverStart = getValue(hoverRangedValue, 0); + const hoverEnd = getValue(hoverRangedValue, 1); + + const isRangeHovered = isInRange(generateConfig, hoverStart, hoverEnd, currentDate); + + function isRangeStart(date: DateType) { + return isSameCell(rangeStart, date); + } + function isRangeEnd(date: DateType) { + return isSameCell(rangeEnd, date); + } + const isHoverStart = isSameCell(hoverStart, currentDate); + const isHoverEnd = isSameCell(hoverEnd, currentDate); + + const isHoverEdgeStart = + (isRangeHovered || isHoverEnd) && (!isInView(prevDate) || isRangeEnd(prevDate)); + const isHoverEdgeEnd = + (isRangeHovered || isHoverStart) && (!isInView(nextDate) || isRangeStart(nextDate)); + + return { + // In view + [`${cellPrefixCls}-in-view`]: isInView(currentDate), + + // Range + [`${cellPrefixCls}-in-range`]: isInRange( + generateConfig, + rangeStart, + rangeEnd, + currentDate, + ), + [`${cellPrefixCls}-range-start`]: isRangeStart(currentDate), + [`${cellPrefixCls}-range-end`]: isRangeEnd(currentDate), + [`${cellPrefixCls}-range-start-single`]: isRangeStart(currentDate) && !rangeEnd, + [`${cellPrefixCls}-range-end-single`]: isRangeEnd(currentDate) && !rangeStart, + [`${cellPrefixCls}-range-start-near-hover`]: + isRangeStart(currentDate) && + (isSameCell(prevDate, hoverStart) || + isInRange(generateConfig, hoverStart, hoverEnd, prevDate)), + [`${cellPrefixCls}-range-end-near-hover`]: + isRangeEnd(currentDate) && + (isSameCell(nextDate, hoverEnd) || + isInRange(generateConfig, hoverStart, hoverEnd, nextDate)), + + // Range Hover + [`${cellPrefixCls}-range-hover`]: isRangeHovered, + [`${cellPrefixCls}-range-hover-start`]: isHoverStart, + [`${cellPrefixCls}-range-hover-end`]: isHoverEnd, + + // Range Edge + [`${cellPrefixCls}-range-hover-edge-start`]: isHoverEdgeStart, + [`${cellPrefixCls}-range-hover-edge-end`]: isHoverEdgeEnd, + [`${cellPrefixCls}-range-hover-edge-start-near-range`]: + isHoverEdgeStart && isSameCell(prevDate, rangeEnd), + [`${cellPrefixCls}-range-hover-edge-end-near-range`]: + isHoverEdgeEnd && isSameCell(nextDate, rangeStart), + + // Others + [`${cellPrefixCls}-today`]: isSameCell(today, currentDate), + [`${cellPrefixCls}-selected`]: isSameCell(value, currentDate), + }; + } + + return getClassName; +} diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/hooks/useHoverValue.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/hooks/useHoverValue.ts new file mode 100644 index 0000000..2f343ed --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/hooks/useHoverValue.ts @@ -0,0 +1,46 @@ +import raf from 'ant-design-vue/es/_util/raf'; +import type { ComputedRef, Ref, UnwrapRef } from 'vue'; +import { ref, onBeforeUnmount, watch } from 'vue'; +import type { ValueTextConfig } from './useValueTexts'; +import useValueTexts from './useValueTexts'; + +export default function useHoverValue( + valueText: Ref, + { formatList, generateConfig, locale }: ValueTextConfig, +): [ComputedRef, (date: DateType) => void, (immediately?: boolean) => void] { + const innerValue = ref(null); + let rafId: number; + + function setValue(val: DateType, immediately = false) { + raf.cancel(rafId); + if (immediately) { + innerValue.value = val as UnwrapRef; + return; + } + rafId = raf(() => { + innerValue.value = val as UnwrapRef; + }); + } + + const [, firstText] = useValueTexts(innerValue as Ref, { + formatList, + generateConfig, + locale, + }); + function onEnter(date: DateType) { + setValue(date); + } + + function onLeave(immediately = false) { + setValue(null, immediately); + } + + watch(valueText, () => { + onLeave(true); + }); + onBeforeUnmount(() => { + raf.cancel(rafId); + }); + + return [firstText, onEnter, onLeave]; +} diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/hooks/useMergeProps.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/hooks/useMergeProps.ts new file mode 100644 index 0000000..54450bd --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/hooks/useMergeProps.ts @@ -0,0 +1,8 @@ +import type { HTMLAttributes } from 'vue'; +import { useAttrs } from 'vue'; + +// 仅用在函数式组件中,不用考虑响应式问题 +export default function useMergeProps(props: T) { + const attrs: HTMLAttributes = useAttrs(); + return { ...props, ...attrs }; +} diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/hooks/usePickerInput.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/hooks/usePickerInput.ts new file mode 100644 index 0000000..036a1a1 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/hooks/usePickerInput.ts @@ -0,0 +1,176 @@ +import type { ComputedRef, HTMLAttributes, Ref } from 'vue'; +import { onBeforeUnmount, onMounted, watch, ref, computed } from 'vue'; +import type { FocusEventHandler } from 'ant-design-vue/es/_util/EventInterface'; +import KeyCode from 'ant-design-vue/es/_util/KeyCode'; +import { addGlobalMousedownEvent, getTargetFromEvent } from '../utils/uiUtil'; +import raf from 'ant-design-vue/es/_util/raf'; + +export default function usePickerInput({ + open, + value, + isClickOutside, + triggerOpen, + forwardKeydown, + onKeydown, + blurToCancel, + onSubmit, + onCancel, + onFocus, + onBlur, +}: { + open: Ref; + value: Ref; + isClickOutside: (clickElement: EventTarget | null) => boolean; + triggerOpen: (open: boolean) => void; + forwardKeydown: (e: KeyboardEvent) => boolean; + onKeydown: (e: KeyboardEvent, preventDefault: () => void) => void; + blurToCancel?: ComputedRef; + onSubmit: () => void | boolean; + onCancel: () => void; + onFocus?: FocusEventHandler; + onBlur?: FocusEventHandler; +}): [ComputedRef, { focused: Ref; typing: Ref }] { + const typing = ref(false); + const focused = ref(false); + + /** + * We will prevent blur to handle open event when user click outside, + * since this will repeat trigger `onOpenChange` event. + */ + const preventBlurRef = ref(false); + + const valueChangedRef = ref(false); + + const preventDefaultRef = ref(false); + + const inputProps = computed(() => ({ + onMousedown: () => { + typing.value = true; + triggerOpen(true); + }, + onKeydown: e => { + const preventDefault = (): void => { + preventDefaultRef.value = true; + }; + + onKeydown(e, preventDefault); + + if (preventDefaultRef.value) return; + + switch (e.which) { + case KeyCode.ENTER: { + if (!open.value) { + triggerOpen(true); + } else if (onSubmit() !== false) { + typing.value = true; + } + + e.preventDefault(); + return; + } + + case KeyCode.TAB: { + if (typing.value && open.value && !e.shiftKey) { + typing.value = false; + e.preventDefault(); + } else if (!typing.value && open.value) { + if (!forwardKeydown(e) && e.shiftKey) { + typing.value = true; + e.preventDefault(); + } + } + return; + } + + case KeyCode.ESC: { + typing.value = true; + onCancel(); + return; + } + } + + if (!open.value && ![KeyCode.SHIFT].includes(e.which)) { + triggerOpen(true); + } else if (!typing.value) { + // Let popup panel handle keyboard + forwardKeydown(e); + } + }, + + onFocus: e => { + typing.value = true; + focused.value = true; + + if (onFocus) { + onFocus(e); + } + }, + + onBlur: e => { + if (preventBlurRef.value || !isClickOutside(document.activeElement)) { + preventBlurRef.value = false; + return; + } + + if (blurToCancel.value) { + setTimeout(() => { + let { activeElement } = document; + while (activeElement && activeElement.shadowRoot) { + activeElement = activeElement.shadowRoot.activeElement; + } + + if (isClickOutside(activeElement)) { + onCancel(); + } + }, 0); + } else if (open.value) { + triggerOpen(false); + + if (valueChangedRef.value) { + onSubmit(); + } + } + focused.value = false; + + if (onBlur) { + onBlur(e); + } + }, + })); + + // check if value changed + watch(open, () => { + valueChangedRef.value = false; + }); + + watch(value, () => { + valueChangedRef.value = true; + }); + const globalMousedownEvent = ref(); + // Global click handler + onMounted(() => { + globalMousedownEvent.value = addGlobalMousedownEvent((e: MouseEvent) => { + const target = getTargetFromEvent(e); + + if (open.value) { + const clickedOutside = isClickOutside(target); + + if (!clickedOutside) { + preventBlurRef.value = true; + + // Always set back in case `onBlur` prevented by user + raf(() => { + preventBlurRef.value = false; + }); + } else if (!focused.value || clickedOutside) { + triggerOpen(false); + } + } + }); + }); + onBeforeUnmount(() => { + globalMousedownEvent.value && globalMousedownEvent.value(); + }); + + return [inputProps, { focused, typing }]; +} diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/hooks/useRangeDisabled.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/hooks/useRangeDisabled.ts new file mode 100644 index 0000000..b11c1ec --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/hooks/useRangeDisabled.ts @@ -0,0 +1,114 @@ +import type { RangeValue, PickerMode, Locale } from '../interface'; +import { getValue } from '../utils/miscUtil'; +import type { GenerateConfig } from '../generate'; +import { isSameDate, getQuarter } from '../utils/dateUtil'; +import type { ComputedRef, Ref } from 'vue'; +import { computed } from 'vue'; + +export default function useRangeDisabled( + { + picker, + locale, + selectedValue, + disabledDate, + disabled, + generateConfig, + }: { + picker: Ref; + selectedValue: Ref>; + disabledDate?: Ref<(date: DateType) => boolean>; + disabled: ComputedRef<[boolean, boolean]>; + locale: Ref; + generateConfig: Ref>; + }, + openRecordsRef: Ref<{ + [x: number]: boolean; + }>, +) { + const startDate = computed(() => getValue(selectedValue.value, 0)); + const endDate = computed(() => getValue(selectedValue.value, 1)); + + function weekFirstDate(date: DateType) { + return generateConfig.value.locale.getWeekFirstDate(locale.value.locale, date); + } + + function monthNumber(date: DateType) { + const year = generateConfig.value.getYear(date); + const month = generateConfig.value.getMonth(date); + return year * 100 + month; + } + + function quarterNumber(date: DateType) { + const year = generateConfig.value.getYear(date); + const quarter = getQuarter(generateConfig.value, date); + return year * 10 + quarter; + } + + const disabledStartDate = (date: DateType) => { + if (disabledDate && disabledDate?.value?.(date)) { + return true; + } + + // Disabled range + if (disabled[1] && endDate) { + return ( + !isSameDate(generateConfig.value, date, endDate.value) && + generateConfig.value.isAfter(date, endDate.value) + ); + } + + // Disabled part + if (openRecordsRef.value[1] && endDate.value) { + switch (picker.value) { + case 'quarter': + return quarterNumber(date) > quarterNumber(endDate.value); + case 'month': + return monthNumber(date) > monthNumber(endDate.value); + case 'week': + return weekFirstDate(date) > weekFirstDate(endDate.value); + default: + return ( + !isSameDate(generateConfig.value, date, endDate.value) && + generateConfig.value.isAfter(date, endDate.value) + ); + } + } + + return false; + }; + + const disabledEndDate = (date: DateType) => { + if (disabledDate.value?.(date)) { + return true; + } + + // Disabled range + if (disabled[0] && startDate) { + return ( + !isSameDate(generateConfig.value, date, endDate.value) && + generateConfig.value.isAfter(startDate.value, date) + ); + } + + // Disabled part + if (openRecordsRef.value[0] && startDate.value) { + switch (picker.value) { + case 'quarter': + return quarterNumber(date) < quarterNumber(startDate.value); + case 'month': + return monthNumber(date) < monthNumber(startDate.value); + case 'week': + return weekFirstDate(date) < weekFirstDate(startDate.value); + default: + return ( + !isSameDate(generateConfig.value, date, startDate.value) && + generateConfig.value.isAfter(startDate.value, date) + ); + } + } + + return false; + }; + + return [disabledStartDate, disabledEndDate]; +} diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/hooks/useRangeViewDates.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/hooks/useRangeViewDates.ts new file mode 100644 index 0000000..a8cdea1 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/hooks/useRangeViewDates.ts @@ -0,0 +1,128 @@ +import type { RangeValue, PickerMode } from '../interface'; +import type { GenerateConfig } from '../generate'; +import { getValue, updateValues } from '../utils/miscUtil'; +import { getClosingViewDate, isSameYear, isSameMonth, isSameDecade } from '../utils/dateUtil'; +import type { Ref } from 'vue'; +import { watchEffect, computed, ref } from 'vue'; + +function getStartEndDistance( + startDate: DateType, + endDate: DateType, + picker: PickerMode, + generateConfig: GenerateConfig, +): 'same' | 'closing' | 'far' { + const startNext = getClosingViewDate(startDate, picker, generateConfig, 1); + + function getDistance(compareFunc: (start: DateType | null, end: DateType | null) => boolean) { + if (compareFunc(startDate, endDate)) { + return 'same'; + } + if (compareFunc(startNext, endDate)) { + return 'closing'; + } + return 'far'; + } + + switch (picker) { + case 'year': + return getDistance((start, end) => isSameDecade(generateConfig, start, end)); + case 'quarter': + case 'month': + return getDistance((start, end) => isSameYear(generateConfig, start, end)); + default: + return getDistance((start, end) => isSameMonth(generateConfig, start, end)); + } +} + +function getRangeViewDate( + values: RangeValue, + index: 0 | 1, + picker: PickerMode, + generateConfig: GenerateConfig, +): DateType | null { + const startDate = getValue(values, 0); + const endDate = getValue(values, 1); + + if (index === 0) { + return startDate; + } + + if (startDate && endDate) { + const distance = getStartEndDistance(startDate, endDate, picker, generateConfig); + switch (distance) { + case 'same': + return startDate; + case 'closing': + return startDate; + default: + return getClosingViewDate(endDate, picker, generateConfig, -1); + } + } + + return startDate; +} + +export default function useRangeViewDates({ + values, + picker, + defaultDates, + generateConfig, +}: { + values: Ref>; + picker: Ref; + defaultDates: RangeValue | undefined; + generateConfig: Ref>; +}): [Ref, Ref, (viewDate: DateType | null, index: 0 | 1) => void] { + const defaultViewDates = ref<[DateType | null, DateType | null]>([ + getValue(defaultDates, 0), + getValue(defaultDates, 1), + ]); + const viewDates = ref>(null); + const startDate = computed(() => getValue(values.value, 0)); + const endDate = computed(() => getValue(values.value, 1)); + + const getViewDate = (index: 0 | 1): DateType => { + // If set default view date, use it + if (defaultViewDates.value[index]) { + return defaultViewDates.value[index]! as DateType; + } + + return ( + (getValue(viewDates.value, index) as any) || + getRangeViewDate(values.value, index, picker.value, generateConfig.value) || + startDate.value || + endDate.value || + generateConfig.value.getNow() + ); + }; + + const startViewDate = ref(null); + + const endViewDate = ref(null); + watchEffect(() => { + startViewDate.value = getViewDate(0); + endViewDate.value = getViewDate(1); + }); + + function setViewDate(viewDate: DateType | null, index: 0 | 1) { + if (viewDate) { + let newViewDates = updateValues(viewDates.value, viewDate as any, index); + // Set view date will clean up default one + // Should always be an array + defaultViewDates.value = updateValues(defaultViewDates.value, null, index) || [null, null]; + + // Reset another one when not have value + const anotherIndex = (index + 1) % 2; + if (!getValue(values.value, anotherIndex)) { + newViewDates = updateValues(newViewDates, viewDate, anotherIndex); + } + + viewDates.value = newViewDates; + } else if (startDate.value || endDate.value) { + // Reset all when has values when `viewDate` is `null` which means from open trigger + viewDates.value = null; + } + } + + return [startViewDate, endViewDate, setViewDate]; +} diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/hooks/useTextValueMapping.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/hooks/useTextValueMapping.ts new file mode 100644 index 0000000..eec0366 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/hooks/useTextValueMapping.ts @@ -0,0 +1,37 @@ +import type { ComputedRef, Ref } from 'vue'; +import { ref, watch } from 'vue'; + +export default function useTextValueMapping({ + valueTexts, + onTextChange, +}: { + /** Must useMemo, to assume that `valueTexts` only match on the first change */ + valueTexts: ComputedRef; + onTextChange: (text: string) => void; +}): [Ref, (text: string) => void, () => void] { + const text = ref(''); + + function triggerTextChange(value: string) { + text.value = value; + onTextChange(value); + } + + function resetText() { + text.value = valueTexts.value[0]; + } + + watch( + () => [...valueTexts.value], + (cur, pre = []) => { + if ( + cur.join('||') !== pre.join('||') && + valueTexts.value.every(valText => valText !== text.value) + ) { + resetText(); + } + }, + { immediate: true }, + ); + + return [text, triggerTextChange, resetText]; +} diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/hooks/useValueTexts.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/hooks/useValueTexts.ts new file mode 100644 index 0000000..d46cd63 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/hooks/useValueTexts.ts @@ -0,0 +1,51 @@ +import type { ComputedRef, Ref } from 'vue'; +import { computed } from 'vue'; +import useMemo from 'ant-design-vue/es/_util/hooks/useMemo'; +import shallowequal from 'ant-design-vue/es/_util/shallowequal'; +import type { GenerateConfig } from '../generate'; +import type { CustomFormat, Locale } from '../interface'; +import { formatValue } from '../utils/dateUtil'; + +export type ValueTextConfig = { + formatList: ComputedRef<(string | CustomFormat)[]>; + generateConfig: Ref>; + locale: Ref; +}; + +export default function useValueTexts( + value: Ref, + { formatList, generateConfig, locale }: ValueTextConfig, +): [ComputedRef, ComputedRef] { + const texts = useMemo<[string[], string]>( + () => { + if (!value.value) { + return [[''], '']; + } + + // We will convert data format back to first format + let firstValueText = ''; + const fullValueTexts: string[] = []; + + for (let i = 0; i < formatList.value.length; i += 1) { + const format = formatList.value[i]; + const formatStr = formatValue(value.value, { + generateConfig: generateConfig.value, + locale: locale.value, + format, + }); + fullValueTexts.push(formatStr); + + if (i === 0) { + firstValueText = formatStr; + } + } + + return [fullValueTexts, firstValueText]; + }, + [value, formatList], + (next, prev) => prev[0] !== next[0] || !shallowequal(prev[1], next[1]), + ); + const fullValueTexts = computed(() => texts.value[0]); + const firstValueText = computed(() => texts.value[1]); + return [fullValueTexts, firstValueText]; +} diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/index.tsx b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/index.tsx new file mode 100644 index 0000000..2bfcc8b --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/index.tsx @@ -0,0 +1,14 @@ +// 2.6.7 +import type { PickerProps } from './Picker'; +//todo check +import Picker from './Picker'; +//import Picker from 'ant-design-vue/es/vc-picker/Picker' +import PickerPanel from './PickerPanel'; +import RangePicker from './RangePicker'; +import type { PickerPanelProps } from './PickerPanel'; +import type { RangePickerProps } from './RangePicker'; + +export { PickerPanel, RangePicker }; +export type { PickerProps, PickerPanelProps, RangePickerProps }; + +export default Picker; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/interface.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/interface.ts new file mode 100644 index 0000000..f28265b --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/interface.ts @@ -0,0 +1,115 @@ +import type { Ref } from 'vue' +import type { VueNode } from 'ant-design-vue/es/_util/type' +import type { GenerateConfig } from './generate' + +export type Locale = { + locale: string + + // ===================== Date Panel ===================== + /** Display month before year in date panel header */ + monthBeforeYear?: boolean + yearFormat: string + monthFormat?: string + quarterFormat?: string + + today: string + now: string + backToToday: string + ok: string + timeSelect: string + dateSelect: string + weekSelect?: string + clear: string + month: string + year: string + previousMonth: string + nextMonth: string + monthSelect: string + yearSelect: string + decadeSelect: string + + dayFormat: string + dateFormat: string + dateTimeFormat: string + previousYear: string + nextYear: string + previousDecade: string + nextDecade: string + previousCentury: string + nextCentury: string + + shortWeekDays?: string[] + shortMonths?: string[] +} + +export type PanelMode = 'time' | 'date' | 'week' | 'month' | 'quarter' | 'year' | 'decade' + +export type PickerMode = Exclude + +export type PanelRefProps = { + onKeydown?: (e: KeyboardEvent) => boolean + onBlur?: (e: FocusEvent) => void + onClose?: () => void +} + +export type NullableDateType = DateType | null | undefined + +export type OnSelect = (value: DateType, type: 'key' | 'mouse' | 'submit') => void + +export type PanelSharedProps = { + prefixCls: string + generateConfig: GenerateConfig + value?: NullableDateType + viewDate: DateType + /** [Legacy] Set default display picker view date */ + defaultPickerValue?: DateType + locale: Locale + disabledDate?: (date: DateType) => boolean + + prevIcon?: VueNode + nextIcon?: VueNode + superPrevIcon?: VueNode + superNextIcon?: VueNode + + // /** + // * Typescript can not handle generic type so we can not use `forwardRef` here. + // * Thus, move ref into operationRef. + // * This is little hack which should refactor after typescript support. + // */ + operationRef: Ref + + onSelect: OnSelect + onViewDateChange: (value: DateType) => void + onPanelChange: (mode: PanelMode | null, viewValue: DateType) => void +} + +export type DisabledTimes = { + disabledHours?: () => number[] + disabledMinutes?: (hour: number) => number[] + disabledSeconds?: (hour: number, minute: number) => number[] +} + +export type DisabledTime = (date: DateType | null) => DisabledTimes + +export type OnPanelChange = (value: DateType, mode: PanelMode) => void + +export type EventValue = DateType | null +export type RangeValue = [EventValue, EventValue] | null + +export type Components = { + button?: any +} + +export type RangeList = { + label: VueNode + onClick: () => void + onMouseenter: () => void + onMouseleave: () => void +}[] + +export type CustomFormat = (value: DateType) => string + +export interface PresetDate { + label: VueNode + value: T +} diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ar_EG.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ar_EG.ts new file mode 100644 index 0000000..14e9b6b --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ar_EG.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'ar_EG', + today: 'اليوم', + now: 'الأن', + backToToday: 'العودة إلى اليوم', + ok: 'تأكيد', + clear: 'مسح', + month: 'الشهر', + year: 'السنة', + timeSelect: 'اختيار الوقت', + dateSelect: 'اختيار التاريخ', + monthSelect: 'اختيار الشهر', + yearSelect: 'اختيار السنة', + decadeSelect: 'اختيار العقد', + yearFormat: 'YYYY', + dateFormat: 'M/D/YYYY', + dayFormat: 'D', + dateTimeFormat: 'M/D/YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'الشهر السابق (PageUp)', + nextMonth: 'الشهر التالى(PageDown)', + previousYear: 'العام السابق (Control + left)', + nextYear: 'العام التالى (Control + right)', + previousDecade: 'العقد السابق', + nextDecade: 'العقد التالى', + previousCentury: 'القرن السابق', + nextCentury: 'القرن التالى', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/az_AZ.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/az_AZ.ts new file mode 100644 index 0000000..a499805 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/az_AZ.ts @@ -0,0 +1,33 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'az_AZ', + today: 'Bugün', + now: 'İndi', + backToToday: 'Bugünə qayıt', + ok: 'Təsdiq', + clear: 'Təmizlə', + month: 'Ay', + year: 'İl', + timeSelect: 'vaxtı seç', + dateSelect: 'tarixi seç', + weekSelect: 'Həftə seç', + monthSelect: 'Ay seç', + yearSelect: 'il seç', + decadeSelect: 'Onillik seçin', + yearFormat: 'YYYY', + dateFormat: 'D.M.YYYY', + dayFormat: 'D', + dateTimeFormat: 'D.M.YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Əvvəlki ay (PageUp)', + nextMonth: 'Növbəti ay (PageDown)', + previousYear: 'Sonuncu il (Control + left)', + nextYear: 'Növbəti il (Control + right)', + previousDecade: 'Sonuncu onillik', + nextDecade: 'Növbəti onillik', + previousCentury: 'Sonuncu əsr', + nextCentury: 'Növbəti əsr', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/bg_BG.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/bg_BG.ts new file mode 100644 index 0000000..07334a9 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/bg_BG.ts @@ -0,0 +1,31 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'bg_BG', + today: 'Днес', + now: 'Сега', + backToToday: 'Към днес', + ok: 'Добре', + clear: 'Изчистване', + month: 'Месец', + year: 'Година', + timeSelect: 'Избор на час', + dateSelect: 'Избор на дата', + monthSelect: 'Избор на месец', + yearSelect: 'Избор на година', + decadeSelect: 'Десетилетие', + yearFormat: 'YYYY', + dateFormat: 'D M YYYY', + dayFormat: 'D', + dateTimeFormat: 'D M YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Предишен месец (PageUp)', + nextMonth: 'Следващ месец (PageDown)', + previousYear: 'Последна година (Control + left)', + nextYear: 'Следваща година (Control + right)', + previousDecade: 'Предишно десетилетие', + nextDecade: 'Следващо десетилетие', + previousCentury: 'Последен век', + nextCentury: 'Следващ век', +}; +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/bn_BD.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/bn_BD.ts new file mode 100644 index 0000000..c98e890 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/bn_BD.ts @@ -0,0 +1,33 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'bn_BD', + today: 'আজ', + now: 'এখন', + backToToday: 'আজকে ফিরে চলুন', + ok: 'ওকে', + clear: 'পরিস্কার', + month: 'মাস', + year: 'বছর', + timeSelect: 'সময় নির্বাচন', + dateSelect: 'তারিখ নির্বাচন', + weekSelect: 'সপ্তাহ পছন্দ করুন', + monthSelect: 'মাস পছন্দ করুন', + yearSelect: 'বছর পছন্দ করুন', + decadeSelect: 'একটি দশক পছন্দ করুন', + yearFormat: 'YYYY', + dateFormat: 'M/D/YYYY', + dayFormat: 'D', + dateTimeFormat: 'D/M/YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'গত মাস (PageUp)', + nextMonth: 'আগামী মাস (PageDown)', + previousYear: 'গত বছর (Control + left)', + nextYear: 'আগামী বছর (Control + right)', + previousDecade: 'গত দশক', + nextDecade: 'পরের দশক', + previousCentury: 'গত শতাব্দী', + nextCentury: 'পরের শতাব্দী', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/by_BY.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/by_BY.ts new file mode 100644 index 0000000..fe5984a --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/by_BY.ts @@ -0,0 +1,33 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'by_BY', + today: 'Сёння', + now: 'Зараз', + backToToday: 'Дадзеная дата', + ok: 'Ok', + clear: 'Ачысціць', + month: 'Месяц', + year: 'Год', + timeSelect: 'Выбраць час', + dateSelect: 'Выбраць дату', + weekSelect: 'Выбраць тыдзень', + monthSelect: 'Выбраць месяц', + yearSelect: 'Выбраць год', + decadeSelect: 'Выбраць дзесяцігоддзе', + yearFormat: 'YYYY', + dateFormat: 'D-M-YYYY', + dayFormat: 'D', + dateTimeFormat: 'D-M-YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Папярэдні месяц (PageUp)', + nextMonth: 'Наступны месяц (PageDown)', + previousYear: 'Папярэдні год (Control + left)', + nextYear: 'Наступны год (Control + right)', + previousDecade: 'Папярэдняе дзесяцігоддзе', + nextDecade: 'Наступнае дзесяцігоддзе', + previousCentury: 'Папярэдні век', + nextCentury: 'Наступны век', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ca_ES.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ca_ES.ts new file mode 100644 index 0000000..f93f093 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ca_ES.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'ca_ES', + today: 'Avui', + now: 'Ara', + backToToday: 'Tornar a avui', + ok: 'Acceptar', + clear: 'Netejar', + month: 'Mes', + year: 'Any', + timeSelect: 'Seleccionar hora', + dateSelect: 'Seleccionar data', + monthSelect: 'Escollir un mes', + yearSelect: 'Escollir un any', + decadeSelect: 'Escollir una dècada', + yearFormat: 'YYYY', + dateFormat: 'D/M/YYYY', + dayFormat: 'D', + dateTimeFormat: 'D/M/YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Mes anterior (PageUp)', + nextMonth: 'Mes següent (PageDown)', + previousYear: 'Any anterior (Control + left)', + nextYear: 'Mes següent (Control + right)', + previousDecade: 'Dècada anterior', + nextDecade: 'Dècada següent', + previousCentury: 'Segle anterior', + nextCentury: 'Segle següent', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/cs_CZ.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/cs_CZ.ts new file mode 100644 index 0000000..3c1b2eb --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/cs_CZ.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'cs_CZ', + today: 'Dnes', + now: 'Nyní', + backToToday: 'Zpět na dnešek', + ok: 'Ok', + clear: 'Vymazat', + month: 'Měsíc', + year: 'Rok', + timeSelect: 'Vybrat čas', + dateSelect: 'Vybrat datum', + monthSelect: 'Vyberte měsíc', + yearSelect: 'Vyberte rok', + decadeSelect: 'Vyberte dekádu', + yearFormat: 'YYYY', + dateFormat: 'D.M.YYYY', + dayFormat: 'D', + dateTimeFormat: 'D.M.YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Předchozí měsíc (PageUp)', + nextMonth: 'Následující (PageDown)', + previousYear: 'Předchozí rok (Control + left)', + nextYear: 'Následující rok (Control + right)', + previousDecade: 'Předchozí dekáda', + nextDecade: 'Následující dekáda', + previousCentury: 'Předchozí století', + nextCentury: 'Následující století', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/da_DK.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/da_DK.ts new file mode 100644 index 0000000..f3fe17c --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/da_DK.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'da_DK', + today: 'I dag', + now: 'Nu', + backToToday: 'Gå til i dag', + ok: 'Ok', + clear: 'Ryd', + month: 'Måned', + year: 'År', + timeSelect: 'Vælg tidspunkt', + dateSelect: 'Vælg dato', + monthSelect: 'Vælg måned', + yearSelect: 'Vælg år', + decadeSelect: 'Vælg årti', + yearFormat: 'YYYY', + dateFormat: 'D/M/YYYY', + dayFormat: 'D', + dateTimeFormat: 'D/M/YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Forrige måned (Page Up)', + nextMonth: 'Næste måned (Page Down)', + previousYear: 'Forrige år (Ctrl-venstre pil)', + nextYear: 'Næste år (Ctrl-højre pil)', + previousDecade: 'Forrige årti', + nextDecade: 'Næste årti', + previousCentury: 'Forrige århundrede', + nextCentury: 'Næste århundrede', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/de_DE.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/de_DE.ts new file mode 100644 index 0000000..e053a63 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/de_DE.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'de_DE', + today: 'Heute', + now: 'Jetzt', + backToToday: 'Zurück zu Heute', + ok: 'OK', + clear: 'Zurücksetzen', + month: 'Monat', + year: 'Jahr', + timeSelect: 'Zeit wählen', + dateSelect: 'Datum wählen', + monthSelect: 'Wähle einen Monat', + yearSelect: 'Wähle ein Jahr', + decadeSelect: 'Wähle ein Jahrzehnt', + yearFormat: 'YYYY', + dateFormat: 'D.M.YYYY', + dayFormat: 'D', + dateTimeFormat: 'D.M.YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Vorheriger Monat (PageUp)', + nextMonth: 'Nächster Monat (PageDown)', + previousYear: 'Vorheriges Jahr (Ctrl + left)', + nextYear: 'Nächstes Jahr (Ctrl + right)', + previousDecade: 'Vorheriges Jahrzehnt', + nextDecade: 'Nächstes Jahrzehnt', + previousCentury: 'Vorheriges Jahrhundert', + nextCentury: 'Nächstes Jahrhundert', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/el_GR.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/el_GR.ts new file mode 100644 index 0000000..e8979a5 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/el_GR.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'el_GR', + today: 'Σήμερα', + now: 'Τώρα', + backToToday: 'Πίσω στη σημερινή μέρα', + ok: 'Ok', + clear: 'Καθαρισμός', + month: 'Μήνας', + year: 'Έτος', + timeSelect: 'Επιλογή ώρας', + dateSelect: 'Επιλογή ημερομηνίας', + monthSelect: 'Επιλογή μήνα', + yearSelect: 'Επιλογή έτους', + decadeSelect: 'Επιλογή δεκαετίας', + yearFormat: 'YYYY', + dateFormat: 'D/M/YYYY', + dayFormat: 'D', + dateTimeFormat: 'D/M/YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Προηγούμενος μήνας (PageUp)', + nextMonth: 'Επόμενος μήνας (PageDown)', + previousYear: 'Προηγούμενο έτος (Control + αριστερά)', + nextYear: 'Επόμενο έτος (Control + δεξιά)', + previousDecade: 'Προηγούμενη δεκαετία', + nextDecade: 'Επόμενη δεκαετία', + previousCentury: 'Προηγούμενος αιώνας', + nextCentury: 'Επόμενος αιώνας', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/en_GB.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/en_GB.ts new file mode 100644 index 0000000..a875ae2 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/en_GB.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'en_GB', + today: 'Today', + now: 'Now', + backToToday: 'Back to today', + ok: 'Ok', + clear: 'Clear', + month: 'Month', + year: 'Year', + timeSelect: 'Select time', + dateSelect: 'Select date', + monthSelect: 'Choose a month', + yearSelect: 'Choose a year', + decadeSelect: 'Choose a decade', + yearFormat: 'YYYY', + dateFormat: 'D/M/YYYY', + dayFormat: 'D', + dateTimeFormat: 'D/M/YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Previous month (PageUp)', + nextMonth: 'Next month (PageDown)', + previousYear: 'Last year (Control + left)', + nextYear: 'Next year (Control + right)', + previousDecade: 'Last decade', + nextDecade: 'Next decade', + previousCentury: 'Last century', + nextCentury: 'Next century', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/en_US.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/en_US.ts new file mode 100644 index 0000000..28d5fad --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/en_US.ts @@ -0,0 +1,33 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'en_US', + today: 'Today', + now: 'Now', + backToToday: 'Back to today', + ok: 'Ok', + clear: 'Clear', + month: 'Month', + year: 'Year', + timeSelect: 'select time', + dateSelect: 'select date', + weekSelect: 'Choose a week', + monthSelect: 'Choose a month', + yearSelect: 'Choose a year', + decadeSelect: 'Choose a decade', + yearFormat: 'YYYY', + dateFormat: 'M/D/YYYY', + dayFormat: 'D', + dateTimeFormat: 'M/D/YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Previous month (PageUp)', + nextMonth: 'Next month (PageDown)', + previousYear: 'Last year (Control + left)', + nextYear: 'Next year (Control + right)', + previousDecade: 'Last decade', + nextDecade: 'Next decade', + previousCentury: 'Last century', + nextCentury: 'Next century', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/es_ES.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/es_ES.ts new file mode 100644 index 0000000..373db7d --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/es_ES.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'es_ES', + today: 'Hoy', + now: 'Ahora', + backToToday: 'Volver a hoy', + ok: 'Aceptar', + clear: 'Limpiar', + month: 'Mes', + year: 'Año', + timeSelect: 'Seleccionar hora', + dateSelect: 'Seleccionar fecha', + monthSelect: 'Elegir un mes', + yearSelect: 'Elegir un año', + decadeSelect: 'Elegir una década', + yearFormat: 'YYYY', + dateFormat: 'D/M/YYYY', + dayFormat: 'D', + dateTimeFormat: 'D/M/YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Mes anterior (PageUp)', + nextMonth: 'Mes siguiente (PageDown)', + previousYear: 'Año anterior (Control + left)', + nextYear: 'Año siguiente (Control + right)', + previousDecade: 'Década anterior', + nextDecade: 'Década siguiente', + previousCentury: 'Siglo anterior', + nextCentury: 'Siglo siguiente', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/es_MX.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/es_MX.ts new file mode 100644 index 0000000..db65cc8 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/es_MX.ts @@ -0,0 +1,33 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'es_MX', + today: 'Hoy', + now: 'Ahora', + backToToday: 'Volver a hoy', + ok: 'Aceptar', + clear: 'Limpiar', + month: 'Mes', + year: 'Año', + timeSelect: 'elegir hora', + dateSelect: 'elegir fecha', + weekSelect: 'elegir semana', + monthSelect: 'Seleccionar mes', + yearSelect: 'Seleccionar año', + decadeSelect: 'Seleccionar década', + yearFormat: 'YYYY', + dateFormat: 'D/M/YYYY', + dayFormat: 'D', + dateTimeFormat: 'D/M/YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Mes anterior (PageUp)', + nextMonth: 'Mes siguiente (PageDown)', + previousYear: 'Año anterior (Control + Left)', + nextYear: 'Año siguiente (Control + Right)', + previousDecade: 'Década anterior', + nextDecade: 'Década siguiente', + previousCentury: 'Siglo anterior', + nextCentury: 'Siglo siguiente', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/et_EE.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/et_EE.ts new file mode 100644 index 0000000..19a4af5 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/et_EE.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'et_EE', + today: 'Täna', + now: 'Praegu', + backToToday: 'Tagasi tänase juurde', + ok: 'Ok', + clear: 'Tühista', + month: 'Kuu', + year: 'Aasta', + timeSelect: 'Vali aeg', + dateSelect: 'Vali kuupäev', + monthSelect: 'Vali kuu', + yearSelect: 'Vali aasta', + decadeSelect: 'Vali dekaad', + yearFormat: 'YYYY', + dateFormat: 'D.M.YYYY', + dayFormat: 'D', + dateTimeFormat: 'D.M.YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Eelmine kuu (PageUp)', + nextMonth: 'Järgmine kuu (PageDown)', + previousYear: 'Eelmine aasta (Control + left)', + nextYear: 'Järgmine aasta (Control + right)', + previousDecade: 'Eelmine dekaad', + nextDecade: 'Järgmine dekaad', + previousCentury: 'Eelmine sajand', + nextCentury: 'Järgmine sajand', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/fa_IR.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/fa_IR.ts new file mode 100644 index 0000000..f7e1af3 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/fa_IR.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'fa_IR', + today: 'امروز', + now: 'اکنون', + backToToday: 'بازگشت به روز', + ok: 'باشه', + clear: 'پاک کردن', + month: 'ماه', + year: 'سال', + timeSelect: 'انتخاب زمان', + dateSelect: 'انتخاب تاریخ', + monthSelect: 'یک ماه را انتخاب کنید', + yearSelect: 'یک سال را انتخاب کنید', + decadeSelect: 'یک دهه را انتخاب کنید', + yearFormat: 'YYYY', + dateFormat: 'M/D/YYYY', + dayFormat: 'D', + dateTimeFormat: 'M/D/YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'ماه قبل (PageUp)', + nextMonth: 'ماه بعد (PageDown)', + previousYear: 'سال قبل (Control + left)', + nextYear: 'سال بعد (Control + right)', + previousDecade: 'دهه قبل', + nextDecade: 'دهه بعد', + previousCentury: 'قرن قبل', + nextCentury: 'قرن بعد', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/fi_FI.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/fi_FI.ts new file mode 100644 index 0000000..9a02113 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/fi_FI.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'fi_FI', + today: 'Tänään', + now: 'Nyt', + backToToday: 'Tämä päivä', + ok: 'Ok', + clear: 'Tyhjennä', + month: 'Kuukausi', + year: 'Vuosi', + timeSelect: 'Valise aika', + dateSelect: 'Valitse päivä', + monthSelect: 'Valitse kuukausi', + yearSelect: 'Valitse vuosi', + decadeSelect: 'Valitse vuosikymmen', + yearFormat: 'YYYY', + dateFormat: 'D.M.YYYY', + dayFormat: 'D', + dateTimeFormat: 'D.M.YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Edellinen kuukausi (PageUp)', + nextMonth: 'Seuraava kuukausi (PageDown)', + previousYear: 'Edellinen vuosi (Control + left)', + nextYear: 'Seuraava vuosi (Control + right)', + previousDecade: 'Edellinen vuosikymmen', + nextDecade: 'Seuraava vuosikymmen', + previousCentury: 'Edellinen vuosisata', + nextCentury: 'Seuraava vuosisata', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/fr_BE.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/fr_BE.ts new file mode 100644 index 0000000..b398644 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/fr_BE.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'fr_BE', + today: "Aujourd'hui", + now: 'Maintenant', + backToToday: "Aujourd'hui", + ok: 'Ok', + clear: 'Rétablir', + month: 'Mois', + year: 'Année', + timeSelect: "Sélectionner l'heure", + dateSelect: "Sélectionner l'heure", + monthSelect: 'Choisissez un mois', + yearSelect: 'Choisissez une année', + decadeSelect: 'Choisissez une décennie', + yearFormat: 'YYYY', + dateFormat: 'D/M/YYYY', + dayFormat: 'D', + dateTimeFormat: 'D/M/YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Mois précédent (PageUp)', + nextMonth: 'Mois suivant (PageDown)', + previousYear: 'Année précédente (Ctrl + gauche)', + nextYear: 'Année prochaine (Ctrl + droite)', + previousDecade: 'Décennie précédente', + nextDecade: 'Décennie suivante', + previousCentury: 'Siècle précédent', + nextCentury: 'Siècle suivant', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/fr_CA.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/fr_CA.ts new file mode 100644 index 0000000..8bbaf2f --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/fr_CA.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'fr_CA', + today: "Aujourd'hui", + now: 'Maintenant', + backToToday: "Aujourd'hui", + ok: 'Ok', + clear: 'Rétablir', + month: 'Mois', + year: 'Année', + timeSelect: "Sélectionner l'heure", + dateSelect: 'Sélectionner la date', + monthSelect: 'Choisissez un mois', + yearSelect: 'Choisissez une année', + decadeSelect: 'Choisissez une décennie', + yearFormat: 'YYYY', + dateFormat: 'DD/MM/YYYY', + dayFormat: 'DD', + dateTimeFormat: 'DD/MM/YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Mois précédent (PageUp)', + nextMonth: 'Mois suivant (PageDown)', + previousYear: 'Année précédente (Ctrl + gauche)', + nextYear: 'Année prochaine (Ctrl + droite)', + previousDecade: 'Décennie précédente', + nextDecade: 'Décennie suivante', + previousCentury: 'Siècle précédent', + nextCentury: 'Siècle suivant', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/fr_FR.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/fr_FR.ts new file mode 100644 index 0000000..53239b5 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/fr_FR.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'fr_FR', + today: "Aujourd'hui", + now: 'Maintenant', + backToToday: "Aujourd'hui", + ok: 'Ok', + clear: 'Rétablir', + month: 'Mois', + year: 'Année', + timeSelect: "Sélectionner l'heure", + dateSelect: 'Sélectionner la date', + monthSelect: 'Choisissez un mois', + yearSelect: 'Choisissez une année', + decadeSelect: 'Choisissez une décennie', + yearFormat: 'YYYY', + dateFormat: 'DD/MM/YYYY', + dayFormat: 'DD', + dateTimeFormat: 'DD/MM/YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Mois précédent (PageUp)', + nextMonth: 'Mois suivant (PageDown)', + previousYear: 'Année précédente (Ctrl + gauche)', + nextYear: 'Année prochaine (Ctrl + droite)', + previousDecade: 'Décennie précédente', + nextDecade: 'Décennie suivante', + previousCentury: 'Siècle précédent', + nextCentury: 'Siècle suivant', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ga_IE.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ga_IE.ts new file mode 100644 index 0000000..326a209 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ga_IE.ts @@ -0,0 +1,33 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'ga_IE', + today: 'inniu', + now: 'anois', + backToToday: 'Ar ais inniu', + ok: 'ceart go leor', + clear: 'soiléir', + month: 'mhí', + year: 'bhliain', + timeSelect: 'roghnaigh am', + dateSelect: 'roghnaigh dáta', + weekSelect: 'Roghnaigh seachtain', + monthSelect: 'Roghnaigh mí', + yearSelect: 'Roghnaigh bliain', + decadeSelect: 'Roghnaigh deich mbliana', + yearFormat: 'YYYY', + dateFormat: 'D/M/YYYY', + dayFormat: 'D', + dateTimeFormat: 'D/M/YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'An mhí roimhe seo (PageUp)', + nextMonth: 'An mhí seo chugainn (PageDown)', + previousYear: 'Anuraidh (Control + left)', + nextYear: 'An bhliain seo chugainn (Control + right)', + previousDecade: 'Le deich mbliana anuas', + nextDecade: 'Deich mbliana amach romhainn', + previousCentury: 'An chéid seo caite', + nextCentury: 'An chéad aois eile', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/gl_ES.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/gl_ES.ts new file mode 100644 index 0000000..1325876 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/gl_ES.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'gl_ES', + today: 'Hoxe', + now: 'Agora', + backToToday: 'Voltar a hoxe', + ok: 'Aceptar', + clear: 'Limpar', + month: 'Mes', + year: 'Ano', + timeSelect: 'Seleccionar hora', + dateSelect: 'Seleccionar data', + monthSelect: 'Elexir un mes', + yearSelect: 'Elexir un año', + decadeSelect: 'Elexir unha década', + yearFormat: 'YYYY', + dateFormat: 'D/M/YYYY', + dayFormat: 'D', + dateTimeFormat: 'D/M/YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Mes anterior (PageUp)', + nextMonth: 'Mes seguinte (PageDown)', + previousYear: 'Ano anterior (Control + left)', + nextYear: 'Ano seguinte (Control + right)', + previousDecade: 'Década anterior', + nextDecade: 'Década seguinte', + previousCentury: 'Século anterior', + nextCentury: 'Século seguinte', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/he_IL.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/he_IL.ts new file mode 100644 index 0000000..ea3fc8b --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/he_IL.ts @@ -0,0 +1,33 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'he_IL', + today: 'היום', + now: 'עכשיו', + backToToday: 'חזור להיום', + ok: 'אישור', + clear: 'איפוס', + month: 'חודש', + year: 'שנה', + timeSelect: 'בחר שעה', + dateSelect: 'בחר תאריך', + weekSelect: 'בחר שבוע', + monthSelect: 'בחר חודש', + yearSelect: 'בחר שנה', + decadeSelect: 'בחר עשור', + yearFormat: 'YYYY', + dateFormat: 'M/D/YYYY', + dayFormat: 'D', + dateTimeFormat: 'M/D/YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'חודש קודם (PageUp)', + nextMonth: 'חודש הבא (PageDown)', + previousYear: 'שנה שעברה (Control + left)', + nextYear: 'שנה הבאה (Control + right)', + previousDecade: 'העשור הקודם', + nextDecade: 'העשור הבא', + previousCentury: 'המאה הקודמת', + nextCentury: 'המאה הבאה', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/hi_IN.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/hi_IN.ts new file mode 100644 index 0000000..51ae229 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/hi_IN.ts @@ -0,0 +1,33 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'hi_IN', + today: 'आज', + now: 'अभी', + backToToday: 'आज तक', + ok: 'ठीक', + clear: 'स्पष्ट', + month: 'महीना', + year: 'साल', + timeSelect: 'समय का चयन करें', + dateSelect: 'तारीख़ चुनें', + weekSelect: 'एक सप्ताह चुनें', + monthSelect: 'एक महीना चुनें', + yearSelect: 'एक वर्ष चुनें', + decadeSelect: 'एक दशक चुनें', + yearFormat: 'YYYY', + dateFormat: 'M/D/YYYY', + dayFormat: 'D', + dateTimeFormat: 'M/D/YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'पिछला महीना (पेजअप)', + nextMonth: 'अगले महीने (पेजडाउन)', + previousYear: 'पिछले साल (Ctrl + बाएं)', + nextYear: 'अगले साल (Ctrl + दाहिना)', + previousDecade: 'पिछला दशक', + nextDecade: 'अगले दशक', + previousCentury: 'पीछ्ली शताब्दी', + nextCentury: 'अगली सदी', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/hr_HR.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/hr_HR.ts new file mode 100644 index 0000000..a341396 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/hr_HR.ts @@ -0,0 +1,33 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'hr_HR', + today: 'Danas', + now: 'Sad', + backToToday: 'Natrag na danas', + ok: 'Ok', + clear: 'Očisti', + month: 'Mjesec', + year: 'Godina', + timeSelect: 'odaberite vrijeme', + dateSelect: 'odaberite datum', + weekSelect: 'Odaberite tjedan', + monthSelect: 'Odaberite mjesec', + yearSelect: 'Odaberite godinu', + decadeSelect: 'Odaberite desetljeće', + yearFormat: 'YYYY', + dateFormat: 'D.M.YYYY', + dayFormat: 'D', + dateTimeFormat: 'D.M.YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Prošli mjesec (PageUp)', + nextMonth: 'Sljedeći mjesec (PageDown)', + previousYear: 'Prošla godina (Control + left)', + nextYear: 'Sljedeća godina (Control + right)', + previousDecade: 'Prošlo desetljeće', + nextDecade: 'Sljedeće desetljeće', + previousCentury: 'Prošlo stoljeće', + nextCentury: 'Sljedeće stoljeće', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/hu_HU.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/hu_HU.ts new file mode 100644 index 0000000..b98603d --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/hu_HU.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'hu_HU', + today: 'Ma', // 'Today', + now: 'Most', // 'Now', + backToToday: 'Vissza a mai napra', // 'Back to today', + ok: 'Ok', + clear: 'Törlés', // 'Clear', + month: 'Hónap', // 'Month', + year: 'Év', // 'Year', + timeSelect: 'Időpont kiválasztása', // 'Select time', + dateSelect: 'Dátum kiválasztása', // 'Select date', + monthSelect: 'Hónap kiválasztása', // 'Choose a month', + yearSelect: 'Év kiválasztása', // 'Choose a year', + decadeSelect: 'Évtized kiválasztása', // 'Choose a decade', + yearFormat: 'YYYY', + dateFormat: 'YYYY/MM/DD', // 'M/D/YYYY', + dayFormat: 'DD', // 'D', + dateTimeFormat: 'YYYY/MM/DD HH:mm:ss', // 'M/D/YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Előző hónap (PageUp)', // 'Previous month (PageUp)', + nextMonth: 'Következő hónap (PageDown)', // 'Next month (PageDown)', + previousYear: 'Múlt év (Control + left)', // 'Last year (Control + left)', + nextYear: 'Jövő év (Control + right)', // 'Next year (Control + right)', + previousDecade: 'Előző évtized', // 'Last decade', + nextDecade: 'Következő évtized', // 'Next decade', + previousCentury: 'Múlt évszázad', // 'Last century', + nextCentury: 'Jövő évszázad', // 'Next century', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/id_ID.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/id_ID.ts new file mode 100644 index 0000000..01c9d76 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/id_ID.ts @@ -0,0 +1,33 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'id_ID', + today: 'Hari ini', + now: 'Sekarang', + backToToday: 'Kembali ke hari ini', + ok: 'Baik', + clear: 'Bersih', + month: 'Bulan', + year: 'Tahun', + timeSelect: 'pilih waktu', + dateSelect: 'pilih tanggal', + weekSelect: 'Pilih satu minggu', + monthSelect: 'Pilih satu bulan', + yearSelect: 'Pilih satu tahun', + decadeSelect: 'Pilih satu dekade', + yearFormat: 'YYYY', + dateFormat: 'D/M/YYYY', + dayFormat: 'D', + dateTimeFormat: 'D/M/YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Bulan sebelumnya (PageUp)', + nextMonth: 'Bulan selanjutnya (PageDown)', + previousYear: 'Tahun lalu (Control + kiri)', + nextYear: 'Tahun selanjutnya (Kontrol + kanan)', + previousDecade: 'Dekade terakhir', + nextDecade: 'Dekade berikutnya', + previousCentury: 'Abad terakhir', + nextCentury: 'Abad berikutnya', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/is_IS.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/is_IS.ts new file mode 100644 index 0000000..efea367 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/is_IS.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'is_IS', + today: 'Í dag', + now: 'Núna', + backToToday: 'Til baka til dagsins í dag', + ok: 'Í lagi', + clear: 'Hreinsa', + month: 'Mánuður', + year: 'Ár', + timeSelect: 'Velja tíma', + dateSelect: 'Velja dag', + monthSelect: 'Velja mánuð', + yearSelect: 'Velja ár', + decadeSelect: 'Velja áratug', + yearFormat: 'YYYY', + dateFormat: 'D/M/YYYY', + dayFormat: 'D', + dateTimeFormat: 'D/M/YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Fyrri mánuður (PageUp)', + nextMonth: 'Næsti mánuður (PageDown)', + previousYear: 'Fyrra ár (Control + left)', + nextYear: 'Næsta ár (Control + right)', + previousDecade: 'Fyrri áratugur', + nextDecade: 'Næsti áratugur', + previousCentury: 'Fyrri öld', + nextCentury: 'Næsta öld', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/it_IT.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/it_IT.ts new file mode 100644 index 0000000..3b69a9f --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/it_IT.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'it_IT', + today: 'Oggi', + now: 'Adesso', + backToToday: 'Torna ad oggi', + ok: 'Ok', + clear: 'Cancella', + month: 'Mese', + year: 'Anno', + timeSelect: "Seleziona l'ora", + dateSelect: 'Seleziona la data', + monthSelect: 'Seleziona il mese', + yearSelect: "Seleziona l'anno", + decadeSelect: 'Seleziona il decennio', + yearFormat: 'YYYY', + dateFormat: 'D/M/YYYY', + dayFormat: 'D', + dateTimeFormat: 'D/M/YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Il mese scorso (PageUp)', + nextMonth: 'Il prossimo mese (PageDown)', + previousYear: "L'anno scorso (Control + sinistra)", + nextYear: "L'anno prossimo (Control + destra)", + previousDecade: 'Ultimo decennio', + nextDecade: 'Prossimo decennio', + previousCentury: 'Secolo precedente', + nextCentury: 'Prossimo secolo', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ja_JP.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ja_JP.ts new file mode 100644 index 0000000..f4d3985 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ja_JP.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'ja_JP', + today: '今日', + now: '現在時刻', + backToToday: '今日に戻る', + ok: '決定', + timeSelect: '時間を選択', + dateSelect: '日時を選択', + weekSelect: '週を選択', + clear: 'クリア', + month: '月', + year: '年', + previousMonth: '前月 (ページアップキー)', + nextMonth: '翌月 (ページダウンキー)', + monthSelect: '月を選択', + yearSelect: '年を選択', + decadeSelect: '年代を選択', + yearFormat: 'YYYY年', + dayFormat: 'D日', + dateFormat: 'YYYY年M月D日', + dateTimeFormat: 'YYYY年M月D日 HH時mm分ss秒', + previousYear: '前年 (Controlを押しながら左キー)', + nextYear: '翌年 (Controlを押しながら右キー)', + previousDecade: '前の年代', + nextDecade: '次の年代', + previousCentury: '前の世紀', + nextCentury: '次の世紀', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ka_GE.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ka_GE.ts new file mode 100644 index 0000000..6442ca1 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ka_GE.ts @@ -0,0 +1,33 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'ka_GE', + today: 'დღეს', + now: 'ახლა', + backToToday: 'მიმდინარე თარიღი', + ok: 'Ok', + clear: 'გასუფთავება', + month: 'თვე', + year: 'წელი', + timeSelect: 'დროის არჩევა', + dateSelect: 'თარიღის არჩევა', + weekSelect: 'კვირის არჩევა', + monthSelect: 'თვის არჩევა', + yearSelect: 'წლის არჩევა', + decadeSelect: 'ათწლეულის არჩევა', + yearFormat: 'YYYY', + dateFormat: 'M/D/YYYY', + dayFormat: 'D', + dateTimeFormat: 'M/D/YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'წინა თვე (PageUp)', + nextMonth: 'მომდევნო თვე (PageDown)', + previousYear: 'წინა წელი (Control + left)', + nextYear: 'მომდევნო წელი (Control + right)', + previousDecade: 'წინა ათწლეული', + nextDecade: 'მომდევნო ათწლეული', + previousCentury: 'გასული საუკუნე', + nextCentury: 'მომდევნო საუკუნე', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/kk_KZ.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/kk_KZ.ts new file mode 100644 index 0000000..f3b6787 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/kk_KZ.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'kk_KZ', + today: 'Бүгін', + now: 'Қазір', + backToToday: 'Ағымдағы күн', + ok: 'Таңдау', + clear: 'Таза', + month: 'Ай', + year: 'Жыл', + timeSelect: 'Уақытты таңдау', + dateSelect: 'Күнді таңдау', + monthSelect: 'Айды таңдаңыз', + yearSelect: 'Жылды таңдаңыз', + decadeSelect: 'Онжылды таңдаңыз', + yearFormat: 'YYYY', + dateFormat: 'D-M-YYYY', + dayFormat: 'D', + dateTimeFormat: 'D-M-YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Алдыңғы ай (PageUp)', + nextMonth: 'Келесі ай (PageDown)', + previousYear: 'Алдыңғы жыл (Control + left)', + nextYear: 'Келесі жыл (Control + right)', + previousDecade: 'Алдыңғы онжылдық', + nextDecade: 'Келесі онжылдық', + previousCentury: 'Алдыңғы ғасыр', + nextCentury: 'Келесі ғасыр', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/km_KH.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/km_KH.ts new file mode 100644 index 0000000..2edb5da --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/km_KH.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'km', + today: 'ថ្ងៃនេះ', + now: 'ឥឡូវ​នេះ', + backToToday: 'ត្រលប់ទៅថ្ងៃនេះ', + ok: 'កំណត់', + timeSelect: 'រយៈពេលជ្រើសរើស', + dateSelect: 'ជ្រើសរើសកាលបរិច្ឆេទ', + weekSelect: 'ជ្រើសរើសសប្តាហ៍', + clear: 'ច្បាស់', + month: 'ខែ', + year: 'ឆ្នាំ', + previousMonth: 'ខែមុន (ឡើងទំព័រ)', + nextMonth: 'ខែបន្ទាប់ (ប៊ូតុងចុះទំព័រ)', + monthSelect: 'ជ្រើសរើសខែ', + yearSelect: 'ជ្រើសរើសឆ្នាំ', + decadeSelect: 'ជ្រើសរើសអាយុ', + yearFormat: 'YYYY', + dayFormat: 'D', + dateFormat: 'YYYY-M-D', + dateTimeFormat: 'YYYY-M-D HH:mm:ss', + previousYear: 'ឆ្នាំមុន (Controlគ្រាប់ចុចបូកព្រួញខាងឆ្វេង)', + nextYear: 'ឆ្នាំក្រោយ (Control គ្រាប់ចុចបូកព្រួញស្ដាំ)', + previousDecade: 'ជំនាន់ចុងក្រោយ', + nextDecade: 'ជំនាន់​ក្រោយ', + previousCentury: 'សតវត្សចុងក្រោយ', + nextCentury: 'សតវត្សរ៍បន្ទាប់', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/kmr_IQ.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/kmr_IQ.ts new file mode 100644 index 0000000..867ec68 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/kmr_IQ.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'ku', + today: 'Îro', + now: 'Niha', + backToToday: 'Vegere îro', + ok: 'Temam', + clear: 'Paqij bike', + month: 'Meh', + year: 'Sal', + timeSelect: 'Demê hilbijêre', + dateSelect: 'Dîrok hilbijêre', + monthSelect: 'Meh hilbijêre', + yearSelect: 'Sal hilbijêre', + decadeSelect: 'Dehsal hilbijêre', + yearFormat: 'YYYY', + dateFormat: 'D/M/YYYY', + dayFormat: 'D', + dateTimeFormat: 'D/M/YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Meha peş (PageUp))', + nextMonth: 'Meha paş (PageDown)', + previousYear: 'Sala peş (Control + şep)', + nextYear: 'Sala paş (Control + rast)', + previousDecade: 'Dehsalen peş', + nextDecade: 'Dehsalen paş', + previousCentury: 'Sedsalen peş', + nextCentury: 'Sedsalen paş', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/kn_IN.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/kn_IN.ts new file mode 100644 index 0000000..1731ebd --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/kn_IN.ts @@ -0,0 +1,33 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'kn_IN', + today: 'ಇಂದು', + now: 'ಈಗ', + backToToday: 'ಇಂದು ಹಿಂದಿರುಗಿ', + ok: 'ಸರಿ', + clear: 'ಸ್ಪಷ್ಟ', + month: 'ತಿಂಗಳು', + year: 'ವರ್ಷ', + timeSelect: 'ಸಮಯ ಆಯ್ಕೆಮಾಡಿ', + dateSelect: 'ದಿನಾಂಕವನ್ನು ಆಯ್ಕೆ ಮಾಡಿ', + weekSelect: 'ಒಂದು ವಾರದ ಆರಿಸಿ', + monthSelect: 'ಒಂದು ತಿಂಗಳು ಆಯ್ಕೆಮಾಡಿ', + yearSelect: 'ಒಂದು ವರ್ಷ ಆರಿಸಿ', + decadeSelect: 'ಒಂದು ದಶಕದ ಆಯ್ಕೆಮಾಡಿ', + yearFormat: 'YYYY', + dateFormat: 'M/D/YYYY', + dayFormat: 'D', + dateTimeFormat: 'M/D/YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'ಹಿಂದಿನ ತಿಂಗಳು (ಪೇಜ್ಅಪ್)', + nextMonth: 'ಮುಂದಿನ ತಿಂಗಳು (ಪೇಜ್ಡೌನ್)', + previousYear: 'ಕಳೆದ ವರ್ಷ (Ctrl + ಎಡ)', + nextYear: 'ಮುಂದಿನ ವರ್ಷ (Ctrl + ಬಲ)', + previousDecade: 'ಕಳೆದ ದಶಕ', + nextDecade: 'ಮುಂದಿನ ದಶಕ', + previousCentury: 'ಕಳೆದ ಶತಮಾನ', + nextCentury: 'ಮುಂದಿನ ಶತಮಾನ', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ko_KR.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ko_KR.ts new file mode 100644 index 0000000..6f8416c --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ko_KR.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'ko_KR', + today: '오늘', + now: '현재 시각', + backToToday: '오늘로 돌아가기', + ok: '확인', + clear: '지우기', + month: '월', + year: '년', + timeSelect: '시간 선택', + dateSelect: '날짜 선택', + monthSelect: '달 선택', + yearSelect: '연 선택', + decadeSelect: '연대 선택', + yearFormat: 'YYYY년', + dateFormat: 'YYYY-MM-DD', + dayFormat: 'Do', + dateTimeFormat: 'YYYY-MM-DD HH:mm:ss', + monthBeforeYear: false, + previousMonth: '이전 달 (PageUp)', + nextMonth: '다음 달 (PageDown)', + previousYear: '이전 해 (Control + left)', + nextYear: '다음 해 (Control + right)', + previousDecade: '이전 연대', + nextDecade: '다음 연대', + previousCentury: '이전 세기', + nextCentury: '다음 세기', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/lt_LT.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/lt_LT.ts new file mode 100644 index 0000000..2ddb658 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/lt_LT.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'lt_LT', + today: 'Šiandien', + now: 'Dabar', + backToToday: 'Rodyti šiandien', + ok: 'Gerai', + clear: 'Išvalyti', + month: 'Mėnesis', + year: 'Metai', + timeSelect: 'Pasirinkti laiką', + dateSelect: 'Pasirinkti datą', + monthSelect: 'Pasirinkti mėnesį', + yearSelect: 'Pasirinkti metus', + decadeSelect: 'Pasirinkti dešimtmetį', + yearFormat: 'YYYY', + dateFormat: 'YYYY-MM-DD', + dayFormat: 'DD', + dateTimeFormat: 'YYYY-MM-DD HH:MM:SS', + monthBeforeYear: true, + previousMonth: 'Buvęs mėnesis (PageUp)', + nextMonth: 'Sekantis mėnesis (PageDown)', + previousYear: 'Buvę metai (Control + left)', + nextYear: 'Sekantis metai (Control + right)', + previousDecade: 'Buvęs dešimtmetis', + nextDecade: 'Sekantis dešimtmetis', + previousCentury: 'Buvęs amžius', + nextCentury: 'Sekantis amžius', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/lv_LV.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/lv_LV.ts new file mode 100644 index 0000000..0529ff6 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/lv_LV.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'lv_LV', + today: 'Šodien', + now: 'Tagad', + backToToday: 'Atpakaļ pie šodienas', + ok: 'Ok', + clear: 'Skaidrs', + month: 'Mēnesis', + year: 'Gads', + timeSelect: 'Izvēlieties laiku', + dateSelect: 'Izvēlieties datumu', + monthSelect: 'Izvēlieties mēnesi', + yearSelect: 'Izvēlieties gadu', + decadeSelect: 'Izvēlieties desmit gadus', + yearFormat: 'YYYY', + dateFormat: 'D.M.YYYY', + dayFormat: 'D', + dateTimeFormat: 'D.M.YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Iepriekšējais mēnesis (PageUp)', + nextMonth: 'Nākammēnes (PageDown)', + previousYear: 'Pagājušais gads (Control + left)', + nextYear: 'Nākamgad (Control + right)', + previousDecade: 'Pēdējā desmitgadē', + nextDecade: 'Nākamā desmitgade', + previousCentury: 'Pagājušajā gadsimtā', + nextCentury: 'Nākamajā gadsimtā', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/mk_MK.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/mk_MK.ts new file mode 100644 index 0000000..d1dd459 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/mk_MK.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'mk_MK', + today: 'Денес', + now: 'Сега', + backToToday: 'Назад до денес', + ok: 'ОК', + clear: 'Избриши', + month: 'Месец', + year: 'Година', + timeSelect: 'Избери време', + dateSelect: 'Избери датум', + monthSelect: 'Избери месец', + yearSelect: 'Избери година', + decadeSelect: 'Избери деценија', + yearFormat: 'YYYY', + dateFormat: 'D.M.YYYY', + dayFormat: 'D', + dateTimeFormat: 'D.M.YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Претходен месец (PageUp)', + nextMonth: 'Нареден месец (PageDown)', + previousYear: 'Претходна година (Control + left)', + nextYear: 'Наредна година (Control + right)', + previousDecade: 'Претходна деценија', + nextDecade: 'Наредна деценија', + previousCentury: 'Претходен век', + nextCentury: 'Нареден век', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ml_IN.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ml_IN.ts new file mode 100644 index 0000000..5c7b513 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ml_IN.ts @@ -0,0 +1,33 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'ml_IN', + today: 'ഇന്ന്', + now: 'ഇപ്പോൾ', + backToToday: 'ഇന്നത്തെ ദിവസത്തിലേക്ക് തിരിച്ചു പോകുക', + ok: 'ശരിയാണ്', + clear: 'നീക്കം ചെയ്യുക', + month: 'മാസം', + year: 'വർഷം', + timeSelect: 'സമയം തിരഞ്ഞെടുക്കുക', + dateSelect: 'ദിവസം തിരഞ്ഞെടുക്കുക', + weekSelect: 'വാരം തിരഞ്ഞെടുക്കുക', + monthSelect: 'മാസം തിരഞ്ഞെടുക്കുക', + yearSelect: 'വർഷം തിരഞ്ഞെടുക്കുക', + decadeSelect: 'ദശാബ്ദം തിരഞ്ഞെടുക്കുക', + yearFormat: 'YYYY', + dateFormat: 'M/D/YYYY', + dayFormat: 'D', + dateTimeFormat: 'M/D/YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'കഴിഞ്ഞ മാസം (PageUp)', + nextMonth: 'അടുത്ത മാസം (PageDown)', + previousYear: 'കഴിഞ്ഞ വർഷം (Control + left)', + nextYear: 'അടുത്ത വർഷം (Control + right)', + previousDecade: 'കഴിഞ്ഞ ദശാബ്ദം', + nextDecade: 'അടുത്ത ദശാബ്ദം', + previousCentury: 'കഴിഞ്ഞ നൂറ്റാണ്ട്', + nextCentury: 'അടുത്ത നൂറ്റാണ്ട്', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/mm_MM.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/mm_MM.ts new file mode 100644 index 0000000..b6a8241 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/mm_MM.ts @@ -0,0 +1,33 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'mm_MM', + today: 'ယနေ့', + now: 'ယခု', + backToToday: 'ယနေ့ မတိုင်ခင် သို့', + ok: 'Ok', + clear: 'ရှင်းမည်', + month: 'လ', + year: 'နှစ်', + timeSelect: 'အချိန်ကို ရွေး', + dateSelect: 'နေ့ကို ရွေး', + weekSelect: 'အပတ်ကို ရွေး', + monthSelect: 'လကို ရွေး', + yearSelect: 'နှစ်ကို ရွေး', + decadeSelect: 'ဆယ်စုနှစ်ကို ရွေး', + yearFormat: 'YYYY', + dateFormat: 'M/D/YYYY', + dayFormat: 'D', + dateTimeFormat: 'M/D/YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'ယခင် လ (PageUp)', + nextMonth: 'နောက် လ (PageDown)', + previousYear: 'ယခင် နှစ် (Control + left)', + nextYear: 'နောက် နှစ် (Control + right)', + previousDecade: 'ယခင် ဆယ်စုနှစ်', + nextDecade: 'နောက် ဆယ်စုနှစ်', + previousCentury: 'ယခင် ရာစုနှစ်', + nextCentury: 'နောက် ရာစုနှစ်', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/mn_MN.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/mn_MN.ts new file mode 100644 index 0000000..3b9e2ef --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/mn_MN.ts @@ -0,0 +1,33 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'mn_MN', + today: 'Өнөөдөр', + now: 'Одоо', + backToToday: 'Өнөөдөрлүү буцах', + ok: 'Ok', + clear: 'Цэвэрлэх', + month: 'Сар', + year: 'Жил', + timeSelect: 'Цаг сонгох', + dateSelect: 'Огноо сонгох', + weekSelect: '7 хоног сонгох', + monthSelect: 'Сар сонгох', + yearSelect: 'Жил сонгох', + decadeSelect: 'Арван сонгох', + yearFormat: 'YYYY', + dateFormat: 'YYYY/MM/DD', + dayFormat: 'DD', + dateTimeFormat: 'YYYY/MM/DD HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Өмнөх сар (PageUp)', + nextMonth: 'Дараа сар (PageDown)', + previousYear: 'Өмнөх жил (Control + left)', + nextYear: 'Дараа жил (Control + right)', + previousDecade: 'Өмнөх арван', + nextDecade: 'Дараа арван', + previousCentury: 'Өмнөх зуун', + nextCentury: 'Дараа зуун', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ms_MY.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ms_MY.ts new file mode 100644 index 0000000..1e3784c --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ms_MY.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'ms_MY', + today: 'Hari ini', + now: 'Sekarang', + backToToday: 'Kembali ke hari ini', + ok: 'Ok', + timeSelect: 'Pilih masa', + dateSelect: 'Pilih tarikh', + weekSelect: 'Pilih minggu', + clear: 'Padam', + month: 'Bulan', + year: 'Tahun', + previousMonth: 'Bulan lepas', + nextMonth: 'Bulan depan', + monthSelect: 'Pilih bulan', + yearSelect: 'Pilih tahun', + decadeSelect: 'Pilih dekad', + yearFormat: 'YYYY', + dayFormat: 'D', + dateFormat: 'M/D/YYYY', + dateTimeFormat: 'M/D/YYYY HH:mm:ss', + previousYear: 'Tahun lepas (Ctrl+left)', + nextYear: 'Tahun depan (Ctrl+right)', + previousDecade: 'Dekad lepas', + nextDecade: 'Dekad depan', + previousCentury: 'Abad lepas', + nextCentury: 'Abad depan', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/nb_NO.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/nb_NO.ts new file mode 100644 index 0000000..a2ce4ea --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/nb_NO.ts @@ -0,0 +1,33 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'nb_NO', + today: 'I dag', + now: 'Nå', + backToToday: 'Gå til i dag', + ok: 'Ok', + clear: 'Annuller', + month: 'Måned', + year: 'År', + timeSelect: 'Velg tidspunkt', + dateSelect: 'Velg dato', + weekSelect: 'Velg uke', + monthSelect: 'Velg måned', + yearSelect: 'Velg år', + decadeSelect: 'Velg tiår', + yearFormat: 'YYYY', + dateFormat: 'DD.MM.YYYY', + dayFormat: 'DD', + dateTimeFormat: 'DD.MM.YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Forrige måned (PageUp)', + nextMonth: 'Neste måned (PageDown)', + previousYear: 'Forrige år (Control + venstre)', + nextYear: 'Neste år (Control + høyre)', + previousDecade: 'Forrige tiår', + nextDecade: 'Neste tiår', + previousCentury: 'Forrige århundre', + nextCentury: 'Neste århundre', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/nl_BE.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/nl_BE.ts new file mode 100644 index 0000000..e78fef0 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/nl_BE.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'nl_BE', + today: 'Vandaag', + now: 'Nu', + backToToday: 'Terug naar vandaag', + ok: 'Ok', + clear: 'Reset', + month: 'Maand', + year: 'Jaar', + timeSelect: 'Selecteer tijd', + dateSelect: 'Selecteer datum', + monthSelect: 'Kies een maand', + yearSelect: 'Kies een jaar', + decadeSelect: 'Kies een decennium', + yearFormat: 'YYYY', + dateFormat: 'D-M-YYYY', + dayFormat: 'D', + dateTimeFormat: 'D-M-YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Vorige maand (PageUp)', + nextMonth: 'Volgende maand (PageDown)', + previousYear: 'Vorig jaar (Control + left)', + nextYear: 'Volgend jaar (Control + right)', + previousDecade: 'Vorig decennium', + nextDecade: 'Volgend decennium', + previousCentury: 'Vorige eeuw', + nextCentury: 'Volgende eeuw', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/nl_NL.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/nl_NL.ts new file mode 100644 index 0000000..cb33549 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/nl_NL.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'nl_NL', + today: 'Vandaag', + now: 'Nu', + backToToday: 'Terug naar vandaag', + ok: 'Ok', + clear: 'Reset', + month: 'Maand', + year: 'Jaar', + timeSelect: 'Selecteer tijd', + dateSelect: 'Selecteer datum', + monthSelect: 'Kies een maand', + yearSelect: 'Kies een jaar', + decadeSelect: 'Kies een decennium', + yearFormat: 'YYYY', + dateFormat: 'D-M-YYYY', + dayFormat: 'D', + dateTimeFormat: 'D-M-YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Vorige maand (PageUp)', + nextMonth: 'Volgende maand (PageDown)', + previousYear: 'Vorig jaar (Control + left)', + nextYear: 'Volgend jaar (Control + right)', + previousDecade: 'Vorig decennium', + nextDecade: 'Volgend decennium', + previousCentury: 'Vorige eeuw', + nextCentury: 'Volgende eeuw', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/pl_PL.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/pl_PL.ts new file mode 100644 index 0000000..d37f20f --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/pl_PL.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'pl_PL', + today: 'Dzisiaj', + now: 'Teraz', + backToToday: 'Ustaw dzisiaj', + ok: 'Ok', + clear: 'Wyczyść', + month: 'Miesiąc', + year: 'Rok', + timeSelect: 'Ustaw czas', + dateSelect: 'Ustaw datę', + monthSelect: 'Wybierz miesiąc', + yearSelect: 'Wybierz rok', + decadeSelect: 'Wybierz dekadę', + yearFormat: 'YYYY', + dateFormat: 'D/M/YYYY', + dayFormat: 'D', + dateTimeFormat: 'D/M/YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Poprzedni miesiąc (PageUp)', + nextMonth: 'Następny miesiąc (PageDown)', + previousYear: 'Ostatni rok (Ctrl + left)', + nextYear: 'Następny rok (Ctrl + right)', + previousDecade: 'Ostatnia dekada', + nextDecade: 'Następna dekada', + previousCentury: 'Ostatni wiek', + nextCentury: 'Następny wiek', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/pt_BR.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/pt_BR.ts new file mode 100644 index 0000000..a6ca2af --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/pt_BR.ts @@ -0,0 +1,34 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'pt_BR', + today: 'Hoje', + now: 'Agora', + backToToday: 'Voltar para hoje', + ok: 'Ok', + clear: 'Limpar', + month: 'Mês', + year: 'Ano', + timeSelect: 'Selecionar hora', + dateSelect: 'Selecionar data', + monthSelect: 'Escolher mês', + yearSelect: 'Escolher ano', + decadeSelect: 'Escolher década', + yearFormat: 'YYYY', + dateFormat: 'D/M/YYYY', + dayFormat: 'D', + dateTimeFormat: 'D/M/YYYY HH:mm:ss', + monthBeforeYear: false, + previousMonth: 'Mês anterior (PageUp)', + nextMonth: 'Próximo mês (PageDown)', + previousYear: 'Ano anterior (Control + esquerda)', + nextYear: 'Próximo ano (Control + direita)', + previousDecade: 'Década anterior', + nextDecade: 'Próxima década', + previousCentury: 'Século anterior', + nextCentury: 'Próximo século', + shortWeekDays: ['Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sáb'], + shortMonths: ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez'], +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/pt_PT.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/pt_PT.ts new file mode 100644 index 0000000..3c3c642 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/pt_PT.ts @@ -0,0 +1,34 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'pt_PT', + today: 'Hoje', + now: 'Agora', + backToToday: 'Hoje', + ok: 'Ok', + clear: 'Limpar', + month: 'Mês', + year: 'Ano', + timeSelect: 'Selecionar hora', + dateSelect: 'Selecionar data', + monthSelect: 'Selecionar mês', + yearSelect: 'Selecionar ano', + decadeSelect: 'Selecionar década', + yearFormat: 'YYYY', + dateFormat: 'D/M/YYYY', + dayFormat: 'D', + dateTimeFormat: 'D/M/YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Mês anterior (PageUp)', + nextMonth: 'Mês seguinte (PageDown)', + previousYear: 'Ano anterior (Control + left)', + nextYear: 'Ano seguinte (Control + right)', + previousDecade: 'Década anterior', + nextDecade: 'Década seguinte', + previousCentury: 'Século anterior', + nextCentury: 'Século seguinte', + shortWeekDays: ['Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sáb'], + shortMonths: ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez'], +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ro_RO.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ro_RO.ts new file mode 100644 index 0000000..7994b7b --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ro_RO.ts @@ -0,0 +1,33 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'ro_RO', + today: 'Azi', + now: 'Acum', + backToToday: 'Înapoi la azi', + ok: 'Ok', + clear: 'Șterge', + month: 'Lună', + year: 'An', + timeSelect: 'selectează timpul', + dateSelect: 'selectează data', + weekSelect: 'Alege o săptămână', + monthSelect: 'Alege o lună', + yearSelect: 'Alege un an', + decadeSelect: 'Alege un deceniu', + yearFormat: 'YYYY', + dateFormat: 'D/M/YYYY', + dayFormat: 'D', + dateTimeFormat: 'D/M/YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Luna anterioară (PageUp)', + nextMonth: 'Luna următoare (PageDown)', + previousYear: 'Anul anterior (Control + stânga)', + nextYear: 'Anul următor (Control + dreapta)', + previousDecade: 'Deceniul anterior', + nextDecade: 'Deceniul următor', + previousCentury: 'Secolul anterior', + nextCentury: 'Secolul următor', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ru_RU.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ru_RU.ts new file mode 100644 index 0000000..a93224c --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ru_RU.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'ru_RU', + today: 'Сегодня', + now: 'Сейчас', + backToToday: 'Текущая дата', + ok: 'ОК', + clear: 'Очистить', + month: 'Месяц', + year: 'Год', + timeSelect: 'Выбрать время', + dateSelect: 'Выбрать дату', + monthSelect: 'Выбрать месяц', + yearSelect: 'Выбрать год', + decadeSelect: 'Выбрать десятилетие', + yearFormat: 'YYYY', + dateFormat: 'D-M-YYYY', + dayFormat: 'D', + dateTimeFormat: 'D-M-YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Предыдущий месяц (PageUp)', + nextMonth: 'Следующий месяц (PageDown)', + previousYear: 'Предыдущий год (Control + left)', + nextYear: 'Следующий год (Control + right)', + previousDecade: 'Предыдущее десятилетие', + nextDecade: 'Следущее десятилетие', + previousCentury: 'Предыдущий век', + nextCentury: 'Следующий век', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/sk_SK.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/sk_SK.ts new file mode 100644 index 0000000..997f55e --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/sk_SK.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'sk_SK', + today: 'Dnes', + now: 'Teraz', + backToToday: 'Späť na dnes', + ok: 'Ok', + clear: 'Vymazať', + month: 'Mesiac', + year: 'Rok', + timeSelect: 'Vybrať čas', + dateSelect: 'Vybrať dátum', + monthSelect: 'Vybrať mesiac', + yearSelect: 'Vybrať rok', + decadeSelect: 'Vybrať dekádu', + yearFormat: 'YYYY', + dateFormat: 'D.M.YYYY', + dayFormat: 'D', + dateTimeFormat: 'D.M.YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Predchádzajúci mesiac (PageUp)', + nextMonth: 'Nasledujúci mesiac (PageDown)', + previousYear: 'Predchádzajúci rok (Control + left)', + nextYear: 'Nasledujúci rok (Control + right)', + previousDecade: 'Predchádzajúca dekáda', + nextDecade: 'Nasledujúca dekáda', + previousCentury: 'Predchádzajúce storočie', + nextCentury: 'Nasledujúce storočie', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/sl_SI.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/sl_SI.ts new file mode 100644 index 0000000..4af0184 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/sl_SI.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'sl_SI', + today: 'Danes', + now: 'Trenutno', + backToToday: 'Nazaj na danes', + ok: 'V redu', + clear: 'Počisti', + month: 'Mesec', + year: 'Leto', + timeSelect: 'Izberite čas', + dateSelect: 'Izberite datum', + monthSelect: 'Izberite mesec', + yearSelect: 'Izberite leto', + decadeSelect: 'Izberite desetletje', + yearFormat: 'YYYY', + dateFormat: 'DD.MM.YYYY', + dayFormat: 'D', + dateTimeFormat: 'DD.MM.YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Prejšnji mesec (PageUp)', + nextMonth: 'Naslednji mesec (PageDown)', + previousYear: 'Prejšnje leto (Control + left)', + nextYear: 'Naslednje leto (Control + right)', + previousDecade: 'Prejšnje desetletje', + nextDecade: 'Naslednje desetletje', + previousCentury: 'Prejšnje stoletje', + nextCentury: 'Naslednje stoletje', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/sr_RS.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/sr_RS.ts new file mode 100644 index 0000000..d77eb97 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/sr_RS.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'sr_RS', + today: 'Danas', + now: 'Sada', + backToToday: 'Vrati se na danas', + ok: 'U redu', + clear: 'Obriši', + month: 'Mesec', + year: 'Godina', + timeSelect: 'Izaberi vreme', + dateSelect: 'Izaberi datum', + monthSelect: 'Izaberi mesec', + yearSelect: 'Izaberi godinu', + decadeSelect: 'Izaberi deceniju', + yearFormat: 'YYYY', + dateFormat: 'DD.MM.YYYY', + dayFormat: 'D', + dateTimeFormat: 'DD.MM.YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Prethodni mesec (PageUp)', + nextMonth: 'Sledeći mesec (PageDown)', + previousYear: 'Prethodna godina (Control + left)', + nextYear: 'Sledeća godina (Control + right)', + previousDecade: 'Prethodna decenija', + nextDecade: 'Sledeća decenija', + previousCentury: 'Prethodni vek', + nextCentury: 'Sledeći vek', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/sv_SE.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/sv_SE.ts new file mode 100644 index 0000000..c42c29c --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/sv_SE.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'sv_SE', + today: 'I dag', + now: 'Nu', + backToToday: 'Till idag', + ok: 'Ok', + clear: 'Avbryt', + month: 'Månad', + year: 'År', + timeSelect: 'Välj tidpunkt', + dateSelect: 'Välj datum', + monthSelect: 'Välj månad', + yearSelect: 'Välj år', + decadeSelect: 'Välj årtionde', + yearFormat: 'YYYY', + dateFormat: 'YYYY-MM-DD', + dayFormat: 'D', + dateTimeFormat: 'YYYY-MM-DD H:mm:ss', + monthBeforeYear: true, + previousMonth: 'Förra månaden (PageUp)', + nextMonth: 'Nästa månad (PageDown)', + previousYear: 'Föreg år (Control + left)', + nextYear: 'Nästa år (Control + right)', + previousDecade: 'Föreg årtionde', + nextDecade: 'Nästa årtionde', + previousCentury: 'Föreg århundrade', + nextCentury: 'Nästa århundrade', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ta_IN.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ta_IN.ts new file mode 100644 index 0000000..7f0e305 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ta_IN.ts @@ -0,0 +1,33 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'ta_IN', + today: 'இன்று', + now: 'இப்போது', + backToToday: 'இன்றுக்கு திரும்பு', + ok: 'சரி', + clear: 'அழி', + month: 'மாதம்', + year: 'வருடம்', + timeSelect: 'நேரத்தைத் தேர்ந்தெடு', + dateSelect: 'தேதியைத் தேர்ந்தெடு', + weekSelect: 'வாரத்தைத் தேர்வுசெய்க', + monthSelect: 'மாதத்தைத் தேர்வுசெய்க', + yearSelect: 'வருடத்தைத் தேர்வுசெய்க', + decadeSelect: 'தசாப்தத்தைத் தேர்வுசெய்க', + yearFormat: 'YYYY', + dateFormat: 'M/D/YYYY', + dayFormat: 'D', + dateTimeFormat: 'M/D/YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'முந்தைய மாதம் (PageUp)', + nextMonth: 'அடுத்த மாதம் (PageDown)', + previousYear: 'முந்தைய வருடம் (Control + left)', + nextYear: 'அடுத்த வருடம் (Control + right)', + previousDecade: 'முந்தைய தசாப்தம்', + nextDecade: 'அடுத்த தசாப்தம்', + previousCentury: 'முந்தைய நூற்றாண்டு', + nextCentury: 'அடுத்த நூற்றாண்டு', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/th_TH.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/th_TH.ts new file mode 100644 index 0000000..bcc1c42 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/th_TH.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'th_TH', + today: 'วันนี้', + now: 'ตอนนี้', + backToToday: 'กลับไปยังวันนี้', + ok: 'ตกลง', + clear: 'ลบล้าง', + month: 'เดือน', + year: 'ปี', + timeSelect: 'เลือกเวลา', + dateSelect: 'เลือกวัน', + monthSelect: 'เลือกเดือน', + yearSelect: 'เลือกปี', + decadeSelect: 'เลือกทศวรรษ', + yearFormat: 'YYYY', + dateFormat: 'D/M/YYYY', + dayFormat: 'D', + dateTimeFormat: 'D/M/YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'เดือนก่อนหน้า (PageUp)', + nextMonth: 'เดือนถัดไป (PageDown)', + previousYear: 'ปีก่อนหน้า (Control + left)', + nextYear: 'ปีถัดไป (Control + right)', + previousDecade: 'ทศวรรษก่อนหน้า', + nextDecade: 'ทศวรรษถัดไป', + previousCentury: 'ศตวรรษก่อนหน้า', + nextCentury: 'ศตวรรษถัดไป', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/tr_TR.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/tr_TR.ts new file mode 100644 index 0000000..f2f1054 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/tr_TR.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'tr_TR', + today: 'Bugün', + now: 'Şimdi', + backToToday: 'Bugüne Geri Dön', + ok: 'tamam', + clear: 'Temizle', + month: 'Ay', + year: 'Yıl', + timeSelect: 'Zaman Seç', + dateSelect: 'Tarih Seç', + monthSelect: 'Ay Seç', + yearSelect: 'Yıl Seç', + decadeSelect: 'On Yıl Seç', + yearFormat: 'YYYY', + dateFormat: 'M/D/YYYY', + dayFormat: 'D', + dateTimeFormat: 'M/D/YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Önceki Ay (PageUp)', + nextMonth: 'Sonraki Ay (PageDown)', + previousYear: 'Önceki Yıl (Control + Sol)', + nextYear: 'Sonraki Yıl (Control + Sağ)', + previousDecade: 'Önceki On Yıl', + nextDecade: 'Sonraki On Yıl', + previousCentury: 'Önceki Yüzyıl', + nextCentury: 'Sonraki Yüzyıl', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ug_CN.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ug_CN.ts new file mode 100644 index 0000000..4e02416 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ug_CN.ts @@ -0,0 +1,31 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'ug_CN', + today: 'بۈگۈن', + now: 'ھازىر', + backToToday: 'بۈگۈنگە قايتىش', + ok: 'مۇقىملاشتۇرۇش', + timeSelect: 'ۋاقىت تاللاش', + dateSelect: 'كۈن تاللاش', + clear: 'تازىلاش', + month: 'ئاي', + year: 'يىل', + previousMonth: 'ئالدىنقى ئاي(ئالدىنقى بەت )', + nextMonth: 'كېلەركى ئاي (كېلەركى بەت)', + monthSelect: 'ئاي تاللاش', + yearSelect: 'يىل تاللاش', + decadeSelect: 'يىللارنى تاللاش', + yearFormat: 'YYYY-يىلى', + dayFormat: 'D-كۈنى', + dateFormat: 'YYYY-يىلىM-ئاينىڭD-كۈنى', + dateTimeFormat: 'YYYY-يىلىM—ئاينىڭD-كۈنى، HH:mm:ss', + previousYear: 'ئالدىنقى يىلى (Controlبىلەن يۆنىلىش كونۇپكىسى)', + nextYear: 'كېلەركى يىلى (Controlبىلەن يۆنىلىش كونۇپكىسى)', + previousDecade: 'ئالدىنقى يىللار', + nextDecade: 'كېيىنكى يىللار', + previousCentury: 'ئالدىنقى ئەسىر', + nextCentury: 'كېيىنكى ئەسىر', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/uk_UA.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/uk_UA.ts new file mode 100644 index 0000000..eb56087 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/uk_UA.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'uk_UA', + today: 'Сьогодні', + now: 'Зараз', + backToToday: 'Поточна дата', + ok: 'Ok', + clear: 'Очистити', + month: 'Місяць', + year: 'Рік', + timeSelect: 'Обрати час', + dateSelect: 'Обрати дату', + monthSelect: 'Обрати місяць', + yearSelect: 'Обрати рік', + decadeSelect: 'Обрати десятиріччя', + yearFormat: 'YYYY', + dateFormat: 'D-M-YYYY', + dayFormat: 'D', + dateTimeFormat: 'D-M-YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Попередній місяць (PageUp)', + nextMonth: 'Наступний місяць (PageDown)', + previousYear: 'Попередній рік (Control + left)', + nextYear: 'Наступний рік (Control + right)', + previousDecade: 'Попереднє десятиріччя', + nextDecade: 'Наступне десятиріччя', + previousCentury: 'Попереднє століття', + nextCentury: 'Наступне століття', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ur_PK.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ur_PK.ts new file mode 100644 index 0000000..d272adb --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/ur_PK.ts @@ -0,0 +1,33 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'ur_PK', + today: 'آج', + now: 'ابھی', + backToToday: 'آج واپس', + ok: 'ٹھیک ہے', + clear: 'صاف', + month: 'مہینہ', + year: 'سال', + timeSelect: 'وقت منتخب کریں', + dateSelect: 'تاریخ منتخب کریں', + weekSelect: 'ایک ہفتہ کا انتخاب کریں', + monthSelect: 'ایک مہینہ کا انتخاب کریں', + yearSelect: 'ایک سال کا انتخاب کریں', + decadeSelect: 'ایک دہائی کا انتخاب کریں', + yearFormat: 'YYYY', + dateFormat: 'M/D/YYYY', + dayFormat: 'D', + dateTimeFormat: 'M/D/YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'پچھلے مہینے (PageUp)', + nextMonth: 'اگلے مہینے (PageDown)', + previousYear: 'گزشتہ سال (Control + left)', + nextYear: 'اگلے سال (Control + right)', + previousDecade: 'پچھلی دہائی', + nextDecade: 'اگلی دہائی', + previousCentury: 'پچھلی صدی', + nextCentury: 'اگلی صدی', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/vi_VN.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/vi_VN.ts new file mode 100644 index 0000000..75302e7 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/vi_VN.ts @@ -0,0 +1,33 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'vi_VN', + today: 'Hôm nay', + now: 'Bây giờ', + backToToday: 'Trở về hôm nay', + ok: 'Ok', + clear: 'Xóa', + month: 'Tháng', + year: 'Năm', + timeSelect: 'Chọn thời gian', + dateSelect: 'Chọn ngày', + weekSelect: 'Chọn tuần', + monthSelect: 'Chọn tháng', + yearSelect: 'Chọn năm', + decadeSelect: 'Chọn thập kỷ', + yearFormat: 'YYYY', + dateFormat: 'D/M/YYYY', + dayFormat: 'D', + dateTimeFormat: 'D/M/YYYY HH:mm:ss', + monthBeforeYear: true, + previousMonth: 'Tháng trước (PageUp)', + nextMonth: 'Tháng sau (PageDown)', + previousYear: 'Năm trước (Control + left)', + nextYear: 'Năm sau (Control + right)', + previousDecade: 'Thập kỷ trước', + nextDecade: 'Thập kỷ sau', + previousCentury: 'Thế kỷ trước', + nextCentury: 'Thế kỷ sau', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/zh_CN.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/zh_CN.ts new file mode 100644 index 0000000..0b0495b --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/zh_CN.ts @@ -0,0 +1,32 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'zh_CN', + today: '今天', + now: '此刻', + backToToday: '返回今天', + ok: '确定', + timeSelect: '选择时间', + dateSelect: '选择日期', + weekSelect: '选择周', + clear: '清除', + month: '月', + year: '年', + previousMonth: '上个月 (翻页上键)', + nextMonth: '下个月 (翻页下键)', + monthSelect: '选择月份', + yearSelect: '选择年份', + decadeSelect: '选择年代', + yearFormat: 'YYYY年', + dayFormat: 'D日', + dateFormat: 'YYYY年M月D日', + dateTimeFormat: 'YYYY年M月D日 HH时mm分ss秒', + previousYear: '上一年 (Control键加左方向键)', + nextYear: '下一年 (Control键加右方向键)', + previousDecade: '上一年代', + nextDecade: '下一年代', + previousCentury: '上一世纪', + nextCentury: '下一世纪', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/zh_TW.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/zh_TW.ts new file mode 100644 index 0000000..47bd3b0 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/locale/zh_TW.ts @@ -0,0 +1,33 @@ +import type { Locale } from '../interface'; + +const locale: Locale = { + locale: 'zh_TW', + + today: '今天', + now: '此刻', + backToToday: '返回今天', + ok: '確定', + timeSelect: '選擇時間', + dateSelect: '選擇日期', + weekSelect: '選擇周', + clear: '清除', + month: '月', + year: '年', + previousMonth: '上個月 (翻頁上鍵)', + nextMonth: '下個月 (翻頁下鍵)', + monthSelect: '選擇月份', + yearSelect: '選擇年份', + decadeSelect: '選擇年代', + yearFormat: 'YYYY年', + dayFormat: 'D日', + dateFormat: 'YYYY年M月D日', + dateTimeFormat: 'YYYY年M月D日 HH時mm分ss秒', + previousYear: '上一年 (Control鍵加左方向鍵)', + nextYear: '下一年 (Control鍵加右方向鍵)', + previousDecade: '上一年代', + nextDecade: '下一年代', + previousCentury: '上一世紀', + nextCentury: '下一世紀', +}; + +export default locale; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/DatePanel/DateBody.tsx b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/DatePanel/DateBody.tsx new file mode 100644 index 0000000..74d6061 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/DatePanel/DateBody.tsx @@ -0,0 +1,119 @@ +import type { GenerateConfig } from '../../generate'; +import { + WEEK_DAY_COUNT, + getWeekStartDate, + isSameDate, + isSameMonth, + formatValue, +} from '../../utils/dateUtil'; +import type { Locale } from '../../interface'; +import useCellClassName from '../../hooks/useCellClassName'; +import PanelBody from '../PanelBody'; +import type { VueNode } from 'ant-design-vue/es/_util/type'; +import { useInjectRange } from '../../RangeContext'; +import useMergeProps from '../../hooks/useMergeProps'; + +export type DateRender = (props: { current: DateType; today: DateType }) => VueNode; + +export type DateBodyPassProps = { + dateRender?: DateRender; + disabledDate?: (date: DateType) => boolean; + + // Used for week panel + prefixColumn?: (date: DateType) => VueNode; + rowClassName?: (date: DateType) => string; +}; + +export type DateBodyProps = { + prefixCls: string; + generateConfig: GenerateConfig; + value?: DateType | null; + viewDate: DateType; + locale: Locale; + rowCount: number; + onSelect: (value: DateType) => void; +} & DateBodyPassProps; + +function DateBody(_props: DateBodyProps) { + const props = useMergeProps(_props); + const { prefixCls, generateConfig, prefixColumn, locale, rowCount, viewDate, value, dateRender } = + props; + + const { rangedValue, hoverRangedValue } = useInjectRange(); + + const baseDate = getWeekStartDate(locale.locale, generateConfig, viewDate); + const cellPrefixCls = `${prefixCls}-cell`; + const weekFirstDay = generateConfig.locale.getWeekFirstDay(locale.locale); + const today = generateConfig.getNow(); + + // ============================== Header ============================== + const headerCells: VueNode[] = []; + const weekDaysLocale: string[] = + locale.shortWeekDays || + (generateConfig.locale.getShortWeekDays + ? generateConfig.locale.getShortWeekDays(locale.locale) + : []); + + if (prefixColumn) { + headerCells.push(); + } + for (let i = 0; i < WEEK_DAY_COUNT; i += 1) { + headerCells.push({weekDaysLocale[(i + weekFirstDay) % WEEK_DAY_COUNT]}); + } + + // =============================== Body =============================== + const getCellClassName = useCellClassName({ + cellPrefixCls, + today, + value, + generateConfig, + rangedValue: prefixColumn ? null : rangedValue.value, + hoverRangedValue: prefixColumn ? null : hoverRangedValue.value, + isSameCell: (current, target) => isSameDate(generateConfig, current, target), + isInView: date => isSameMonth(generateConfig, date, viewDate), + offsetCell: (date, offset) => generateConfig.addDate(date, offset), + }); + + const getCellNode = dateRender + ? (date: DateType) => dateRender({ current: date, today }) + : undefined; + + return ( + + formatValue(date, { + locale, + format: 'YYYY-MM-DD', + generateConfig, + }) + } + headerCells={headerCells} + /> + ); +} + +DateBody.displayName = 'DateBody'; +DateBody.inheritAttrs = false; +DateBody.props = [ + 'prefixCls', + 'generateConfig', + 'value?', + 'viewDate', + 'locale', + 'rowCount', + 'onSelect', + 'dateRender?', + 'disabledDate?', + // Used for week panel + 'prefixColumn?', + 'rowClassName?', +]; +export default DateBody; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/DatePanel/DateHeader.tsx b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/DatePanel/DateHeader.tsx new file mode 100644 index 0000000..efad6b3 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/DatePanel/DateHeader.tsx @@ -0,0 +1,106 @@ +import Header from '../Header'; +import type { Locale } from '../../interface'; +import type { GenerateConfig } from '../../generate'; +import { useInjectPanel } from '../../PanelContext'; +import { formatValue } from '../../utils/dateUtil'; +import type { VueNode } from 'ant-design-vue/es/_util/type'; +import useMergeProps from '../../hooks/useMergeProps'; + +export type DateHeaderProps = { + prefixCls: string; + viewDate: DateType; + value?: DateType | null; + locale: Locale; + generateConfig: GenerateConfig; + + onPrevYear: () => void; + onNextYear: () => void; + onPrevMonth: () => void; + onNextMonth: () => void; + onYearClick: () => void; + onMonthClick: () => void; +}; + +function DateHeader(_props: DateHeaderProps) { + const props = useMergeProps(_props); + const { + prefixCls, + generateConfig, + locale, + viewDate, + onNextMonth, + onPrevMonth, + onNextYear, + onPrevYear, + onYearClick, + onMonthClick, + } = props; + + const { hideHeader } = useInjectPanel(); + if (hideHeader.value) { + return null; + } + + const headerPrefixCls = `${prefixCls}-header`; + + const monthsLocale: string[] = + locale.shortMonths || + (generateConfig.locale.getShortMonths + ? generateConfig.locale.getShortMonths(locale.locale) + : []); + + const month = generateConfig.getMonth(viewDate); + + // =================== Month & Year =================== + const yearNode: VueNode = ( + + ); + const monthNode: VueNode = ( + + ); + + const monthYearNodes = locale.monthBeforeYear ? [monthNode, yearNode] : [yearNode, monthNode]; + + return ( +
+ {monthYearNodes} +
+ ); +} + +DateHeader.displayName = 'DateHeader'; +DateHeader.inheritAttrs = false; +export default DateHeader; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/DatePanel/index.tsx b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/DatePanel/index.tsx new file mode 100644 index 0000000..02a3b68 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/DatePanel/index.tsx @@ -0,0 +1,117 @@ +import type { DateBodyPassProps, DateRender } from './DateBody'; +import DateBody from './DateBody'; +import DateHeader from './DateHeader'; +import type { PanelSharedProps } from '../../interface'; +import { WEEK_DAY_COUNT } from '../../utils/dateUtil'; +import type { KeyboardConfig } from '../../utils/uiUtil'; +import { createKeydownHandler } from '../../utils/uiUtil'; +import classNames from 'ant-design-vue/es/_util/classNames'; +import useMergeProps from '../../hooks/useMergeProps'; + +const DATE_ROW_COUNT = 6; + +export type DatePanelProps = { + active?: boolean; + dateRender?: DateRender; + + // Used for week panel + panelName?: string; + keyboardConfig?: KeyboardConfig; +} & PanelSharedProps & + DateBodyPassProps; + +function DatePanel(_props: DatePanelProps) { + const props = useMergeProps(_props); + const { + prefixCls, + panelName = 'date', + keyboardConfig, + active, + operationRef, + generateConfig, + value, + viewDate, + onViewDateChange, + onPanelChange, + onSelect, + } = props; + const panelPrefixCls = `${prefixCls}-${panelName}-panel`; + // ======================= Keyboard ======================= + operationRef.value = { + onKeydown: (event: KeyboardEvent) => + createKeydownHandler(event, { + onLeftRight: diff => { + onSelect(generateConfig.addDate(value || viewDate, diff), 'key'); + }, + onCtrlLeftRight: diff => { + onSelect(generateConfig.addYear(value || viewDate, diff), 'key'); + }, + onUpDown: diff => { + onSelect(generateConfig.addDate(value || viewDate, diff * WEEK_DAY_COUNT), 'key'); + }, + onPageUpDown: diff => { + onSelect(generateConfig.addMonth(value || viewDate, diff), 'key'); + }, + ...keyboardConfig, + }), + }; + + // ==================== View Operation ==================== + const onYearChange = (diff: number) => { + const newDate = generateConfig.addYear(viewDate, diff); + onViewDateChange(newDate); + onPanelChange(null, newDate); + }; + const onMonthChange = (diff: number) => { + const newDate = generateConfig.addMonth(viewDate, diff); + onViewDateChange(newDate); + onPanelChange(null, newDate); + }; + + return ( +
+ { + onYearChange(-1); + }} + onNextYear={() => { + onYearChange(1); + }} + onPrevMonth={() => { + onMonthChange(-1); + }} + onNextMonth={() => { + onMonthChange(1); + }} + onMonthClick={() => { + onPanelChange('month', viewDate); + }} + onYearClick={() => { + onPanelChange('year', viewDate); + }} + /> + onSelect(date, 'mouse')} + prefixCls={prefixCls} + value={value} + viewDate={viewDate} + rowCount={DATE_ROW_COUNT} + /> +
+ ); +} + +DatePanel.displayName = 'DatePanel'; +DatePanel.inheritAttrs = false; + +export default DatePanel; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/DatetimePanel/index.tsx b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/DatetimePanel/index.tsx new file mode 100644 index 0000000..31066e5 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/DatetimePanel/index.tsx @@ -0,0 +1,244 @@ +import type { DatePanelProps } from '../DatePanel' +import DatePanel from '../DatePanel' +import type { SharedTimeProps } from '../TimePanel' +import TimePanel from '../TimePanel' +import { tuple } from '../../utils/miscUtil' + +import { createVNode as _createVNode } from 'vue' +// @ts-ignore +import _defineProperty from '@babel/runtime/helpers/esm/defineProperty' +// @ts-ignore +import _objectSpread from '@babel/runtime/helpers/esm/objectSpread2' + +import { setDateTime as setTime } from '../../utils/timeUtil' +import type { PanelRefProps, DisabledTime } from '../../interface' +import KeyCode from 'ant-design-vue/es/_util/KeyCode' +import classNames from 'ant-design-vue/es/_util/classNames' +import { ref } from 'vue' +import useMergeProps from '../../hooks/useMergeProps' + +export type DatetimePanelProps = { + disabledTime?: DisabledTime + showTime?: boolean | SharedTimeProps + defaultValue?: DateType +} & Omit, 'disabledHours' | 'disabledMinutes' | 'disabledSeconds'> + +const ACTIVE_PANEL = tuple('date', 'time') +type ActivePanelType = (typeof ACTIVE_PANEL)[number] + +function DatetimePanel(_props: DatetimePanelProps) { + const props = useMergeProps(_props) + const { + prefixCls, + operationRef, + generateConfig, + value, + defaultValue, + disabledTime, + showTime, + onSelect + } = props + const panelPrefixCls = `${prefixCls}-datetime-panel` + const activePanel = ref(null) + + const dateOperationRef = ref({}) + const timeOperationRef = ref({}) + + const timeProps = typeof showTime === 'object' ? { ...showTime } : {} + + // ======================= Keyboard ======================= + function getNextActive(offset: number) { + const activeIndex = ACTIVE_PANEL.indexOf(activePanel.value!) + offset + const nextActivePanel = ACTIVE_PANEL[activeIndex] || null + return nextActivePanel + } + + const onBlur = (e?: FocusEvent) => { + if (timeOperationRef.value.onBlur) { + timeOperationRef.value.onBlur(e!) + } + activePanel.value = null + } + + operationRef.value = { + onKeydown: (event: KeyboardEvent) => { + // Switch active panel + if (event.which === KeyCode.TAB) { + const nextActivePanel = getNextActive(event.shiftKey ? -1 : 1) + activePanel.value = nextActivePanel + + if (nextActivePanel) { + event.preventDefault() + } + + return true + } + + // Operate on current active panel + if (activePanel.value) { + const ref = activePanel.value === 'date' ? dateOperationRef : timeOperationRef + + if (ref.value && ref.value.onKeydown) { + ref.value.onKeydown(event) + } + + return true + } + + // Switch first active panel if operate without panel + if ([KeyCode.LEFT, KeyCode.RIGHT, KeyCode.UP, KeyCode.DOWN].includes(event.which)) { + activePanel.value = 'date' + return true + } + + return false + }, + onBlur, + onClose: onBlur + } + + // ======================== Events ======================== + const onInternalSelect = (date: DateType, source: 'date' | 'time') => { + let selectedDate = date + + if (source === 'date' && !value && timeProps.defaultValue) { + // Date with time defaultValue + selectedDate = generateConfig.setHour( + selectedDate, + generateConfig.getHour(timeProps.defaultValue) + ) + selectedDate = generateConfig.setMinute( + selectedDate, + generateConfig.getMinute(timeProps.defaultValue) + ) + selectedDate = generateConfig.setSecond( + selectedDate, + generateConfig.getSecond(timeProps.defaultValue) + ) + } else if (source === 'time' && !value && defaultValue) { + selectedDate = generateConfig.setYear(selectedDate, generateConfig.getYear(defaultValue)) + selectedDate = generateConfig.setMonth(selectedDate, generateConfig.getMonth(defaultValue)) + selectedDate = generateConfig.setDate(selectedDate, generateConfig.getDate(defaultValue)) + } + + if (onSelect) { + onSelect(selectedDate, 'mouse') + } + } + + // ======================== Render ======================== + const disabledTimes = disabledTime ? disabledTime(value || null) : {} + + /* return ( +
+ { + onInternalSelect( + setTime( + generateConfig, + date, + !value && typeof showTime === 'object' ? showTime.defaultValue : null, + ), + 'date', + ); + }}*!/ + onSelect={function onSelect(date) { + onInternalSelect( + setTime( + generateConfig, + date, + !value && typeof showTime === 'object' ? showTime.defaultValue : null + ), + 'date' + ) + }} + /> + { + console.log('ssssssssssss') + onInternalSelect(date, 'time') + }} + /> +
+ )*/ + return _createVNode( + 'div', + { + class: classNames( + panelPrefixCls, + _defineProperty({}, ''.concat(panelPrefixCls, '-active'), activePanel.value) + ) + }, + [ + _createVNode( + DatePanel, + _objectSpread( + _objectSpread({}, props), + {}, + { + operationRef: dateOperationRef, + active: activePanel.value === 'date', + onSelect: function onSelect(date: any) { + onInternalSelect( + setTime( + generateConfig, + date, + !value && typeof showTime === 'object' ? showTime.defaultValue : null + ), + 'date' + ) + } + } + ), + null + ), + _createVNode( + TimePanel, + _objectSpread( + _objectSpread( + _objectSpread( + _objectSpread({}, props), + {}, + { + format: undefined + }, + timeProps + ), + disabledTimes + ), + {}, + { + disabledTime: null, + defaultValue: undefined, + operationRef: timeOperationRef, + active: activePanel.value === 'time', + onSelect: function onSelect(date) { + onInternalSelect(date, 'time') + } + } + ), + null + ) + ] + ) +} + +DatetimePanel.displayName = 'DatetimePanel' +DatetimePanel.inheritAttrs = false + +export default DatetimePanel diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/DecadePanel/DecadeBody.tsx b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/DecadePanel/DecadeBody.tsx new file mode 100644 index 0000000..4872378 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/DecadePanel/DecadeBody.tsx @@ -0,0 +1,68 @@ +import type { GenerateConfig } from '../../generate' +import { DECADE_DISTANCE_COUNT, DECADE_UNIT_DIFF } from './index' +import PanelBody from '../PanelBody' +import useMergeProps from '../../hooks/useMergeProps' + +export const DECADE_COL_COUNT = 3 +const DECADE_ROW_COUNT = 4 + +export type YearBodyProps = { + prefixCls: string + generateConfig: GenerateConfig + viewDate: DateType + disabledDate?: (date: DateType) => boolean + onSelect: (value: DateType) => void +} + +function DecadeBody(_props: YearBodyProps) { + const props = useMergeProps(_props) + const DECADE_UNIT_DIFF_DES = DECADE_UNIT_DIFF - 1 + const { prefixCls, viewDate, generateConfig } = props + + const cellPrefixCls = `${prefixCls}-cell` + + const yearNumber = generateConfig.getYear(viewDate) + const decadeYearNumber = Math.floor(yearNumber / DECADE_UNIT_DIFF) * DECADE_UNIT_DIFF + + const startDecadeYear = Math.floor(yearNumber / DECADE_DISTANCE_COUNT) * DECADE_DISTANCE_COUNT + const endDecadeYear = startDecadeYear + DECADE_DISTANCE_COUNT - 1 + + const baseDecadeYear = generateConfig.setYear( + viewDate, + startDecadeYear - + Math.ceil( + (DECADE_COL_COUNT * DECADE_ROW_COUNT * DECADE_UNIT_DIFF - DECADE_DISTANCE_COUNT) / 2 + ) + ) + + const getCellClassName = (date: DateType) => { + const startDecadeNumber = generateConfig.getYear(date) + const endDecadeNumber = startDecadeNumber + DECADE_UNIT_DIFF_DES + + return { + [`${cellPrefixCls}-in-view`]: + startDecadeYear <= startDecadeNumber && endDecadeNumber <= endDecadeYear, + [`${cellPrefixCls}-selected`]: startDecadeNumber === decadeYearNumber + } + } + + return ( + { + const startDecadeNumber = generateConfig.getYear(date) + return `${startDecadeNumber}-${startDecadeNumber + DECADE_UNIT_DIFF_DES}` + }} + getCellClassName={getCellClassName} + getCellDate={(date, offset) => generateConfig.addYear(date, offset * DECADE_UNIT_DIFF)} + /> + ) +} + +DecadeBody.displayName = 'DecadeBody' +DecadeBody.inheritAttrs = false + +export default DecadeBody diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/DecadePanel/DecadeHeader.tsx b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/DecadePanel/DecadeHeader.tsx new file mode 100644 index 0000000..8265c24 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/DecadePanel/DecadeHeader.tsx @@ -0,0 +1,45 @@ +import Header from '../Header' +import type { GenerateConfig } from '../../generate' +import { DECADE_DISTANCE_COUNT } from './index' +import { useInjectPanel } from '../../PanelContext' +import useMergeProps from '../../hooks/useMergeProps' + +export type YearHeaderProps = { + prefixCls: string + viewDate: DateType + generateConfig: GenerateConfig + + onPrevDecades: () => void + onNextDecades: () => void +} + +function DecadeHeader(_props: YearHeaderProps) { + const props = useMergeProps(_props) + const { prefixCls, generateConfig, viewDate, onPrevDecades, onNextDecades } = props + const { hideHeader } = useInjectPanel() + if (hideHeader) { + return null + } + + const headerPrefixCls = `${prefixCls}-header` + + const yearNumber = generateConfig.getYear(viewDate) + const startYear = Math.floor(yearNumber / DECADE_DISTANCE_COUNT) * DECADE_DISTANCE_COUNT + const endYear = startYear + DECADE_DISTANCE_COUNT - 1 + + return ( +
+ {startYear}-{endYear} +
+ ) +} + +DecadeHeader.displayName = 'DecadeHeader' +DecadeHeader.inheritAttrs = false + +export default DecadeHeader diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/DecadePanel/index.tsx b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/DecadePanel/index.tsx new file mode 100644 index 0000000..e600b33 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/DecadePanel/index.tsx @@ -0,0 +1,80 @@ +import DecadeHeader from './DecadeHeader'; +import DecadeBody, { DECADE_COL_COUNT } from './DecadeBody'; +import type { PanelSharedProps } from '../../interface'; +import { createKeydownHandler } from '../../utils/uiUtil'; +import useMergeProps from '../../hooks/useMergeProps'; + +export type DecadePanelProps = PanelSharedProps; + +export const DECADE_UNIT_DIFF = 10; +export const DECADE_DISTANCE_COUNT = DECADE_UNIT_DIFF * 10; + +function DecadePanel(_props: DecadePanelProps) { + const props = useMergeProps(_props); + const { + prefixCls, + onViewDateChange, + generateConfig, + viewDate, + operationRef, + onSelect, + onPanelChange, + } = props; + + const panelPrefixCls = `${prefixCls}-decade-panel`; + + // ======================= Keyboard ======================= + operationRef.value = { + onKeydown: (event: KeyboardEvent) => + createKeydownHandler(event, { + onLeftRight: diff => { + onSelect(generateConfig.addYear(viewDate, diff * DECADE_UNIT_DIFF), 'key'); + }, + onCtrlLeftRight: diff => { + onSelect(generateConfig.addYear(viewDate, diff * DECADE_DISTANCE_COUNT), 'key'); + }, + onUpDown: diff => { + onSelect( + generateConfig.addYear(viewDate, diff * DECADE_UNIT_DIFF * DECADE_COL_COUNT), + 'key', + ); + }, + onEnter: () => { + onPanelChange('year', viewDate); + }, + }), + }; + + // ==================== View Operation ==================== + const onDecadesChange = (diff: number) => { + const newDate = generateConfig.addYear(viewDate, diff * DECADE_DISTANCE_COUNT); + onViewDateChange(newDate); + onPanelChange(null, newDate); + }; + + const onInternalSelect = (date: DateType) => { + onSelect(date, 'mouse'); + onPanelChange('year', date); + }; + + return ( +
+ { + onDecadesChange(-1); + }} + onNextDecades={() => { + onDecadesChange(1); + }} + /> + +
+ ); +} + +DecadePanel.displayName = 'DecadePanel'; +DecadePanel.inheritAttrs = false; + +export default DecadePanel; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/Header.tsx b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/Header.tsx new file mode 100644 index 0000000..3f80da8 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/Header.tsx @@ -0,0 +1,100 @@ +import type { CSSProperties } from 'vue'; +import type { VueNode } from 'ant-design-vue/es/_util/type'; +import useMergeProps from '../hooks/useMergeProps'; +import { useInjectPanel } from '../PanelContext'; + +const HIDDEN_STYLE: CSSProperties = { + visibility: 'hidden', +}; + +export type HeaderProps = { + prefixCls: string; + + // Icons + prevIcon?: VueNode; + nextIcon?: VueNode; + superPrevIcon?: VueNode; + superNextIcon?: VueNode; + + /** Last one step */ + onPrev?: () => void; + /** Next one step */ + onNext?: () => void; + /** Last multiple steps */ + onSuperPrev?: () => void; + /** Next multiple steps */ + onSuperNext?: () => void; + + children?: VueNode; +}; + +function Header(_props: HeaderProps, { slots }) { + const props = useMergeProps(_props); + const { + prefixCls, + prevIcon = '\u2039', + nextIcon = '\u203A', + superPrevIcon = '\u00AB', + superNextIcon = '\u00BB', + onSuperPrev, + onSuperNext, + onPrev, + onNext, + } = props; + const { hideNextBtn, hidePrevBtn } = useInjectPanel(); + + return ( +
+ {onSuperPrev && ( + + )} + {onPrev && ( + + )} +
{slots.default?.()}
+ {onNext && ( + + )} + {onSuperNext && ( + + )} +
+ ); +} + +Header.displayName = 'Header'; +Header.inheritAttrs = false; + +export default Header; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/MonthPanel/MonthBody.tsx b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/MonthPanel/MonthBody.tsx new file mode 100644 index 0000000..de31bec --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/MonthPanel/MonthBody.tsx @@ -0,0 +1,89 @@ +import type { GenerateConfig } from '../../generate'; +import type { Locale } from '../../interface'; +import { formatValue, isSameMonth } from '../../utils/dateUtil'; +import { useInjectRange } from '../../RangeContext'; +import useCellClassName from '../../hooks/useCellClassName'; +import PanelBody from '../PanelBody'; +import type { VueNode } from 'ant-design-vue/es/_util/type'; +import useMergeProps from '../../hooks/useMergeProps'; + +export const MONTH_COL_COUNT = 3; +const MONTH_ROW_COUNT = 4; + +export type MonthCellRender = (obj: { current: DateType; locale: Locale }) => VueNode; + +export type MonthBodyProps = { + prefixCls: string; + locale: Locale; + generateConfig: GenerateConfig; + value?: DateType | null; + viewDate: DateType; + disabledDate?: (date: DateType) => boolean; + monthCellRender?: MonthCellRender; + onSelect: (value: DateType) => void; +}; + +function MonthBody(_props: MonthBodyProps) { + const props = useMergeProps(_props); + const { prefixCls, locale, value, viewDate, generateConfig, monthCellRender } = props; + + const { rangedValue, hoverRangedValue } = useInjectRange(); + + const cellPrefixCls = `${prefixCls}-cell`; + + const getCellClassName = useCellClassName({ + cellPrefixCls, + value, + generateConfig, + rangedValue: rangedValue.value, + hoverRangedValue: hoverRangedValue.value, + isSameCell: (current, target) => isSameMonth(generateConfig, current, target), + isInView: () => true, + offsetCell: (date, offset) => generateConfig.addMonth(date, offset), + }); + + const monthsLocale: string[] = + locale.shortMonths || + (generateConfig.locale.getShortMonths + ? generateConfig.locale.getShortMonths(locale.locale) + : []); + + const baseMonth = generateConfig.setMonth(viewDate, 0); + + const getCellNode = monthCellRender + ? (date: DateType) => monthCellRender({ current: date, locale }) + : undefined; + + return ( + + locale.monthFormat + ? formatValue(date, { + locale, + format: locale.monthFormat, + generateConfig, + }) + : monthsLocale[generateConfig.getMonth(date)] + } + getCellClassName={getCellClassName} + getCellDate={generateConfig.addMonth} + titleCell={date => + formatValue(date, { + locale, + format: 'YYYY-MM', + generateConfig, + }) + } + /> + ); +} + +MonthBody.displayName = 'MonthBody'; +MonthBody.inheritAttrs = false; + +export default MonthBody; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/MonthPanel/MonthHeader.tsx b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/MonthPanel/MonthHeader.tsx new file mode 100644 index 0000000..cc010ff --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/MonthPanel/MonthHeader.tsx @@ -0,0 +1,51 @@ +import Header from '../Header'; +import type { Locale } from '../../interface'; +import type { GenerateConfig } from '../../generate'; +import { useInjectPanel } from '../../PanelContext'; +import { formatValue } from '../../utils/dateUtil'; +import useMergeProps from '../../hooks/useMergeProps'; + +export type MonthHeaderProps = { + prefixCls: string; + viewDate: DateType; + locale: Locale; + generateConfig: GenerateConfig; + + onPrevYear: () => void; + onNextYear: () => void; + onYearClick: () => void; +}; + +function MonthHeader(_props: MonthHeaderProps) { + const props = useMergeProps(_props); + const { prefixCls, generateConfig, locale, viewDate, onNextYear, onPrevYear, onYearClick } = + props; + const { hideHeader } = useInjectPanel(); + if (hideHeader.value) { + return null; + } + + const headerPrefixCls = `${prefixCls}-header`; + + return ( +
+ +
+ ); +} + +MonthHeader.displayName = 'MonthHeader'; +MonthHeader.inheritAttrs = false; + +export default MonthHeader; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/MonthPanel/index.tsx b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/MonthPanel/index.tsx new file mode 100644 index 0000000..04fdfd7 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/MonthPanel/index.tsx @@ -0,0 +1,83 @@ +import MonthHeader from './MonthHeader'; +import type { MonthCellRender } from './MonthBody'; +import MonthBody, { MONTH_COL_COUNT } from './MonthBody'; +import type { PanelSharedProps } from '../../interface'; +import { createKeydownHandler } from '../../utils/uiUtil'; +import useMergeProps from '../../hooks/useMergeProps'; + +export type MonthPanelProps = { + monthCellContentRender?: MonthCellRender; +} & PanelSharedProps; + +function MonthPanel(_props: MonthPanelProps) { + const props = useMergeProps(_props); + const { + prefixCls, + operationRef, + onViewDateChange, + generateConfig, + value, + viewDate, + onPanelChange, + onSelect, + } = props; + + const panelPrefixCls = `${prefixCls}-month-panel`; + + // ======================= Keyboard ======================= + operationRef.value = { + onKeydown: (event: KeyboardEvent) => + createKeydownHandler(event, { + onLeftRight: diff => { + onSelect(generateConfig.addMonth(value || viewDate, diff), 'key'); + }, + onCtrlLeftRight: diff => { + onSelect(generateConfig.addYear(value || viewDate, diff), 'key'); + }, + onUpDown: diff => { + onSelect(generateConfig.addMonth(value || viewDate, diff * MONTH_COL_COUNT), 'key'); + }, + onEnter: () => { + onPanelChange('date', value || viewDate); + }, + }), + }; + + // ==================== View Operation ==================== + const onYearChange = (diff: number) => { + const newDate = generateConfig.addYear(viewDate, diff); + onViewDateChange(newDate); + onPanelChange(null, newDate); + }; + + return ( +
+ { + onYearChange(-1); + }} + onNextYear={() => { + onYearChange(1); + }} + onYearClick={() => { + onPanelChange('year', viewDate); + }} + /> + + {...props} + prefixCls={prefixCls} + onSelect={date => { + onSelect(date, 'mouse'); + onPanelChange('date', date); + }} + /> +
+ ); +} + +MonthPanel.displayName = 'MonthPanel'; +MonthPanel.inheritAttrs = false; + +export default MonthPanel; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/PanelBody.tsx b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/PanelBody.tsx new file mode 100644 index 0000000..95522ff --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/PanelBody.tsx @@ -0,0 +1,147 @@ +import { useInjectPanel } from '../PanelContext' +import type { GenerateConfig } from '../generate' +import { getLastDay } from '../utils/timeUtil' +import type { PanelMode } from '../interface' +import { getCellDateDisabled } from '../utils/dateUtil' +import type { VueNode } from 'ant-design-vue/es/_util/type' +import classNames from 'ant-design-vue/es/_util/classNames' +import useMergeProps from '../hooks/useMergeProps' + +export type PanelBodyProps = { + prefixCls: string + disabledDate?: (date: DateType) => boolean + onSelect: (value: DateType) => void + picker?: PanelMode + + // By panel + headerCells?: VueNode[] + rowNum: number + colNum: number + baseDate: DateType + getCellClassName: (date: DateType) => Record + getCellDate: (date: DateType, offset: number) => DateType + getCellText: (date: DateType) => VueNode + getCellNode?: (date: DateType) => VueNode + titleCell?: (date: DateType) => string + generateConfig: GenerateConfig + + // Used for week panel + prefixColumn?: (date: DateType) => VueNode + rowClassName?: (date: DateType) => string +} + +function PanelBody(_props: PanelBodyProps) { + const { + prefixCls, + disabledDate, + onSelect, + picker, + rowNum, + colNum, + prefixColumn, + rowClassName, + baseDate, + getCellClassName, + getCellText, + getCellNode, + getCellDate, + generateConfig, + titleCell, + headerCells + } = useMergeProps(_props) + const { onDateMouseenter, onDateMouseleave, mode } = useInjectPanel() + + const cellPrefixCls = `${prefixCls}-cell` + + // =============================== Body =============================== + const rows: VueNode[] = [] + + for (let i = 0; i < rowNum; i += 1) { + const row: VueNode[] = [] + let rowStartDate: DateType + + for (let j = 0; j < colNum; j += 1) { + const offset = i * colNum + j + const currentDate = getCellDate(baseDate, offset) + const disabled = getCellDateDisabled({ + cellDate: currentDate, + mode: mode.value, + disabledDate, + generateConfig + }) + + if (j === 0) { + rowStartDate = currentDate + + if (prefixColumn) { + row.push(prefixColumn(rowStartDate)) + } + } + + const title = titleCell && titleCell(currentDate) + + row.push( + { + if (!disabled) { + //todo check + onSelect[1](currentDate) + //onSelect(currentDate); + } + }} + onMouseenter={() => { + if (!disabled && onDateMouseenter) { + onDateMouseenter(currentDate) + } + }} + onMouseleave={() => { + if (!disabled && onDateMouseleave) { + onDateMouseleave(currentDate) + } + }} + > + {getCellNode ? ( + getCellNode(currentDate) + ) : ( +
{getCellText(currentDate)}
+ )} + + ) + } + + rows.push( + + {row} + + ) + } + + return ( +
+ + {headerCells && ( + + {headerCells} + + )} + {rows} +
+
+ ) +} + +PanelBody.displayName = 'PanelBody' +PanelBody.inheritAttrs = false + +export default PanelBody diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/QuarterPanel/QuarterBody.tsx b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/QuarterPanel/QuarterBody.tsx new file mode 100644 index 0000000..edbb8ad --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/QuarterPanel/QuarterBody.tsx @@ -0,0 +1,71 @@ +import type { GenerateConfig } from '../../generate'; +import type { Locale } from '../../interface'; +import { formatValue, isSameQuarter } from '../../utils/dateUtil'; +import { useInjectRange } from '../../RangeContext'; +import useCellClassName from '../../hooks/useCellClassName'; +import PanelBody from '../PanelBody'; +import useMergeProps from '../../hooks/useMergeProps'; + +export const QUARTER_COL_COUNT = 4; +const QUARTER_ROW_COUNT = 1; + +export type QuarterBodyProps = { + prefixCls: string; + locale: Locale; + generateConfig: GenerateConfig; + value?: DateType | null; + viewDate: DateType; + disabledDate?: (date: DateType) => boolean; + onSelect: (value: DateType) => void; +}; + +function QuarterBody(_props: QuarterBodyProps) { + const props = useMergeProps(_props); + const { prefixCls, locale, value, viewDate, generateConfig } = props; + + const { rangedValue, hoverRangedValue } = useInjectRange(); + + const cellPrefixCls = `${prefixCls}-cell`; + + const getCellClassName = useCellClassName({ + cellPrefixCls, + value, + generateConfig, + rangedValue: rangedValue.value, + hoverRangedValue: hoverRangedValue.value, + isSameCell: (current, target) => isSameQuarter(generateConfig, current, target), + isInView: () => true, + offsetCell: (date, offset) => generateConfig.addMonth(date, offset * 3), + }); + + const baseQuarter = generateConfig.setDate(generateConfig.setMonth(viewDate, 0), 1); + + return ( + + formatValue(date, { + locale, + format: locale.quarterFormat || '[Q]Q', + generateConfig, + }) + } + getCellClassName={getCellClassName} + getCellDate={(date, offset) => generateConfig.addMonth(date, offset * 3)} + titleCell={date => + formatValue(date, { + locale, + format: 'YYYY-[Q]Q', + generateConfig, + }) + } + /> + ); +} + +QuarterBody.displayName = 'QuarterBody'; +QuarterBody.inheritAttrs = false; +export default QuarterBody; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/QuarterPanel/QuarterHeader.tsx b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/QuarterPanel/QuarterHeader.tsx new file mode 100644 index 0000000..223f5d1 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/QuarterPanel/QuarterHeader.tsx @@ -0,0 +1,50 @@ +import Header from '../Header'; +import type { Locale } from '../../interface'; +import type { GenerateConfig } from '../../generate'; +import { useInjectPanel } from '../../PanelContext'; +import { formatValue } from '../../utils/dateUtil'; +import useMergeProps from '../../hooks/useMergeProps'; + +export type QuarterHeaderProps = { + prefixCls: string; + viewDate: DateType; + locale: Locale; + generateConfig: GenerateConfig; + + onPrevYear: () => void; + onNextYear: () => void; + onYearClick: () => void; +}; + +function QuarterHeader(_props: QuarterHeaderProps) { + const props = useMergeProps(_props); + const { prefixCls, generateConfig, locale, viewDate, onNextYear, onPrevYear, onYearClick } = + props; + const { hideHeader } = useInjectPanel(); + if (hideHeader.value) { + return null; + } + + const headerPrefixCls = `${prefixCls}-header`; + return ( +
+ +
+ ); +} + +QuarterHeader.displayName = 'QuarterHeader'; +QuarterHeader.inheritAttrs = false; + +export default QuarterHeader; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/QuarterPanel/index.tsx b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/QuarterPanel/index.tsx new file mode 100644 index 0000000..a1f5057 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/QuarterPanel/index.tsx @@ -0,0 +1,76 @@ +import QuarterHeader from './QuarterHeader'; +import QuarterBody from './QuarterBody'; +import type { PanelSharedProps } from '../../interface'; +import { createKeydownHandler } from '../../utils/uiUtil'; +import useMergeProps from '../../hooks/useMergeProps'; + +export type QuarterPanelProps = {} & PanelSharedProps; + +function QuarterPanel(_props: QuarterPanelProps) { + const props = useMergeProps(_props); + const { + prefixCls, + operationRef, + onViewDateChange, + generateConfig, + value, + viewDate, + onPanelChange, + onSelect, + } = props; + + const panelPrefixCls = `${prefixCls}-quarter-panel`; + + // ======================= Keyboard ======================= + operationRef.value = { + onKeydown: (event: KeyboardEvent) => + createKeydownHandler(event, { + onLeftRight: diff => { + onSelect(generateConfig.addMonth(value || viewDate, diff * 3), 'key'); + }, + onCtrlLeftRight: diff => { + onSelect(generateConfig.addYear(value || viewDate, diff), 'key'); + }, + onUpDown: diff => { + onSelect(generateConfig.addYear(value || viewDate, diff), 'key'); + }, + }), + }; + + // ==================== View Operation ==================== + const onYearChange = (diff: number) => { + const newDate = generateConfig.addYear(viewDate, diff); + onViewDateChange(newDate); + onPanelChange(null, newDate); + }; + + return ( +
+ { + onYearChange(-1); + }} + onNextYear={() => { + onYearChange(1); + }} + onYearClick={() => { + onPanelChange('year', viewDate); + }} + /> + + {...props} + prefixCls={prefixCls} + onSelect={date => { + onSelect(date, 'mouse'); + }} + /> +
+ ); +} + +QuarterPanel.displayName = 'QuarterPanel'; +QuarterPanel.inheritAttrs = false; + +export default QuarterPanel; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/TimePanel/TimeBody.tsx b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/TimePanel/TimeBody.tsx new file mode 100644 index 0000000..ea6004e --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/TimePanel/TimeBody.tsx @@ -0,0 +1,311 @@ +import type { GenerateConfig } from '../../generate' +import type { Locale, OnSelect } from '../../interface' +import type { Unit } from './TimeUnitColumn' +import TimeUnitColumn from './TimeUnitColumn' +import { leftPad } from '../../utils/miscUtil' +import type { SharedTimeProps } from './index' +import { setTime as utilSetTime } from '../../utils/timeUtil' +import { cloneElement } from 'ant-design-vue/es/_util/vnode' +import type { VueNode } from 'ant-design-vue/es/_util/type' +import type { Ref, VNode } from 'vue' +import { onBeforeUpdate, ref, watchEffect, computed, defineComponent } from 'vue' + +function generateUnits( + start: number, + end: number, + step: number, + disabledUnits: number[] | undefined +) { + const units: Unit[] = [] + for (let i = start; i <= end; i += step) { + units.push({ + label: leftPad(i, 2), + value: i, + disabled: (disabledUnits || []).includes(i) + }) + } + return units +} + +export type BodyOperationRef = { + onUpDown: (diff: number) => void +} + +export type TimeBodyProps = { + prefixCls: string + locale: Locale + generateConfig: GenerateConfig + value?: DateType | null + onSelect: OnSelect + activeColumnIndex: number + operationRef: Ref +} & SharedTimeProps + +const TimeBody = defineComponent({ + name: 'TimeBody', + inheritAttrs: false, + props: [ + 'generateConfig', + 'prefixCls', + 'operationRef', + 'activeColumnIndex', + 'value', + 'showHour', + 'showMinute', + 'showSecond', + 'use12Hours', + 'hourStep', + 'minuteStep', + 'secondStep', + 'disabledHours', + 'disabledMinutes', + 'disabledSeconds', + 'disabledTime', + 'hideDisabledOptions', + 'onSelect' + ], + setup(props) { + const originHour = computed(() => + props.value ? props.generateConfig.getHour(props.value) : -1 + ) + const isPM = computed(() => { + if (props.use12Hours) { + return originHour.value >= 12 // -1 means should display AM + } else { + return false + } + }) + const hour = computed(() => { + // Should additional logic to handle 12 hours + if (props.use12Hours) { + return originHour.value % 12 + } else { + return originHour.value + } + }) + const minute = computed(() => (props.value ? props.generateConfig.getMinute(props.value) : -1)) + const second = computed(() => (props.value ? props.generateConfig.getSecond(props.value) : -1)) + + const now = ref(props.generateConfig.getNow()) + const mergedDisabledHours = ref() + const mergedDisabledMinutes = ref() + const mergedDisabledSeconds = ref() + onBeforeUpdate(() => { + now.value = props.generateConfig.getNow() + }) + watchEffect(() => { + if (props.disabledTime) { + const disabledConfig = props.disabledTime(now) + ;[mergedDisabledHours.value, mergedDisabledMinutes.value, mergedDisabledSeconds.value] = [ + disabledConfig.disabledHours, + disabledConfig.disabledMinutes, + disabledConfig.disabledSeconds + ] + } else { + ;[mergedDisabledHours.value, mergedDisabledMinutes.value, mergedDisabledSeconds.value] = [ + props.disabledHours, + props.disabledMinutes, + props.disabledSeconds + ] + } + }) + const setTime = ( + isNewPM: boolean | undefined, + newHour: number, + newMinute: number, + newSecond: number + ) => { + let newDate = props.value || props.generateConfig.getNow() + + const mergedHour = Math.max(0, newHour) + const mergedMinute = Math.max(0, newMinute) + const mergedSecond = Math.max(0, newSecond) + + newDate = utilSetTime( + props.generateConfig, + newDate, + !props.use12Hours || !isNewPM ? mergedHour : mergedHour + 12, + mergedMinute, + mergedSecond + ) + + return newDate + } + + // ========================= Unit ========================= + const rawHours = computed(() => + generateUnits( + 0, + 23, + props.hourStep ?? 1, + mergedDisabledHours.value && mergedDisabledHours.value() + ) + ) + + // const memorizedRawHours = useMemo(() => rawHours, rawHours, shouldUnitsUpdate); + + const AMPMDisabled = computed(() => { + if (!props.use12Hours) { + return [false, false] + } + const AMPMDisabled = [true, true] + rawHours.value.forEach(({ disabled, value: hourValue }) => { + if (disabled) return + if (hourValue >= 12) { + AMPMDisabled[1] = false + } else { + AMPMDisabled[0] = false + } + }) + return AMPMDisabled + }) + + const hours = computed(() => { + if (!props.use12Hours) return rawHours.value + return rawHours.value + .filter(isPM.value ? (hourMeta) => hourMeta.value >= 12 : (hourMeta) => hourMeta.value < 12) + .map((hourMeta) => { + const hourValue = hourMeta.value % 12 + const hourLabel = hourValue === 0 ? '12' : leftPad(hourValue, 2) + return { + ...hourMeta, + label: hourLabel, + value: hourValue + } + }) + }) + + const minutes = computed(() => + generateUnits( + 0, + 59, + props.minuteStep ?? 1, + mergedDisabledMinutes.value && mergedDisabledMinutes.value(originHour.value) + ) + ) + + const seconds = computed(() => + generateUnits( + 0, + 59, + props.secondStep ?? 1, + mergedDisabledSeconds.value && mergedDisabledSeconds.value(originHour.value, minute) + ) + ) + + return () => { + const { + prefixCls, + operationRef, + activeColumnIndex, + showHour, + showMinute, + showSecond, + use12Hours, + hideDisabledOptions, + onSelect + } = props + const columns: { + node: VueNode + value: number + units: Unit[] + onSelect: (diff: number) => void + }[] = [] + const contentPrefixCls = `${prefixCls}-content` + const columnPrefixCls = `${prefixCls}-time-panel` + + // ====================== Operations ====================== + operationRef.value = { + onUpDown: (diff: number) => { + const column = columns[activeColumnIndex] + if (column) { + const valueIndex = column.units.findIndex((unit) => unit.value === column.value) + + const unitLen = column.units.length + for (let i = 1; i < unitLen; i += 1) { + const nextUnit = column.units[(valueIndex + diff * i + unitLen) % unitLen] + + if (nextUnit.disabled !== true) { + column.onSelect(nextUnit.value) + break + } + } + } + } + } + + // ======================== Render ======================== + function addColumnNode( + condition: boolean | undefined, + node: VueNode, + columnValue: number, + units: Unit[], + onColumnSelect: (diff: number) => void + ) { + if (condition !== false) { + columns.push({ + node: cloneElement(node as unknown as VNode, { + prefixCls: columnPrefixCls, + value: columnValue, + active: activeColumnIndex === columns.length, + onSelect: onColumnSelect, + units, + hideDisabledOptions + }), + onSelect: onColumnSelect, + value: columnValue, + units + }) + } + } + + // Hour + addColumnNode(showHour, , hour.value, hours.value, (num) => { + onSelect(setTime(isPM.value, num, minute.value, second.value), 'mouse') + }) + + // Minute + addColumnNode( + showMinute, + , + minute.value, + minutes.value, + (num) => { + onSelect(setTime(isPM.value, hour.value, num, second.value), 'mouse') + } + ) + + // Second + addColumnNode( + showSecond, + , + second.value, + seconds.value, + (num) => { + onSelect(setTime(isPM.value, hour.value, minute.value, num), 'mouse') + } + ) + + // 12 Hours + let PMIndex = -1 + PMIndex = isPM.value ? 1 : 0 + + addColumnNode( + use12Hours === true, + , + PMIndex, + [ + { label: 'AM', value: 0, disabled: AMPMDisabled.value[0] }, + { label: 'PM', value: 1, disabled: AMPMDisabled.value[1] } + ], + (num) => { + onSelect(setTime(!!num, hour.value, minute.value, second.value), 'mouse') + } + ) + + return
{columns.map(({ node }) => node)}
+ } + } +}) + +export default TimeBody diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/TimePanel/TimeHeader.tsx b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/TimePanel/TimeHeader.tsx new file mode 100644 index 0000000..977ef40 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/TimePanel/TimeHeader.tsx @@ -0,0 +1,42 @@ +import Header from '../Header'; +import type { Locale } from '../../interface'; +import type { GenerateConfig } from '../../generate'; +import { useInjectPanel } from '../../PanelContext'; +import { formatValue } from '../../utils/dateUtil'; +import useMergeProps from '../../hooks/useMergeProps'; + +export type TimeHeaderProps = { + prefixCls: string; + value?: DateType | null; + locale: Locale; + generateConfig: GenerateConfig; + format: string; +}; + +function TimeHeader(_props: TimeHeaderProps) { + const props = useMergeProps(_props); + const { hideHeader } = useInjectPanel(); + if (hideHeader.value) { + return null; + } + + const { prefixCls, generateConfig, locale, value, format } = props; + const headerPrefixCls = `${prefixCls}-header`; + + return ( +
+ {value + ? formatValue(value, { + locale, + format, + generateConfig, + }) + : '\u00A0'} +
+ ); +} + +TimeHeader.displayName = 'TimeHeader'; +TimeHeader.inheritAttrs = false; + +export default TimeHeader; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/TimePanel/TimeUnitColumn.tsx b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/TimePanel/TimeUnitColumn.tsx new file mode 100644 index 0000000..e51240b --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/TimePanel/TimeUnitColumn.tsx @@ -0,0 +1,102 @@ +import { scrollTo, waitElementReady } from '../../utils/uiUtil'; +import { useInjectPanel } from '../../PanelContext'; +import classNames from 'ant-design-vue/es/_util/classNames'; +import { ref, onBeforeUnmount, watch, defineComponent, nextTick } from 'vue'; + +export type Unit = { + label: any; + value: number; + disabled: boolean; +}; + +export type TimeUnitColumnProps = { + prefixCls?: string; + units?: Unit[]; + value?: number; + active?: boolean; + hideDisabledOptions?: boolean; + onSelect?: (value: number) => void; +}; + +export default defineComponent({ + name: 'TimeUnitColumn', + props: ['prefixCls', 'units', 'onSelect', 'value', 'active', 'hideDisabledOptions'] as any, + setup(props) { + const { open } = useInjectPanel(); + + const ulRef = ref(null); + const liRefs = ref>(new Map()); + const scrollRef = ref(); + + watch( + () => props.value, + () => { + const li = liRefs.value.get(props.value!); + if (li && open.value !== false) { + scrollTo(ulRef.value!, li.offsetTop, 120); + } + }, + ); + onBeforeUnmount(() => { + scrollRef.value?.(); + }); + + watch( + open, + () => { + scrollRef.value?.(); + nextTick(() => { + if (open.value) { + const li = liRefs.value.get(props.value!); + if (li) { + scrollRef.value = waitElementReady(li, () => { + scrollTo(ulRef.value!, li.offsetTop, 0); + }); + } + } + }); + }, + { immediate: true, flush: 'post' }, + ); + return () => { + const { prefixCls, units, onSelect, value, active, hideDisabledOptions } = props; + const cellPrefixCls = `${prefixCls}-cell`; + return ( +
    + {units!.map(unit => { + if (hideDisabledOptions && unit.disabled) { + return null; + } + + return ( +
  • { + liRefs.value.set(unit.value, element as HTMLElement); + }} + class={classNames(cellPrefixCls, { + [`${cellPrefixCls}-disabled`]: unit.disabled, + [`${cellPrefixCls}-selected`]: value === unit.value, + })} + onClick={() => { + if (unit.disabled) { + return; + } + onSelect!(unit.value); + }} + > +
    {unit.label}
    +
  • + ); + })} +
+ ); + }; + }, +}); diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/TimePanel/index.tsx b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/TimePanel/index.tsx new file mode 100644 index 0000000..1bfba73 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/TimePanel/index.tsx @@ -0,0 +1,109 @@ +import TimeHeader from './TimeHeader'; +import type { BodyOperationRef } from './TimeBody'; +import TimeBody from './TimeBody'; +import type { PanelSharedProps, DisabledTimes } from '../../interface'; +import { createKeydownHandler } from '../../utils/uiUtil'; +import classNames from 'ant-design-vue/es/_util/classNames'; +import { ref } from 'vue'; +import useMergeProps from '../../hooks/useMergeProps'; +// import type { RangeType } from '../../RangePicker'; + +export type SharedTimeProps = { + format?: string; + showNow?: boolean; + showHour?: boolean; + showMinute?: boolean; + showSecond?: boolean; + use12Hours?: boolean; + hourStep?: number; + minuteStep?: number; + secondStep?: number; + hideDisabledOptions?: boolean; + defaultValue?: DateType; + + /** @deprecated Please use `disabledTime` instead. */ + disabledHours?: DisabledTimes['disabledHours']; + /** @deprecated Please use `disabledTime` instead. */ + disabledMinutes?: DisabledTimes['disabledMinutes']; + /** @deprecated Please use `disabledTime` instead. */ + disabledSeconds?: DisabledTimes['disabledSeconds']; + + disabledTime?: (date: DateType) => DisabledTimes; +}; + +export type TimePanelProps = { + format?: string; + active?: boolean; +} & PanelSharedProps & + SharedTimeProps; + +const countBoolean = (boolList: (boolean | undefined)[]) => + boolList.filter(bool => bool !== false).length; + +function TimePanel(_props: TimePanelProps) { + const props = useMergeProps(_props); + const { + generateConfig, + format = 'HH:mm:ss', + prefixCls, + active, + operationRef, + showHour, + showMinute, + showSecond, + use12Hours = false, + onSelect, + value, + } = props; + const panelPrefixCls = `${prefixCls}-time-panel`; + const bodyOperationRef = ref(); + + // ======================= Keyboard ======================= + const activeColumnIndex = ref(-1); + const columnsCount = countBoolean([showHour, showMinute, showSecond, use12Hours]); + + operationRef.value = { + onKeydown: (event: KeyboardEvent) => + createKeydownHandler(event, { + onLeftRight: diff => { + activeColumnIndex.value = (activeColumnIndex.value + diff + columnsCount) % columnsCount; + }, + onUpDown: diff => { + if (activeColumnIndex.value === -1) { + activeColumnIndex.value = 0; + } else if (bodyOperationRef.value) { + bodyOperationRef.value.onUpDown(diff); + } + }, + onEnter: () => { + onSelect(value || generateConfig.getNow(), 'key'); + activeColumnIndex.value = -1; + }, + }), + + onBlur: () => { + activeColumnIndex.value = -1; + }, + }; + + return ( +
+ + +
+ ); +} + +TimePanel.displayName = 'TimePanel'; +TimePanel.inheritAttrs = false; + +export default TimePanel; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/WeekPanel/index.tsx b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/WeekPanel/index.tsx new file mode 100644 index 0000000..2eabc56 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/WeekPanel/index.tsx @@ -0,0 +1,44 @@ +import DatePanel from '../DatePanel'; +import type { PanelSharedProps } from '../../interface'; +import { isSameWeek } from '../../utils/dateUtil'; +import classNames from 'ant-design-vue/es/_util/classNames'; +import useMergeProps from '../../hooks/useMergeProps'; + +export type WeekPanelProps = PanelSharedProps; + +function WeekPanel(_props: WeekPanelProps) { + const props = useMergeProps(_props); + const { prefixCls, generateConfig, locale, value } = props; + + // Render additional column + const cellPrefixCls = `${prefixCls}-cell`; + const prefixColumn = (date: DateType) => ( + + {generateConfig.locale.getWeek(locale.locale, date)} + + ); + + // Add row className + const rowPrefixCls = `${prefixCls}-week-panel-row`; + const rowClassName = (date: DateType) => + classNames(rowPrefixCls, { + [`${rowPrefixCls}-selected`]: isSameWeek(generateConfig, locale.locale, value, date), + }); + + return ( + + ); +} + +WeekPanel.displayName = 'WeekPanel'; +WeekPanel.inheritAttrs = false; + +export default WeekPanel; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/YearPanel/YearBody.tsx b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/YearPanel/YearBody.tsx new file mode 100644 index 0000000..06d97a7 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/YearPanel/YearBody.tsx @@ -0,0 +1,78 @@ +import type { GenerateConfig } from '../../generate' +import { YEAR_DECADE_COUNT } from './index' +import type { Locale, NullableDateType } from '../../interface' +import useCellClassName from '../../hooks/useCellClassName' +import { formatValue, isSameYear } from '../../utils/dateUtil' +import { useInjectRange } from '../../RangeContext' +import PanelBody from '../PanelBody' +import useMergeProps from '../../hooks/useMergeProps' + +export const YEAR_COL_COUNT = 3 +const YEAR_ROW_COUNT = 4 + +export type YearBodyProps = { + prefixCls: string + locale: Locale + generateConfig: GenerateConfig + value?: NullableDateType + viewDate: DateType + disabledDate?: (date: DateType) => boolean + onSelect: (value: DateType) => void +} + +function YearBody(_props: YearBodyProps) { + const props = useMergeProps(_props) + const { prefixCls, value, viewDate, locale, generateConfig } = props + const { rangedValue, hoverRangedValue } = useInjectRange() + + const yearPrefixCls = `${prefixCls}-cell` + + // =============================== Year =============================== + const yearNumber = generateConfig.getYear(viewDate) + const startYear = Math.floor(yearNumber / YEAR_DECADE_COUNT) * YEAR_DECADE_COUNT + const endYear = startYear + YEAR_DECADE_COUNT - 1 + const baseYear = generateConfig.setYear( + viewDate, + startYear - Math.ceil((YEAR_COL_COUNT * YEAR_ROW_COUNT - YEAR_DECADE_COUNT) / 2) + ) + + const isInView = (date: DateType) => { + const currentYearNumber = generateConfig.getYear(date) + return startYear <= currentYearNumber && currentYearNumber <= endYear + } + + const getCellClassName = useCellClassName({ + cellPrefixCls: yearPrefixCls, + value, + generateConfig, + rangedValue: rangedValue.value, + hoverRangedValue: hoverRangedValue.value, + isSameCell: (current, target) => isSameYear(generateConfig, current, target), + isInView, + offsetCell: (date, offset) => generateConfig.addYear(date, offset) + }) + + return ( + + formatValue(date, { + locale, + format: 'YYYY', + generateConfig + }) + } + /> + ) +} + +YearBody.displayName = 'YearBody' +YearBody.inheritAttrs = false + +export default YearBody diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/YearPanel/YearHeader.tsx b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/YearPanel/YearHeader.tsx new file mode 100644 index 0000000..a4dbda6 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/YearPanel/YearHeader.tsx @@ -0,0 +1,50 @@ +import Header from '../Header' +import type { GenerateConfig } from '../../generate' +import { YEAR_DECADE_COUNT } from './index' + +import { useInjectPanel } from '../../PanelContext' +import useMergeProps from '../../hooks/useMergeProps' + +export type YearHeaderProps = { + prefixCls: string + viewDate: DateType + value?: DateType | null + generateConfig: GenerateConfig + + onPrevDecade: () => void + onNextDecade: () => void + onDecadeClick: () => void +} + +function YearHeader(_props: YearHeaderProps) { + const props = useMergeProps(_props) + const { prefixCls, generateConfig, viewDate, onPrevDecade, onNextDecade, onDecadeClick } = props + const { hideHeader } = useInjectPanel() + if (hideHeader?.value) { + return null + } + + const headerPrefixCls = `${prefixCls}-header` + + const yearNumber = generateConfig.getYear(viewDate) + const startYear = Math.floor(yearNumber / YEAR_DECADE_COUNT) * YEAR_DECADE_COUNT + const endYear = startYear + YEAR_DECADE_COUNT - 1 + + return ( +
+ +
+ ) +} + +YearHeader.displayName = 'YearHeader' +YearHeader.inheritAttrs = false + +export default YearHeader diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/YearPanel/index.tsx b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/YearPanel/index.tsx new file mode 100644 index 0000000..7a43bc8 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/panels/YearPanel/index.tsx @@ -0,0 +1,85 @@ +import YearHeader from './YearHeader'; +import YearBody, { YEAR_COL_COUNT } from './YearBody'; +import type { PanelSharedProps, PanelMode } from '../../interface'; +import { createKeydownHandler } from '../../utils/uiUtil'; +import useMergeProps from '../../hooks/useMergeProps'; + +export type YearPanelProps = { + sourceMode: PanelMode; +} & PanelSharedProps; + +export const YEAR_DECADE_COUNT = 10; + +function YearPanel(_props: YearPanelProps) { + const props = useMergeProps(_props); + const { + prefixCls, + operationRef, + onViewDateChange, + generateConfig, + value, + viewDate, + sourceMode, + onSelect, + onPanelChange, + } = props; + + const panelPrefixCls = `${prefixCls}-year-panel`; + + // ======================= Keyboard ======================= + operationRef.value = { + onKeydown: (event: KeyboardEvent) => + createKeydownHandler(event, { + onLeftRight: diff => { + onSelect(generateConfig.addYear(value || viewDate, diff), 'key'); + }, + onCtrlLeftRight: diff => { + onSelect(generateConfig.addYear(value || viewDate, diff * YEAR_DECADE_COUNT), 'key'); + }, + onUpDown: diff => { + onSelect(generateConfig.addYear(value || viewDate, diff * YEAR_COL_COUNT), 'key'); + }, + onEnter: () => { + onPanelChange(sourceMode === 'date' ? 'date' : 'month', value || viewDate); + }, + }), + }; + + // ==================== View Operation ==================== + const onDecadeChange = (diff: number) => { + const newDate = generateConfig.addYear(viewDate, diff * 10); + onViewDateChange(newDate); + onPanelChange(null, newDate); + }; + + return ( +
+ { + onDecadeChange(-1); + }} + onNextDecade={() => { + onDecadeChange(1); + }} + onDecadeClick={() => { + onPanelChange('decade', viewDate); + }} + /> + { + onPanelChange(sourceMode === 'date' ? 'date' : 'month', date); + onSelect(date, 'mouse'); + }} + /> +
+ ); +} + +YearPanel.displayName = 'YearPanel'; +YearPanel.inheritAttrs = false; + +export default YearPanel; diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/utils/dateUtil.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/utils/dateUtil.ts new file mode 100644 index 0000000..b127977 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/utils/dateUtil.ts @@ -0,0 +1,320 @@ +import { DECADE_UNIT_DIFF } from '../panels/DecadePanel' +import type { PanelMode, NullableDateType, PickerMode, Locale, CustomFormat } from '../interface' +import type { GenerateConfig } from '../generate' + +export const WEEK_DAY_COUNT = 7 + +export function isNullEqual(value1: T, value2: T): boolean | undefined { + if (!value1 && !value2) { + return true + } + if (!value1 || !value2) { + return false + } + return undefined +} + +export function isSameDecade( + generateConfig: GenerateConfig, + decade1: NullableDateType, + decade2: NullableDateType +) { + const equal = isNullEqual(decade1, decade2) + if (typeof equal === 'boolean') { + return equal + } + + const num1 = Math.floor(generateConfig.getYear(decade1!) / 10) + const num2 = Math.floor(generateConfig.getYear(decade2!) / 10) + return num1 === num2 +} + +export function isSameYear( + generateConfig: GenerateConfig, + year1: NullableDateType, + year2: NullableDateType +) { + const equal = isNullEqual(year1, year2) + if (typeof equal === 'boolean') { + return equal + } + + return generateConfig.getYear(year1!) === generateConfig.getYear(year2!) +} + +export function getQuarter(generateConfig: GenerateConfig, date: DateType) { + const quota = Math.floor(generateConfig.getMonth(date) / 3) + return quota + 1 +} + +export function isSameQuarter( + generateConfig: GenerateConfig, + quarter1: NullableDateType, + quarter2: NullableDateType +) { + const equal = isNullEqual(quarter1, quarter2) + if (typeof equal === 'boolean') { + return equal + } + + return ( + isSameYear(generateConfig, quarter1, quarter2) && + getQuarter(generateConfig, quarter1!) === getQuarter(generateConfig, quarter2!) + ) +} + +export function isSameMonth( + generateConfig: GenerateConfig, + month1: NullableDateType, + month2: NullableDateType +) { + const equal = isNullEqual(month1, month2) + if (typeof equal === 'boolean') { + return equal + } + + return ( + isSameYear(generateConfig, month1, month2) && + generateConfig.getMonth(month1!) === generateConfig.getMonth(month2!) + ) +} + +export function isSameDate( + generateConfig: GenerateConfig, + date1: NullableDateType, + date2: NullableDateType +) { + const equal = isNullEqual(date1, date2) + if (typeof equal === 'boolean') { + return equal + } + + return ( + generateConfig.getYear(date1!) === generateConfig.getYear(date2!) && + generateConfig.getMonth(date1!) === generateConfig.getMonth(date2!) && + generateConfig.getDate(date1!) === generateConfig.getDate(date2!) + ) +} + +export function isSameTime( + generateConfig: GenerateConfig, + time1: NullableDateType, + time2: NullableDateType +) { + const equal = isNullEqual(time1, time2) + if (typeof equal === 'boolean') { + return equal + } + + return ( + generateConfig.getHour(time1!) === generateConfig.getHour(time2!) && + generateConfig.getMinute(time1!) === generateConfig.getMinute(time2!) && + generateConfig.getSecond(time1!) === generateConfig.getSecond(time2!) + ) +} + +export function isSameWeek( + generateConfig: GenerateConfig, + locale: string, + date1: NullableDateType, + date2: NullableDateType +) { + const equal = isNullEqual(date1, date2) + if (typeof equal === 'boolean') { + return equal + } + + return ( + generateConfig.locale.getWeek(locale, date1!) === generateConfig.locale.getWeek(locale, date2!) + ) +} + +export function isEqual( + generateConfig: GenerateConfig, + value1: NullableDateType, + value2: NullableDateType +) { + return isSameDate(generateConfig, value1, value2) && isSameTime(generateConfig, value1, value2) +} + +/** Between in date but not equal of date */ +export function isInRange( + generateConfig: GenerateConfig, + startDate: NullableDateType, + endDate: NullableDateType, + current: NullableDateType +) { + if (!startDate || !endDate || !current) { + return false + } + + return ( + !isSameDate(generateConfig, startDate, current) && + !isSameDate(generateConfig, endDate, current) && + generateConfig.isAfter(current, startDate) && + generateConfig.isAfter(endDate, current) + ) +} + +export function getWeekStartDate( + locale: string, + generateConfig: GenerateConfig, + value: DateType +) { + const weekFirstDay = generateConfig.locale.getWeekFirstDay(locale) + const monthStartDate = generateConfig.setDate(value, 1) + const startDateWeekDay = generateConfig.getWeekDay(monthStartDate) + + let alignStartDate = generateConfig.addDate(monthStartDate, weekFirstDay - startDateWeekDay) + + if ( + generateConfig.getMonth(alignStartDate) === generateConfig.getMonth(value) && + generateConfig.getDate(alignStartDate) > 1 + ) { + alignStartDate = generateConfig.addDate(alignStartDate, -7) + } + return alignStartDate +} + +export function getClosingViewDate( + viewDate: DateType, + picker: PickerMode, + generateConfig: GenerateConfig, + offset = 1 +): DateType { + switch (picker) { + case 'year': + return generateConfig.addYear(viewDate, offset * 10) + case 'quarter': + case 'month': + return generateConfig.addYear(viewDate, offset) + default: + return generateConfig.addMonth(viewDate, offset) + } +} + +export function formatValue( + value: DateType, + { + generateConfig, + locale, + format + }: { + generateConfig: GenerateConfig + locale: Locale + format: string | CustomFormat + } +) { + return typeof format === 'function' + ? format(value) + : generateConfig.locale.format(locale.locale, value, format) +} + +export function parseValue( + value: string, + { + generateConfig, + locale, + formatList + }: { + generateConfig: GenerateConfig + locale: Locale + formatList: (string | CustomFormat)[] + } +) { + if (!value || typeof formatList[0] === 'function') { + return null + } + + return generateConfig.locale.parse(locale.locale, value, formatList as string[]) +} + +// eslint-disable-next-line consistent-return +export function getCellDateDisabled({ + cellDate, + mode, + disabledDate, + generateConfig +}: { + cellDate: DateType + mode: Omit + generateConfig: GenerateConfig + disabledDate?: (date: DateType) => boolean +}): boolean { + if (!disabledDate) return false + // Whether cellDate is disabled in range + const getDisabledFromRange = ( + currentMode: 'date' | 'month' | 'year', + start: number, + end: number + ) => { + let current = start + while (current <= end) { + let date: DateType + switch (currentMode) { + case 'date': { + date = generateConfig.setDate(cellDate, current) + if (!disabledDate(date)) { + return false + } + break + } + case 'month': { + date = generateConfig.setMonth(cellDate, current) + if ( + !getCellDateDisabled({ + cellDate: date, + mode: 'month', + generateConfig, + disabledDate + }) + ) { + return false + } + break + } + case 'year': { + date = generateConfig.setYear(cellDate, current) + if ( + !getCellDateDisabled({ + cellDate: date, + mode: 'year', + generateConfig, + disabledDate + }) + ) { + return false + } + break + } + } + current += 1 + } + return true + } + switch (mode) { + case 'date': + case 'week': { + return disabledDate(cellDate) + } + case 'month': { + const startDate = 1 + const endDate = generateConfig.getDate(generateConfig.getEndDate(cellDate)) + return getDisabledFromRange('date', startDate, endDate) + } + case 'quarter': { + const startMonth = Math.floor(generateConfig.getMonth(cellDate) / 3) * 3 + const endMonth = startMonth + 2 + return getDisabledFromRange('month', startMonth, endMonth) + } + case 'year': { + return getDisabledFromRange('month', 0, 11) + } + case 'decade': { + const year = generateConfig.getYear(cellDate) + const startYear = Math.floor(year / DECADE_UNIT_DIFF) * DECADE_UNIT_DIFF + const endYear = startYear + DECADE_UNIT_DIFF - 1 + return getDisabledFromRange('year', startYear, endYear) + } + } +} diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/utils/getExtraFooter.tsx b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/utils/getExtraFooter.tsx new file mode 100644 index 0000000..b536ade --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/utils/getExtraFooter.tsx @@ -0,0 +1,13 @@ +import type { PanelMode } from '../interface'; + +export default function getExtraFooter( + prefixCls: string, + mode: PanelMode, + renderExtraFooter?: (mode: PanelMode) => any, +) { + if (!renderExtraFooter) { + return null; + } + + return ; +} diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/utils/getRanges.tsx b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/utils/getRanges.tsx new file mode 100644 index 0000000..4412cfd --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/utils/getRanges.tsx @@ -0,0 +1,78 @@ +import type { VueNode } from 'ant-design-vue/es/_util/type'; +import type { Components, RangeList, Locale } from '../interface'; + +export type RangesProps = { + prefixCls: string; + rangeList?: RangeList; + components?: Components; + needConfirmButton: boolean; + onNow?: null | (() => void) | false; + onOk?: null | (() => void) | false; + okDisabled?: boolean; + showNow?: boolean; + locale: Locale; +}; + +export default function getRanges({ + prefixCls, + rangeList = [], + components = {}, + needConfirmButton, + onNow, + onOk, + okDisabled, + showNow, + locale, +}: RangesProps) { + let presetNode: VueNode; + let okNode: VueNode; + + if (rangeList.length) { + const Item = (components.rangeItem || 'span') as any; + + presetNode = ( + <> + {rangeList.map(({ label, onClick, onMouseenter, onMouseleave }) => ( +
  • + + {label} + +
  • + ))} + + ); + } + + if (needConfirmButton) { + const Button = (components.button || 'button') as any; + + if (onNow && !presetNode && showNow !== false) { + presetNode = ( +
  • + + {locale.now} + +
  • + ); + } + + okNode = needConfirmButton && ( +
  • + +
  • + ); + } + + if (!presetNode && !okNode) { + return null; + } + + return ( +
      + {presetNode} + {okNode} +
    + ); +} diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/utils/miscUtil.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/utils/miscUtil.ts new file mode 100644 index 0000000..4ba6c67 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/utils/miscUtil.ts @@ -0,0 +1,58 @@ +export function leftPad(str: string | number, length: number, fill = '0') { + let current = String(str); + while (current.length < length) { + current = `${fill}${str}`; + } + return current; +} + +export const tuple = (...args: T) => args; + +export function toArray(val: T | T[]): T[] { + if (val === null || val === undefined) { + return []; + } + + return Array.isArray(val) ? val : [val]; +} + +export default function getDataOrAriaProps(props: any) { + const retProps: any = {}; + + Object.keys(props).forEach(key => { + if ( + (key.substr(0, 5) === 'data-' || + key.substr(0, 5) === 'aria-' || + key === 'role' || + key === 'name') && + key.substr(0, 7) !== 'data-__' + ) { + retProps[key] = props[key]; + } + }); + + return retProps; +} + +export function getValue(values: null | undefined | (T | null)[], index: number): T | null { + return values ? values[index] : null; +} + +type UpdateValue = (prev: T) => T; + +export function updateValues( + values: [T | null, T | null] | null, + value: T | UpdateValue, + index: number, +): R { + const newValues: [T | null, T | null] = [getValue(values, 0), getValue(values, 1)]; + + newValues[index] = + typeof value === 'function' ? (value as UpdateValue)(newValues[index]) : value; + + if (!newValues[0] && !newValues[1]) { + return null as unknown as R; + } + + return newValues as unknown as R; +} diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/utils/timeUtil.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/utils/timeUtil.ts new file mode 100644 index 0000000..f666723 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/utils/timeUtil.ts @@ -0,0 +1,60 @@ +import type { NullableDateType } from '../interface'; +import type { GenerateConfig } from '../generate'; + +export function setTime( + generateConfig: GenerateConfig, + date: DateType, + hour: number, + minute: number, + second: number, +): DateType { + let nextTime = generateConfig.setHour(date, hour); + nextTime = generateConfig.setMinute(nextTime, minute); + nextTime = generateConfig.setSecond(nextTime, second); + return nextTime; +} + +export function setDateTime( + generateConfig: GenerateConfig, + date: DateType, + defaultDate: NullableDateType, +) { + if (!defaultDate) { + return date; + } + + let newDate = date; + newDate = generateConfig.setHour(newDate, generateConfig.getHour(defaultDate)); + newDate = generateConfig.setMinute(newDate, generateConfig.getMinute(defaultDate)); + newDate = generateConfig.setSecond(newDate, generateConfig.getSecond(defaultDate)); + return newDate; +} + +export function getLowerBoundTime( + hour: number, + minute: number, + second: number, + hourStep: number, + minuteStep: number, + secondStep: number, +): [number, number, number] { + const lowerBoundHour = Math.floor(hour / hourStep) * hourStep; + if (lowerBoundHour < hour) { + return [lowerBoundHour, 60 - minuteStep, 60 - secondStep]; + } + const lowerBoundMinute = Math.floor(minute / minuteStep) * minuteStep; + if (lowerBoundMinute < minute) { + return [lowerBoundHour, lowerBoundMinute, 60 - secondStep]; + } + const lowerBoundSecond = Math.floor(second / secondStep) * secondStep; + return [lowerBoundHour, lowerBoundMinute, lowerBoundSecond]; +} + +export function getLastDay(generateConfig: GenerateConfig, date: DateType) { + const year = generateConfig.getYear(date); + const month = generateConfig.getMonth(date) + 1; + const endDate = generateConfig.getEndDate(generateConfig.getFixedDate(`${year}-${month}-01`)); + const lastDay = generateConfig.getDate(endDate); + const monthShow = month < 10 ? `0${month}` : `${month}`; + return `${year}-${monthShow}-${lastDay}`; +} diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/utils/uiUtil.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/utils/uiUtil.ts new file mode 100644 index 0000000..34605dd --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/utils/uiUtil.ts @@ -0,0 +1,279 @@ +import isVisible from 'ant-design-vue/es/vc-util/Dom/isVisible'; +import KeyCode from 'ant-design-vue/es/_util/KeyCode'; +import raf from 'ant-design-vue/es/_util/raf'; +import type { GenerateConfig } from '../generate'; +import type { CustomFormat, PanelMode, PickerMode } from '../interface'; + +const scrollIds = new Map(); + +/** Trigger when element is visible in view */ +export function waitElementReady(element: HTMLElement, callback: () => void): () => void { + let id: number; + + function tryOrNextFrame() { + if (isVisible(element)) { + callback(); + } else { + id = raf(() => { + tryOrNextFrame(); + }); + } + } + + tryOrNextFrame(); + + return () => { + raf.cancel(id); + }; +} + +/* eslint-disable no-param-reassign */ +export function scrollTo(element: HTMLElement, to: number, duration: number) { + if (scrollIds.get(element)) { + raf.cancel(scrollIds.get(element)!); + } + + // jump to target if duration zero + if (duration <= 0) { + scrollIds.set( + element, + raf(() => { + element.scrollTop = to; + }), + ); + + return; + } + const difference = to - element.scrollTop; + const perTick = (difference / duration) * 10; + + scrollIds.set( + element, + raf(() => { + element.scrollTop += perTick; + if (element.scrollTop !== to) { + scrollTo(element, to, duration - 10); + } + }), + ); +} +/* eslint-enable */ + +export type KeyboardConfig = { + onLeftRight?: ((diff: number) => void) | null; + onCtrlLeftRight?: ((diff: number) => void) | null; + onUpDown?: ((diff: number) => void) | null; + onPageUpDown?: ((diff: number) => void) | null; + onEnter?: (() => void) | null; +}; +export function createKeydownHandler( + event: KeyboardEvent, + { onLeftRight, onCtrlLeftRight, onUpDown, onPageUpDown, onEnter }: KeyboardConfig, +): boolean { + const { which, ctrlKey, metaKey } = event; + + switch (which) { + case KeyCode.LEFT: + if (ctrlKey || metaKey) { + if (onCtrlLeftRight) { + onCtrlLeftRight(-1); + return true; + } + } else if (onLeftRight) { + onLeftRight(-1); + return true; + } + /* istanbul ignore next */ + break; + + case KeyCode.RIGHT: + if (ctrlKey || metaKey) { + if (onCtrlLeftRight) { + onCtrlLeftRight(1); + return true; + } + } else if (onLeftRight) { + onLeftRight(1); + return true; + } + /* istanbul ignore next */ + break; + + case KeyCode.UP: + if (onUpDown) { + onUpDown(-1); + return true; + } + /* istanbul ignore next */ + break; + + case KeyCode.DOWN: + if (onUpDown) { + onUpDown(1); + return true; + } + /* istanbul ignore next */ + break; + + case KeyCode.PAGE_UP: + if (onPageUpDown) { + onPageUpDown(-1); + return true; + } + /* istanbul ignore next */ + break; + + case KeyCode.PAGE_DOWN: + if (onPageUpDown) { + onPageUpDown(1); + return true; + } + /* istanbul ignore next */ + break; + + case KeyCode.ENTER: + if (onEnter) { + onEnter(); + return true; + } + /* istanbul ignore next */ + break; + } + + return false; +} + +// ===================== Format ===================== +export function getDefaultFormat( + format: string | CustomFormat | (string | CustomFormat)[] | undefined, + picker: PickerMode | undefined, + showTime: boolean | object | undefined, + use12Hours: boolean | undefined, +) { + let mergedFormat = format; + if (!mergedFormat) { + switch (picker) { + case 'time': + mergedFormat = use12Hours ? 'hh:mm:ss a' : 'HH:mm:ss'; + break; + + case 'week': + mergedFormat = 'gggg-wo'; + break; + + case 'month': + mergedFormat = 'YYYY-MM'; + break; + + case 'quarter': + mergedFormat = 'YYYY-[Q]Q'; + break; + + case 'year': + mergedFormat = 'YYYY'; + break; + + default: + mergedFormat = showTime ? 'YYYY-MM-DD HH:mm:ss' : 'YYYY-MM-DD'; + } + } + + return mergedFormat; +} + +export function getInputSize( + picker: PickerMode | undefined, + format: string | CustomFormat, + generateConfig: GenerateConfig, +) { + const defaultSize = picker === 'time' ? 8 : 10; + const length = + typeof format === 'function' ? format(generateConfig.getNow()).length : format.length; + return Math.max(defaultSize, length) + 2; +} + +// ===================== Window ===================== +type ClickEventHandler = (event: MouseEvent) => void; +let globalClickFunc: ClickEventHandler | null = null; +const clickCallbacks = new Set(); + +export function addGlobalMousedownEvent(callback: ClickEventHandler) { + if (!globalClickFunc && typeof window !== 'undefined' && window.addEventListener) { + globalClickFunc = (e: MouseEvent) => { + // Clone a new list to avoid repeat trigger events + [...clickCallbacks].forEach(queueFunc => { + queueFunc(e); + }); + }; + window.addEventListener('mousedown', globalClickFunc); + } + + clickCallbacks.add(callback); + + return () => { + clickCallbacks.delete(callback); + if (clickCallbacks.size === 0) { + window.removeEventListener('mousedown', globalClickFunc!); + globalClickFunc = null; + } + }; +} + +export function getTargetFromEvent(e: Event) { + const target = e.target as HTMLElement; + + // get target if in shadow dom + if (e.composed && target.shadowRoot) { + return (e.composedPath?.()[0] || target) as HTMLElement; + } + + return target; +} + +// ====================== Mode ====================== +const getYearNextMode = (next: PanelMode): PanelMode => { + if (next === 'month' || next === 'date') { + return 'year'; + } + return next; +}; + +const getMonthNextMode = (next: PanelMode): PanelMode => { + if (next === 'date') { + return 'month'; + } + return next; +}; + +const getQuarterNextMode = (next: PanelMode): PanelMode => { + if (next === 'month' || next === 'date') { + return 'quarter'; + } + return next; +}; + +const getWeekNextMode = (next: PanelMode): PanelMode => { + if (next === 'date') { + return 'week'; + } + return next; +}; + +export const PickerModeMap: Record PanelMode) | null> = { + year: getYearNextMode, + month: getMonthNextMode, + quarter: getQuarterNextMode, + week: getWeekNextMode, + time: null, + date: null, +}; + +export function elementsContains( + elements: (HTMLElement | undefined | null)[], + target: HTMLElement, +) { + if (process.env.NODE_ENV === 'test') { + return false; + } + return elements.some(ele => ele && ele.contains(target)); +} diff --git a/src/components/BasicPacks/BaseDatePicker/src/vc-picker/utils/warnUtil.ts b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/utils/warnUtil.ts new file mode 100644 index 0000000..b725ab2 --- /dev/null +++ b/src/components/BasicPacks/BaseDatePicker/src/vc-picker/utils/warnUtil.ts @@ -0,0 +1,17 @@ +import { warning } from 'ant-design-vue/es/vc-util/warning'; +import type { DisabledTimes, PickerMode } from '../interface'; + +export interface WarningProps extends DisabledTimes { + picker?: PickerMode; +} + +export function legacyPropsWarning(props: WarningProps) { + const { picker, disabledHours, disabledMinutes, disabledSeconds } = props; + + if (picker === 'time' && (disabledHours || disabledMinutes || disabledSeconds)) { + warning( + false, + `'disabledHours', 'disabledMinutes', 'disabledSeconds' will be removed in the next major version, please use 'disabledTime' instead.`, + ); + } +} diff --git a/src/components/BasicPacks/BasicActionSheet.vue b/src/components/BasicPacks/BasicActionSheet.vue new file mode 100644 index 0000000..440b49c --- /dev/null +++ b/src/components/BasicPacks/BasicActionSheet.vue @@ -0,0 +1,74 @@ + + + + + + diff --git a/src/components/BasicPacks/BasicButton.vue b/src/components/BasicPacks/BasicButton.vue new file mode 100644 index 0000000..9fd61ae --- /dev/null +++ b/src/components/BasicPacks/BasicButton.vue @@ -0,0 +1,66 @@ + + + + + diff --git a/src/components/BasicPacks/BasicIcon.vue b/src/components/BasicPacks/BasicIcon.vue new file mode 100644 index 0000000..1d1c291 --- /dev/null +++ b/src/components/BasicPacks/BasicIcon.vue @@ -0,0 +1,53 @@ + + + + + + diff --git a/src/components/BasicPacks/BasicInfoItem.vue b/src/components/BasicPacks/BasicInfoItem.vue new file mode 100644 index 0000000..f30d414 --- /dev/null +++ b/src/components/BasicPacks/BasicInfoItem.vue @@ -0,0 +1,48 @@ + + + + + \ No newline at end of file diff --git a/src/components/BasicPacks/BasicInput.vue b/src/components/BasicPacks/BasicInput.vue new file mode 100644 index 0000000..95db065 --- /dev/null +++ b/src/components/BasicPacks/BasicInput.vue @@ -0,0 +1,116 @@ + + + + + diff --git a/src/components/BasicPacks/BasicModal.vue b/src/components/BasicPacks/BasicModal.vue new file mode 100644 index 0000000..f83cea3 --- /dev/null +++ b/src/components/BasicPacks/BasicModal.vue @@ -0,0 +1,69 @@ + + + + + diff --git a/src/components/BasicPacks/BasicPriceInput/index.ts b/src/components/BasicPacks/BasicPriceInput/index.ts new file mode 100644 index 0000000..6463795 --- /dev/null +++ b/src/components/BasicPacks/BasicPriceInput/index.ts @@ -0,0 +1,3 @@ +import BasicPriceInput from './src/BasicPriceInput.vue' + +export default BasicPriceInput diff --git a/src/components/BasicPacks/BasicPriceInput/src/BasicPriceInput.vue b/src/components/BasicPacks/BasicPriceInput/src/BasicPriceInput.vue new file mode 100644 index 0000000..e722116 --- /dev/null +++ b/src/components/BasicPacks/BasicPriceInput/src/BasicPriceInput.vue @@ -0,0 +1,36 @@ + + + + + diff --git a/src/components/BasicPacks/BasicPriceInput/src/utils/usePrice.ts b/src/components/BasicPacks/BasicPriceInput/src/utils/usePrice.ts new file mode 100644 index 0000000..4e89d78 --- /dev/null +++ b/src/components/BasicPacks/BasicPriceInput/src/utils/usePrice.ts @@ -0,0 +1,17 @@ +export function usePrice(price: number, digit = true, unit = 'ریال') { + let _price = price.toString() + if (digit) { + _price = _price.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',') + } + return `${_price} ${unit}` +} + +export function useTowDecimal(num: string | number): string | number { + const temp = num.toString().match(/^-?\d+(?:\.\d{0,2})?/) + if (temp && temp.length > 0) return temp[0] + return Math.round(+num * 100) / 100 +} + +export function useFormat(num: string | number, unit = '') { + return usePrice(Math.abs(+useTowDecimal(num)), true, unit) +} diff --git a/src/components/BasicPacks/BasicSelect.vue b/src/components/BasicPacks/BasicSelect.vue new file mode 100644 index 0000000..65cf45c --- /dev/null +++ b/src/components/BasicPacks/BasicSelect.vue @@ -0,0 +1,113 @@ + + + + + diff --git a/src/components/BasicPacks/BasicTags/index.vue b/src/components/BasicPacks/BasicTags/index.vue new file mode 100644 index 0000000..3418fed --- /dev/null +++ b/src/components/BasicPacks/BasicTags/index.vue @@ -0,0 +1,66 @@ + + + + + diff --git a/src/components/BasicPacks/BasicTags/model/index.ts b/src/components/BasicPacks/BasicTags/model/index.ts new file mode 100644 index 0000000..fcb32a0 --- /dev/null +++ b/src/components/BasicPacks/BasicTags/model/index.ts @@ -0,0 +1,4 @@ +export interface TagItem { + id: number | undefined + name: string | undefined +} diff --git a/src/components/BasicPacks/BasicTextArea.vue b/src/components/BasicPacks/BasicTextArea.vue new file mode 100644 index 0000000..c572baf --- /dev/null +++ b/src/components/BasicPacks/BasicTextArea.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/src/components/BasicPacks/BasicToggleTwoItem.vue b/src/components/BasicPacks/BasicToggleTwoItem.vue new file mode 100644 index 0000000..96c0baf --- /dev/null +++ b/src/components/BasicPacks/BasicToggleTwoItem.vue @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/src/components/BasicPacks/BasicUploads/BasicDraggableFileUpload.vue b/src/components/BasicPacks/BasicUploads/BasicDraggableFileUpload.vue new file mode 100644 index 0000000..331f399 --- /dev/null +++ b/src/components/BasicPacks/BasicUploads/BasicDraggableFileUpload.vue @@ -0,0 +1,69 @@ + + + + + diff --git a/src/components/BasicPacks/BasicUploads/model/index.ts b/src/components/BasicPacks/BasicUploads/model/index.ts new file mode 100644 index 0000000..b545490 --- /dev/null +++ b/src/components/BasicPacks/BasicUploads/model/index.ts @@ -0,0 +1,4 @@ +export interface FileList { + uid?: any | null | undefined + name?: any | null | undefined +} diff --git a/src/components/BasicPacks/tools/icons/icons.json b/src/components/BasicPacks/tools/icons/icons.json new file mode 100644 index 0000000..808834e --- /dev/null +++ b/src/components/BasicPacks/tools/icons/icons.json @@ -0,0 +1,1023 @@ +{ + "vuesax-linear:24-support": "\n\n\n\n\n", + "vuesax-linear:3d-cube-scan": "\n\n\n\n\n\n\n", + "vuesax-linear:3d-rotate": "\n\n\n\n\n\n\n", + "vuesax-linear:3d-square": "\n\n\n\n\n\n", + "vuesax-linear:3dcube": "\n\n\n\n\n", + "vuesax-linear:3full": "\n\n\n\n\n\n", + "vuesax-linear:3square": "\n\n\n\n\n", + "vuesax-linear:aave-(aave)": "\n\n\n\n\n", + "vuesax-linear:activity": "\n\n\n\n", + "vuesax-linear:add-circle": "\n\n\n\n\n", + "vuesax-linear:add-square": "\n\n\n\n\n", + "vuesax-linear:add": "\n\n\n\n", + "vuesax-linear:additem": "\n\n\n\n\n\n", + "vuesax-linear:airdrop": "\n\n\n\n\n\n", + "vuesax-linear:airplane-square": "\n\n\n\n", + "vuesax-linear:airplane": "\n\n\n", + "vuesax-linear:airpod": "\n\n\n\n\n\n", + "vuesax-linear:airpods": "\n\n\n\n\n\n\n\n", + "vuesax-linear:alarm": "\n\n\n\n\n\n\n", + "vuesax-linear:align-bottom": "\n\n\n\n\n", + "vuesax-linear:align-horizontally": "\n\n\n\n\n\n\n", + "vuesax-linear:align-left": "\n\n\n\n\n", + "vuesax-linear:align-right": "\n\n\n\n\n", + "vuesax-linear:align-vertically": "\n\n\n\n\n\n\n", + "vuesax-linear:android": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:ankr-(ankr)": "\n\n\n\n\n\n", + "vuesax-linear:apple": "\n\n\n", + "vuesax-linear:aquarius": "\n\n\n\n\n", + "vuesax-linear:archive-1": "\n\n\n\n\n", + "vuesax-linear:archive-add": "\n\n\n\n\n", + "vuesax-linear:archive-book": "\n\n\n\n\n\n", + "vuesax-linear:archive-minus": "\n\n\n\n", + "vuesax-linear:archive-slash": "\n\n\n\n\n", + "vuesax-linear:archive-tick": "\n\n\n\n", + "vuesax-linear:archive": "\n\n\n\n\n\n\n\n", + "vuesax-linear:arrange-circle-2": "\n\n\n\n\n\n\n", + "vuesax-linear:arrange-circle": "\n\n\n\n\n\n\n", + "vuesax-linear:arrange-square-2": "\n\n\n\n\n\n\n", + "vuesax-linear:arrange-square": "\n\n\n\n\n\n\n", + "vuesax-linear:arrow-2": "\n\n\n\n\n\n", + "vuesax-linear:arrow-3": "\n\n\n\n\n\n", + "vuesax-linear:arrow-bottom": "\n\n\n", + "vuesax-linear:arrow-circle-down": "\n\n\n\n", + "vuesax-linear:arrow-circle-left": "\n\n\n\n", + "vuesax-linear:arrow-circle-right": "\n\n\n\n", + "vuesax-linear:arrow-down-1": "\n\n\n\n", + "vuesax-linear:arrow-down-2": "\n\n\n\n\n", + "vuesax-linear:arrow-down": "\n\n\n", + "vuesax-linear:arrow-left-1": "\n\n\n", + "vuesax-linear:arrow-left-2": "\n\n\n\n\n", + "vuesax-linear:arrow-left-3": "\n\n\n", + "vuesax-linear:arrow-left": "\n\n\n\n", + "vuesax-linear:arrow-right-1": "\n\n\n", + "vuesax-linear:arrow-right-2": "\n\n\n\n\n", + "vuesax-linear:arrow-right-3": "\n\n\n", + "vuesax-linear:arrow-right": "\n\n\n\n", + "vuesax-linear:arrow-square-down": "\n\n\n\n", + "vuesax-linear:arrow-square-left": "\n\n\n\n", + "vuesax-linear:arrow-square-right": "\n\n\n\n", + "vuesax-linear:arrow-square-up": "\n\n\n\n", + "vuesax-linear:arrow-square": "\n\n\n\n\n\n\n", + "vuesax-linear:arrow-swap-horizontal": "\n\n\n\n\n\n", + "vuesax-linear:arrow-up-1": "\n\n\n", + "vuesax-linear:arrow-up-2": "\n\n\n\n\n", + "vuesax-linear:arrow-up-3": "\n\n\n", + "vuesax-linear:arrow-up": "\n\n\n\n", + "vuesax-linear:arrow": "\n\n\n\n\n\n\n\n", + "vuesax-linear:attach-circle": "\n\n\n\n", + "vuesax-linear:attach-square": "\n\n\n\n", + "vuesax-linear:audio-square": "\n\n\n\n\n\n", + "vuesax-linear:augur-(rep)": "\n\n\n\n\n", + "vuesax-linear:autobrightness": "\n\n\n\n\n", + "vuesax-linear:autonio-(niox)": "\n\n\n\n\n\n", + "vuesax-linear:avalanche-(avax)": "\n\n\n\n\n", + "vuesax-linear:award": "\n\n\n\n\n", + "vuesax-linear:back-square": "\n\n\n\n\n", + "vuesax-linear:backward-10-seconds": "\n\n\n\n\n\n", + "vuesax-linear:backward-15-seconds": "\n\n\n\n\n\n", + "vuesax-linear:backward-5-seconds": "\n\n\n\n\n", + "vuesax-linear:backward-item-1": "\n\n\n\n\n", + "vuesax-linear:backward-item": "\n\n\n\n\n", + "vuesax-linear:backward": "\n\n\n\n", + "vuesax-linear:bag-2": "\n\n\n\n\n\n", + "vuesax-linear:bag-cross-1": "\n\n\n\n\n\n\n", + "vuesax-linear:bag-cross": "\n\n\n\n\n\n\n\n", + "vuesax-linear:bag-happy": "\n\n\n\n\n\n\n", + "vuesax-linear:bag-tick-2": "\n\n\n\n\n\n", + "vuesax-linear:bag-tick": "\n\n\n\n\n\n\n", + "vuesax-linear:bag-timer": "\n\n\n\n\n\n", + "vuesax-linear:bag": "\n\n\n\n\n\n\n\n", + "vuesax-linear:bank": "\n\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:barcode": "\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:battery-3full": "\n\n\n\n\n\n", + "vuesax-linear:battery-charging": "\n\n\n\n\n\n", + "vuesax-linear:battery-disable": "\n\n\n\n\n\n", + "vuesax-linear:battery-empty-1": "\n\n\n\n\n", + "vuesax-linear:battery-empty": "\n\n\n\n", + "vuesax-linear:battery-full": "\n\n\n\n\n\n\n", + "vuesax-linear:be": "\n\n\n\n\n", + "vuesax-linear:bezier-1": "\n\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:bezier": "\n\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:bill": "\n\n\n\n\n\n", + "vuesax-linear:binance-coin-(bnb)": "\n\n\n\n\n\n\n", + "vuesax-linear:binance-usd-(busd)": "\n\n\n\n\n\n", + "vuesax-linear:bitcoin-(btc)": "\n\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:bitcoin-card": "\n\n\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:bitcoin-convert": "\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:bitcoin-refresh": "\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:blend-2": "\n\n\n\n\n\n\n", + "vuesax-linear:blend": "\n\n\n\n", + "vuesax-linear:blogger": "\n\n\n\n\n\n", + "vuesax-linear:bluetooth-2": "\n\n\n\n\n", + "vuesax-linear:bluetooth-circle": "\n\n\n\n", + "vuesax-linear:bluetooth-rectangle": "\n\n\n\n", + "vuesax-linear:bluetooth": "\n\n\n", + "vuesax-linear:blur-1": "\n\n\n\n\n\n\n", + "vuesax-linear:blur": "\n\n\n\n\n\n\n", + "vuesax-linear:book-1": "\n\n\n\n\n\n", + "vuesax-linear:book-saved": "\n\n\n\n\n", + "vuesax-linear:book-square": "\n\n\n\n\n", + "vuesax-linear:book": "\n\n\n\n\n\n", + "vuesax-linear:bookmark-2": "\n\n\n\n", + "vuesax-linear:bookmark": "\n\n\n\n\n\n", + "vuesax-linear:bootsrap": "\n\n\n\n", + "vuesax-linear:box-1": "\n\n\n\n\n", + "vuesax-linear:box-2": "\n\n\n", + "vuesax-linear:box-add": "\n\n\n\n\n\n\n\n", + "vuesax-linear:box-remove": "\n\n\n\n\n\n\n\n", + "vuesax-linear:box-search": "\n\n\n\n\n\n\n", + "vuesax-linear:box-tick": "\n\n\n\n\n\n\n", + "vuesax-linear:box-time": "\n\n\n\n\n\n\n", + "vuesax-linear:box": "\n\n\n\n\n\n", + "vuesax-linear:briefcase": "\n\n\n\n\n\n\n", + "vuesax-linear:brifecase-cross": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:brifecase-tick": "\n\n\n\n\n\n\n\n", + "vuesax-linear:brifecase-timer": "\n\n\n\n\n\n\n\n", + "vuesax-linear:broom": "\n\n\n\n\n\n\n\n", + "vuesax-linear:brush-1": "\n\n\n\n\n\n", + "vuesax-linear:brush-2": "\n\n\n\n\n\n", + "vuesax-linear:brush-3": "\n\n\n\n\n\n\n", + "vuesax-linear:brush": "\n\n\n\n\n", + "vuesax-linear:bubble": "\n\n\n\n\n", + "vuesax-linear:bucket-circle-1": "\n\n\n\n\n\n\n", + "vuesax-linear:bucket-circle": "\n\n\n\n\n\n\n", + "vuesax-linear:bucket-square-1": "\n\n\n\n\n\n\n", + "vuesax-linear:bucket-square": "\n\n\n\n\n\n\n", + "vuesax-linear:building-3": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:building-4": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:building": "\n\n\n\n\n\n\n\n", + "vuesax-linear:buildings-2": "\n\n\n\n\n\n\n\n", + "vuesax-linear:buildings": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:buliding": "\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:bus": "\n\n\n\n\n\n\n", + "vuesax-linear:buy-crypto": "\n\n\n\n\n", + "vuesax-linear:cake": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:calculator": "\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:calendar-1": "\n\n\n\n\n\n\n", + "vuesax-linear:calendar-2": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:calendar-add": "\n\n\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:calendar-circle": "\n\n\n\n\n\n\n", + "vuesax-linear:calendar-edit": "\n\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:calendar-remove": "\n\n\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:calendar-search": "\n\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:calendar-tick": "\n\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:calendar": "\n\n\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:call-add": "\n\n\n\n\n", + "vuesax-linear:call-calling": "\n\n\n\n\n", + "vuesax-linear:call-incoming": "\n\n\n\n", + "vuesax-linear:call-minus": "\n\n\n\n", + "vuesax-linear:call-outgoing": "\n\n\n\n", + "vuesax-linear:call-received": "\n\n\n\n", + "vuesax-linear:call-remove": "\n\n\n\n\n", + "vuesax-linear:call-slash": "\n\n\n\n\n", + "vuesax-linear:call": "\n\n\n", + "vuesax-linear:camera-slash": "\n\n\n\n\n\n\n", + "vuesax-linear:camera": "\n\n\n\n\n", + "vuesax-linear:candle-2": "\n\n\n\n\n\n\n\n", + "vuesax-linear:candle": "\n\n\n\n\n\n\n\n", + "vuesax-linear:car": "\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:card-add": "\n\n\n\n\n\n\n\n", + "vuesax-linear:card-coin": "\n\n\n\n\n\n\n", + "vuesax-linear:card-edit": "\n\n\n\n\n\n\n\n", + "vuesax-linear:card-pos": "\n\n\n\n\n\n\n", + "vuesax-linear:card-receive": "\n\n\n\n\n\n\n\n", + "vuesax-linear:card-remove-1": "\n\n\n\n\n\n\n\n", + "vuesax-linear:card-remove": "\n\n\n\n\n\n\n\n", + "vuesax-linear:card-send": "\n\n\n\n\n\n\n\n", + "vuesax-linear:card-slash": "\n\n\n\n\n\n\n\n", + "vuesax-linear:card-tick-1": "\n\n\n\n\n\n\n", + "vuesax-linear:card-tick": "\n\n\n\n\n\n\n", + "vuesax-linear:card": "\n\n\n\n\n\n", + "vuesax-linear:cardano-(ada)": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:cards": "\n\n\n\n\n\n\n", + "vuesax-linear:category-2": "\n\n\n\n\n\n", + "vuesax-linear:category": "\n\n\n\n\n\n", + "vuesax-linear:cd": "\n\n\n\n", + "vuesax-linear:celo-(celo)": "\n\n\n\n", + "vuesax-linear:celsius-(cel)-": "\n\n\n\n\n", + "vuesax-linear:chainlink-(link)": "\n\n\n", + "vuesax-linear:chart-1": "\n\n\n\n\n\n", + "vuesax-linear:chart-2": "\n\n\n\n\n", + "vuesax-linear:chart-21": "\n\n\n\n\n\n", + "vuesax-linear:chart-3": "\n\n\n\n\n", + "vuesax-linear:chart-square": "\n\n\n\n\n\n", + "vuesax-linear:chart-success": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:chart": "\n\n\n\n\n\n", + "vuesax-linear:check": "\n\n\n\n\n\n", + "vuesax-linear:chrome": "\n\n\n\n\n\n\n", + "vuesax-linear:civic-(cvc)": "\n\n\n\n", + "vuesax-linear:clipboard-close": "\n\n\n\n\n\n", + "vuesax-linear:clipboard-export": "\n\n\n\n\n\n\n", + "vuesax-linear:clipboard-import": "\n\n\n\n\n\n\n", + "vuesax-linear:clipboard-text": "\n\n\n\n\n\n", + "vuesax-linear:clipboard-tick": "\n\n\n\n\n", + "vuesax-linear:clipboard": "\n\n\n\n\n", + "vuesax-linear:clock-1": "\n\n\n\n", + "vuesax-linear:clock": "\n\n\n\n\n\n", + "vuesax-linear:close-circle": "\n\n\n\n\n", + "vuesax-linear:close-square": "\n\n\n\n\n", + "vuesax-linear:cloud-add": "\n\n\n\n\n\n", + "vuesax-linear:cloud-change": "\n\n\n\n\n", + "vuesax-linear:cloud-connection": "\n\n\n\n\n\n\n", + "vuesax-linear:cloud-cross": "\n\n\n\n\n\n\n", + "vuesax-linear:cloud-drizzle": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:cloud-fog": "\n\n\n\n\n\n\n", + "vuesax-linear:cloud-lightning": "\n\n\n\n\n\n", + "vuesax-linear:cloud-minus": "\n\n\n\n\n\n", + "vuesax-linear:cloud-notif": "\n\n\n\n\n", + "vuesax-linear:cloud-plus": "\n\n\n\n\n\n\n", + "vuesax-linear:cloud-remove": "\n\n\n\n\n\n\n", + "vuesax-linear:cloud-snow": "\n\n\n\n\n\n\n\n", + "vuesax-linear:cloud-sunny": "\n\n\n\n\n\n", + "vuesax-linear:cloud": "\n\n\n\n", + "vuesax-linear:code-1": "\n\n\n\n\n", + "vuesax-linear:code-circle": "\n\n\n\n\n\n", + "vuesax-linear:code": "\n\n\n\n\n\n", + "vuesax-linear:coffee": "\n\n\n\n\n\n\n\n", + "vuesax-linear:coin-1": "\n\n\n\n\n\n\n", + "vuesax-linear:coin": "\n\n\n\n\n", + "vuesax-linear:color-swatch": "\n\n\n\n\n\n\n", + "vuesax-linear:colorfilter": "\n\n\n\n\n", + "vuesax-linear:colors-square-1": "\n\n\n\n\n\n", + "vuesax-linear:colors-square": "\n\n\n\n\n\n", + "vuesax-linear:command-square": "\n\n\n\n\n\n\n\n", + "vuesax-linear:command": "\n\n\n\n\n\n\n", + "vuesax-linear:component-1": "\n\n\n", + "vuesax-linear:component": "\n\n\n", + "vuesax-linear:computing": "\n\n\n\n\n\n\n", + "vuesax-linear:convert-3d-cube": "\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:convert": "\n\n\n\n\n", + "vuesax-linear:convertshape-2": "\n\n\n\n\n\n", + "vuesax-linear:convertshape": "\n\n\n\n\n\n", + "vuesax-linear:copy-success": "\n\n\n\n\n", + "vuesax-linear:copy": "\n\n\n\n", + "vuesax-linear:copyright": "\n\n\n\n", + "vuesax-linear:courthouse": "\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:cpu-charge": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:cpu-setting": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:cpu": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:creative-commons": "\n\n\n\n\n", + "vuesax-linear:crop": "\n\n\n\n\n\n\n", + "vuesax-linear:crown-1": "\n\n\n\n\n", + "vuesax-linear:crown": "\n\n\n", + "vuesax-linear:cup": "\n\n\n\n\n\n\n\n", + "vuesax-linear:dai-(dai)": "\n\n\n\n\n\n", + "vuesax-linear:danger": "\n\n\n\n\n", + "vuesax-linear:dash-(dash)": "\n\n\n\n", + "vuesax-linear:data-2": "\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:data": "\n\n\n\n\n\n\n\n", + "vuesax-linear:decred-(dcr)": "\n\n\n\n", + "vuesax-linear:dent-(dent)": "\n\n\n\n\n\n", + "vuesax-linear:designtools": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:device-message": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:devices-1": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:devices": "\n\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:diagram": "\n\n\n\n", + "vuesax-linear:diamonds": "\n\n\n\n", + "vuesax-linear:direct-down": "\n\n\n", + "vuesax-linear:direct-inbox": "\n\n\n\n\n\n", + "vuesax-linear:direct-left": "\n\n\n", + "vuesax-linear:direct-normal": "\n\n\n\n", + "vuesax-linear:direct-notification": "\n\n\n\n\n", + "vuesax-linear:direct-right": "\n\n\n", + "vuesax-linear:direct-send": "\n\n\n\n\n\n", + "vuesax-linear:direct-up": "\n\n\n", + "vuesax-linear:direct": "\n\n\n\n\n\n", + "vuesax-linear:directbox-default": "\n\n\n\n", + "vuesax-linear:directbox-notif": "\n\n\n\n\n\n", + "vuesax-linear:directbox-receive": "\n\n\n\n\n\n\n", + "vuesax-linear:directbox-send": "\n\n\n\n\n\n\n", + "vuesax-linear:discount-circle": "\n\n\n\n\n\n", + "vuesax-linear:discount-shape": "\n\n\n\n\n\n", + "vuesax-linear:discover-1": "\n\n\n\n", + "vuesax-linear:discover": "\n\n\n\n", + "vuesax-linear:dislike": "\n\n\n\n", + "vuesax-linear:document-1": "\n\n\n\n", + "vuesax-linear:document-cloud": "\n\n\n\n\n\n", + "vuesax-linear:document-code-2": "\n\n\n\n\n\n", + "vuesax-linear:document-code": "\n\n\n\n\n\n", + "vuesax-linear:document-copy": "\n\n\n\n\n\n\n\n", + "vuesax-linear:document-download": "\n\n\n\n\n\n", + "vuesax-linear:document-favorite": "\n\n\n\n\n", + "vuesax-linear:document-filter": "\n\n\n\n\n\n", + "vuesax-linear:document-forward": "\n\n\n\n\n", + "vuesax-linear:document-like": "\n\n\n\n\n", + "vuesax-linear:document-normal": "\n\n\n\n", + "vuesax-linear:document-previous": "\n\n\n\n\n\n", + "vuesax-linear:document-sketch": "\n\n\n\n\n", + "vuesax-linear:document-text-1": "\n\n\n\n\n\n", + "vuesax-linear:document-text": "\n\n\n\n\n\n", + "vuesax-linear:document-upload": "\n\n\n\n\n\n", + "vuesax-linear:document": "\n\n\n\n\n", + "vuesax-linear:dollar-circle": "\n\n\n\n\n", + "vuesax-linear:dollar-square": "\n\n\n\n\n", + "vuesax-linear:dribbble": "\n\n\n\n\n\n", + "vuesax-linear:driver-2": "\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:driver-refresh": "\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:driver": "\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:driving": "\n\n\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:drop": "\n\n\n", + "vuesax-linear:dropbox": "\n\n\n\n\n\n\n", + "vuesax-linear:edit-2": "\n\n\n\n\n", + "vuesax-linear:edit": "\n\n\n\n\n", + "vuesax-linear:educare-(ekt)": "\n\n\n\n\n\n", + "vuesax-linear:electricity": "\n\n\n\n\n\n", + "vuesax-linear:element-1": "\n\n\n\n\n", + "vuesax-linear:element-2": "\n\n\n\n\n", + "vuesax-linear:element-3": "\n\n\n\n\n\n", + "vuesax-linear:element-4": "\n\n\n\n\n\n", + "vuesax-linear:element-equal": "\n\n\n\n\n\n\n", + "vuesax-linear:element-plus": "\n\n\n\n\n\n\n", + "vuesax-linear:emercoin-(emc)": "\n\n\n\n\n", + "vuesax-linear:emoji-happy": "\n\n\n\n\n\n", + "vuesax-linear:emoji-normal": "\n\n\n\n\n\n", + "vuesax-linear:emoji-sad": "\n\n\n\n\n\n", + "vuesax-linear:empty-wallet-add": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:empty-wallet-change": "\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:empty-wallet-remove": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:empty-wallet-tick": "\n\n\n\n\n\n\n\n", + "vuesax-linear:empty-wallet-time": "\n\n\n\n\n\n\n\n", + "vuesax-linear:empty-wallet": "\n\n\n\n\n\n", + "vuesax-linear:enjin-coin-(enj)": "\n\n\n\n\n", + "vuesax-linear:eos-(eos)": "\n\n\n\n", + "vuesax-linear:eraser-1": "\n\n\n\n\n\n\n", + "vuesax-linear:eraser-2": "\n\n\n\n\n\n\n", + "vuesax-linear:eraser": "\n\n\n\n\n", + "vuesax-linear:ethereum-(eth)": "\n\n\n\n\n\n", + "vuesax-linear:ethereum-classic-(etc)": "\n\n\n\n\n", + "vuesax-linear:export-1": "\n\n\n\n\n", + "vuesax-linear:export-2": "\n\n\n\n\n", + "vuesax-linear:export-3": "\n\n\n\n\n", + "vuesax-linear:export": "\n\n\n\n\n", + "vuesax-linear:external-drive": "\n\n\n\n\n\n\n\n", + "vuesax-linear:eye-slash": "\n\n\n\n\n\n\n\n", + "vuesax-linear:eye": "\n\n\n\n", + "vuesax-linear:facebook": "\n\n\n\n", + "vuesax-linear:fatrows": "\n\n\n\n", + "vuesax-linear:favorite-chart": "\n\n\n\n\n", + "vuesax-linear:figma-1": "\n\n\n\n\n\n\n\n", + "vuesax-linear:figma": "\n\n\n\n\n\n\n", + "vuesax-linear:filter-add": "\n\n\n\n\n\n", + "vuesax-linear:filter-edit": "\n\n\n\n\n", + "vuesax-linear:filter-remove": "\n\n\n\n\n\n\n", + "vuesax-linear:filter-search": "\n\n\n\n\n", + "vuesax-linear:filter-square": "\n\n\n\n", + "vuesax-linear:filter-tick": "\n\n\n\n\n", + "vuesax-linear:filter": "\n\n\n\n", + "vuesax-linear:finger-cricle": "\n\n\n\n\n", + "vuesax-linear:finger-scan": "\n\n\n\n\n\n\n\n", + "vuesax-linear:firstline": "\n\n\n\n\n\n\n", + "vuesax-linear:flag-2": "\n\n\n\n", + "vuesax-linear:flag": "\n\n\n\n", + "vuesax-linear:flash-1": "\n\n\n", + "vuesax-linear:flash-circle-1": "\n\n\n\n", + "vuesax-linear:flash-circle-2": "\n\n\n\n", + "vuesax-linear:flash-circle": "\n\n\n\n", + "vuesax-linear:flash-slash": "\n\n\n\n\n", + "vuesax-linear:flash": "\n\n\n\n\n\n", + "vuesax-linear:folder-2": "\n\n\n\n", + "vuesax-linear:folder-add": "\n\n\n\n\n", + "vuesax-linear:folder-cloud": "\n\n\n\n", + "vuesax-linear:folder-connection": "\n\n\n\n\n\n\n", + "vuesax-linear:folder-cross": "\n\n\n\n\n", + "vuesax-linear:folder-favorite": "\n\n\n\n", + "vuesax-linear:folder-minus": "\n\n\n\n", + "vuesax-linear:folder-open": "\n\n\n\n\n", + "vuesax-linear:folder": "\n\n\n", + "vuesax-linear:format-circle": "\n\n\n\n\n\n\n", + "vuesax-linear:format-square": "\n\n\n\n\n\n\n", + "vuesax-linear:forward-10-seconds": "\n\n\n\n\n\n", + "vuesax-linear:forward-15-seconds": "\n\n\n\n\n\n", + "vuesax-linear:forward-5-seconds": "\n\n\n\n\n", + "vuesax-linear:forward-item-1": "\n\n\n\n\n", + "vuesax-linear:forward-item": "\n\n\n\n\n", + "vuesax-linear:forward-square": "\n\n\n\n\n", + "vuesax-linear:forward": "\n\n\n\n", + "vuesax-linear:frame-1": "\n\n\n\n\n\n", + "vuesax-linear:frame-2": "\n\n\n\n\n", + "vuesax-linear:frame-3": "\n\n\n\n\n\n\n\n", + "vuesax-linear:frame-4": "\n\n\n\n\n", + "vuesax-linear:frame-5": "\n\n\n\n\n", + "vuesax-linear:frame": "\n\n\n\n", + "vuesax-linear:framer": "\n\n\n\n", + "vuesax-linear:ftx-token-(ftt)": "\n\n\n\n\n\n", + "vuesax-linear:gallery-add": "\n\n\n\n\n\n\n", + "vuesax-linear:gallery-edit": "\n\n\n\n\n\n\n", + "vuesax-linear:gallery-export": "\n\n\n\n\n\n\n", + "vuesax-linear:gallery-favorite": "\n\n\n\n\n\n", + "vuesax-linear:gallery-import": "\n\n\n\n\n\n\n", + "vuesax-linear:gallery-remove": "\n\n\n\n\n\n\n", + "vuesax-linear:gallery-slash": "\n\n\n\n\n\n\n", + "vuesax-linear:gallery-tick": "\n\n\n\n\n\n", + "vuesax-linear:gallery": "\n\n\n\n\n", + "vuesax-linear:game": "\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:gameboy": "\n\n\n\n\n\n\n\n", + "vuesax-linear:gas-station": "\n\n\n\n\n\n\n", + "vuesax-linear:gemini-2": "\n\n\n\n\n\n\n\n", + "vuesax-linear:gemini": "\n\n\n\n\n\n", + "vuesax-linear:ghost": "\n\n\n\n\n", + "vuesax-linear:gift": "\n\n\n\n\n\n\n", + "vuesax-linear:glass-1": "\n\n\n\n\n\n\n", + "vuesax-linear:glass": "\n\n\n\n", + "vuesax-linear:global-edit": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:global-refresh": "\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:global-search": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:global": "\n\n\n\n\n\n\n", + "vuesax-linear:google-1": "\n\n\n", + "vuesax-linear:google-play": "\n\n\n\n\n\n", + "vuesax-linear:google": "\n\n\n\n\n\n", + "vuesax-linear:gps-slash": "\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:gps": "\n\n\n\n\n\n\n\n", + "vuesax-linear:grammerly": "\n\n\n\n", + "vuesax-linear:graph": "\n\n\n\n", + "vuesax-linear:grid-1": "\n\n\n\n\n\n\n", + "vuesax-linear:grid-2": "\n\n\n\n\n", + "vuesax-linear:grid-3": "\n\n\n\n\n\n", + "vuesax-linear:grid-4": "\n\n\n\n", + "vuesax-linear:grid-5": "\n\n\n\n\n", + "vuesax-linear:grid-6": "\n\n\n\n\n\n", + "vuesax-linear:grid-7": "\n\n\n\n\n", + "vuesax-linear:grid-8": "\n\n\n\n\n\n\n\n", + "vuesax-linear:grid-9": "\n\n\n\n", + "vuesax-linear:grid-edit": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:grid-eraser": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:grid-lock": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:group-1": "\n\n\n\n\n\n\n\n", + "vuesax-linear:group-10": "\n\n\n\n", + "vuesax-linear:group-11": "\n\n\n\n\n\n\n", + "vuesax-linear:group-2": "\n\n\n\n\n\n\n", + "vuesax-linear:group-3": "\n\n\n\n", + "vuesax-linear:group-4": "\n\n\n\n\n\n\n", + "vuesax-linear:group-5": "\n\n\n\n", + "vuesax-linear:group-6": "\n\n\n\n\n\n\n", + "vuesax-linear:group-7": "\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:group-8": "\n\n\n\n", + "vuesax-linear:group-9": "\n\n\n\n\n", + "vuesax-linear:group": "\n\n\n\n\n\n", + "vuesax-linear:happyemoji": "\n\n\n\n", + "vuesax-linear:harmony-(one)": "\n\n\n\n\n\n\n", + "vuesax-linear:hashtag-1": "\n\n\n\n\n\n", + "vuesax-linear:hashtag-down": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:hashtag-up": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:hashtag": "\n\n\n\n\n\n", + "vuesax-linear:headphone": "\n\n\n", + "vuesax-linear:headphones": "\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:health": "\n\n\n\n", + "vuesax-linear:heart-add": "\n\n\n\n\n\n", + "vuesax-linear:heart-circle": "\n\n\n\n", + "vuesax-linear:heart-edit": "\n\n\n\n\n", + "vuesax-linear:heart-remove": "\n\n\n\n\n\n", + "vuesax-linear:heart-search": "\n\n\n\n\n", + "vuesax-linear:heart-slash": "\n\n\n\n\n", + "vuesax-linear:heart-tick": "\n\n\n\n\n", + "vuesax-linear:heart": "\n\n\n", + "vuesax-linear:hedera-hashgraph-(hbar)": "\n\n\n\n\n\n\n", + "vuesax-linear:hex-(hex)": "\n\n\n\n\n", + "vuesax-linear:hierarchy-2": "\n\n\n\n\n\n\n", + "vuesax-linear:hierarchy-3": "\n\n\n\n\n\n", + "vuesax-linear:hierarchy-square-2": "\n\n\n\n\n\n\n\n", + "vuesax-linear:hierarchy-square-3": "\n\n\n\n\n\n\n\n", + "vuesax-linear:hierarchy-square": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:hierarchy": "\n\n\n\n\n\n\n", + "vuesax-linear:home-2": "\n\n\n\n", + "vuesax-linear:home-hashtag": "\n\n\n\n\n\n", + "vuesax-linear:home-trend-down": "\n\n\n\n\n", + "vuesax-linear:home-trend-up": "\n\n\n\n\n", + "vuesax-linear:home-wifi": "\n\n\n\n\n\n", + "vuesax-linear:home": "\n\n\n\n", + "vuesax-linear:hospital": "\n\n\n\n\n\n\n", + "vuesax-linear:house-2": "\n\n\n\n\n\n\n", + "vuesax-linear:house": "\n\n\n\n\n\n\n\n", + "vuesax-linear:html-3": "\n\n\n\n\n", + "vuesax-linear:html-5": "\n\n\n\n", + "vuesax-linear:huobi-token-(ht)": "\n\n\n\n", + "vuesax-linear:icon-(icx)": "\n\n\n\n\n\n", + "vuesax-linear:illustrator": "\n\n\n\n\n\n\n", + "vuesax-linear:image": "\n\n\n\n", + "vuesax-linear:import-1": "\n\n\n\n\n", + "vuesax-linear:import-2": "\n\n\n\n\n", + "vuesax-linear:import": "\n\n\n\n\n", + "vuesax-linear:info-circle": "\n\n\n\n\n", + "vuesax-linear:information": "\n\n\n\n\n", + "vuesax-linear:instagram": "\n\n\n\n\n", + "vuesax-linear:iost-(iost)": "\n\n\n\n\n\n", + "vuesax-linear:java-script": "\n\n\n\n\n", + "vuesax-linear:js": "\n\n\n\n", + "vuesax-linear:judge": "\n\n\n\n\n\n", + "vuesax-linear:kanban": "\n\n\n\n", + "vuesax-linear:key-square": "\n\n\n\n\n\n", + "vuesax-linear:key": "\n\n\n\n\n", + "vuesax-linear:keyboard-open": "\n\n\n\n\n\n\n\n", + "vuesax-linear:keyboard": "\n\n\n\n\n\n\n", + "vuesax-linear:kyber-network-(knc)": "\n\n\n\n\n", + "vuesax-linear:lamp-1": "\n\n\n\n\n", + "vuesax-linear:lamp-charge": "\n\n\n\n\n", + "vuesax-linear:lamp-on": "\n\n\n\n", + "vuesax-linear:lamp-slash": "\n\n\n\n\n\n", + "vuesax-linear:lamp": "\n\n\n\n\n", + "vuesax-linear:language-circle": "\n\n\n\n\n\n\n", + "vuesax-linear:language-square": "\n\n\n\n\n\n\n", + "vuesax-linear:layer": "\n\n\n\n\n", + "vuesax-linear:level": "\n\n\n\n\n", + "vuesax-linear:lifebuoy": "\n\n\n\n\n\n\n\n", + "vuesax-linear:like-1": "\n\n\n\n", + "vuesax-linear:like-dislike": "\n\n\n\n\n\n", + "vuesax-linear:like-shapes": "\n\n\n\n\n", + "vuesax-linear:like-tag": "\n\n\n\n\n", + "vuesax-linear:like": "\n\n\n\n", + "vuesax-linear:link-1": "\n\n\n\n\n", + "vuesax-linear:link-2": "\n\n\n\n", + "vuesax-linear:link-21": "\n\n\n\n", + "vuesax-linear:link-circle": "\n\n\n\n\n", + "vuesax-linear:link-square": "\n\n\n\n\n", + "vuesax-linear:link": "\n\n\n\n", + "vuesax-linear:litecoin(ltc)": "\n\n\n\n\n", + "vuesax-linear:location-add": "\n\n\n\n\n", + "vuesax-linear:location-cross": "\n\n\n\n\n", + "vuesax-linear:location-minus": "\n\n\n\n", + "vuesax-linear:location-slash": "\n\n\n\n\n\n", + "vuesax-linear:location-tick": "\n\n\n\n", + "vuesax-linear:location": "\n\n\n\n", + "vuesax-linear:lock-1": "\n\n\n\n\n", + "vuesax-linear:lock-circle": "\n\n\n\n\n\n", + "vuesax-linear:lock-slash": "\n\n\n\n\n\n", + "vuesax-linear:lock": "\n\n\n\n\n\n\n", + "vuesax-linear:login-1": "\n\n\n\n\n", + "vuesax-linear:login": "\n\n\n\n\n", + "vuesax-linear:logout-1": "\n\n\n\n\n", + "vuesax-linear:logout": "\n\n\n\n\n", + "vuesax-linear:lovely": "\n\n\n\n", + "vuesax-linear:magic-star": "\n\n\n\n", + "vuesax-linear:magicpen": "\n\n\n\n\n\n\n", + "vuesax-linear:main-component-1": "\n\n\n\n\n", + "vuesax-linear:main-component": "\n\n\n\n\n", + "vuesax-linear:maker-(mkr)": "\n\n\n\n\n", + "vuesax-linear:man": "\n\n\n\n\n", + "vuesax-linear:map-1": "\n\n\n\n\n", + "vuesax-linear:map": "\n\n\n\n\n\n\n", + "vuesax-linear:mask-1": "\n\n\n\n\n\n\n", + "vuesax-linear:mask-2": "\n\n\n\n\n\n\n", + "vuesax-linear:mask-3": "\n\n\n\n", + "vuesax-linear:mask": "\n\n\n\n\n\n\n", + "vuesax-linear:math": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:maximize-1": "\n\n\n\n\n\n", + "vuesax-linear:maximize-2": "\n\n\n\n\n\n\n\n", + "vuesax-linear:maximize-21": "\n\n\n\n\n\n", + "vuesax-linear:maximize-3": "\n\n\n\n\n\n", + "vuesax-linear:maximize-4": "\n\n\n\n\n\n", + "vuesax-linear:maximize-circle": "\n\n\n\n\n\n\n\n", + "vuesax-linear:maximize": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:medal-star": "\n\n\n\n\n", + "vuesax-linear:medal": "\n\n\n\n", + "vuesax-linear:menu-1": "\n\n\n\n\n\n", + "vuesax-linear:menu-board": "\n\n\n\n\n\n\n\n", + "vuesax-linear:menu": "\n\n\n\n\n", + "vuesax-linear:message-2": "\n\n\n\n", + "vuesax-linear:message-add-1": "\n\n\n\n\n", + "vuesax-linear:message-add": "\n\n\n\n\n\n\n", + "vuesax-linear:message-circle": "\n\n\n\n", + "vuesax-linear:message-edit": "\n\n\n\n\n", + "vuesax-linear:message-favorite": "\n\n\n\n\n\n\n", + "vuesax-linear:message-minus": "\n\n\n\n", + "vuesax-linear:message-notif": "\n\n\n\n\n\n\n", + "vuesax-linear:message-programming": "\n\n\n\n\n\n", + "vuesax-linear:message-question": "\n\n\n\n\n", + "vuesax-linear:message-remove": "\n\n\n\n\n\n\n", + "vuesax-linear:message-search": "\n\n\n\n\n\n\n\n", + "vuesax-linear:message-square": "\n\n\n\n", + "vuesax-linear:message-text-1": "\n\n\n\n\n", + "vuesax-linear:message-text": "\n\n\n\n\n", + "vuesax-linear:message-tick": "\n\n\n\n\n\n", + "vuesax-linear:message-time": "\n\n\n\n\n\n", + "vuesax-linear:message": "\n\n\n\n\n\n", + "vuesax-linear:messages-1": "\n\n\n\n\n\n\n", + "vuesax-linear:messages-2": "\n\n\n\n", + "vuesax-linear:messages-3": "\n\n\n\n", + "vuesax-linear:messages": "\n\n\n\n\n", + "vuesax-linear:messenger": "\n\n\n\n", + "vuesax-linear:microphone-2": "\n\n\n\n\n\n\n", + "vuesax-linear:microphone-slash-1": "\n\n\n\n\n\n\n\n", + "vuesax-linear:microphone-slash": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:microphone": "\n\n\n\n\n\n", + "vuesax-linear:microscope": "\n\n\n\n\n\n\n", + "vuesax-linear:milk": "\n\n\n\n\n\n\n", + "vuesax-linear:mini-music-sqaure": "\n\n\n\n\n\n\n", + "vuesax-linear:minus-cirlce": "\n\n\n\n", + "vuesax-linear:minus-square": "\n\n\n\n", + "vuesax-linear:minus": "\n\n\n", + "vuesax-linear:mirror": "\n\n\n\n", + "vuesax-linear:mirroring-screen": "\n\n\n\n\n\n", + "vuesax-linear:mobile-programming": "\n\n\n\n\n\n", + "vuesax-linear:mobile": "\n\n\n\n\n", + "vuesax-linear:monero-(xmr)": "\n\n\n\n", + "vuesax-linear:money-2": "\n\n\n\n\n\n\n\n", + "vuesax-linear:money-3": "\n\n\n\n\n\n", + "vuesax-linear:money-4": "\n\n\n\n\n\n\n\n", + "vuesax-linear:money-add": "\n\n\n\n\n\n\n\n", + "vuesax-linear:money-change": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:money-forbidden": "\n\n\n\n\n\n\n", + "vuesax-linear:money-receive": "\n\n\n\n\n\n\n", + "vuesax-linear:money-remove": "\n\n\n\n\n\n\n\n", + "vuesax-linear:money-send": "\n\n\n\n\n\n\n", + "vuesax-linear:money-tick": "\n\n\n\n\n\n\n", + "vuesax-linear:money-time": "\n\n\n\n\n\n\n", + "vuesax-linear:money": "\n\n\n\n\n\n", + "vuesax-linear:moneys": "\n\n\n\n\n\n\n", + "vuesax-linear:monitor-mobbile": "\n\n\n\n\n\n\n\n", + "vuesax-linear:monitor-recorder": "\n\n\n\n\n\n\n\n", + "vuesax-linear:monitor": "\n\n\n\n\n\n", + "vuesax-linear:moon": "\n\n\n", + "vuesax-linear:more-2": "\n\n\n\n\n", + "vuesax-linear:more-circle": "\n\n\n\n\n\n", + "vuesax-linear:more-square": "\n\n\n\n\n\n", + "vuesax-linear:more": "\n\n\n\n\n", + "vuesax-linear:mouse-1": "\n\n\n\n", + "vuesax-linear:mouse-circle": "\n\n\n\n", + "vuesax-linear:mouse-square": "\n\n\n\n", + "vuesax-linear:mouse": "\n\n\n\n\n", + "vuesax-linear:music-circle": "\n\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:music-dashboard": "\n\n\n\n\n\n\n\n", + "vuesax-linear:music-filter": "\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:music-library-2": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:music-play": "\n\n\n\n", + "vuesax-linear:music-playlist": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:music-square-add": "\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:music-square-remove": "\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:music-square-search": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:music-square": "\n\n\n\n\n\n\n", + "vuesax-linear:music": "\n\n\n\n\n\n", + "vuesax-linear:musicnote": "\n\n\n\n\n", + "vuesax-linear:nebulas-(nas)": "\n\n\n\n\n\n", + "vuesax-linear:nem-(xem)": "\n\n\n\n\n", + "vuesax-linear:nexo-(nexo)": "\n\n\n\n", + "vuesax-linear:next": "\n\n\n\n", + "vuesax-linear:note-1": "\n\n\n\n\n\n\n", + "vuesax-linear:note-2": "\n\n\n\n\n\n", + "vuesax-linear:note-21": "\n\n\n\n", + "vuesax-linear:note-add": "\n\n\n\n\n\n\n", + "vuesax-linear:note-favorite": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:note-remove": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:note-square": "\n\n\n\n\n\n", + "vuesax-linear:note-text": "\n\n\n\n\n\n\n", + "vuesax-linear:note": "\n\n\n\n\n\n", + "vuesax-linear:notification-1": "\n\n\n\n", + "vuesax-linear:notification-bing": "\n\n\n\n\n", + "vuesax-linear:notification-circle": "\n\n\n\n", + "vuesax-linear:notification-favorite": "\n\n\n\n\n", + "vuesax-linear:notification-status": "\n\n\n\n\n\n", + "vuesax-linear:notification": "\n\n\n\n\n", + "vuesax-linear:ocean-protocol-(ocean)": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:okb-(okb)": "\n\n\n\n\n\n", + "vuesax-linear:omega-circle-1": "\n\n\n\n", + "vuesax-linear:omega-circle": "\n\n\n\n", + "vuesax-linear:omega-square-1": "\n\n\n\n", + "vuesax-linear:omega-square": "\n\n\n\n", + "vuesax-linear:ontology-(ont)": "\n\n\n\n", + "vuesax-linear:paintbucket": "\n\n\n\n\n", + "vuesax-linear:paperclip-2": "\n\n\n", + "vuesax-linear:paperclip": "\n\n\n", + "vuesax-linear:password-check": "\n\n\n\n\n\n\n", + "vuesax-linear:path-2": "\n\n\n\n\n", + "vuesax-linear:path-square": "\n\n\n\n\n\n", + "vuesax-linear:path": "\n\n\n\n\n", + "vuesax-linear:pause-circle": "\n\n\n\n\n", + "vuesax-linear:pause": "\n\n\n\n", + "vuesax-linear:paypal": "\n\n\n\n", + "vuesax-linear:pen-add-1": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:pen-add": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:pen-close-1": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:pen-close": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:pen-remove-1": "\n\n\n\n\n\n\n\n", + "vuesax-linear:pen-remove": "\n\n\n\n\n\n\n\n", + "vuesax-linear:pen-tool-1": "\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:pen-tool-2-1": "\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:pen-tool-2": "\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:pen-tool": "\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:people": "\n\n\n\n\n\n\n\n", + "vuesax-linear:percentage-square": "\n\n\n\n\n\n", + "vuesax-linear:personalcard": "\n\n\n\n\n\n\n\n", + "vuesax-linear:pet": "\n\n\n\n\n\n\n", + "vuesax-linear:pharagraphspacing": "\n\n\n\n\n\n\n", + "vuesax-linear:photoshop": "\n\n\n\n\n", + "vuesax-linear:picture-frame": "\n\n\n\n\n", + "vuesax-linear:play-add": "\n\n\n\n\n\n\n", + "vuesax-linear:play-circle": "\n\n\n\n", + "vuesax-linear:play-cricle": "\n\n\n\n\n\n\n", + "vuesax-linear:play-remove": "\n\n\n\n\n\n\n", + "vuesax-linear:play": "\n\n\n", + "vuesax-linear:polkadot-(dot)": "\n\n\n\n", + "vuesax-linear:polygon-(matic)": "\n\n\n\n", + "vuesax-linear:polyswarm-(nct)": "\n\n\n\n\n\n", + "vuesax-linear:presention-chart": "\n\n\n\n\n\n\n", + "vuesax-linear:previous": "\n\n\n\n", + "vuesax-linear:printer-slash": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:printer": "\n\n\n\n\n\n\n", + "vuesax-linear:profile-2user": "\n\n\n\n\n\n", + "vuesax-linear:profile-add": "\n\n\n\n\n\n", + "vuesax-linear:profile-circle": "\n\n\n\n\n", + "vuesax-linear:profile-delete": "\n\n\n\n\n\n", + "vuesax-linear:profile-remove": "\n\n\n\n\n", + "vuesax-linear:profile-tick": "\n\n\n\n\n", + "vuesax-linear:profile": "\n\n\n\n", + "vuesax-linear:programming-arrow": "\n\n\n\n\n\n\n\n", + "vuesax-linear:programming-arrows": "\n\n\n\n\n\n\n\n", + "vuesax-linear:python": "\n\n\n\n\n\n\n", + "vuesax-linear:quant-(qnt)": "\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:quote-down-circle": "\n\n\n\n\n\n\n", + "vuesax-linear:quote-down-square": "\n\n\n\n\n\n\n", + "vuesax-linear:quote-down": "\n\n\n\n\n\n", + "vuesax-linear:quote-up-circle": "\n\n\n\n\n\n\n", + "vuesax-linear:quote-up-square": "\n\n\n\n\n\n\n", + "vuesax-linear:quote-up": "\n\n\n\n\n\n", + "vuesax-linear:radar-1": "\n\n\n\n\n\n\n", + "vuesax-linear:radar-2": "\n\n\n\n", + "vuesax-linear:radar": "\n\n\n", + "vuesax-linear:radio": "\n\n\n\n\n\n\n\n", + "vuesax-linear:ram-2": "\n\n\n\n\n\n\n", + "vuesax-linear:ram": "\n\n\n\n\n", + "vuesax-linear:ranking-1": "\n\n\n\n\n\n", + "vuesax-linear:ranking": "\n\n\n\n\n\n", + "vuesax-linear:receipt-1": "\n\n\n\n\n", + "vuesax-linear:receipt-2-1": "\n\n\n\n\n\n\n", + "vuesax-linear:receipt-2": "\n\n\n\n\n", + "vuesax-linear:receipt-add": "\n\n\n\n\n\n", + "vuesax-linear:receipt-discount": "\n\n\n\n\n\n\n", + "vuesax-linear:receipt-disscount": "\n\n\n\n\n\n", + "vuesax-linear:receipt-edit": "\n\n\n\n\n\n\n", + "vuesax-linear:receipt-item": "\n\n\n\n\n\n\n\n", + "vuesax-linear:receipt-minus": "\n\n\n\n\n", + "vuesax-linear:receipt-search": "\n\n\n\n\n\n\n", + "vuesax-linear:receipt-square": "\n\n\n\n", + "vuesax-linear:receipt-text": "\n\n\n\n\n\n", + "vuesax-linear:receipt": "\n\n\n\n", + "vuesax-linear:receive-square-2": "\n\n\n\n\n\n", + "vuesax-linear:receive-square": "\n\n\n\n\n\n", + "vuesax-linear:received": "\n\n\n\n\n", + "vuesax-linear:record-circle": "\n\n\n\n", + "vuesax-linear:record": "\n\n\n", + "vuesax-linear:recovery-convert": "\n\n\n\n\n\n", + "vuesax-linear:redo": "\n\n\n\n", + "vuesax-linear:refresh-2": "\n\n\n", + "vuesax-linear:refresh-circle": "\n\n\n\n\n\n\n", + "vuesax-linear:refresh-left-square": "\n\n\n\n\n\n", + "vuesax-linear:refresh-right-square": "\n\n\n\n\n\n", + "vuesax-linear:refresh-square-2": "\n\n\n\n", + "vuesax-linear:refresh": "\n\n\n\n", + "vuesax-linear:repeat-circle": "\n\n\n\n\n\n\n", + "vuesax-linear:repeat": "\n\n\n\n\n\n", + "vuesax-linear:repeate-music": "\n\n\n\n\n", + "vuesax-linear:repeate-one": "\n\n\n\n\n", + "vuesax-linear:reserve": "\n\n\n\n\n\n", + "vuesax-linear:rotate-left-1": "\n\n\n\n", + "vuesax-linear:rotate-left": "\n\n\n\n\n", + "vuesax-linear:rotate-right-1": "\n\n\n\n", + "vuesax-linear:rotate-right": "\n\n\n\n\n", + "vuesax-linear:route-square": "\n\n\n\n", + "vuesax-linear:routing-2": "\n\n\n\n\n\n\n", + "vuesax-linear:routing": "\n\n\n\n\n\n\n", + "vuesax-linear:row-horizontal": "\n\n\n\n", + "vuesax-linear:row-vertical": "\n\n\n\n", + "vuesax-linear:ruler&pen": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:ruler": "\n\n\n\n\n\n\n", + "vuesax-linear:safe-home": "\n\n\n\n", + "vuesax-linear:sagittarius": "\n\n\n\n\n", + "vuesax-linear:save-2": "\n\n\n\n\n", + "vuesax-linear:save-add": "\n\n\n\n\n\n", + "vuesax-linear:save-minus": "\n\n\n\n\n", + "vuesax-linear:save-remove": "\n\n\n\n\n\n", + "vuesax-linear:scan-barcode": "\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:scan": "\n\n\n\n\n\n\n\n", + "vuesax-linear:scanner": "\n\n\n\n\n", + "vuesax-linear:scanning": "\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:scissor-1": "\n\n\n\n\n\n", + "vuesax-linear:scissor-2": "\n\n\n\n\n\n\n", + "vuesax-linear:scissor": "\n\n\n\n\n\n", + "vuesax-linear:screenmirroring": "\n\n\n\n", + "vuesax-linear:scroll": "\n\n\n\n\n", + "vuesax-linear:search-favorite-1": "\n\n\n\n\n", + "vuesax-linear:search-favorite": "\n\n\n\n\n", + "vuesax-linear:search-normal-1": "\n\n\n\n", + "vuesax-linear:search-normal": "\n\n\n\n", + "vuesax-linear:search-status-1": "\n\n\n\n\n\n", + "vuesax-linear:search-status": "\n\n\n\n\n\n", + "vuesax-linear:search-zoom-in-1": "\n\n\n\n\n\n", + "vuesax-linear:search-zoom-in": "\n\n\n\n\n\n", + "vuesax-linear:search-zoom-out-1": "\n\n\n\n\n", + "vuesax-linear:search-zoom-out": "\n\n\n\n\n", + "vuesax-linear:security-card": "\n\n\n\n\n\n\n", + "vuesax-linear:security-safe": "\n\n\n\n\n", + "vuesax-linear:security-time": "\n\n\n\n\n", + "vuesax-linear:security-user": "\n\n\n\n\n", + "vuesax-linear:security": "\n\n\n", + "vuesax-linear:send-1": "\n\n\n\n", + "vuesax-linear:send-2": "\n\n\n\n", + "vuesax-linear:send-sqaure-2": "\n\n\n\n\n\n", + "vuesax-linear:send-square": "\n\n\n\n\n\n", + "vuesax-linear:send": "\n\n\n\n\n", + "vuesax-linear:setting-2": "\n\n\n\n", + "vuesax-linear:setting-3": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:setting-4": "\n\n\n\n\n\n\n\n", + "vuesax-linear:setting-5": "\n\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:setting": "\n\n\n\n", + "vuesax-linear:settings": "\n\n\n\n\n", + "vuesax-linear:shapes-1": "\n\n\n\n", + "vuesax-linear:shapes-2": "\n\n\n\n", + "vuesax-linear:shapes": "\n\n\n\n", + "vuesax-linear:share": "\n\n\n\n\n\n\n\n", + "vuesax-linear:shield-cross": "\n\n\n\n\n", + "vuesax-linear:shield-search": "\n\n\n\n\n", + "vuesax-linear:shield-security": "\n\n\n\n\n", + "vuesax-linear:shield-slash": "\n\n\n\n\n", + "vuesax-linear:shield-tick": "\n\n\n\n", + "vuesax-linear:shield": "\n\n\n", + "vuesax-linear:ship": "\n\n\n\n\n\n", + "vuesax-linear:shop-add": "\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:shop-remove": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:shop": "\n\n\n\n\n\n\n", + "vuesax-linear:shopping-bag": "\n\n\n\n\n", + "vuesax-linear:shopping-cart": "\n\n\n\n\n\n", + "vuesax-linear:siacoin-(sc)": "\n\n\n\n\n", + "vuesax-linear:sidebar-bottom": "\n\n\n\n\n", + "vuesax-linear:sidebar-left": "\n\n\n\n\n", + "vuesax-linear:sidebar-right": "\n\n\n\n\n", + "vuesax-linear:sidebar-top": "\n\n\n\n\n", + "vuesax-linear:signpost": "\n\n\n\n\n\n\n", + "vuesax-linear:simcard-1": "\n\n\n\n\n\n", + "vuesax-linear:simcard-2": "\n\n\n\n", + "vuesax-linear:simcard": "\n\n\n\n\n", + "vuesax-linear:size": "\n\n\n\n", + "vuesax-linear:slack": "\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:slash": "\n\n\n\n", + "vuesax-linear:slider-horizontal-1": "\n\n\n\n\n", + "vuesax-linear:slider-horizontal": "\n\n\n\n\n", + "vuesax-linear:slider-vertical-1": "\n\n\n\n\n", + "vuesax-linear:slider-vertical": "\n\n\n\n\n", + "vuesax-linear:slider": "\n\n\n\n\n\n", + "vuesax-linear:smallcaps": "\n\n\n\n\n\n\n\n", + "vuesax-linear:smart-car": "\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:smart-home": "\n\n\n\n\n\n", + "vuesax-linear:smileys": "\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:sms-edit": "\n\n\n\n\n\n", + "vuesax-linear:sms-notification": "\n\n\n\n\n", + "vuesax-linear:sms-search": "\n\n\n\n\n\n", + "vuesax-linear:sms-star": "\n\n\n\n\n", + "vuesax-linear:sms-tracking": "\n\n\n\n\n\n", + "vuesax-linear:sms": "\n\n\n\n", + "vuesax-linear:snapchat": "\n\n\n\n", + "vuesax-linear:solana-(sol)": "\n\n\n\n\n", + "vuesax-linear:sort": "\n\n\n\n\n", + "vuesax-linear:sound": "\n\n\n\n\n\n\n", + "vuesax-linear:speaker": "\n\n\n\n\n", + "vuesax-linear:speedometer": "\n\n\n\n\n", + "vuesax-linear:spotify": "\n\n\n\n\n\n", + "vuesax-linear:stacks-(stx)": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:star-1": "\n\n\n", + "vuesax-linear:star-slash": "\n\n\n\n\n", + "vuesax-linear:star": "\n\n\n\n\n\n", + "vuesax-linear:status-up": "\n\n\n\n\n\n\n\n", + "vuesax-linear:status": "\n\n\n\n\n", + "vuesax-linear:stellar-(xlm)": "\n\n\n\n\n\n", + "vuesax-linear:sticker": "\n\n\n\n", + "vuesax-linear:stickynote": "\n\n\n\n\n\n\n\n", + "vuesax-linear:stop-circle": "\n\n\n\n", + "vuesax-linear:stop": "\n\n\n", + "vuesax-linear:story": "\n\n\n\n\n\n", + "vuesax-linear:strongbox-2": "\n\n\n\n\n\n\n\n", + "vuesax-linear:strongbox": "\n\n\n\n\n\n", + "vuesax-linear:subtitle": "\n\n\n\n\n\n\n", + "vuesax-linear:sun-1": "\n\n\n\n", + "vuesax-linear:sun-fog": "\n\n\n\n\n\n\n", + "vuesax-linear:sun": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:tag-2": "\n\n\n\n\n", + "vuesax-linear:tag-cross": "\n\n\n\n\n", + "vuesax-linear:tag-right": "\n\n\n", + "vuesax-linear:tag-user": "\n\n\n\n\n", + "vuesax-linear:tag": "\n\n\n\n", + "vuesax-linear:task-square": "\n\n\n\n\n\n\n", + "vuesax-linear:task": "\n\n\n\n\n\n\n\n", + "vuesax-linear:teacher": "\n\n\n\n\n", + "vuesax-linear:tenx-(pay)": "\n\n\n\n", + "vuesax-linear:tether-(usdt)": "\n\n\n\n\n", + "vuesax-linear:text-block": "\n\n\n\n\n", + "vuesax-linear:text-bold": "\n\n\n\n", + "vuesax-linear:text-italic": "\n\n\n\n\n", + "vuesax-linear:text-underline": "\n\n\n\n", + "vuesax-linear:text": "\n\n\n\n\n", + "vuesax-linear:textalign-center": "\n\n\n\n\n\n", + "vuesax-linear:textalign-justifycenter": "\n\n\n\n\n\n", + "vuesax-linear:textalign-justifyleft": "\n\n\n\n\n\n", + "vuesax-linear:textalign-justifyright": "\n\n\n\n\n\n", + "vuesax-linear:textalign-left": "\n\n\n\n\n\n", + "vuesax-linear:textalign-right": "\n\n\n\n\n\n", + "vuesax-linear:the-graph-(grt)": "\n\n\n\n\n\n", + "vuesax-linear:theta-(theta)": "\n\n\n\n\n\n\n\n", + "vuesax-linear:thorchain-(rune)": "\n\n\n", + "vuesax-linear:tick-circle": "\n\n\n\n", + "vuesax-linear:tick-square": "\n\n\n\n", + "vuesax-linear:ticket-2": "\n\n\n\n\n", + "vuesax-linear:ticket-discount": "\n\n\n\n\n\n", + "vuesax-linear:ticket-expired": "\n\n\n\n\n", + "vuesax-linear:ticket-star": "\n\n\n\n\n\n", + "vuesax-linear:ticket": "\n\n\n\n", + "vuesax-linear:timer-1": "\n\n\n\n\n", + "vuesax-linear:timer-pause": "\n\n\n\n\n\n\n", + "vuesax-linear:timer-start": "\n\n\n\n\n\n", + "vuesax-linear:timer": "\n\n\n", + "vuesax-linear:toggle-off-circle": "\n\n\n\n", + "vuesax-linear:toggle-off": "\n\n\n\n", + "vuesax-linear:toggle-on-circle": "\n\n\n\n", + "vuesax-linear:toggle-on": "\n\n\n\n", + "vuesax-linear:trade": "\n\n\n\n\n\n", + "vuesax-linear:transaction-minus": "\n\n\n\n", + "vuesax-linear:translate": "\n\n\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:trash": "\n\n\n\n\n\n\n", + "vuesax-linear:tree": "\n\n\n\n\n", + "vuesax-linear:trello": "\n\n\n\n\n", + "vuesax-linear:trend-down": "\n\n\n\n\n", + "vuesax-linear:trend-up": "\n\n\n\n\n", + "vuesax-linear:triangle": "\n\n\n\n\n", + "vuesax-linear:trontron-(trx)": "\n\n\n\n\n", + "vuesax-linear:truck-remove": "\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:truck-tick": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:truck-time": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:trush-square": "\n\n\n\n\n\n", + "vuesax-linear:twitch": "\n\n\n\n\n", + "vuesax-linear:ui8": "\n\n\n\n\n\n\n", + "vuesax-linear:undo": "\n\n\n\n", + "vuesax-linear:unlimited": "\n\n\n", + "vuesax-linear:unlock": "\n\n\n\n\n", + "vuesax-linear:usd-coin-(usdc)": "\n\n\n\n\n\n\n", + "vuesax-linear:user-add": "\n\n\n\n\n\n\n", + "vuesax-linear:user-cirlce-add": "\n\n\n\n\n\n\n\n", + "vuesax-linear:user-edit": "\n\n\n\n\n\n", + "vuesax-linear:user-minus": "\n\n\n\n\n\n", + "vuesax-linear:user-octagon": "\n\n\n\n\n", + "vuesax-linear:user-remove": "\n\n\n\n\n\n\n", + "vuesax-linear:user-search": "\n\n\n\n\n\n", + "vuesax-linear:user-square": "\n\n\n\n\n", + "vuesax-linear:user-tag": "\n\n\n\n\n", + "vuesax-linear:user-tick": "\n\n\n\n\n\n", + "vuesax-linear:user": "\n\n\n\n", + "vuesax-linear:velas-(vlx)": "\n\n\n\n", + "vuesax-linear:verify": "\n\n\n\n", + "vuesax-linear:vibe-(vibe)": "\n\n\n\n\n", + "vuesax-linear:video-add": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:video-circle": "\n\n\n\n", + "vuesax-linear:video-horizontal": "\n\n\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:video-octagon": "\n\n\n\n", + "vuesax-linear:video-play": "\n\n\n\n\n\n\n", + "vuesax-linear:video-remove": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:video-slash": "\n\n\n\n\n\n", + "vuesax-linear:video-square": "\n\n\n\n", + "vuesax-linear:video-tick": "\n\n\n\n\n\n\n\n", + "vuesax-linear:video-time": "\n\n\n\n\n\n\n\n", + "vuesax-linear:video-vertical": "\n\n\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:video": "\n\n\n\n\n", + "vuesax-linear:voice-cricle": "\n\n\n\n\n\n\n\n", + "vuesax-linear:voice-square": "\n\n\n\n\n\n\n\n", + "vuesax-linear:volume-cross": "\n\n\n\n\n", + "vuesax-linear:volume-high": "\n\n\n\n\n", + "vuesax-linear:volume-low-1": "\n\n\n\n", + "vuesax-linear:volume-low": "\n\n\n\n", + "vuesax-linear:volume-mute": "\n\n\n", + "vuesax-linear:volume-slash": "\n\n\n\n\n\n\n", + "vuesax-linear:volume-up": "\n\n\n\n\n", + "vuesax-linear:vuesax": "\n\n\n\n\n", + "vuesax-linear:wallet-1": "\n\n\n\n\n\n\n", + "vuesax-linear:wallet-2": "\n\n\n\n\n", + "vuesax-linear:wallet-3": "\n\n\n\n\n\n", + "vuesax-linear:wallet-add-1": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:wallet-add": "\n\n\n\n\n\n\n\n", + "vuesax-linear:wallet-check": "\n\n\n\n\n\n\n", + "vuesax-linear:wallet-minus": "\n\n\n\n\n\n\n\n", + "vuesax-linear:wallet-money": "\n\n\n\n\n\n\n", + "vuesax-linear:wallet-remove": "\n\n\n\n\n\n\n\n", + "vuesax-linear:wallet-search": "\n\n\n\n\n\n\n", + "vuesax-linear:wallet": "\n\n\n\n\n", + "vuesax-linear:wanchain-(wan)-1": "\n\n\n", + "vuesax-linear:wanchain-(wan)": "\n\n\n\n\n\n", + "vuesax-linear:warning-2": "\n\n\n\n\n", + "vuesax-linear:watch-status": "\n\n\n\n\n\n\n\n", + "vuesax-linear:watch": "\n\n\n\n\n\n", + "vuesax-linear:weight-1": "\n\n\n\n\n\n\n", + "vuesax-linear:weight": "\n\n\n\n", + "vuesax-linear:whatsapp": "\n\n\n\n", + "vuesax-linear:wifi-square": "\n\n\n\n\n\n", + "vuesax-linear:wifi": "\n\n\n\n\n\n", + "vuesax-linear:wind-2": "\n\n\n\n\n", + "vuesax-linear:wind": "\n\n\n\n\n", + "vuesax-linear:windows": "\n\n\n\n\n\n", + "vuesax-linear:wing-(wing)": "\n\n\n\n\n", + "vuesax-linear:woman": "\n\n\n\n\n", + "vuesax-linear:xd": "\n\n\n\n\n\n", + "vuesax-linear:xiaomi": "\n\n\n\n\n\n", + "vuesax-linear:xrp-(xrp)": "\n\n\n\n", + "vuesax-linear:youtube": "\n\n\n\n", + "vuesax-linear:zel-(zel)": "\n\n\n\n\n\n", + "vuesax-linear:zoom": "\n\n\n\n\n", + "other:target": "\n\n\n\n\n", + "vuesax-linear:record-plus":"\n\n\n\n\n", + "other:more-square":"\n \n \n\n" +} \ No newline at end of file diff --git a/src/components/DialogVant.vue b/src/components/DialogVant.vue new file mode 100644 index 0000000..f4c9076 --- /dev/null +++ b/src/components/DialogVant.vue @@ -0,0 +1,104 @@ + + + + + diff --git a/src/components/DialogVantOneButton.vue b/src/components/DialogVantOneButton.vue new file mode 100644 index 0000000..27d0812 --- /dev/null +++ b/src/components/DialogVantOneButton.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/src/components/GoldLoading.vue b/src/components/GoldLoading.vue new file mode 100644 index 0000000..a9fe61b --- /dev/null +++ b/src/components/GoldLoading.vue @@ -0,0 +1,36 @@ + + + + + diff --git a/src/components/ListAnim.vue b/src/components/ListAnim.vue new file mode 100644 index 0000000..d091156 --- /dev/null +++ b/src/components/ListAnim.vue @@ -0,0 +1,56 @@ + + + + + + + \ No newline at end of file diff --git a/src/components/TransactionSkeleton.vue b/src/components/TransactionSkeleton.vue new file mode 100644 index 0000000..fe44731 --- /dev/null +++ b/src/components/TransactionSkeleton.vue @@ -0,0 +1,34 @@ + + + + + \ No newline at end of file diff --git a/src/components/bg_main.vue b/src/components/bg_main.vue new file mode 100644 index 0000000..a8d3357 --- /dev/null +++ b/src/components/bg_main.vue @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/src/components/empty.vue b/src/components/empty.vue new file mode 100644 index 0000000..68dfbb7 --- /dev/null +++ b/src/components/empty.vue @@ -0,0 +1,22 @@ + + + + + \ No newline at end of file diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..ac8f335 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,187 @@ +import 'ant-design-vue/dist/antd.less' +import './assets/css/main.less' +import 'virtual:uno.css' +import { computed, createApp, ref, watch } from 'vue' +import { createPinia } from 'pinia' +import '@unocss/reset/tailwind-compat.css' +import VueApexCharts from 'vue3-apexcharts' +import App from './App.vue' +import router from './router' +import { authenticateWithFingerprint, getToken, isIphone, removeToken } from '@/utils' +import { useUserStore } from '@/store/userStore' +import { useWalletStore } from '@/store/walletStore' +import { useFundUserStore } from '@/store/fundStore' +import VueLazyLoad from 'vue3-lazyload' +import { getMe } from '@/api/me' +import type { NavigationGuardNext, RouteLocationNormalized } from 'vue-router' +import { useAuthStore } from '@/store/useAuthStore' + +const app = createApp(App) +app.use(createPinia()) +app.use(VueLazyLoad, { + // options... +}) +app.use(router) +app.use(VueApexCharts) + +const userStore = useUserStore() +const walletStore = useWalletStore() +const fundStore = useFundUserStore() +const authStore = useAuthStore() +const isApple: boolean = isIphone() +let isFirst: boolean = true +let fingerPosition: boolean = false +let timeoutId: ReturnType | null = null +let hasFingerPrint: boolean = false +const userInfo = ref() +// userInfo.value = await getMe() +// const token = getToken() + +const currentRoute = computed(() => { + return router.currentRoute.value.fullPath +}) + +async function start() { + // console.log('ffffffffffffffffffffffffffffffffffffffffff') + if (getToken()) { + // await userStore.getMyInfo() + await walletStore.getLimitedPrice() + await walletStore.getLimitedBuyGold() + await fundStore.getMyFund() + } + +} + +export function setTruth() { + fingerPosition = true +} + +export function setEnableAuthenticate() { + fingerPosition = false +} + + +function goToLogin(to: RouteLocationNormalized, next: NavigationGuardNext) { + if (to.name !== 'login') { + return next({ name: 'login' }) // Redirect to login + } else { + return next() // If already on the login page, don't redirect + } +} + +function goToHome(to: RouteLocationNormalized, next: NavigationGuardNext) { + if (to.name !== 'home') { + return next({ name: 'home' }) // Redirect to login + } else { + return next() // If already on the login page, don't redirect + } +} + +router.beforeEach(async (to, from, next) => { + + authStore.setLoading(true) + console.log(authStore) + if (timeoutId) { + clearTimeout(timeoutId) + } + // Start a new timeout to reset fingerprint after 5 seconds of inactivity + if (from.name !== 'login' || from.name !== undefined) { + console.log(from.name) + timeoutId = setTimeout(async () => { + if (hasFingerPrint) { + fingerPosition = false + /* fingerPosition = await authenticateWithFingerprint() + if (!fingerPosition) { + goToLogin(to, next) + }*/ + // isFirst = true; + console.log('Fingerprint authentication reset after 5 seconds of inactivity') + } + }, 180000) // 5 seconds + } + // If it's the first time the navigation guard runs + if (isFirst) { + isFirst = false // Set isFirst to false after the first check + + // If the user has a token + if (getToken()) { + await userStore.getMyInfo() + const finger_print =userStore.userInfo.finger_print + console.log(finger_print) + // const { finger_print } = await getMe() + hasFingerPrint = finger_print + // If on an Apple device and fingerprint exists + if (isApple && finger_print) { + removeToken() // Remove token if fingerprint is found + goToLogin(to, next) // Redirect to login + } + // If not an Apple device and fingerprint exists + else if (!isApple && finger_print) { + // goToLogin(to, next) + fingerPosition = await authenticateWithFingerprint() + + if (fingerPosition) { + // goToHome(to, next) // Redirect to home if fingerprint is authenticated + } else { + goToLogin(to, next) // Redirect to login if authentication fails + } + } else { + console.log('salam') + if (from.path === '/') { + // goToHome(to, next) + } + if(to.name=="login"){ + goToHome(to, next) + } + return next() + } + } else { + // If no token, handle redirect to login or allow access to login or 404 + if (['login', '404'].includes(to.name as string)) { + return next() // Allow access to login or 404 + } + goToLogin(to, next) // Redirect to login if no token + } + } + // For subsequent navigations after the first check + else { + // If the user has passed fingerprint authentication + if (fingerPosition) { + if (getToken()) { + if (to.name === 'login') { + return next({ name: from.name || 'home' }) // Redirect to home if trying to access login after authentication + } + return next() // Proceed to the intended route + } else { + // If no token, ensure proper redirection to login or 404 + if (['login', '404'].includes(to.name as string)) { + return next() // Allow access to login or 404 + } + return next({ name: 'login' }) + } + } + // If fingerprint authentication failed or was not done + else { + if (getToken() && !hasFingerPrint) { + next() + } else { + goToLogin(to, next) + } + /* if (to.name !== 'login') { + return next({ name: 'login' }) // Redirect to login + } else { + return next() // If already on the login page, don't redirect + }*/ + /* console.log('sssssssssssssssssssssssss') + return next({ name: 'login' })*/ + } + } +}) + +app.mount('#app') +// if (currentRoute.value !== '/') { +// await start() +// } +watch(currentRoute, async () => userStore.userInfo ? '' : await start()) + + diff --git a/src/mainConfig.ts b/src/mainConfig.ts new file mode 100644 index 0000000..a194eee --- /dev/null +++ b/src/mainConfig.ts @@ -0,0 +1,25 @@ + +/** base config **/ +/** api document **/ +// const baseUploadURL: string = '/site/file' +// const uploadURL: string = baseURL + baseUploadURL +// const baseURLStorage: string = baseURL + '/v1' +// const version: string = pkg.version + +// const appName = { fa: 'بدون نام', en: 'noname' } +/** Defining the secret key for crypto-js **/ +// const secretKey: string = 'pwd@1234' + +/* +export { + baseURL, + // prefixCls, + // version, + tokenName, + // appName, + // secretKey, + // uploadURL, + // baseURLStorage, + // baseUploadURL +} +*/ diff --git a/src/mainTEst.ts b/src/mainTEst.ts new file mode 100644 index 0000000..c0df4ed --- /dev/null +++ b/src/mainTEst.ts @@ -0,0 +1,172 @@ +/* +import 'ant-design-vue/dist/antd.less' +import './assets/css/main.less' +import 'virtual:uno.css' +import { computed, createApp, ref, watch } from 'vue' +import { createPinia } from 'pinia' +import '@unocss/reset/tailwind-compat.css' +import VueApexCharts from 'vue3-apexcharts' +import App from './App.vue' +import router from './router' +import { authenticateWithFingerprint, getIsActiveFingerprint, getToken, isIphone, removeToken } from '@/utils' +import { useUserStore } from '@/store/userStore' +import { useWalletStore } from '@/store/walletStore' +import { useFundUserStore } from '@/store/fundStore' +import VueLazyLoad from 'vue3-lazyload' +import { getMe } from '@/api/me' +import type { NavigationGuardNext, RouteLocationNormalized } from 'vue-router' +import { useAuthStore } from '@/store/useAuthStore' +import { message } from 'ant-design-vue' + +const app = createApp(App) +app.use(createPinia()) +app.use(VueLazyLoad, { + // options... +}) +app.use(router) +app.use(VueApexCharts) + +const userStore = useUserStore() +const walletStore = useWalletStore() +const fundStore = useFundUserStore() +const authStore = useAuthStore() +const isApple: boolean = isIphone() +let isFirst: boolean = true +let fingerPosition: boolean = false +let timeoutId: ReturnType | null = null +let hasFingerPrint: boolean = false +const userInfo = ref() +// userInfo.value = await getMe() +// const token = getToken() + +const currentRoute = computed(() => { + return router.currentRoute.value.fullPath +}) + +async function start() { + // console.log('ffffffffffffffffffffffffffffffffffffffffff') + if (getToken()) { + await userStore.getMyInfo() + await walletStore.getLimitedPrice() + await walletStore.getLimitedBuyGold() + await fundStore.getMyFund() + } + +} + +export function setTruth() { + fingerPosition = true +} + +export function setEnableAuthenticate() { + fingerPosition = false +} + + +function goToLogin(to: RouteLocationNormalized, next: NavigationGuardNext) { + if (to.name !== 'login') { + return next({ name: 'login' }) // Redirect to login + } else { + return next() // If already on the login page, don't redirect + } +} + +function goToHome(to: RouteLocationNormalized, next: NavigationGuardNext) { + if (to.name !== 'home') { + return next({ name: 'home' }) // Redirect to login + } else { + return next() // If already on the login page, don't redirect + } +} + +export function setFingerPosition(val) { + fingerPosition = val +} + +export function setFingerTimeOut(to: RouteLocationNormalized){ + timeoutId = setTimeout(async () => { + if (hasFingerPrint) { + fingerPosition = false + // console.log('Fingerprint authentication reset after 5 seconds of inactivity'); + await router.push({ name: 'login' }) + if (to.name !== 'login') { + message.warn('شما مدت زیادی با ثمین گلد کار نکردید، لطفا دوباره وارد شوید.') + } + } + }, 10000) // 3 minutess +} + +router.beforeEach(async (to, from, next) => { + const authStore = useAuthStore() + + // Set loading state to true + authStore.setLoading(true) + + if (timeoutId) { + clearTimeout(timeoutId) + } + + setFingerTimeOut(to) + + if (isFirst) { + isFirst = false + + if (getToken()) { + const finger_print = getIsActiveFingerprint() + hasFingerPrint = finger_print + + if (isApple && finger_print) { + removeToken() + authStore.setLoading(false) // Remove loading + return goToLogin(to, next) + } else if (!isApple && finger_print) { + // fingerPosition = await authenticateWithFingerprint(); + return goToLogin(to, next) + /!* authStore.setLoading(false); // Remove loading + if (fingerPosition) { + return goToHome(to, next); + } else { + return goToLogin(to, next); + }*!/ + } else { + authStore.setLoading(false) // Remove loading + return next() + } + } else { + authStore.setLoading(false) // Remove loading + if (['login', '404'].includes(to.name)) { + return next() + } + return goToLogin(to, next) + } + } else { + authStore.setLoading(false) // Remove loading + if (fingerPosition) { + if(getIsActiveFingerprint()){ + hasFingerPrint = true + } + if (getToken()) { + if (to.name === 'login') { + return goToHome(to, next) + } + return next() + } else { + if (['login', '404'].includes(to.name)) { + return next() + } + return next({ name: 'login' }) + } + } else { + if (getToken() && !hasFingerPrint) { + return next() + } else { + return goToLogin(to, next) + } + } + } +}) +app.mount('#app') +// if (currentRoute.value !== '/') { +// await start() +// } +watch(currentRoute, async () => userStore.userInfo ? '' : await start())*/ diff --git a/src/models/PriceTrigger.ts b/src/models/PriceTrigger.ts new file mode 100644 index 0000000..e912873 --- /dev/null +++ b/src/models/PriceTrigger.ts @@ -0,0 +1,8 @@ +export interface PriceTrigger { + id?: number + target_price: string + price_condition: string + action: string + is_active: boolean + created_at?: string +} \ No newline at end of file diff --git a/src/models/SelectItem.ts b/src/models/SelectItem.ts new file mode 100644 index 0000000..5348ad6 --- /dev/null +++ b/src/models/SelectItem.ts @@ -0,0 +1,4 @@ +export interface SelectItem { + value: string + key: string | number +} \ No newline at end of file diff --git a/src/models/address.ts b/src/models/address.ts new file mode 100644 index 0000000..9d28c3c --- /dev/null +++ b/src/models/address.ts @@ -0,0 +1,12 @@ +export interface Address { + id?: number + city?: string + province?: string + phone?: string + address?: string + zip?: string + customer_id?: number + default_address?: boolean + created_at?: string | null + updated_at?: string | null +} \ No newline at end of file diff --git a/src/models/const.ts b/src/models/const.ts new file mode 100644 index 0000000..1477818 --- /dev/null +++ b/src/models/const.ts @@ -0,0 +1,6 @@ +export interface Const { + key?: number | string | undefined + const_id?: number | undefined + title_fa?: string | undefined + value?: string | number | undefined +} diff --git a/src/models/earnMoney.ts b/src/models/earnMoney.ts new file mode 100644 index 0000000..a9a0508 --- /dev/null +++ b/src/models/earnMoney.ts @@ -0,0 +1,9 @@ +import type { User } from '@/models/login' +import type { Gifts } from '@/models/gifts' + +export interface EarnMoney{ + users:[] + gifts:[] + usersSum: number + giftsSum: number +} \ No newline at end of file diff --git a/src/models/fund.ts b/src/models/fund.ts new file mode 100644 index 0000000..3d193c1 --- /dev/null +++ b/src/models/fund.ts @@ -0,0 +1,16 @@ +import type {Wallet} from '@/models/wallet'; + +export interface Fund { + id?: number, + title?: string, + file_id?: number, + customer_id?: number, + created_at?: string, + updated_at?: string, + deleted_at?: string, + wallet?: Wallet[] | Wallet +} +export interface FundTransaction { + fund_id?: number + value?: number +} \ No newline at end of file diff --git a/src/models/gifts.ts b/src/models/gifts.ts new file mode 100644 index 0000000..8e76602 --- /dev/null +++ b/src/models/gifts.ts @@ -0,0 +1,19 @@ +export interface Gifts{ + id: number + customer_id: number + order_id: number + customer_to_id: number + user_id: number + wallet: null + transaction_id: number + cash: number + note: string + type: number + gold: number + balance_cash: number + balance_gold: number + withdraw_id: number + updated_at: string + deleted_at: string + created_at: string +} \ No newline at end of file diff --git a/src/models/gold.ts b/src/models/gold.ts new file mode 100644 index 0000000..1578a63 --- /dev/null +++ b/src/models/gold.ts @@ -0,0 +1,8 @@ +export interface Gold { + goldCash?: number | null, + goldValue?: number | null, + percentWallet?: number, + method?:string, + goldVazn?: number | null + +} \ No newline at end of file diff --git a/src/models/home.ts b/src/models/home.ts new file mode 100644 index 0000000..0d8cf40 --- /dev/null +++ b/src/models/home.ts @@ -0,0 +1,19 @@ +/*export interface Series { + x: string + y: Array +}*/ +export interface Series { + +} + +/* + export interface Chart { + Array +} +*/ + +export interface Price { + sell: number + buy: number + price_last: number +} \ No newline at end of file diff --git a/src/models/login.ts b/src/models/login.ts new file mode 100644 index 0000000..c3781bf --- /dev/null +++ b/src/models/login.ts @@ -0,0 +1,64 @@ +/* +export interface UserMobile { + mobile: string +} +export interface UserPassword { + password: string +} + +export interface Token { + access_token: string +} +*/ +import type {PWallet, Wallet, Wallets} from '@/models/wallet' + +export interface User { + id: number; + fname: string; + lname: string; + name: string; + active: boolean; + mobile: string; + avatar_id?: any; + last_seen_at: string; + default_address_id?: any; + sts?: any; + gold_sum?: number + type: number; + total_transaction: number; + orders_count: number; + birth_date: string; + shop_name: string; + phone_number?: any; + city?: any; + province?: any; + n_code: string; + is_archive: boolean; + trade_active: number; + referral_id: string; + gram: number; + is_legal: number; + created_at: string; + updated_at: string; + access_token?: string; + deleted_at?: any; + wallet: Wallet; + pwallet:PWallet; + wallets: Wallets + + finger_print: boolean + gold: number; +} + +export interface Login { + id?: number + mobile?: string + password?: string + token?: string + provider: string +} + +export interface Password{ + password?: string +} + diff --git a/src/models/order.ts b/src/models/order.ts new file mode 100644 index 0000000..84fd9d9 --- /dev/null +++ b/src/models/order.ts @@ -0,0 +1,23 @@ +export interface Order { + direction?: number + amount?: number + price?: number + id?: number + customer_id?: number + sts?: number + sts_str?: string + payment_sts?: number + payment_amount?: number + service_charge_price?: number + total_fee?: number + total_price?: number + total_price_original?: number + fee?: number + description?: string + created_at?: string + updated_at?: string + price_original?: number + "product_id"?:number + "method"?:string + "number"?:number +} \ No newline at end of file diff --git a/src/models/physicalreceive.ts b/src/models/physicalreceive.ts new file mode 100644 index 0000000..d3394a3 --- /dev/null +++ b/src/models/physicalreceive.ts @@ -0,0 +1,33 @@ +import type {Address} from "@/models/address"; +import type {Transaction} from "@/models/transaction"; + +export interface Physicalreceive { + id: number + customer_id: number + user_id: number + cash: number + gold: number + note: string + tracked_number: number + zify_code: number + date_at: any + sts: number + type: any + bank_account_id: number + address_id: number + priority: number + created_at: string + updated_at: string + sts_str: string + daj: any + customer: Customer + bank_account: any + address: Address + transaction: Transaction[] + +} +export interface Customer { + id: number + name: string + mobile: string +} \ No newline at end of file diff --git a/src/models/products.ts b/src/models/products.ts new file mode 100644 index 0000000..9457966 --- /dev/null +++ b/src/models/products.ts @@ -0,0 +1,56 @@ +import type {Wallet} from "@/models/wallet"; + +export interface Product { + id: number + img: string | undefined + title: string + amount: any + metal_id: any + file_id: any + unit: string + active: boolean + show: boolean + open_sell: boolean + open_buy: boolean + group_type:string + percent_fee_buy: number | undefined + percent_fee_sell: number | undefined + cash_fee_buy: number | undefined + cash_fee_sell: number | undefined + reading_method: any + created_at: any + updated_at: any + deleted_at: any + price?:number | undefined + sellPrice?:number | undefined + wallet: Wallet +} + +export interface PInventory { + id: number + title: string + amount: any + metal_id: any + file_id: any + active: boolean + show: boolean + open_sell: boolean + open_buy: boolean + group_type:string + percent_fee_buy: number + percent_fee_sell: number + cash_fee_buy: number + cash_fee_sell: number + reading_method: any + created_at: any + updated_at: any + deleted_at: any + price?:number + unit?: string + wallet:Wallet +} + +export interface CountPInventory { + count: number + product: PInventory +} \ No newline at end of file diff --git a/src/models/table.ts b/src/models/table.ts new file mode 100644 index 0000000..9b33342 --- /dev/null +++ b/src/models/table.ts @@ -0,0 +1,32 @@ +export interface TableOutput { + count: number + page: number + limit: number + rows: T[] +} + +export interface TableEngineOutput { + rows: T[] + query: { + filters: [] + filtersOpt: null | any + key: any | null + limit: number + page: number + search: string + select: any | null + sort: any | null + total: number + } +} + +export interface TableInput { + page?: number + limit?: number +} + +export interface TableEngineInput { + page: number + limit: number + filters: any[] +} diff --git a/src/models/transaction.ts b/src/models/transaction.ts new file mode 100644 index 0000000..5fd34ab --- /dev/null +++ b/src/models/transaction.ts @@ -0,0 +1,52 @@ +import type {Order} from "@/models/order"; +import type { Wallet } from '@/models/wallet' + +export interface Transaction { + active?: boolean + caj?: string + cash?: number + created_at?: string + customer_id?: number + expire_at?: string + fund_id?: number + gold?: number + unit: string + hash?: string + id?: number + note?: null + title: string + order_id?: number + transaction_type?: string + type?: number + type_str?: string + updated_at?: string + value?: number + sts_str?: string + order?: Order + withdraw?: Order + card_id?: number|string + eaj?: string + end_at?: string + send_receipt?: string + balance_cash?: number + balance_gold?: number + percentWallet?: number + wallet?: Wallet + otp?: string + tracked_number: number +} + +export interface Withdraw { + id: number; + customer_id: number; + user_id?: any; + cash: number; + gold?: any; + tracked_number?: any; + date_at?: any; + sts: number; + created_at: string; + updated_at: string; + sts_str: string; +} + diff --git a/src/models/wallet.ts b/src/models/wallet.ts new file mode 100644 index 0000000..98b1e6f --- /dev/null +++ b/src/models/wallet.ts @@ -0,0 +1,80 @@ +/* +export interface deposit { + price?: number +} +export interface endurance { + price?: number + percentWallet?: number +}*/ + +/*export interface Wallet { + price?: number + percentWallet?: number +}*/ + +import type {Product} from "@/models/products"; + +export interface Wallet { + owner: number, + treasure: number, + treasure_sum: number, + id: number, + gold: number, + gold_block: number, + cash: number + gold_sum: number + product: Product + cash_block: number + count_cash: number + count_cash_wallet: number + count_cash_wallets: number + count_gold: number + count_gold_wallet: number + count_gold_wallets: number + count_product: number +} +export interface Wallets { + cash : number + created_at : string + fund_id : null | number + gold : number + hash : string + id : number + number : number + owner : number + owner_type : number + product : null + product_id : null | number + updated_at : string +} + +export interface PWallet { + id: number + owner_type: number + created_at: string + updated_at: string + owner: number + cash: number + hash: string + gold: number + fund_id: any + product_id: number + number: number + product: Product +} + +export interface Test { + price?: number, + percentWallet: number +} + +export interface Card { + id?: number + birth_date: number + cart_number?: string + shaba_number?: string + bank_name?: string + account_number?: string + sts?: number + sts_str?: string +} \ No newline at end of file diff --git a/src/router/index.ts b/src/router/index.ts new file mode 100644 index 0000000..d12e27b --- /dev/null +++ b/src/router/index.ts @@ -0,0 +1,203 @@ +import {createRouter, createWebHistory} from 'vue-router' + +const router = createRouter({ + history: createWebHistory(import.meta.env.BASE_URL), + routes: [ + { + path: `/login`, + name: 'login', + component: () => import('../views/login/index.vue') + }, + /* { + path: '/', + name: 'null', + redirect: {name: 'home'}, + // component: () => import('../views/login/index.vue') + },*/ + { + path: `/`, + name: 'main', + redirect: {name: 'login'}, + component: () => import('../views/base/index.vue'), + children: [ + { + path: 'home', + name: 'home', + component: () => import('../views/base/home/index.vue') + }, + { + path: 'gold', + name: 'gold', + component: () => import('@/views/base/gold/index.vue') + }, + { + path: 'buyProduct', + name: 'buyProduct', + component: () => import('@/views/base/products/index.vue') + }, + { + path: 'transactions', + name: 'transactions', + component: () => import('@/views/base/transactions/index.vue') + }, + { + path: 'wallet', + name: 'wallet', + component: () => import('../views/base/wallet/index.vue') + }, + { + path: 'user', + name: 'user', + component: () => import('../views/base/user/index.vue') + }, + { + path: 'about', + name: 'about', + component: () => import('@/views/base/about/index.vue') + }, + { + path: 'notifyTrigger', + name: 'notifyTrigger', + component: () => import('@/views/base/priceTrigger/index.vue') + }, + { + path: 'address', + name: 'address', + component: () => import('@/views/base/address/index.vue') + }, + { + path: 'physicalReceive', + name: 'physicalReceive', + redirect:{name: 'list'}, + component: () => import('@/views/base/physicalReceive/index.vue'), + children:[ + { + path: '', + name: 'list', + component: () => import('@/views/base/physicalReceive/components/RequestList.vue') + }, + { + path: 'new', + name: 'new', + component: () => import('@/views/base/physicalReceive/components/NewRequest.vue') + }, + ] + }, + { + path: 'rules', + name: 'rules', + component: () => import('@/views/base/rules/index.vue') + }, + { + path: 'permissions', + name: 'permissions', + component: () => import('@/views/base/rules/permissions/permissions.vue') + }, + { + path: 'earnMoney', + name: 'earnMoney', + component: () => import('@/views/base/earnMoney/index.vue') + }, + { + path: 'fund', + name: 'fund', + component: () => import('@/views/base/fund/index.vue'), + children: [] + }, + { + path: 'fund/:id', + name: 'fund_info', + component: () => import('@/views/base/fund/info/index.vue') + }, + { + path: 'fund/add', + name: 'fund_add', + component: () => import('@/views/base/fund/newFund/index.vue') + }, + ] + }, + { + path: '/:pathMatch(.*)*', + name: 'notFound', + redirect: {name: '404'}, + meta: { + hideMenu: true + } + }, + { + path: `/404`, + name: '404', + component: () => import('../views/base/404.vue') + }, + + /* { + path: `/single/login`, + name: 'login', + component: () => import('../views/login/index.vue') + }, + { + path: `/single/`, + name: 'single_main', + redirect: {name: 'login'}, + component: () => import('../views/base/index.vue'), + children: [ + { + path: 'home', + name: 'home', + component: () => import('../views/base/home/index.vue') + }, + { + path: 'gold', + name: 'gold', + component: () => import('@/views/base/gold/index.vue') + }, + { + path: 'transactions', + name: 'transactions', + component: () => import('@/views/base/transactions/index.vue') + }, + { + path: 'wallet', + name: 'wallet', + component: () => import('../views/base/wallet/index.vue') + }, + { + path: 'user', + name: 'user', + component: () => import('../views/base/user/index.vue') + }, + { + path: 'fund', + name: 'fund', + component: () => import('@/views/base/fund/index.vue'), + children: [] + }, + { + path: 'fund/:id', + name: 'fund_info', + component: () => import('@/views/base/fund/info/index.vue') + }, + { + path: 'fund/add', + name: 'fund_add', + component: () => import('@/views/base/fund/newFund/index.vue') + }, + ] + },*/ + ] +}) + +router.afterEach((to, from) => { + /* const toDepth = to.path.split('/').length + const fromDepth = from.path.split('/').length + to.meta.transition = toDepth < fromDepth ? 'slide-right' : 'slide-left'*/ + /* if (to.name === 'home' && (from.name === 'wallet' || from.name === 'transactions' || from.name === 'gold')) { + to.meta.transition = 'slide-left' + } + if (to.name === 'wallet' && (from.name === 'home' || from.name === 'transactions' || from.name === 'gold')) { + to.meta.transition = 'slide-right' + }*/ + // console.log(to) +}) + +export default router diff --git a/src/store/fundStore.ts b/src/store/fundStore.ts new file mode 100644 index 0000000..ea8f009 --- /dev/null +++ b/src/store/fundStore.ts @@ -0,0 +1,39 @@ +import { type ComputedRef, ref } from 'vue' +// import { get } from 'lodash' +import {defineStore} from "pinia"; +import {getMe} from "@/api/me"; +import {getFundTable} from "@/api/fund"; +import type {Fund} from "@/models/fund"; +import type {TableOutput} from "@/models/table"; +import { getProductInventory } from '@/api/products' +export const useFundUserStore = defineStore('fund', () => { + const myFunds = ref | undefined>(undefined) + async function getMyFund() { + try { + console.log('fff') + myFunds.value = await getProductInventory() + return myFunds.value + } catch (e) { + console.log(e) + } + } + +/* const permissions: ComputedRef = computed(() => { + const permissions: string[] = get(userInfo.value, 'permission', []) + const excludes: string[] = get(userInfo.value, 'exclude', []) + return permissions.filter((item) => !excludes.includes(item)) + })*/ + +/* + function canAccess(permissionKey: string) { + if (isAdmin.value) return true + return permissions.value.includes(permissionKey) + } +*/ +/* + const isAdmin = computed(() => { + return userInfo.value?.is_admin + })*/ + + return { getMyFund, myFunds/* permissions, canAccess, isAdmin*/ } +}) diff --git a/src/store/useAuthStore.ts b/src/store/useAuthStore.ts new file mode 100644 index 0000000..ed01333 --- /dev/null +++ b/src/store/useAuthStore.ts @@ -0,0 +1,12 @@ +import { defineStore } from 'pinia' + +export const useAuthStore = defineStore('auth', { + state: () => ({ + loading: false, + }), + actions: { + setLoading(isLoading) { + this.loading = isLoading + } + } +}) \ No newline at end of file diff --git a/src/store/userStore.ts b/src/store/userStore.ts new file mode 100644 index 0000000..9268125 --- /dev/null +++ b/src/store/userStore.ts @@ -0,0 +1,60 @@ +import { computed, ref } from 'vue' +// import { get } from 'lodash' +import { defineStore } from 'pinia' +import { getMe } from '@/api/me' +import type { User } from '@/models/login' +import { useWalletStore } from '@/store/walletStore' +import { setFingerPrint } from '@/utils' +import type { PWallet } from '@/models/wallet' + + +export const useUserStore = defineStore('user', () => { + const userInfo = ref(undefined) + const walletStore = useWalletStore() + const productWallet = ref(undefined) + let isFirst = true + + async function getMyInfo() { + try { + userInfo.value = await getMe() + setFingerPrint(userInfo.value.finger_print.toString()) + productWallet.value = userInfo.value.pwallet + // return userInfo.value + walletStore.walletInfo = userInfo.value.wallet + } catch (e) { + console.log(e) + } + } + + function removeInformation() { + userInfo.value = undefined + } + + const isSingle = computed(() => userInfo.value?.type === 2) + + /* const permissions: ComputedRef = computed(() => { + const permissions: string[] = get(userInfo.value, 'permission', []) + const excludes: string[] = get(userInfo.value, 'exclude', []) + return permissions.filter((item) => !excludes.includes(item)) + })*/ + + /* + function canAccess(permissionKey: string) { + if (isAdmin.value) return true + return permissions.value.includes(permissionKey) + } + */ + /* + const isAdmin = computed(() => { + return userInfo.value?.is_admin + })*/ + + return { + userInfo, + getMyInfo, + removeInformation, + isSingle, + isFirst, + productWallet/* permissions, canAccess, isAdmin*/ + } +}) diff --git a/src/store/walletStore.ts b/src/store/walletStore.ts new file mode 100644 index 0000000..52c678b --- /dev/null +++ b/src/store/walletStore.ts @@ -0,0 +1,58 @@ +import { type ComputedRef, ref } from 'vue' +import {defineStore} from "pinia"; +import {getMe} from "@/api/me"; +import type {User} from "@/models/login"; +import type {Wallet} from "@/models/wallet"; +import {getWallet} from "@/api/wallet"; +import type {Const} from "@/models/const"; +import {getConstByKey} from "@/api/const"; +export const useWalletStore = defineStore('wallet', () => { + const walletInfo = ref(undefined) + const limitedPrice = ref() + const limitedBuyGold = ref() + + async function getMyWallet() { + try { + walletInfo.value = await getWallet() + return walletInfo.value + } catch (e) { + console.log(e) + } + } + async function getLimitedPrice(){ + try { + limitedPrice.value = await getConstByKey('limited_price') + return limitedPrice.value + }catch (e) { + console.log(e) + } + } + + async function getLimitedBuyGold(){ + try { + limitedBuyGold.value = await getConstByKey('first_customer_wallet_value') + return limitedBuyGold.value + }catch (e) { + console.log(e) + } + } + +/* const permissions: ComputedRef = computed(() => { + const permissions: string[] = get(userInfo.value, 'permission', []) + const excludes: string[] = get(userInfo.value, 'exclude', []) + return permissions.filter((item) => !excludes.includes(item)) + })*/ + +/* + function canAccess(permissionKey: string) { + if (isAdmin.value) return true + return permissions.value.includes(permissionKey) + } +*/ +/* + const isAdmin = computed(() => { + return userInfo.value?.is_admin + })*/ + + return { walletInfo, getMyWallet, getLimitedPrice, getLimitedBuyGold, limitedPrice, limitedBuyGold/* permissions, canAccess, isAdmin*/ } +}) diff --git a/src/sw.ts b/src/sw.ts new file mode 100644 index 0000000..2417552 --- /dev/null +++ b/src/sw.ts @@ -0,0 +1,7 @@ +import { precacheAndRoute } from 'workbox-precaching' +declare let self: ServiceWorkerGlobalScope +self.addEventListener('message', (event) => { + if (event.data && event.data.type === 'SKIP_WAITING') self.skipWaiting() +}) +// self.__WB_MANIFEST is default injection point +precacheAndRoute(self.__WB_MANIFEST) diff --git a/src/themeConfig.ts b/src/themeConfig.ts new file mode 100644 index 0000000..839d476 --- /dev/null +++ b/src/themeConfig.ts @@ -0,0 +1,27 @@ +import pkg from '../package.json' +import colors from './baseColor.json' + +/** base config **/ +/** api document **/ +// export const baseURL: string = 'https://api.gholaktala.ir/' +export const baseURL: string = 'https://vahidgold.com/api/' +// export const baseURL: string = 'https://api-gholaktala.z23.ir/' +// const baseUploadURL: string = '/site/file' +// const uploadURL: string = baseURL + baseUploadURL +// const baseURLStorage: string = baseURL + '/v1' +const prefixCls: string = 'noname' +// const version: string = pkg.version +// const tokenName: string = 'gholaktala_app_token' +const tokenName: string = 'samingold_app_token' + +const baseButtonIconSize = '24' +// const appName = { fa: 'بدون نام', en: 'noname' } +/** Defining the secret key for crypto-js **/ +// const secretKey: string = 'pwd@1234' + +export { + prefixCls, + colors, + baseButtonIconSize, + tokenName +} diff --git a/src/utils/index.ts b/src/utils/index.ts new file mode 100644 index 0000000..a3b6270 --- /dev/null +++ b/src/utils/index.ts @@ -0,0 +1,122 @@ +import { tokenName } from '@/themeConfig' + +import { ref } from 'vue' + +export const loading = ref(false) +export const loadingMore = ref(false) +const userInfo = ref() + +function setToken(token: string | undefined) { + return localStorage.setItem(tokenName, token) +} + +function setFingerPrint(val: string | undefined) { + return localStorage.setItem('finger', val) +} + +function getToken() { + return localStorage.getItem(tokenName) +} + +function getIsActiveFingerprint() { + return localStorage.getItem('finger') === 'true' +} + +export async function authenticateWithFingerprint() { + + + const challenge = new Uint8Array(32) + window.crypto.getRandomValues(challenge) + + const createOptions = { + challenge, + rp: { name: 'Samingold' }, + user: { + id: Uint8Array.from('user-id', c => c.charCodeAt(0)), + name: 'Samin Gold', + displayName: 'Samin Gold' + }, + pubKeyCredParams: [{ type: 'public-key', alg: -7 }], + authenticatorSelection: { + authenticatorAttachment: 'platform', + userVerification: 'required' + }, + timeout: 60000, + attestation: 'direct' + } + + try { + const credential = await navigator.credentials.create({ publicKey: createOptions }) + console.log('Credential با موفقیت ایجاد شد!') + + const credentialId = btoa(String.fromCharCode(...new Uint8Array(credential.rawId))) + + // بازیابی توکن از localStorage + const token = localStorage.getItem('samingold_app_token') + + if (!token) { + console.warn('توکن پیدا نشد، عملیات متوقف شد.') + return false + } + + // Success, proceed with login using token + // Perform your login action here + return true + + } catch (error) { + const errorMessage = error.name === 'NotAllowedError' + ? 'احراز هویت لغو شد یا دسترسی مجاز نبود.' + : 'عملیات ناموفق بود. لطفاً دوباره امتحان کنید.' + console.error(errorMessage, error) + return false + } +} + + +function removeToken() { + return localStorage.removeItem(tokenName) +} + +function removeFingerPrint() { + return localStorage.removeItem('finger') +} + +/*const userType = computed(()=>{ + console.log('salam',router.currentRoute.value.fullPath) + if (router.currentRoute.value.fullPath.split('/')[1] === 'customer') return 'customer' + else return 'user' +})*/ + +function URLUserType() { + /* console.log('salam', router.currentRoute.value.fullPath.split('/')) + console.log('salam', router.currentRoute.value.fullPath)*/ + /* console.log('salam', location.host.split('.')[0] === 'app') + console.log('salam', location.host) + console.log('salam', location.host.split('.'))*/ + if (location.host.split('.')[0] === 'app') return 'single' + else return 'customer' +} + +function toFixedDownThreeChar(num: number) { + return Math.floor(num * 1000) / 1000 +} + +function isIphone() { + const userAgent = navigator.userAgent.toLowerCase() + + // const isAndroid = /Android/.test(userAgent); + + return /iPhone/.test(userAgent) +} + +export { + getToken, + setToken, + removeToken, + URLUserType, + toFixedDownThreeChar, + isIphone, + removeFingerPrint, + getIsActiveFingerprint, + setFingerPrint +} diff --git a/src/utils/inputRules.ts b/src/utils/inputRules.ts new file mode 100644 index 0000000..3ae00a3 --- /dev/null +++ b/src/utils/inputRules.ts @@ -0,0 +1,245 @@ +/* +export function inputRules(title?: string) { + if (title) { + return [required(title)] + } else { + return [required] + } +} + +export function inputLenRules(len: number, title?: string) { + if (title) { + return [ + required(title), + lenthValidation(len) + ] + } else { + return [ + required, + lenthValidation(len) + ] + } +} +*/ + +/*export const persianValidation = computed(() => { + const temp = inputRules() + temp.push({ pattern: /^[A-Za-z]*$/, message: 'فقط حروف انگلیسی مجاز است' }) + return temp +})*/ + +import {computed, ref} from 'vue' +import type {Rule} from 'ant-design-vue/es/form' +import {useWalletStore} from "@/store/walletStore"; + +export const mobileValidation = (title?: string) => { + return {len: 11, message: `شماره همراه باید 11 رقم باشد`} +} + +export const required = (title?: string) => { + if (title) { + return {required: true, message: `پر کردن ${title} الزامی است`} + } else { + return {required: true, message: `پر کردن مورد بالا الزامی است`} + } +} +// function checkCodeMeli(code) +// { +// +// let L=code.length; +// if(L<8 || parseInt(code,10)==0) return false; +// code=('0000'+code).substr(L+4-10); +// if(parseInt(code.substr(3,6),10)==0) return false; +// let c=parseInt(code.substr(9,1),10); +// let s=0; +// for(let i=0;i<9;i++) +// s+=parseInt(code.substr(i,1),10)*(10-i); +// s=s%11; +// return (s<2 && c==s) || (s>=2 && c==(11-s)); +// +// } +export const cardNumberValidation = (title?: string) => { + return { len: 16, message: `شماره کارت باید 16 رقم باشد` } +} + +const isValidNationalCode = (code) => { + if (code.length !== 10 || /(\d)(\1){9}/.test(code)) return false + + let sum = 0, + chars = code.split(''), + lastDigit, + remainder + + for (let i = 0; i < 9; i++) sum += +chars[i] * (10 - i) + + remainder = sum % 11 + lastDigit = remainder < 2 ? remainder : 11 - remainder + + return +chars[9] === lastDigit +} +export const requireNationalCode = (code?: string) => { + return {required: true, validator: validateNCode, trigger: 'change'} +} + +async function validateNCode(rule: Rule, value: any) { + if (!value) { + return Promise.reject('وارد کردن کد ملی الزامیست') + } + if (isValidNationalCode(value)) return Promise.resolve() + else return Promise.reject('کد ملی وارد شده نامعتبر است') +} + +export function inputLenRules(len: number, title?: string) { + if (title) { + return [ + {required: true, message: `پر کردن ${title} الزامی است`}, + {len: len, message: `تعداد کاراکتر باید ${len} عدد باشد`} + ] + } else { + return [ + {required: true, message: 'پر کردن مورد بالا الزامی است'}, + {len: len, message: `تعداد کاراکتر باید ${len} عدد باشد`} + ] + } +} + +export const persianValidation = computed(() => { + return { + pattern: /^[A-Za-z]*$/, + message: 'فقط حروف انگلیسی مجاز است' + } +}) + +export const isValidPersian = () => { + return { + pattern: /^[\u0600-\u06FF\s]+$/, + message: 'فقط حروف فارسی مجاز است' + } +}; + +export const lengthValidation = (len: number) => { + return {len: len, message: `تعداد کاراکتر باید ${len} عدد باشد`} +} + +export const justNumber = () => { + return { + required: true, + type: 'regexp', + pattern: /\d+/g, + message: 'لطفا اطلاعات را به صورت عدد و نقطه وارد کنید' + } +} +const walletCash = useWalletStore() +let priceP = 0 +let methodP = 'cash' +let amountP =0 +let isBuyP=true +let NumP=0 +const checkNumber = async (_rule: Rule, value: number) => { + + + if (!value) { + return Promise.reject('تعداد محصول را مشخص کنید'); + } + if (value % 1 !== 0) { + return Promise.reject('استفاده از اعداد اعشاری مجاز نمی باشد') + } +if (isBuyP){ + if (!walletCash?.walletInfo?.cash && methodP == 'cash'){ + return Promise.reject('موجودی کیف پول ناکافی است') + } + if (!walletCash?.walletInfo?.gold && methodP == 'gold'){ + return Promise.reject('موجودی کیف طلا ناکافی است') + } + if (priceP * value > walletCash?.walletInfo?.cash && methodP == 'cash') + return Promise.reject('موجودی کیف پول ناکافی است') + if (amountP * value > walletCash?.walletInfo?.gold && methodP == 'gold') + return Promise.reject('موجودی کیف طلا ناکافی است') + else + return Promise.resolve(); +}else { + if (value > NumP) + return Promise.reject('موجودی محصول ناکافی است') + else + return Promise.resolve(); +} + +} +export const justNumber2 = (price: number, method?: string , amount?:number ,isBuy?:boolean) => { + priceP = price + methodP = method + amountP=amount + isBuyP=isBuy + return { + required: true, + validator: checkNumber, + trigger: 'change' + } + +} +export const justNumber3 = (price: number, Num?:number ,isBuy?:boolean) => { + priceP = price + NumP=Num + isBuyP=isBuy + return { + required: true, + validator: checkNumber, + trigger: 'change' + } + +} + +export const ruleNumber = () => { + console.log('445455') + return { + required: true, + message: 'لطفا نحوه خرید', + trigger: 'change' + } + +} + +export const guideTypePassword = ref<{}>({ + text: '', + color: '' +}) +export const passwordRules = () => { + return [ + { + validator: (rule: Rule, value: any) => { + if (value.length < 6) { + return Promise.reject('رمز عبور حداقل 6 رقم') + } + const lengthCriteria = value.length >= 8 + const letterCriteria = /[A-Za-z]/.test(value) + const numberCriteria = /\d/.test(value) + const specialCharacterCriteria = /[@$!%*#?&]/.test(value) + const criteriaMet = [ + lengthCriteria, + letterCriteria, + numberCriteria, + specialCharacterCriteria + ].filter(Boolean).length + if (criteriaMet === 4) { + guideTypePassword.value = { + text: 'سطح : قوی', + color: 'text-green' + } + return Promise.resolve(); + } else if (criteriaMet === 3) { + guideTypePassword.value = { + text: 'سطح : متوسط', + color: 'midLevel' + } + return Promise.resolve(); + } else { + guideTypePassword.value = { + text: 'سطح : ضعیف', + color: 'week' + } + return Promise.resolve(); + } + } + } + ] +} diff --git a/src/utils/price.ts b/src/utils/price.ts new file mode 100644 index 0000000..1b9b0ca --- /dev/null +++ b/src/utils/price.ts @@ -0,0 +1,87 @@ +import {loading} from '@/utils/index' +import {getLastPrice, getPrice} from '@/api/home' +import {ref} from 'vue' +import type {Price} from '@/models/home' + +let interval: any +export const price = ref() +export const lastPrice = ref() +export const olderPrice = ref(0) + +export async function setIntervalGetAllPrice() { + // console.log('salam') + try { + interval = setInterval(async () => { + await getLastPrices() + await getUpPrice() + }, 10000) + } catch (e) { + console.log(e) + } finally { + loading.value = false + } + +} + +export async function setIntervalGetLastPrice() { + // console.log('salam') + try { + interval = setInterval(async () => { + await getLastPrices() + // await getUpPrice() + }, 10000) + } catch (e) { + console.log(e) + } finally { + loading.value = false + } + +} + +export async function getUpPrice() { + try { + // loading.value = true + const data = await getPrice() + // const dataLast = await getLastPrice() + // if (lastPrice.value?.price_last != dataLast.price_last) { + // olderPrice.value = lastPrice.value?.price_last + // } + price.value = data + // lastPrice.value = dataLast + } catch (e) { + console.log(e) + } finally { + // loading.value = false + } +} + +export async function getLastPrices() { + try { + // loading.value = true + // const data = await getPrice() + const dataLast = await getLastPrice() + if (lastPrice.value?.price_last != dataLast.price_last) { + olderPrice.value = lastPrice.value?.price_last + } + // price.value = data + lastPrice.value = dataLast + } catch (e) { + console.log(e) + } finally { + // loading.value = false + } +} + +export function stopPriceInterval() { + // console.log('stop') + clearInterval(interval); +} + +export function percentPriceChanged() { + // console.log(olderPrice.value) + // console.log(lastPrice.value?.price_last) + if (!olderPrice.value) + return 0 +return ((lastPrice.value?.price_last-olderPrice.value) *100)/olderPrice.value + + } \ No newline at end of file diff --git a/src/utils/useAxios.ts b/src/utils/useAxios.ts new file mode 100644 index 0000000..84887e9 --- /dev/null +++ b/src/utils/useAxios.ts @@ -0,0 +1,178 @@ +import {baseURL} from '@/themeConfig' +import type {AxiosRequestConfig, AxiosResponse} from 'axios' +import axios from 'axios' +import {getToken, removeToken} from "@/utils"; +import router from "@/router"; +import {get} from 'lodash' +import {message} from "ant-design-vue"; + +interface Meta { + errorMessage?: 'message' | 'notification' | 'toast' | 'none' +} + +interface MyAxiosRequestConfig extends AxiosRequestConfig { + meta?: Meta +} + +const headers = { + 'Content-Type': 'application/json', + Accept: 'application/json', +} + +const _axios = axios.create({ + baseURL, + headers, +}) + +_axios.interceptors.request.use( + (config) => { + //console.log('request config', config) + if (config.headers) { + const token = getToken() + if (token) { + //@ts-ignore + config.headers['Authorization'] = 'Bearer ' + token + } + } + return config + }, + (error) => { + //console.log('this is error on interceptors.request', error) + Promise.reject(error) + }, +) +_axios.interceptors.response.use( + (response) => { + //console.log('this is response') + // Any status code that lie within the range of 2xx cause this function to trigger + // Do something with response data + //console.log('this is fulfilled on interceptors.response', response.data) + return response.data + }, + async function (error) { + console.log('this is axios error', error) + if (error.response.data && error.response.data.message) { + checkStatus(error.response.data.message, error.response.status, error.config) + } + + //console.log('this is error on interceptors.response', error.config.meta) + /* if (error.response && (error.response.status == 401 || error.response.status == 400)) { + //debugger + removeToken() + router.push({ name: 'login' }) + }*/ + if (error.response && error.response.status == 401) { + ///removeToken() + console.log('error') + removeToken() + // router.push({ name: 'login' }) + await router.push({name: 'login'}) + } else if (error.response && error.response.status == 403) { + message.error('شما دسترسی لازم برای انجام این عملیات را ندارید') + } else if (error.response && error.response.status == 422) { + // message.error(error.response.data?.message) + } else if (error.response) { + message.error('خطا در بارگذاری اطلاعات') + } + // Any status codes that falls outside the range of 2xx cause this function to trigger + // Do something with response error + + //const { response, code, message, config } = error || {} + //const errorMessageMode = config?.requestOptions?.errorMessageMode || 'none' + //const msg: string = response?.data?.error?.message ?? '' + //checkStatus(error?.response?.status, msg) + return Promise.reject(error) + }) + +function checkStatus(msg: string, code: number, config: any) { + //const { code, data, message } = data + const errorMessage = get(config, 'meta.errorMessage', 'message') + /*if (config.meta) { + if (config.meta.message) { + errorMessage = config.meta.message + } + }*/ + console.log('this is config', config) + if (errorMessage == 'none') return + switch (errorMessage) { + case 'message': + message.error(msg) + break + default: + message.error(msg) + } +} + + +const myAxios = { + //AxiosResponse + post( + url: string, + data?: D, + config?: MyAxiosRequestConfig, + ): Promise { + return _axios.post(url, data, config) + }, + request, D = any>(config: MyAxiosRequestConfig): Promise { + return _axios.request(config) + }, + //AxiosResponse + get(url: string, config?: MyAxiosRequestConfig): Promise { + return _axios.get(url, config) + }, + //AxiosResponse + delete(url: string, config?: MyAxiosRequestConfig): Promise { + return _axios.delete(url, config) + }, + //AxiosResponse + head(url: string, config?: MyAxiosRequestConfig): Promise { + return _axios.head(url, config) + }, + //AxiosResponse + options(url: string, config?: MyAxiosRequestConfig): Promise { + return _axios.options(url, config) + }, + //AxiosResponse + put( + url: string, + data?: D, + config?: MyAxiosRequestConfig, + ): Promise { + return _axios.put(url, data, config) + }, + //AxiosResponse + patch( + url: string, + data?: D, + config?: MyAxiosRequestConfig, + ): Promise { + return _axios.patch(url, data, config) + }, + //AxiosResponse + postForm( + url: string, + data?: D, + config?: MyAxiosRequestConfig, + ): Promise { + return _axios.postForm(url, data, config) + }, + //AxiosResponse + putForm( + url: string, + data?: D, + config?: MyAxiosRequestConfig, + ): Promise { + return _axios.putForm(url, data, config) + }, + //AxiosResponse + patchForm( + url: string, + data?: D, + config?: MyAxiosRequestConfig, + ): Promise { + return _axios.patchForm(url, data, config) + }, +} + +export default myAxios +export {_axios} diff --git a/src/utils/useCardNumber.ts b/src/utils/useCardNumber.ts new file mode 100644 index 0000000..d2cff7e --- /dev/null +++ b/src/utils/useCardNumber.ts @@ -0,0 +1,8 @@ +export function useCardNumber(val: number) { + const str = val.toString() + return `${str.substring(0,4)}\xa0\xa0\xa0\xa0\xa0\xa0${str.substring(4,8)}\xa0\xa0\xa0\xa0\xa0\xa0${str.substring(8,12)}\xa0\xa0\xa0\xa0\xa0\xa0${str.substring(12,16)}` +} +export function useShabaNumber(val: number) { + const str = val.toString() + return `IR${str.substring(0,4)}\xa0\xa0\xa0${str.substring(4,8)}\xa0\xa0\xa0${str.substring(8,12)}\xa0\xa0\xa0${str.substring(12,16)}\xa0\xa0\xa0${str.substring(16,20)}\xa0\xa0\xa0${str.substring(20,24)}` +} \ No newline at end of file diff --git a/src/utils/useConfirm.ts b/src/utils/useConfirm.ts new file mode 100644 index 0000000..84a3408 --- /dev/null +++ b/src/utils/useConfirm.ts @@ -0,0 +1,127 @@ +import { Modal } from 'ant-design-vue' +import { createVNode } from 'vue' +import { ExclamationCircleOutlined } from '@ant-design/icons-vue' +import { message } from 'ant-design-vue/es' + +//todo +export async function confirmDeleteItem( + type: string, + id: number, + functionDelete: (id: number) => Promise, + refreshTable: () => void +) { + Modal.confirm({ + title: `آیا از حذف ${type} اطمینان دارید؟`, + icon: createVNode(ExclamationCircleOutlined), + okText: 'تایید', + okType: 'danger', + centered: true, + cancelText: 'انصراف', + async onOk() { + // console.log('OK'); + // await deleteItem(id) + + // loading.value = true + // table?.value?.spinTable(true) + // @ts-ignore + try { + await functionDelete(id) + refreshTable() + console.log('finall') + message.success('با موفقیت حذف شد') + } catch (e) { + console.error(e) + // message.error('خطا در حذف') + } + + // setTimeout(Math.random() > 0.5 ? resolve : reject, 1000) + // table?.value?.fetch() + + // loading.value = false + // table?.value?.spinTable(false) + }, + onCancel() { + console.log('Cancel') + } + }) +} + +export async function confirmActOnApi( + title: string, + id: number, + functionApi: (id: number) => Promise, + refreshTable: () => void +) { + Modal.confirm({ + title: title, + icon: createVNode(ExclamationCircleOutlined), + okText: 'تایید', + okType: 'danger', + centered: true, + cancelText: 'انصراف', + async onOk() { + // console.log('OK'); + // await deleteItem(id) + + // loading.value = true + // table?.value?.spinTable(true) + // @ts-ignore + try { + await functionApi(id) + refreshTable() + // console.log('finall') + message.success('با موفقیت انجام شد') + } catch (e) { + console.error(e) + // message.error('خطا در حذف') + } + + // setTimeout(Math.random() > 0.5 ? resolve : reject, 1000) + // table?.value?.fetch() + + // loading.value = false + // table?.value?.spinTable(false) + }, + onCancel() { + console.log('Cancel') + } + }) +} +export default async function baseConfirm( + title: string, + actionFunction: () => void, +) { + Modal.confirm({ + title: title, + icon: createVNode(ExclamationCircleOutlined), + okText: 'تایید', + okType: 'danger', + centered: true, + cancelText: 'انصراف', + async onOk() { + // console.log('OK'); + // await deleteItem(id) + + // loading.value = true + // table?.value?.spinTable(true) + // @ts-ignore + try { + await actionFunction() + // console.log('finall') + // message.success('با موفقیت انجام شد') + } catch (e) { + console.error(e) + // message.error('خطا در حذف') + } + + // setTimeout(Math.random() > 0.5 ? resolve : reject, 1000) + // table?.value?.fetch() + + // loading.value = false + // table?.value?.spinTable(false) + }, + onCancel() { + console.log('Cancel') + } + }) +} diff --git a/src/utils/useCountdownTimer.ts b/src/utils/useCountdownTimer.ts new file mode 100644 index 0000000..0c2ac7b --- /dev/null +++ b/src/utils/useCountdownTimer.ts @@ -0,0 +1,90 @@ +import { onMounted, ref } from 'vue' +import moment from 'moment' +//sample 00:30 - 1:50 - 00:59 +export default function useCountdownTimer(_time = '00:00:30', format = 'HH:mm:ss') { + let interval: number + let startTime = moment(_time, 'HH:mm:ss') + //const isActiveMenu= + const endTime = moment('00:00:00', 'HH:mm:ss') + const time = ref('') + let tempHook: () => void + let tempHookStop: () => void + let tempHookStart: () => void + let tempHookRestart: () => void + function decrement() { + if (startTime > endTime) { + startTime.subtract('1', 'second') + time.value = startTime.format(format) + } else { + clearInterval(interval) + if (tempHook) { + tempHook() + } + } + } + + function start() { + if (interval) { + stop() + } + interval = setInterval(decrement, 1000) + if (tempHookStart) { + tempHookStart() + } + } + + function stop() { + clearInterval(interval) + if (tempHookStop) { + tempHookStop() + } + } + + function onFinish(hook: () => any) { + tempHook = hook + } + + function setTime(_time = '00:00:30') { + startTime = moment(_time, 'HH:mm:ss') + time.value = startTime.format(format) + stop() + start() + } + + function reset() { + startTime = moment(_time, 'HH:mm:ss') + time.value = startTime.format(format) + stop() + start() + if (tempHookRestart) { + tempHookRestart() + } + } + + function onStop(hook: () => any) { + tempHookStop = hook + } + function onStart(hook: () => any) { + tempHookStart = hook + } + + function onRestart(hook: () => any) { + tempHookRestart = hook + } + + onMounted(() => { + time.value = startTime.format(format) + }) + + return { + time, + stop, + start, + onFinish, + reset, + setTime, + onRestart, + onStart, + onStop, + } +} diff --git a/src/utils/useDateTime.ts b/src/utils/useDateTime.ts new file mode 100644 index 0000000..fdf5cdb --- /dev/null +++ b/src/utils/useDateTime.ts @@ -0,0 +1,54 @@ +//@ts-ignore +import moment from 'moment-jalaali' +//@ts-ignore +import fa from 'moment/src/locale/fa' + +moment.locale('fa', fa) +moment.loadPersian() + +function momentTimeAgo(dataTime: string) { + return moment.utc(dataTime).fromNow() +} + +function toJalali(dateTime: string, format = 'jYYYY/jMM/jDD-HH:mm') { + return moment.utc(dateTime).format(format) +} + +function toJalaliOutOfUTC(dateTime: string, format = 'jYYYY/jMM/jDD-HH:mm') { + const date = new Date() + date.setHours(3, 30) + return moment.utc(dateTime).format(format) +} + +function toJalaliNotime(dateTime: string, format = 'jYYYY/jMM/jDD') { + return moment.utc(dateTime).format(format) +} + +function toTime(dateTime: string, format = 'HH:mm:ss') { + return moment.utc(dateTime).format(format) +} + +function diffDateByYearMontDay(date: string) { + const a = moment(date) + const b = moment() + const years = a.diff(b, 'year') + b.add(years, 'years') + const months = a.diff(b, 'months') + b.add(months, 'months') + const days = a.diff(b, 'days') + let tempStr = '' + if (years != 0) { + tempStr += years + ' سال' + } + if (months != 0) { + if (tempStr.length > 0) tempStr += ' و ' + tempStr += months + ' ماه' + } + if (days != 0) { + if (tempStr.length > 0) tempStr += ' و ' + tempStr += days + ' روز' + } + return tempStr +} + +export {momentTimeAgo, toJalali, diffDateByYearMontDay, toTime, toJalaliNotime, toJalaliOutOfUTC} diff --git a/src/utils/usePrefix.ts b/src/utils/usePrefix.ts new file mode 100644 index 0000000..424755c --- /dev/null +++ b/src/utils/usePrefix.ts @@ -0,0 +1,8 @@ +import { prefixCls } from "@/themeConfig"; + +export function usePrefix(name = "") { + return { + prefixVar: prefixCls, + prefixCls: `${prefixCls}-${name}`, + }; +} diff --git a/src/utils/usePrice.ts b/src/utils/usePrice.ts new file mode 100644 index 0000000..f69748d --- /dev/null +++ b/src/utils/usePrice.ts @@ -0,0 +1,26 @@ +export function usePrice(price: number, digit = true, unit = 'ریال') { + price= price??0 + let _price = price.toString() + if (digit) { + _price = _price.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',') + } + return `${_price} ${unit}` +} + +export function usePriceWithoutType(price?: number, digit = true, unit = 'ریال') { + let _price = price?.toString() + if (digit) { + _price = _price?.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',') + } + return `${_price}` +} + +export function useTowDecimal(num: string | number): string | number { + const temp = num.toString().match(/^-?\d+(?:\.\d{0,2})?/) + if (temp && temp.length > 0) return temp[0] + return Math.round(+num * 100) / 100 +} + +export function useFormat(num: string | number, unit = '') { + return usePrice(Math.abs(+useTowDecimal(num)), true, unit) +} diff --git a/src/utils/useProduct.ts b/src/utils/useProduct.ts new file mode 100644 index 0000000..5eb5d30 --- /dev/null +++ b/src/utils/useProduct.ts @@ -0,0 +1,147 @@ +import { get } from 'lodash' +import type { Ref } from 'vue' +import type { Product, ProductVariant } from '@/model/product' +import { unref, computed } from 'vue' +// import noImage from '@/assets/img/logo.svg' +import type { UploadedFileInfo } from '@/model/uploadedFileInfo' + +export function useProduct(product: Ref | Product) { + const title = computed(() => { + return get(unref(product), 'title_fa', '') + }) + + const price = computed(() => { + if (unref(product).price) return unref(product).price as number + return 0 + }) + + const brand = computed(() => { + if (unref(product).brand) return unref(product).brand + return '-' + }) + + const country = computed(() => { + if (unref(product).country) return unref(product).country + return '-' + }) + + const gallery = computed(() => { + return get(unref(product), 'gallery', []) + }) + + const body = computed(() => { + return get(unref(product), 'body', '') + }) + + const typeUse = computed(() => { + return get(unref(product), 'type_use', '') + }) + + const pageDesign = computed(() => { + return get(unref(product), 'page_design', '-') + }) + + const motor = computed(() => { + return get(unref(product), 'page_design', '-') + }) + + const primaryAttributes = computed(() => { + return [ + { title: 'نوع کاربری', name: typeUse.value }, + { title: 'برند', name: brand.value }, + { title: 'کشور سازنده', name: country.value }, + { title: 'جنس بدنه', name: 'فلزی-آلومینیوم' }, + ] + }) + + const moreAttributes = computed(() => { + return [ + { title: 'جنسیت', name: gender.value }, + { title: 'موتور', name: motor.value }, + { title: 'شیشه', name: glass.value }, + { title: 'جنس قاب', name: frame.value }, + { title: 'جنس بند', name: wristlet.value }, + { title: 'نوع قفل بند', name: buckleType.value }, + { title: 'سال ساخت', name: yearCreate.value }, + { title: 'گارانتی', name: warranty.value }, + { title: 'طرح صفحه', name: pageDesign.value }, + { title: 'شکل قاب', name: frameShape.value }, + ] + }) + + const frame = computed(() => { + return get(unref(product), 'frame', '-') + }) + + const warranty = computed(() => { + return unref(product).warranty == 1 ? 'بله' : 'خیر' + }) + + const buckleType = computed(() => { + return get(unref(product), 'buckle_type', '-') + }) + + const variants = computed(() => { + return get(unref(product), 'variants', []) + }) + + const originalImage = computed(() => { + //TODO: remove if not find default image + return get(unref(product), 'original_image', null) + }) + + function variantImage(variant: ProductVariant) { + const temp = variants.value.find((item) => item.id == variant.id) + if (temp && temp.file) { + return temp.file.src + } + return 'Samin Gold' + } + + const collection = computed(() => { + return get(unref(product), 'collection.title', '-') + }) + + const glass = computed(() => { + return get(unref(product), 'glass', '-') + }) + + const frameShape = computed(() => { + return get(unref(product), 'frame_shape', '-') + }) + + const wristlet = computed(() => { + return get(unref(product), 'wristlet', '-') + }) + + const gender = computed(() => { + return get(unref(product), 'gender_str', '-') + }) + + const yearCreate = computed(() => { + return get(unref(product), 'year_create', '-') + }) + + return { + title, + price, + brand, + country, + gallery, + body, + primaryAttributes, + variants, + originalImage, + variantImage, + moreAttributes, + typeUse, + pageDesign, + motor, + collection, + glass, + frameShape, + wristlet, + gender, + warranty, + } +} diff --git a/src/utils/useStorage.ts b/src/utils/useStorage.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/views/base/404.vue b/src/views/base/404.vue new file mode 100644 index 0000000..86f2e4b --- /dev/null +++ b/src/views/base/404.vue @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/src/views/base/about/assets/img/gr_bottom_white.svg b/src/views/base/about/assets/img/gr_bottom_white.svg new file mode 100644 index 0000000..bede4ba --- /dev/null +++ b/src/views/base/about/assets/img/gr_bottom_white.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/views/base/about/index.vue b/src/views/base/about/index.vue new file mode 100644 index 0000000..62349c3 --- /dev/null +++ b/src/views/base/about/index.vue @@ -0,0 +1,169 @@ + + + + + diff --git a/src/views/base/address/components/Item.vue b/src/views/base/address/components/Item.vue new file mode 100644 index 0000000..a975372 --- /dev/null +++ b/src/views/base/address/components/Item.vue @@ -0,0 +1,156 @@ + + + + + diff --git a/src/views/base/address/components/New_EditAddress.vue b/src/views/base/address/components/New_EditAddress.vue new file mode 100644 index 0000000..bd102c9 --- /dev/null +++ b/src/views/base/address/components/New_EditAddress.vue @@ -0,0 +1,150 @@ + + + + + \ No newline at end of file diff --git a/src/views/base/address/index.vue b/src/views/base/address/index.vue new file mode 100644 index 0000000..e39551c --- /dev/null +++ b/src/views/base/address/index.vue @@ -0,0 +1,242 @@ + + + + + \ No newline at end of file diff --git a/src/views/base/earnMoney/components/EarnCard.vue b/src/views/base/earnMoney/components/EarnCard.vue new file mode 100644 index 0000000..7c076a9 --- /dev/null +++ b/src/views/base/earnMoney/components/EarnCard.vue @@ -0,0 +1,37 @@ + + + + + \ No newline at end of file diff --git a/src/views/base/earnMoney/components/GiftCard.vue b/src/views/base/earnMoney/components/GiftCard.vue new file mode 100644 index 0000000..fb77bb6 --- /dev/null +++ b/src/views/base/earnMoney/components/GiftCard.vue @@ -0,0 +1,41 @@ + + + + + \ No newline at end of file diff --git a/src/views/base/earnMoney/index.vue b/src/views/base/earnMoney/index.vue new file mode 100644 index 0000000..5055e9e --- /dev/null +++ b/src/views/base/earnMoney/index.vue @@ -0,0 +1,161 @@ + + + + + \ No newline at end of file diff --git a/src/views/base/fund/components/Item.vue b/src/views/base/fund/components/Item.vue new file mode 100644 index 0000000..a5a5e9c --- /dev/null +++ b/src/views/base/fund/components/Item.vue @@ -0,0 +1,78 @@ + + + + + \ No newline at end of file diff --git a/src/views/base/fund/index.vue b/src/views/base/fund/index.vue new file mode 100644 index 0000000..09baa9f --- /dev/null +++ b/src/views/base/fund/index.vue @@ -0,0 +1,157 @@ + + + + + \ No newline at end of file diff --git a/src/views/base/fund/info/components/Item.vue b/src/views/base/fund/info/components/Item.vue new file mode 100644 index 0000000..72015e2 --- /dev/null +++ b/src/views/base/fund/info/components/Item.vue @@ -0,0 +1,122 @@ + + + + + \ No newline at end of file diff --git a/src/views/base/fund/info/index.vue b/src/views/base/fund/info/index.vue new file mode 100644 index 0000000..d9a5ffd --- /dev/null +++ b/src/views/base/fund/info/index.vue @@ -0,0 +1,300 @@ + + + + + diff --git a/src/views/base/fund/newFund/index.vue b/src/views/base/fund/newFund/index.vue new file mode 100644 index 0000000..1fd8093 --- /dev/null +++ b/src/views/base/fund/newFund/index.vue @@ -0,0 +1,194 @@ + + + + + \ No newline at end of file diff --git a/src/views/base/gold/components/GoldSkeleton.vue b/src/views/base/gold/components/GoldSkeleton.vue new file mode 100644 index 0000000..702cb59 --- /dev/null +++ b/src/views/base/gold/components/GoldSkeleton.vue @@ -0,0 +1,24 @@ + + + + \ No newline at end of file diff --git a/src/views/base/gold/index.vue b/src/views/base/gold/index.vue new file mode 100644 index 0000000..089ad4f --- /dev/null +++ b/src/views/base/gold/index.vue @@ -0,0 +1,632 @@ + + + + + diff --git a/src/views/base/home/components/HomeSkeleton.vue b/src/views/base/home/components/HomeSkeleton.vue new file mode 100644 index 0000000..1e4b861 --- /dev/null +++ b/src/views/base/home/components/HomeSkeleton.vue @@ -0,0 +1,63 @@ + + + + + + + \ No newline at end of file diff --git a/src/views/base/home/components/ProductInventory.vue b/src/views/base/home/components/ProductInventory.vue new file mode 100644 index 0000000..3cbad81 --- /dev/null +++ b/src/views/base/home/components/ProductInventory.vue @@ -0,0 +1,46 @@ + + + + + \ No newline at end of file diff --git a/src/views/base/home/index-old.vue b/src/views/base/home/index-old.vue new file mode 100644 index 0000000..8565ba1 --- /dev/null +++ b/src/views/base/home/index-old.vue @@ -0,0 +1,364 @@ + + + + + \ No newline at end of file diff --git a/src/views/base/home/index.vue b/src/views/base/home/index.vue new file mode 100644 index 0000000..4787e76 --- /dev/null +++ b/src/views/base/home/index.vue @@ -0,0 +1,891 @@ + + + + + + + \ No newline at end of file diff --git a/src/views/base/home/index_old2.vue b/src/views/base/home/index_old2.vue new file mode 100644 index 0000000..bfd4da7 --- /dev/null +++ b/src/views/base/home/index_old2.vue @@ -0,0 +1,389 @@ + + + + + \ No newline at end of file diff --git a/src/views/base/home/indexgolak.vue b/src/views/base/home/indexgolak.vue new file mode 100644 index 0000000..b9580eb --- /dev/null +++ b/src/views/base/home/indexgolak.vue @@ -0,0 +1,866 @@ + + + + + diff --git a/src/views/base/index.vue b/src/views/base/index.vue new file mode 100644 index 0000000..90888a3 --- /dev/null +++ b/src/views/base/index.vue @@ -0,0 +1,382 @@ + + + + + + \ No newline at end of file diff --git a/src/views/base/physicalReceive/components/NewRequest.vue b/src/views/base/physicalReceive/components/NewRequest.vue new file mode 100644 index 0000000..42ad0bd --- /dev/null +++ b/src/views/base/physicalReceive/components/NewRequest.vue @@ -0,0 +1,221 @@ + + + + + diff --git a/src/views/base/physicalReceive/components/RequestItem.vue b/src/views/base/physicalReceive/components/RequestItem.vue new file mode 100644 index 0000000..6e33dce --- /dev/null +++ b/src/views/base/physicalReceive/components/RequestItem.vue @@ -0,0 +1,57 @@ + + + + + \ No newline at end of file diff --git a/src/views/base/physicalReceive/components/RequestList.vue b/src/views/base/physicalReceive/components/RequestList.vue new file mode 100644 index 0000000..2ffb38b --- /dev/null +++ b/src/views/base/physicalReceive/components/RequestList.vue @@ -0,0 +1,39 @@ + + + + + \ No newline at end of file diff --git a/src/views/base/physicalReceive/index.vue b/src/views/base/physicalReceive/index.vue new file mode 100644 index 0000000..4216a2a --- /dev/null +++ b/src/views/base/physicalReceive/index.vue @@ -0,0 +1,43 @@ + + + + + diff --git a/src/views/base/priceTrigger/components/Item.vue b/src/views/base/priceTrigger/components/Item.vue new file mode 100644 index 0000000..d07fa2e --- /dev/null +++ b/src/views/base/priceTrigger/components/Item.vue @@ -0,0 +1,161 @@ + + + + + diff --git a/src/views/base/priceTrigger/index.vue b/src/views/base/priceTrigger/index.vue new file mode 100644 index 0000000..625ad78 --- /dev/null +++ b/src/views/base/priceTrigger/index.vue @@ -0,0 +1,197 @@ + + + + + \ No newline at end of file diff --git a/src/views/base/products/components/DealProduct.vue b/src/views/base/products/components/DealProduct.vue new file mode 100644 index 0000000..22f3e66 --- /dev/null +++ b/src/views/base/products/components/DealProduct.vue @@ -0,0 +1,721 @@ + + + + + diff --git a/src/views/base/products/components/ProductItem.vue b/src/views/base/products/components/ProductItem.vue new file mode 100644 index 0000000..9a4a5c0 --- /dev/null +++ b/src/views/base/products/components/ProductItem.vue @@ -0,0 +1,62 @@ + + + + + \ No newline at end of file diff --git a/src/views/base/products/index.vue b/src/views/base/products/index.vue new file mode 100644 index 0000000..747972d --- /dev/null +++ b/src/views/base/products/index.vue @@ -0,0 +1,164 @@ + + + + + \ No newline at end of file diff --git a/src/views/base/rules/index.vue b/src/views/base/rules/index.vue new file mode 100644 index 0000000..86d000a --- /dev/null +++ b/src/views/base/rules/index.vue @@ -0,0 +1,285 @@ + + + + + diff --git a/src/views/base/rules/permissions/permissions.vue b/src/views/base/rules/permissions/permissions.vue new file mode 100644 index 0000000..24e08fb --- /dev/null +++ b/src/views/base/rules/permissions/permissions.vue @@ -0,0 +1,149 @@ + + + + + \ No newline at end of file diff --git a/src/views/base/transactions/components/Item.vue b/src/views/base/transactions/components/Item.vue new file mode 100644 index 0000000..194efcb --- /dev/null +++ b/src/views/base/transactions/components/Item.vue @@ -0,0 +1,171 @@ + + + + + diff --git a/src/views/base/transactions/index.vue b/src/views/base/transactions/index.vue new file mode 100644 index 0000000..ddda810 --- /dev/null +++ b/src/views/base/transactions/index.vue @@ -0,0 +1,187 @@ + + + + + diff --git a/src/views/base/user/assets/img/gr_bottom_white.svg b/src/views/base/user/assets/img/gr_bottom_white.svg new file mode 100644 index 0000000..bede4ba --- /dev/null +++ b/src/views/base/user/assets/img/gr_bottom_white.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/views/base/user/index.vue b/src/views/base/user/index.vue new file mode 100644 index 0000000..4d1719c --- /dev/null +++ b/src/views/base/user/index.vue @@ -0,0 +1,466 @@ + + + + + diff --git a/src/views/base/wallet/components/CardItem.vue b/src/views/base/wallet/components/CardItem.vue new file mode 100644 index 0000000..57fc770 --- /dev/null +++ b/src/views/base/wallet/components/CardItem.vue @@ -0,0 +1,104 @@ + + + + + diff --git a/src/views/base/wallet/components/Item.vue b/src/views/base/wallet/components/Item.vue new file mode 100644 index 0000000..0373f5b --- /dev/null +++ b/src/views/base/wallet/components/Item.vue @@ -0,0 +1,178 @@ + + + + + + diff --git a/src/views/base/wallet/components/SkeletonLoading.vue b/src/views/base/wallet/components/SkeletonLoading.vue new file mode 100644 index 0000000..03606fd --- /dev/null +++ b/src/views/base/wallet/components/SkeletonLoading.vue @@ -0,0 +1,429 @@ + + + + + diff --git a/src/views/base/wallet/components/UISlider/CardItem.vue b/src/views/base/wallet/components/UISlider/CardItem.vue new file mode 100644 index 0000000..008cd2d --- /dev/null +++ b/src/views/base/wallet/components/UISlider/CardItem.vue @@ -0,0 +1,158 @@ + + + + + diff --git a/src/views/base/wallet/components/UISlider/Slider.vue b/src/views/base/wallet/components/UISlider/Slider.vue new file mode 100644 index 0000000..aa0657c --- /dev/null +++ b/src/views/base/wallet/components/UISlider/Slider.vue @@ -0,0 +1,162 @@ + + + + + \ No newline at end of file diff --git a/src/views/base/wallet/components/UISlider/index.vue b/src/views/base/wallet/components/UISlider/index.vue new file mode 100644 index 0000000..3673514 --- /dev/null +++ b/src/views/base/wallet/components/UISlider/index.vue @@ -0,0 +1,259 @@ + + + + + \ No newline at end of file diff --git a/src/views/base/wallet/components/mySlider/MySlider.vue b/src/views/base/wallet/components/mySlider/MySlider.vue new file mode 100644 index 0000000..750f383 --- /dev/null +++ b/src/views/base/wallet/components/mySlider/MySlider.vue @@ -0,0 +1,262 @@ + + + + + \ No newline at end of file diff --git a/src/views/base/wallet/components/mySlider/Slider.vue b/src/views/base/wallet/components/mySlider/Slider.vue new file mode 100644 index 0000000..aa0657c --- /dev/null +++ b/src/views/base/wallet/components/mySlider/Slider.vue @@ -0,0 +1,162 @@ + + + + + \ No newline at end of file diff --git a/src/views/base/wallet/index.vue b/src/views/base/wallet/index.vue new file mode 100644 index 0000000..55d711b --- /dev/null +++ b/src/views/base/wallet/index.vue @@ -0,0 +1,687 @@ + + + + + diff --git a/src/views/login/assets/img/gr_bottom_white.svg b/src/views/login/assets/img/gr_bottom_white.svg new file mode 100644 index 0000000..bede4ba --- /dev/null +++ b/src/views/login/assets/img/gr_bottom_white.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/views/login/assets/img/gr_top_white.svg b/src/views/login/assets/img/gr_top_white.svg new file mode 100644 index 0000000..46c569b --- /dev/null +++ b/src/views/login/assets/img/gr_top_white.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/views/login/assets/img/pattern.svg b/src/views/login/assets/img/pattern.svg new file mode 100644 index 0000000..821d03d --- /dev/null +++ b/src/views/login/assets/img/pattern.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/views/login/components/Login.vue b/src/views/login/components/Login.vue new file mode 100644 index 0000000..165078b --- /dev/null +++ b/src/views/login/components/Login.vue @@ -0,0 +1,653 @@ + + + + + + + + + + + diff --git a/src/views/login/components/PhoneVerify.vue b/src/views/login/components/PhoneVerify.vue new file mode 100644 index 0000000..d2ab182 --- /dev/null +++ b/src/views/login/components/PhoneVerify.vue @@ -0,0 +1,54 @@ + + + + + + + \ No newline at end of file diff --git a/src/views/login/components/Register.vue b/src/views/login/components/Register.vue new file mode 100644 index 0000000..75cb8a4 --- /dev/null +++ b/src/views/login/components/Register.vue @@ -0,0 +1,198 @@ + + + + + + + \ No newline at end of file diff --git a/src/views/login/index.vue b/src/views/login/index.vue new file mode 100644 index 0000000..8da0318 --- /dev/null +++ b/src/views/login/index.vue @@ -0,0 +1,48 @@ + + + + + + diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..11fd429 --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,15 @@ +{ + "extends": "@vue/tsconfig/tsconfig.dom.json", + "include": ["env.d.ts", "src/**/*", "src/**/*.vue"], + "exclude": ["src/**/__tests__/*"], + "compilerOptions": { + "types": [ + "vite-plugin-pwa/client" + ], + "composite": true, + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + } + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..66b5e57 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,11 @@ +{ + "files": [], + "references": [ + { + "path": "./tsconfig.node.json" + }, + { + "path": "./tsconfig.app.json" + } + ] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..085ed17 --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,16 @@ +{ + "extends": "@tsconfig/node18/tsconfig.json", + "include": [ + "vite.config.*", + "vitest.config.*", + "cypress.config.*", + "nightwatch.conf.*", + "playwright.config.*" + ], + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Bundler", + "types": ["node","vite-plugin-pwa/client"] + } +} diff --git a/uno.config.ts b/uno.config.ts new file mode 100644 index 0000000..53d8df3 --- /dev/null +++ b/uno.config.ts @@ -0,0 +1,33 @@ +import { + defineConfig, presetAttributify, presetIcons, + presetTypography, presetUno, presetWebFonts, + transformerDirectives, transformerVariantGroup +} from 'unocss' + +export default defineConfig({ + shortcuts: [ + // ... + ], + theme: { + colors: { + "primary": "#20514b", + "secondary": "#ffffff", + "tertiary": "#e0be7f" + } + }, + presets: [ + presetUno(), + presetAttributify(), + //presetIcons(), + //presetTypography(), + /*presetWebFonts({ + fonts: { + // ... + }, + }),*/ + ], + transformers: [ + transformerDirectives(), + transformerVariantGroup(), + ], +}) diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..cc97403 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,108 @@ +import {fileURLToPath, URL} from 'node:url' + +import {defineConfig} from 'vite' +import vue from '@vitejs/plugin-vue' +import vueJsx from '@vitejs/plugin-vue-jsx' +import {VitePWA} from 'vite-plugin-pwa' +import UnoCSS from 'unocss/vite' +import {resolve} from "path"; +import {AntDesignVueResolver, VantResolver} from 'unplugin-vue-components/resolvers'; +import Components from 'unplugin-vue-components/vite' +// import {colors} from './src/themeConfig' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + vue(), + vueJsx(), + VitePWA({ + //registerType: 'autoUpdate', + devOptions: { + enabled: true + }, + workbox: { + cleanupOutdatedCaches: false, + clientsClaim: true, + skipWaiting: true + }, + mode: 'development', + base: '/', + srcDir: 'src', + filename: 'sw.ts', + includeAssets: ['/favicon.png'], + strategies: 'injectManifest', + manifest: { + name: 'Samingold', + short_name: 'Samingold', + start_url: '/', + display: 'standalone', + theme_color: '#20514b', + orientation: "portrait-primary", + background_color: 'white', + icons: [ + { + src: '32.png', + sizes: '32x32', + type: 'image/png', + purpose: 'any maskable', + }, + { + src: '32.png', + sizes: '32x32', + type: 'image/png', + }, + { + src: '192.png', + sizes: '192x192', + type: 'image/png', + }, + { + src: '512.png', + sizes: '512x512', + type: 'image/png', + }, + /* { + src: 'icon-512.png', + sizes: '512x512', + type: 'image/png', + purpose: 'any maskable', + },*/ + ], + }, + }), + + UnoCSS({ + configFile: './uno.config.ts', + }), + Components({ + resolvers: [AntDesignVueResolver({importStyle: 'less'}), VantResolver(),], + }), + ], + esbuild: { + supported: { + 'top-level-await': true //browsers can handle top-level-await features + }, + }, + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)) + } + }, + server: { + port: 3100, + }, + // base: `/single`, + // base: `/customer`, + css: { + preprocessorOptions: { + less: { + modifyVars: { + // Used for global import to avoid the need to import each style file separately + // reference: Avoid repeated references + hack: `; @import (reference) "${resolve('src/assets/css/var.less')}"`, + }, + javascriptEnabled: true, + }, + }, + }, +}) diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..94fc770 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,5347 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@ampproject/remapping@^2.2.0", "@ampproject/remapping@^2.2.1": + version "2.2.1" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@ant-design/colors@^6.0.0": + version "6.0.0" + resolved "https://registry.npmjs.org/@ant-design/colors/-/colors-6.0.0.tgz" + integrity sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ== + dependencies: + "@ctrl/tinycolor" "^3.4.0" + +"@ant-design/icons-svg@^4.2.1": + version "4.3.1" + resolved "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.3.1.tgz" + integrity sha512-4QBZg8ccyC6LPIRii7A0bZUk3+lEDCLnhB+FVsflGdcWPPmV+j3fire4AwwoqHV/BibgvBmR9ZIo4s867smv+g== + +"@ant-design/icons-vue@^6.1.0": + version "6.1.0" + resolved "https://registry.npmjs.org/@ant-design/icons-vue/-/icons-vue-6.1.0.tgz" + integrity sha512-EX6bYm56V+ZrKN7+3MT/ubDkvJ5rK/O2t380WFRflDcVFgsvl3NLH7Wxeau6R8DbrO5jWR6DSTC3B6gYFp77AA== + dependencies: + "@ant-design/colors" "^6.0.0" + "@ant-design/icons-svg" "^4.2.1" + +"@antfu/install-pkg@^0.1.1": + version "0.1.1" + resolved "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-0.1.1.tgz" + integrity sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ== + dependencies: + execa "^5.1.1" + find-up "^5.0.0" + +"@antfu/utils@^0.7.4", "@antfu/utils@^0.7.5": + version "0.7.6" + resolved "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.6.tgz" + integrity sha512-pvFiLP2BeOKA/ZOS6jxx4XhKzdVLHDhGlFEaZ2flWWYf2xOqVniqpk38I04DFRyz+L0ASggl7SkItTc+ZLju4w== + +"@apideck/better-ajv-errors@^0.3.1": + version "0.3.6" + resolved "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz" + integrity sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA== + dependencies: + json-schema "^0.4.0" + jsonpointer "^5.0.0" + leven "^3.1.0" + +"@babel/code-frame@^7.10.4", "@babel/code-frame@^7.22.10", "@babel/code-frame@^7.26.2", "@babel/code-frame@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz" + integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== + dependencies: + "@babel/helper-validator-identifier" "^7.27.1" + js-tokens "^4.0.0" + picocolors "^1.1.1" + +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9", "@babel/compat-data@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz" + integrity sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ== + +"@babel/core@^7.11.1", "@babel/core@^7.22.10": + version "7.22.10" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.22.10.tgz" + integrity sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.22.10" + "@babel/generator" "^7.22.10" + "@babel/helper-compilation-targets" "^7.22.10" + "@babel/helper-module-transforms" "^7.22.9" + "@babel/helpers" "^7.22.10" + "@babel/parser" "^7.22.10" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.10" + "@babel/types" "^7.22.10" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.1" + +"@babel/generator@^7.22.10", "@babel/generator@^7.26.5": + version "7.26.5" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz" + integrity sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw== + dependencies: + "@babel/parser" "^7.26.5" + "@babel/types" "^7.26.5" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + +"@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.15": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz" + integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== + dependencies: + "@babel/types" "^7.22.15" + +"@babel/helper-compilation-targets@^7.22.10", "@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.6": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz" + integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-validator-option" "^7.22.15" + browserslist "^4.21.9" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.22.10", "@babel/helper-create-class-features-plugin@^7.22.15": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz" + integrity sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.15" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz" + integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + regexpu-core "^5.3.1" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.4.3": + version "0.4.3" + resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz" + integrity sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug== + dependencies: + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + +"@babel/helper-environment-visitor@^7.22.20", "@babel/helper-environment-visitor@^7.22.5": + version "7.22.20" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + +"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-member-expression-to-functions@^7.22.15": + version "7.23.0" + resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz" + integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== + dependencies: + "@babel/types" "^7.23.0" + +"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== + dependencies: + "@babel/types" "^7.22.15" + +"@babel/helper-module-transforms@^7.22.9", "@babel/helper-module-transforms@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz" + integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.20" + +"@babel/helper-optimise-call-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz" + integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-remap-async-to-generator@^7.22.20": + version "7.22.20" + resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz" + integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-wrap-function" "^7.22.20" + +"@babel/helper-replace-supers@^7.22.20", "@babel/helper-replace-supers@^7.22.9": + version "7.22.20" + resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz" + integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-member-expression-to-functions" "^7.22.15" + "@babel/helper-optimise-call-expression" "^7.22.5" + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz" + integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz" + integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== + +"@babel/helper-validator-identifier@^7.22.20", "@babel/helper-validator-identifier@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz" + integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== + +"@babel/helper-validator-option@^7.22.15": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz" + integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== + +"@babel/helper-wrap-function@^7.22.20": + version "7.22.20" + resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz" + integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== + dependencies: + "@babel/helper-function-name" "^7.22.5" + "@babel/template" "^7.22.15" + "@babel/types" "^7.22.19" + +"@babel/helpers@^7.22.10": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz" + integrity sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ== + dependencies: + "@babel/template" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/parser@^7.20.15", "@babel/parser@^7.21.3", "@babel/parser@^7.22.10", "@babel/parser@^7.25.3", "@babel/parser@^7.26.5", "@babel/parser@^7.27.2": + version "7.27.2" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz" + integrity sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw== + dependencies: + "@babel/types" "^7.27.1" + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz" + integrity sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz" + integrity sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.23.3" + +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz" + integrity sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-import-assertions@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz" + integrity sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-attributes@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz" + integrity sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-meta@^7.10.4": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz" + integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz" + integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-arrow-functions@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz" + integrity sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-async-generator-functions@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.3.tgz" + integrity sha512-59GsVNavGxAXCDDbakWSMJhajASb4kBCqDjqJsv+p5nKdbz7istmZ3HrX3L2LuiI80+zsOADCvooqQH3qGCucQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.20" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-transform-async-to-generator@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz" + integrity sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw== + dependencies: + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.20" + +"@babel/plugin-transform-block-scoped-functions@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz" + integrity sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-block-scoping@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.3.tgz" + integrity sha512-QPZxHrThbQia7UdvfpaRRlq/J9ciz1J4go0k+lPBXbgaNeY7IQrBj/9ceWjvMMI07/ZBzHl/F0R/2K0qH7jCVw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-properties@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz" + integrity sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-static-block@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.3.tgz" + integrity sha512-PENDVxdr7ZxKPyi5Ffc0LjXdnJyrJxyqF5T5YjlVg4a0VFfQHW0r8iAtRiDXkfHlu1wwcvdtnndGYIeJLSuRMQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-transform-classes@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.3.tgz" + integrity sha512-FGEQmugvAEu2QtgtU0uTASXevfLMFfBeVCIIdcQhn/uBQsMTjBajdnAtanQlOcuihWh10PZ7+HWvc7NtBwP74w== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.20" + "@babel/helper-split-export-declaration" "^7.22.6" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz" + integrity sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/template" "^7.22.15" + +"@babel/plugin-transform-destructuring@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz" + integrity sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dotall-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz" + integrity sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-duplicate-keys@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz" + integrity sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dynamic-import@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.3.tgz" + integrity sha512-vTG+cTGxPFou12Rj7ll+eD5yWeNl5/8xvQvF08y5Gv3v4mZQoyFf8/n9zg4q5vvCWt5jmgymfzMAldO7orBn7A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-transform-exponentiation-operator@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz" + integrity sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-export-namespace-from@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.3.tgz" + integrity sha512-yCLhW34wpJWRdTxxWtFZASJisihrfyMOTOQexhVzA78jlU+dH7Dw+zQgcPepQ5F3C6bAIiblZZ+qBggJdHiBAg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-transform-for-of@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.3.tgz" + integrity sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-function-name@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz" + integrity sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw== + dependencies: + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-json-strings@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.3.tgz" + integrity sha512-H9Ej2OiISIZowZHaBwF0tsJOih1PftXJtE8EWqlEIwpc7LMTGq0rPOrywKLQ4nefzx8/HMR0D3JGXoMHYvhi0A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-transform-literals@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz" + integrity sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-logical-assignment-operators@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.3.tgz" + integrity sha512-+pD5ZbxofyOygEp+zZAfujY2ShNCXRpDRIPOiBmTO693hhyOEteZgl876Xs9SAHPQpcV0vz8LvA/T+w8AzyX8A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-transform-member-expression-literals@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz" + integrity sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-modules-amd@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz" + integrity sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw== + dependencies: + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-modules-commonjs@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz" + integrity sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA== + dependencies: + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + +"@babel/plugin-transform-modules-systemjs@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz" + integrity sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ== + dependencies: + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" + +"@babel/plugin-transform-modules-umd@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz" + integrity sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg== + dependencies: + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz" + integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-new-target@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz" + integrity sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.3.tgz" + integrity sha512-xzg24Lnld4DYIdysyf07zJ1P+iIfJpxtVFOzX4g+bsJ3Ng5Le7rXx9KwqKzuyaUeRnt+I1EICwQITqc0E2PmpA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-transform-numeric-separator@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.3.tgz" + integrity sha512-s9GO7fIBi/BLsZ0v3Rftr6Oe4t0ctJ8h4CCXfPoEJwmvAPMyNrfkOOJzm6b9PX9YXcCJWWQd/sBF/N26eBiMVw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-transform-object-rest-spread@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.3.tgz" + integrity sha512-VxHt0ANkDmu8TANdE9Kc0rndo/ccsmfe2Cx2y5sI4hu3AukHQ5wAu4cM7j3ba8B9548ijVyclBU+nuDQftZsog== + dependencies: + "@babel/compat-data" "^7.23.3" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.23.3" + +"@babel/plugin-transform-object-super@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz" + integrity sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.20" + +"@babel/plugin-transform-optional-catch-binding@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.3.tgz" + integrity sha512-LxYSb0iLjUamfm7f1D7GpiS4j0UAC8AOiehnsGAP8BEsIX8EOi3qV6bbctw8M7ZvLtcoZfZX5Z7rN9PlWk0m5A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-transform-optional-chaining@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.3.tgz" + integrity sha512-zvL8vIfIUgMccIAK1lxjvNv572JHFJIKb4MWBz5OGdBQA0fB0Xluix5rmOby48exiJc987neOmP/m9Fnpkz3Tg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz" + integrity sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-methods@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz" + integrity sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-property-in-object@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.3.tgz" + integrity sha512-a5m2oLNFyje2e/rGKjVfAELTVI5mbA0FeZpBnkOWWV7eSmKQ+T/XW0Vf+29ScLzSxX+rnsarvU0oie/4m6hkxA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz" + integrity sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-regenerator@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz" + integrity sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + regenerator-transform "^0.15.2" + +"@babel/plugin-transform-reserved-words@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz" + integrity sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-shorthand-properties@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz" + integrity sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-spread@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz" + integrity sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + +"@babel/plugin-transform-sticky-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz" + integrity sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-template-literals@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz" + integrity sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-typeof-symbol@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz" + integrity sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-typescript@^7.22.10": + version "7.22.10" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.10.tgz" + integrity sha512-7++c8I/ymsDo4QQBAgbraXLzIM6jmfao11KgIBEYZRReWzNWH9NtNgJcyrZiXsOPh523FQm6LfpLyy/U5fn46A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.10" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-typescript" "^7.22.5" + +"@babel/plugin-transform-unicode-escapes@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz" + integrity sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-property-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz" + integrity sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz" + integrity sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-sets-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz" + integrity sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/preset-env@^7.11.0": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.3.tgz" + integrity sha512-ovzGc2uuyNfNAs/jyjIGxS8arOHS5FENZaNn4rtE7UdKMMkqHCvboHfcuhWLZNX5cB44QfcGNWjaevxMzzMf+Q== + dependencies: + "@babel/compat-data" "^7.23.3" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.23.3" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.23.3" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.23.3" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.23.3" + "@babel/plugin-syntax-import-attributes" "^7.23.3" + "@babel/plugin-syntax-import-meta" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.23.3" + "@babel/plugin-transform-async-generator-functions" "^7.23.3" + "@babel/plugin-transform-async-to-generator" "^7.23.3" + "@babel/plugin-transform-block-scoped-functions" "^7.23.3" + "@babel/plugin-transform-block-scoping" "^7.23.3" + "@babel/plugin-transform-class-properties" "^7.23.3" + "@babel/plugin-transform-class-static-block" "^7.23.3" + "@babel/plugin-transform-classes" "^7.23.3" + "@babel/plugin-transform-computed-properties" "^7.23.3" + "@babel/plugin-transform-destructuring" "^7.23.3" + "@babel/plugin-transform-dotall-regex" "^7.23.3" + "@babel/plugin-transform-duplicate-keys" "^7.23.3" + "@babel/plugin-transform-dynamic-import" "^7.23.3" + "@babel/plugin-transform-exponentiation-operator" "^7.23.3" + "@babel/plugin-transform-export-namespace-from" "^7.23.3" + "@babel/plugin-transform-for-of" "^7.23.3" + "@babel/plugin-transform-function-name" "^7.23.3" + "@babel/plugin-transform-json-strings" "^7.23.3" + "@babel/plugin-transform-literals" "^7.23.3" + "@babel/plugin-transform-logical-assignment-operators" "^7.23.3" + "@babel/plugin-transform-member-expression-literals" "^7.23.3" + "@babel/plugin-transform-modules-amd" "^7.23.3" + "@babel/plugin-transform-modules-commonjs" "^7.23.3" + "@babel/plugin-transform-modules-systemjs" "^7.23.3" + "@babel/plugin-transform-modules-umd" "^7.23.3" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.23.3" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.23.3" + "@babel/plugin-transform-numeric-separator" "^7.23.3" + "@babel/plugin-transform-object-rest-spread" "^7.23.3" + "@babel/plugin-transform-object-super" "^7.23.3" + "@babel/plugin-transform-optional-catch-binding" "^7.23.3" + "@babel/plugin-transform-optional-chaining" "^7.23.3" + "@babel/plugin-transform-parameters" "^7.23.3" + "@babel/plugin-transform-private-methods" "^7.23.3" + "@babel/plugin-transform-private-property-in-object" "^7.23.3" + "@babel/plugin-transform-property-literals" "^7.23.3" + "@babel/plugin-transform-regenerator" "^7.23.3" + "@babel/plugin-transform-reserved-words" "^7.23.3" + "@babel/plugin-transform-shorthand-properties" "^7.23.3" + "@babel/plugin-transform-spread" "^7.23.3" + "@babel/plugin-transform-sticky-regex" "^7.23.3" + "@babel/plugin-transform-template-literals" "^7.23.3" + "@babel/plugin-transform-typeof-symbol" "^7.23.3" + "@babel/plugin-transform-unicode-escapes" "^7.23.3" + "@babel/plugin-transform-unicode-property-regex" "^7.23.3" + "@babel/plugin-transform-unicode-regex" "^7.23.3" + "@babel/plugin-transform-unicode-sets-regex" "^7.23.3" + "@babel/preset-modules" "0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2 "^0.4.6" + babel-plugin-polyfill-corejs3 "^0.8.5" + babel-plugin-polyfill-regenerator "^0.5.3" + core-js-compat "^3.31.0" + semver "^6.3.1" + +"@babel/preset-modules@0.1.6-no-external-plugins": + version "0.1.6-no-external-plugins" + resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + +"@babel/runtime@^7.10.5", "@babel/runtime@^7.11.2", "@babel/runtime@^7.8.4": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz" + integrity sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog== + +"@babel/template@^7.22.15", "@babel/template@^7.22.5", "@babel/template@^7.25.9", "@babel/template@^7.27.1": + version "7.27.2" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz" + integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/parser" "^7.27.2" + "@babel/types" "^7.27.1" + +"@babel/traverse@^7.22.10", "@babel/traverse@^7.22.5": + version "7.26.5" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.5.tgz" + integrity sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ== + dependencies: + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.5" + "@babel/parser" "^7.26.5" + "@babel/template" "^7.25.9" + "@babel/types" "^7.26.5" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.22.10", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.26.5", "@babel/types@^7.27.1", "@babel/types@^7.4.4": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz" + integrity sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + +"@ctrl/tinycolor@^3.4.0": + version "3.6.1" + resolved "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz" + integrity sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA== + +"@esbuild/android-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz" + integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== + +"@esbuild/android-arm@0.18.20": + version "0.18.20" + resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz" + integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== + +"@esbuild/android-x64@0.18.20": + version "0.18.20" + resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz" + integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== + +"@esbuild/darwin-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz" + integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== + +"@esbuild/darwin-x64@0.18.20": + version "0.18.20" + resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz" + integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== + +"@esbuild/freebsd-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz" + integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== + +"@esbuild/freebsd-x64@0.18.20": + version "0.18.20" + resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz" + integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== + +"@esbuild/linux-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz" + integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== + +"@esbuild/linux-arm@0.18.20": + version "0.18.20" + resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz" + integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== + +"@esbuild/linux-ia32@0.18.20": + version "0.18.20" + resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz" + integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== + +"@esbuild/linux-loong64@0.18.20": + version "0.18.20" + resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz" + integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== + +"@esbuild/linux-mips64el@0.18.20": + version "0.18.20" + resolved "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz" + integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== + +"@esbuild/linux-ppc64@0.18.20": + version "0.18.20" + resolved "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz" + integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== + +"@esbuild/linux-riscv64@0.18.20": + version "0.18.20" + resolved "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz" + integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== + +"@esbuild/linux-s390x@0.18.20": + version "0.18.20" + resolved "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz" + integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== + +"@esbuild/linux-x64@0.18.20": + version "0.18.20" + resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz" + integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== + +"@esbuild/netbsd-x64@0.18.20": + version "0.18.20" + resolved "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz" + integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== + +"@esbuild/openbsd-x64@0.18.20": + version "0.18.20" + resolved "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz" + integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== + +"@esbuild/sunos-x64@0.18.20": + version "0.18.20" + resolved "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz" + integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== + +"@esbuild/win32-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz" + integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== + +"@esbuild/win32-ia32@0.18.20": + version "0.18.20" + resolved "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz" + integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== + +"@esbuild/win32-x64@0.18.20": + version "0.18.20" + resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz" + integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.0" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": + version "4.6.2" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz" + integrity sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw== + +"@eslint/eslintrc@^2.1.2": + version "2.1.2" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz" + integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@^8.47.0": + version "8.47.0" + resolved "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz" + integrity sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og== + +"@humanwhocodes/config-array@^0.11.10": + version "0.11.10" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz" + integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@iconify/types@^2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz" + integrity sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg== + +"@iconify/utils@^2.1.7": + version "2.1.8" + resolved "https://registry.npmjs.org/@iconify/utils/-/utils-2.1.8.tgz" + integrity sha512-XoaEvkh96MfeJaDftOwz7MG3zXOfDlgbHGGVcOEVPpccsqK3yGn3vFcBC3H5ddEPVU9AXOH1sTRqBVa7AFlqCw== + dependencies: + "@antfu/install-pkg" "^0.1.1" + "@antfu/utils" "^0.7.5" + "@iconify/types" "^2.0.0" + debug "^4.3.4" + kolorist "^1.8.0" + local-pkg "^0.4.3" + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.5": + version "0.3.8" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz" + integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/source-map@^0.3.3": + version "0.3.5" + resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz" + integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": + version "1.4.15" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.25" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@lottiefiles/dotlottie-vue@^0.4.9": + version "0.4.9" + resolved "https://registry.npmjs.org/@lottiefiles/dotlottie-vue/-/dotlottie-vue-0.4.9.tgz" + integrity sha512-sumrYZpY954FY43tZVtsxViV+7qxHT7NXUqHkBylYF8nwddxZjBLiJZ82XmkMuUFR4X/dGMxOPgg/tLhR2CwFg== + dependencies: + "@lottiefiles/dotlottie-web" "0.30.2" + +"@lottiefiles/dotlottie-web@0.30.2": + version "0.30.2" + resolved "https://registry.npmjs.org/@lottiefiles/dotlottie-web/-/dotlottie-web-0.30.2.tgz" + integrity sha512-HAUDPouNGqSIB+6b72bSmv6AC+RpMKk5RAzd9G2Wj9m/+pZRlQTFRUYBMqcRgkCtXIOagkgtwQw9fMg1/a4gxQ== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@pkgr/utils@^2.3.1": + version "2.4.2" + resolved "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz" + integrity sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw== + dependencies: + cross-spawn "^7.0.3" + fast-glob "^3.3.0" + is-glob "^4.0.3" + open "^9.1.0" + picocolors "^1.0.0" + tslib "^2.6.0" + +"@polka/url@^1.0.0-next.20": + version "1.0.0-next.21" + resolved "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz" + integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== + +"@rollup/plugin-babel@^5.2.0": + version "5.3.1" + resolved "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz" + integrity sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q== + dependencies: + "@babel/helper-module-imports" "^7.10.4" + "@rollup/pluginutils" "^3.1.0" + +"@rollup/plugin-node-resolve@^11.2.1": + version "11.2.1" + resolved "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz" + integrity sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg== + dependencies: + "@rollup/pluginutils" "^3.1.0" + "@types/resolve" "1.17.1" + builtin-modules "^3.1.0" + deepmerge "^4.2.2" + is-module "^1.0.0" + resolve "^1.19.0" + +"@rollup/plugin-replace@^2.4.1": + version "2.4.2" + resolved "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz" + integrity sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg== + dependencies: + "@rollup/pluginutils" "^3.1.0" + magic-string "^0.25.7" + +"@rollup/pluginutils@^3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz" + integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== + dependencies: + "@types/estree" "0.0.39" + estree-walker "^1.0.1" + picomatch "^2.2.2" + +"@rollup/pluginutils@^5.0.2", "@rollup/pluginutils@^5.0.3": + version "5.0.3" + resolved "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.3.tgz" + integrity sha512-hfllNN4a80rwNQ9QCxhxuHCGHMAvabXqxNdaChUSSadMre7t4iEUI6fFAhBOn/eIYTgYVhBv7vCLsAJ4u3lf3g== + dependencies: + "@types/estree" "^1.0.0" + estree-walker "^2.0.2" + picomatch "^2.3.1" + +"@rushstack/eslint-patch@^1.3.2": + version "1.3.3" + resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.3.tgz" + integrity sha512-0xd7qez0AQ+MbHatZTlI1gu5vkG8r7MYRUJAHPAHJBmGLs16zpkrpAVLvjQKQOqaXPDUBwOiJzNc00znHSCVBw== + +"@simonwep/pickr@~1.8.0": + version "1.8.2" + resolved "https://registry.npmjs.org/@simonwep/pickr/-/pickr-1.8.2.tgz" + integrity sha512-/l5w8BIkrpP6n1xsetx9MWPWlU6OblN5YgZZphxan0Tq4BByTCETL6lyIeY8lagalS2Nbt4F2W034KHLIiunKA== + dependencies: + core-js "^3.15.1" + nanopop "^2.1.0" + +"@surma/rollup-plugin-off-main-thread@^2.2.3": + version "2.2.3" + resolved "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz" + integrity sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ== + dependencies: + ejs "^3.1.6" + json5 "^2.2.0" + magic-string "^0.25.0" + string.prototype.matchall "^4.0.6" + +"@tsconfig/node18@^18.2.0": + version "18.2.0" + resolved "https://registry.npmjs.org/@tsconfig/node18/-/node18-18.2.0.tgz" + integrity sha512-yhxwIlFVSVcMym3O31HoMnRXpoenmpIxcj4Yoes2DUpe+xCJnA7ECQP1Vw889V0jTt/2nzvpLQ/UuMYCd3JPIg== + +"@types/estree@0.0.39": + version "0.0.39" + resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + +"@types/estree@^1.0.0": + version "1.0.1" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz" + integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== + +"@types/json-schema@^7.0.9": + version "7.0.12" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz" + integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== + +"@types/lodash@^4.17.7": + version "4.17.7" + resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.7.tgz" + integrity sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA== + +"@types/node@*", "@types/node@^18.17.0": + version "18.17.5" + resolved "https://registry.npmjs.org/@types/node/-/node-18.17.5.tgz" + integrity sha512-xNbS75FxH6P4UXTPUJp/zNPq6/xsfdJKussCWNOnz4aULWIRwMgP1LgaB5RiBnMX1DPCYenuqGZfnIAx5mbFLA== + +"@types/resolve@1.17.1": + version "1.17.1" + resolved "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz" + integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== + dependencies: + "@types/node" "*" + +"@types/semver@^7.3.12": + version "7.5.0" + resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz" + integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== + +"@types/trusted-types@^2.0.2": + version "2.0.6" + resolved "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.6.tgz" + integrity sha512-HYtNooPvUY9WAVRBr4u+4Qa9fYD1ze2IUlAD3HoA6oehn1taGwBx3Oa52U4mTslTS+GAExKpaFu39Y5xUEwfjg== + +"@types/web-bluetooth@^0.0.20": + version "0.0.20" + resolved "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz" + integrity sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow== + +"@typescript-eslint/eslint-plugin@^5.59.1": + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz" + integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== + dependencies: + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/type-utils" "5.62.0" + "@typescript-eslint/utils" "5.62.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/parser@^5.59.1": + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz" + integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== + dependencies: + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + +"@typescript-eslint/type-utils@5.62.0": + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz" + integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== + dependencies: + "@typescript-eslint/typescript-estree" "5.62.0" + "@typescript-eslint/utils" "5.62.0" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== + +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.62.0": + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + eslint-scope "^5.1.1" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== + dependencies: + "@typescript-eslint/types" "5.62.0" + eslint-visitor-keys "^3.3.0" + +"@unocss/astro@0.55.1": + version "0.55.1" + resolved "https://registry.npmjs.org/@unocss/astro/-/astro-0.55.1.tgz" + integrity sha512-t3eibW16Dx+Wck8rkQ2+Xt4z1y5XoiS5jXcKqHRV9GqhbG9IyY7/Rp3nyBoHGZSAnZhdczjgBB9xnU2W6X7tAA== + dependencies: + "@unocss/core" "0.55.1" + "@unocss/reset" "0.55.1" + "@unocss/vite" "0.55.1" + +"@unocss/cli@0.55.1": + version "0.55.1" + resolved "https://registry.npmjs.org/@unocss/cli/-/cli-0.55.1.tgz" + integrity sha512-qH18Coozb/5XeoU/kiByppHayVXcnDWcKJecdz90u2OusQQjsPuJcfNdbh2EbSdOv44QVvyEHmHsO/gBn42DRw== + dependencies: + "@ampproject/remapping" "^2.2.1" + "@rollup/pluginutils" "^5.0.3" + "@unocss/config" "0.55.1" + "@unocss/core" "0.55.1" + "@unocss/preset-uno" "0.55.1" + cac "^6.7.14" + chokidar "^3.5.3" + colorette "^2.0.20" + consola "^3.2.3" + fast-glob "^3.3.1" + magic-string "^0.30.2" + pathe "^1.1.1" + perfect-debounce "^1.0.0" + +"@unocss/config@0.55.1": + version "0.55.1" + resolved "https://registry.npmjs.org/@unocss/config/-/config-0.55.1.tgz" + integrity sha512-4wfNagEgROxb8RAw3X8oKoyZijJaI34QGp1kblqJXHh1eoRhmvL8UIx/8Lhmb2JA6xaZa2CYl9uOBqlChw5MIQ== + dependencies: + "@unocss/core" "0.55.1" + unconfig "^0.3.10" + +"@unocss/core@0.55.1": + version "0.55.1" + resolved "https://registry.npmjs.org/@unocss/core/-/core-0.55.1.tgz" + integrity sha512-hZffURZtvH72UvobL9anzE1t7PDldBa89fxWVIsjLb8KHReNfcOv8uEepce0ODUfGrdWPbij017XG/HY5YUexg== + +"@unocss/extractor-arbitrary-variants@0.55.1": + version "0.55.1" + resolved "https://registry.npmjs.org/@unocss/extractor-arbitrary-variants/-/extractor-arbitrary-variants-0.55.1.tgz" + integrity sha512-8PMN4web1Fwk6LtJKgYJy0Kw16bPn49jTKdlPCN3CGpNN8th1ORFwMpESMRHDKhQ42PdA7+aJOTeLLJ9oY3Jrg== + dependencies: + "@unocss/core" "0.55.1" + +"@unocss/inspector@0.55.1": + version "0.55.1" + resolved "https://registry.npmjs.org/@unocss/inspector/-/inspector-0.55.1.tgz" + integrity sha512-Rfi0UUUbkaapKDcF68t7DvKUYLC3PD2bwK69/uXSE3z4C7X1S9BRDmgzYuBlL3cZlhof47z79m4kfUXxupmhmA== + dependencies: + gzip-size "^6.0.0" + sirv "^2.0.3" + +"@unocss/postcss@0.55.1": + version "0.55.1" + resolved "https://registry.npmjs.org/@unocss/postcss/-/postcss-0.55.1.tgz" + integrity sha512-eQ6kixUujbvUGZaPM56Qxqau4Fie9uSyJiR/s26j77tq2GdOhKIURk0oRgjh4jjyQyE6V6SlypJ5HPoyclpelQ== + dependencies: + "@unocss/config" "0.55.1" + "@unocss/core" "0.55.1" + css-tree "^2.3.1" + fast-glob "^3.3.1" + magic-string "^0.30.2" + postcss "^8.4.28" + +"@unocss/preset-attributify@0.55.1": + version "0.55.1" + resolved "https://registry.npmjs.org/@unocss/preset-attributify/-/preset-attributify-0.55.1.tgz" + integrity sha512-DX3PMeW0atZiCu3YULVbVAhuvy2bx27hAbE9Wo+QGs+MY0hK6+ilsWqsDzNmScHze5zW2HlNwucdtPs8TiV7dA== + dependencies: + "@unocss/core" "0.55.1" + +"@unocss/preset-icons@0.55.1": + version "0.55.1" + resolved "https://registry.npmjs.org/@unocss/preset-icons/-/preset-icons-0.55.1.tgz" + integrity sha512-gml2I6hGbBDrGaqq4TJu81pIeUvR3m/y/wH2BovIYicVhuk5NyBLTXJ7NxJY5y5FmE0AmNM1/Ctju3ZiDvj/pA== + dependencies: + "@iconify/utils" "^2.1.7" + "@unocss/core" "0.55.1" + ofetch "^1.1.1" + +"@unocss/preset-mini@0.55.1": + version "0.55.1" + resolved "https://registry.npmjs.org/@unocss/preset-mini/-/preset-mini-0.55.1.tgz" + integrity sha512-HPq/jGD4Y21eCAbhEGkxxdEMXW+phuU897vVoYcwO8pIB6cO5ORXl8x/M70MU1LetyfEX5/1bkh7EX4+689JIg== + dependencies: + "@unocss/core" "0.55.1" + "@unocss/extractor-arbitrary-variants" "0.55.1" + +"@unocss/preset-tagify@0.55.1": + version "0.55.1" + resolved "https://registry.npmjs.org/@unocss/preset-tagify/-/preset-tagify-0.55.1.tgz" + integrity sha512-0avQOWUFJru7aTrOcJL1xhSTVIOk4CCuVHRgy9kW9w29iKsuY3ZoAT2xjpfyQrA6Is4u87eobR34X7SrHG32zQ== + dependencies: + "@unocss/core" "0.55.1" + +"@unocss/preset-typography@0.55.1": + version "0.55.1" + resolved "https://registry.npmjs.org/@unocss/preset-typography/-/preset-typography-0.55.1.tgz" + integrity sha512-AB4I5KE1HN3WjkPAnqQ5iJ2fZMOd2cNEExajQDgdj4MaAeWMZCwlgTCaCDULxiaHy+0n4fM9pm/5ABQdLHxxFA== + dependencies: + "@unocss/core" "0.55.1" + "@unocss/preset-mini" "0.55.1" + +"@unocss/preset-uno@0.55.1": + version "0.55.1" + resolved "https://registry.npmjs.org/@unocss/preset-uno/-/preset-uno-0.55.1.tgz" + integrity sha512-4xqSvsuzsyFe97x93sFloYvd5+yly5KYx8+zvk19ZXrNbkft/ewGyZyzgZ8tyGjuNg0lcEiE3PhKv4mjqFPG2g== + dependencies: + "@unocss/core" "0.55.1" + "@unocss/preset-mini" "0.55.1" + "@unocss/preset-wind" "0.55.1" + +"@unocss/preset-web-fonts@0.55.1": + version "0.55.1" + resolved "https://registry.npmjs.org/@unocss/preset-web-fonts/-/preset-web-fonts-0.55.1.tgz" + integrity sha512-ggYOWBQwJIKpU/8MAXzYd1gEHIzP7ajScKx8UkGYePL3ZOww42G6PvovEIZ9BFm8vlx/EWH1HEjBXFzsZIF5GQ== + dependencies: + "@unocss/core" "0.55.1" + ofetch "^1.1.1" + +"@unocss/preset-wind@0.55.1": + version "0.55.1" + resolved "https://registry.npmjs.org/@unocss/preset-wind/-/preset-wind-0.55.1.tgz" + integrity sha512-ah7qJ9uBG0NlTMs67mMEBxRogWMgysXoElQaqtlaJjYllVVIuGWgTj5weF6iQJn6Jup6DXOHXYJ0A49Fh7DRug== + dependencies: + "@unocss/core" "0.55.1" + "@unocss/preset-mini" "0.55.1" + +"@unocss/reset@0.55.1": + version "0.55.1" + resolved "https://registry.npmjs.org/@unocss/reset/-/reset-0.55.1.tgz" + integrity sha512-WMMxun0HtS8WD4q7F3nWM9Yal/eDt0KviMlVIqcCdlQYdaOHyVDwpON3htZrGL/HwrbofUYYgJXp59yyrAmrRw== + +"@unocss/scope@0.55.1": + version "0.55.1" + resolved "https://registry.npmjs.org/@unocss/scope/-/scope-0.55.1.tgz" + integrity sha512-Je4kAdnMnDFaxHlMjmhjhmRqRVIdDslSxSU2Gj8gxAm2bEOrYcBya0T51UgTH51Hpm3nBoq8Qhldcpott7aC6w== + +"@unocss/transformer-attributify-jsx-babel@0.55.1": + version "0.55.1" + resolved "https://registry.npmjs.org/@unocss/transformer-attributify-jsx-babel/-/transformer-attributify-jsx-babel-0.55.1.tgz" + integrity sha512-EzSxzxMvBAfwYXjSCE0o6gV4x0Ok15B/dZOAl996AN/AwvoL3c0rLIYxqBGOpg3AA8c7xlZJyB7VkzidcZKoTw== + dependencies: + "@unocss/core" "0.55.1" + +"@unocss/transformer-attributify-jsx@0.55.1": + version "0.55.1" + resolved "https://registry.npmjs.org/@unocss/transformer-attributify-jsx/-/transformer-attributify-jsx-0.55.1.tgz" + integrity sha512-xyjnOnr9TE1Ejeg6HfAS3Mtsr3WaLdm+LhBZSvpfSgq3sZy85NAZHM/VG7iTwQdH0ysDDScvQkZR4g/WehhN+Q== + dependencies: + "@unocss/core" "0.55.1" + +"@unocss/transformer-compile-class@0.55.1": + version "0.55.1" + resolved "https://registry.npmjs.org/@unocss/transformer-compile-class/-/transformer-compile-class-0.55.1.tgz" + integrity sha512-5IrJtScYJN5xBmmPqseFHwF0UaIdUEbdn/ASYHV5nx/7FXban+Igx3fVC9xrS+D/W8UN9TcXsBIaq5qoRK9t4w== + dependencies: + "@unocss/core" "0.55.1" + +"@unocss/transformer-directives@0.55.1": + version "0.55.1" + resolved "https://registry.npmjs.org/@unocss/transformer-directives/-/transformer-directives-0.55.1.tgz" + integrity sha512-MRySoH06AHfKXmNBudYqElRNcOtP9BR3x/M/qKtFaJmQ2QC6fyune3lYGWKZcTl64YPbBpfaw+XXn1NFO9JYDw== + dependencies: + "@unocss/core" "0.55.1" + css-tree "^2.3.1" + +"@unocss/transformer-variant-group@0.55.1": + version "0.55.1" + resolved "https://registry.npmjs.org/@unocss/transformer-variant-group/-/transformer-variant-group-0.55.1.tgz" + integrity sha512-DYu11I6gTygImxe+jehgftIp2pX7YL9ge+W+8hIihkQnRBFX6HozTOSzWx5i1W8o2werLSlWorXaaDG0qbl7Qg== + dependencies: + "@unocss/core" "0.55.1" + +"@unocss/vite@0.55.1": + version "0.55.1" + resolved "https://registry.npmjs.org/@unocss/vite/-/vite-0.55.1.tgz" + integrity sha512-wf1YZBk/Pw0poo3QBXXCCwM7qq83lXoKNdqKVui5H+iCa0haRkscHX6/2PmJVRgczdpCG9/kFl3tDI3KzQdOkA== + dependencies: + "@ampproject/remapping" "^2.2.1" + "@rollup/pluginutils" "^5.0.3" + "@unocss/config" "0.55.1" + "@unocss/core" "0.55.1" + "@unocss/inspector" "0.55.1" + "@unocss/scope" "0.55.1" + "@unocss/transformer-directives" "0.55.1" + chokidar "^3.5.3" + fast-glob "^3.3.1" + magic-string "^0.30.2" + +"@vant/popperjs@^1.3.0": + version "1.3.0" + resolved "https://registry.npmjs.org/@vant/popperjs/-/popperjs-1.3.0.tgz" + integrity sha512-hB+czUG+aHtjhaEmCJDuXOep0YTZjdlRR+4MSmIFnkCQIxJaXLQdSsR90XWvAI2yvKUI7TCGqR8pQg2RtvkMHw== + +"@vant/use@^1.6.0": + version "1.6.0" + resolved "https://registry.npmjs.org/@vant/use/-/use-1.6.0.tgz" + integrity sha512-PHHxeAASgiOpSmMjceweIrv2AxDZIkWXyaczksMoWvKV2YAYEhoizRuk/xFnKF+emUIi46TsQ+rvlm/t2BBCfA== + +"@vitejs/plugin-vue-jsx@^3.0.1": + version "3.0.2" + resolved "https://registry.npmjs.org/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-3.0.2.tgz" + integrity sha512-obF26P2Z4Ogy3cPp07B4VaW6rpiu0ue4OT2Y15UxT5BZZ76haUY9guOsZV3uWh/I6xc+VeiW+ZVabRE82FyzWw== + dependencies: + "@babel/core" "^7.22.10" + "@babel/plugin-transform-typescript" "^7.22.10" + "@vue/babel-plugin-jsx" "^1.1.5" + +"@vitejs/plugin-vue@^4.2.3": + version "4.3.1" + resolved "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.3.1.tgz" + integrity sha512-tUBEtWcF7wFtII7ayNiLNDTCE1X1afySEo+XNVMNkFXaThENyCowIEX095QqbJZGTgoOcSVDJGlnde2NG4jtbQ== + +"@volar/language-core@2.4.11", "@volar/language-core@~2.4.11": + version "2.4.11" + resolved "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.11.tgz" + integrity sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg== + dependencies: + "@volar/source-map" "2.4.11" + +"@volar/source-map@2.4.11": + version "2.4.11" + resolved "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.11.tgz" + integrity sha512-ZQpmafIGvaZMn/8iuvCFGrW3smeqkq/IIh9F1SdSx9aUl0J4Iurzd6/FhmjNO5g2ejF3rT45dKskgXWiofqlZQ== + +"@volar/typescript@~2.4.11": + version "2.4.11" + resolved "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.11.tgz" + integrity sha512-2DT+Tdh88Spp5PyPbqhyoYavYCPDsqbHLFwcUI9K1NlY1YgUJvujGdrqUp0zWxnW7KWNTr3xSpMuv2WnaTKDAw== + dependencies: + "@volar/language-core" "2.4.11" + path-browserify "^1.0.1" + vscode-uri "^3.0.8" + +"@vue/babel-helper-vue-transform-on@^1.1.5": + version "1.1.5" + resolved "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.1.5.tgz" + integrity sha512-SgUymFpMoAyWeYWLAY+MkCK3QEROsiUnfaw5zxOVD/M64KQs8D/4oK6Q5omVA2hnvEOE0SCkH2TZxs/jnnUj7w== + +"@vue/babel-plugin-jsx@^1.1.5": + version "1.1.5" + resolved "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.5.tgz" + integrity sha512-nKs1/Bg9U1n3qSWnsHhCVQtAzI6aQXqua8j/bZrau8ywT1ilXQbK4FwEJGmU8fV7tcpuFvWmmN7TMmV1OBma1g== + dependencies: + "@babel/helper-module-imports" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" + "@vue/babel-helper-vue-transform-on" "^1.1.5" + camelcase "^6.3.0" + html-tags "^3.3.1" + svg-tags "^1.0.0" + +"@vue/compiler-core@3.3.4": + version "3.3.4" + resolved "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.4.tgz" + integrity sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g== + dependencies: + "@babel/parser" "^7.21.3" + "@vue/shared" "3.3.4" + estree-walker "^2.0.2" + source-map-js "^1.0.2" + +"@vue/compiler-core@3.5.13": + version "3.5.13" + resolved "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz" + integrity sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q== + dependencies: + "@babel/parser" "^7.25.3" + "@vue/shared" "3.5.13" + entities "^4.5.0" + estree-walker "^2.0.2" + source-map-js "^1.2.0" + +"@vue/compiler-dom@3.3.4": + version "3.3.4" + resolved "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz" + integrity sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w== + dependencies: + "@vue/compiler-core" "3.3.4" + "@vue/shared" "3.3.4" + +"@vue/compiler-dom@^3.5.0": + version "3.5.13" + resolved "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz" + integrity sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA== + dependencies: + "@vue/compiler-core" "3.5.13" + "@vue/shared" "3.5.13" + +"@vue/compiler-sfc@3.3.4": + version "3.3.4" + resolved "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz" + integrity sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ== + dependencies: + "@babel/parser" "^7.20.15" + "@vue/compiler-core" "3.3.4" + "@vue/compiler-dom" "3.3.4" + "@vue/compiler-ssr" "3.3.4" + "@vue/reactivity-transform" "3.3.4" + "@vue/shared" "3.3.4" + estree-walker "^2.0.2" + magic-string "^0.30.0" + postcss "^8.1.10" + source-map-js "^1.0.2" + +"@vue/compiler-ssr@3.3.4": + version "3.3.4" + resolved "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz" + integrity sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ== + dependencies: + "@vue/compiler-dom" "3.3.4" + "@vue/shared" "3.3.4" + +"@vue/compiler-vue2@^2.7.16": + version "2.7.16" + resolved "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz" + integrity sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A== + dependencies: + de-indent "^1.0.2" + he "^1.2.0" + +"@vue/devtools-api@^6.5.0": + version "6.5.0" + resolved "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz" + integrity sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q== + +"@vue/eslint-config-prettier@^8.0.0": + version "8.0.0" + resolved "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-8.0.0.tgz" + integrity sha512-55dPqtC4PM/yBjhAr+yEw6+7KzzdkBuLmnhBrDfp4I48+wy+Giqqj9yUr5T2uD/BkBROjjmqnLZmXRdOx/VtQg== + dependencies: + eslint-config-prettier "^8.8.0" + eslint-plugin-prettier "^5.0.0" + +"@vue/eslint-config-typescript@^11.0.3": + version "11.0.3" + resolved "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-11.0.3.tgz" + integrity sha512-dkt6W0PX6H/4Xuxg/BlFj5xHvksjpSlVjtkQCpaYJBIEuKj2hOVU7r+TIe+ysCwRYFz/lGqvklntRkCAibsbPw== + dependencies: + "@typescript-eslint/eslint-plugin" "^5.59.1" + "@typescript-eslint/parser" "^5.59.1" + vue-eslint-parser "^9.1.1" + +"@vue/language-core@2.2.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.0.tgz" + integrity sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw== + dependencies: + "@volar/language-core" "~2.4.11" + "@vue/compiler-dom" "^3.5.0" + "@vue/compiler-vue2" "^2.7.16" + "@vue/shared" "^3.5.0" + alien-signals "^0.4.9" + minimatch "^9.0.3" + muggle-string "^0.4.1" + path-browserify "^1.0.1" + +"@vue/reactivity-transform@3.3.4": + version "3.3.4" + resolved "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz" + integrity sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw== + dependencies: + "@babel/parser" "^7.20.15" + "@vue/compiler-core" "3.3.4" + "@vue/shared" "3.3.4" + estree-walker "^2.0.2" + magic-string "^0.30.0" + +"@vue/reactivity@3.3.4": + version "3.3.4" + resolved "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.4.tgz" + integrity sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ== + dependencies: + "@vue/shared" "3.3.4" + +"@vue/runtime-core@3.3.4": + version "3.3.4" + resolved "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.4.tgz" + integrity sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA== + dependencies: + "@vue/reactivity" "3.3.4" + "@vue/shared" "3.3.4" + +"@vue/runtime-dom@3.3.4": + version "3.3.4" + resolved "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz" + integrity sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ== + dependencies: + "@vue/runtime-core" "3.3.4" + "@vue/shared" "3.3.4" + csstype "^3.1.1" + +"@vue/server-renderer@3.3.4": + version "3.3.4" + resolved "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.4.tgz" + integrity sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ== + dependencies: + "@vue/compiler-ssr" "3.3.4" + "@vue/shared" "3.3.4" + +"@vue/shared@3.3.4", "@vue/shared@^3.0.0": + version "3.3.4" + resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.3.4.tgz" + integrity sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ== + +"@vue/shared@3.5.13", "@vue/shared@^3.5.0": + version "3.5.13" + resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz" + integrity sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ== + +"@vue/tsconfig@^0.4.0": + version "0.4.0" + resolved "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.4.0.tgz" + integrity sha512-CPuIReonid9+zOG/CGTT05FXrPYATEqoDGNrEaqS4hwcw5BUNM2FguC0mOwJD4Jr16UpRVl9N0pY3P+srIbqmg== + +"@vueuse/core@^10.5.0": + version "10.6.0" + resolved "https://registry.npmjs.org/@vueuse/core/-/core-10.6.0.tgz" + integrity sha512-+Yee+g9+9BEbvkyGdn4Bf4yZx9EfocAytpV2ZlrlP7xcz+qznLmZIDqDroTvc5vtMkWZicisgEv8dt3+jL+HQg== + dependencies: + "@types/web-bluetooth" "^0.0.20" + "@vueuse/metadata" "10.6.0" + "@vueuse/shared" "10.6.0" + vue-demi ">=0.14.6" + +"@vueuse/metadata@10.6.0": + version "10.6.0" + resolved "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.6.0.tgz" + integrity sha512-mzKHkHoiK6xVz01VzQjM2l6ofUanEaofgEGPgDHcAzlvOTccPRTIdEuzneOUTYxgfm1vkDikS6rtrEw/NYlaTQ== + +"@vueuse/shared@10.6.0": + version "10.6.0" + resolved "https://registry.npmjs.org/@vueuse/shared/-/shared-10.6.0.tgz" + integrity sha512-0t4MVE18sO+/4Gh0jfeOXBTjKeV4606N9kIrDOLPjFl8Rwnlodn+QC5A4LfJuysK7aOsTMjF3KnzNeueaI0xlQ== + dependencies: + vue-demi ">=0.14.6" + +"@yr/monotone-cubic-spline@^1.0.3": + version "1.0.3" + resolved "https://registry.npmjs.org/@yr/monotone-cubic-spline/-/monotone-cubic-spline-1.0.3.tgz" + integrity sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.8.2, acorn@^8.9.0: + version "8.10.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.6.0: + version "8.12.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +alien-signals@^0.4.9: + version "0.4.14" + resolved "https://registry.npmjs.org/alien-signals/-/alien-signals-0.4.14.tgz" + integrity sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ant-design-vue@^3.2.20: + version "3.2.20" + resolved "https://registry.npmjs.org/ant-design-vue/-/ant-design-vue-3.2.20.tgz" + integrity sha512-YWpMfGaGoRastIXEYfCoJiaRiDHk4chqtYhlKQM5GqPt6NfvrM1Vg2e60yHtjxlZjed91wCMm0rAmyUr7Hwzdg== + dependencies: + "@ant-design/colors" "^6.0.0" + "@ant-design/icons-vue" "^6.1.0" + "@babel/runtime" "^7.10.5" + "@ctrl/tinycolor" "^3.4.0" + "@simonwep/pickr" "~1.8.0" + array-tree-filter "^2.1.0" + async-validator "^4.0.0" + dayjs "^1.10.5" + dom-align "^1.12.1" + dom-scroll-into-view "^2.0.0" + lodash "^4.17.21" + lodash-es "^4.17.15" + resize-observer-polyfill "^1.5.1" + scroll-into-view-if-needed "^2.2.25" + shallow-equal "^1.0.0" + vue-types "^3.0.0" + warning "^4.0.0" + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +apexcharts@^3.44.0: + version "3.44.0" + resolved "https://registry.npmjs.org/apexcharts/-/apexcharts-3.44.0.tgz" + integrity sha512-u7Xzrbcxc2yWznN78Jh5NMCYVAsWDfBjRl5ea++rVzFAqjU2hLz4RgKIFwYOBDRQtW1e/Qz8azJTqIJ1+Vu9Qg== + dependencies: + "@yr/monotone-cubic-spline" "^1.0.3" + svg.draggable.js "^2.2.2" + svg.easing.js "^2.0.0" + svg.filter.js "^2.0.2" + svg.pathmorphing.js "^0.1.3" + svg.resize.js "^1.4.3" + svg.select.js "^3.0.1" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + +array-tree-filter@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz" + integrity sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +arraybuffer.prototype.slice@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz" + integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" + +async-validator@^4.0.0: + version "4.2.5" + resolved "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz" + integrity sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg== + +async@^3.2.3: + version "3.2.5" + resolved "https://registry.npmjs.org/async/-/async-3.2.5.tgz" + integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +axios@^1.6.2: + version "1.9.0" + resolved "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz" + integrity sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +babel-plugin-polyfill-corejs2@^0.4.6: + version "0.4.6" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz" + integrity sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.4.3" + semver "^6.3.1" + +babel-plugin-polyfill-corejs3@^0.8.5: + version "0.8.6" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz" + integrity sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.3" + core-js-compat "^3.33.1" + +babel-plugin-polyfill-regenerator@^0.5.3: + version "0.5.3" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz" + integrity sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.3" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +big-integer@^1.6.44: + version "1.6.51" + resolved "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz" + integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + +bplist-parser@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz" + integrity sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw== + dependencies: + big-integer "^1.6.44" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +browserslist@^4.21.9, browserslist@^4.22.1: + version "4.22.1" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz" + integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== + dependencies: + caniuse-lite "^1.0.30001541" + electron-to-chromium "^1.4.535" + node-releases "^2.0.13" + update-browserslist-db "^1.0.13" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +builtin-modules@^3.1.0: + version "3.3.0" + resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz" + integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== + +bundle-name@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz" + integrity sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw== + dependencies: + run-applescript "^5.0.0" + +cac@^6.7.14: + version "6.7.14" + resolved "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz" + integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^6.3.0: + version "6.3.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001541: + version "1.0.30001561" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz" + integrity sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw== + +chalk@^2.4.1: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.0.2: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colorette@^2.0.20: + version "2.0.20" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +common-tags@^1.8.0: + version "1.8.2" + resolved "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz" + integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== + +compute-scroll-into-view@^1.0.20: + version "1.0.20" + resolved "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz" + integrity sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +consola@^3.2.3: + version "3.2.3" + resolved "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz" + integrity sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ== + +convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +copy-anything@^2.0.1: + version "2.0.6" + resolved "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz" + integrity sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw== + dependencies: + is-what "^3.14.1" + +core-js-compat@^3.31.0, core-js-compat@^3.33.1: + version "3.33.2" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.2.tgz" + integrity sha512-axfo+wxFVxnqf8RvxTzoAlzW4gRoacrHeoFlc9n0x50+7BEyZL/Rt3hicaED1/CEd7I6tPCPVUYcJwCMO5XUYw== + dependencies: + browserslist "^4.22.1" + +core-js@^3.15.1: + version "3.32.1" + resolved "https://registry.npmjs.org/core-js/-/core-js-3.32.1.tgz" + integrity sha512-lqufgNn9NLnESg5mQeYsxQP5w7wrViSj0jr/kv6ECQiByzQkrn1MKvV0L3acttpDqfQrHLwr2KCMgX5b8X+lyQ== + +cross-spawn@^6.0.5: + version "6.0.6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz" + integrity sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +css-tree@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz" + integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw== + dependencies: + mdn-data "2.0.30" + source-map-js "^1.0.1" + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +csstype@^3.1.1: + version "3.1.2" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + +dayjalali@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/dayjalali/-/dayjalali-1.0.1.tgz" + integrity sha512-f+uDwP9kQSjlDdGTJjMpWaHe9BaIkQjZRkk32SNj6pRNkJRc2bTmIW5AbEwVX3vwa5INDwi6K7+Cik67/PzWqA== + dependencies: + jalaali-js "^1.2.8" + +dayjs@^1.10.5: + version "1.11.9" + resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.9.tgz" + integrity sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA== + +de-indent@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz" + integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg== + +debug@^3.2.6: + version "3.2.7" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +default-browser-id@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz" + integrity sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA== + dependencies: + bplist-parser "^0.2.0" + untildify "^4.0.0" + +default-browser@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz" + integrity sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA== + dependencies: + bundle-name "^3.0.0" + default-browser-id "^3.0.0" + execa "^7.1.1" + titleize "^3.0.0" + +define-data-property@^1.0.1: + version "1.1.1" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz" + integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== + dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + +define-lazy-prop@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz" + integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== + +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +defu@^6.1.2: + version "6.1.2" + resolved "https://registry.npmjs.org/defu/-/defu-6.1.2.tgz" + integrity sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ== + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +destr@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/destr/-/destr-2.0.1.tgz" + integrity sha512-M1Ob1zPSIvlARiJUkKqvAZ3VAqQY6Jcuth/pBKQ2b1dX/Qx0OnJ8Vux6J2H5PTMQeRzWrrbTu70VxBfv/OPDJA== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-align@^1.12.1: + version "1.12.4" + resolved "https://registry.npmjs.org/dom-align/-/dom-align-1.12.4.tgz" + integrity sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw== + +dom-scroll-into-view@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/dom-scroll-into-view/-/dom-scroll-into-view-2.0.1.tgz" + integrity sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w== + +duplexer@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + +echarts@^5.4.3: + version "5.4.3" + resolved "https://registry.npmjs.org/echarts/-/echarts-5.4.3.tgz" + integrity sha512-mYKxLxhzy6zyTi/FaEbJMOZU1ULGEQHaeIeuMR5L+JnJTpz+YR03mnnpBhbR4+UYJAgiXgpyTVLffPAjOTLkZA== + dependencies: + tslib "2.3.0" + zrender "5.4.4" + +ejs@^3.1.6: + version "3.1.10" + resolved "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz" + integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== + dependencies: + jake "^10.8.5" + +electron-to-chromium@^1.4.535: + version "1.4.581" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.581.tgz" + integrity sha512-6uhqWBIapTJUxgPTCHH9sqdbxIMPt7oXl0VcAL1kOtlU6aECdcMncCrX5Z7sHQ/invtrC9jUQUef7+HhO8vVFw== + +entities@^4.5.0: + version "4.5.0" + resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +errno@^0.1.1: + version "0.1.8" + resolved "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== + dependencies: + prr "~1.0.1" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.22.1: + version "1.22.1" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz" + integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== + dependencies: + array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.1" + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.2.1" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.10" + is-weakref "^1.0.2" + object-inspect "^1.12.3" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.0" + safe-array-concat "^1.0.0" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.7" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" + typed-array-byte-offset "^1.0.0" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.10" + +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +esbuild@^0.18.10: + version "0.18.20" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz" + integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA== + optionalDependencies: + "@esbuild/android-arm" "0.18.20" + "@esbuild/android-arm64" "0.18.20" + "@esbuild/android-x64" "0.18.20" + "@esbuild/darwin-arm64" "0.18.20" + "@esbuild/darwin-x64" "0.18.20" + "@esbuild/freebsd-arm64" "0.18.20" + "@esbuild/freebsd-x64" "0.18.20" + "@esbuild/linux-arm" "0.18.20" + "@esbuild/linux-arm64" "0.18.20" + "@esbuild/linux-ia32" "0.18.20" + "@esbuild/linux-loong64" "0.18.20" + "@esbuild/linux-mips64el" "0.18.20" + "@esbuild/linux-ppc64" "0.18.20" + "@esbuild/linux-riscv64" "0.18.20" + "@esbuild/linux-s390x" "0.18.20" + "@esbuild/linux-x64" "0.18.20" + "@esbuild/netbsd-x64" "0.18.20" + "@esbuild/openbsd-x64" "0.18.20" + "@esbuild/sunos-x64" "0.18.20" + "@esbuild/win32-arm64" "0.18.20" + "@esbuild/win32-ia32" "0.18.20" + "@esbuild/win32-x64" "0.18.20" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-prettier@^8.8.0: + version "8.10.0" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz" + integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== + +eslint-plugin-prettier@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz" + integrity sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w== + dependencies: + prettier-linter-helpers "^1.0.0" + synckit "^0.8.5" + +eslint-plugin-vue@^9.15.1: + version "9.17.0" + resolved "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.17.0.tgz" + integrity sha512-r7Bp79pxQk9I5XDP0k2dpUC7Ots3OSWgvGZNu3BxmKK6Zg7NgVtcOB6OCna5Kb9oQwJPl5hq183WD0SY5tZtIQ== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + natural-compare "^1.4.0" + nth-check "^2.1.1" + postcss-selector-parser "^6.0.13" + semver "^7.5.4" + vue-eslint-parser "^9.3.1" + xml-name-validator "^4.0.0" + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.1.1, eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@^8.45.0: + version "8.47.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz" + integrity sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.2" + "@eslint/js" "^8.47.0" + "@humanwhocodes/config-array" "^0.11.10" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + 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.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^9.3.1, espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esquery@^1.4.0, esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-walker@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz" + integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== + +estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +execa@^5.0.0, execa@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +execa@^7.1.1: + version "7.2.0" + resolved "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz" + integrity sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.1" + human-signals "^4.3.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^3.0.7" + strip-final-newline "^3.0.0" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.1.2: + version "1.3.0" + resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== + +fast-glob@^3.2.12, fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.1: + version "3.3.1" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +filelist@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.7" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + +follow-redirects@^1.15.6: + version "1.15.9" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fs-extra@^9.0.1: + version "9.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + +functions-have-names@^1.2.2, functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-proto "^1.0.1" + has-symbols "^1.0.3" + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + +get-stream@^6.0.0, get-stream@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^7.1.3, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.19.0: + version "13.21.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz" + integrity sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.11" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== + dependencies: + duplexer "^0.1.2" + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +html-tags@^3.3.1: + version "3.3.1" + resolved "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz" + integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +human-signals@^4.3.0: + version "4.3.1" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz" + integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== + +iconv-lite@^0.6.3: + version "0.6.3" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +idb@^7.0.1: + version "7.1.1" + resolved "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz" + integrity sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ== + +ignore@^5.2.0: + version "5.2.4" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +image-size@~0.5.0: + version "0.5.5" + resolved "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz" + integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ== + +immutable@^4.0.0: + version "4.3.4" + resolved "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz" + integrity sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA== + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +internal-slot@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== + dependencies: + get-intrinsic "^1.2.0" + has "^1.0.3" + side-channel "^1.0.4" + +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.13.0: + version "2.13.0" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz" + integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-docker@^2.0.0: + version "2.2.1" + resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-docker@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz" + integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-inside-container@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz" + integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== + dependencies: + is-docker "^3.0.0" + +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz" + integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz" + integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-object@3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.1.tgz" + integrity sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz" + integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.10, is-typed-array@^1.1.9: + version "1.1.12" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== + dependencies: + which-typed-array "^1.1.11" + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-what@^3.14.1: + version "3.14.1" + resolved "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz" + integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +jake@^10.8.5: + version "10.8.7" + resolved "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz" + integrity sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.4" + minimatch "^3.1.2" + +jalaali-js@^1.1.0, jalaali-js@^1.2.8: + version "1.2.8" + resolved "https://registry.npmjs.org/jalaali-js/-/jalaali-js-1.2.8.tgz" + integrity sha512-Jl/EwY84JwjW2wsWqeU4pNd22VNQ7EkjI36bDuLw31wH98WQW4fPjD0+mG7cdCK+Y8D6s9R3zLiQ3LaKu6bD8A== + +jalaliday@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/jalaliday/-/jalaliday-2.3.0.tgz" + integrity sha512-B/m3TqsRrTFED/HBDqON6rPKe0MpoLxNICZ5uZeZ/scHJUHKQNr1n+wdZSj8MxrY1Bmo05gllZeNEw4beXd2oQ== + +jest-worker@^26.2.1: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz" + integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jiti@^1.19.1: + version "1.19.3" + resolved "https://registry.npmjs.org/jiti/-/jiti-1.19.3.tgz" + integrity sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-schema@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^2.2.0, json5@^2.2.2: + version "2.2.3" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonc-parser@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz" + integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonpointer@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz" + integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== + +kolorist@^1.8.0: + version "1.8.0" + resolved "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz" + integrity sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ== + +less@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/less/-/less-4.2.0.tgz" + integrity sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA== + dependencies: + copy-anything "^2.0.1" + parse-node-version "^1.0.1" + tslib "^2.3.0" + optionalDependencies: + errno "^0.1.1" + graceful-fs "^4.1.2" + image-size "~0.5.0" + make-dir "^2.1.0" + mime "^1.4.1" + needle "^3.1.0" + source-map "~0.6.0" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz" + integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +local-pkg@^0.4.3: + version "0.4.3" + resolved "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz" + integrity sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g== + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash-es@^4.17.15: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz" + integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== + +lodash@^4.17.20, lodash@^4.17.21, lodash@latest: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loose-envify@^1.0.0: + version "1.4.0" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +magic-string@^0.25.0, magic-string@^0.25.7: + version "0.25.9" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz" + integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== + dependencies: + sourcemap-codec "^1.4.8" + +magic-string@^0.30.0, magic-string@^0.30.2: + version "0.30.2" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.2.tgz" + integrity sha512-lNZdu7pewtq/ZvWUp9Wpf/x7WzMTsR26TWV03BRZrXFsv+BI6dy8RAiKgm1uM/kyR0rCfUcqvOlXKG66KhIGug== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.15" + +make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +mdn-data@2.0.30: + version "2.0.30" + resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz" + integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== + +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz" + integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.8" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@^1.4.1: + version "1.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^9.0.1: + version "9.0.3" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^9.0.3: + version "9.0.5" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + +mlly@^1.2.0, mlly@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/mlly/-/mlly-1.4.0.tgz" + integrity sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg== + dependencies: + acorn "^8.9.0" + pathe "^1.1.1" + pkg-types "^1.0.3" + ufo "^1.1.2" + +moment-jalaali@^0.10.0: + version "0.10.0" + resolved "https://registry.npmjs.org/moment-jalaali/-/moment-jalaali-0.10.0.tgz" + integrity sha512-XICH1+UHd3zyaE1bXWQBlhoXBqbzEyFfT0TrifNobHxLALRuTSwXn376bX8FmkYg9mZimevwwdd6EB57s5wuFA== + dependencies: + jalaali-js "^1.1.0" + moment "^2.22.2" + moment-timezone "^0.5.21" + rimraf "^3.0.2" + +moment-timezone@^0.5.21: + version "0.5.44" + resolved "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.44.tgz" + integrity sha512-nv3YpzI/8lkQn0U6RkLd+f0W/zy/JnoR5/EyPz/dNkPTBjA2jNLCVxaiQ8QpeLymhSZvX0wCL5s27NQWdOPwAw== + dependencies: + moment "^2.29.4" + +moment@^2.22.2, moment@^2.29.4: + version "2.30.1" + resolved "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz" + integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== + +mrmime@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz" + integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== + +ms@2.1.2, ms@^2.1.1: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +muggle-string@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz" + integrity sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ== + +nanoid@^3.3.8: + version "3.3.8" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz" + integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== + +nanopop@^2.1.0: + version "2.3.0" + resolved "https://registry.npmjs.org/nanopop/-/nanopop-2.3.0.tgz" + integrity sha512-fzN+T2K7/Ah25XU02MJkPZ5q4Tj5FpjmIYq4rvoHX4yb16HzFdCO6JxFFn5Y/oBhQ8no8fUZavnyIv9/+xkBBw== + +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +needle@^3.1.0: + version "3.2.0" + resolved "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz" + integrity sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ== + dependencies: + debug "^3.2.6" + iconv-lite "^0.6.3" + sax "^1.2.4" + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-fetch-native@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.2.0.tgz" + integrity sha512-5IAMBTl9p6PaAjYCnMv5FmqIF6GcZnawAVnzaCG0rX2aYZJ4CxEkZNtVPuTRug7fL7wyM5BQYTlAzcyMPi6oTQ== + +node-releases@^2.0.13: + version "2.0.13" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== + +normalize-package-data@^2.3.2: + version "2.5.0" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-all@^4.1.5: + version "4.1.5" + resolved "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz" + integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ== + dependencies: + ansi-styles "^3.2.1" + chalk "^2.4.1" + cross-spawn "^6.0.5" + memorystream "^0.3.1" + minimatch "^3.0.4" + pidtree "^0.3.0" + read-pkg "^3.0.0" + shell-quote "^1.6.1" + string.prototype.padend "^3.0.0" + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +npm-run-path@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz" + integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== + dependencies: + path-key "^4.0.0" + +nth-check@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + +object-inspect@^1.12.3, object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +odometer@^0.4.8: + version "0.4.8" + resolved "https://registry.npmjs.org/odometer/-/odometer-0.4.8.tgz" + integrity sha512-bfKuAhWE/qMCiX9bwX90c5bTpt7MDVeq1e6YsOHQrYokNhv9jhS5JbR9kg6i+FeWmDgalf3VUtwNx1aVaZ8cgg== + +ofetch@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/ofetch/-/ofetch-1.1.1.tgz" + integrity sha512-SSMoktrp9SNLi20BWfB/BnnKcL0RDigXThD/mZBeQxkIRv1xrd9183MtLdsqRYLYSqW0eTr5t8w8MqjNhvoOQQ== + dependencies: + destr "^2.0.0" + node-fetch-native "^1.2.0" + ufo "^1.1.2" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + +open@^9.1.0: + version "9.1.0" + resolved "https://registry.npmjs.org/open/-/open-9.1.0.tgz" + integrity sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg== + dependencies: + default-browser "^4.0.0" + define-lazy-prop "^3.0.0" + is-inside-container "^1.0.0" + is-wsl "^2.2.0" + +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz" + integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-node-version@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz" + integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== + +path-browserify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pathe@^1.1.0, pathe@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz" + integrity sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q== + +perfect-debounce@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz" + integrity sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA== + +picocolors@^1.0.0, picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pidtree@^0.3.0: + version "0.3.1" + resolved "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz" + integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz" + integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinia@^2.1.4: + version "2.1.6" + resolved "https://registry.npmjs.org/pinia/-/pinia-2.1.6.tgz" + integrity sha512-bIU6QuE5qZviMmct5XwCesXelb5VavdOWKWaB17ggk++NUwQWWbP5YnsONTk3b752QkW9sACiR81rorpeOMSvQ== + dependencies: + "@vue/devtools-api" "^6.5.0" + vue-demi ">=0.14.5" + +pkg-types@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz" + integrity sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A== + dependencies: + jsonc-parser "^3.2.0" + mlly "^1.2.0" + pathe "^1.1.0" + +postcss-selector-parser@^6.0.13: + version "6.0.13" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz" + integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss@^8.1.10, postcss@^8.4.27, postcss@^8.4.28: + version "8.5.1" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz" + integrity sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ== + dependencies: + nanoid "^3.3.8" + picocolors "^1.1.1" + source-map-js "^1.2.1" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/prettier/-/prettier-3.0.2.tgz" + integrity sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ== + +pretty-bytes@^5.3.0: + version "5.6.0" + resolved "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz" + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== + +pretty-bytes@^6.1.1: + version "6.1.1" + resolved "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz" + integrity sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ== + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz" + integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== + +punycode@^2.1.0: + version "2.3.0" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz" + integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +regenerate-unicode-properties@^10.1.0: + version "10.1.1" + resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz" + integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== + dependencies: + "@babel/runtime" "^7.8.4" + +regexp.prototype.flags@^1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz" + integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + functions-have-names "^1.2.3" + +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== + dependencies: + "@babel/regjsgen" "^0.8.0" + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +resize-observer-polyfill@^1.5.1: + version "1.5.1" + resolved "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz" + integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve@^1.10.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.22.2: + version "1.22.4" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz" + integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rollup-plugin-terser@^7.0.0: + version "7.0.2" + resolved "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz" + integrity sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ== + dependencies: + "@babel/code-frame" "^7.10.4" + jest-worker "^26.2.1" + serialize-javascript "^4.0.0" + terser "^5.0.0" + +rollup@^2.43.1: + version "2.79.2" + resolved "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz" + integrity sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ== + optionalDependencies: + fsevents "~2.3.2" + +rollup@^3.27.1: + version "3.29.5" + resolved "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz" + integrity sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w== + optionalDependencies: + fsevents "~2.3.2" + +run-applescript@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz" + integrity sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg== + dependencies: + execa "^5.0.0" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-array-concat@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz" + integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-buffer@^5.1.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sass@^1.69.4: + version "1.69.5" + resolved "https://registry.npmjs.org/sass/-/sass-1.69.5.tgz" + integrity sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +scroll-into-view-if-needed@^2.2.25: + version "2.2.31" + resolved "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz" + integrity sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA== + dependencies: + compute-scroll-into-view "^1.0.20" + +"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0: + version "5.7.2" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.6, semver@^7.3.7, semver@^7.5.4: + version "7.5.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" + +set-function-name@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz" + integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== + dependencies: + define-data-property "^1.0.1" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.0" + +shallow-equal@^1.0.0: + version "1.2.1" + resolved "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz" + integrity sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA== + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz" + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.6.1: + version "1.8.1" + resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +sirv@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz" + integrity sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA== + dependencies: + "@polka/url" "^1.0.0-next.20" + mrmime "^1.0.0" + totalist "^3.0.0" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.0.2, source-map-js@^1.2.0, source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== + +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@~0.6.0: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.8.0-beta.0: + version "0.8.0-beta.0" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz" + integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== + dependencies: + whatwg-url "^7.0.0" + +sourcemap-codec@^1.4.8: + version "1.4.8" + resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +spdx-correct@^3.0.0: + version "3.2.0" + resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.13" + resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz" + integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== + +string.prototype.matchall@^4.0.6: + version "4.0.10" + resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz" + integrity sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + regexp.prototype.flags "^1.5.0" + set-function-name "^2.0.0" + side-channel "^1.0.4" + +string.prototype.padend@^3.0.0: + version "3.1.4" + resolved "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz" + integrity sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trim@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz" + integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimend@^1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimstart@^1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-comments@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz" + integrity sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +svg-tags@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz" + integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA== + +svg.draggable.js@^2.2.2: + version "2.2.2" + resolved "https://registry.npmjs.org/svg.draggable.js/-/svg.draggable.js-2.2.2.tgz" + integrity sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw== + dependencies: + svg.js "^2.0.1" + +svg.easing.js@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/svg.easing.js/-/svg.easing.js-2.0.0.tgz" + integrity sha512-//ctPdJMGy22YoYGV+3HEfHbm6/69LJUTAqI2/5qBvaNHZ9uUFVC82B0Pl299HzgH13rKrBgi4+XyXXyVWWthA== + dependencies: + svg.js ">=2.3.x" + +svg.filter.js@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/svg.filter.js/-/svg.filter.js-2.0.2.tgz" + integrity sha512-xkGBwU+dKBzqg5PtilaTb0EYPqPfJ9Q6saVldX+5vCRy31P6TlRCP3U9NxH3HEufkKkpNgdTLBJnmhDHeTqAkw== + dependencies: + svg.js "^2.2.5" + +svg.js@>=2.3.x, svg.js@^2.0.1, svg.js@^2.2.5, svg.js@^2.4.0, svg.js@^2.6.5: + version "2.7.1" + resolved "https://registry.npmjs.org/svg.js/-/svg.js-2.7.1.tgz" + integrity sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA== + +svg.pathmorphing.js@^0.1.3: + version "0.1.3" + resolved "https://registry.npmjs.org/svg.pathmorphing.js/-/svg.pathmorphing.js-0.1.3.tgz" + integrity sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww== + dependencies: + svg.js "^2.4.0" + +svg.resize.js@^1.4.3: + version "1.4.3" + resolved "https://registry.npmjs.org/svg.resize.js/-/svg.resize.js-1.4.3.tgz" + integrity sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw== + dependencies: + svg.js "^2.6.5" + svg.select.js "^2.1.2" + +svg.select.js@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/svg.select.js/-/svg.select.js-2.1.2.tgz" + integrity sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ== + dependencies: + svg.js "^2.2.5" + +svg.select.js@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/svg.select.js/-/svg.select.js-3.0.1.tgz" + integrity sha512-h5IS/hKkuVCbKSieR9uQCj9w+zLHoPh+ce19bBYyqF53g6mnPB8sAtIbe1s9dh2S2fCmYX2xel1Ln3PJBbK4kw== + dependencies: + svg.js "^2.6.5" + +synckit@^0.8.5: + version "0.8.5" + resolved "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz" + integrity sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q== + dependencies: + "@pkgr/utils" "^2.3.1" + tslib "^2.5.0" + +temp-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz" + integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== + +tempy@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz" + integrity sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw== + dependencies: + is-stream "^2.0.0" + temp-dir "^2.0.0" + type-fest "^0.16.0" + unique-string "^2.0.0" + +terser@^5.0.0: + version "5.24.0" + resolved "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz" + integrity sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +titleize@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz" + integrity sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +totalist@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz" + integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz" + integrity sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA== + dependencies: + punycode "^2.1.0" + +tslib@2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz" + integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.3.0, tslib@^2.5.0, tslib@^2.6.0: + version "2.6.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz" + integrity sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.16.0: + version "0.16.0" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz" + integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +typed-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz" + integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-typed-array "^1.1.10" + +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz" + integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + +typescript@~5.1.6: + version "5.1.6" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz" + integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== + +ufo@^1.1.2: + version "1.2.0" + resolved "https://registry.npmjs.org/ufo/-/ufo-1.2.0.tgz" + integrity sha512-RsPyTbqORDNDxqAdQPQBpgqhWle1VcTSou/FraClYlHf6TZnQcGslpLcAphNR+sQW4q5lLWLbOsRlh9j24baQg== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +unconfig@^0.3.10: + version "0.3.10" + resolved "https://registry.npmjs.org/unconfig/-/unconfig-0.3.10.tgz" + integrity sha512-tj317lhIq2iZF/NXrJnU1t2UaGUKKz1eL1sK2t63Oq66V9BxqvZV12m55fp/fpQJ+DDmVlLgo7cnLVOZkhlO/A== + dependencies: + "@antfu/utils" "^0.7.5" + defu "^6.1.2" + jiti "^1.19.1" + mlly "^1.4.0" + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + +unocss@^0.55.1: + version "0.55.1" + resolved "https://registry.npmjs.org/unocss/-/unocss-0.55.1.tgz" + integrity sha512-WyLlrkB1m37LT3jmT51BOmvcd2/aFL0/QuJLn0gYQUWHi28uPtGFTL2kEvivqxzEgDgDrzbQl8VBgy1RssbRHQ== + dependencies: + "@unocss/astro" "0.55.1" + "@unocss/cli" "0.55.1" + "@unocss/core" "0.55.1" + "@unocss/extractor-arbitrary-variants" "0.55.1" + "@unocss/postcss" "0.55.1" + "@unocss/preset-attributify" "0.55.1" + "@unocss/preset-icons" "0.55.1" + "@unocss/preset-mini" "0.55.1" + "@unocss/preset-tagify" "0.55.1" + "@unocss/preset-typography" "0.55.1" + "@unocss/preset-uno" "0.55.1" + "@unocss/preset-web-fonts" "0.55.1" + "@unocss/preset-wind" "0.55.1" + "@unocss/reset" "0.55.1" + "@unocss/transformer-attributify-jsx" "0.55.1" + "@unocss/transformer-attributify-jsx-babel" "0.55.1" + "@unocss/transformer-compile-class" "0.55.1" + "@unocss/transformer-directives" "0.55.1" + "@unocss/transformer-variant-group" "0.55.1" + "@unocss/vite" "0.55.1" + +unplugin-vue-components@^0.25.1: + version "0.25.1" + resolved "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-0.25.1.tgz" + integrity sha512-kzS2ZHVMaGU2XEO2keYQcMjNZkanDSGDdY96uQT9EPe+wqSZwwgbFfKVJ5ti0+8rGAcKHColwKUvctBhq2LJ3A== + dependencies: + "@antfu/utils" "^0.7.4" + "@rollup/pluginutils" "^5.0.2" + chokidar "^3.5.3" + debug "^4.3.4" + fast-glob "^3.2.12" + local-pkg "^0.4.3" + magic-string "^0.30.0" + minimatch "^9.0.1" + resolve "^1.22.2" + unplugin "^1.3.1" + +unplugin@^1.3.1: + version "1.4.0" + resolved "https://registry.npmjs.org/unplugin/-/unplugin-1.4.0.tgz" + integrity sha512-5x4eIEL6WgbzqGtF9UV8VEC/ehKptPXDS6L2b0mv4FRMkJxRtjaJfOWDd6a8+kYbqsjklix7yWP0N3SUepjXcg== + dependencies: + acorn "^8.9.0" + chokidar "^3.5.3" + webpack-sources "^3.2.3" + webpack-virtual-modules "^0.5.0" + +untildify@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz" + integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== + +upath@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util-deprecate@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +vant@^4.7.2: + version "4.7.3" + resolved "https://registry.npmjs.org/vant/-/vant-4.7.3.tgz" + integrity sha512-nb0pXxKSOaE9CvH//KozKDivqhjE4ZRvx1b/RCWFL4H3tZ5l+HhWtwK1yJx5AkO1Pm/IYQY86yZa1tums8DfsQ== + dependencies: + "@vant/popperjs" "^1.3.0" + "@vant/use" "^1.6.0" + "@vue/shared" "^3.0.0" + +vite-plugin-pwa@^0.16.7: + version "0.16.7" + resolved "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.16.7.tgz" + integrity sha512-4WMA5unuKlHs+koNoykeuCfTcqEGbiTRr8sVYUQMhc6tWxZpSRnv9Ojk4LKmqVhoPGHfBVCdGaMo8t9Qidkc1Q== + dependencies: + debug "^4.3.4" + fast-glob "^3.3.1" + pretty-bytes "^6.1.1" + workbox-build "^7.0.0" + workbox-window "^7.0.0" + +vite@^4.4.6: + version "4.5.14" + resolved "https://registry.npmjs.org/vite/-/vite-4.5.14.tgz" + integrity sha512-+v57oAaoYNnO3hIu5Z/tJRZjq5aHM2zDve9YZ8HngVHbhk66RStobhb1sqPMIPEleV6cNKYK4eGrAbE9Ulbl2g== + dependencies: + esbuild "^0.18.10" + postcss "^8.4.27" + rollup "^3.27.1" + optionalDependencies: + fsevents "~2.3.2" + +vscode-uri@^3.0.8: + version "3.0.8" + resolved "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz" + integrity sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw== + +vue-content-loader@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/vue-content-loader/-/vue-content-loader-2.0.1.tgz" + integrity sha512-pkof4+q2xmzNEdhqelxtJejeP/vQUJtLle4/v2ueG+HURqM9Q/GIGC8GJ2bVVWeLfTDET51jqimwQdmxJTlu0g== + +vue-demi@>=0.14.5: + version "0.14.5" + resolved "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz" + integrity sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA== + +vue-demi@>=0.14.6: + version "0.14.6" + resolved "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz" + integrity sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w== + +vue-demi@^0.12.5: + version "0.12.5" + resolved "https://registry.npmjs.org/vue-demi/-/vue-demi-0.12.5.tgz" + integrity sha512-BREuTgTYlUr0zw0EZn3hnhC3I6gPWv+Kwh4MCih6QcAeaTlaIX0DwOVN0wHej7hSvDPecz4jygy/idsgKfW58Q== + +vue-eslint-parser@^9.1.1, vue-eslint-parser@^9.3.1: + version "9.3.1" + resolved "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.1.tgz" + integrity sha512-Clr85iD2XFZ3lJ52/ppmUDG/spxQu6+MAeHXjjyI4I1NUYZ9xmenQp4N0oaHJhrA8OOxltCVxMRfANGa70vU0g== + dependencies: + debug "^4.3.4" + eslint-scope "^7.1.1" + eslint-visitor-keys "^3.3.0" + espree "^9.3.1" + esquery "^1.4.0" + lodash "^4.17.21" + semver "^7.3.6" + +vue-lodash@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/vue-lodash/-/vue-lodash-2.1.2.tgz" + integrity sha512-6QsNC7/XjrK4xKxFhh6Ppvcrfm0uAeR/lFsySsMgfEFUWkvRztcAIS3MsqAI4bBnAaLo9ou+8tUfJ8d+yrljQg== + +vue-odometer@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/vue-odometer/-/vue-odometer-1.0.2.tgz" + integrity sha512-xQj1kdRrQDGhjZ9nb66I6wykR9lG5yvy74PLBpTHw7raGqahBgZOCvPWvC4nol8B8bJQeFWmpCBUidVjtouyng== + dependencies: + lodash latest + +vue-router@^4.2.4: + version "4.2.4" + resolved "https://registry.npmjs.org/vue-router/-/vue-router-4.2.4.tgz" + integrity sha512-9PISkmaCO02OzPVOMq2w82ilty6+xJmQrarYZDkjZBfl4RvYAlt4PKnEX21oW4KTtWfa9OuO/b3qk1Od3AEdCQ== + dependencies: + "@vue/devtools-api" "^6.5.0" + +vue-tsc@^2.1.10: + version "2.2.0" + resolved "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.0.tgz" + integrity sha512-gtmM1sUuJ8aSb0KoAFmK9yMxb8TxjewmxqTJ1aKphD5Cbu0rULFY6+UQT51zW7SpUcenfPUuflKyVwyx9Qdnxg== + dependencies: + "@volar/typescript" "~2.4.11" + "@vue/language-core" "2.2.0" + +vue-types@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/vue-types/-/vue-types-3.0.2.tgz" + integrity sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw== + dependencies: + is-plain-object "3.0.1" + +vue3-apexcharts@^1.4.4: + version "1.4.4" + resolved "https://registry.npmjs.org/vue3-apexcharts/-/vue3-apexcharts-1.4.4.tgz" + integrity sha512-TH89uZrxGjaDvkaYAISvj8+k6Bf1rUKFillc8oJirs5XZEPiwM1ELKZQ786wz0rfPqkSHHny2lqqUCK7Rw+LcQ== + +vue3-lazyload@^0.3.8: + version "0.3.8" + resolved "https://registry.npmjs.org/vue3-lazyload/-/vue3-lazyload-0.3.8.tgz" + integrity sha512-UiJHRT7mzry102WbhtrRgJh+f8Z8u4Z+H1RU4dvPmQeq7wFSDFxZB9iJOWGihH2FscXN/8rMGLDOQJAmjwqpCg== + dependencies: + vue-demi "^0.12.5" + +vue3-odometer@^0.1.3: + version "0.1.3" + resolved "https://registry.npmjs.org/vue3-odometer/-/vue3-odometer-0.1.3.tgz" + integrity sha512-WhsDgLv9LWiD6N12OOwLmLCYni1oR3gBXGnyn/vZ2I4TnXpGB5WgnNiNXGAcXcGf5aGhBRrkc7KyV13PCdSxCQ== + dependencies: + odometer "^0.4.8" + vue "^3.2.25" + +vue3-otp-input@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/vue3-otp-input/-/vue3-otp-input-0.4.1.tgz" + integrity sha512-wVl9i3DcWlO0C7fBI9V+RIP3crm/1tY72fuhvb3YM2JfbLoYofB96aPl5AgFhA0Cse5bQEMYtIvOeiqW3rfbAw== + +vue@^3.2.25, vue@^3.3.4: + version "3.3.4" + resolved "https://registry.npmjs.org/vue/-/vue-3.3.4.tgz" + integrity sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw== + dependencies: + "@vue/compiler-dom" "3.3.4" + "@vue/compiler-sfc" "3.3.4" + "@vue/runtime-dom" "3.3.4" + "@vue/server-renderer" "3.3.4" + "@vue/shared" "3.3.4" + +warning@^4.0.0: + version "4.0.3" + resolved "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz" + integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== + dependencies: + loose-envify "^1.0.0" + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack-virtual-modules@^0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz" + integrity sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw== + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-typed-array@^1.1.10, which-typed-array@^1.1.11: + version "1.1.11" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz" + integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +which@^1.2.9: + version "1.3.1" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +workbox-background-sync@7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-7.0.0.tgz" + integrity sha512-S+m1+84gjdueM+jIKZ+I0Lx0BDHkk5Nu6a3kTVxP4fdj3gKouRNmhO8H290ybnJTOPfBDtTMXSQA/QLTvr7PeA== + dependencies: + idb "^7.0.1" + workbox-core "7.0.0" + +workbox-broadcast-update@7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-7.0.0.tgz" + integrity sha512-oUuh4jzZrLySOo0tC0WoKiSg90bVAcnE98uW7F8GFiSOXnhogfNDGZelPJa+6KpGBO5+Qelv04Hqx2UD+BJqNQ== + dependencies: + workbox-core "7.0.0" + +workbox-build@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/workbox-build/-/workbox-build-7.0.0.tgz" + integrity sha512-CttE7WCYW9sZC+nUYhQg3WzzGPr4IHmrPnjKiu3AMXsiNQKx+l4hHl63WTrnicLmKEKHScWDH8xsGBdrYgtBzg== + dependencies: + "@apideck/better-ajv-errors" "^0.3.1" + "@babel/core" "^7.11.1" + "@babel/preset-env" "^7.11.0" + "@babel/runtime" "^7.11.2" + "@rollup/plugin-babel" "^5.2.0" + "@rollup/plugin-node-resolve" "^11.2.1" + "@rollup/plugin-replace" "^2.4.1" + "@surma/rollup-plugin-off-main-thread" "^2.2.3" + ajv "^8.6.0" + common-tags "^1.8.0" + fast-json-stable-stringify "^2.1.0" + fs-extra "^9.0.1" + glob "^7.1.6" + lodash "^4.17.20" + pretty-bytes "^5.3.0" + rollup "^2.43.1" + rollup-plugin-terser "^7.0.0" + source-map "^0.8.0-beta.0" + stringify-object "^3.3.0" + strip-comments "^2.0.1" + tempy "^0.6.0" + upath "^1.2.0" + workbox-background-sync "7.0.0" + workbox-broadcast-update "7.0.0" + workbox-cacheable-response "7.0.0" + workbox-core "7.0.0" + workbox-expiration "7.0.0" + workbox-google-analytics "7.0.0" + workbox-navigation-preload "7.0.0" + workbox-precaching "7.0.0" + workbox-range-requests "7.0.0" + workbox-recipes "7.0.0" + workbox-routing "7.0.0" + workbox-strategies "7.0.0" + workbox-streams "7.0.0" + workbox-sw "7.0.0" + workbox-window "7.0.0" + +workbox-cacheable-response@7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-7.0.0.tgz" + integrity sha512-0lrtyGHn/LH8kKAJVOQfSu3/80WDc9Ma8ng0p2i/5HuUndGttH+mGMSvOskjOdFImLs2XZIimErp7tSOPmu/6g== + dependencies: + workbox-core "7.0.0" + +workbox-core@7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/workbox-core/-/workbox-core-7.0.0.tgz" + integrity sha512-81JkAAZtfVP8darBpfRTovHg8DGAVrKFgHpOArZbdFd78VqHr5Iw65f2guwjE2NlCFbPFDoez3D3/6ZvhI/rwQ== + +workbox-expiration@7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-7.0.0.tgz" + integrity sha512-MLK+fogW+pC3IWU9SFE+FRStvDVutwJMR5if1g7oBJx3qwmO69BNoJQVaMXq41R0gg3MzxVfwOGKx3i9P6sOLQ== + dependencies: + idb "^7.0.1" + workbox-core "7.0.0" + +workbox-google-analytics@7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-7.0.0.tgz" + integrity sha512-MEYM1JTn/qiC3DbpvP2BVhyIH+dV/5BjHk756u9VbwuAhu0QHyKscTnisQuz21lfRpOwiS9z4XdqeVAKol0bzg== + dependencies: + workbox-background-sync "7.0.0" + workbox-core "7.0.0" + workbox-routing "7.0.0" + workbox-strategies "7.0.0" + +workbox-navigation-preload@7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-7.0.0.tgz" + integrity sha512-juWCSrxo/fiMz3RsvDspeSLGmbgC0U9tKqcUPZBCf35s64wlaLXyn2KdHHXVQrb2cqF7I0Hc9siQalainmnXJA== + dependencies: + workbox-core "7.0.0" + +workbox-precaching@7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-7.0.0.tgz" + integrity sha512-EC0vol623LJqTJo1mkhD9DZmMP604vHqni3EohhQVwhJlTgyKyOkMrZNy5/QHfOby+39xqC01gv4LjOm4HSfnA== + dependencies: + workbox-core "7.0.0" + workbox-routing "7.0.0" + workbox-strategies "7.0.0" + +workbox-range-requests@7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-7.0.0.tgz" + integrity sha512-SxAzoVl9j/zRU9OT5+IQs7pbJBOUOlriB8Gn9YMvi38BNZRbM+RvkujHMo8FOe9IWrqqwYgDFBfv6sk76I1yaQ== + dependencies: + workbox-core "7.0.0" + +workbox-recipes@7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-7.0.0.tgz" + integrity sha512-DntcK9wuG3rYQOONWC0PejxYYIDHyWWZB/ueTbOUDQgefaeIj1kJ7pdP3LZV2lfrj8XXXBWt+JDRSw1lLLOnww== + dependencies: + workbox-cacheable-response "7.0.0" + workbox-core "7.0.0" + workbox-expiration "7.0.0" + workbox-precaching "7.0.0" + workbox-routing "7.0.0" + workbox-strategies "7.0.0" + +workbox-routing@7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/workbox-routing/-/workbox-routing-7.0.0.tgz" + integrity sha512-8YxLr3xvqidnbVeGyRGkaV4YdlKkn5qZ1LfEePW3dq+ydE73hUUJJuLmGEykW3fMX8x8mNdL0XrWgotcuZjIvA== + dependencies: + workbox-core "7.0.0" + +workbox-strategies@7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-7.0.0.tgz" + integrity sha512-dg3qJU7tR/Gcd/XXOOo7x9QoCI9nk74JopaJaYAQ+ugLi57gPsXycVdBnYbayVj34m6Y8ppPwIuecrzkpBVwbA== + dependencies: + workbox-core "7.0.0" + +workbox-streams@7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/workbox-streams/-/workbox-streams-7.0.0.tgz" + integrity sha512-moVsh+5to//l6IERWceYKGiftc+prNnqOp2sgALJJFbnNVpTXzKISlTIsrWY+ogMqt+x1oMazIdHj25kBSq/HQ== + dependencies: + workbox-core "7.0.0" + workbox-routing "7.0.0" + +workbox-sw@7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/workbox-sw/-/workbox-sw-7.0.0.tgz" + integrity sha512-SWfEouQfjRiZ7GNABzHUKUyj8pCoe+RwjfOIajcx6J5mtgKkN+t8UToHnpaJL5UVVOf5YhJh+OHhbVNIHe+LVA== + +workbox-window@7.0.0, workbox-window@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/workbox-window/-/workbox-window-7.0.0.tgz" + integrity sha512-j7P/bsAWE/a7sxqTzXo3P2ALb1reTfZdvVp6OJ/uLr/C2kZAMvjeWGm8V4htQhor7DOvYg0sSbFN2+flT5U0qA== + dependencies: + "@types/trusted-types" "^2.0.2" + workbox-core "7.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +xml-name-validator@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz" + integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zrender@5.4.4: + version "5.4.4" + resolved "https://registry.npmjs.org/zrender/-/zrender-5.4.4.tgz" + integrity sha512-0VxCNJ7AGOMCWeHVyTrGzUgrK4asT4ml9PEkeGirAkKNYXYzoPJCLvmyfdoOXcjTHPs10OZVMfD1Rwg16AZyYw== + dependencies: + tslib "2.3.0"