diff --git a/.dockerignore b/.dockerignore index b92827b7c8..3d7ef7bf37 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,8 +1,6 @@ app/db/SQL node_modules storage -public/scripts -public/styles .git .idea .cd .babelrc diff --git a/.gitattributes b/.gitattributes index b654c29eeb..beb791f5f3 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,10 +1,24 @@ app/config/* linguist-detectable=false -app/config/* linguist-detectable=false app/config/*/* linguist-detectable=false app/config/*/*/* linguist-detectable=false app/config/*/*/*/* linguist-detectable=false +app/views/* linguist-detectable=false +app/views/*/* linguist-detectable=false +app/views/*/*/* linguist-detectable=false +app/views/*/*/*/* linguist-detectable=false +app/controllers/* linguist-detectable=false +app/controllers/*/* linguist-detectable=false +app/controllers/*/*/* linguist-detectable=false +app/controllers/*/*/*/* linguist-detectable=false +app/controllers/*/*/*/*/* linguist-detectable=false +src/* linguist-detectable=false +src/*/* linguist-detectable=false +src/*/*/* linguist-detectable=false +src/*/*/*/* linguist-detectable=false +src/*/*/*/*/* linguist-detectable=false tests/* linguist-detectable=false tests/*/* linguist-detectable=false tests/*/*/* linguist-detectable=false tests/*/*/*/* linguist-detectable=false -tests/*/*/*/*/* linguist-detectable=false \ No newline at end of file +tests/*/*/*/*/* linguist-detectable=false +tests/*/*/*/*/*/* linguist-detectable=false diff --git a/.gitignore b/.gitignore index 5433e2ba3a..f61b3c10cd 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ /node_modules/ /tests/resources/storage/ /app/sdks/* +/public/dist/* /.idea/ .DS_Store .php_cs.cache diff --git a/CHANGES.md b/CHANGES.md index 25aea3859d..0f67bc5904 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -107,7 +107,7 @@ - Refactored E-Mail template (#1422) - Improved locale management (#1440) - Added `$permissions` to execution response (#948) -- Switch from using Docker CLI to Docker API by intergrating [utopia-php/orchestration](https://github.com/utopia-php/orchestration) (#1420) +- Switch from using Docker CLI to Docker API by integrating [utopia-php/orchestration](https://github.com/utopia-php/orchestration) (#1420) - Added DOCKERHUB_PULL_USERNAME, DOCKERHUB_PULL_PASSWORD and DOCKERHUB_PULL_EMAIL env variables for pulling from private DockerHub repos (#1420) - Added `updateName`, `updateEmail` and `updatePassword` to Users service and console (#1547) @@ -162,7 +162,7 @@ - Added internal support for connection pools for improved performance (#1278) - Added new abstraction for workers executable files (#1276) - Added a new API in the Users API to allow you to force update your user verification status (#1223) -- Using a fixed commit to avoid breaking changes for imagemagick extenstion (#1274) +- Using a fixed commit to avoid breaking changes for imagemagick extension (#1274) - Updated the design of all the email templates (#1225) - Refactored Devices page in Console: (#1167) - Renamed *Devices* to *Sessions* @@ -193,7 +193,7 @@ - Fixed a bug in the Twitch OAuth adapter (#1209) - Fixed missing session object when OAuth session creation event is triggered (#1208) - Fixed bug where we didn't ignore the email case, converted all emails to lowercase internally (#1243) -- Fixed a console bug where you can't click a user with no name, added a placehoder for anonyomous users (#1220) +- Fixed a console bug where you can't click a user with no name, added a placeholder for anonymous users (#1220) - Fixed unique keys not being updated when changing a user's email address (#1301) - Fixed a bug where decimal integers where wrongly used with database filters (#1349) @@ -287,8 +287,8 @@ ## Upgrades -- Upgraded redis extenstion lib to version 5.3.3 -- Upgraded maxmind extenstion lib to version 1.10.0 +- Upgraded redis extension lib to version 5.3.3 +- Upgraded maxmind extension lib to version 1.10.0 - Upgraded utopia-php/cli lib to version 0.10.0 - Upgraded matomo/device-detector lib to version 4.1.0 - Upgraded dragonmantank/cron-expression lib to version 3.1.0 @@ -300,7 +300,7 @@ ## Bug Fixes - Updated missing storage env vars -- Fixed a bug, that added a wrong timzone offset to user log timestamps +- Fixed a bug, that added a wrong timezone offset to user log timestamps - Fixed a bug, that Response format header was not added in the access-control-allow-header list. - Fixed a bug where countryName is unknown on sessions (#933) - Added missing event users.update.prefs (#952) @@ -379,13 +379,13 @@ - Upgraded Influxdb Docker image to version 1.8 (alpine) - Upgraded Redis Resque queue library to version 1.3.6 ([#319](https://github.com/appwrite/appwrite/issues/319)) - Upgraded ClamAV container image to version 1.0.11 ([#412](https://github.com/appwrite/appwrite/issues/412)) -- Upgraded device detctor to version 3.12.6 +- Upgraded device detector to version 3.12.6 - Upgraded GEOIP DB file to Feb 2021 release ## Breaking Changes (Read before upgrading!) - **Deprecated** `first` and `last` query params for documents list route in the database API -- **Deprecated** Deprectaed Pubjabi Translations ('pn') +- **Deprecated** Deprecated Pubjabi Translations ('pn') - **Deprecated** `PATCH /account/prefs` is now updating the prefs payload and not just merging it - **Deprecated** `PATCH /users/:userId/prefs` is now updating the prefs payload and not just merging it - Switched order of limit and offset params in all the SDKs `listDocuments` method for better consistency @@ -431,7 +431,7 @@ - Block iframe access to Appwrite console using the `X-Frame-Options` header. - Fixed `roles` param input validator - API Keys are now stored encrypted -- Disabled domains whitlist ACL for the Appwrite console +- Disabled domains whitelist ACL for the Appwrite console # Version 0.6.2 (PRE-RELEASE) diff --git a/Dockerfile b/Dockerfile index 88d6aadbab..3ff287ba66 100755 --- a/Dockerfile +++ b/Dockerfile @@ -12,6 +12,18 @@ RUN composer update --ignore-platform-reqs --optimize-autoloader \ --no-plugins --no-scripts --prefer-dist \ `if [ "$TESTING" != "true" ]; then echo "--no-dev"; fi` +FROM node:16-alpine as node + +WORKDIR /usr/local/src/ + +COPY package-lock.json /usr/local/src/ +COPY package.json /usr/local/src/ +COPY gulpfile.js /usr/local/src/ +COPY public /usr/local/src/public + +RUN npm ci +RUN npm run build + FROM php:8.0-cli-alpine as compile ARG DEBUG=false @@ -206,6 +218,7 @@ RUN \ WORKDIR /usr/src/code COPY --from=composer /usr/local/src/vendor /usr/src/code/vendor +COPY --from=node /usr/local/src/public/dist /usr/src/code/public/dist COPY --from=swoole /usr/local/lib/php/extensions/no-debug-non-zts-20200930/swoole.so /usr/local/lib/php/extensions/no-debug-non-zts-20200930/yasd.so* /usr/local/lib/php/extensions/no-debug-non-zts-20200930/ COPY --from=redis /usr/local/lib/php/extensions/no-debug-non-zts-20200930/redis.so /usr/local/lib/php/extensions/no-debug-non-zts-20200930/ COPY --from=imagick /usr/local/lib/php/extensions/no-debug-non-zts-20200930/imagick.so /usr/local/lib/php/extensions/no-debug-non-zts-20200930/ @@ -217,7 +230,8 @@ COPY --from=mongodb /usr/local/lib/php/extensions/no-debug-non-zts-20200930/mong COPY ./app /usr/src/code/app COPY ./bin /usr/local/bin COPY ./docs /usr/src/code/docs -COPY ./public /usr/src/code/public +COPY ./public/fonts /usr/src/code/public/fonts +COPY ./public/images /usr/src/code/public/images COPY ./src /usr/src/code/src # Set Volumes diff --git a/app/config/collections.php b/app/config/collections.php index db3bc22e28..83d4d1a8e6 100644 --- a/app/config/collections.php +++ b/app/config/collections.php @@ -500,7 +500,7 @@ $collections = [ 'required' => false, 'default' => [], 'array' => false, - 'filters' => ['json'], + 'filters' => ['json', 'encrypt'], ], [ '$id' => 'platforms', @@ -810,12 +810,12 @@ $collections = [ '$id' => 'secret', 'type' => Database::VAR_STRING, 'format' => '', - 'size' => 256, // var_dump of \bin2hex(\random_bytes(128)) => string(256) + 'size' => 512, // var_dump of \bin2hex(\random_bytes(128)) => string(256) doubling for encryption 'signed' => true, 'required' => true, 'default' => null, 'array' => false, - 'filters' => [], + 'filters' => ['encrypt'], ], ], 'indexes' => [ @@ -882,12 +882,12 @@ $collections = [ '$id' => 'httpPass', 'type' => Database::VAR_STRING, 'format' => '', - 'size' => Database::LENGTH_KEY, + 'size' => Database::LENGTH_KEY, // TODO will the length suffice after encryption? 'signed' => true, 'required' => false, 'default' => null, 'array' => false, - 'filters' => [], + 'filters' => ['encrypt'], ], [ '$id' => 'security', @@ -1155,18 +1155,18 @@ $collections = [ 'required' => false, 'default' => null, 'array' => false, - 'filters' => [], + 'filters' => ['encrypt'], ], [ '$id' => 'secret', 'type' => Database::VAR_STRING, 'format' => '', - 'size' => 64, // https://www.tutorialspoint.com/how-long-is-the-sha256-hash-in-mysql + 'size' => 512, // https://www.tutorialspoint.com/how-long-is-the-sha256-hash-in-mysql (512 for encryption) 'signed' => true, 'required' => false, 'default' => null, 'array' => false, - 'filters' => [], + 'filters' => ['encrypt'], ], [ '$id' => 'expire', @@ -1497,7 +1497,7 @@ $collections = [ 'required' => false, 'default' => null, 'array' => false, - 'filters' => [], + 'filters' => ['encrypt'], ], ], 'indexes' => [ diff --git a/app/config/locale/codes.php b/app/config/locale/codes.php index b403a202f7..0179a8e5bb 100644 --- a/app/config/locale/codes.php +++ b/app/config/locale/codes.php @@ -37,16 +37,16 @@ return [ 'kn', // Kannada 'km', // Khmer 'ko', // Korean + 'la', // Latin 'lb', // Luxembourgish 'lt', // Lithuanian 'lv', // Latvian 'ml', // Malayalam 'mr', // Marathi 'ms', // Malay - 'nb', // Norwegian - Bokmål + 'nb', // Norwegian bokmål 'nl', // Dutch - 'nn', // Norwegian (nynorsk) - 'no', // Norwegian (bokmål) + 'nn', // Norwegian nynorsk 'ne', // Nepali 'or', // Oriya 'tl', // Filipino @@ -64,6 +64,7 @@ return [ 'sq', // Albanian 'sv', // Swedish 'ta', // Tamil + 'te', // Telugu 'th', // Thai 'tr', // Turkish 'uk', // Ukrainian diff --git a/app/config/locale/languages.php b/app/config/locale/languages.php index 99b1cb8b2b..6272bd02a6 100644 --- a/app/config/locale/languages.php +++ b/app/config/locale/languages.php @@ -593,11 +593,6 @@ return [ "name" => "Norwegian Nynorsk", "nativeName" => "Norsk nynorsk" ], - [ - "code" => "no", - "name" => "Norwegian", - "nativeName" => "Norsk" - ], [ "code" => "nr", "name" => "South Ndebele", diff --git a/app/config/locale/translations/bn.json b/app/config/locale/translations/bn.json index 4030104f35..da8899f699 100644 --- a/app/config/locale/translations/bn.json +++ b/app/config/locale/translations/bn.json @@ -3,30 +3,30 @@ "settings.locale": "bn", "settings.direction": "ltr", "emails.sender": "%s টীম", - "emails.verification.subject": "", - "emails.verification.hello": "", - "emails.verification.body": "", - "emails.verification.footer": "", - "emails.verification.thanks": "", - "emails.verification.signature": "", - "emails.magicSession.subject": "", - "emails.magicSession.hello": "", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", - "emails.magicSession.thanks": "", - "emails.magicSession.signature": "", - "emails.recovery.subject": "", - "emails.recovery.hello": "", - "emails.recovery.body": "", - "emails.recovery.footer": "", - "emails.recovery.thanks": "", - "emails.recovery.signature": "", - "emails.invitation.subject": "", - "emails.invitation.hello": "", - "emails.invitation.body": "", - "emails.invitation.footer": "", - "emails.invitation.thanks": "", - "emails.invitation.signature": "", + "emails.verification.subject": "বিষয়", + "emails.verification.hello": "নমস্কার {{name}}", + "emails.verification.body": "এই লিঙ্কের মাধ্যমে ইমেইল যাচাই করুন।", + "emails.verification.footer": "আপনি যদি এই ঠিকানা যাচাই করতে না বলেন, তাহলে আপনি এই বার্তাটি উপেক্ষা করতে পারেন।", + "emails.verification.thanks": "ধন্যবাদ", + "emails.verification.signature": "{{project}} টীম", + "emails.magicSession.subject": "লগ ইন", + "emails.magicSession.hello": "নমস্কার", + "emails.magicSession.body": "এই লিঙ্কের মাধ্যমে লগ ইন করুন।", + "emails.magicSession.footer": "আপনি যদি এই ইমেলটি ব্যবহার করে লগইন করতে না বলেন, তাহলে আপনি এই বার্তাটি উপেক্ষা করতে পারেন।", + "emails.magicSession.thanks": "ধন্যবাদ", + "emails.magicSession.signature": "{{project}} টীম", + "emails.recovery.subject": "পাসওয়ার্ড রিসেট", + "emails.recovery.hello": "নমস্কার {{name}}", + "emails.recovery.body": "এই লিঙ্কের মাধ্যমে আপনার {{project}} পাসওয়ার্ড পুনরায় সেট করুন।", + "emails.recovery.footer": "আপনি যদি আপনার পাসওয়ার্ড পুনরায় সেট করতে না বলেন, তাহলে আপনি এই বার্তাটি উপেক্ষা করতে পারেন।", + "emails.recovery.thanks": "ধন্যবাদ", + "emails.recovery.signature": "{{project}} টীম", + "emails.invitation.subject": "%s টিমকে %s তে আমন্ত্রণ জানান", + "emails.invitation.hello": "নমস্কার", + "emails.invitation.body": "এই মেইলটি আপনাকে পাঠানো হয়েছে কারণ {{owner}} আপনাকে {{project}} এর সাথে যুক্ত {{team}} টিমের সদস্য হওয়ার জন্য আমন্ত্রণ জানাতে চেয়েছিলেন।", + "emails.invitation.footer": "যদি এটি আপনার জন্য প্রয়োজনীয় না হয়, আপনি এই বার্তাটি উপেক্ষা করতে পারেন।", + "emails.invitation.thanks": "ধন্যবাদ", + "emails.invitation.signature": "{{project}} টীম", "locale.country.unknown": "অজানা", "countries.af": "আফগানিস্তান", "countries.ao": "অ্যাঙ্গোলা", @@ -229,4 +229,4 @@ "continents.na": "উত্তর আমেরিকা", "continents.oc": "ওশেনিয়া", "continents.sa": "দক্ষিণ আমেরিকা" -} \ No newline at end of file +} diff --git a/app/config/locale/translations/hi.json b/app/config/locale/translations/hi.json index a1ef9b7aa5..1fa7d0555a 100644 --- a/app/config/locale/translations/hi.json +++ b/app/config/locale/translations/hi.json @@ -1,30 +1,30 @@ { - "settings.inspire": "\"बुद्धिमान होने की कला यह जानने की कला है कि क्या अनदेखा करना चाहिए |\"", + "settings.inspire": "\"बुद्धिमान होने की कला यह जानने की कला है कि क्या अनदेखा किया जाए |\"", "settings.locale": "hi", "settings.direction": "ltr", "emails.sender": "%s टीम", - "emails.verification.subject": "खाता सत्यापन", + "emails.verification.subject": "अकाउंट वेरिफिकेशन ", "emails.verification.hello": "नमस्ते {{name}}", - "emails.verification.body": "इस लिंक के माध्यम से ईमेल सत्यापित कीजिये।", - "emails.verification.footer": "यदि आपने इस पते को सत्यापित करने के लिए नहीं कहा है, तो आप इस संदेश को नज़रअंदाज़ कर सकते हैं।", + "emails.verification.body": "इस लिंक के माध्यम से अपने ईमेल को सत्यापित कीजिये।", + "emails.verification.footer": "यदि आपने इस पते को सत्यापित नहीं करना चाहते है, तो आप इस संदेश को नज़रअंदाज़ कर सकते हैं।", "emails.verification.thanks": "धन्यवाद", "emails.verification.signature": "{{project}} टीम", "emails.magicSession.subject": "लॉग इन", "emails.magicSession.hello": "नमस्ते,", - "emails.magicSession.body": "इस लिंक के माध्यम से लॉग इन करें।", - "emails.magicSession.footer": "यदि आपने इस ईमेल का उपयोग करके लॉगिन करने के लिए नहीं कहा है, तो आप इस संदेश को नज़रअंदाज़ कर सकते हैं।", + "emails.magicSession.body": "इस लिंक के माध्यम से लॉग-इन करें।", + "emails.magicSession.footer": "यदि आप इस ईमेल द्वारा लॉगिन नहीं करना चाहते है, तो आप इस संदेश को नज़रअंदाज़ कर सकते हैं।", "emails.magicSession.thanks": "धन्यवाद", "emails.magicSession.signature": "{{project}} टीम", "emails.recovery.subject": "पासवर्ड रीसेट", "emails.recovery.hello": "नमस्ते {{name}}", "emails.recovery.body": "इस लिंक के माध्यम से अपना {{project}} पासवर्ड रीसेट करें।", - "emails.recovery.footer": "यदि आपने अपना पासवर्ड रीसेट करने के लिए नहीं कहा है, तो आप इस संदेश को नज़रअंदाज़ कर सकते हैं।", + "emails.recovery.footer": "यदि आप अपना पासवर्ड रिसेट नहीं करना चाहते है, तो आप इस संदेश को नज़रअंदाज़ कर सकते हैं।", "emails.recovery.thanks": "धन्यवाद", "emails.recovery.signature": "{{project}} टीम", - "emails.invitation.subject": "%s टीम को %s पर आमंत्रण", + "emails.invitation.subject": "%s टीम का यहाँ %s पर आमंत्रण", "emails.invitation.hello": "नमस्ते", - "emails.invitation.body": "यह मेल आपको इसलिए भेजा गया था क्योंकि {{owner}} आपको {{team}} टीम का सदस्य बनने के लिए आमंत्रित करना चाहते थे जो {{project}} से जुड़ा है।", - "emails.invitation.footer": "यदि यह आपके लिए आवश्यक नहीं है, तो आप इस संदेश को नज़रअंदाज़ कर सकते हैं।", + "emails.invitation.body": "यह मेल आपको इसलिए भेजा गया था क्योंकि {{owner}} आपको {{team}} टीम का सदस्य बनाना चाहते थे, जो {{project}} से जुड़ा हुआ है।", + "emails.invitation.footer": "यदि आप इसमे रूचि नहीं रखते, तो आप इस संदेश को नज़रअंदाज़ कर सकते हैं।", "emails.invitation.thanks": "धन्यवाद", "emails.invitation.signature": "{{project}} टीम", "locale.country.unknown": "अज्ञात", diff --git a/app/config/locale/translations/hu.json b/app/config/locale/translations/hu.json index 7664a42dea..17ce2e544b 100644 --- a/app/config/locale/translations/hu.json +++ b/app/config/locale/translations/hu.json @@ -3,30 +3,30 @@ "settings.locale": "hu", "settings.direction": "ltr", "emails.sender": "%s Csapat", - "emails.verification.subject": "", - "emails.verification.hello": "", - "emails.verification.body": "", - "emails.verification.footer": "", - "emails.verification.thanks": "", - "emails.verification.signature": "", - "emails.magicSession.subject": "", - "emails.magicSession.hello": "", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", - "emails.magicSession.thanks": "", - "emails.magicSession.signature": "", - "emails.recovery.subject": "", - "emails.recovery.hello": "", - "emails.recovery.body": "", - "emails.recovery.footer": "", - "emails.recovery.thanks": "", - "emails.recovery.signature": "", - "emails.invitation.subject": "", - "emails.invitation.hello": "", - "emails.invitation.body": "", - "emails.invitation.footer": "", - "emails.invitation.thanks": "", - "emails.invitation.signature": "", + "emails.verification.subject": "Fiók Megerősítése", + "emails.verification.hello": "Szia {{name}}", + "emails.verification.body": "Kattints a linkre, hogy megerősítsd az email címedet.", + "emails.verification.footer": "Ha nem te kérted a címed megerősítését, akkor nyugodtan hagyd figyelmen kívül ezt az üzenetet.", + "emails.verification.thanks": "Köszönettel", + "emails.verification.signature": "a {{project}} csapat", + "emails.magicSession.subject": "Bejelentkezés", + "emails.magicSession.hello": "Szia,", + "emails.magicSession.body": "Kattints a linkre a bejelentkezéshez.", + "emails.magicSession.footer": "Ha nem te szerettél volna bejelentkezni ezzel az email címmel, akkor nyugodtan hagyd figyelmen kívül ezt az üzenetet.", + "emails.magicSession.thanks": "Köszönettel", + "emails.magicSession.signature": "a {{project}} csapat", + "emails.recovery.subject": "Jelszó Visszaállítása", + "emails.recovery.hello": "Hahó, {{name}}", + "emails.recovery.body": "Kattints a linkre a {{project}} jelszavad visszaállításához.", + "emails.recovery.footer": "Ha nem te kezdeményezted a jelszavad visszaállítását, akkor nyugodtan hagyd figyelmen kívül ezt az üzenetet.", + "emails.recovery.thanks": "Köszönettel", + "emails.recovery.signature": "a {{project}} csapat", + "emails.invitation.subject": "Meghívó a(z) %s csapatba, a(z) %s projektbe", + "emails.invitation.hello": "Szia", + "emails.invitation.body": "Ezt a levelet azért kaptad, mert {{owner}} meghívott, hogy légy a {{team}} csapat tagja a {{project}} projektben.", + "emails.invitation.footer": "Ha nem érdekel a lehetőség, nyugodtan hagyd figyelmen kívül ezt az üzenetet.", + "emails.invitation.thanks": "Köszönettel", + "emails.invitation.signature": "a {{project}} csapat", "locale.country.unknown": "Ismeretlen", "countries.af": "Afganisztán", "countries.ao": "Angola", diff --git a/app/config/locale/translations/la.json b/app/config/locale/translations/la.json new file mode 100644 index 0000000000..ea2b276a39 --- /dev/null +++ b/app/config/locale/translations/la.json @@ -0,0 +1,232 @@ +{ + "settings.inspire": "\"Ars sapiendi est ars sciendi quid negligat.\"", + "settings.locale": "la", + "settings.direction": "ltr*", + "emails.sender": "%s team", + "emails.verification.subject": "Ratio comprobatio", + "emails.verification.hello": "Salve ibi {{name}}", + "emails.verification.body": "Sequere hanc nexum ut quin inscriptionem tuum.", + "emails.verification.footer": "Si verificationem huius inscriptionis non postulasti, nuntium hunc ignorare potes.", + "emails.verification.thanks": "Gratias", + "emails.verification.signature": "{{project}} Team", + "emails.magicSession.subject": "Log in", + "emails.magicSession.hello": "Salve ibi,", + "emails.magicSession.body": "Hanc nexum cum login", + "emails.magicSession.footer": "Si verificationem huius inscriptionis non postulasti, nuntium hunc ignorare potes.", + "emails.magicSession.thanks": "Gratias", + "emails.magicSession.signature": "{{project}} team", + "emails.recovery.subject": "Recuperet password", + "emails.recovery.hello": "Salve ibi {{name}}", + "emails.recovery.body": "Sequere hanc conjunctionem ut recipias project password {{project}}", + "emails.recovery.footer": "Si tesseram tuam recuperare non petis, nuntium hunc ignorare potes", + "emails.recovery.thanks": "Gratias", + "emails.recovery.signature": "{{project}} team", + "emails.invitation.subject": "Invitatio pro %s in quadrigis %s", + "emails.invitation.hello": "Salve ibi", + "emails.invitation.body": "Haec inscriptio ad te missa est quia dominus incepto {{owner}} te invitare vult ut membrum {{team}} quadrigis fias ad {{project}}", + "emails.invitation.footer": "Si non quaero, potes hunc nuntium ignorare", + "emails.invitation.thanks": "Gratias", + "emails.invitation.signature": "{{project}} team", + "locale.country.unknown": "Ignotum", + "countries.af": "Afghanistan", + "countries.ao": "Angola", + "countries.al": "Albania", + "countries.ad": "Andorra", + "countries.ae": "Emiratos Arabes Unidos", + "countries.ar": "Argentina", + "countries.am": "Armenia", + "countries.ag": "Antigua and Barbuda", + "countries.au": "Australia", + "countries.at": "Austria", + "countries.az": "Azerbaijan", + "countries.bi": "Burundi", + "countries.be": "Belgium", + "countries.bj": "Benin", + "countries.bf": "Burkina Faso", + "countries.bd": "Bangladesh", + "countries.bg": "Bulgaria", + "countries.bh": "Bahrain", + "countries.bs": "Bahamas", + "countries.ba": "Bosnia and Herzegovina", + "countries.by": "Belarus", + "countries.bz": "Belize", + "countries.bo": "Bolivia", + "countries.br": "Brazil", + "countries.bb": "Barbados", + "countries.bn": "Brunei", + "countries.bt": "Bhutan", + "countries.bw": "Botswana", + "countries.cf": "Central African Republic", + "countries.ca": "Canada", + "countries.ch": "Switzerland", + "countries.cl": "Chile", + "countries.cn": "China", + "countries.ci": "Ivory Coast", + "countries.cm": "Cameroon", + "countries.cd": "DR Congo", + "countries.cg": "Republic of the Congo", + "countries.co": "Colombia", + "countries.km": "Comoros", + "countries.cv": "Cape Verde", + "countries.cr": "Costa Rica", + "countries.cu": "Cuba", + "countries.cy": "Cyprus", + "countries.cz": "Czechia", + "countries.de": "Germany", + "countries.dj": "Djibouti", + "countries.dm": "Dominica", + "countries.dk": "Denmark", + "countries.do": "Republica dominicana", + "countries.dz": "Algeria", + "countries.ec": "Ecuador", + "countries.eg": "Egypt", + "countries.er": "Eritrea", + "countries.es": "Spain", + "countries.ee": "Estonia", + "countries.et": "Ethiopia", + "countries.fi": "Finland", + "countries.fj": "Fiji", + "countries.fr": "France", + "countries.fm": "Micronesia", + "countries.ga": "Gabon", + "countries.gb": "Reino Unido", + "countries.ge": "Georgia", + "countries.gh": "Ghana", + "countries.gn": "Guinea", + "countries.gm": "Gambia", + "countries.gw": "Guinea-Bissau", + "countries.gq": "Equatorial Guinea", + "countries.gr": "Greece", + "countries.gd": "Grenada", + "countries.gt": "Guatemala", + "countries.gy": "Guyana", + "countries.hn": "Honduras", + "countries.hr": "Croatia", + "countries.ht": "Haiti", + "countries.hu": "Hungary", + "countries.id": "Indonesia", + "countries.in": "India", + "countries.ie": "Ireland", + "countries.ir": "Iran", + "countries.iq": "Iraq", + "countries.is": "Iceland", + "countries.il": "Israel", + "countries.it": "Italy", + "countries.jm": "Jamaica", + "countries.jo": "Jordan", + "countries.jp": "Japan", + "countries.kz": "Kazakhstan", + "countries.ke": "Kenya", + "countries.kg": "Kyrgyzstan", + "countries.kh": "Cambodia", + "countries.ki": "Kiribati", + "countries.kn": "Saint Kitts and Nevis", + "countries.kr": "South Korea", + "countries.kw": "Kuwait", + "countries.la": "Laos", + "countries.lb": "Lebanon", + "countries.lr": "Liberia", + "countries.ly": "Libya", + "countries.lc": "Saint Lucia", + "countries.li": "Liechtenstein", + "countries.lk": "Sri Lanka", + "countries.ls": "Lesotho", + "countries.lt": "Lithuania", + "countries.lu": "Luxembourg", + "countries.lv": "Latvia", + "countries.ma": "Morocco", + "countries.mc": "Monaco", + "countries.md": "Moldova", + "countries.mg": "Madagascar", + "countries.mv": "Maldives", + "countries.mx": "Mexico", + "countries.mh": "Marshall Islands", + "countries.mk": "Macedonia", + "countries.ml": "Mali", + "countries.mt": "Malta", + "countries.mm": "Myanmar", + "countries.me": "Montenegro", + "countries.mn": "Mongolia", + "countries.mz": "Mozambique", + "countries.mr": "Mauritania", + "countries.mu": "Mauritius", + "countries.mw": "Malawi", + "countries.my": "Malaysia", + "countries.na": "Namibia", + "countries.ne": "Niger", + "countries.ng": "Nigeria", + "countries.ni": "Nicaragua", + "countries.nl": "Netherlands", + "countries.no": "Norway", + "countries.np": "Nepal", + "countries.nr": "Nauru", + "countries.nz": "New Zealand", + "countries.om": "Oman", + "countries.pk": "Pakistan", + "countries.pa": "Panama", + "countries.pe": "Peru", + "countries.ph": "Philippines", + "countries.pw": "Palau", + "countries.pg": "Papua New Guinea", + "countries.pl": "Poland", + "countries.kp": "North Korea", + "countries.pt": "Portugal", + "countries.py": "Paraguay", + "countries.qa": "Qatar", + "countries.ro": "Romania", + "countries.ru": "Russia", + "countries.rw": "Rwanda", + "countries.sa": "Saudi Arabia", + "countries.sd": "Sudan", + "countries.sn": "Senegal", + "countries.sg": "Singapore", + "countries.sb": "Solomon Islands", + "countries.sl": "Sierra Leone", + "countries.sv": "El Salvador", + "countries.sm": "San Marino", + "countries.so": "Somalia", + "countries.rs": "Serbia", + "countries.ss": "South Sudan", + "countries.st": "São Tomé and Príncipe", + "countries.sr": "Suriname", + "countries.sk": "Slovakia", + "countries.si": "Slovenia", + "countries.se": "Sweden", + "countries.sz": "Swaziland", + "countries.sc": "Seychelles", + "countries.sy": "Syria", + "countries.td": "Chad", + "countries.tg": "Togo", + "countries.th": "Thailand", + "countries.tj": "Tajikistan", + "countries.tm": "Turkmenistan", + "countries.tl": "Timor-Leste", + "countries.to": "Tonga", + "countries.tt": "Trinidad and Tobago", + "countries.tn": "Tunisia", + "countries.tr": "Turkey", + "countries.tv": "Tuvalu", + "countries.tz": "Tanzania", + "countries.ug": "Uganda", + "countries.ua": "Ukraine", + "countries.uy": "Uruguay", + "countries.us": "United States", + "countries.uz": "Uzbekistan", + "countries.va": "Vatican City", + "countries.vc": "Saint Vincent and the Grenadines", + "countries.ve": "Venezuela", + "countries.vn": "Vietnam", + "countries.vu": "Vanuatu", + "countries.ws": "Samoa", + "countries.ye": "Yemen", + "countries.za": "Sud-Africa", + "countries.zm": "Zambia", + "countries.zw": "Zimbabwe", + "continents.af": "Africa", + "continents.an": "Antarctica", + "continents.as": "Asia", + "continents.eu": "Europe", + "continents.na": "America del Norte", + "continents.oc": "Oceania", + "continents.sa": "America del Sur" +} diff --git a/app/config/locale/translations/nb.json b/app/config/locale/translations/nb.json index 89d53f0538..06ea6f8413 100644 --- a/app/config/locale/translations/nb.json +++ b/app/config/locale/translations/nb.json @@ -2,31 +2,31 @@ "settings.inspire": "\"Kunsten å være klok er kunsten å vite hva man skal overse.\"", "settings.locale": "nb", "settings.direction": "ltr", - "emails.sender": "%s Teamet", - "emails.verification.subject": "Konto Verifisering", + "emails.sender": "%s Team", + "emails.verification.subject": "Kontobekreftelse", "emails.verification.hello": "Hei {{name}}", - "emails.verification.body": "Følg denne lenken for å verifisere din epost adresse.", - "emails.verification.footer": "Hvis du ikke ba om å bekrefte denne adressen, kan du ignorere denne meldingen.", + "emails.verification.body": "Følg denne lenken for å bekrefte din e-postadresse.", + "emails.verification.footer": "Dersom du ikke ba om å bekrefte e-postadressen, kan du se bort fra denne meldingen.", "emails.verification.thanks": "Takk", - "emails.verification.signature": "{{project}} teamet", - "emails.magicSession.subject": "Login", + "emails.verification.signature": "{{project}} team", + "emails.magicSession.subject": "Pålogging", "emails.magicSession.hello": "Hei,", - "emails.magicSession.body": "Følg denne lenken for å logge inn.", - "emails.magicSession.footer": "Hvis du ikke ba om å logge inn med denne adressen, kan du ignorere denne meldingen.", + "emails.magicSession.body": "Følg denne lenken for å logge på.", + "emails.magicSession.footer": "Dersom du ikke ba om å logge på med denne e-postadressen, kan du se bort fra denne meldingen.", "emails.magicSession.thanks": "Takk", - "emails.magicSession.signature": "{{project}} teamet", - "emails.recovery.subject": "Reset Passord", + "emails.magicSession.signature": "{{project}} team", + "emails.recovery.subject": "Nullstille passord", "emails.recovery.hello": "Hei {{name}}", - "emails.recovery.body": "Følg denne lenken for å resette ditt {{project}} passord.", - "emails.recovery.footer": "Hvis du ikke ba om å resette ditt passord, kan du ignorere denne meldingen.", + "emails.recovery.body": "Følg denne lenken for å nullstille ditt {{project}} passord.", + "emails.recovery.footer": "Dersom du ikke ba om å nullstille passordet ditt, kan du se bort fra denne meldingen.", "emails.recovery.thanks": "Takk", - "emails.recovery.signature": "{{project}} teamet", + "emails.recovery.signature": "{{project}} team", "emails.invitation.subject": "Invitasjon til %s Team ved %s", "emails.invitation.hello": "Hei", - "emails.invitation.body": "Denne mailen ble sendt til deg fordi {{owner}} hadde lyst til å invitere deg til å bli et medlem av {{team}} teamet ved {{project}}.", - "emails.invitation.footer": "Hvis du ikke er interessert, kan du ignorere denne meldingen.", + "emails.invitation.body": "Denne meldingen ble sendt til deg fordi {{owner}} ønsket å invitere deg til å bli medlem av {{team}} team ved {{project}}.", + "emails.invitation.footer": "Dersom du ikke er interessert, kan du se bort fra denne meldingen.", "emails.invitation.thanks": "Takk", - "emails.invitation.signature": "{{project}} teamet", + "emails.invitation.signature": "{{project}} team", "locale.country.unknown": "Ukjent", "countries.af": "Afghanistan", "countries.ao": "Angola", @@ -229,4 +229,4 @@ "continents.na": "Nord-Amerika", "continents.oc": "Oseania", "continents.sa": "Sør-Amerika" -} \ No newline at end of file +} diff --git a/app/config/locale/translations/no.json b/app/config/locale/translations/no.json deleted file mode 100644 index 4f83dc677a..0000000000 --- a/app/config/locale/translations/no.json +++ /dev/null @@ -1,232 +0,0 @@ -{ - "settings.inspire": "\"Kunsten å være klok er kunsten å vite hva man skal overse.\"", - "settings.locale": "no", - "settings.direction": "ltr", - "emails.sender": "%s Team", - "emails.verification.subject": "Kontobekreftelse", - "emails.verification.hello": "Hallo {{name}}", - "emails.verification.body": "Følg denne lenken for å bekrefte din e-postadresse.", - "emails.verification.footer": "Dersom du ikke ba om å bekrefte e-postadressen, kan du se bort fra denne meldingen.", - "emails.verification.thanks": "Takk", - "emails.verification.signature": "{{project}} team", - "emails.magicSession.subject": "Pålogging", - "emails.magicSession.hello": "Hei,", - "emails.magicSession.body": "Følg denne lenken for å logge på.", - "emails.magicSession.footer": "Dersom du ikke ba om å logge på med denne e-postadressen, kan du se bort fra denne meldingen.", - "emails.magicSession.thanks": "Takk", - "emails.magicSession.signature": "{{project}} team", - "emails.recovery.subject": "Nullstille passord", - "emails.recovery.hello": "Hallo {{name}}", - "emails.recovery.body": "Følg denne lenken for å nullstille ditt {{project}} passord.", - "emails.recovery.footer": "Dersom du ikke ba om å nullstille passordet ditt, kan du se bort fra denne meldingen.", - "emails.recovery.thanks": "Takk", - "emails.recovery.signature": "{{project}} team", - "emails.invitation.subject": "Invitasjon til %s Team ved %s", - "emails.invitation.hello": "Hallo", - "emails.invitation.body": "Denne meldingen ble sendt til deg fordi {{owner}} ønsket å invitere deg til å bli medlem av {{team}} team i {{project}}.", - "emails.invitation.footer": "Dersom du ikke er interessert, kan du se bort fra denne meldingen.", - "emails.invitation.thanks": "Takk", - "emails.invitation.signature": "{{project}} team", - "locale.country.unknown": "Ukjent", - "countries.af": "Afghanistan", - "countries.ao": "Angola", - "countries.al": "Albania", - "countries.ad": "Andorra", - "countries.ae": "De forente arabiske emirater", - "countries.ar": "Argentina", - "countries.am": "Armenia", - "countries.ag": "Antigua og Barbuda", - "countries.au": "Australia", - "countries.at": "Østerrike", - "countries.az": "Aserbajdsjan", - "countries.bi": "Burundi", - "countries.be": "Belgia", - "countries.bj": "Benin", - "countries.bf": "Burkina Faso", - "countries.bd": "Bangladesh", - "countries.bg": "Bulgaria", - "countries.bh": "Bahrain", - "countries.bs": "Bahamas", - "countries.ba": "Bosnia-Hercegovina", - "countries.by": "Hviterussland", - "countries.bz": "Belize", - "countries.bo": "Bolivia", - "countries.br": "Brasil", - "countries.bb": "Barbados", - "countries.bn": "Brunei Darussalam", - "countries.bt": "Bhutan", - "countries.bw": "Botswana", - "countries.cf": "Den sentralafrikanske republikken", - "countries.ca": "Canada", - "countries.ch": "Sveits", - "countries.cl": "Chile", - "countries.cn": "Kina", - "countries.ci": "Elfenbenskysten", - "countries.cm": "Kamerun", - "countries.cd": "Den demokratiske republikken Kongo", - "countries.cg": "Republikken Kongo", - "countries.co": "Colombia", - "countries.km": "Komorene", - "countries.cv": "Kapp Verde", - "countries.cr": "Costa Rica", - "countries.cu": "Cuba", - "countries.cy": "Kypros", - "countries.cz": "Tjekkia", - "countries.de": "Tyskland", - "countries.dj": "Djibouti", - "countries.dm": "Dominica", - "countries.dk": "Danmark", - "countries.do": "Den dominikanske republikk", - "countries.dz": "Algerie", - "countries.ec": "Ecuador", - "countries.eg": "Egypt", - "countries.er": "Eritrea", - "countries.es": "Spania", - "countries.ee": "Estland", - "countries.et": "Etiopia", - "countries.fi": "Finland", - "countries.fj": "Fiji", - "countries.fr": "Frankrike", - "countries.fm": "Mikronesia", - "countries.ga": "Gabon", - "countries.gb": "Storbritannia", - "countries.ge": "Georgia", - "countries.gh": "Ghana", - "countries.gn": "Guinea", - "countries.gm": "Gambia", - "countries.gw": "Guinea-Bissau", - "countries.gq": "Ekvatorial-Guinea", - "countries.gr": "Hellas", - "countries.gd": "Grenada", - "countries.gt": "Guatemala", - "countries.gy": "Guyana", - "countries.hn": "Honduras", - "countries.hr": "Kroatia", - "countries.ht": "Haiti", - "countries.hu": "Ungarn", - "countries.id": "Indonesia", - "countries.in": "India", - "countries.ie": "Irland", - "countries.ir": "Iran", - "countries.iq": "Irak", - "countries.is": "Island", - "countries.il": "Israel", - "countries.it": "Italia", - "countries.jm": "Jamaica", - "countries.jo": "Jordan", - "countries.jp": "Japan", - "countries.kz": "Kasakhstan", - "countries.ke": "Kenya", - "countries.kg": "Kirgisistan", - "countries.kh": "Kambodsja", - "countries.ki": "Kiribati", - "countries.kn": "Saint Kitts og Nevis", - "countries.kr": "Sør-Korea", - "countries.kw": "Kuwait", - "countries.la": "Laos", - "countries.lb": "Libanon", - "countries.lr": "Liberia", - "countries.ly": "Libya", - "countries.lc": "Saint Lucia", - "countries.li": "Liechtenstein", - "countries.lk": "Sri Lanka", - "countries.ls": "Lesotho", - "countries.lt": "Litauen", - "countries.lu": "Luxembourg", - "countries.lv": "Latvia", - "countries.ma": "Marokko", - "countries.mc": "Monaco", - "countries.md": "Moldova", - "countries.mg": "Madagaskar", - "countries.mv": "Maldivene", - "countries.mx": "Mexico", - "countries.mh": "Marshalløyene", - "countries.mk": "Nord-Makedonia", - "countries.ml": "Mali", - "countries.mt": "Malta", - "countries.mm": "Myanmar", - "countries.me": "Montenegro", - "countries.mn": "Mongolia", - "countries.mz": "Mozambik", - "countries.mr": "Mauritania", - "countries.mu": "Mauritius", - "countries.mw": "Malawi", - "countries.my": "Malaysia", - "countries.na": "Namibia", - "countries.ne": "Niger", - "countries.ng": "Nigeria", - "countries.ni": "Nicaragua", - "countries.nl": "Nederland", - "countries.no": "Norge", - "countries.np": "Nepal", - "countries.nr": "Nauru", - "countries.nz": "New Zealand", - "countries.om": "Oman", - "countries.pk": "Pakistan", - "countries.pa": "Panama", - "countries.pe": "Peru", - "countries.ph": "Filippinene", - "countries.pw": "Palau", - "countries.pg": "Papua Ny-Guinea", - "countries.pl": "Polen", - "countries.kp": "Nord-Korea", - "countries.pt": "Portugal", - "countries.py": "Paraguay", - "countries.qa": "Qatar", - "countries.ro": "Romania", - "countries.ru": "Russland", - "countries.rw": "Rwanda", - "countries.sa": "Saudi-Arabia", - "countries.sd": "Sudan", - "countries.sn": "Senegal", - "countries.sg": "Singapore", - "countries.sb": "Solomonøyene", - "countries.sl": "Sierra Leone", - "countries.sv": "El Salvador", - "countries.sm": "San Marino", - "countries.so": "Somalia", - "countries.rs": "Serbia", - "countries.ss": "Sør-Sudan", - "countries.st": "São Tomé og Príncipe", - "countries.sr": "Surinam", - "countries.sk": "Slovakia", - "countries.si": "Slovenia", - "countries.se": "Sverige", - "countries.sz": "Swaziland", - "countries.sc": "Seychellene", - "countries.sy": "Syria", - "countries.td": "Tsjad", - "countries.tg": "Togo", - "countries.th": "Thailand", - "countries.tj": "Tajikistan", - "countries.tm": "Turkmenistan", - "countries.tl": "Øst-Timor", - "countries.to": "Tonga", - "countries.tt": "Trinidad og Tobago", - "countries.tn": "Tunisia", - "countries.tr": "Tyrkia", - "countries.tv": "Tuvalu", - "countries.tz": "Tanzania", - "countries.ug": "Uganda", - "countries.ua": "Ukraina", - "countries.uy": "Uruguay", - "countries.us": "Amerikas forente stater", - "countries.uz": "Usbekistan", - "countries.va": "Vatikanstaten", - "countries.vc": "Saint Vincent og Grenadinene", - "countries.ve": "Venezuela", - "countries.vn": "Vietnam", - "countries.vu": "Vanuatu", - "countries.ws": "Samoa", - "countries.ye": "Jemen", - "countries.za": "Sør-Africa", - "countries.zm": "Zambia", - "countries.zw": "Zimbabwe", - "continents.af": "Afrika", - "continents.an": "Antarktis", - "continents.as": "Asia", - "continents.eu": "Europa", - "continents.na": "Nord-Amerika", - "continents.oc": "Oseania", - "continents.sa": "Sør-Amerika" -} diff --git a/app/config/locale/translations/ta.json b/app/config/locale/translations/ta.json index 9c5aad7cba..8555a00bf1 100644 --- a/app/config/locale/translations/ta.json +++ b/app/config/locale/translations/ta.json @@ -3,30 +3,30 @@ "settings.locale": "ta", "settings.direction": "ltr", "emails.sender": "%s குழு", - "emails.verification.subject": "", - "emails.verification.hello": "", - "emails.verification.body": "", - "emails.verification.footer": "", - "emails.verification.thanks": "", - "emails.verification.signature": "", - "emails.magicSession.subject": "", - "emails.magicSession.hello": "", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", - "emails.magicSession.thanks": "", - "emails.magicSession.signature": "", - "emails.recovery.subject": "", - "emails.recovery.hello": "", - "emails.recovery.body": "", - "emails.recovery.footer": "", - "emails.recovery.thanks": "", - "emails.recovery.signature": "", - "emails.invitation.subject": "", - "emails.invitation.hello": "", - "emails.invitation.body": "", - "emails.invitation.footer": "", - "emails.invitation.thanks": "", - "emails.invitation.signature": "", + "emails.verification.subject": "கணக்கு சரிபார்ப்பு", + "emails.verification.hello": "ஏய் {{name}}", + "emails.verification.body": "உங்கள் மின்னஞ்சல் முகவரியைச் சரிபார்க்க இந்த இணைப்பைப் பின்தொடரவும்.", + "emails.verification.footer": "இந்த முகவரியைச் சரிபார்க்கும்படி உங்களிடம் கேட்கப்படவில்லை என்றால், இந்தச் செய்தியை நீங்கள் புறக்கணிக்கலாம்.", + "emails.verification.thanks": "நன்றி", + "emails.verification.signature": "{{project}} குழு ", + "emails.magicSession.subject": "உள்நுழைய", + "emails.magicSession.hello": "ஏய்,", + "emails.magicSession.body": "இந்த இணைப்பைப் பின்தொடரவும் உள்நுழைய", + "emails.magicSession.footer": "இந்த மின்னஞ்சலைப் பயன்படுத்தி உள்நுழையுமாறு உங்களிடம் கேட்கப்படாவிட்டால், இந்தச் செய்தியைப் புறக்கணிக்கலாம்.", + "emails.magicSession.thanks": "நன்றி", + "emails.magicSession.signature": "{{project}} குழு", + "emails.recovery.subject": "கடவுச்சொல் மீட்டமைப்பு", + "emails.recovery.hello": "வணக்கம் {{name}}", + "emails.recovery.body": "மீட்டமைக்க இந்த இணைப்பைப் பின்தொடரவும் {{project}} கடவுச்சொல்.", + "emails.recovery.footer": "உங்கள் கடவுச்சொல்லை மீட்டமைக்கும்படி உங்களிடம் கேட்கப்படவில்லை என்றால், இந்தச் செய்தியை நீங்கள் புறக்கணிக்கலாம்.", + "emails.recovery.thanks": "நன்றி", + "emails.recovery.signature": "{{project}} குழு", + "emails.invitation.subject": "அழைப்பிதழ் %s குழு %s ", + "emails.invitation.hello": "வணக்கம்", + "emails.invitation.body": "{{project}} இல் {{team}} குழுவில் உறுப்பினராக உங்களை {{owner}} அழைக்க விரும்புவதால், இந்த அஞ்சல் உங்களுக்கு அனுப்பப்பட்டது.", + "emails.invitation.footer": "உங்களுக்கு ஆர்வம் இல்லை என்றால், இந்த செய்தியை நீங்கள் புறக்கணிக்கலாம்.", + "emails.invitation.thanks": "நன்றி", + "emails.invitation.signature": "{{project}} குழு", "locale.country.unknown": "அறியவில்லை", "countries.af": "ஆப்கானித்தான்", "countries.ao": "அங்கோலா", diff --git a/app/config/locale/translations/te.json b/app/config/locale/translations/te.json new file mode 100644 index 0000000000..e9c2a6636a --- /dev/null +++ b/app/config/locale/translations/te.json @@ -0,0 +1,232 @@ +{ + "settings.inspire": "\"ఏది విస్మరించాలో తెలుసుకోవడమే తెలివైన వ్యక్తి యొక్క కళ.\"", + "settings.locale": "te", + "settings.direction": "ltr", + "emails.sender": "%s జట్టు", + "emails.verification.subject": "ఖాతా ధృవీకరణ", + "emails.verification.hello": "నమస్కారము {{name}}", + "emails.verification.body": "ఈ లింక్ ద్వారా ఇమెయిల్ ని ధృవీకరించండి", + "emails.verification.footer": "మీరు ఈ చిరునామాను ధృవీకరించమని అడగనట్లయితే, మీరు ఈ సందేశాన్ని విస్మరించవచ్చు", + "emails.verification.thanks": "ధన్యవాదాలు", + "emails.verification.signature": "{{project}} జట్", + "emails.magicSession.subject": "లాగిన్", + "emails.magicSession.hello": "నమస్కారము,", + "emails.magicSession.body": "లాగిన్ చేయడానికి ఈ లింక్ ని అనుసరించండి", + "emails.magicSession.footer": "మీరు ఈ ఇమెయిల్ ని ఉపయోగించి లాగిన్ చేయమని అడగకపోతే, మీరు ఈ సందేశాన్ని విస్మరించవచ్చు", + "emails.magicSession.thanks": "ధన్యవాదాలు", + "emails.magicSession.signature": "{{project}} జట్", + "emails.recovery.subject": "పాస్వర్డ్ రీసెట్", + "emails.recovery.hello": "నమస్కారమ {{name}}", + "emails.recovery.body": "మీ {{project}} పాస్వర్డ్ ని రీసెట్ చేయడానికి ఈ లింక్ ని అనుసరించండి", + "emails.recovery.footer": "మీరు మీ పాస్వర్డ్ ని రీసెట్ చేయమని అడగనట్లయితే, మీరు ఈ సందేశాన్ని విస్మరించవచ్చు", + "emails.recovery.thanks": "ధన్యవాదాల", + "emails.recovery.signature": "{{project}} జట్", + "emails.invitation.subject": "%s వద్ద %s బృందానికి ఆహ్వానం", + "emails.invitation.hello": "నమస్కారమ", + "emails.invitation.body": "{{owner}} మిమ్మల్ని {{project}} లో {{team}} బృందంలో సభ్యునిగా ఉండమని ఆహ్వానించాలనుకుంటున్నందున ఈ మెయిల్ మీకు పంపబడింది.", + "emails.invitation.footer": "మీకు ఆసక్తి లేకుంటే, మీరు ఈ సందేశాన్ని విస్మరించవచ్చు.", + "emails.invitation.thanks": "ధన్యవాదాల", + "emails.invitation.signature": "{{project}} జట్", + "locale.country.unknown": "తెలియని", + "countries.af": "ఆఫ్ఘనిస్తాన్", + "countries.ao": "అంగోలా", + "countries.al": "అల్బేనియా", + "countries.ad": "అండోరా", + "countries.ae": "యునైటెడ్ అరబ్ ఎమిరేట్స్", + "countries.ar": "అర్జెంటీనా", + "countries.am": "అర్మేనియా", + "countries.ag": "ఆంటిగ్వా మరియు బార్బుడా", + "countries.au": "ఆస్ట్రేలియా", + "countries.at": "ఆస్ట్రియా", + "countries.az": "అజర్బైజాన్", + "countries.bi": "బురుండి", + "countries.be": "బెల్జియం", + "countries.bj": "బెనిన్", + "countries.bf": "బుర్కినా ఫాసో", + "countries.bd": "బంగ్లాదేశ్", + "countries.bg": "బల్గేరియా", + "countries.bh": "బహ్రెయిన్", + "countries.bs": "బహామాస్", + "countries.ba": "బోస్నియా మరియు హెర్జెగోవినా", + "countries.by": "బెలారస్", + "countries.bz": "బెలీజ్", + "countries.bo": "బొలీవియా", + "countries.br": "బ్రెజిల్", + "countries.bb": "బార్బడోస్", + "countries.bn": "బ్రూనై", + "countries.bt": "భూటాన్", + "countries.bw": "బోట్స్వానా", + "countries.cf": "సెంట్రల్ ఆఫ్రికన్ రిపబ్లిక్", + "countries.ca": "కెనడా", + "countries.ch": "స్విట్జర్లాండ్", + "countries.cl": "చిలీ", + "countries.cn": "చైనా", + "countries.ci": "ఐవరీ కోస్ట్", + "countries.cm": "కామెరూన్", + "countries.cd": "DR కాంగో", + "countries.cg": "రిపబ్లిక్ ఆఫ్ కాంగో", + "countries.co": "కొలంబియా", + "countries.km": "కొమోరోస్", + "countries.cv": "కేప్ వర్దె", + "countries.cr": "కోస్టా రికా", + "countries.cu": "క్యూబా", + "countries.cy": "సైప్రస్", + "countries.cz": "చెకియా", + "countries.de": "జర్మనీ", + "countries.dj": "జిబౌటీ", + "countries.dm": "డొమినికా", + "countries.dk": "డెన్మార్క్", + "countries.do": "డొమినికన్ రిపబ్లిక్", + "countries.dz": "అల్జీరియా", + "countries.ec": "ఈక్వెడార్", + "countries.eg": "ఈజిప్ట్", + "countries.er": "ఎరిత్రియా", + "countries.es": "స్పెయిన్", + "countries.ee": "ఎస్టోనియా", + "countries.et": "ఇథియోపియా", + "countries.fi": "ఫిన్లాండ్", + "countries.fj": "ఫిజీ", + "countries.fr": "ఫ్రాన్స్", + "countries.fm": "మైక్రోనేషియా", + "countries.ga": "గాబోన్", + "countries.gb": "యునైటెడ్ కింగ్డమ్", + "countries.ge": "జార్జియా", + "countries.gh": "ఘానా", + "countries.gn": "గినియా", + "countries.gm": "గాంబియా", + "countries.gw": "గిన్-బిస్సౌ", + "countries.gq": "ఈక్వటోరియల్ గిన్", + "countries.gr": "గ్రీస్", + "countries.gd": "గ్రెనడా", + "countries.gt": "గ్వాటెమాల", + "countries.gy": "గయానా", + "countries.hn": "హోండురాస్", + "countries.hr": "క్రొయేషియా", + "countries.ht": "హైతీ", + "countries.hu": "హంగేరి", + "countries.id": "ఇండోనేషియా", + "countries.in": "భారతదేశం", + "countries.ie": "ఐర్లాండ్", + "countries.ir": "ఇరాన్", + "countries.iq": "ఇరాక్", + "countries.is": "ఐస్లాండ్", + "countries.il": "ఇజ్రాయెల్", + "countries.it": "ఇటలీ", + "countries.jm": "జమైకా", + "countries.jo": "జోర్డాన్", + "countries.jp": "జపాన్", + "countries.kz": "కజకిస్తాన్", + "countries.ke": "కెన్యా", + "countries.kg": "కిర్గిజ్స్తాన్", + "countries.kh": "కంబోడియా", + "countries.ki": "కిరిబాటి", + "countries.kn": "సెయింట్ కిట్స్ అండ్ నెవిస్", + "countries.kr": "దక్షిణ కొరియా", + "countries.kw": "కువైట్", + "countries.la": "లావోస్", + "countries.lb": "లెబనాన్", + "countries.lr": "లైబీరియా", + "countries.ly": "లిబియా", + "countries.lc": "సెయింట్ లూసియా", + "countries.li": "లీచ్టెన్స్టెయిన్", + "countries.lk": "శ్రీలంక", + "countries.ls": "లెసోతో", + "countries.lt": "లిథువేనియా", + "countries.lu": "లక్సెంబర్గ్", + "countries.lv": "లాట్వియా", + "countries.ma": "మొరాకో", + "countries.mc": "మొనాకో", + "countries.md": "మోల్డోవా", + "countries.mg": "మడగాస్కర్", + "countries.mv": "మాల్దీవులు", + "countries.mx": "మెక్సికో", + "countries.mh": "మార్షల్ దీవులు", + "countries.mk": "మాసిడోనియా", + "countries.ml": "మాలి", + "countries.mt": "మాల్టా", + "countries.mm": "మయన్మార్", + "countries.me": "మాంటెనెగ్రో", + "countries.mn": "మంగోలియా", + "countries.mz": "మొజాంబిక్", + "countries.mr": "మౌరిటానియా", + "countries.mu": "మారిషస్", + "countries.mw": "మలావి", + "countries.my": "మలేషియా", + "countries.na": "నమీబియా", + "countries.ne": "నైజర్", + "countries.ng": "నైజీరియా", + "countries.ni": "నికరాగ్వా", + "countries.nl": "నెదర్లాండ్స్", + "countries.no": "నార్వే", + "countries.np": "నేపాల్", + "countries.nr": "నౌరు", + "countries.nz": "న్యూజిలాండ్", + "countries.om": "ఒమన్", + "countries.pk": "పాకిస్తాన్", + "countries.pa": "పనామా", + "countries.pe": "పెరూ", + "countries.ph": "ఫిలిప్పీన్స్", + "countries.pw": "పలావ్", + "countries.pg": "పాపువా న్యూ గిన్", + "countries.pl": "పోలాండ్", + "countries.kp": "ఉత్తర కొరియా", + "countries.pt": "పోర్చుగల్", + "countries.py": "పరాగ్వే", + "countries.qa": "ఖతార్", + "countries.ro": "రొమేనియా", + "countries.ru": "రష్యా", + "countries.rw": "రువాండా", + "countries.sa": "సౌదీ అరేబియా", + "countries.sd": "సూడాన్", + "countries.sn": "సెనెగల్", + "countries.sg": "సింగపూర్", + "countries.sb": "సోలమన్ దీవులు", + "countries.sl": "సియెర్రా లియోన్", + "countries.sv": "ఎల్ సాల్వడార్", + "countries.sm": "శాన్ మారినో", + "countries.so": "సోమాలియా", + "countries.rs": "సెర్బియా", + "countries.ss": "దక్షిణ సూడాన్", + "countries.st": "సావో టోమ్ మరియు ప్రిన్సిపే", + "countries.sr": "సురినామ్", + "countries.sk": "స్లోవేకియా", + "countries.si": "స్లోవేనియా", + "countries.se": "స్వీడన్", + "countries.sz": "స్వాజిలాండ్", + "countries.sc": "సీషెల్స్", + "countries.sy": "సిరియా", + "countries.td": "చాడ్", + "countries.tg": "టోగో", + "countries.th": "థాయిలాండ్", + "countries.tj": "తజికిస్తాన్", + "countries.tm": "తుర్క్మెనిస్తాన్", + "countries.tl": "తైమోర్-లెస్టే", + "countries.to": "టాంగా", + "countries.tt": "ట్రినిడాడ్ మరియు టొబాగో", + "countries.tn": "ట్యునీషియా", + "countries.tr": "టర్కీ", + "countries.tv": "తువాలు", + "countries.tz": "టాంజానియా", + "countries.ug": "ఉగాండా", + "countries.ua": "ఉక్రెయిన్", + "countries.uy": "ఉరుగ్వే", + "countries.us": "యునైటెడ్ స్టేట్స్", + "countries.uz": "ఉజ్బెకిస్తాన్", + "countries.va": "వాటికన్ నగరం", + "countries.vc": "సెయింట్ విన్సెంట్ మరియు గ్రెనడిన్స్", + "countries.ve": "వెనిజులా", + "countries.vn": "వియత్నాం", + "countries.vu": "వనాటు", + "countries.ws": "సమోవా", + "countries.ye": "యెమెన్", + "countries.za": "దక్షిణాఫ్రికా", + "countries.zm": "జాంబియా", + "countries.zw": "జింబాబ్వే", + "continents.af": "ఆఫ్రికా", + "continents.an": "అంటార్కిటికా", + "continents.as": "ఆసియా", + "continents.eu": "యూరోప్", + "continents.na": "ఉత్తర అమెరికా", + "continents.oc": "ఓషియానియా", + "continents.sa": "దక్షిణ అమెరికా" +} diff --git a/app/config/locale/translations/ur.json b/app/config/locale/translations/ur.json index 2f73bec143..4d92add049 100644 --- a/app/config/locale/translations/ur.json +++ b/app/config/locale/translations/ur.json @@ -3,30 +3,30 @@ "settings.locale": "ur", "settings.direction": "rtl", "emails.sender": "%s ٹیم", - "emails.verification.subject": "", - "emails.verification.hello": "", - "emails.verification.body": "", - "emails.verification.footer": "", - "emails.verification.thanks": "", - "emails.verification.signature": "", - "emails.magicSession.subject": "", - "emails.magicSession.hello": "", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", - "emails.magicSession.thanks": "", - "emails.magicSession.signature": "", - "emails.recovery.subject": "", - "emails.recovery.hello": "", - "emails.recovery.body": "", - "emails.recovery.footer": "", - "emails.recovery.thanks": "", - "emails.recovery.signature": "", - "emails.invitation.subject": "", - "emails.invitation.hello": "", - "emails.invitation.body": "", - "emails.invitation.footer": "", - "emails.invitation.thanks": "", - "emails.invitation.signature": "", + "emails.verification.subject": "اکاؤنٹ کی تصدیق", + "emails.verification.hello": "خوش آمدید {{name}}", + "emails.verification.body": "براہ کرم اپنے ای میل کی تصدیق کے لیے درج ذیل لنک پر عمل کریں۔", + "emails.verification.footer": "اگر آپ نے اس پتے کی تصدیق کے لیے نہیں کہا تو آپ اس پیغام کو نظر انداز کر سکتے ہیں۔", + "emails.verification.thanks": "شکریہ", + "emails.verification.signature": "ٹیم۔ {{project}}", + "emails.magicSession.subject": "اگ ان کریں", + "emails.magicSession.hello": "خوش آمدید,", + "emails.magicSession.body": "لاگ ان کرنے کے لیے اس لنک پر عمل کریں۔", + "emails.magicSession.footer": "اگر آپ نے اس ای میل کا استعمال کرتے ہوئے لاگ ان کرنے کے لیے نہیں کہا تو آپ اس پیغام کو نظر انداز کر سکتے ہیں۔", + "emails.magicSession.thanks": "شکریہ", + "emails.magicSession.signature": "ٹیم۔ {{project}}", + "emails.recovery.subject": "پاس ورڈ ری سیٹ۔", + "emails.recovery.hello": "ہیلو {{name}}", + "emails.recovery.body": "{{project}} کا پاس ورڈ تبدیل کرنے کے لیے درج ذیل لنک پر عمل کریں", + "emails.recovery.footer": "اگر آپ نے اپنا پاس ورڈ دوبارہ ترتیب دینے کے لیے نہیں کہا تو آپ اس پیغام کو نظر انداز کر سکتے ہیں۔", + "emails.recovery.thanks": "شکریہ", + "emails.recovery.signature": "ٹیم۔ {{project}}", + "emails.invitation.subject": "%s پر %s ٹیم کو دعوت", + "emails.invitation.hello": "خوش آمدید", + "emails.invitation.body": "یہ پیغام آپ کو اس لیے بھیجا گیا تھا کہ {{owner}} نے آپ کو {{project}} میں {{team}} ٹیم کا رکن بننے کی دعوت بھیجی", + "emails.invitation.footer": "اگر آپ دلچسپی نہیں رکھتے تو آپ اس پیغام کو نظر انداز کر سکتے ہیں۔", + "emails.invitation.thanks": "شکریہ", + "emails.invitation.signature": "ٹیم۔ {{project}", "locale.country.unknown": "نامعلوم", "countries.af": "افغانستان", "countries.ao": "انگولا", @@ -229,4 +229,4 @@ "continents.na": "شمالی امریکہ", "continents.oc": "اوشینیا", "continents.sa": "جنوبی امریکہ" -} \ No newline at end of file +} diff --git a/app/config/variables.php b/app/config/variables.php index a5ae6e46dd..5e5e813065 100644 --- a/app/config/variables.php +++ b/app/config/variables.php @@ -72,7 +72,7 @@ return [ ], [ 'name' => '_APP_CONSOLE_WHITELIST_ROOT', - 'description' => 'This option allows you to disable the creation of new users on the Appwrite console. When enabled only 1 user will be able to use the registration form. New users can be added by invting them to your project. By default this option is enabled.', + 'description' => 'This option allows you to disable the creation of new users on the Appwrite console. When enabled only 1 user will be able to use the registration form. New users can be added by inviting them to your project. By default this option is enabled.', 'introduction' => '0.8.0', 'default' => 'enabled', 'required' => false, @@ -368,7 +368,7 @@ return [ 'variables' => [ [ 'name' => '_APP_STORAGE_LIMIT', - 'description' => 'Maximun file size allowed for file upload. The default value is 10MB limitation. You should pass your size limit value in bytes.', + 'description' => 'Maximum file size allowed for file upload. The default value is 10MB limitation. You should pass your size limit value in bytes.', 'introduction' => '0.7.0', 'default' => '10000000', 'required' => false, @@ -464,7 +464,7 @@ return [ ], [ 'name' => '_APP_FUNCTIONS_ENVS', - 'description' => 'Deprectated with 0.8.0, use \'_APP_FUNCTIONS_RUNTIMES\' instead!', + 'description' => 'Deprecated with 0.8.0, use \'_APP_FUNCTIONS_RUNTIMES\' instead!', 'introduction' => '0.7.0', 'default' => 'node-16.0,php-7.4,python-3.9,ruby-3.0,java-16.0', 'required' => false, @@ -542,4 +542,4 @@ return [ ], ], ], -]; \ No newline at end of file +]; diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 390f1a14ce..d2e68b1144 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -46,7 +46,7 @@ App::post('/v1/account') ->label('abuse-limit', 10) ->param('userId', '', new CustomId(), 'Unique Id. Choose your own unique ID or pass the string `unique()` to auto generate it. Valid chars are a-z, A-Z, 0-9, period, hyphen, and underscore. Can\'t start with a special char. Max length is 36 chars.') ->param('email', '', new Email(), 'User email.') - ->param('password', '', new Password(), 'User password. Must be between 6 to 32 chars.') + ->param('password', '', new Password(), 'User password. Must be at least 8 chars.') ->param('name', '', new Text(128), 'User name. Max length: 128 chars.', true) ->inject('request') ->inject('response') @@ -150,7 +150,7 @@ App::post('/v1/account/sessions') ->label('abuse-limit', 10) ->label('abuse-key', 'url:{url},email:{param-email}') ->param('email', '', new Email(), 'User email.') - ->param('password', '', new Password(), 'User password. Must be between 6 to 32 chars.') + ->param('password', '', new Password(), 'User password. Must be at least 8 chars.') ->inject('request') ->inject('response') ->inject('dbForInternal') @@ -648,8 +648,9 @@ App::post('/v1/account/sessions/magic-url') throw new Exception('SMTP Disabled', 503); } - $isPrivilegedUser = Auth::isPrivilegedUser(Authorization::$roles); - $isAppUser = Auth::isAppUser(Authorization::$roles); + $roles = Authorization::getRoles(); + $isPrivilegedUser = Auth::isPrivilegedUser($roles); + $isAppUser = Auth::isAppUser($roles); $user = $dbForInternal->findOne('users', [new Query('email', Query::TYPE_EQUAL, [$email])]); @@ -1367,8 +1368,8 @@ App::patch('/v1/account/password') ->label('sdk.response.code', Response::STATUS_CODE_OK) ->label('sdk.response.type', Response::CONTENT_TYPE_JSON) ->label('sdk.response.model', Response::MODEL_USER) - ->param('password', '', new Password(), 'New user password. Must be between 6 to 32 chars.') - ->param('oldPassword', '', new Password(), 'Old user password. Must be between 6 to 32 chars.', true) + ->param('password', '', new Password(), 'User password. Must be at least 8 chars.') + ->param('oldPassword', '', new Password(), 'Old user password. Must be at least 8 chars.', true) ->inject('response') ->inject('user') ->inject('dbForInternal') @@ -1416,7 +1417,7 @@ App::patch('/v1/account/email') ->label('sdk.response.type', Response::CONTENT_TYPE_JSON) ->label('sdk.response.model', Response::MODEL_USER) ->param('email', '', new Email(), 'User email.') - ->param('password', '', new Password(), 'User password. Must be between 6 to 32 chars.') + ->param('password', '', new Password(), 'User password. Must be at least 8 chars.') ->inject('response') ->inject('user') ->inject('dbForInternal') @@ -1780,8 +1781,9 @@ App::post('/v1/account/recovery') throw new Exception('SMTP Disabled', 503); } - $isPrivilegedUser = Auth::isPrivilegedUser(Authorization::$roles); - $isAppUser = Auth::isAppUser(Authorization::$roles); + $roles = Authorization::getRoles(); + $isPrivilegedUser = Auth::isPrivilegedUser($roles); + $isAppUser = Auth::isAppUser($roles); $email = \strtolower($email); $profile = $dbForInternal->findOne('users', [new Query('deleted', Query::TYPE_EQUAL, [false]), new Query('email', Query::TYPE_EQUAL, [$email])]); // Get user by email address @@ -1869,8 +1871,8 @@ App::put('/v1/account/recovery') ->label('abuse-key', 'url:{url},userId:{param-userId}') ->param('userId', '', new UID(), 'User account UID address.') ->param('secret', '', new Text(256), 'Valid reset token.') - ->param('password', '', new Password(), 'New password. Must be between 6 to 32 chars.') - ->param('passwordAgain', '', new Password(), 'New password again. Must be between 6 to 32 chars.') + ->param('password', '', new Password(), 'User password. Must be at least 8 chars.') + ->param('passwordAgain', '', new Password(), 'New password again. Must be at least 8 chars.') ->inject('response') ->inject('dbForInternal') ->inject('audits') @@ -1971,9 +1973,10 @@ App::post('/v1/account/verification') if(empty(App::getEnv('_APP_SMTP_HOST'))) { throw new Exception('SMTP Disabled', 503); } - - $isPrivilegedUser = Auth::isPrivilegedUser(Authorization::$roles); - $isAppUser = Auth::isAppUser(Authorization::$roles); + + $roles = Authorization::getRoles(); + $isPrivilegedUser = Auth::isPrivilegedUser($roles); + $isAppUser = Auth::isAppUser($roles); $verificationSecret = Auth::tokenGenerator(); diff --git a/app/controllers/api/database.php b/app/controllers/api/database.php index d60d055912..3759c63ad2 100644 --- a/app/controllers/api/database.php +++ b/app/controllers/api/database.php @@ -1640,16 +1640,19 @@ App::post('/v1/database/collections/:collectionId/documents') $data['$read'] = (is_null($read) && !$user->isEmpty()) ? ['user:'.$user->getId()] : $read ?? []; // By default set read permissions for user $data['$write'] = (is_null($write) && !$user->isEmpty()) ? ['user:'.$user->getId()] : $write ?? []; // By default set write permissions for user - // Users can only add their roles to documents, API keys can add any - $roles = \array_fill_keys(Authorization::getRoles(), true); // Auth::isAppUser expects roles to be keys, not values of assoc array - foreach ($data['$read'] as $read) { - if (!Auth::isAppUser($roles) && !Authorization::isRole($read)) { - throw new Exception('Read permissions must be one of: ('.\implode(', ', $roles).')', 400); + // Users can only add their roles to documents, API keys and Admin users can add any + $roles = Authorization::getRoles(); + + if (!Auth::isAppUser($roles) && !Auth::isPrivilegedUser($roles)) { + foreach ($data['$read'] as $read) { + if (!Authorization::isRole($read)) { + throw new Exception('Read permissions must be one of: ('.\implode(', ', $roles).')', 400); + } } - } - foreach ($data['$write'] as $write) { - if (!Auth::isAppUser($roles) && !Authorization::isRole($write)) { - throw new Exception('Write permissions must be one of: ('.\implode(', ', $roles).')', 400); + foreach ($data['$write'] as $write) { + if (!Authorization::isRole($write)) { + throw new Exception('Write permissions must be one of: ('.\implode(', ', $roles).')', 400); + } } } @@ -1998,16 +2001,19 @@ App::patch('/v1/database/collections/:collectionId/documents/:documentId') $data['$read'] = (is_null($read)) ? ($document->getRead() ?? []) : $read; // By default inherit read permissions $data['$write'] = (is_null($write)) ? ($document->getWrite() ?? []) : $write; // By default inherit write permissions - // Users can only add their roles to documents, API keys can add any - $roles = \array_fill_keys(Authorization::getRoles(), true); // Auth::isAppUser expects roles to be keys, not values of assoc array - foreach ($data['$read'] as $read) { - if (!Auth::isAppUser($roles) && !Authorization::isRole($read)) { - throw new Exception('Read permissions must be one of: ('.\implode(', ', $roles).')', 400); + // Users can only add their roles to documents, API keys and Admin users can add any + $roles = Authorization::getRoles(); + + if (!Auth::isAppUser($roles) && !Auth::isPrivilegedUser($roles)) { + foreach ($data['$read'] as $read) { + if (!Authorization::isRole($read)) { + throw new Exception('Read permissions must be one of: ('.\implode(', ', $roles).')', 400); + } } - } - foreach ($data['$write'] as $write) { - if (!Auth::isAppUser($roles) && !Authorization::isRole($write)) { - throw new Exception('Write permissions must be one of: ('.\implode(', ', $roles).')', 400); + foreach ($data['$write'] as $write) { + if (!Authorization::isRole($write)) { + throw new Exception('Write permissions must be one of: ('.\implode(', ', $roles).')', 400); + } } } diff --git a/app/controllers/api/functions.php b/app/controllers/api/functions.php index 480b1223d9..76c9ef47ba 100644 --- a/app/controllers/api/functions.php +++ b/app/controllers/api/functions.php @@ -119,6 +119,34 @@ App::get('/v1/functions') ]), Response::MODEL_FUNCTION_LIST); }); +App::get('/v1/functions/runtimes') + ->groups(['api', 'functions']) + ->desc('List the currently active function runtimes.') + ->label('scope', 'functions.read') + ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) + ->label('sdk.namespace', 'functions') + ->label('sdk.method', 'listRuntimes') + ->label('sdk.description', '/docs/references/functions/list-runtimes.md') + ->label('sdk.response.code', Response::STATUS_CODE_OK) + ->label('sdk.response.type', Response::CONTENT_TYPE_JSON) + ->label('sdk.response.model', Response::MODEL_RUNTIME_LIST) + ->inject('response') + ->action(function ($response) { + /** @var Appwrite\Utopia\Response $response */ + + $runtimes = Config::getParam('runtimes'); + + $runtimes = array_map(function ($key) use ($runtimes) { + $runtimes[$key]['$id'] = $key; + return $runtimes[$key]; + }, array_keys($runtimes)); + + $response->dynamic(new Document([ + 'sum' => count($runtimes), + 'runtimes' => $runtimes + ]), Response::MODEL_RUNTIME_LIST); + }); + App::get('/v1/functions/:functionId') ->groups(['api', 'functions']) ->desc('Get Function') diff --git a/app/controllers/api/projects.php b/app/controllers/api/projects.php index 081f52428c..f305a891d6 100644 --- a/app/controllers/api/projects.php +++ b/app/controllers/api/projects.php @@ -1,6 +1,7 @@ label('sdk.response.code', Response::STATUS_CODE_NOCONTENT) ->label('sdk.response.model', Response::MODEL_NONE) ->param('projectId', '', new UID(), 'Project unique ID.') - ->param('password', '', new UID(), 'Your user password for confirmation. Must be between 6 to 32 chars.') + ->param('password', '', new Password(), 'Your user password for confirmation. Must be at least 8 chars.') ->inject('response') ->inject('user') ->inject('dbForConsole') diff --git a/app/controllers/api/storage.php b/app/controllers/api/storage.php index f3f6a4eed2..3e095f4d01 100644 --- a/app/controllers/api/storage.php +++ b/app/controllers/api/storage.php @@ -1,5 +1,6 @@ isEmpty()) ? ['user:'.$user->getId()] : $read ?? []; // By default set read permissions for user + $write = (is_null($write) && !$user->isEmpty()) ? ['user:'.$user->getId()] : $write ?? []; + + // Users can only add their roles to files, API keys and Admin users can add any + $roles = Authorization::getRoles(); + + if (!Auth::isAppUser($roles) && !Auth::isPrivilegedUser($roles)) { + foreach ($read as $role) { + if (!Authorization::isRole($role)) { + throw new Exception('Read permissions must be one of: ('.\implode(', ', $roles).')', 400); + } + } + foreach ($write as $role) { + if (!Authorization::isRole($role)) { + throw new Exception('Write permissions must be one of: ('.\implode(', ', $roles).')', 400); + } + } + } + $file = $request->getFiles('file'); /* @@ -265,7 +285,7 @@ App::get('/v1/storage/files/:fileId/preview') ->param('borderColor', '', new HexColor(), 'Preview image border color. Use a valid HEX color, no # is needed for prefix.', true) ->param('borderRadius', 0, new Range(0, 4000), 'Preview image border radius in pixels. Pass an integer between 0 to 4000.', true) ->param('opacity', 1, new Range(0,1, Range::TYPE_FLOAT), 'Preview image opacity. Only works with images having an alpha channel (like png). Pass a number between 0 to 1.', true) - ->param('rotation', 0, new Range(0,360), 'Preview image rotation in degrees. Pass an integer between 0 and 360.', true) + ->param('rotation', 0, new Range(-360,360), 'Preview image rotation in degrees. Pass an integer between -360 and 360.', true) ->param('background', '', new HexColor(), 'Preview image background color. Only works with transparent images (png). Use a valid HEX color, no # is needed for prefix.', true) ->param('output', '', new WhiteList(\array_keys(Config::getParam('storage-outputs')), true), 'Output format type (jpeg, jpg, png, gif and webp).', true) ->inject('request') @@ -382,7 +402,7 @@ App::get('/v1/storage/files/:fileId/preview') } if (!empty($rotation)) { - $image->setRotation($rotation); + $image->setRotation(($rotation + 360) % 360); } $output = (empty($output)) ? $type : $output; @@ -563,13 +583,34 @@ App::put('/v1/storage/files/:fileId') ->param('write', [], new ArrayList(new Text(64)), 'An array of strings with write permissions. By default no user is granted with any write permissions. [learn more about permissions](/docs/permissions) and get a full list of available permissions.') ->inject('response') ->inject('dbForInternal') + ->inject('user') ->inject('audits') ->inject('usage') - ->action(function ($fileId, $read, $write, $response, $dbForInternal, $audits, $usage) { + ->action(function ($fileId, $read, $write, $response, $dbForInternal, $user, $audits, $usage) { /** @var Appwrite\Utopia\Response $response */ /** @var Utopia\Database\Database $dbForInternal */ + /** @var Utopia\Database\Document $user */ /** @var Appwrite\Event\Event $audits */ + $read = (is_null($read) && !$user->isEmpty()) ? ['user:'.$user->getId()] : $read ?? []; // By default set read permissions for user + $write = (is_null($write) && !$user->isEmpty()) ? ['user:'.$user->getId()] : $write ?? []; + + // Users can only add their roles to files, API keys and Admin users can add any + $roles = Authorization::getRoles(); + + if (!Auth::isAppUser($roles) && !Auth::isPrivilegedUser($roles)) { + foreach ($read as $role) { + if (!Authorization::isRole($role)) { + throw new Exception('Read permissions must be one of: ('.\implode(', ', $roles).')', 400); + } + } + foreach ($write as $role) { + if (!Authorization::isRole($role)) { + throw new Exception('Write permissions must be one of: ('.\implode(', ', $roles).')', 400); + } + } + } + $file = $dbForInternal->getDocument('files', $fileId); if (empty($file->getId())) { diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index 5d8e1781b7..5b4476fb09 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -49,8 +49,8 @@ App::post('/v1/teams') Authorization::disable(); - $isPrivilegedUser = Auth::isPrivilegedUser(Authorization::$roles); - $isAppUser = Auth::isAppUser(Authorization::$roles); + $isPrivilegedUser = Auth::isPrivilegedUser(Authorization::getRoles()); + $isAppUser = Auth::isAppUser(Authorization::getRoles()); $teamId = $teamId == 'unique()' ? $dbForInternal->getId() : $teamId; $team = $dbForInternal->createDocument('teams', new Document([ @@ -293,8 +293,8 @@ App::post('/v1/teams/:teamId/memberships') throw new Exception('SMTP Disabled', 503); } - $isPrivilegedUser = Auth::isPrivilegedUser(Authorization::$roles); - $isAppUser = Auth::isAppUser(Authorization::$roles); + $isPrivilegedUser = Auth::isPrivilegedUser(Authorization::getRoles()); + $isAppUser = Auth::isAppUser(Authorization::getRoles()); $email = \strtolower($email); $name = (empty($name)) ? $email : $name; @@ -566,8 +566,8 @@ App::patch('/v1/teams/:teamId/memberships/:membershipId') throw new Exception('User not found', 404); } - $isPrivilegedUser = Auth::isPrivilegedUser(Authorization::$roles); - $isAppUser = Auth::isAppUser(Authorization::$roles); + $isPrivilegedUser = Auth::isPrivilegedUser(Authorization::getRoles()); + $isAppUser = Auth::isAppUser(Authorization::getRoles()); $isOwner = Authorization::isRole('team:'.$team->getId().'/owner');; if (!$isOwner && !$isPrivilegedUser && !$isAppUser) { // Not owner, not admin, not app (server) diff --git a/app/controllers/api/users.php b/app/controllers/api/users.php index cfc17176f6..a5d412d5b6 100644 --- a/app/controllers/api/users.php +++ b/app/controllers/api/users.php @@ -36,7 +36,7 @@ App::post('/v1/users') ->label('sdk.response.model', Response::MODEL_USER) ->param('userId', '', new CustomId(), 'Unique Id. Choose your own unique ID or pass the string `unique()` to auto generate it. Valid chars are a-z, A-Z, 0-9, period, hyphen, and underscore. Can\'t start with a special char. Max length is 36 chars.') ->param('email', '', new Email(), 'User email.') - ->param('password', '', new Password(), 'User password. Must be between 6 to 32 chars.') + ->param('password', '', new Password(), 'User password. Must be at least 8 chars.') ->param('name', '', new Text(128), 'User name. Max length: 128 chars.', true) ->inject('response') ->inject('dbForInternal') diff --git a/app/controllers/general.php b/app/controllers/general.php index 4d2c6b7135..e75b2f2164 100644 --- a/app/controllers/general.php +++ b/app/controllers/general.php @@ -254,7 +254,7 @@ App::init(function ($utopia, $request, $response, $console, $project, $dbForCons if(!empty($service)) { if(array_key_exists($service, $project->getAttribute('services',[])) && !$project->getAttribute('services',[])[$service] - && !Auth::isPrivilegedUser(Authorization::$roles)) { + && !Auth::isPrivilegedUser(Authorization::getRoles())) { throw new Exception('Service is disabled', 503); } } diff --git a/app/controllers/shared/api.php b/app/controllers/shared/api.php index 210cb46912..b1087f28e6 100644 --- a/app/controllers/shared/api.php +++ b/app/controllers/shared/api.php @@ -64,8 +64,9 @@ App::init(function ($utopia, $request, $response, $project, $user, $events, $aud ; } - $isPrivilegedUser = Auth::isPrivilegedUser(Authorization::$roles); - $isAppUser = Auth::isAppUser(Authorization::$roles); + $roles = Authorization::getRoles(); + $isPrivilegedUser = Auth::isPrivilegedUser($roles); + $isAppUser = Auth::isAppUser($roles); if (($abuse->check() // Route is rate-limited && App::getEnv('_APP_OPTIONS_ABUSE', 'enabled') !== 'disabled') // Abuse is not disabled @@ -128,8 +129,8 @@ App::init(function ($utopia, $request, $project) { $route = $utopia->match($request); - $isPrivilegedUser = Auth::isPrivilegedUser(Authorization::$roles); - $isAppUser = Auth::isAppUser(Authorization::$roles); + $isPrivilegedUser = Auth::isPrivilegedUser(Authorization::getRoles()); + $isAppUser = Auth::isAppUser(Authorization::getRoles()); if($isAppUser || $isPrivilegedUser) { // Skip limits for app and console devs return; @@ -166,7 +167,7 @@ App::init(function ($utopia, $request, $project) { throw new Exception('JWT authentication is disabled for this project', 501); } break; - + default: throw new Exception('Unsupported authentication route'); break; @@ -187,7 +188,7 @@ App::shutdown(function ($utopia, $request, $response, $project, $events, $audits /** @var bool $mode */ if (!empty($events->getParam('event'))) { - if(empty($events->getParam('eventData'))) { + if (empty($events->getParam('eventData'))) { $events->setParam('eventData', $response->getPayload()); } @@ -206,10 +207,10 @@ App::shutdown(function ($utopia, $request, $response, $project, $events, $audits if ($project->getId() !== 'console') { $payload = new Document($response->getPayload()); - $target = Realtime::fromPayload($events->getParam('event'), $payload); + $target = Realtime::fromPayload($events->getParam('event'), $payload, $project); Realtime::send( - $project->getId(), + $target['projectId'] ?? $project->getId(), $response->getPayload(), $events->getParam('event'), $target['channels'], diff --git a/app/init.php b/app/init.php index 92d05d4650..7bb876605a 100644 --- a/app/init.php +++ b/app/init.php @@ -22,8 +22,6 @@ use Ahc\Jwt\JWT; use Ahc\Jwt\JWTException; use Appwrite\Auth\Auth; use Appwrite\Database\Database as DatabaseOld; -use Appwrite\Database\Adapter\MySQL as MySQLAdapter; -use Appwrite\Database\Adapter\Redis as RedisAdapter; use Appwrite\Event\Event; use Appwrite\Network\Validator\Email; use Appwrite\Network\Validator\IP; @@ -332,6 +330,9 @@ Database::addFilter('encrypt', ]); }, function($value) { + if(is_null($value)) { + return null; + } $value = json_decode($value, true); $key = App::getEnv('_APP_OPENSSL_KEY_V'.$value['version']); @@ -532,6 +533,7 @@ Locale::setLanguageFromJSON('jv', __DIR__.'/config/locale/translations/jv.json') Locale::setLanguageFromJSON('kn', __DIR__.'/config/locale/translations/kn.json'); Locale::setLanguageFromJSON('km', __DIR__.'/config/locale/translations/km.json'); Locale::setLanguageFromJSON('ko', __DIR__.'/config/locale/translations/ko.json'); +Locale::setLanguageFromJSON('la', __DIR__.'/config/locale/translations/la.json'); Locale::setLanguageFromJSON('lb', __DIR__.'/config/locale/translations/lb.json'); Locale::setLanguageFromJSON('lt', __DIR__.'/config/locale/translations/lt.json'); Locale::setLanguageFromJSON('lv', __DIR__.'/config/locale/translations/lv.json'); @@ -542,7 +544,6 @@ Locale::setLanguageFromJSON('nb', __DIR__.'/config/locale/translations/nb.json') Locale::setLanguageFromJSON('ne', __DIR__.'/config/locale/translations/ne.json'); Locale::setLanguageFromJSON('nl', __DIR__.'/config/locale/translations/nl.json'); Locale::setLanguageFromJSON('nn', __DIR__.'/config/locale/translations/nn.json'); -Locale::setLanguageFromJSON('no', __DIR__.'/config/locale/translations/no.json'); Locale::setLanguageFromJSON('or', __DIR__.'/config/locale/translations/or.json'); Locale::setLanguageFromJSON('pa', __DIR__.'/config/locale/translations/pa.json'); Locale::setLanguageFromJSON('pl', __DIR__.'/config/locale/translations/pl.json'); @@ -558,6 +559,7 @@ Locale::setLanguageFromJSON('sl', __DIR__ . '/config/locale/translations/sl.json Locale::setLanguageFromJSON('sq', __DIR__ . '/config/locale/translations/sq.json'); Locale::setLanguageFromJSON('sv', __DIR__ . '/config/locale/translations/sv.json'); Locale::setLanguageFromJSON('ta', __DIR__ . '/config/locale/translations/ta.json'); +Locale::setLanguageFromJSON('te', __DIR__.'/config/locale/translations/te.json'); Locale::setLanguageFromJSON('th', __DIR__.'/config/locale/translations/th.json'); Locale::setLanguageFromJSON('tl', __DIR__.'/config/locale/translations/tl.json'); Locale::setLanguageFromJSON('tr', __DIR__.'/config/locale/translations/tr.json'); diff --git a/app/realtime.php b/app/realtime.php index c3704ffb92..e027809295 100644 --- a/app/realtime.php +++ b/app/realtime.php @@ -474,7 +474,8 @@ $server->onMessage(function (int $connection, string $message) use ($server, $re * * Abuse limits are sending 32 times per minute and connection. */ - $timeLimit = new TimeLimit('url:{url},conection:{connection}', 32, 60, $database); + $timeLimit = new TimeLimit('url:{url},connection:{connection}', 32, 60, $database); + $timeLimit ->setParam('{connection}', $connection) ->setParam('{container}', $containerId); diff --git a/app/views/home/auth/signup.phtml b/app/views/home/auth/signup.phtml index 09b58fae79..9aecea62b5 100644 --- a/app/views/home/auth/signup.phtml +++ b/app/views/home/auth/signup.phtml @@ -46,7 +46,7 @@ $root = ($this->getParam('root') !== 'disabled'); - +
diff --git a/app/views/layouts/default.phtml b/app/views/layouts/default.phtml index 2818e4d923..c6c0de795e 100644 --- a/app/views/layouts/default.phtml +++ b/app/views/layouts/default.phtml @@ -51,7 +51,7 @@ if(!empty($platforms)) { - + diff --git a/app/workers/database.php b/app/workers/database.php index 3b9f36afbd..f58502704a 100644 --- a/app/workers/database.php +++ b/app/workers/database.php @@ -1,5 +1,6 @@ isEmpty()) { throw new Exception('Missing document'); } - + switch (strval($type)) { case DATABASE_TYPE_CREATE_ATTRIBUTE: $this->createAttribute($collection, $document, $projectId); @@ -67,9 +68,11 @@ class DatabaseV1 extends Worker */ protected function createAttribute(Document $collection, Document $attribute, string $projectId): void { + $dbForConsole = $this->getConsoleDB(); $dbForInternal = $this->getInternalDB($projectId); $dbForExternal = $this->getExternalDB($projectId); + $event = 'database.attributes.update'; $collectionId = $collection->getId(); $key = $attribute->getAttribute('key', ''); $type = $attribute->getAttribute('type', ''); @@ -81,6 +84,7 @@ class DatabaseV1 extends Worker $format = $attribute->getAttribute('format', ''); $formatOptions = $attribute->getAttribute('formatOptions', []); $filters = $attribute->getAttribute('filters', []); + $project = $dbForConsole->getDocument('projects', $projectId); try { if(!$dbForExternal->createAttribute($collectionId, $key, $type, $size, $required, $default, $signed, $array, $format, $formatOptions, $filters)) { @@ -90,6 +94,20 @@ class DatabaseV1 extends Worker } catch (\Throwable $th) { Console::error($th->getMessage()); $dbForInternal->updateDocument('attributes', $attribute->getId(), $attribute->setAttribute('status', 'failed')); + } finally { + $target = Realtime::fromPayload($event, $attribute, $project); + + Realtime::send( + projectId: 'console', + payload: $attribute->getArrayCopy(), + event: $event, + channels: $target['channels'], + roles: $target['roles'], + options: [ + 'projectId' => $projectId, + 'collectionId' => $collection->getId() + ] + ); } $dbForInternal->deleteCachedDocument('collections', $collectionId); @@ -102,11 +120,15 @@ class DatabaseV1 extends Worker */ protected function deleteAttribute(Document $collection, Document $attribute, string $projectId): void { + $dbForConsole = $this->getConsoleDB(); $dbForInternal = $this->getInternalDB($projectId); $dbForExternal = $this->getExternalDB($projectId); + + $event = 'database.attributes.delete'; $collectionId = $collection->getId(); $key = $attribute->getAttribute('key', ''); $status = $attribute->getAttribute('status', ''); + $project = $dbForConsole->getDocument('projects', $projectId); // possible states at this point: // - available: should not land in queue; controller flips these to 'deleting' @@ -122,6 +144,20 @@ class DatabaseV1 extends Worker } catch (\Throwable $th) { Console::error($th->getMessage()); $dbForInternal->updateDocument('attributes', $attribute->getId(), $attribute->setAttribute('status', 'stuck')); + } finally { + $target = Realtime::fromPayload($event, $attribute, $project); + + Realtime::send( + projectId: 'console', + payload: $attribute->getArrayCopy(), + event: $event, + channels: $target['channels'], + roles: $target['roles'], + options: [ + 'projectId' => $projectId, + 'collectionId' => $collection->getId() + ] + ); } // The underlying database removes/rebuilds indexes when attribute is removed @@ -185,15 +221,18 @@ class DatabaseV1 extends Worker */ protected function createIndex(Document $collection, Document $index, string $projectId): void { + $dbForConsole = $this->getConsoleDB(); $dbForInternal = $this->getInternalDB($projectId); $dbForExternal = $this->getExternalDB($projectId); + $event = 'database.indexes.update'; $collectionId = $collection->getId(); $key = $index->getAttribute('key', ''); $type = $index->getAttribute('type', ''); $attributes = $index->getAttribute('attributes', []); $lengths = $index->getAttribute('lengths', []); $orders = $index->getAttribute('orders', []); + $project = $dbForConsole->getDocument('projects', $projectId); try { if(!$dbForExternal->createIndex($collectionId, $key, $type, $attributes, $lengths, $orders)) { @@ -203,6 +242,20 @@ class DatabaseV1 extends Worker } catch (\Throwable $th) { Console::error($th->getMessage()); $dbForInternal->updateDocument('indexes', $index->getId(), $index->setAttribute('status', 'failed')); + } finally { + $target = Realtime::fromPayload($event, $index, $project); + + Realtime::send( + projectId: 'console', + payload: $index->getArrayCopy(), + event: $event, + channels: $target['channels'], + roles: $target['roles'], + options: [ + 'projectId' => $projectId, + 'collectionId' => $collection->getId() + ] + ); } $dbForInternal->deleteCachedDocument('collections', $collectionId); @@ -215,12 +268,15 @@ class DatabaseV1 extends Worker */ protected function deleteIndex(Document $collection, Document $index, string $projectId): void { + $dbForConsole = $this->getConsoleDB(); $dbForInternal = $this->getInternalDB($projectId); $dbForExternal = $this->getExternalDB($projectId); $collectionId = $collection->getId(); $key = $index->getAttribute('key'); $status = $index->getAttribute('status', ''); + $event = 'database.indexes.delete'; + $project = $dbForConsole->getDocument('projects', $projectId); try { if($status !== 'failed' && !$dbForExternal->deleteIndex($collectionId, $key)) { @@ -230,6 +286,20 @@ class DatabaseV1 extends Worker } catch (\Throwable $th) { Console::error($th->getMessage()); $dbForInternal->updateDocument('indexes', $index->getId(), $index->setAttribute('status', 'stuck')); + } finally { + $target = Realtime::fromPayload($event, $index, $project); + + Realtime::send( + projectId: 'console', + payload: $index->getArrayCopy(), + event: $event, + channels: $target['channels'], + roles: $target['roles'], + options: [ + 'projectId' => $projectId, + 'collectionId' => $collection->getId() + ] + ); } $dbForInternal->deleteCachedDocument('collections', $collectionId); diff --git a/app/workers/functions.php b/app/workers/functions.php index 4b9149e037..b4bc89f370 100644 --- a/app/workers/functions.php +++ b/app/workers/functions.php @@ -359,7 +359,7 @@ class FunctionsV1 extends Worker } } - if (isset($list[$container]) && !(\substr($list[$container]->getStatus(), 0, 2) === 'Up')) { // Remove conatiner if not online + if (isset($list[$container]) && !(\substr($list[$container]->getStatus(), 0, 2) === 'Up')) { // Remove container if not online $stdout = ''; $stderr = ''; @@ -381,7 +381,7 @@ class FunctionsV1 extends Worker * Make sure no access to NFS server / storage volumes * Access Appwrite REST from internal network for improved performance */ - if (!isset($list[$container])) { // Create contianer if not ready + if (!isset($list[$container])) { // Create container if not ready $stdout = ''; $stderr = ''; diff --git a/composer.json b/composer.json index f534615f20..d2953bf5b4 100644 --- a/composer.json +++ b/composer.json @@ -51,7 +51,7 @@ "utopia-php/registry": "0.5.*", "utopia-php/preloader": "0.2.*", "utopia-php/domains": "1.1.*", - "utopia-php/swoole": "0.2.*", + "utopia-php/swoole": "0.3.*", "utopia-php/storage": "0.5.*", "utopia-php/websocket": "0.0.*", "utopia-php/image": "0.5.*", diff --git a/composer.lock b/composer.lock index b541ac91de..33a29d90b7 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "7e24a95bc534ed39b042f19b27268de9", + "content-hash": "9dcf48d4173daea87c60b464b104cd22", "packages": [ { "name": "adhocore/jwt", @@ -2138,16 +2138,16 @@ }, { "name": "utopia-php/database", - "version": "0.12.0", + "version": "0.12.1", "source": { "type": "git", "url": "https://github.com/utopia-php/database.git", - "reference": "102ee1d21fd55fc92dc7a07b60672a98ae49be26" + "reference": "af512b7a00cc7c6e30fa03efbc5fd7e77a93e2df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/database/zipball/102ee1d21fd55fc92dc7a07b60672a98ae49be26", - "reference": "102ee1d21fd55fc92dc7a07b60672a98ae49be26", + "url": "https://api.github.com/repos/utopia-php/database/zipball/af512b7a00cc7c6e30fa03efbc5fd7e77a93e2df", + "reference": "af512b7a00cc7c6e30fa03efbc5fd7e77a93e2df", "shasum": "" }, "require": { @@ -2155,7 +2155,7 @@ "ext-pdo": "*", "ext-redis": "*", "mongodb/mongodb": "1.8.0", - "php": ">=7.1", + "php": ">=8.0", "utopia-php/cache": "0.4.*", "utopia-php/framework": "0.*.*" }, @@ -2195,9 +2195,9 @@ ], "support": { "issues": "https://github.com/utopia-php/database/issues", - "source": "https://github.com/utopia-php/database/tree/0.12.0" + "source": "https://github.com/utopia-php/database/tree/0.12.1" }, - "time": "2021-11-24T14:53:22+00:00" + "time": "2021-12-13T14:57:32+00:00" }, { "name": "utopia-php/domains", @@ -2255,24 +2255,24 @@ }, { "name": "utopia-php/framework", - "version": "0.19.1", + "version": "0.19.2", "source": { "type": "git", "url": "https://github.com/utopia-php/framework.git", - "reference": "cc7629b5f7a8f45912ec2e069b7f14e361e41c34" + "reference": "49e4374b97c0f4d14bc84b424bdc9c3b7747e15f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/framework/zipball/cc7629b5f7a8f45912ec2e069b7f14e361e41c34", - "reference": "cc7629b5f7a8f45912ec2e069b7f14e361e41c34", + "url": "https://api.github.com/repos/utopia-php/framework/zipball/49e4374b97c0f4d14bc84b424bdc9c3b7747e15f", + "reference": "49e4374b97c0f4d14bc84b424bdc9c3b7747e15f", "shasum": "" }, "require": { - "php": ">=7.3.0" + "php": ">=8.0.0" }, "require-dev": { - "phpunit/phpunit": "^9.4", - "vimeo/psalm": "4.0.1" + "phpunit/phpunit": "^9.5.10", + "vimeo/psalm": "4.13.1" }, "type": "library", "autoload": { @@ -2298,9 +2298,9 @@ ], "support": { "issues": "https://github.com/utopia-php/framework/issues", - "source": "https://github.com/utopia-php/framework/tree/0.19.1" + "source": "https://github.com/utopia-php/framework/tree/0.19.2" }, - "time": "2021-11-25T16:11:40+00:00" + "time": "2021-12-07T09:29:35+00:00" }, { "name": "utopia-php/image", @@ -2567,16 +2567,16 @@ }, { "name": "utopia-php/storage", - "version": "0.5.0", + "version": "0.5.1", "source": { "type": "git", "url": "https://github.com/utopia-php/storage.git", - "reference": "92ae20c7a2ac329f573a58a82dc245134cc63408" + "reference": "e672aa3fc2a8ba689aff65f68ff29f1d608223b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/storage/zipball/92ae20c7a2ac329f573a58a82dc245134cc63408", - "reference": "92ae20c7a2ac329f573a58a82dc245134cc63408", + "url": "https://api.github.com/repos/utopia-php/storage/zipball/e672aa3fc2a8ba689aff65f68ff29f1d608223b8", + "reference": "e672aa3fc2a8ba689aff65f68ff29f1d608223b8", "shasum": "" }, "require": { @@ -2613,33 +2613,33 @@ ], "support": { "issues": "https://github.com/utopia-php/storage/issues", - "source": "https://github.com/utopia-php/storage/tree/0.5.0" + "source": "https://github.com/utopia-php/storage/tree/0.5.1" }, - "time": "2021-04-15T16:43:12+00:00" + "time": "2021-12-13T15:17:14+00:00" }, { "name": "utopia-php/swoole", - "version": "0.2.4", + "version": "0.3.2", "source": { "type": "git", "url": "https://github.com/utopia-php/swoole.git", - "reference": "37d8c64b536d6bc7da4f0f5a934a0ec44885abf4" + "reference": "2b714eddf77cd5eda1889219c9656d7c0a63ce73" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/swoole/zipball/37d8c64b536d6bc7da4f0f5a934a0ec44885abf4", - "reference": "37d8c64b536d6bc7da4f0f5a934a0ec44885abf4", + "url": "https://api.github.com/repos/utopia-php/swoole/zipball/2b714eddf77cd5eda1889219c9656d7c0a63ce73", + "reference": "2b714eddf77cd5eda1889219c9656d7c0a63ce73", "shasum": "" }, "require": { "ext-swoole": "*", - "php": ">=7.4", + "php": ">=8.0", "utopia-php/framework": "0.*.*" }, "require-dev": { "phpunit/phpunit": "^9.3", - "swoole/ide-helper": "4.5.5", - "vimeo/psalm": "4.0.1" + "swoole/ide-helper": "4.8.3", + "vimeo/psalm": "4.15.0" }, "type": "library", "autoload": { @@ -2669,9 +2669,9 @@ ], "support": { "issues": "https://github.com/utopia-php/swoole/issues", - "source": "https://github.com/utopia-php/swoole/tree/0.2.4" + "source": "https://github.com/utopia-php/swoole/tree/0.3.2" }, - "time": "2021-06-22T10:49:24+00:00" + "time": "2021-12-13T15:37:41+00:00" }, { "name": "utopia-php/system", @@ -5665,23 +5665,23 @@ }, { "name": "symfony/console", - "version": "v5.4.0", + "version": "v5.4.1", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "ec3661faca1d110d6c307e124b44f99ac54179e3" + "reference": "9130e1a0fc93cb0faadca4ee917171bd2ca9e5f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/ec3661faca1d110d6c307e124b44f99ac54179e3", - "reference": "ec3661faca1d110d6c307e124b44f99ac54179e3", + "url": "https://api.github.com/repos/symfony/console/zipball/9130e1a0fc93cb0faadca4ee917171bd2ca9e5f4", + "reference": "9130e1a0fc93cb0faadca4ee917171bd2ca9e5f4", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php73": "^1.9", "symfony/polyfill-php80": "^1.16", "symfony/service-contracts": "^1.1|^2|^3", "symfony/string": "^5.1|^6.0" @@ -5744,7 +5744,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.0" + "source": "https://github.com/symfony/console/tree/v5.4.1" }, "funding": [ { @@ -5760,7 +5760,7 @@ "type": "tidelift" } ], - "time": "2021-11-29T15:30:56+00:00" + "time": "2021-12-09T11:22:43+00:00" }, { "name": "symfony/polyfill-intl-grapheme", @@ -6170,16 +6170,16 @@ }, { "name": "symfony/string", - "version": "v6.0.0", + "version": "v6.0.1", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "ba727797426af0f587f4800566300bdc0cda0777" + "reference": "0cfed595758ec6e0a25591bdc8ca733c1896af32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/ba727797426af0f587f4800566300bdc0cda0777", - "reference": "ba727797426af0f587f4800566300bdc0cda0777", + "url": "https://api.github.com/repos/symfony/string/zipball/0cfed595758ec6e0a25591bdc8ca733c1896af32", + "reference": "0cfed595758ec6e0a25591bdc8ca733c1896af32", "shasum": "" }, "require": { @@ -6235,7 +6235,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.0.0" + "source": "https://github.com/symfony/string/tree/v6.0.1" }, "funding": [ { @@ -6251,7 +6251,7 @@ "type": "tidelift" } ], - "time": "2021-10-29T07:35:21+00:00" + "time": "2021-12-08T15:13:44+00:00" }, { "name": "textalk/websocket", diff --git a/docker-compose.yml b/docker-compose.yml index b2d86fd36f..3e50c9640e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -73,7 +73,6 @@ services: - ./app:/usr/src/code/app # - ./vendor:/usr/src/code/vendor - ./docs:/usr/src/code/docs - - ./public:/usr/src/code/public - ./src:/usr/src/code/src # - ./debug:/tmp - ./dev:/usr/local/dev diff --git a/docs/references/account/update-email.md b/docs/references/account/update-email.md index 7be36b7cdf..110ca8ee48 100644 --- a/docs/references/account/update-email.md +++ b/docs/references/account/update-email.md @@ -1,2 +1,2 @@ -Update currently logged in user account email address. After changing user address, user confirmation status is being reset and a new confirmation mail is sent. For security measures, user password is required to complete this request. -This endpoint can also be used to convert an anonymous account to a normal one, by passing an email address and a new password. \ No newline at end of file +Update currently logged in user account email address. After changing user address, the user confirmation status will get reset. A new confirmation email is not sent automatically however you can use the send confirmation email endpoint again to send the confirmation email. For security measures, user password is required to complete this request. +This endpoint can also be used to convert an anonymous account to a normal one, by passing an email address and a new password. diff --git a/docs/references/functions/list-runtimes.md b/docs/references/functions/list-runtimes.md new file mode 100644 index 0000000000..3ffb657911 --- /dev/null +++ b/docs/references/functions/list-runtimes.md @@ -0,0 +1 @@ +Get a list of all runtimes that are currently active in your project. \ No newline at end of file diff --git a/docs/references/teams/update-team-membership-status.md b/docs/references/teams/update-team-membership-status.md index ae2da76774..ab8f4ca36a 100644 --- a/docs/references/teams/update-team-membership-status.md +++ b/docs/references/teams/update-team-membership-status.md @@ -1 +1 @@ -Use this endpoint to allow a user to accept an invitation to join a team after being redirected back to your app from the invitation email recieved by the user. \ No newline at end of file +Use this endpoint to allow a user to accept an invitation to join a team after being redirected back to your app from the invitation email received by the user. \ No newline at end of file diff --git a/docs/sdks/flutter-dev/CHANGELOG.md b/docs/sdks/flutter-dev/CHANGELOG.md index ff6f7fa1a7..8da3a12262 100644 --- a/docs/sdks/flutter-dev/CHANGELOG.md +++ b/docs/sdks/flutter-dev/CHANGELOG.md @@ -17,7 +17,7 @@ ## 0.2.2 -- Fixed an error that happend when the OAuth session creation request was sent before any other API call +- Fixed an error that happened when the OAuth session creation request was sent before any other API call - Fixed a bug in the Avatars service where location URL generation had syntax error ## 0.2.1 @@ -27,7 +27,7 @@ ## 0.2.0 - Updated flutter_web_auth plugin to version 0.2.4 -- Added per project unique callback for OAuth2 redirects to aviod conflicts between multiple Appwrite projects +- Added per project unique callback for OAuth2 redirects to avoid conflicts between multiple Appwrite projects ## 0.1.1 @@ -56,9 +56,9 @@ ## 0.0.9 -- Updated deafult params +- Updated default params ## 0.0.8 - Fixed compilation error in Client class -- Shorter description for package \ No newline at end of file +- Shorter description for package diff --git a/docs/sdks/flutter/CHANGELOG.md b/docs/sdks/flutter/CHANGELOG.md index 2952aa2fd2..142b9cb100 100644 --- a/docs/sdks/flutter/CHANGELOG.md +++ b/docs/sdks/flutter/CHANGELOG.md @@ -120,7 +120,7 @@ ## 0.2.2 -- Fixed an error that happend when the OAuth session creation request was sent before any other API call +- Fixed an error that happened when the OAuth session creation request was sent before any other API call - Fixed a bug in the Avatars service where location URL generation had syntax error ## 0.2.1 @@ -130,7 +130,7 @@ ## 0.2.0 - Updated flutter_web_auth plugin to version 0.2.4 -- Added per project unique callback for OAuth2 redirects to aviod conflicts between multiple Appwrite projects +- Added per project unique callback for OAuth2 redirects to avoid conflicts between multiple Appwrite projects ## 0.1.1 @@ -159,7 +159,7 @@ ## 0.0.9 -- Updated deafult params +- Updated default params ## 0.0.8 diff --git a/docs/tutorials/add-environment-variable.md b/docs/tutorials/add-environment-variable.md index c88eb585dc..ef67185747 100644 --- a/docs/tutorials/add-environment-variable.md +++ b/docs/tutorials/add-environment-variable.md @@ -9,7 +9,7 @@ Adding new features may require various configurations options to be set by the This tutorial will cover, how to properly add a new environment variable in Appwrite. -### Naming environment varialbe +### Naming environment variable The environment variables in Appwrite are prefixed with `_APP_`. If it belongs to a specific category, the category name is appended as `_APP_REDIS` for the redis category. The available categories are General, Redis, MariaDB, InfluxDB, StatsD, SMTP, Storage and Functions. Finally a properly describing name is given to the variable. For example `_APP_REDIS_HOST` is an environment variable for redis connection host. You can find more information on available categories and existing environment variables in the [environment variables doc](https://appwrite.io/docs/environment-variables). ### Describe new environment variable diff --git a/docs/tutorials/add-runtime.md b/docs/tutorials/add-runtime.md new file mode 100644 index 0000000000..023b53294e --- /dev/null +++ b/docs/tutorials/add-runtime.md @@ -0,0 +1,257 @@ +# Creating a new functions runtime 🏃 + +This document is part of the Appwrite contributors' guide. Before you continue reading this document make sure you have read the [Code of Conduct](https://github.com/appwrite/appwrite/blob/master/CODE_OF_CONDUCT.md) and the [Contributing Guide](https://github.com/appwrite/appwrite/blob/master/CONTRIBUTING.md). + +## Getting started +Function Runtimes allow you to execute code written in any language and form the basis of Appwrite's Cloud Functions! Appwrite's goal is to support as many function runtimes as possible. + +## 1. Prerequisites +For a function runtime to work, two prerequisites **must** be met due to the way Appwrite's Runtime Execution Model works: + + - [ ] The Language in question must be able to run a web server that can serve JSON and text. + - [ ] The Runtime must be able to be packaged into a Docker container + + Note: Both Compiled and Interpreted languages work with Appwrite's execution model but are written in slightly different ways. + +It's really easy to contribute to an open-source project, but when using GitHub, there are a few steps we need to follow. This section will take you step-by-step through the process of preparing your local version of Appwrite, where you can make any changes without affecting Appwrite right away. +> If you are experienced with GitHub or have made a pull request before, you can skip to [Implement new runtime](https://github.com/appwrite/appwrite/blob/master/docs/tutorials/add-runtime.md#2-implement-new-runtime). + +### 1.1 Fork the Appwrite repository + +Before making any changes, you will need to fork Appwrite's repository to keep branches on the official repo clean. To do that, visit [Appwrite's Runtime repository](https://github.com/appwrite/php-runtimes) and click on the fork button. + +[![Fork button](https://github.com/appwrite/appwrite/raw/master/docs/tutorials/images/fork.png)](https://github.com/appwrite/appwrite/blob/master/docs/tutorials/images/fork.png) + +This will redirect you from `github.com/appwrite/php-runtimes` to `github.com/YOUR_USERNAME/php-runtimes`, meaning all changes you do are only done inside your repository. Once you are there, click the highlighted `Code` button, copy the URL and clone the repository to your computer using the `git clone` command: +```bash +$ git clone COPIED_URL +``` + +> To fork a repository, you will need a basic understanding of CLI and git-cli binaries installed. If you are a beginner, we recommend you to use `Github Desktop`. It is a clean and simple visual Git client. + +Finally, you will need to create a `feat-XXX-YYY-runtime` branch based on the `refactor` branch and switch to it. The `XXX` should represent the issue ID and `YYY` the runtime name. + +## 2. Implement new runtime + +### 2.1 Preparing the files for your new runtime +The first step to writing a new runtime is to create a folder within `/runtimes` with the name of the runtime and the version separated by a dash. For instance, if I was to write a Rust Runtime with version 1.55 the folder name would be: `rust-1.55` + +Within that folder you will need to create a few basic files that all Appwrite runtimes require: +``` +Dockerfile - Dockerfile that explains how the container will be built. +README.md - A readme file explaining the runtime and any special notes for the runtime. A good example of this is the PHP 8.0 runtime. +``` + +### 2.2 Differences between compiled and interpreted runtimes +Runtimes within Appwrite are created differently depending on whether they are compiled or interpreted. This is due to the fundamental differences between the two ways of running the code. + +Interpreted languages have both a `build.sh` file and a `launch.sh` file. +The `build.sh` file for an interpreted runtime is normally used for installing any dependencies for both the server itself and the user's code and then to copy it to the `/usr/code` folder which is then packaged and can be used later for running the server. +The build script is always executed during the build stage of tag deployment. + +The `launch.sh` file for an interpreted runtime should extract the `/tmp/code.tar.gz` file that contains both the user's code and the dependencies. This tarball was created by Appwrite from the `/usr/code` folder and should install the dependencies that were pre-installed by the build stage and move them into the relevant locations for that runtime. It will then run the server ready for execution. + +--- +Compiled Languages only have a `build.sh` file. +The `build.sh` script for a compiled runtime is used to move the user's source code and rename it into source files for the runtime (The `APPWRITE_ENTRYPOINT_NAME` environment variable can help with this) it will also build the code and move it into the `/usr/code` folder. Compiled runtime executables **must** be called `runtime` for the ubuntu or alpine images to detect and run them. + +#### Note: +`/tmp/code.tar.gz` is always created from the `/usr/code` folder in the build stage. If you need any files for either compiled or interpreted runtimes you should place them there and extract them from the `/tmp/code.tar.gz` during the `launch.sh` script to get the files you need. + +### 2.3 Writing the runtime +Internally the runtime can be anything you like as long as it follows the standards set by the other runtimes. + +The best way to go about writing a runtime is like so: +Initialize a web server that runs on port 3000 and uses any IP Address (0.0.0.0) and on each `POST` request do the following: +1. Check that the `x-internal-challenge` header matches the `APPWRITE_INTERNAL_RUNTIME_KEY` environment variable. If not return an error with a `401` status code and an `unauthorized` error message. +2. Decode the executor's JSON POST request. This normally looks like so: +```json +{ + "path": "/usr/code", + "file": "index.js", + "env": { + "hello":"world!" + }, + "payload":"An Example Payload", + "timeout": 10 +} +``` +For a compiled language you can disregard the `path` and `file` attribute if you like, + +`timeout` is also an optional parameter to deal with, if you can handle it please do. Otherwise, it doesn't matter since the connection will simply be dropped by the executor. + +You must create two classes for users to use within their scripts. A `Request` Class and a `Response` class +The `Request` class must store `env`, `payload` and `headers` and pass them to the user's function. +The Request always goes before the response in the user's function parameters. +The `Response` class must have two functions. +- A `send(string)` function which will return text to the request +- and a `json(object)` function which will return JSON to the request setting the appropriate headers + +For interpreted languages use the `path` and `file` parameters to find the file and require it. +Please make sure to add appropriate checks to make sure the imported file is a function that you can execute. + +5. Finally execute the function and handle whatever response the user's code returns. Try to wrap the function into a `try catch` statement to handle any errors the user's function encounters and return them cleanly to the executor with the error schema. + +### 2.4 The Error Schema +All errors that occur during the execution of a user's function **MUST** be returned using this JSON Object otherwise Appwrite will be unable to parse them for the user. +```json +{ + "code": 500, // (Int) Use 404 if function not found or use 401 if the x-internal-challenge check failed. + "message": "Error: Tried to divide by 0 \n /usr/code/index.js:80:7", // (String) Try to return a stacktrace and detailed error message if possible. This is shown to the user. +} +``` + +### 2.5 Writing your Dockerfile +The Dockerfile is very important as it's the environment you are creating to run build the runtime and also run the code if you are writing an Interpreted Runtime (Compiled runtimes will use an alpine or ubuntu image) + +The first thing you need to do is find a docker image to base your runtime off, You can find these at [Docker Hub](https://hub.docker.com). If possible try to use verified official builds of the language you are creating a runtime for. + +Next in your Dockerfile at the start add the docker image you want to base it off at the top like so: +```bash +FROM Dart:2.12 # Dart is used as an example. +``` +This will download and require the image when you build your runtime and allow you to use the toolset of the language you are building a runtime for. + +Create a user and group for the runtime, this user will be used to both build and run the code: +```bash +RUN groupadd -g 2000 appwrite \ +&& useradd -m -u 2001 -g appwrite appwrite +``` + +then create the folders you will use in your build step: +```bash +RUN mkdir -p /usr/local/src/ +RUN mkdir -p /usr/code +RUN mkdir -p /usr/workspace +RUN mkdir -p /usr/builtCode +``` + +Next copy your source code and set the working directory for the image like so: +``` +WORKDIR /usr/local/src +COPY . /usr/local/src +``` + +Next, you want to make sure you are adding execute permissions to any scripts you may run, the main ones are `build.sh` and `launch.sh`. You can run commands in Dockerfile's using the `RUN` prefix like so: +``` +RUN chmod +x ./build.sh +RUN chmod +x ./launch.sh +``` +Note: Do not chmod a `launch.sh` file if you don't have one. + +If needed use the `RUN` commands to install any dependencies you require for the build stage. + +Next set the permissions for the user you created so your build and run step will have access to them: +``` +RUN ["chown", "-R", "appwrite:appwrite", "/usr/local/src"] +RUN ["chown", "-R", "appwrite:appwrite", "/usr/code"] +RUN ["chown", "-R", "appwrite:appwrite", "/usr/workspace"] +RUN ["chown", "-R", "appwrite:appwrite", "/usr/builtCode"] +``` + +Finally, you'll add a `CMD` command. For an interpreted language this should be: +``` +CMD ["/usr/local/src/launch.sh"] +``` +Since this will use your launch script when the runtime starts. + +For a compiled language this must be: +``` +CMD ["tail", "-f", "/dev/null"] +``` +so the build steps can be run. + +## 3. Building your Docker image and adding it to the list +With your runtime successfully created you can now move on to building your docker image and adding it to the script files used for generating all of the image files. + +Open up the `/runtimes/buildLocalOnly.sh` script first and add your runtime to it. The following is an example with dart version 2.12 +``` +echo 'Dart 2.12...' +docker build -t dart-runtime:2.12 ./runtimes/dart-2.12 +``` +Next, open up the `/runtimes/build.sh` script and also add your runtime to it. This one is slightly different as this is the one that will be used for cross-platform compiles and deploying it to Docker hub. The following is an example also with dart version 2.12: +``` +echo 'Dart 2.12...' +docker buildx build --platform linux/amd64,linux/arm64 -t dart-runtime:2.12 ./runtimes/dart-2.12/ --push +``` + +## 4. Adding the runtime to the runtimes list +In `src/Runtimes/Runtimes` create a new entry in the `__construct()` method in the Runtimes class like so: +``` +$dart = new Runtime('dart', 'Dart'); +$dart->addVersion('2.12', 'dart-runtime:2.12', 'appwrite-ubuntu:20.04', [System::X86, System::ARM]); +$this->runtimes['dart'] = $dart; +``` +This is an example of what you would do for a compiled language such as dart. + +The first line is creating a new language entry, The first parameter is the internal name and the second one is the external one which is what the user will see in Appwrite. + +The second line adds a new version to the language entry, I'll break down the parameters: +``` +1: Version - The version of the runtime you are creating. +2: Build Image - The image used to build the code +3: Run Image - The image used to run the code. +For interpreted languages, this is normally the same as the Build Image, but for compiled languages, this can be either "appwrite-alpine:3.13.6" or "appwrite-ubuntu:20.04" +We recommend using Alpine when possible and using Ubuntu if the runtime doesn't work on Alpine. +4: Platforms Supported - These are the architectures this runtime is available to. +``` +The third line simply adds the new runtime to the main list. + +## 5. Adding tests + +### 5.1 Writing your test execution script +Adding tests for your runtime is simple, go into the `/tests/resources` folder and create a folder for the language you are creating then within the folder create a source code file for the language you are writing a runtime for as if you were creating a user function for your runtime. Within this user function you are writing all you need to do is return some JSON with the following schema: +```json +{ + "normal": "Hello World!", + "env1": request.env['ENV1'], // ENV1 from the request environment variable + "payload": request.payload, // Payload from the request +} +``` +### 5.2 Creating the test packaging script for your runtime +With your test execution written you can move on to writing the script used to package your test execution script into a tarball for later use by the test system. Move into `/test/resources` again and notice how we have shell scripts for all runtimes we have made tests for. + +Next create a shell script yourself with your language name. As an example, the shell script name for dart would be `package-dart.sh` + +Within this newly created script copy-paste this script and replace all the `LANGUAGE_NAME` parts with your language's name +``` +echo 'LANGUAGE_NAME Packaging...' +rm $(pwd)/tests/resources/LANGUAGE_NAME.tar.gz +tar -zcvf $(pwd)/tests/resources/LANGUAGE_NAME.tar.gz -C $(pwd)/tests/resources/LANGUAGE_NAME . +``` +Then save this file. Then `cd` into the root of the `php-runtimes` project in a terminal. Run the following command replacing the `LANGUAGE_NAME` with your language's name: +``` +chmod +x ./tests/resources/package-LANGUAGE_NAME.sh && ./tests/resources/package-LANGUAGE_NAME.sh +``` +This command adds execution permissions to your script and executes it. + +NOTE: If you ever want to repackage your script you can simply run: `./tests/resources/package-LANGUAGE_NAME.sh` in the root of the `php-runtimes` project since you don't have to change permissions more than once. + +### 5.3 Adding your runtime to the main testing script +Now you have created your test execution script and have packaged it up for your runtime to execute you can now add it to the main testing script. Open up the `./tests/Runtimes/RuntimesTest.php` file and find the part where we are defining `$this->tests`. + +Once you have found this, Add your own entry into this array like so: +```php +'LANGUAGE_NAME-VERSION' => [ + 'code' => $functionsDir . ' /LANGUAGE_NAME.tar.gz', + 'entrypoint' => 'Test file', // Replace with the name of the test file you wrote in ./tests/resources/LANGUAGE_NAME + 'timeout' => 15, + 'runtime' => 'LANGUAGE_NAME-VERSION', + 'tarname' => 'LANGUAGE_NAME-VERSION.tar.gz', // Note: If your version has a point in it replace it with a dash instead for this value. +], +``` +Make sure to replace all instances of `LANGUAGE_NAME` with your language's name and `VERSION` with your runtime's version. + +Once you have done this and saved it, it is finally time to move onto one of the final steps. + +### 5.4 Running the tests. +Running the tests is easy, simply run `docker-compose up` in the root of the `php-runtimes` folder. This will launch a Docker container with the test script and start running through all the runtimes making sure to test them thoroughly. + +If all tests pass then congratulations! You can now go ahead and file a PR against the `php-runtimes` repo making sure to target the `refactor` branch, make sure you're ready to respond to any feedback which can arise during our code review. + +## 6. Raise a pull request +First of all, commit the changes with the message `Added XXX Runtime` and push it. This will publish a new branch to your forked version of Appwrite. If you visit it at `github.com/YOUR_USERNAME/php-runtimes`, you will see a new alert saying you are ready to submit a pull request. Follow the steps GitHub provides, and at the end, you will have your pull request submitted. + +## ![face_with_head_bandage](https://github.githubassets.com/images/icons/emoji/unicode/1f915.png) Stuck ? + +If you need any help with the contribution, feel free to head over to [our discord channel](https://appwrite.io/discord) and we'll be happy to help you out. diff --git a/gulpfile.js b/gulpfile.js index c4311ae4cd..fd44420cb9 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -9,7 +9,7 @@ const gulpCleanCSS = require('gulp-clean-css'); // Config -const configApp = { +const configApp = { mainFile: 'app.js', src: [ 'public/scripts/dependencies/litespeed.js', @@ -82,7 +82,7 @@ const configApp = { 'public/scripts/views/general/switch.js', 'public/scripts/views/general/theme.js', 'public/scripts/views/general/version.js', - + 'public/scripts/views/paging/back.js', 'public/scripts/views/paging/next.js', @@ -93,19 +93,44 @@ const configApp = { 'public/scripts/views/ui/phases.js', 'public/scripts/views/ui/trigger.js', ], + dest: './public/dist/scripts' }; const configDep = { mainFile: 'app-dep.js', src: [ - //'node_modules/appwrite/src/sdk.js', 'public/scripts/dependencies/appwrite.js', - 'public/scripts/dependencies/chart.js', - 'public/scripts/dependencies/markdown-it.js', - 'public/scripts/dependencies/pell.js', - 'public/scripts/dependencies/prism.js', - 'public/scripts/dependencies/turndown.js', + 'node_modules/chart.js/dist/chart.js', + 'node_modules/markdown-it/dist/markdown-it.js', + 'node_modules/pell/dist/pell.js', + 'node_modules/turndown/dist/turndown.js', + // PrismJS Core + 'node_modules/prismjs/components/prism-core.min.js', + // PrismJS Languages + 'node_modules/prismjs/components/prism-markup.min.js', + 'node_modules/prismjs/components/prism-css.min.js', + 'node_modules/prismjs/components/prism-clike.min.js', + 'node_modules/prismjs/components/prism-javascript.min.js', + 'node_modules/prismjs/components/prism-bash.min.js', + 'node_modules/prismjs/components/prism-csharp.min.js', + 'node_modules/prismjs/components/prism-dart.min.js', + 'node_modules/prismjs/components/prism-go.min.js', + 'node_modules/prismjs/components/prism-graphql.min.js', + 'node_modules/prismjs/components/prism-http.min.js', + 'node_modules/prismjs/components/prism-java.min.js', + 'node_modules/prismjs/components/prism-json.min.js', + 'node_modules/prismjs/components/prism-kotlin.min.js', + 'node_modules/prismjs/components/prism-markup-templating.min.js', + 'node_modules/prismjs/components/prism-php.min.js', + 'node_modules/prismjs/components/prism-powershell.min.js', + 'node_modules/prismjs/components/prism-python.min.js', + 'node_modules/prismjs/components/prism-ruby.min.js', + 'node_modules/prismjs/components/prism-swift.min.js', + 'node_modules/prismjs/components/prism-typescript.min.js', + 'node_modules/prismjs/components/prism-yaml.min.js', + // PrismJS Plugins + 'node_modules/prismjs/plugins/line-numbers/prism-line-numbers.min.js', ], dest: './public/dist/scripts' }; @@ -119,40 +144,40 @@ const config = { dest: './public/dist/scripts' }; -function lessLTR () { +function lessLTR() { return src('./public/styles/default-ltr.less') .pipe(gulpLess()) - .pipe(gulpCleanCSS({compatibility: 'ie8'})) + .pipe(gulpCleanCSS({ compatibility: 'ie8' })) .pipe(dest('./public/dist/styles')); } -function lessRTL () { +function lessRTL() { return src('./public/styles/default-rtl.less') .pipe(gulpLess()) - .pipe(gulpCleanCSS({compatibility: 'ie8'})) + .pipe(gulpCleanCSS({ compatibility: 'ie8' })) .pipe(dest('./public/dist/styles')); } -function concatApp () { +function concatApp() { return src(configApp.src) .pipe(gulpConcat(configApp.mainFile)) .pipe(gulpJsmin()) .pipe(dest(configApp.dest)); } -function concatDep () { +function concatDep() { return src(configDep.src) .pipe(gulpConcat(configDep.mainFile)) .pipe(gulpJsmin()) .pipe(dest(configDep.dest)); } -function concat () { +function concat() { return src(config.src) .pipe(gulpConcat(config.mainFile)) .pipe(dest(config.dest)); } -exports.import = series(concatDep); -exports.less = series(lessLTR, lessRTL); -exports.build = series(concatApp, concat); \ No newline at end of file +exports.import = series(concatDep); +exports.less = series(lessLTR, lessRTL); +exports.build = series(concatApp, concat); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 36564069ec..9579a9199e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,13 @@ "name": "appwrite-server", "version": "0.1.0", "license": "BSD-3-Clause", + "dependencies": { + "chart.js": "^3.6.2", + "markdown-it": "^12.2.0", + "pell": "^1.0.6", + "prismjs": "^1.25.0", + "turndown": "^7.1.1" + }, "devDependencies": { "gulp": "^4.0.2", "gulp-clean-css": "^4.3.0", @@ -116,6 +123,11 @@ "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", "dev": true }, + "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==" + }, "node_modules/arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -536,6 +548,11 @@ "node": ">= 0.6.0" } }, + "node_modules/chart.js": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.6.2.tgz", + "integrity": "sha512-Xz7f/fgtVltfQYWq0zL1Xbv7N2inpG+B54p3D5FSvpCdy3sM+oZhbqa42eNuYXltaVvajgX5UpKCU2GeeJIgxg==" + }, "node_modules/chokidar": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", @@ -980,6 +997,11 @@ "node": ">=0.10.0" } }, + "node_modules/domino": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/domino/-/domino-2.1.6.tgz", + "integrity": "sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ==" + }, "node_modules/duplexer2": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", @@ -1044,6 +1066,14 @@ "once": "^1.4.0" } }, + "node_modules/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "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", @@ -2575,6 +2605,14 @@ "node": ">= 0.8" } }, + "node_modules/linkify-it": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "dependencies": { + "uc.micro": "^1.0.1" + } + }, "node_modules/load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", @@ -2823,6 +2861,21 @@ "node": ">=0.10.0" } }, + "node_modules/markdown-it": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.2.0.tgz", + "integrity": "sha512-Wjws+uCrVQRqOoJvze4HCqkKl1AsSh95iFAeQDwnyfxM09divCBSXlDR1uTvyUP3Grzpn4Ru8GeCxYPM8vkCQg==", + "dependencies": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, "node_modules/matchdep": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", @@ -2865,6 +2918,11 @@ "node": ">=0.10.0" } }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + }, "node_modules/meow": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", @@ -3438,6 +3496,11 @@ "node": ">=0.10.0" } }, + "node_modules/pell": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pell/-/pell-1.0.6.tgz", + "integrity": "sha512-wuackvgjFCHmVABy7ACSmY2u53w+TlYFrVL2hN6V3rGL/iWWwVXMw2uphpZSXNnqFQTI8nMpD3UNNX8+R4BAYw==" + }, "node_modules/pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", @@ -3502,6 +3565,11 @@ "node": ">= 0.8" } }, + "node_modules/prismjs": { + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.25.0.tgz", + "integrity": "sha512-WCjJHl1KEWbnkQom1+SzftbtXMKQoezOCYs5rECqMN+jP+apI7ftoflyqigqzopSO3hMhTEb0mFClA8lkolgEg==" + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -4548,6 +4616,14 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, + "node_modules/turndown": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/turndown/-/turndown-7.1.1.tgz", + "integrity": "sha512-BEkXaWH7Wh7e9bd2QumhfAXk5g34+6QUmmWx+0q6ThaVOLuLUqsnkq35HQ5SBHSaxjSfSM7US5o4lhJNH7B9MA==", + "dependencies": { + "domino": "^2.1.6" + } + }, "node_modules/type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", @@ -4560,6 +4636,11 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, + "node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" + }, "node_modules/unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", @@ -5068,6 +5149,11 @@ "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", "dev": true }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -5397,6 +5483,11 @@ "integrity": "sha1-W5UvniDqIc0Iyn/hNaEPb+kcEJ4=", "dev": true }, + "chart.js": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.6.2.tgz", + "integrity": "sha512-Xz7f/fgtVltfQYWq0zL1Xbv7N2inpG+B54p3D5FSvpCdy3sM+oZhbqa42eNuYXltaVvajgX5UpKCU2GeeJIgxg==" + }, "chokidar": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", @@ -5761,6 +5852,11 @@ "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", "dev": true }, + "domino": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/domino/-/domino-2.1.6.tgz", + "integrity": "sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ==" + }, "duplexer2": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", @@ -5827,6 +5923,11 @@ "once": "^1.4.0" } }, + "entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==" + }, "errno": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", @@ -7076,6 +7177,14 @@ "resolve": "^1.1.7" } }, + "linkify-it": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "requires": { + "uc.micro": "^1.0.1" + } + }, "load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", @@ -7303,6 +7412,18 @@ "object-visit": "^1.0.0" } }, + "markdown-it": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.2.0.tgz", + "integrity": "sha512-Wjws+uCrVQRqOoJvze4HCqkKl1AsSh95iFAeQDwnyfxM09divCBSXlDR1uTvyUP3Grzpn4Ru8GeCxYPM8vkCQg==", + "requires": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + } + }, "matchdep": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", @@ -7338,6 +7459,11 @@ } } }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + }, "meow": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", @@ -7800,6 +7926,11 @@ } } }, + "pell": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pell/-/pell-1.0.6.tgz", + "integrity": "sha512-wuackvgjFCHmVABy7ACSmY2u53w+TlYFrVL2hN6V3rGL/iWWwVXMw2uphpZSXNnqFQTI8nMpD3UNNX8+R4BAYw==" + }, "pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", @@ -7846,6 +7977,11 @@ "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", "dev": true }, + "prismjs": { + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.25.0.tgz", + "integrity": "sha512-WCjJHl1KEWbnkQom1+SzftbtXMKQoezOCYs5rECqMN+jP+apI7ftoflyqigqzopSO3hMhTEb0mFClA8lkolgEg==" + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -8710,6 +8846,14 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, + "turndown": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/turndown/-/turndown-7.1.1.tgz", + "integrity": "sha512-BEkXaWH7Wh7e9bd2QumhfAXk5g34+6QUmmWx+0q6ThaVOLuLUqsnkq35HQ5SBHSaxjSfSM7US5o4lhJNH7B9MA==", + "requires": { + "domino": "^2.1.6" + } + }, "type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", @@ -8722,6 +8866,11 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, + "uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" + }, "unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", diff --git a/package.json b/package.json index d820cef349..9f88d6b105 100644 --- a/package.json +++ b/package.json @@ -15,5 +15,12 @@ "gulp-concat": "^2.6.1", "gulp-jsmin": "^0.1.5", "gulp-less": "^5.0.0" + }, + "dependencies": { + "chart.js": "^3.6.2", + "markdown-it": "^12.2.0", + "pell": "^1.0.6", + "prismjs": "^1.25.0", + "turndown": "^7.1.1" } } diff --git a/public/dist/scripts/app-all.js b/public/dist/scripts/app-all.js deleted file mode 100644 index 00b0ccd64d..0000000000 --- a/public/dist/scripts/app-all.js +++ /dev/null @@ -1,3783 +0,0 @@ - -(function(exports,isomorphicFormData,crossFetch){'use strict';function __awaiter(thisArg,_arguments,P,generator){function adopt(value){return value instanceof P?value:new P(function(resolve){resolve(value);});} -return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value));}catch(e){reject(e);}} -function rejected(value){try{step(generator["throw"](value));}catch(e){reject(e);}} -function step(result){result.done?resolve(result.value):adopt(result.value).then(fulfilled,rejected);} -step((generator=generator.apply(thisArg,_arguments||[])).next());});} -class AppwriteException extends Error{constructor(message,code=0,response=''){super(message);this.name='AppwriteException';this.message=message;this.code=code;this.response=response;}} -class Appwrite{constructor(){this.config={endpoint:'https://appwrite.io/v1',endpointRealtime:'',project:'',key:'',jwt:'',locale:'',mode:'',};this.headers={'x-sdk-version':'appwrite:web:4.0.4','X-Appwrite-Response-Format':'0.11.0',};this.realtime={socket:undefined,timeout:undefined,url:'',channels:new Set(),subscriptions:new Map(),subscriptionsCounter:0,reconnect:true,reconnectAttempts:0,lastMessage:undefined,connect:()=>{clearTimeout(this.realtime.timeout);this.realtime.timeout=window===null||window===void 0?void 0:window.setTimeout(()=>{this.realtime.createSocket();},50);},getTimeout:()=>{switch(true){case this.realtime.reconnectAttempts<5:return 1000;case this.realtime.reconnectAttempts<15:return 5000;case this.realtime.reconnectAttempts<100:return 10000;default:return 60000;}},createSocket:()=>{var _a,_b;if(this.realtime.channels.size<1) -return;const channels=new URLSearchParams();channels.set('project',this.config.project);this.realtime.channels.forEach(channel=>{channels.append('channels[]',channel);});const url=this.config.endpointRealtime+'/realtime?'+channels.toString();if(url!==this.realtime.url||!this.realtime.socket||((_a=this.realtime.socket)===null||_a===void 0?void 0:_a.readyState)>WebSocket.OPEN){if(this.realtime.socket&&((_b=this.realtime.socket)===null||_b===void 0?void 0:_b.readyState){this.realtime.reconnectAttempts=0;});this.realtime.socket.addEventListener('close',event=>{var _a,_b,_c;if(!this.realtime.reconnect||(((_b=(_a=this.realtime)===null||_a===void 0?void 0:_a.lastMessage)===null||_b===void 0?void 0:_b.type)==='error'&&((_c=this.realtime)===null||_c===void 0?void 0:_c.lastMessage.data).code===1008)){this.realtime.reconnect=true;return;} -const timeout=this.realtime.getTimeout();console.error(`Realtime got disconnected. Reconnect will be attempted in ${timeout / 1000} seconds.`,event.reason);setTimeout(()=>{this.realtime.reconnectAttempts++;this.realtime.createSocket();},timeout);});}},onMessage:(event)=>{var _a,_b;try{const message=JSON.parse(event.data);this.realtime.lastMessage=message;switch(message.type){case'connected':const cookie=JSON.parse((_a=window.localStorage.getItem('cookieFallback'))!==null&&_a!==void 0?_a:'{}');const session=cookie===null||cookie===void 0?void 0:cookie[`a_session_${this.config.project}`];const messageData=message.data;if(session&&!messageData.user){(_b=this.realtime.socket)===null||_b===void 0?void 0:_b.send(JSON.stringify({type:'authentication',data:{session}}));} -break;case'event':let data=message.data;if(data===null||data===void 0?void 0:data.channels){const isSubscribed=data.channels.some(channel=>this.realtime.channels.has(channel));if(!isSubscribed) -return;this.realtime.subscriptions.forEach(subscription=>{if(data.channels.some(channel=>subscription.channels.includes(channel))){setTimeout(()=>subscription.callback(data));}});} -break;case'error':throw message.data;default:break;}} -catch(e){console.error(e);}},cleanUp:channels=>{this.realtime.channels.forEach(channel=>{if(channels.includes(channel)){let found=Array.from(this.realtime.subscriptions).some(([_key,subscription])=>{return subscription.channels.includes(channel);});if(!found){this.realtime.channels.delete(channel);}}});}};this.account={get:()=>__awaiter(this,void 0,void 0,function*(){let path='/account';let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),create:(userId,email,password,name)=>__awaiter(this,void 0,void 0,function*(){if(typeof userId==='undefined'){throw new AppwriteException('Missing required parameter: "userId"');} -if(typeof email==='undefined'){throw new AppwriteException('Missing required parameter: "email"');} -if(typeof password==='undefined'){throw new AppwriteException('Missing required parameter: "password"');} -let path='/account';let payload={};if(typeof userId!=='undefined'){payload['userId']=userId;} -if(typeof email!=='undefined'){payload['email']=email;} -if(typeof password!=='undefined'){payload['password']=password;} -if(typeof name!=='undefined'){payload['name']=name;} -const uri=new URL(this.config.endpoint+path);return yield this.call('post',uri,{'content-type':'application/json',},payload);}),delete:()=>__awaiter(this,void 0,void 0,function*(){let path='/account';let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('delete',uri,{'content-type':'application/json',},payload);}),updateEmail:(email,password)=>__awaiter(this,void 0,void 0,function*(){if(typeof email==='undefined'){throw new AppwriteException('Missing required parameter: "email"');} -if(typeof password==='undefined'){throw new AppwriteException('Missing required parameter: "password"');} -let path='/account/email';let payload={};if(typeof email!=='undefined'){payload['email']=email;} -if(typeof password!=='undefined'){payload['password']=password;} -const uri=new URL(this.config.endpoint+path);return yield this.call('patch',uri,{'content-type':'application/json',},payload);}),createJWT:()=>__awaiter(this,void 0,void 0,function*(){let path='/account/jwt';let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('post',uri,{'content-type':'application/json',},payload);}),getLogs:(limit,offset)=>__awaiter(this,void 0,void 0,function*(){let path='/account/logs';let payload={};if(typeof limit!=='undefined'){payload['limit']=limit;} -if(typeof offset!=='undefined'){payload['offset']=offset;} -const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),updateName:(name)=>__awaiter(this,void 0,void 0,function*(){if(typeof name==='undefined'){throw new AppwriteException('Missing required parameter: "name"');} -let path='/account/name';let payload={};if(typeof name!=='undefined'){payload['name']=name;} -const uri=new URL(this.config.endpoint+path);return yield this.call('patch',uri,{'content-type':'application/json',},payload);}),updatePassword:(password,oldPassword)=>__awaiter(this,void 0,void 0,function*(){if(typeof password==='undefined'){throw new AppwriteException('Missing required parameter: "password"');} -let path='/account/password';let payload={};if(typeof password!=='undefined'){payload['password']=password;} -if(typeof oldPassword!=='undefined'){payload['oldPassword']=oldPassword;} -const uri=new URL(this.config.endpoint+path);return yield this.call('patch',uri,{'content-type':'application/json',},payload);}),getPrefs:()=>__awaiter(this,void 0,void 0,function*(){let path='/account/prefs';let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),updatePrefs:(prefs)=>__awaiter(this,void 0,void 0,function*(){if(typeof prefs==='undefined'){throw new AppwriteException('Missing required parameter: "prefs"');} -let path='/account/prefs';let payload={};if(typeof prefs!=='undefined'){payload['prefs']=prefs;} -const uri=new URL(this.config.endpoint+path);return yield this.call('patch',uri,{'content-type':'application/json',},payload);}),createRecovery:(email,url)=>__awaiter(this,void 0,void 0,function*(){if(typeof email==='undefined'){throw new AppwriteException('Missing required parameter: "email"');} -if(typeof url==='undefined'){throw new AppwriteException('Missing required parameter: "url"');} -let path='/account/recovery';let payload={};if(typeof email!=='undefined'){payload['email']=email;} -if(typeof url!=='undefined'){payload['url']=url;} -const uri=new URL(this.config.endpoint+path);return yield this.call('post',uri,{'content-type':'application/json',},payload);}),updateRecovery:(userId,secret,password,passwordAgain)=>__awaiter(this,void 0,void 0,function*(){if(typeof userId==='undefined'){throw new AppwriteException('Missing required parameter: "userId"');} -if(typeof secret==='undefined'){throw new AppwriteException('Missing required parameter: "secret"');} -if(typeof password==='undefined'){throw new AppwriteException('Missing required parameter: "password"');} -if(typeof passwordAgain==='undefined'){throw new AppwriteException('Missing required parameter: "passwordAgain"');} -let path='/account/recovery';let payload={};if(typeof userId!=='undefined'){payload['userId']=userId;} -if(typeof secret!=='undefined'){payload['secret']=secret;} -if(typeof password!=='undefined'){payload['password']=password;} -if(typeof passwordAgain!=='undefined'){payload['passwordAgain']=passwordAgain;} -const uri=new URL(this.config.endpoint+path);return yield this.call('put',uri,{'content-type':'application/json',},payload);}),getSessions:()=>__awaiter(this,void 0,void 0,function*(){let path='/account/sessions';let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),createSession:(email,password)=>__awaiter(this,void 0,void 0,function*(){if(typeof email==='undefined'){throw new AppwriteException('Missing required parameter: "email"');} -if(typeof password==='undefined'){throw new AppwriteException('Missing required parameter: "password"');} -let path='/account/sessions';let payload={};if(typeof email!=='undefined'){payload['email']=email;} -if(typeof password!=='undefined'){payload['password']=password;} -const uri=new URL(this.config.endpoint+path);return yield this.call('post',uri,{'content-type':'application/json',},payload);}),deleteSessions:()=>__awaiter(this,void 0,void 0,function*(){let path='/account/sessions';let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('delete',uri,{'content-type':'application/json',},payload);}),createAnonymousSession:()=>__awaiter(this,void 0,void 0,function*(){let path='/account/sessions/anonymous';let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('post',uri,{'content-type':'application/json',},payload);}),createMagicURLSession:(userId,email,url)=>__awaiter(this,void 0,void 0,function*(){if(typeof userId==='undefined'){throw new AppwriteException('Missing required parameter: "userId"');} -if(typeof email==='undefined'){throw new AppwriteException('Missing required parameter: "email"');} -let path='/account/sessions/magic-url';let payload={};if(typeof userId!=='undefined'){payload['userId']=userId;} -if(typeof email!=='undefined'){payload['email']=email;} -if(typeof url!=='undefined'){payload['url']=url;} -const uri=new URL(this.config.endpoint+path);return yield this.call('post',uri,{'content-type':'application/json',},payload);}),updateMagicURLSession:(userId,secret)=>__awaiter(this,void 0,void 0,function*(){if(typeof userId==='undefined'){throw new AppwriteException('Missing required parameter: "userId"');} -if(typeof secret==='undefined'){throw new AppwriteException('Missing required parameter: "secret"');} -let path='/account/sessions/magic-url';let payload={};if(typeof userId!=='undefined'){payload['userId']=userId;} -if(typeof secret!=='undefined'){payload['secret']=secret;} -const uri=new URL(this.config.endpoint+path);return yield this.call('put',uri,{'content-type':'application/json',},payload);}),createOAuth2Session:(provider,success,failure,scopes)=>{if(typeof provider==='undefined'){throw new AppwriteException('Missing required parameter: "provider"');} -let path='/account/sessions/oauth2/{provider}'.replace('{provider}',provider);let payload={};if(typeof success!=='undefined'){payload['success']=success;} -if(typeof failure!=='undefined'){payload['failure']=failure;} -if(typeof scopes!=='undefined'){payload['scopes']=scopes;} -const uri=new URL(this.config.endpoint+path);payload['project']=this.config.project;for(const[key,value]of Object.entries(this.flatten(payload))){uri.searchParams.append(key,value);} -if(typeof window!=='undefined'&&(window===null||window===void 0?void 0:window.location)){window.location.href=uri.toString();} -else{return uri;}},getSession:(sessionId)=>__awaiter(this,void 0,void 0,function*(){if(typeof sessionId==='undefined'){throw new AppwriteException('Missing required parameter: "sessionId"');} -let path='/account/sessions/{sessionId}'.replace('{sessionId}',sessionId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),deleteSession:(sessionId)=>__awaiter(this,void 0,void 0,function*(){if(typeof sessionId==='undefined'){throw new AppwriteException('Missing required parameter: "sessionId"');} -let path='/account/sessions/{sessionId}'.replace('{sessionId}',sessionId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('delete',uri,{'content-type':'application/json',},payload);}),createVerification:(url)=>__awaiter(this,void 0,void 0,function*(){if(typeof url==='undefined'){throw new AppwriteException('Missing required parameter: "url"');} -let path='/account/verification';let payload={};if(typeof url!=='undefined'){payload['url']=url;} -const uri=new URL(this.config.endpoint+path);return yield this.call('post',uri,{'content-type':'application/json',},payload);}),updateVerification:(userId,secret)=>__awaiter(this,void 0,void 0,function*(){if(typeof userId==='undefined'){throw new AppwriteException('Missing required parameter: "userId"');} -if(typeof secret==='undefined'){throw new AppwriteException('Missing required parameter: "secret"');} -let path='/account/verification';let payload={};if(typeof userId!=='undefined'){payload['userId']=userId;} -if(typeof secret!=='undefined'){payload['secret']=secret;} -const uri=new URL(this.config.endpoint+path);return yield this.call('put',uri,{'content-type':'application/json',},payload);})};this.avatars={getBrowser:(code,width,height,quality)=>{if(typeof code==='undefined'){throw new AppwriteException('Missing required parameter: "code"');} -let path='/avatars/browsers/{code}'.replace('{code}',code);let payload={};if(typeof width!=='undefined'){payload['width']=width;} -if(typeof height!=='undefined'){payload['height']=height;} -if(typeof quality!=='undefined'){payload['quality']=quality;} -const uri=new URL(this.config.endpoint+path);payload['project']=this.config.project;for(const[key,value]of Object.entries(this.flatten(payload))){uri.searchParams.append(key,value);} -return uri;},getCreditCard:(code,width,height,quality)=>{if(typeof code==='undefined'){throw new AppwriteException('Missing required parameter: "code"');} -let path='/avatars/credit-cards/{code}'.replace('{code}',code);let payload={};if(typeof width!=='undefined'){payload['width']=width;} -if(typeof height!=='undefined'){payload['height']=height;} -if(typeof quality!=='undefined'){payload['quality']=quality;} -const uri=new URL(this.config.endpoint+path);payload['project']=this.config.project;for(const[key,value]of Object.entries(this.flatten(payload))){uri.searchParams.append(key,value);} -return uri;},getFavicon:(url)=>{if(typeof url==='undefined'){throw new AppwriteException('Missing required parameter: "url"');} -let path='/avatars/favicon';let payload={};if(typeof url!=='undefined'){payload['url']=url;} -const uri=new URL(this.config.endpoint+path);payload['project']=this.config.project;for(const[key,value]of Object.entries(this.flatten(payload))){uri.searchParams.append(key,value);} -return uri;},getFlag:(code,width,height,quality)=>{if(typeof code==='undefined'){throw new AppwriteException('Missing required parameter: "code"');} -let path='/avatars/flags/{code}'.replace('{code}',code);let payload={};if(typeof width!=='undefined'){payload['width']=width;} -if(typeof height!=='undefined'){payload['height']=height;} -if(typeof quality!=='undefined'){payload['quality']=quality;} -const uri=new URL(this.config.endpoint+path);payload['project']=this.config.project;for(const[key,value]of Object.entries(this.flatten(payload))){uri.searchParams.append(key,value);} -return uri;},getImage:(url,width,height)=>{if(typeof url==='undefined'){throw new AppwriteException('Missing required parameter: "url"');} -let path='/avatars/image';let payload={};if(typeof url!=='undefined'){payload['url']=url;} -if(typeof width!=='undefined'){payload['width']=width;} -if(typeof height!=='undefined'){payload['height']=height;} -const uri=new URL(this.config.endpoint+path);payload['project']=this.config.project;for(const[key,value]of Object.entries(this.flatten(payload))){uri.searchParams.append(key,value);} -return uri;},getInitials:(name,width,height,color,background)=>{let path='/avatars/initials';let payload={};if(typeof name!=='undefined'){payload['name']=name;} -if(typeof width!=='undefined'){payload['width']=width;} -if(typeof height!=='undefined'){payload['height']=height;} -if(typeof color!=='undefined'){payload['color']=color;} -if(typeof background!=='undefined'){payload['background']=background;} -const uri=new URL(this.config.endpoint+path);payload['project']=this.config.project;for(const[key,value]of Object.entries(this.flatten(payload))){uri.searchParams.append(key,value);} -return uri;},getQR:(text,size,margin,download)=>{if(typeof text==='undefined'){throw new AppwriteException('Missing required parameter: "text"');} -let path='/avatars/qr';let payload={};if(typeof text!=='undefined'){payload['text']=text;} -if(typeof size!=='undefined'){payload['size']=size;} -if(typeof margin!=='undefined'){payload['margin']=margin;} -if(typeof download!=='undefined'){payload['download']=download;} -const uri=new URL(this.config.endpoint+path);payload['project']=this.config.project;for(const[key,value]of Object.entries(this.flatten(payload))){uri.searchParams.append(key,value);} -return uri;}};this.database={listCollections:(search,limit,offset,cursor,cursorDirection,orderType)=>__awaiter(this,void 0,void 0,function*(){let path='/database/collections';let payload={};if(typeof search!=='undefined'){payload['search']=search;} -if(typeof limit!=='undefined'){payload['limit']=limit;} -if(typeof offset!=='undefined'){payload['offset']=offset;} -if(typeof cursor!=='undefined'){payload['cursor']=cursor;} -if(typeof cursorDirection!=='undefined'){payload['cursorDirection']=cursorDirection;} -if(typeof orderType!=='undefined'){payload['orderType']=orderType;} -const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),createCollection:(collectionId,name,permission,read,write)=>__awaiter(this,void 0,void 0,function*(){if(typeof collectionId==='undefined'){throw new AppwriteException('Missing required parameter: "collectionId"');} -if(typeof name==='undefined'){throw new AppwriteException('Missing required parameter: "name"');} -if(typeof permission==='undefined'){throw new AppwriteException('Missing required parameter: "permission"');} -if(typeof read==='undefined'){throw new AppwriteException('Missing required parameter: "read"');} -if(typeof write==='undefined'){throw new AppwriteException('Missing required parameter: "write"');} -let path='/database/collections';let payload={};if(typeof collectionId!=='undefined'){payload['collectionId']=collectionId;} -if(typeof name!=='undefined'){payload['name']=name;} -if(typeof permission!=='undefined'){payload['permission']=permission;} -if(typeof read!=='undefined'){payload['read']=read;} -if(typeof write!=='undefined'){payload['write']=write;} -const uri=new URL(this.config.endpoint+path);return yield this.call('post',uri,{'content-type':'application/json',},payload);}),getCollection:(collectionId)=>__awaiter(this,void 0,void 0,function*(){if(typeof collectionId==='undefined'){throw new AppwriteException('Missing required parameter: "collectionId"');} -let path='/database/collections/{collectionId}'.replace('{collectionId}',collectionId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),updateCollection:(collectionId,name,permission,read,write)=>__awaiter(this,void 0,void 0,function*(){if(typeof collectionId==='undefined'){throw new AppwriteException('Missing required parameter: "collectionId"');} -if(typeof name==='undefined'){throw new AppwriteException('Missing required parameter: "name"');} -if(typeof permission==='undefined'){throw new AppwriteException('Missing required parameter: "permission"');} -let path='/database/collections/{collectionId}'.replace('{collectionId}',collectionId);let payload={};if(typeof name!=='undefined'){payload['name']=name;} -if(typeof permission!=='undefined'){payload['permission']=permission;} -if(typeof read!=='undefined'){payload['read']=read;} -if(typeof write!=='undefined'){payload['write']=write;} -const uri=new URL(this.config.endpoint+path);return yield this.call('put',uri,{'content-type':'application/json',},payload);}),deleteCollection:(collectionId)=>__awaiter(this,void 0,void 0,function*(){if(typeof collectionId==='undefined'){throw new AppwriteException('Missing required parameter: "collectionId"');} -let path='/database/collections/{collectionId}'.replace('{collectionId}',collectionId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('delete',uri,{'content-type':'application/json',},payload);}),listAttributes:(collectionId)=>__awaiter(this,void 0,void 0,function*(){if(typeof collectionId==='undefined'){throw new AppwriteException('Missing required parameter: "collectionId"');} -let path='/database/collections/{collectionId}/attributes'.replace('{collectionId}',collectionId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),createBooleanAttribute:(collectionId,attributeId,required,xdefault,array)=>__awaiter(this,void 0,void 0,function*(){if(typeof collectionId==='undefined'){throw new AppwriteException('Missing required parameter: "collectionId"');} -if(typeof attributeId==='undefined'){throw new AppwriteException('Missing required parameter: "attributeId"');} -if(typeof required==='undefined'){throw new AppwriteException('Missing required parameter: "required"');} -let path='/database/collections/{collectionId}/attributes/boolean'.replace('{collectionId}',collectionId);let payload={};if(typeof attributeId!=='undefined'){payload['attributeId']=attributeId;} -if(typeof required!=='undefined'){payload['required']=required;} -if(typeof xdefault!=='undefined'){payload['default']=xdefault;} -if(typeof array!=='undefined'){payload['array']=array;} -const uri=new URL(this.config.endpoint+path);return yield this.call('post',uri,{'content-type':'application/json',},payload);}),createEmailAttribute:(collectionId,attributeId,required,xdefault,array)=>__awaiter(this,void 0,void 0,function*(){if(typeof collectionId==='undefined'){throw new AppwriteException('Missing required parameter: "collectionId"');} -if(typeof attributeId==='undefined'){throw new AppwriteException('Missing required parameter: "attributeId"');} -if(typeof required==='undefined'){throw new AppwriteException('Missing required parameter: "required"');} -let path='/database/collections/{collectionId}/attributes/email'.replace('{collectionId}',collectionId);let payload={};if(typeof attributeId!=='undefined'){payload['attributeId']=attributeId;} -if(typeof required!=='undefined'){payload['required']=required;} -if(typeof xdefault!=='undefined'){payload['default']=xdefault;} -if(typeof array!=='undefined'){payload['array']=array;} -const uri=new URL(this.config.endpoint+path);return yield this.call('post',uri,{'content-type':'application/json',},payload);}),createEnumAttribute:(collectionId,attributeId,elements,required,xdefault,array)=>__awaiter(this,void 0,void 0,function*(){if(typeof collectionId==='undefined'){throw new AppwriteException('Missing required parameter: "collectionId"');} -if(typeof attributeId==='undefined'){throw new AppwriteException('Missing required parameter: "attributeId"');} -if(typeof elements==='undefined'){throw new AppwriteException('Missing required parameter: "elements"');} -if(typeof required==='undefined'){throw new AppwriteException('Missing required parameter: "required"');} -let path='/database/collections/{collectionId}/attributes/enum'.replace('{collectionId}',collectionId);let payload={};if(typeof attributeId!=='undefined'){payload['attributeId']=attributeId;} -if(typeof elements!=='undefined'){payload['elements']=elements;} -if(typeof required!=='undefined'){payload['required']=required;} -if(typeof xdefault!=='undefined'){payload['default']=xdefault;} -if(typeof array!=='undefined'){payload['array']=array;} -const uri=new URL(this.config.endpoint+path);return yield this.call('post',uri,{'content-type':'application/json',},payload);}),createFloatAttribute:(collectionId,attributeId,required,min,max,xdefault,array)=>__awaiter(this,void 0,void 0,function*(){if(typeof collectionId==='undefined'){throw new AppwriteException('Missing required parameter: "collectionId"');} -if(typeof attributeId==='undefined'){throw new AppwriteException('Missing required parameter: "attributeId"');} -if(typeof required==='undefined'){throw new AppwriteException('Missing required parameter: "required"');} -let path='/database/collections/{collectionId}/attributes/float'.replace('{collectionId}',collectionId);let payload={};if(typeof attributeId!=='undefined'){payload['attributeId']=attributeId;} -if(typeof required!=='undefined'){payload['required']=required;} -if(typeof min!=='undefined'){payload['min']=min;} -if(typeof max!=='undefined'){payload['max']=max;} -if(typeof xdefault!=='undefined'){payload['default']=xdefault;} -if(typeof array!=='undefined'){payload['array']=array;} -const uri=new URL(this.config.endpoint+path);return yield this.call('post',uri,{'content-type':'application/json',},payload);}),createIntegerAttribute:(collectionId,attributeId,required,min,max,xdefault,array)=>__awaiter(this,void 0,void 0,function*(){if(typeof collectionId==='undefined'){throw new AppwriteException('Missing required parameter: "collectionId"');} -if(typeof attributeId==='undefined'){throw new AppwriteException('Missing required parameter: "attributeId"');} -if(typeof required==='undefined'){throw new AppwriteException('Missing required parameter: "required"');} -let path='/database/collections/{collectionId}/attributes/integer'.replace('{collectionId}',collectionId);let payload={};if(typeof attributeId!=='undefined'){payload['attributeId']=attributeId;} -if(typeof required!=='undefined'){payload['required']=required;} -if(typeof min!=='undefined'){payload['min']=min;} -if(typeof max!=='undefined'){payload['max']=max;} -if(typeof xdefault!=='undefined'){payload['default']=xdefault;} -if(typeof array!=='undefined'){payload['array']=array;} -const uri=new URL(this.config.endpoint+path);return yield this.call('post',uri,{'content-type':'application/json',},payload);}),createIpAttribute:(collectionId,attributeId,required,xdefault,array)=>__awaiter(this,void 0,void 0,function*(){if(typeof collectionId==='undefined'){throw new AppwriteException('Missing required parameter: "collectionId"');} -if(typeof attributeId==='undefined'){throw new AppwriteException('Missing required parameter: "attributeId"');} -if(typeof required==='undefined'){throw new AppwriteException('Missing required parameter: "required"');} -let path='/database/collections/{collectionId}/attributes/ip'.replace('{collectionId}',collectionId);let payload={};if(typeof attributeId!=='undefined'){payload['attributeId']=attributeId;} -if(typeof required!=='undefined'){payload['required']=required;} -if(typeof xdefault!=='undefined'){payload['default']=xdefault;} -if(typeof array!=='undefined'){payload['array']=array;} -const uri=new URL(this.config.endpoint+path);return yield this.call('post',uri,{'content-type':'application/json',},payload);}),createStringAttribute:(collectionId,attributeId,size,required,xdefault,array)=>__awaiter(this,void 0,void 0,function*(){if(typeof collectionId==='undefined'){throw new AppwriteException('Missing required parameter: "collectionId"');} -if(typeof attributeId==='undefined'){throw new AppwriteException('Missing required parameter: "attributeId"');} -if(typeof size==='undefined'){throw new AppwriteException('Missing required parameter: "size"');} -if(typeof required==='undefined'){throw new AppwriteException('Missing required parameter: "required"');} -let path='/database/collections/{collectionId}/attributes/string'.replace('{collectionId}',collectionId);let payload={};if(typeof attributeId!=='undefined'){payload['attributeId']=attributeId;} -if(typeof size!=='undefined'){payload['size']=size;} -if(typeof required!=='undefined'){payload['required']=required;} -if(typeof xdefault!=='undefined'){payload['default']=xdefault;} -if(typeof array!=='undefined'){payload['array']=array;} -const uri=new URL(this.config.endpoint+path);return yield this.call('post',uri,{'content-type':'application/json',},payload);}),createUrlAttribute:(collectionId,attributeId,required,xdefault,array)=>__awaiter(this,void 0,void 0,function*(){if(typeof collectionId==='undefined'){throw new AppwriteException('Missing required parameter: "collectionId"');} -if(typeof attributeId==='undefined'){throw new AppwriteException('Missing required parameter: "attributeId"');} -if(typeof required==='undefined'){throw new AppwriteException('Missing required parameter: "required"');} -let path='/database/collections/{collectionId}/attributes/url'.replace('{collectionId}',collectionId);let payload={};if(typeof attributeId!=='undefined'){payload['attributeId']=attributeId;} -if(typeof required!=='undefined'){payload['required']=required;} -if(typeof xdefault!=='undefined'){payload['default']=xdefault;} -if(typeof array!=='undefined'){payload['array']=array;} -const uri=new URL(this.config.endpoint+path);return yield this.call('post',uri,{'content-type':'application/json',},payload);}),getAttribute:(collectionId,attributeId)=>__awaiter(this,void 0,void 0,function*(){if(typeof collectionId==='undefined'){throw new AppwriteException('Missing required parameter: "collectionId"');} -if(typeof attributeId==='undefined'){throw new AppwriteException('Missing required parameter: "attributeId"');} -let path='/database/collections/{collectionId}/attributes/{attributeId}'.replace('{collectionId}',collectionId).replace('{attributeId}',attributeId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),deleteAttribute:(collectionId,attributeId)=>__awaiter(this,void 0,void 0,function*(){if(typeof collectionId==='undefined'){throw new AppwriteException('Missing required parameter: "collectionId"');} -if(typeof attributeId==='undefined'){throw new AppwriteException('Missing required parameter: "attributeId"');} -let path='/database/collections/{collectionId}/attributes/{attributeId}'.replace('{collectionId}',collectionId).replace('{attributeId}',attributeId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('delete',uri,{'content-type':'application/json',},payload);}),listDocuments:(collectionId,queries,limit,offset,cursor,cursorDirection,orderAttributes,orderTypes)=>__awaiter(this,void 0,void 0,function*(){if(typeof collectionId==='undefined'){throw new AppwriteException('Missing required parameter: "collectionId"');} -let path='/database/collections/{collectionId}/documents'.replace('{collectionId}',collectionId);let payload={};if(typeof queries!=='undefined'){payload['queries']=queries;} -if(typeof limit!=='undefined'){payload['limit']=limit;} -if(typeof offset!=='undefined'){payload['offset']=offset;} -if(typeof cursor!=='undefined'){payload['cursor']=cursor;} -if(typeof cursorDirection!=='undefined'){payload['cursorDirection']=cursorDirection;} -if(typeof orderAttributes!=='undefined'){payload['orderAttributes']=orderAttributes;} -if(typeof orderTypes!=='undefined'){payload['orderTypes']=orderTypes;} -const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),createDocument:(collectionId,documentId,data,read,write)=>__awaiter(this,void 0,void 0,function*(){if(typeof collectionId==='undefined'){throw new AppwriteException('Missing required parameter: "collectionId"');} -if(typeof documentId==='undefined'){throw new AppwriteException('Missing required parameter: "documentId"');} -if(typeof data==='undefined'){throw new AppwriteException('Missing required parameter: "data"');} -let path='/database/collections/{collectionId}/documents'.replace('{collectionId}',collectionId);let payload={};if(typeof documentId!=='undefined'){payload['documentId']=documentId;} -if(typeof data!=='undefined'){payload['data']=data;} -if(typeof read!=='undefined'){payload['read']=read;} -if(typeof write!=='undefined'){payload['write']=write;} -const uri=new URL(this.config.endpoint+path);return yield this.call('post',uri,{'content-type':'application/json',},payload);}),getDocument:(collectionId,documentId)=>__awaiter(this,void 0,void 0,function*(){if(typeof collectionId==='undefined'){throw new AppwriteException('Missing required parameter: "collectionId"');} -if(typeof documentId==='undefined'){throw new AppwriteException('Missing required parameter: "documentId"');} -let path='/database/collections/{collectionId}/documents/{documentId}'.replace('{collectionId}',collectionId).replace('{documentId}',documentId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),updateDocument:(collectionId,documentId,data,read,write)=>__awaiter(this,void 0,void 0,function*(){if(typeof collectionId==='undefined'){throw new AppwriteException('Missing required parameter: "collectionId"');} -if(typeof documentId==='undefined'){throw new AppwriteException('Missing required parameter: "documentId"');} -if(typeof data==='undefined'){throw new AppwriteException('Missing required parameter: "data"');} -let path='/database/collections/{collectionId}/documents/{documentId}'.replace('{collectionId}',collectionId).replace('{documentId}',documentId);let payload={};if(typeof data!=='undefined'){payload['data']=data;} -if(typeof read!=='undefined'){payload['read']=read;} -if(typeof write!=='undefined'){payload['write']=write;} -const uri=new URL(this.config.endpoint+path);return yield this.call('patch',uri,{'content-type':'application/json',},payload);}),deleteDocument:(collectionId,documentId)=>__awaiter(this,void 0,void 0,function*(){if(typeof collectionId==='undefined'){throw new AppwriteException('Missing required parameter: "collectionId"');} -if(typeof documentId==='undefined'){throw new AppwriteException('Missing required parameter: "documentId"');} -let path='/database/collections/{collectionId}/documents/{documentId}'.replace('{collectionId}',collectionId).replace('{documentId}',documentId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('delete',uri,{'content-type':'application/json',},payload);}),listDocumentLogs:(collectionId,documentId,limit,offset)=>__awaiter(this,void 0,void 0,function*(){if(typeof collectionId==='undefined'){throw new AppwriteException('Missing required parameter: "collectionId"');} -if(typeof documentId==='undefined'){throw new AppwriteException('Missing required parameter: "documentId"');} -let path='/database/collections/{collectionId}/documents/{documentId}/logs'.replace('{collectionId}',collectionId).replace('{documentId}',documentId);let payload={};if(typeof limit!=='undefined'){payload['limit']=limit;} -if(typeof offset!=='undefined'){payload['offset']=offset;} -const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),listIndexes:(collectionId)=>__awaiter(this,void 0,void 0,function*(){if(typeof collectionId==='undefined'){throw new AppwriteException('Missing required parameter: "collectionId"');} -let path='/database/collections/{collectionId}/indexes'.replace('{collectionId}',collectionId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),createIndex:(collectionId,indexId,type,attributes,orders)=>__awaiter(this,void 0,void 0,function*(){if(typeof collectionId==='undefined'){throw new AppwriteException('Missing required parameter: "collectionId"');} -if(typeof indexId==='undefined'){throw new AppwriteException('Missing required parameter: "indexId"');} -if(typeof type==='undefined'){throw new AppwriteException('Missing required parameter: "type"');} -if(typeof attributes==='undefined'){throw new AppwriteException('Missing required parameter: "attributes"');} -let path='/database/collections/{collectionId}/indexes'.replace('{collectionId}',collectionId);let payload={};if(typeof indexId!=='undefined'){payload['indexId']=indexId;} -if(typeof type!=='undefined'){payload['type']=type;} -if(typeof attributes!=='undefined'){payload['attributes']=attributes;} -if(typeof orders!=='undefined'){payload['orders']=orders;} -const uri=new URL(this.config.endpoint+path);return yield this.call('post',uri,{'content-type':'application/json',},payload);}),getIndex:(collectionId,indexId)=>__awaiter(this,void 0,void 0,function*(){if(typeof collectionId==='undefined'){throw new AppwriteException('Missing required parameter: "collectionId"');} -if(typeof indexId==='undefined'){throw new AppwriteException('Missing required parameter: "indexId"');} -let path='/database/collections/{collectionId}/indexes/{indexId}'.replace('{collectionId}',collectionId).replace('{indexId}',indexId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),deleteIndex:(collectionId,indexId)=>__awaiter(this,void 0,void 0,function*(){if(typeof collectionId==='undefined'){throw new AppwriteException('Missing required parameter: "collectionId"');} -if(typeof indexId==='undefined'){throw new AppwriteException('Missing required parameter: "indexId"');} -let path='/database/collections/{collectionId}/indexes/{indexId}'.replace('{collectionId}',collectionId).replace('{indexId}',indexId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('delete',uri,{'content-type':'application/json',},payload);}),listCollectionLogs:(collectionId,limit,offset)=>__awaiter(this,void 0,void 0,function*(){if(typeof collectionId==='undefined'){throw new AppwriteException('Missing required parameter: "collectionId"');} -let path='/database/collections/{collectionId}/logs'.replace('{collectionId}',collectionId);let payload={};if(typeof limit!=='undefined'){payload['limit']=limit;} -if(typeof offset!=='undefined'){payload['offset']=offset;} -const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),getUsage:(range)=>__awaiter(this,void 0,void 0,function*(){let path='/database/usage';let payload={};if(typeof range!=='undefined'){payload['range']=range;} -const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),getCollectionUsage:(collectionId,range)=>__awaiter(this,void 0,void 0,function*(){if(typeof collectionId==='undefined'){throw new AppwriteException('Missing required parameter: "collectionId"');} -let path='/database/{collectionId}/usage'.replace('{collectionId}',collectionId);let payload={};if(typeof range!=='undefined'){payload['range']=range;} -const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);})};this.functions={list:(search,limit,offset,cursor,cursorDirection,orderType)=>__awaiter(this,void 0,void 0,function*(){let path='/functions';let payload={};if(typeof search!=='undefined'){payload['search']=search;} -if(typeof limit!=='undefined'){payload['limit']=limit;} -if(typeof offset!=='undefined'){payload['offset']=offset;} -if(typeof cursor!=='undefined'){payload['cursor']=cursor;} -if(typeof cursorDirection!=='undefined'){payload['cursorDirection']=cursorDirection;} -if(typeof orderType!=='undefined'){payload['orderType']=orderType;} -const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),create:(functionId,name,execute,runtime,vars,events,schedule,timeout)=>__awaiter(this,void 0,void 0,function*(){if(typeof functionId==='undefined'){throw new AppwriteException('Missing required parameter: "functionId"');} -if(typeof name==='undefined'){throw new AppwriteException('Missing required parameter: "name"');} -if(typeof execute==='undefined'){throw new AppwriteException('Missing required parameter: "execute"');} -if(typeof runtime==='undefined'){throw new AppwriteException('Missing required parameter: "runtime"');} -let path='/functions';let payload={};if(typeof functionId!=='undefined'){payload['functionId']=functionId;} -if(typeof name!=='undefined'){payload['name']=name;} -if(typeof execute!=='undefined'){payload['execute']=execute;} -if(typeof runtime!=='undefined'){payload['runtime']=runtime;} -if(typeof vars!=='undefined'){payload['vars']=vars;} -if(typeof events!=='undefined'){payload['events']=events;} -if(typeof schedule!=='undefined'){payload['schedule']=schedule;} -if(typeof timeout!=='undefined'){payload['timeout']=timeout;} -const uri=new URL(this.config.endpoint+path);return yield this.call('post',uri,{'content-type':'application/json',},payload);}),get:(functionId)=>__awaiter(this,void 0,void 0,function*(){if(typeof functionId==='undefined'){throw new AppwriteException('Missing required parameter: "functionId"');} -let path='/functions/{functionId}'.replace('{functionId}',functionId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),update:(functionId,name,execute,vars,events,schedule,timeout)=>__awaiter(this,void 0,void 0,function*(){if(typeof functionId==='undefined'){throw new AppwriteException('Missing required parameter: "functionId"');} -if(typeof name==='undefined'){throw new AppwriteException('Missing required parameter: "name"');} -if(typeof execute==='undefined'){throw new AppwriteException('Missing required parameter: "execute"');} -let path='/functions/{functionId}'.replace('{functionId}',functionId);let payload={};if(typeof name!=='undefined'){payload['name']=name;} -if(typeof execute!=='undefined'){payload['execute']=execute;} -if(typeof vars!=='undefined'){payload['vars']=vars;} -if(typeof events!=='undefined'){payload['events']=events;} -if(typeof schedule!=='undefined'){payload['schedule']=schedule;} -if(typeof timeout!=='undefined'){payload['timeout']=timeout;} -const uri=new URL(this.config.endpoint+path);return yield this.call('put',uri,{'content-type':'application/json',},payload);}),delete:(functionId)=>__awaiter(this,void 0,void 0,function*(){if(typeof functionId==='undefined'){throw new AppwriteException('Missing required parameter: "functionId"');} -let path='/functions/{functionId}'.replace('{functionId}',functionId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('delete',uri,{'content-type':'application/json',},payload);}),listExecutions:(functionId,limit,offset,search,cursor,cursorDirection)=>__awaiter(this,void 0,void 0,function*(){if(typeof functionId==='undefined'){throw new AppwriteException('Missing required parameter: "functionId"');} -let path='/functions/{functionId}/executions'.replace('{functionId}',functionId);let payload={};if(typeof limit!=='undefined'){payload['limit']=limit;} -if(typeof offset!=='undefined'){payload['offset']=offset;} -if(typeof search!=='undefined'){payload['search']=search;} -if(typeof cursor!=='undefined'){payload['cursor']=cursor;} -if(typeof cursorDirection!=='undefined'){payload['cursorDirection']=cursorDirection;} -const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),createExecution:(functionId,data)=>__awaiter(this,void 0,void 0,function*(){if(typeof functionId==='undefined'){throw new AppwriteException('Missing required parameter: "functionId"');} -let path='/functions/{functionId}/executions'.replace('{functionId}',functionId);let payload={};if(typeof data!=='undefined'){payload['data']=data;} -const uri=new URL(this.config.endpoint+path);return yield this.call('post',uri,{'content-type':'application/json',},payload);}),getExecution:(functionId,executionId)=>__awaiter(this,void 0,void 0,function*(){if(typeof functionId==='undefined'){throw new AppwriteException('Missing required parameter: "functionId"');} -if(typeof executionId==='undefined'){throw new AppwriteException('Missing required parameter: "executionId"');} -let path='/functions/{functionId}/executions/{executionId}'.replace('{functionId}',functionId).replace('{executionId}',executionId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),updateTag:(functionId,tag)=>__awaiter(this,void 0,void 0,function*(){if(typeof functionId==='undefined'){throw new AppwriteException('Missing required parameter: "functionId"');} -if(typeof tag==='undefined'){throw new AppwriteException('Missing required parameter: "tag"');} -let path='/functions/{functionId}/tag'.replace('{functionId}',functionId);let payload={};if(typeof tag!=='undefined'){payload['tag']=tag;} -const uri=new URL(this.config.endpoint+path);return yield this.call('patch',uri,{'content-type':'application/json',},payload);}),listTags:(functionId,search,limit,offset,cursor,cursorDirection,orderType)=>__awaiter(this,void 0,void 0,function*(){if(typeof functionId==='undefined'){throw new AppwriteException('Missing required parameter: "functionId"');} -let path='/functions/{functionId}/tags'.replace('{functionId}',functionId);let payload={};if(typeof search!=='undefined'){payload['search']=search;} -if(typeof limit!=='undefined'){payload['limit']=limit;} -if(typeof offset!=='undefined'){payload['offset']=offset;} -if(typeof cursor!=='undefined'){payload['cursor']=cursor;} -if(typeof cursorDirection!=='undefined'){payload['cursorDirection']=cursorDirection;} -if(typeof orderType!=='undefined'){payload['orderType']=orderType;} -const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),createTag:(functionId,command,code)=>__awaiter(this,void 0,void 0,function*(){if(typeof functionId==='undefined'){throw new AppwriteException('Missing required parameter: "functionId"');} -if(typeof command==='undefined'){throw new AppwriteException('Missing required parameter: "command"');} -if(typeof code==='undefined'){throw new AppwriteException('Missing required parameter: "code"');} -let path='/functions/{functionId}/tags'.replace('{functionId}',functionId);let payload={};if(typeof command!=='undefined'){payload['command']=command;} -if(typeof code!=='undefined'){payload['code']=code;} -const uri=new URL(this.config.endpoint+path);return yield this.call('post',uri,{'content-type':'multipart/form-data',},payload);}),getTag:(functionId,tagId)=>__awaiter(this,void 0,void 0,function*(){if(typeof functionId==='undefined'){throw new AppwriteException('Missing required parameter: "functionId"');} -if(typeof tagId==='undefined'){throw new AppwriteException('Missing required parameter: "tagId"');} -let path='/functions/{functionId}/tags/{tagId}'.replace('{functionId}',functionId).replace('{tagId}',tagId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),deleteTag:(functionId,tagId)=>__awaiter(this,void 0,void 0,function*(){if(typeof functionId==='undefined'){throw new AppwriteException('Missing required parameter: "functionId"');} -if(typeof tagId==='undefined'){throw new AppwriteException('Missing required parameter: "tagId"');} -let path='/functions/{functionId}/tags/{tagId}'.replace('{functionId}',functionId).replace('{tagId}',tagId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('delete',uri,{'content-type':'application/json',},payload);}),getUsage:(functionId,range)=>__awaiter(this,void 0,void 0,function*(){if(typeof functionId==='undefined'){throw new AppwriteException('Missing required parameter: "functionId"');} -let path='/functions/{functionId}/usage'.replace('{functionId}',functionId);let payload={};if(typeof range!=='undefined'){payload['range']=range;} -const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);})};this.health={get:()=>__awaiter(this,void 0,void 0,function*(){let path='/health';let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),getAntiVirus:()=>__awaiter(this,void 0,void 0,function*(){let path='/health/anti-virus';let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),getCache:()=>__awaiter(this,void 0,void 0,function*(){let path='/health/cache';let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),getDB:()=>__awaiter(this,void 0,void 0,function*(){let path='/health/db';let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),getQueueCertificates:()=>__awaiter(this,void 0,void 0,function*(){let path='/health/queue/certificates';let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),getQueueFunctions:()=>__awaiter(this,void 0,void 0,function*(){let path='/health/queue/functions';let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),getQueueLogs:()=>__awaiter(this,void 0,void 0,function*(){let path='/health/queue/logs';let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),getQueueUsage:()=>__awaiter(this,void 0,void 0,function*(){let path='/health/queue/usage';let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),getQueueWebhooks:()=>__awaiter(this,void 0,void 0,function*(){let path='/health/queue/webhooks';let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),getStorageLocal:()=>__awaiter(this,void 0,void 0,function*(){let path='/health/storage/local';let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),getTime:()=>__awaiter(this,void 0,void 0,function*(){let path='/health/time';let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);})};this.locale={get:()=>__awaiter(this,void 0,void 0,function*(){let path='/locale';let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),getContinents:()=>__awaiter(this,void 0,void 0,function*(){let path='/locale/continents';let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),getCountries:()=>__awaiter(this,void 0,void 0,function*(){let path='/locale/countries';let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),getCountriesEU:()=>__awaiter(this,void 0,void 0,function*(){let path='/locale/countries/eu';let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),getCountriesPhones:()=>__awaiter(this,void 0,void 0,function*(){let path='/locale/countries/phones';let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),getCurrencies:()=>__awaiter(this,void 0,void 0,function*(){let path='/locale/currencies';let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),getLanguages:()=>__awaiter(this,void 0,void 0,function*(){let path='/locale/languages';let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);})};this.projects={list:(search,limit,offset,cursor,cursorDirection,orderType)=>__awaiter(this,void 0,void 0,function*(){let path='/projects';let payload={};if(typeof search!=='undefined'){payload['search']=search;} -if(typeof limit!=='undefined'){payload['limit']=limit;} -if(typeof offset!=='undefined'){payload['offset']=offset;} -if(typeof cursor!=='undefined'){payload['cursor']=cursor;} -if(typeof cursorDirection!=='undefined'){payload['cursorDirection']=cursorDirection;} -if(typeof orderType!=='undefined'){payload['orderType']=orderType;} -const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),create:(projectId,name,teamId,description,logo,url,legalName,legalCountry,legalState,legalCity,legalAddress,legalTaxId)=>__awaiter(this,void 0,void 0,function*(){if(typeof projectId==='undefined'){throw new AppwriteException('Missing required parameter: "projectId"');} -if(typeof name==='undefined'){throw new AppwriteException('Missing required parameter: "name"');} -if(typeof teamId==='undefined'){throw new AppwriteException('Missing required parameter: "teamId"');} -let path='/projects';let payload={};if(typeof projectId!=='undefined'){payload['projectId']=projectId;} -if(typeof name!=='undefined'){payload['name']=name;} -if(typeof teamId!=='undefined'){payload['teamId']=teamId;} -if(typeof description!=='undefined'){payload['description']=description;} -if(typeof logo!=='undefined'){payload['logo']=logo;} -if(typeof url!=='undefined'){payload['url']=url;} -if(typeof legalName!=='undefined'){payload['legalName']=legalName;} -if(typeof legalCountry!=='undefined'){payload['legalCountry']=legalCountry;} -if(typeof legalState!=='undefined'){payload['legalState']=legalState;} -if(typeof legalCity!=='undefined'){payload['legalCity']=legalCity;} -if(typeof legalAddress!=='undefined'){payload['legalAddress']=legalAddress;} -if(typeof legalTaxId!=='undefined'){payload['legalTaxId']=legalTaxId;} -const uri=new URL(this.config.endpoint+path);return yield this.call('post',uri,{'content-type':'application/json',},payload);}),get:(projectId)=>__awaiter(this,void 0,void 0,function*(){if(typeof projectId==='undefined'){throw new AppwriteException('Missing required parameter: "projectId"');} -let path='/projects/{projectId}'.replace('{projectId}',projectId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),update:(projectId,name,description,logo,url,legalName,legalCountry,legalState,legalCity,legalAddress,legalTaxId)=>__awaiter(this,void 0,void 0,function*(){if(typeof projectId==='undefined'){throw new AppwriteException('Missing required parameter: "projectId"');} -if(typeof name==='undefined'){throw new AppwriteException('Missing required parameter: "name"');} -let path='/projects/{projectId}'.replace('{projectId}',projectId);let payload={};if(typeof name!=='undefined'){payload['name']=name;} -if(typeof description!=='undefined'){payload['description']=description;} -if(typeof logo!=='undefined'){payload['logo']=logo;} -if(typeof url!=='undefined'){payload['url']=url;} -if(typeof legalName!=='undefined'){payload['legalName']=legalName;} -if(typeof legalCountry!=='undefined'){payload['legalCountry']=legalCountry;} -if(typeof legalState!=='undefined'){payload['legalState']=legalState;} -if(typeof legalCity!=='undefined'){payload['legalCity']=legalCity;} -if(typeof legalAddress!=='undefined'){payload['legalAddress']=legalAddress;} -if(typeof legalTaxId!=='undefined'){payload['legalTaxId']=legalTaxId;} -const uri=new URL(this.config.endpoint+path);return yield this.call('patch',uri,{'content-type':'application/json',},payload);}),delete:(projectId,password)=>__awaiter(this,void 0,void 0,function*(){if(typeof projectId==='undefined'){throw new AppwriteException('Missing required parameter: "projectId"');} -if(typeof password==='undefined'){throw new AppwriteException('Missing required parameter: "password"');} -let path='/projects/{projectId}'.replace('{projectId}',projectId);let payload={};if(typeof password!=='undefined'){payload['password']=password;} -const uri=new URL(this.config.endpoint+path);return yield this.call('delete',uri,{'content-type':'application/json',},payload);}),updateAuthLimit:(projectId,limit)=>__awaiter(this,void 0,void 0,function*(){if(typeof projectId==='undefined'){throw new AppwriteException('Missing required parameter: "projectId"');} -if(typeof limit==='undefined'){throw new AppwriteException('Missing required parameter: "limit"');} -let path='/projects/{projectId}/auth/limit'.replace('{projectId}',projectId);let payload={};if(typeof limit!=='undefined'){payload['limit']=limit;} -const uri=new URL(this.config.endpoint+path);return yield this.call('patch',uri,{'content-type':'application/json',},payload);}),updateAuthStatus:(projectId,method,status)=>__awaiter(this,void 0,void 0,function*(){if(typeof projectId==='undefined'){throw new AppwriteException('Missing required parameter: "projectId"');} -if(typeof method==='undefined'){throw new AppwriteException('Missing required parameter: "method"');} -if(typeof status==='undefined'){throw new AppwriteException('Missing required parameter: "status"');} -let path='/projects/{projectId}/auth/{method}'.replace('{projectId}',projectId).replace('{method}',method);let payload={};if(typeof status!=='undefined'){payload['status']=status;} -const uri=new URL(this.config.endpoint+path);return yield this.call('patch',uri,{'content-type':'application/json',},payload);}),listDomains:(projectId)=>__awaiter(this,void 0,void 0,function*(){if(typeof projectId==='undefined'){throw new AppwriteException('Missing required parameter: "projectId"');} -let path='/projects/{projectId}/domains'.replace('{projectId}',projectId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),createDomain:(projectId,domain)=>__awaiter(this,void 0,void 0,function*(){if(typeof projectId==='undefined'){throw new AppwriteException('Missing required parameter: "projectId"');} -if(typeof domain==='undefined'){throw new AppwriteException('Missing required parameter: "domain"');} -let path='/projects/{projectId}/domains'.replace('{projectId}',projectId);let payload={};if(typeof domain!=='undefined'){payload['domain']=domain;} -const uri=new URL(this.config.endpoint+path);return yield this.call('post',uri,{'content-type':'application/json',},payload);}),getDomain:(projectId,domainId)=>__awaiter(this,void 0,void 0,function*(){if(typeof projectId==='undefined'){throw new AppwriteException('Missing required parameter: "projectId"');} -if(typeof domainId==='undefined'){throw new AppwriteException('Missing required parameter: "domainId"');} -let path='/projects/{projectId}/domains/{domainId}'.replace('{projectId}',projectId).replace('{domainId}',domainId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),deleteDomain:(projectId,domainId)=>__awaiter(this,void 0,void 0,function*(){if(typeof projectId==='undefined'){throw new AppwriteException('Missing required parameter: "projectId"');} -if(typeof domainId==='undefined'){throw new AppwriteException('Missing required parameter: "domainId"');} -let path='/projects/{projectId}/domains/{domainId}'.replace('{projectId}',projectId).replace('{domainId}',domainId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('delete',uri,{'content-type':'application/json',},payload);}),updateDomainVerification:(projectId,domainId)=>__awaiter(this,void 0,void 0,function*(){if(typeof projectId==='undefined'){throw new AppwriteException('Missing required parameter: "projectId"');} -if(typeof domainId==='undefined'){throw new AppwriteException('Missing required parameter: "domainId"');} -let path='/projects/{projectId}/domains/{domainId}/verification'.replace('{projectId}',projectId).replace('{domainId}',domainId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('patch',uri,{'content-type':'application/json',},payload);}),listKeys:(projectId)=>__awaiter(this,void 0,void 0,function*(){if(typeof projectId==='undefined'){throw new AppwriteException('Missing required parameter: "projectId"');} -let path='/projects/{projectId}/keys'.replace('{projectId}',projectId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),createKey:(projectId,name,scopes)=>__awaiter(this,void 0,void 0,function*(){if(typeof projectId==='undefined'){throw new AppwriteException('Missing required parameter: "projectId"');} -if(typeof name==='undefined'){throw new AppwriteException('Missing required parameter: "name"');} -if(typeof scopes==='undefined'){throw new AppwriteException('Missing required parameter: "scopes"');} -let path='/projects/{projectId}/keys'.replace('{projectId}',projectId);let payload={};if(typeof name!=='undefined'){payload['name']=name;} -if(typeof scopes!=='undefined'){payload['scopes']=scopes;} -const uri=new URL(this.config.endpoint+path);return yield this.call('post',uri,{'content-type':'application/json',},payload);}),getKey:(projectId,keyId)=>__awaiter(this,void 0,void 0,function*(){if(typeof projectId==='undefined'){throw new AppwriteException('Missing required parameter: "projectId"');} -if(typeof keyId==='undefined'){throw new AppwriteException('Missing required parameter: "keyId"');} -let path='/projects/{projectId}/keys/{keyId}'.replace('{projectId}',projectId).replace('{keyId}',keyId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),updateKey:(projectId,keyId,name,scopes)=>__awaiter(this,void 0,void 0,function*(){if(typeof projectId==='undefined'){throw new AppwriteException('Missing required parameter: "projectId"');} -if(typeof keyId==='undefined'){throw new AppwriteException('Missing required parameter: "keyId"');} -if(typeof name==='undefined'){throw new AppwriteException('Missing required parameter: "name"');} -if(typeof scopes==='undefined'){throw new AppwriteException('Missing required parameter: "scopes"');} -let path='/projects/{projectId}/keys/{keyId}'.replace('{projectId}',projectId).replace('{keyId}',keyId);let payload={};if(typeof name!=='undefined'){payload['name']=name;} -if(typeof scopes!=='undefined'){payload['scopes']=scopes;} -const uri=new URL(this.config.endpoint+path);return yield this.call('put',uri,{'content-type':'application/json',},payload);}),deleteKey:(projectId,keyId)=>__awaiter(this,void 0,void 0,function*(){if(typeof projectId==='undefined'){throw new AppwriteException('Missing required parameter: "projectId"');} -if(typeof keyId==='undefined'){throw new AppwriteException('Missing required parameter: "keyId"');} -let path='/projects/{projectId}/keys/{keyId}'.replace('{projectId}',projectId).replace('{keyId}',keyId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('delete',uri,{'content-type':'application/json',},payload);}),updateOAuth2:(projectId,provider,appId,secret)=>__awaiter(this,void 0,void 0,function*(){if(typeof projectId==='undefined'){throw new AppwriteException('Missing required parameter: "projectId"');} -if(typeof provider==='undefined'){throw new AppwriteException('Missing required parameter: "provider"');} -let path='/projects/{projectId}/oauth2'.replace('{projectId}',projectId);let payload={};if(typeof provider!=='undefined'){payload['provider']=provider;} -if(typeof appId!=='undefined'){payload['appId']=appId;} -if(typeof secret!=='undefined'){payload['secret']=secret;} -const uri=new URL(this.config.endpoint+path);return yield this.call('patch',uri,{'content-type':'application/json',},payload);}),listPlatforms:(projectId)=>__awaiter(this,void 0,void 0,function*(){if(typeof projectId==='undefined'){throw new AppwriteException('Missing required parameter: "projectId"');} -let path='/projects/{projectId}/platforms'.replace('{projectId}',projectId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),createPlatform:(projectId,type,name,key,store,hostname)=>__awaiter(this,void 0,void 0,function*(){if(typeof projectId==='undefined'){throw new AppwriteException('Missing required parameter: "projectId"');} -if(typeof type==='undefined'){throw new AppwriteException('Missing required parameter: "type"');} -if(typeof name==='undefined'){throw new AppwriteException('Missing required parameter: "name"');} -let path='/projects/{projectId}/platforms'.replace('{projectId}',projectId);let payload={};if(typeof type!=='undefined'){payload['type']=type;} -if(typeof name!=='undefined'){payload['name']=name;} -if(typeof key!=='undefined'){payload['key']=key;} -if(typeof store!=='undefined'){payload['store']=store;} -if(typeof hostname!=='undefined'){payload['hostname']=hostname;} -const uri=new URL(this.config.endpoint+path);return yield this.call('post',uri,{'content-type':'application/json',},payload);}),getPlatform:(projectId,platformId)=>__awaiter(this,void 0,void 0,function*(){if(typeof projectId==='undefined'){throw new AppwriteException('Missing required parameter: "projectId"');} -if(typeof platformId==='undefined'){throw new AppwriteException('Missing required parameter: "platformId"');} -let path='/projects/{projectId}/platforms/{platformId}'.replace('{projectId}',projectId).replace('{platformId}',platformId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),updatePlatform:(projectId,platformId,name,key,store,hostname)=>__awaiter(this,void 0,void 0,function*(){if(typeof projectId==='undefined'){throw new AppwriteException('Missing required parameter: "projectId"');} -if(typeof platformId==='undefined'){throw new AppwriteException('Missing required parameter: "platformId"');} -if(typeof name==='undefined'){throw new AppwriteException('Missing required parameter: "name"');} -let path='/projects/{projectId}/platforms/{platformId}'.replace('{projectId}',projectId).replace('{platformId}',platformId);let payload={};if(typeof name!=='undefined'){payload['name']=name;} -if(typeof key!=='undefined'){payload['key']=key;} -if(typeof store!=='undefined'){payload['store']=store;} -if(typeof hostname!=='undefined'){payload['hostname']=hostname;} -const uri=new URL(this.config.endpoint+path);return yield this.call('put',uri,{'content-type':'application/json',},payload);}),deletePlatform:(projectId,platformId)=>__awaiter(this,void 0,void 0,function*(){if(typeof projectId==='undefined'){throw new AppwriteException('Missing required parameter: "projectId"');} -if(typeof platformId==='undefined'){throw new AppwriteException('Missing required parameter: "platformId"');} -let path='/projects/{projectId}/platforms/{platformId}'.replace('{projectId}',projectId).replace('{platformId}',platformId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('delete',uri,{'content-type':'application/json',},payload);}),updateServiceStatus:(projectId,service,status)=>__awaiter(this,void 0,void 0,function*(){if(typeof projectId==='undefined'){throw new AppwriteException('Missing required parameter: "projectId"');} -if(typeof service==='undefined'){throw new AppwriteException('Missing required parameter: "service"');} -if(typeof status==='undefined'){throw new AppwriteException('Missing required parameter: "status"');} -let path='/projects/{projectId}/service'.replace('{projectId}',projectId);let payload={};if(typeof service!=='undefined'){payload['service']=service;} -if(typeof status!=='undefined'){payload['status']=status;} -const uri=new URL(this.config.endpoint+path);return yield this.call('patch',uri,{'content-type':'application/json',},payload);}),getUsage:(projectId,range)=>__awaiter(this,void 0,void 0,function*(){if(typeof projectId==='undefined'){throw new AppwriteException('Missing required parameter: "projectId"');} -let path='/projects/{projectId}/usage'.replace('{projectId}',projectId);let payload={};if(typeof range!=='undefined'){payload['range']=range;} -const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),listWebhooks:(projectId)=>__awaiter(this,void 0,void 0,function*(){if(typeof projectId==='undefined'){throw new AppwriteException('Missing required parameter: "projectId"');} -let path='/projects/{projectId}/webhooks'.replace('{projectId}',projectId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),createWebhook:(projectId,name,events,url,security,httpUser,httpPass)=>__awaiter(this,void 0,void 0,function*(){if(typeof projectId==='undefined'){throw new AppwriteException('Missing required parameter: "projectId"');} -if(typeof name==='undefined'){throw new AppwriteException('Missing required parameter: "name"');} -if(typeof events==='undefined'){throw new AppwriteException('Missing required parameter: "events"');} -if(typeof url==='undefined'){throw new AppwriteException('Missing required parameter: "url"');} -if(typeof security==='undefined'){throw new AppwriteException('Missing required parameter: "security"');} -let path='/projects/{projectId}/webhooks'.replace('{projectId}',projectId);let payload={};if(typeof name!=='undefined'){payload['name']=name;} -if(typeof events!=='undefined'){payload['events']=events;} -if(typeof url!=='undefined'){payload['url']=url;} -if(typeof security!=='undefined'){payload['security']=security;} -if(typeof httpUser!=='undefined'){payload['httpUser']=httpUser;} -if(typeof httpPass!=='undefined'){payload['httpPass']=httpPass;} -const uri=new URL(this.config.endpoint+path);return yield this.call('post',uri,{'content-type':'application/json',},payload);}),getWebhook:(projectId,webhookId)=>__awaiter(this,void 0,void 0,function*(){if(typeof projectId==='undefined'){throw new AppwriteException('Missing required parameter: "projectId"');} -if(typeof webhookId==='undefined'){throw new AppwriteException('Missing required parameter: "webhookId"');} -let path='/projects/{projectId}/webhooks/{webhookId}'.replace('{projectId}',projectId).replace('{webhookId}',webhookId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),updateWebhook:(projectId,webhookId,name,events,url,security,httpUser,httpPass)=>__awaiter(this,void 0,void 0,function*(){if(typeof projectId==='undefined'){throw new AppwriteException('Missing required parameter: "projectId"');} -if(typeof webhookId==='undefined'){throw new AppwriteException('Missing required parameter: "webhookId"');} -if(typeof name==='undefined'){throw new AppwriteException('Missing required parameter: "name"');} -if(typeof events==='undefined'){throw new AppwriteException('Missing required parameter: "events"');} -if(typeof url==='undefined'){throw new AppwriteException('Missing required parameter: "url"');} -if(typeof security==='undefined'){throw new AppwriteException('Missing required parameter: "security"');} -let path='/projects/{projectId}/webhooks/{webhookId}'.replace('{projectId}',projectId).replace('{webhookId}',webhookId);let payload={};if(typeof name!=='undefined'){payload['name']=name;} -if(typeof events!=='undefined'){payload['events']=events;} -if(typeof url!=='undefined'){payload['url']=url;} -if(typeof security!=='undefined'){payload['security']=security;} -if(typeof httpUser!=='undefined'){payload['httpUser']=httpUser;} -if(typeof httpPass!=='undefined'){payload['httpPass']=httpPass;} -const uri=new URL(this.config.endpoint+path);return yield this.call('put',uri,{'content-type':'application/json',},payload);}),deleteWebhook:(projectId,webhookId)=>__awaiter(this,void 0,void 0,function*(){if(typeof projectId==='undefined'){throw new AppwriteException('Missing required parameter: "projectId"');} -if(typeof webhookId==='undefined'){throw new AppwriteException('Missing required parameter: "webhookId"');} -let path='/projects/{projectId}/webhooks/{webhookId}'.replace('{projectId}',projectId).replace('{webhookId}',webhookId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('delete',uri,{'content-type':'application/json',},payload);})};this.storage={listFiles:(search,limit,offset,cursor,cursorDirection,orderType)=>__awaiter(this,void 0,void 0,function*(){let path='/storage/files';let payload={};if(typeof search!=='undefined'){payload['search']=search;} -if(typeof limit!=='undefined'){payload['limit']=limit;} -if(typeof offset!=='undefined'){payload['offset']=offset;} -if(typeof cursor!=='undefined'){payload['cursor']=cursor;} -if(typeof cursorDirection!=='undefined'){payload['cursorDirection']=cursorDirection;} -if(typeof orderType!=='undefined'){payload['orderType']=orderType;} -const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),createFile:(fileId,file,read,write)=>__awaiter(this,void 0,void 0,function*(){if(typeof fileId==='undefined'){throw new AppwriteException('Missing required parameter: "fileId"');} -if(typeof file==='undefined'){throw new AppwriteException('Missing required parameter: "file"');} -let path='/storage/files';let payload={};if(typeof fileId!=='undefined'){payload['fileId']=fileId;} -if(typeof file!=='undefined'){payload['file']=file;} -if(typeof read!=='undefined'){payload['read']=read;} -if(typeof write!=='undefined'){payload['write']=write;} -const uri=new URL(this.config.endpoint+path);return yield this.call('post',uri,{'content-type':'multipart/form-data',},payload);}),getFile:(fileId)=>__awaiter(this,void 0,void 0,function*(){if(typeof fileId==='undefined'){throw new AppwriteException('Missing required parameter: "fileId"');} -let path='/storage/files/{fileId}'.replace('{fileId}',fileId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),updateFile:(fileId,read,write)=>__awaiter(this,void 0,void 0,function*(){if(typeof fileId==='undefined'){throw new AppwriteException('Missing required parameter: "fileId"');} -if(typeof read==='undefined'){throw new AppwriteException('Missing required parameter: "read"');} -if(typeof write==='undefined'){throw new AppwriteException('Missing required parameter: "write"');} -let path='/storage/files/{fileId}'.replace('{fileId}',fileId);let payload={};if(typeof read!=='undefined'){payload['read']=read;} -if(typeof write!=='undefined'){payload['write']=write;} -const uri=new URL(this.config.endpoint+path);return yield this.call('put',uri,{'content-type':'application/json',},payload);}),deleteFile:(fileId)=>__awaiter(this,void 0,void 0,function*(){if(typeof fileId==='undefined'){throw new AppwriteException('Missing required parameter: "fileId"');} -let path='/storage/files/{fileId}'.replace('{fileId}',fileId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('delete',uri,{'content-type':'application/json',},payload);}),getFileDownload:(fileId)=>{if(typeof fileId==='undefined'){throw new AppwriteException('Missing required parameter: "fileId"');} -let path='/storage/files/{fileId}/download'.replace('{fileId}',fileId);let payload={};const uri=new URL(this.config.endpoint+path);payload['project']=this.config.project;for(const[key,value]of Object.entries(this.flatten(payload))){uri.searchParams.append(key,value);} -return uri;},getFilePreview:(fileId,width,height,gravity,quality,borderWidth,borderColor,borderRadius,opacity,rotation,background,output)=>{if(typeof fileId==='undefined'){throw new AppwriteException('Missing required parameter: "fileId"');} -let path='/storage/files/{fileId}/preview'.replace('{fileId}',fileId);let payload={};if(typeof width!=='undefined'){payload['width']=width;} -if(typeof height!=='undefined'){payload['height']=height;} -if(typeof gravity!=='undefined'){payload['gravity']=gravity;} -if(typeof quality!=='undefined'){payload['quality']=quality;} -if(typeof borderWidth!=='undefined'){payload['borderWidth']=borderWidth;} -if(typeof borderColor!=='undefined'){payload['borderColor']=borderColor;} -if(typeof borderRadius!=='undefined'){payload['borderRadius']=borderRadius;} -if(typeof opacity!=='undefined'){payload['opacity']=opacity;} -if(typeof rotation!=='undefined'){payload['rotation']=rotation;} -if(typeof background!=='undefined'){payload['background']=background;} -if(typeof output!=='undefined'){payload['output']=output;} -const uri=new URL(this.config.endpoint+path);payload['project']=this.config.project;for(const[key,value]of Object.entries(this.flatten(payload))){uri.searchParams.append(key,value);} -return uri;},getFileView:(fileId)=>{if(typeof fileId==='undefined'){throw new AppwriteException('Missing required parameter: "fileId"');} -let path='/storage/files/{fileId}/view'.replace('{fileId}',fileId);let payload={};const uri=new URL(this.config.endpoint+path);payload['project']=this.config.project;for(const[key,value]of Object.entries(this.flatten(payload))){uri.searchParams.append(key,value);} -return uri;},getUsage:(range)=>__awaiter(this,void 0,void 0,function*(){let path='/storage/usage';let payload={};if(typeof range!=='undefined'){payload['range']=range;} -const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),getBucketUsage:(bucketId,range)=>__awaiter(this,void 0,void 0,function*(){if(typeof bucketId==='undefined'){throw new AppwriteException('Missing required parameter: "bucketId"');} -let path='/storage/{bucketId}/usage'.replace('{bucketId}',bucketId);let payload={};if(typeof range!=='undefined'){payload['range']=range;} -const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);})};this.teams={list:(search,limit,offset,cursor,cursorDirection,orderType)=>__awaiter(this,void 0,void 0,function*(){let path='/teams';let payload={};if(typeof search!=='undefined'){payload['search']=search;} -if(typeof limit!=='undefined'){payload['limit']=limit;} -if(typeof offset!=='undefined'){payload['offset']=offset;} -if(typeof cursor!=='undefined'){payload['cursor']=cursor;} -if(typeof cursorDirection!=='undefined'){payload['cursorDirection']=cursorDirection;} -if(typeof orderType!=='undefined'){payload['orderType']=orderType;} -const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),create:(teamId,name,roles)=>__awaiter(this,void 0,void 0,function*(){if(typeof teamId==='undefined'){throw new AppwriteException('Missing required parameter: "teamId"');} -if(typeof name==='undefined'){throw new AppwriteException('Missing required parameter: "name"');} -let path='/teams';let payload={};if(typeof teamId!=='undefined'){payload['teamId']=teamId;} -if(typeof name!=='undefined'){payload['name']=name;} -if(typeof roles!=='undefined'){payload['roles']=roles;} -const uri=new URL(this.config.endpoint+path);return yield this.call('post',uri,{'content-type':'application/json',},payload);}),get:(teamId)=>__awaiter(this,void 0,void 0,function*(){if(typeof teamId==='undefined'){throw new AppwriteException('Missing required parameter: "teamId"');} -let path='/teams/{teamId}'.replace('{teamId}',teamId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),update:(teamId,name)=>__awaiter(this,void 0,void 0,function*(){if(typeof teamId==='undefined'){throw new AppwriteException('Missing required parameter: "teamId"');} -if(typeof name==='undefined'){throw new AppwriteException('Missing required parameter: "name"');} -let path='/teams/{teamId}'.replace('{teamId}',teamId);let payload={};if(typeof name!=='undefined'){payload['name']=name;} -const uri=new URL(this.config.endpoint+path);return yield this.call('put',uri,{'content-type':'application/json',},payload);}),delete:(teamId)=>__awaiter(this,void 0,void 0,function*(){if(typeof teamId==='undefined'){throw new AppwriteException('Missing required parameter: "teamId"');} -let path='/teams/{teamId}'.replace('{teamId}',teamId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('delete',uri,{'content-type':'application/json',},payload);}),getMemberships:(teamId,search,limit,offset,cursor,cursorDirection,orderType)=>__awaiter(this,void 0,void 0,function*(){if(typeof teamId==='undefined'){throw new AppwriteException('Missing required parameter: "teamId"');} -let path='/teams/{teamId}/memberships'.replace('{teamId}',teamId);let payload={};if(typeof search!=='undefined'){payload['search']=search;} -if(typeof limit!=='undefined'){payload['limit']=limit;} -if(typeof offset!=='undefined'){payload['offset']=offset;} -if(typeof cursor!=='undefined'){payload['cursor']=cursor;} -if(typeof cursorDirection!=='undefined'){payload['cursorDirection']=cursorDirection;} -if(typeof orderType!=='undefined'){payload['orderType']=orderType;} -const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),createMembership:(teamId,email,roles,url,name)=>__awaiter(this,void 0,void 0,function*(){if(typeof teamId==='undefined'){throw new AppwriteException('Missing required parameter: "teamId"');} -if(typeof email==='undefined'){throw new AppwriteException('Missing required parameter: "email"');} -if(typeof roles==='undefined'){throw new AppwriteException('Missing required parameter: "roles"');} -if(typeof url==='undefined'){throw new AppwriteException('Missing required parameter: "url"');} -let path='/teams/{teamId}/memberships'.replace('{teamId}',teamId);let payload={};if(typeof email!=='undefined'){payload['email']=email;} -if(typeof roles!=='undefined'){payload['roles']=roles;} -if(typeof url!=='undefined'){payload['url']=url;} -if(typeof name!=='undefined'){payload['name']=name;} -const uri=new URL(this.config.endpoint+path);return yield this.call('post',uri,{'content-type':'application/json',},payload);}),getMembership:(teamId,membershipId)=>__awaiter(this,void 0,void 0,function*(){if(typeof teamId==='undefined'){throw new AppwriteException('Missing required parameter: "teamId"');} -if(typeof membershipId==='undefined'){throw new AppwriteException('Missing required parameter: "membershipId"');} -let path='/teams/{teamId}/memberships/{membershipId}'.replace('{teamId}',teamId).replace('{membershipId}',membershipId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),updateMembershipRoles:(teamId,membershipId,roles)=>__awaiter(this,void 0,void 0,function*(){if(typeof teamId==='undefined'){throw new AppwriteException('Missing required parameter: "teamId"');} -if(typeof membershipId==='undefined'){throw new AppwriteException('Missing required parameter: "membershipId"');} -if(typeof roles==='undefined'){throw new AppwriteException('Missing required parameter: "roles"');} -let path='/teams/{teamId}/memberships/{membershipId}'.replace('{teamId}',teamId).replace('{membershipId}',membershipId);let payload={};if(typeof roles!=='undefined'){payload['roles']=roles;} -const uri=new URL(this.config.endpoint+path);return yield this.call('patch',uri,{'content-type':'application/json',},payload);}),deleteMembership:(teamId,membershipId)=>__awaiter(this,void 0,void 0,function*(){if(typeof teamId==='undefined'){throw new AppwriteException('Missing required parameter: "teamId"');} -if(typeof membershipId==='undefined'){throw new AppwriteException('Missing required parameter: "membershipId"');} -let path='/teams/{teamId}/memberships/{membershipId}'.replace('{teamId}',teamId).replace('{membershipId}',membershipId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('delete',uri,{'content-type':'application/json',},payload);}),updateMembershipStatus:(teamId,membershipId,userId,secret)=>__awaiter(this,void 0,void 0,function*(){if(typeof teamId==='undefined'){throw new AppwriteException('Missing required parameter: "teamId"');} -if(typeof membershipId==='undefined'){throw new AppwriteException('Missing required parameter: "membershipId"');} -if(typeof userId==='undefined'){throw new AppwriteException('Missing required parameter: "userId"');} -if(typeof secret==='undefined'){throw new AppwriteException('Missing required parameter: "secret"');} -let path='/teams/{teamId}/memberships/{membershipId}/status'.replace('{teamId}',teamId).replace('{membershipId}',membershipId);let payload={};if(typeof userId!=='undefined'){payload['userId']=userId;} -if(typeof secret!=='undefined'){payload['secret']=secret;} -const uri=new URL(this.config.endpoint+path);return yield this.call('patch',uri,{'content-type':'application/json',},payload);})};this.users={list:(search,limit,offset,cursor,cursorDirection,orderType)=>__awaiter(this,void 0,void 0,function*(){let path='/users';let payload={};if(typeof search!=='undefined'){payload['search']=search;} -if(typeof limit!=='undefined'){payload['limit']=limit;} -if(typeof offset!=='undefined'){payload['offset']=offset;} -if(typeof cursor!=='undefined'){payload['cursor']=cursor;} -if(typeof cursorDirection!=='undefined'){payload['cursorDirection']=cursorDirection;} -if(typeof orderType!=='undefined'){payload['orderType']=orderType;} -const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),create:(userId,email,password,name)=>__awaiter(this,void 0,void 0,function*(){if(typeof userId==='undefined'){throw new AppwriteException('Missing required parameter: "userId"');} -if(typeof email==='undefined'){throw new AppwriteException('Missing required parameter: "email"');} -if(typeof password==='undefined'){throw new AppwriteException('Missing required parameter: "password"');} -let path='/users';let payload={};if(typeof userId!=='undefined'){payload['userId']=userId;} -if(typeof email!=='undefined'){payload['email']=email;} -if(typeof password!=='undefined'){payload['password']=password;} -if(typeof name!=='undefined'){payload['name']=name;} -const uri=new URL(this.config.endpoint+path);return yield this.call('post',uri,{'content-type':'application/json',},payload);}),getUsage:(range,provider)=>__awaiter(this,void 0,void 0,function*(){let path='/users/usage';let payload={};if(typeof range!=='undefined'){payload['range']=range;} -if(typeof provider!=='undefined'){payload['provider']=provider;} -const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),get:(userId)=>__awaiter(this,void 0,void 0,function*(){if(typeof userId==='undefined'){throw new AppwriteException('Missing required parameter: "userId"');} -let path='/users/{userId}'.replace('{userId}',userId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),delete:(userId)=>__awaiter(this,void 0,void 0,function*(){if(typeof userId==='undefined'){throw new AppwriteException('Missing required parameter: "userId"');} -let path='/users/{userId}'.replace('{userId}',userId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('delete',uri,{'content-type':'application/json',},payload);}),updateEmail:(userId,email)=>__awaiter(this,void 0,void 0,function*(){if(typeof userId==='undefined'){throw new AppwriteException('Missing required parameter: "userId"');} -if(typeof email==='undefined'){throw new AppwriteException('Missing required parameter: "email"');} -let path='/users/{userId}/email'.replace('{userId}',userId);let payload={};if(typeof email!=='undefined'){payload['email']=email;} -const uri=new URL(this.config.endpoint+path);return yield this.call('patch',uri,{'content-type':'application/json',},payload);}),getLogs:(userId,limit,offset)=>__awaiter(this,void 0,void 0,function*(){if(typeof userId==='undefined'){throw new AppwriteException('Missing required parameter: "userId"');} -let path='/users/{userId}/logs'.replace('{userId}',userId);let payload={};if(typeof limit!=='undefined'){payload['limit']=limit;} -if(typeof offset!=='undefined'){payload['offset']=offset;} -const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),updateName:(userId,name)=>__awaiter(this,void 0,void 0,function*(){if(typeof userId==='undefined'){throw new AppwriteException('Missing required parameter: "userId"');} -if(typeof name==='undefined'){throw new AppwriteException('Missing required parameter: "name"');} -let path='/users/{userId}/name'.replace('{userId}',userId);let payload={};if(typeof name!=='undefined'){payload['name']=name;} -const uri=new URL(this.config.endpoint+path);return yield this.call('patch',uri,{'content-type':'application/json',},payload);}),updatePassword:(userId,password)=>__awaiter(this,void 0,void 0,function*(){if(typeof userId==='undefined'){throw new AppwriteException('Missing required parameter: "userId"');} -if(typeof password==='undefined'){throw new AppwriteException('Missing required parameter: "password"');} -let path='/users/{userId}/password'.replace('{userId}',userId);let payload={};if(typeof password!=='undefined'){payload['password']=password;} -const uri=new URL(this.config.endpoint+path);return yield this.call('patch',uri,{'content-type':'application/json',},payload);}),getPrefs:(userId)=>__awaiter(this,void 0,void 0,function*(){if(typeof userId==='undefined'){throw new AppwriteException('Missing required parameter: "userId"');} -let path='/users/{userId}/prefs'.replace('{userId}',userId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),updatePrefs:(userId,prefs)=>__awaiter(this,void 0,void 0,function*(){if(typeof userId==='undefined'){throw new AppwriteException('Missing required parameter: "userId"');} -if(typeof prefs==='undefined'){throw new AppwriteException('Missing required parameter: "prefs"');} -let path='/users/{userId}/prefs'.replace('{userId}',userId);let payload={};if(typeof prefs!=='undefined'){payload['prefs']=prefs;} -const uri=new URL(this.config.endpoint+path);return yield this.call('patch',uri,{'content-type':'application/json',},payload);}),getSessions:(userId)=>__awaiter(this,void 0,void 0,function*(){if(typeof userId==='undefined'){throw new AppwriteException('Missing required parameter: "userId"');} -let path='/users/{userId}/sessions'.replace('{userId}',userId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),deleteSessions:(userId)=>__awaiter(this,void 0,void 0,function*(){if(typeof userId==='undefined'){throw new AppwriteException('Missing required parameter: "userId"');} -let path='/users/{userId}/sessions'.replace('{userId}',userId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('delete',uri,{'content-type':'application/json',},payload);}),deleteSession:(userId,sessionId)=>__awaiter(this,void 0,void 0,function*(){if(typeof userId==='undefined'){throw new AppwriteException('Missing required parameter: "userId"');} -if(typeof sessionId==='undefined'){throw new AppwriteException('Missing required parameter: "sessionId"');} -let path='/users/{userId}/sessions/{sessionId}'.replace('{userId}',userId).replace('{sessionId}',sessionId);let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('delete',uri,{'content-type':'application/json',},payload);}),updateStatus:(userId,status)=>__awaiter(this,void 0,void 0,function*(){if(typeof userId==='undefined'){throw new AppwriteException('Missing required parameter: "userId"');} -if(typeof status==='undefined'){throw new AppwriteException('Missing required parameter: "status"');} -let path='/users/{userId}/status'.replace('{userId}',userId);let payload={};if(typeof status!=='undefined'){payload['status']=status;} -const uri=new URL(this.config.endpoint+path);return yield this.call('patch',uri,{'content-type':'application/json',},payload);}),updateVerification:(userId,emailVerification)=>__awaiter(this,void 0,void 0,function*(){if(typeof userId==='undefined'){throw new AppwriteException('Missing required parameter: "userId"');} -if(typeof emailVerification==='undefined'){throw new AppwriteException('Missing required parameter: "emailVerification"');} -let path='/users/{userId}/verification'.replace('{userId}',userId);let payload={};if(typeof emailVerification!=='undefined'){payload['emailVerification']=emailVerification;} -const uri=new URL(this.config.endpoint+path);return yield this.call('patch',uri,{'content-type':'application/json',},payload);})};} -setEndpoint(endpoint){this.config.endpoint=endpoint;this.config.endpointRealtime=this.config.endpointRealtime||this.config.endpoint.replace('https://','wss://').replace('http://','ws://');return this;} -setEndpointRealtime(endpointRealtime){this.config.endpointRealtime=endpointRealtime;return this;} -setProject(value){this.headers['X-Appwrite-Project']=value;this.config.project=value;return this;} -setKey(value){this.headers['X-Appwrite-Key']=value;this.config.key=value;return this;} -setJWT(value){this.headers['X-Appwrite-JWT']=value;this.config.jwt=value;return this;} -setLocale(value){this.headers['X-Appwrite-Locale']=value;this.config.locale=value;return this;} -setMode(value){this.headers['X-Appwrite-Mode']=value;this.config.mode=value;return this;} -subscribe(channels,callback){let channelArray=typeof channels==='string'?[channels]:channels;channelArray.forEach(channel=>this.realtime.channels.add(channel));const counter=this.realtime.subscriptionsCounter++;this.realtime.subscriptions.set(counter,{channels:channelArray,callback});this.realtime.connect();return()=>{this.realtime.subscriptions.delete(counter);this.realtime.cleanUp(channelArray);this.realtime.connect();};} -call(method,url,headers={},params={}){var _a,_b;return __awaiter(this,void 0,void 0,function*(){method=method.toUpperCase();headers=Object.assign(Object.assign({},headers),this.headers);let options={method,headers,credentials:'include'};if(typeof window!=='undefined'&&window.localStorage){headers['X-Fallback-Cookies']=(_a=window.localStorage.getItem('cookieFallback'))!==null&&_a!==void 0?_a:'';} -if(method==='GET'){for(const[key,value]of Object.entries(this.flatten(params))){url.searchParams.append(key,value);}} -else{switch(headers['content-type']){case'application/json':options.body=JSON.stringify(params);break;case'multipart/form-data':let formData=new FormData();for(const key in params){if(Array.isArray(params[key])){params[key].forEach((value)=>{formData.append(key+'[]',value);});} -else{formData.append(key,params[key]);}} -options.body=formData;delete headers['content-type'];break;}} -try{let data=null;const response=yield crossFetch.fetch(url.toString(),options);if((_b=response.headers.get('content-type'))===null||_b===void 0?void 0:_b.includes('application/json')){data=yield response.json();} -else{data={message:yield response.text()};} -if(400<=response.status){throw new AppwriteException(data===null||data===void 0?void 0:data.message,response.status,data);} -const cookieFallback=response.headers.get('X-Fallback-Cookies');if(typeof window!=='undefined'&&window.localStorage&&cookieFallback){window.console.warn('Appwrite is using localStorage for session management. Increase your security by adding a custom domain as your API endpoint.');window.localStorage.setItem('cookieFallback',cookieFallback);} -return data;} -catch(e){if(e instanceof AppwriteException){throw e;} -throw new AppwriteException(e.message);}});} -flatten(data,prefix=''){let output={};for(const key in data){let value=data[key];let finalKey=prefix?`${prefix}[${key}]`:key;if(Array.isArray(value)){output=Object.assign(output,this.flatten(value,finalKey));} -else{output[finalKey]=value;}} -return output;}} -exports.Appwrite=Appwrite;Object.defineProperty(exports,'__esModule',{value:true});}(this.window=this.window||{},null,window));(function(global,factory){typeof exports==='object'&&typeof module!=='undefined'?module.exports=factory():typeof define==='function'&&define.amd?define(factory):(global=typeof globalThis!=='undefined'?globalThis:global||self,global.Chart=factory());}(this,(function(){'use strict';function fontString(pixelSize,fontStyle,fontFamily){return fontStyle+' '+pixelSize+'px '+fontFamily;} -const requestAnimFrame=(function(){if(typeof window==='undefined'){return function(callback){return callback();};} -return window.requestAnimationFrame;}());function throttled(fn,thisArg,updateFn){const updateArgs=updateFn||((args)=>Array.prototype.slice.call(args));let ticking=false;let args=[];return function(...rest){args=updateArgs(rest);if(!ticking){ticking=true;requestAnimFrame.call(window,()=>{ticking=false;fn.apply(thisArg,args);});}};} -function debounce(fn,delay){let timeout;return function(){if(delay){clearTimeout(timeout);timeout=setTimeout(fn,delay);}else{fn();} -return delay;};} -const _toLeftRightCenter=(align)=>align==='start'?'left':align==='end'?'right':'center';const _alignStartEnd=(align,start,end)=>align==='start'?start:align==='end'?end:(start+end)/2;const _textX=(align,left,right,rtl)=>{const check=rtl?'left':'right';return align===check?right:align==='center'?(left+right)/2:left;};class Animator{constructor(){this._request=null;this._charts=new Map();this._running=false;this._lastDate=undefined;} -_notify(chart,anims,date,type){const callbacks=anims.listeners[type];const numSteps=anims.duration;callbacks.forEach(fn=>fn({chart,initial:anims.initial,numSteps,currentStep:Math.min(date-anims.start,numSteps)}));} -_refresh(){const me=this;if(me._request){return;} -me._running=true;me._request=requestAnimFrame.call(window,()=>{me._update();me._request=null;if(me._running){me._refresh();}});} -_update(date=Date.now()){const me=this;let remaining=0;me._charts.forEach((anims,chart)=>{if(!anims.running||!anims.items.length){return;} -const items=anims.items;let i=items.length-1;let draw=false;let item;for(;i>=0;--i){item=items[i];if(item._active){if(item._total>anims.duration){anims.duration=item._total;} -item.tick(date);draw=true;}else{items[i]=items[items.length-1];items.pop();}} -if(draw){chart.draw();me._notify(chart,anims,date,'progress');} -if(!items.length){anims.running=false;me._notify(chart,anims,date,'complete');anims.initial=false;} -remaining+=items.length;});me._lastDate=date;if(remaining===0){me._running=false;}} -_getAnims(chart){const charts=this._charts;let anims=charts.get(chart);if(!anims){anims={running:false,initial:true,items:[],listeners:{complete:[],progress:[]}};charts.set(chart,anims);} -return anims;} -listen(chart,event,cb){this._getAnims(chart).listeners[event].push(cb);} -add(chart,items){if(!items||!items.length){return;} -this._getAnims(chart).items.push(...items);} -has(chart){return this._getAnims(chart).items.length>0;} -start(chart){const anims=this._charts.get(chart);if(!anims){return;} -anims.running=true;anims.start=Date.now();anims.duration=anims.items.reduce((acc,cur)=>Math.max(acc,cur._duration),0);this._refresh();} -running(chart){if(!this._running){return false;} -const anims=this._charts.get(chart);if(!anims||!anims.running||!anims.items.length){return false;} -return true;} -stop(chart){const anims=this._charts.get(chart);if(!anims||!anims.items.length){return;} -const items=anims.items;let i=items.length-1;for(;i>=0;--i){items[i].cancel();} -anims.items=[];this._notify(chart,anims,Date.now(),'complete');} -remove(chart){return this._charts.delete(chart);}} -var animator=new Animator();const map$1={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15};const hex='0123456789ABCDEF';const h1=(b)=>hex[b&0xF];const h2=(b)=>hex[(b&0xF0)>>4]+hex[b&0xF];const eq=(b)=>(((b&0xF0)>>4)===(b&0xF));function isShort(v){return eq(v.r)&&eq(v.g)&&eq(v.b)&&eq(v.a);} -function hexParse(str){var len=str.length;var ret;if(str[0]==='#'){if(len===4||len===5){ret={r:255&map$1[str[1]]*17,g:255&map$1[str[2]]*17,b:255&map$1[str[3]]*17,a:len===5?map$1[str[4]]*17:255};}else if(len===7||len===9){ret={r:map$1[str[1]]<<4|map$1[str[2]],g:map$1[str[3]]<<4|map$1[str[4]],b:map$1[str[5]]<<4|map$1[str[6]],a:len===9?(map$1[str[7]]<<4|map$1[str[8]]):255};}} -return ret;} -function hexString(v){var f=isShort(v)?h1:h2;return v?'#'+f(v.r)+f(v.g)+f(v.b)+(v.a<255?f(v.a):''):v;} -function round(v){return v+0.5|0;} -const lim=(v,l,h)=>Math.max(Math.min(v,h),l);function p2b(v){return lim(round(v*2.55),0,255);} -function n2b(v){return lim(round(v*255),0,255);} -function b2n(v){return lim(round(v/2.55)/100,0,1);} -function n2p(v){return lim(round(v*100),0,100);} -const RGB_RE=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;function rgbParse(str){const m=RGB_RE.exec(str);let a=255;let r,g,b;if(!m){return;} -if(m[7]!==r){const v=+m[7];a=255&(m[8]?p2b(v):v*255);} -r=+m[1];g=+m[3];b=+m[5];r=255&(m[2]?p2b(r):r);g=255&(m[4]?p2b(g):g);b=255&(m[6]?p2b(b):b);return{r:r,g:g,b:b,a:a};} -function rgbString(v){return v&&(v.a<255?`rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})`:`rgb(${v.r}, ${v.g}, ${v.b})`);} -const HUE_RE=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function hsl2rgbn(h,s,l){const a=s*Math.min(l,1-l);const f=(n,k=(n+h/30)%12)=>l-a*Math.max(Math.min(k-3,9-k,1),-1);return[f(0),f(8),f(4)];} -function hsv2rgbn(h,s,v){const f=(n,k=(n+h/60)%6)=>v-v*s*Math.max(Math.min(k,4-k,1),0);return[f(5),f(3),f(1)];} -function hwb2rgbn(h,w,b){const rgb=hsl2rgbn(h,1,0.5);let i;if(w+b>1){i=1/(w+b);w*=i;b*=i;} -for(i=0;i<3;i++){rgb[i]*=1-w-b;rgb[i]+=w;} -return rgb;} -function rgb2hsl(v){const range=255;const r=v.r/range;const g=v.g/range;const b=v.b/range;const max=Math.max(r,g,b);const min=Math.min(r,g,b);const l=(max+min)/2;let h,s,d;if(max!==min){d=max-min;s=l>0.5?d/(2-max-min):d/(max+min);h=max===r?((g-b)/d)+(g>16&0xFF,k>>8&0xFF,k&0xFF];} -return unpacked;} -let names$1;function nameParse(str){if(!names$1){names$1=unpack();names$1.transparent=[0,0,0,0];} -const a=names$1[str.toLowerCase()];return a&&{r:a[0],g:a[1],b:a[2],a:a.length===4?a[3]:255};} -function modHSL(v,i,ratio){if(v){let tmp=rgb2hsl(v);tmp[i]=Math.max(0,Math.min(tmp[i]+tmp[i]*ratio,i===0?360:1));tmp=hsl2rgb(tmp);v.r=tmp[0];v.g=tmp[1];v.b=tmp[2];}} -function clone$1(v,proto){return v?Object.assign(proto||{},v):v;} -function fromObject(input){var v={r:0,g:0,b:0,a:255};if(Array.isArray(input)){if(input.length>=3){v={r:input[0],g:input[1],b:input[2],a:255};if(input.length>3){v.a=n2b(input[3]);}}}else{v=clone$1(input,{r:0,g:0,b:0,a:1});v.a=n2b(v.a);} -return v;} -function functionParse(str){if(str.charAt(0)==='r'){return rgbParse(str);} -return hueParse(str);} -class Color{constructor(input){if(input instanceof Color){return input;} -const type=typeof input;let v;if(type==='object'){v=fromObject(input);}else if(type==='string'){v=hexParse(input)||nameParse(input)||functionParse(input);} -this._rgb=v;this._valid=!!v;} -get valid(){return this._valid;} -get rgb(){var v=clone$1(this._rgb);if(v){v.a=b2n(v.a);} -return v;} -set rgb(obj){this._rgb=fromObject(obj);} -rgbString(){return this._valid?rgbString(this._rgb):this._rgb;} -hexString(){return this._valid?hexString(this._rgb):this._rgb;} -hslString(){return this._valid?hslString(this._rgb):this._rgb;} -mix(color,weight){const me=this;if(color){const c1=me.rgb;const c2=color.rgb;let w2;const p=weight===w2?0.5:weight;const w=2*p-1;const a=c1.a-c2.a;const w1=((w*a===-1?w:(w+a)/(1+w*a))+1)/2.0;w2=1-w1;c1.r=0xFF&w1*c1.r+w2*c2.r+0.5;c1.g=0xFF&w1*c1.g+w2*c2.g+0.5;c1.b=0xFF&w1*c1.b+w2*c2.b+0.5;c1.a=p*c1.a+(1-p)*c2.a;me.rgb=c1;} -return me;} -clone(){return new Color(this.rgb);} -alpha(a){this._rgb.a=n2b(a);return this;} -clearer(ratio){const rgb=this._rgb;rgb.a*=1-ratio;return this;} -greyscale(){const rgb=this._rgb;const val=round(rgb.r*0.3+rgb.g*0.59+rgb.b*0.11);rgb.r=rgb.g=rgb.b=val;return this;} -opaquer(ratio){const rgb=this._rgb;rgb.a*=1+ratio;return this;} -negate(){const v=this._rgb;v.r=255-v.r;v.g=255-v.g;v.b=255-v.b;return this;} -lighten(ratio){modHSL(this._rgb,2,ratio);return this;} -darken(ratio){modHSL(this._rgb,2,-ratio);return this;} -saturate(ratio){modHSL(this._rgb,1,ratio);return this;} -desaturate(ratio){modHSL(this._rgb,1,-ratio);return this;} -rotate(deg){rotate(this._rgb,deg);return this;}} -function index_esm(input){return new Color(input);} -const isPatternOrGradient=(value)=>value instanceof CanvasGradient||value instanceof CanvasPattern;function color(value){return isPatternOrGradient(value)?value:index_esm(value);} -function getHoverColor(value){return isPatternOrGradient(value)?value:index_esm(value).saturate(0.5).darken(0.1).hexString();} -function noop(){} -const uid=(function(){let id=0;return function(){return id++;};}());function isNullOrUndef(value){return value===null||typeof value==='undefined';} -function isArray(value){if(Array.isArray&&Array.isArray(value)){return true;} -const type=Object.prototype.toString.call(value);if(type.substr(0,7)==='[object'&&type.substr(-6)==='Array]'){return true;} -return false;} -function isObject(value){return value!==null&&Object.prototype.toString.call(value)==='[object Object]';} -const isNumberFinite=(value)=>(typeof value==='number'||value instanceof Number)&&isFinite(+value);function finiteOrDefault(value,defaultValue){return isNumberFinite(value)?value:defaultValue;} -function valueOrDefault(value,defaultValue){return typeof value==='undefined'?defaultValue:value;} -const toPercentage=(value,dimension)=>typeof value==='string'&&value.endsWith('%')?parseFloat(value)/100:value/dimension;const toDimension=(value,dimension)=>typeof value==='string'&&value.endsWith('%')?parseFloat(value)/100*dimension:+value;function callback(fn,args,thisArg){if(fn&&typeof fn.call==='function'){return fn.apply(thisArg,args);}} -function each(loopable,fn,thisArg,reverse){let i,len,keys;if(isArray(loopable)){len=loopable.length;if(reverse){for(i=len-1;i>=0;i--){fn.call(thisArg,loopable[i],i);}}else{for(i=0;ipos){obj=obj[key.substr(pos,idx-pos)];pos=idx+1;idx=indexOfDotOrLength(key,pos);} -return obj;} -function _capitalize(str){return str.charAt(0).toUpperCase()+str.slice(1);} -const defined=(value)=>typeof value!=='undefined';const isFunction=(value)=>typeof value==='function';const setsEqual=(a,b)=>{if(a.size!==b.size){return false;} -for(const item of a){if(!b.has(item)){return false;}} -return true;};const overrides=Object.create(null);const descriptors=Object.create(null);function getScope$1(node,key){if(!key){return node;} -const keys=key.split('.');for(let i=0,n=keys.length;icontext.chart.platform.getDevicePixelRatio();this.elements={};this.events=['mousemove','mouseout','click','touchstart','touchmove'];this.font={family:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",size:12,style:'normal',lineHeight:1.2,weight:null};this.hover={};this.hoverBackgroundColor=(ctx,options)=>getHoverColor(options.backgroundColor);this.hoverBorderColor=(ctx,options)=>getHoverColor(options.borderColor);this.hoverColor=(ctx,options)=>getHoverColor(options.color);this.indexAxis='x';this.interaction={mode:'nearest',intersect:true};this.maintainAspectRatio=true;this.onHover=null;this.onClick=null;this.parsing=true;this.plugins={};this.responsive=true;this.scale=undefined;this.scales={};this.showLine=true;this.describe(_descriptors);} -set(scope,values){return set(this,scope,values);} -get(scope){return getScope$1(this,scope);} -describe(scope,values){return set(descriptors,scope,values);} -override(scope,values){return set(overrides,scope,values);} -route(scope,name,targetScope,targetName){const scopeObject=getScope$1(this,scope);const targetScopeObject=getScope$1(this,targetScope);const privateName='_'+name;Object.defineProperties(scopeObject,{[privateName]:{value:scopeObject[name],writable:true},[name]:{enumerable:true,get(){const local=this[privateName];const target=targetScopeObject[targetName];if(isObject(local)){return Object.assign({},target,local);} -return valueOrDefault(local,target);},set(value){this[privateName]=value;}}});}} -var defaults=new Defaults({_scriptable:(name)=>!name.startsWith('on'),_indexable:(name)=>name!=='events',hover:{_fallback:'interaction'},interaction:{_scriptable:false,_indexable:false,}});const PI=Math.PI;const TAU=2*PI;const PITAU=TAU+PI;const INFINITY=Number.POSITIVE_INFINITY;const RAD_PER_DEG=PI/180;const HALF_PI=PI/2;const QUARTER_PI=PI/4;const TWO_THIRDS_PI=PI*2/3;const log10=Math.log10;const sign=Math.sign;function niceNum(range){const roundedRange=Math.round(range);range=almostEquals(range,roundedRange,range/1000)?roundedRange:range;const niceRange=Math.pow(10,Math.floor(log10(range)));const fraction=range/niceRange;const niceFraction=fraction<=1?1:fraction<=2?2:fraction<=5?5:10;return niceFraction*niceRange;} -function _factorize(value){const result=[];const sqrt=Math.sqrt(value);let i;for(i=1;ia-b).pop();return result;} -function isNumber(n){return!isNaN(parseFloat(n))&&isFinite(n);} -function almostEquals(x,y,epsilon){return Math.abs(x-y)=x);} -function _setMinAndMaxByKey(array,target,property){let i,ilen,value;for(i=0,ilen=array.length;iangleToEnd&&startToAnglelongest){longest=textWidth;} -return longest;} -function _longestText(ctx,font,arrayOfThings,cache){cache=cache||{};let data=cache.data=cache.data||{};let gc=cache.garbageCollect=cache.garbageCollect||[];if(cache.font!==font){data=cache.data={};gc=cache.garbageCollect=[];cache.font=font;} -ctx.save();ctx.font=font;let longest=0;const ilen=arrayOfThings.length;let i,j,jlen,thing,nestedThing;for(i=0;iarrayOfThings.length){for(i=0;i0){ctx.stroke();}} -function _isPointInArea(point,area,margin){margin=margin||0.5;return!area||(point&&point.x>area.left-margin&&point.xarea.top-margin&&point.y0&&opts.strokeColor!=='';let i,line;ctx.save();ctx.font=font.string;setRenderOpts(ctx,opts);for(i=0;itable[index]1){mid=(lo+hi)>>1;if(cmp(mid)){lo=mid;}else{hi=mid;}} -return{lo,hi};} -const _lookupByKey=(table,key,value)=>_lookup(table,value,index=>table[index][key]_lookup(table,value,index=>table[index][key]>=value);function _filterBetween(values,min,max){let start=0;let end=values.length;while(startstart&&values[end-1]>max){end--;} -return start>0||end{const method='_onData'+_capitalize(key);const base=array[key];Object.defineProperty(array,key,{configurable:true,enumerable:false,value(...args){const res=base.apply(this,args);array._chartjs.listeners.forEach((object)=>{if(typeof object[method]==='function'){object[method](...args);}});return res;}});});} -function unlistenArrayEvents(array,listener){const stub=array._chartjs;if(!stub){return;} -const listeners=stub.listeners;const index=listeners.indexOf(listener);if(index!==-1){listeners.splice(index,1);} -if(listeners.length>0){return;} -arrayEvents.forEach((key)=>{delete array[key];});delete array._chartjs;} -function _arrayUnique(items){const set=new Set();let i,ilen;for(i=0,ilen=items.length;iwindow.getComputedStyle(element,null);function getStyle(el,property){return getComputedStyle(el).getPropertyValue(property);} -const positions=['top','right','bottom','left'];function getPositionedStyle(styles,style,suffix){const result={};suffix=suffix?'-'+suffix:'';for(let i=0;i<4;i++){const pos=positions[i];result[pos]=parseFloat(styles[style+'-'+pos+suffix])||0;} -result.width=result.left+result.right;result.height=result.top+result.bottom;return result;} -const useOffsetPos=(x,y,target)=>(x>0||y>0)&&(!target||!target.shadowRoot);function getCanvasPosition(evt,canvas){const e=evt.native||evt;const touches=e.touches;const source=touches&&touches.length?touches[0]:e;const{offsetX,offsetY}=source;let box=false;let x,y;if(useOffsetPos(offsetX,offsetY,e.target)){x=offsetX;y=offsetY;}else{const rect=canvas.getBoundingClientRect();x=source.clientX-rect.left;y=source.clientY-rect.top;box=true;} -return{x,y,box};} -function getRelativePosition$1(evt,chart){const{canvas,currentDevicePixelRatio}=chart;const style=getComputedStyle(canvas);const borderBox=style.boxSizing==='border-box';const paddings=getPositionedStyle(style,'padding');const borders=getPositionedStyle(style,'border','width');const{x,y,box}=getCanvasPosition(evt,canvas);const xOffset=paddings.left+(box&&borders.left);const yOffset=paddings.top+(box&&borders.top);let{width,height}=chart;if(borderBox){width-=paddings.width+borders.width;height-=paddings.height+borders.height;} -return{x:Math.round((x-xOffset)/width*canvas.width/currentDevicePixelRatio),y:Math.round((y-yOffset)/height*canvas.height/currentDevicePixelRatio)};} -function getContainerSize(canvas,width,height){let maxWidth,maxHeight;if(width===undefined||height===undefined){const container=_getParentNode(canvas);if(!container){width=canvas.clientWidth;height=canvas.clientHeight;}else{const rect=container.getBoundingClientRect();const containerStyle=getComputedStyle(container);const containerBorder=getPositionedStyle(containerStyle,'border','width');const containerPadding=getPositionedStyle(containerStyle,'padding');width=rect.width-containerPadding.width-containerBorder.width;height=rect.height-containerPadding.height-containerBorder.height;maxWidth=parseMaxStyle(containerStyle.maxWidth,container,'clientWidth');maxHeight=parseMaxStyle(containerStyle.maxHeight,container,'clientHeight');}} -return{width,height,maxWidth:maxWidth||INFINITY,maxHeight:maxHeight||INFINITY};} -const round1=v=>Math.round(v*10)/10;function getMaximumSize(canvas,bbWidth,bbHeight,aspectRatio){const style=getComputedStyle(canvas);const margins=getPositionedStyle(style,'margin');const maxWidth=parseMaxStyle(style.maxWidth,canvas,'clientWidth')||INFINITY;const maxHeight=parseMaxStyle(style.maxHeight,canvas,'clientHeight')||INFINITY;const containerSize=getContainerSize(canvas,bbWidth,bbHeight);let{width,height}=containerSize;if(style.boxSizing==='content-box'){const borders=getPositionedStyle(style,'border','width');const paddings=getPositionedStyle(style,'padding');width-=paddings.width+borders.width;height-=paddings.height+borders.height;} -width=Math.max(0,width-margins.width);height=Math.max(0,aspectRatio?Math.floor(width/aspectRatio):height-margins.height);width=round1(Math.min(width,maxWidth,containerSize.maxWidth));height=round1(Math.min(height,maxHeight,containerSize.maxHeight));if(width&&!height){height=round1(width/2);} -return{width,height};} -function retinaScale(chart,forceRatio,forceStyle){const pixelRatio=forceRatio||1;const deviceHeight=Math.floor(chart.height*pixelRatio);const deviceWidth=Math.floor(chart.width*pixelRatio);chart.height=deviceHeight/pixelRatio;chart.width=deviceWidth/pixelRatio;const canvas=chart.canvas;if(canvas.style&&(forceStyle||(!canvas.style.height&&!canvas.style.width))){canvas.style.height=`${chart.height}px`;canvas.style.width=`${chart.width}px`;} -if(chart.currentDevicePixelRatio!==pixelRatio||canvas.height!==deviceHeight||canvas.width!==deviceWidth){chart.currentDevicePixelRatio=pixelRatio;canvas.height=deviceHeight;canvas.width=deviceWidth;chart.ctx.setTransform(pixelRatio,0,0,pixelRatio,0,0);return true;} -return false;} -const supportsEventListenerOptions=(function(){let passiveSupported=false;try{const options={get passive(){passiveSupported=true;return false;}};window.addEventListener('test',null,options);window.removeEventListener('test',null,options);}catch(e){} -return passiveSupported;}());function readUsedSize(element,property){const value=getStyle(element,property);const matches=value&&value.match(/^(\d+)(\.\d+)?px$/);return matches?+matches[1]:undefined;} -function getRelativePosition(e,chart){if('native'in e){return{x:e.x,y:e.y};} -return getRelativePosition$1(e,chart);} -function evaluateAllVisibleItems(chart,handler){const metasets=chart.getSortedVisibleDatasetMetas();let index,data,element;for(let i=0,ilen=metasets.length;i{if(element[rangeMethod](position[axis],useFinalPosition)){items.push({element,datasetIndex,index});} -if(element.inRange(position.x,position.y,useFinalPosition)){intersectsItem=true;}});if(options.intersect&&!intersectsItem){return[];} -return items;} -var Interaction={modes:{index(chart,e,options,useFinalPosition){const position=getRelativePosition(e,chart);const axis=options.axis||'x';const items=options.intersect?getIntersectItems(chart,position,axis,useFinalPosition):getNearestItems(chart,position,axis,false,useFinalPosition);const elements=[];if(!items.length){return[];} -chart.getSortedVisibleDatasetMetas().forEach((meta)=>{const index=items[0].index;const element=meta.data[index];if(element&&!element.skip){elements.push({element,datasetIndex:meta.index,index});}});return elements;},dataset(chart,e,options,useFinalPosition){const position=getRelativePosition(e,chart);const axis=options.axis||'xy';let items=options.intersect?getIntersectItems(chart,position,axis,useFinalPosition):getNearestItems(chart,position,axis,false,useFinalPosition);if(items.length>0){const datasetIndex=items[0].datasetIndex;const data=chart.getDatasetMeta(datasetIndex).data;items=[];for(let i=0;i+v||0;function _readValueToProps(value,props){const ret={};const objProps=isObject(props);const keys=objProps?Object.keys(props):props;const read=isObject(value)?objProps?prop=>valueOrDefault(value[prop],value[props[prop]]):prop=>value[prop]:()=>value;for(const prop of keys){ret[prop]=numberOrZero$1(read(prop));} -return ret;} -function toTRBL(value){return _readValueToProps(value,{top:'y',right:'x',bottom:'y',left:'x'});} -function toTRBLCorners(value){return _readValueToProps(value,['topLeft','topRight','bottomLeft','bottomRight']);} -function toPadding(value){const obj=toTRBL(value);obj.width=obj.left+obj.right;obj.height=obj.top+obj.bottom;return obj;} -function toFont(options,fallback){options=options||{};fallback=fallback||defaults.font;let size=valueOrDefault(options.size,fallback.size);if(typeof size==='string'){size=parseInt(size,10);} -let style=valueOrDefault(options.style,fallback.style);if(style&&!(''+style).match(FONT_STYLE)){console.warn('Invalid font style specified: "'+style+'"');style='';} -const font={family:valueOrDefault(options.family,fallback.family),lineHeight:toLineHeight(valueOrDefault(options.lineHeight,fallback.lineHeight),size),size,style,weight:valueOrDefault(options.weight,fallback.weight),string:''};font.string=toFontString(font);return font;} -function resolve(inputs,context,index,info){let cacheable=true;let i,ilen,value;for(i=0,ilen=inputs.length;iv.pos===position);} -function filterDynamicPositionByAxis(array,axis){return array.filter(v=>STATIC_POSITIONS.indexOf(v.pos)===-1&&v.box.axis===axis);} -function sortByWeight(array,reverse){return array.sort((a,b)=>{const v0=reverse?b:a;const v1=reverse?a:b;return v0.weight===v1.weight?v0.index-v1.index:v0.weight-v1.weight;});} -function wrapBoxes(boxes){const layoutBoxes=[];let i,ilen,box,pos,stack,stackWeight;for(i=0,ilen=(boxes||[]).length;iwrap.box.fullSize),true);const left=sortByWeight(filterByPosition(layoutBoxes,'left'),true);const right=sortByWeight(filterByPosition(layoutBoxes,'right'));const top=sortByWeight(filterByPosition(layoutBoxes,'top'),true);const bottom=sortByWeight(filterByPosition(layoutBoxes,'bottom'));const centerHorizontal=filterDynamicPositionByAxis(layoutBoxes,'x');const centerVertical=filterDynamicPositionByAxis(layoutBoxes,'y');return{fullSize,leftAndTop:left.concat(top),rightAndBottom:right.concat(centerVertical).concat(bottom).concat(centerHorizontal),chartArea:filterByPosition(layoutBoxes,'chartArea'),vertical:left.concat(right).concat(centerVertical),horizontal:top.concat(bottom).concat(centerHorizontal)};} -function getCombinedMax(maxPadding,chartArea,a,b){return Math.max(maxPadding[a],chartArea[a])+Math.max(maxPadding[b],chartArea[b]);} -function updateMaxPadding(maxPadding,boxPadding){maxPadding.top=Math.max(maxPadding.top,boxPadding.top);maxPadding.left=Math.max(maxPadding.left,boxPadding.left);maxPadding.bottom=Math.max(maxPadding.bottom,boxPadding.bottom);maxPadding.right=Math.max(maxPadding.right,boxPadding.right);} -function updateDims(chartArea,params,layout,stacks){const{pos,box}=layout;const maxPadding=chartArea.maxPadding;if(!isObject(pos)){if(layout.size){chartArea[pos]-=layout.size;} -const stack=stacks[layout.stack]||{size:0,count:1};stack.size=Math.max(stack.size,layout.horizontal?box.height:box.width);layout.size=stack.size/stack.count;chartArea[pos]+=layout.size;} -if(box.getPadding){updateMaxPadding(maxPadding,box.getPadding());} -const newWidth=Math.max(0,params.outerWidth-getCombinedMax(maxPadding,chartArea,'left','right'));const newHeight=Math.max(0,params.outerHeight-getCombinedMax(maxPadding,chartArea,'top','bottom'));const widthChanged=newWidth!==chartArea.w;const heightChanged=newHeight!==chartArea.h;chartArea.w=newWidth;chartArea.h=newHeight;return layout.horizontal?{same:widthChanged,other:heightChanged}:{same:heightChanged,other:widthChanged};} -function handleMaxPadding(chartArea){const maxPadding=chartArea.maxPadding;function updatePos(pos){const change=Math.max(maxPadding[pos]-chartArea[pos],0);chartArea[pos]+=change;return change;} -chartArea.y+=updatePos('top');chartArea.x+=updatePos('left');updatePos('right');updatePos('bottom');} -function getMargins(horizontal,chartArea){const maxPadding=chartArea.maxPadding;function marginForPositions(positions){const margin={left:0,top:0,right:0,bottom:0};positions.forEach((pos)=>{margin[pos]=Math.max(chartArea[pos],maxPadding[pos]);});return margin;} -return horizontal?marginForPositions(['left','right']):marginForPositions(['top','bottom']);} -function fitBoxes(boxes,chartArea,params,stacks){const refitBoxes=[];let i,ilen,layout,box,refit,changed;for(i=0,ilen=boxes.length,refit=0;i{if(typeof box.beforeLayout==='function'){box.beforeLayout();}});const visibleVerticalBoxCount=verticalBoxes.reduce((total,wrap)=>wrap.box.options&&wrap.box.options.display===false?total:total+1,0)||1;const params=Object.freeze({outerWidth:width,outerHeight:height,padding,availableWidth,availableHeight,vBoxMaxWidth:availableWidth/2/visibleVerticalBoxCount,hBoxMaxHeight:availableHeight/2});const maxPadding=Object.assign({},padding);updateMaxPadding(maxPadding,toPadding(minPadding));const chartArea=Object.assign({maxPadding,w:availableWidth,h:availableHeight,x:padding.left,y:padding.top},padding);const stacks=setLayoutDims(verticalBoxes.concat(horizontalBoxes),params);fitBoxes(boxes.fullSize,chartArea,params,stacks);fitBoxes(verticalBoxes,chartArea,params,stacks);if(fitBoxes(horizontalBoxes,chartArea,params,stacks)){fitBoxes(verticalBoxes,chartArea,params,stacks);} -handleMaxPadding(chartArea);placeBoxes(boxes.leftAndTop,chartArea,params,stacks);chartArea.x+=chartArea.w;chartArea.y+=chartArea.h;placeBoxes(boxes.rightAndBottom,chartArea,params,stacks);chart.chartArea={left:chartArea.left,top:chartArea.top,right:chartArea.left+chartArea.w,bottom:chartArea.top+chartArea.h,height:chartArea.h,width:chartArea.w,};each(boxes.chartArea,(layout)=>{const box=layout.box;Object.assign(box,chart.chartArea);box.update(chartArea.w,chartArea.h);});}};function _createResolver(scopes,prefixes=[''],rootScopes=scopes,fallback,getTarget=()=>scopes[0]){if(!defined(fallback)){fallback=_resolve('_fallback',scopes);} -const cache={[Symbol.toStringTag]:'Object',_cacheable:true,_scopes:scopes,_rootScopes:rootScopes,_fallback:fallback,_getTarget:getTarget,override:(scope)=>_createResolver([scope,...scopes],prefixes,rootScopes,fallback),};return new Proxy(cache,{deleteProperty(target,prop){delete target[prop];delete target._keys;delete scopes[0][prop];return true;},get(target,prop){return _cached(target,prop,()=>_resolveWithPrefixes(prop,prefixes,scopes,target));},getOwnPropertyDescriptor(target,prop){return Reflect.getOwnPropertyDescriptor(target._scopes[0],prop);},getPrototypeOf(){return Reflect.getPrototypeOf(scopes[0]);},has(target,prop){return getKeysFromAllScopes(target).includes(prop);},ownKeys(target){return getKeysFromAllScopes(target);},set(target,prop,value){const storage=target._storage||(target._storage=getTarget());storage[prop]=value;delete target[prop];delete target._keys;return true;}});} -function _attachContext(proxy,context,subProxy,descriptorDefaults){const cache={_cacheable:false,_proxy:proxy,_context:context,_subProxy:subProxy,_stack:new Set(),_descriptors:_descriptors(proxy,descriptorDefaults),setContext:(ctx)=>_attachContext(proxy,ctx,subProxy,descriptorDefaults),override:(scope)=>_attachContext(proxy.override(scope),context,subProxy,descriptorDefaults)};return new Proxy(cache,{deleteProperty(target,prop){delete target[prop];delete proxy[prop];return true;},get(target,prop,receiver){return _cached(target,prop,()=>_resolveWithContext(target,prop,receiver));},getOwnPropertyDescriptor(target,prop){return target._descriptors.allKeys?Reflect.has(proxy,prop)?{enumerable:true,configurable:true}:undefined:Reflect.getOwnPropertyDescriptor(proxy,prop);},getPrototypeOf(){return Reflect.getPrototypeOf(proxy);},has(target,prop){return Reflect.has(proxy,prop);},ownKeys(){return Reflect.ownKeys(proxy);},set(target,prop,value){proxy[prop]=value;delete target[prop];return true;}});} -function _descriptors(proxy,defaults={scriptable:true,indexable:true}){const{_scriptable=defaults.scriptable,_indexable=defaults.indexable,_allKeys=defaults.allKeys}=proxy;return{allKeys:_allKeys,scriptable:_scriptable,indexable:_indexable,isScriptable:isFunction(_scriptable)?_scriptable:()=>_scriptable,isIndexable:isFunction(_indexable)?_indexable:()=>_indexable};} -const readKey=(prefix,name)=>prefix?prefix+_capitalize(name):name;const needsSubResolver=(prop,value)=>isObject(value)&&prop!=='adapters';function _cached(target,prop,resolve){let value=target[prop];if(defined(value)){return value;} -value=resolve();if(defined(value)){target[prop]=value;} -return value;} -function _resolveWithContext(target,prop,receiver){const{_proxy,_context,_subProxy,_descriptors:descriptors}=target;let value=_proxy[prop];if(isFunction(value)&&descriptors.isScriptable(prop)){value=_resolveScriptable(prop,value,target,receiver);} -if(isArray(value)&&value.length){value=_resolveArray(prop,value,target,descriptors.isIndexable);} -if(needsSubResolver(prop,value)){value=_attachContext(value,_context,_subProxy&&_subProxy[prop],descriptors);} -return value;} -function _resolveScriptable(prop,value,target,receiver){const{_proxy,_context,_subProxy,_stack}=target;if(_stack.has(prop)){throw new Error('Recursion detected: '+Array.from(_stack).join('->')+'->'+prop);} -_stack.add(prop);value=value(_context,_subProxy||receiver);_stack.delete(prop);if(isObject(value)){value=createSubResolver(_proxy._scopes,_proxy,prop,value);} -return value;} -function _resolveArray(prop,value,target,isIndexable){const{_proxy,_context,_subProxy,_descriptors:descriptors}=target;if(defined(_context.index)&&isIndexable(prop)){value=value[_context.index%value.length];}else if(isObject(value[0])){const arr=value;const scopes=_proxy._scopes.filter(s=>s!==arr);value=[];for(const item of arr){const resolver=createSubResolver(scopes,_proxy,prop,item);value.push(_attachContext(resolver,_context,_subProxy&&_subProxy[prop],descriptors));}} -return value;} -function resolveFallback(fallback,prop,value){return isFunction(fallback)?fallback(prop,value):fallback;} -const getScope=(key,parent)=>key===true?parent:typeof key==='string'?resolveObjectKey(parent,key):undefined;function addScopes(set,parentScopes,key,parentFallback){for(const parent of parentScopes){const scope=getScope(key,parent);if(scope){set.add(scope);const fallback=resolveFallback(scope._fallback,key,scope);if(defined(fallback)&&fallback!==key&&fallback!==parentFallback){return fallback;}}else if(scope===false&&defined(parentFallback)&&key!==parentFallback){return null;}} -return false;} -function createSubResolver(parentScopes,resolver,prop,value){const rootScopes=resolver._rootScopes;const fallback=resolveFallback(resolver._fallback,prop,value);const allScopes=[...parentScopes,...rootScopes];const set=new Set();set.add(value);let key=addScopesFromKey(set,allScopes,prop,fallback||prop);if(key===null){return false;} -if(defined(fallback)&&fallback!==prop){key=addScopesFromKey(set,allScopes,fallback,key);if(key===null){return false;}} -return _createResolver(Array.from(set),[''],rootScopes,fallback,()=>subGetTarget(resolver,prop,value));} -function addScopesFromKey(set,allScopes,key,fallback){while(key){key=addScopes(set,allScopes,key,fallback);} -return key;} -function subGetTarget(resolver,prop,value){const parent=resolver._getTarget();if(!(prop in parent)){parent[prop]={};} -const target=parent[prop];if(isArray(target)&&isObject(value)){return value;} -return target;} -function _resolveWithPrefixes(prop,prefixes,scopes,proxy){let value;for(const prefix of prefixes){value=_resolve(readKey(prefix,prop),scopes);if(defined(value)){return needsSubResolver(prop,value)?createSubResolver(scopes,proxy,prop,value):value;}}} -function _resolve(key,scopes){for(const scope of scopes){if(!scope){continue;} -const value=scope[key];if(defined(value)){return value;}}} -function getKeysFromAllScopes(target){let keys=target._keys;if(!keys){keys=target._keys=resolveKeysFromAllScopes(target._scopes);} -return keys;} -function resolveKeysFromAllScopes(scopes){const set=new Set();for(const scope of scopes){for(const key of Object.keys(scope).filter(k=>!k.startsWith('_'))){set.add(key);}} -return Array.from(set);} -const EPSILON=Number.EPSILON||1e-14;const getPoint=(points,i)=>iindexAxis==='x'?'y':'x';function splineCurve(firstPoint,middlePoint,afterPoint,t){const previous=firstPoint.skip?middlePoint:firstPoint;const current=middlePoint;const next=afterPoint.skip?middlePoint:afterPoint;const d01=distanceBetweenPoints(current,previous);const d12=distanceBetweenPoints(next,current);let s01=d01/(d01+d12);let s12=d12/(d01+d12);s01=isNaN(s01)?0:s01;s12=isNaN(s12)?0:s12;const fa=t*s01;const fb=t*s12;return{previous:{x:current.x-fa*(next.x-previous.x),y:current.y-fa*(next.y-previous.y)},next:{x:current.x+fb*(next.x-previous.x),y:current.y+fb*(next.y-previous.y)}};} -function monotoneAdjust(points,deltaK,mK){const pointsLen=points.length;let alphaK,betaK,tauK,squaredMagnitude,pointCurrent;let pointAfter=getPoint(points,0);for(let i=0;i!pt.skip);} -if(options.cubicInterpolationMode==='monotone'){splineCurveMonotone(points,indexAxis);}else{let prev=loop?points[points.length-1]:points[0];for(i=0,ilen=points.length;it===0||t===1;const elasticIn=(t,s,p)=>-(Math.pow(2,10*(t-=1))*Math.sin((t-s)*TAU/p));const elasticOut=(t,s,p)=>Math.pow(2,-10*t)*Math.sin((t-s)*TAU/p)+1;const effects={linear:t=>t,easeInQuad:t=>t*t,easeOutQuad:t=>-t*(t-2),easeInOutQuad:t=>((t/=0.5)<1)?0.5*t*t:-0.5*((--t)*(t-2)-1),easeInCubic:t=>t*t*t,easeOutCubic:t=>(t-=1)*t*t+1,easeInOutCubic:t=>((t/=0.5)<1)?0.5*t*t*t:0.5*((t-=2)*t*t+2),easeInQuart:t=>t*t*t*t,easeOutQuart:t=>-((t-=1)*t*t*t-1),easeInOutQuart:t=>((t/=0.5)<1)?0.5*t*t*t*t:-0.5*((t-=2)*t*t*t-2),easeInQuint:t=>t*t*t*t*t,easeOutQuint:t=>(t-=1)*t*t*t*t+1,easeInOutQuint:t=>((t/=0.5)<1)?0.5*t*t*t*t*t:0.5*((t-=2)*t*t*t*t+2),easeInSine:t=>-Math.cos(t*HALF_PI)+1,easeOutSine:t=>Math.sin(t*HALF_PI),easeInOutSine:t=>-0.5*(Math.cos(PI*t)-1),easeInExpo:t=>(t===0)?0:Math.pow(2,10*(t-1)),easeOutExpo:t=>(t===1)?1:-Math.pow(2,-10*t)+1,easeInOutExpo:t=>atEdge(t)?t:t<0.5?0.5*Math.pow(2,10*(t*2-1)):0.5*(-Math.pow(2,-10*(t*2-1))+2),easeInCirc:t=>(t>=1)?t:-(Math.sqrt(1-t*t)-1),easeOutCirc:t=>Math.sqrt(1-(t-=1)*t),easeInOutCirc:t=>((t/=0.5)<1)?-0.5*(Math.sqrt(1-t*t)-1):0.5*(Math.sqrt(1-(t-=2)*t)+1),easeInElastic:t=>atEdge(t)?t:elasticIn(t,0.075,0.3),easeOutElastic:t=>atEdge(t)?t:elasticOut(t,0.075,0.3),easeInOutElastic(t){const s=0.1125;const p=0.45;return atEdge(t)?t:t<0.5?0.5*elasticIn(t*2,s,p):0.5+0.5*elasticOut(t*2-1,s,p);},easeInBack(t){const s=1.70158;return t*t*((s+1)*t-s);},easeOutBack(t){const s=1.70158;return(t-=1)*t*((s+1)*t+s)+1;},easeInOutBack(t){let s=1.70158;if((t/=0.5)<1){return 0.5*(t*t*(((s*=(1.525))+1)*t-s));} -return 0.5*((t-=2)*t*(((s*=(1.525))+1)*t+s)+2);},easeInBounce:t=>1-effects.easeOutBounce(1-t),easeOutBounce(t){const m=7.5625;const d=2.75;if(t<(1/d)){return m*t*t;} -if(t<(2/d)){return m*(t-=(1.5/d))*t+0.75;} -if(t<(2.5/d)){return m*(t-=(2.25/d))*t+0.9375;} -return m*(t-=(2.625/d))*t+0.984375;},easeInOutBounce:t=>(t<0.5)?effects.easeInBounce(t*2)*0.5:effects.easeOutBounce(t*2-1)*0.5+0.5,};function _pointInLine(p1,p2,t,mode){return{x:p1.x+t*(p2.x-p1.x),y:p1.y+t*(p2.y-p1.y)};} -function _steppedInterpolation(p1,p2,t,mode){return{x:p1.x+t*(p2.x-p1.x),y:mode==='middle'?t<0.5?p1.y:p2.y:mode==='after'?t<1?p1.y:p2.y:t>0?p2.y:p1.y};} -function _bezierInterpolation(p1,p2,t,mode){const cp1={x:p1.cp2x,y:p1.cp2y};const cp2={x:p2.cp1x,y:p2.cp1y};const a=_pointInLine(p1,cp1,t);const b=_pointInLine(cp1,cp2,t);const c=_pointInLine(cp2,p2,t);const d=_pointInLine(a,b,t);const e=_pointInLine(b,c,t);return _pointInLine(d,e,t);} -const intlCache=new Map();function getNumberFormat(locale,options){options=options||{};const cacheKey=locale+JSON.stringify(options);let formatter=intlCache.get(cacheKey);if(!formatter){formatter=new Intl.NumberFormat(locale,options);intlCache.set(cacheKey,formatter);} -return formatter;} -function formatNumber(num,locale,options){return getNumberFormat(locale,options).format(num);} -const getRightToLeftAdapter=function(rectX,width){return{x(x){return rectX+rectX+width-x;},setWidth(w){width=w;},textAlign(align){if(align==='center'){return align;} -return align==='right'?'left':'right';},xPlus(x,value){return x-value;},leftForLtr(x,itemWidth){return x-itemWidth;},};};const getLeftToRightAdapter=function(){return{x(x){return x;},setWidth(w){},textAlign(align){return align;},xPlus(x,value){return x+value;},leftForLtr(x,_itemWidth){return x;},};};function getRtlAdapter(rtl,rectX,width){return rtl?getRightToLeftAdapter(rectX,width):getLeftToRightAdapter();} -function overrideTextDirection(ctx,direction){let style,original;if(direction==='ltr'||direction==='rtl'){style=ctx.canvas.style;original=[style.getPropertyValue('direction'),style.getPropertyPriority('direction'),];style.setProperty('direction',direction,'important');ctx.prevTextDirection=original;}} -function restoreTextDirection(ctx,original){if(original!==undefined){delete ctx.prevTextDirection;ctx.canvas.style.setProperty('direction',original[0],original[1]);}} -function propertyFn(property){if(property==='angle'){return{between:_angleBetween,compare:_angleDiff,normalize:_normalizeAngle,};} -return{between:(n,s,e)=>n>=Math.min(s,e)&&n<=Math.max(e,s),compare:(a,b)=>a-b,normalize:x=>x};} -function normalizeSegment({start,end,count,loop,style}){return{start:start%count,end:end%count,loop:loop&&(end-start+1)%count===0,style};} -function getSegment(segment,points,bounds){const{property,start:startBound,end:endBound}=bounds;const{between,normalize}=propertyFn(property);const count=points.length;let{start,end,loop}=segment;let i,ilen;if(loop){start+=count;end+=count;for(i=0,ilen=count;ibetween(startBound,prevValue,value)&&compare(startBound,prevValue)!==0;const endIsBefore=()=>compare(endBound,value)===0||between(endBound,prevValue,value);const shouldStart=()=>inside||startIsBefore();const shouldStop=()=>!inside||endIsBefore();for(let i=start,prev=start;i<=end;++i){point=points[i%count];if(point.skip){continue;} -value=normalize(point[property]);if(value===prevValue){continue;} -inside=between(value,startBound,endBound);if(subStart===null&&shouldStart()){subStart=compare(value,startBound)===0?i:prev;} -if(subStart!==null&&shouldStop()){result.push(normalizeSegment({start:subStart,end:i,loop,count,style}));subStart=null;} -prev=i;prevValue=value;} -if(subStart!==null){result.push(normalizeSegment({start:subStart,end,loop,count,style}));} -return result;} -function _boundSegments(line,bounds){const result=[];const segments=line.segments;for(let i=0;istart&&points[end%count].skip){end--;} -end%=count;return{start,end};} -function solidSegments(points,start,max,loop){const count=points.length;const result=[];let last=start;let prev=points[start];let end;for(end=start+1;end<=max;++end){const cur=points[end%count];if(cur.skip||cur.stop){if(!prev.skip){loop=false;result.push({start:start%count,end:(end-1)%count,loop});start=last=cur.stop?end:null;}}else{last=end;if(prev.skip){start=end;}} -prev=cur;} -if(last!==null){result.push({start:start%count,end:last%count,loop});} -return result;} -function _computeSegments(line,segmentOptions){const points=line.points;const spanGaps=line.options.spanGaps;const count=points.length;if(!count){return[];} -const loop=!!line._loop;const{start,end}=findStartAndEnd(points,count,loop,spanGaps);if(spanGaps===true){return splitByStyles(line,[{start,end,loop}],points,segmentOptions);} -const max=endvalue===null||value==='';function initCanvas(canvas,aspectRatio){const style=canvas.style;const renderHeight=canvas.getAttribute('height');const renderWidth=canvas.getAttribute('width');canvas[EXPANDO_KEY]={initial:{height:renderHeight,width:renderWidth,style:{display:style.display,height:style.height,width:style.width}}};style.display=style.display||'block';style.boxSizing=style.boxSizing||'border-box';if(isNullOrEmpty(renderWidth)){const displayWidth=readUsedSize(canvas,'width');if(displayWidth!==undefined){canvas.width=displayWidth;}} -if(isNullOrEmpty(renderHeight)){if(canvas.style.height===''){canvas.height=canvas.width/(aspectRatio||2);}else{const displayHeight=readUsedSize(canvas,'height');if(displayHeight!==undefined){canvas.height=displayHeight;}}} -return canvas;} -const eventListenerOptions=supportsEventListenerOptions?{passive:true}:false;function addListener(node,type,listener){node.addEventListener(type,listener,eventListenerOptions);} -function removeListener(chart,type,listener){chart.canvas.removeEventListener(type,listener,eventListenerOptions);} -function fromNativeEvent(event,chart){const type=EVENT_TYPES[event.type]||event.type;const{x,y}=getRelativePosition$1(event,chart);return{type,chart,native:event,x:x!==undefined?x:null,y:y!==undefined?y:null,};} -function createAttachObserver(chart,type,listener){const canvas=chart.canvas;const container=canvas&&_getParentNode(canvas);const element=container||canvas;const observer=new MutationObserver(entries=>{const parent=_getParentNode(element);entries.forEach(entry=>{for(let i=0;i{entries.forEach(entry=>{for(let i=0;i{if(chart.currentDevicePixelRatio!==dpr){resize();}});} -function listenDevicePixelRatioChanges(chart,resize){if(!drpListeningCharts.size){window.addEventListener('resize',onWindowResize);} -drpListeningCharts.set(chart,resize);} -function unlistenDevicePixelRatioChanges(chart){drpListeningCharts.delete(chart);if(!drpListeningCharts.size){window.removeEventListener('resize',onWindowResize);}} -function createResizeObserver(chart,type,listener){const canvas=chart.canvas;const container=canvas&&_getParentNode(canvas);if(!container){return;} -const resize=throttled((width,height)=>{const w=container.clientWidth;listener(width,height);if(w{const entry=entries[0];const width=entry.contentRect.width;const height=entry.contentRect.height;if(width===0&&height===0){return;} -resize(width,height);});observer.observe(container);listenDevicePixelRatioChanges(chart,resize);return observer;} -function releaseObserver(chart,type,observer){if(observer){observer.disconnect();} -if(type==='resize'){unlistenDevicePixelRatioChanges(chart);}} -function createProxyAndListen(chart,type,listener){const canvas=chart.canvas;const proxy=throttled((event)=>{if(chart.ctx!==null){listener(fromNativeEvent(event,chart));}},chart,(args)=>{const event=args[0];return[event,event.offsetX,event.offsetY];});addListener(canvas,type,proxy);return proxy;} -class DomPlatform extends BasePlatform{acquireContext(canvas,aspectRatio){const context=canvas&&canvas.getContext&&canvas.getContext('2d');if(context&&context.canvas===canvas){initCanvas(canvas,aspectRatio);return context;} -return null;} -releaseContext(context){const canvas=context.canvas;if(!canvas[EXPANDO_KEY]){return false;} -const initial=canvas[EXPANDO_KEY].initial;['height','width'].forEach((prop)=>{const value=initial[prop];if(isNullOrUndef(value)){canvas.removeAttribute(prop);}else{canvas.setAttribute(prop,value);}});const style=initial.style||{};Object.keys(style).forEach((key)=>{canvas.style[key]=style[key];});canvas.width=canvas.width;delete canvas[EXPANDO_KEY];return true;} -addEventListener(chart,type,listener){this.removeEventListener(chart,type);const proxies=chart.$proxies||(chart.$proxies={});const handlers={attach:createAttachObserver,detach:createDetachObserver,resize:createResizeObserver};const handler=handlers[type]||createProxyAndListen;proxies[type]=handler(chart,type,listener);} -removeEventListener(chart,type){const proxies=chart.$proxies||(chart.$proxies={});const proxy=proxies[type];if(!proxy){return;} -const handlers={attach:releaseObserver,detach:releaseObserver,resize:releaseObserver};const handler=handlers[type]||removeListener;handler(chart,type,proxy);proxies[type]=undefined;} -getDevicePixelRatio(){return window.devicePixelRatio;} -getMaximumSize(canvas,width,height,aspectRatio){return getMaximumSize(canvas,width,height,aspectRatio);} -isAttached(canvas){const container=_getParentNode(canvas);return!!(container&&container.isConnected);}} -function _detectPlatform(canvas){if(!_isDomSupported()||(typeof OffscreenCanvas!=='undefined'&&canvas instanceof OffscreenCanvas)){return BasicPlatform;} -return DomPlatform;} -var platforms=Object.freeze({__proto__:null,_detectPlatform:_detectPlatform,BasePlatform:BasePlatform,BasicPlatform:BasicPlatform,DomPlatform:DomPlatform});const transparent='transparent';const interpolators={boolean(from,to,factor){return factor>0.5?to:from;},color(from,to,factor){const c0=color(from||transparent);const c1=c0.valid&&color(to||transparent);return c1&&c1.valid?c1.mix(c0,factor).hexString():to;},number(from,to,factor){return from+(to-from)*factor;}};class Animation{constructor(cfg,target,prop,to){const currentValue=target[prop];to=resolve([cfg.to,to,currentValue,cfg.from]);const from=resolve([cfg.from,currentValue,to]);this._active=true;this._fn=cfg.fn||interpolators[cfg.type||typeof from];this._easing=effects[cfg.easing]||effects.linear;this._start=Math.floor(Date.now()+(cfg.delay||0));this._duration=this._total=Math.floor(cfg.duration);this._loop=!!cfg.loop;this._target=target;this._prop=prop;this._from=from;this._to=to;this._promises=undefined;} -active(){return this._active;} -update(cfg,to,date){const me=this;if(me._active){me._notify(false);const currentValue=me._target[me._prop];const elapsed=date-me._start;const remain=me._duration-elapsed;me._start=date;me._duration=Math.floor(Math.max(remain,cfg.duration));me._total+=elapsed;me._loop=!!cfg.loop;me._to=resolve([cfg.to,to,currentValue,cfg.from]);me._from=resolve([cfg.from,currentValue,to]);}} -cancel(){const me=this;if(me._active){me.tick(Date.now());me._active=false;me._notify(false);}} -tick(date){const me=this;const elapsed=date-me._start;const duration=me._duration;const prop=me._prop;const from=me._from;const loop=me._loop;const to=me._to;let factor;me._active=from!==to&&(loop||(elapsed1?2-factor:factor;factor=me._easing(Math.min(1,Math.max(0,factor)));me._target[prop]=me._fn(from,to,factor);} -wait(){const promises=this._promises||(this._promises=[]);return new Promise((res,rej)=>{promises.push({res,rej});});} -_notify(resolved){const method=resolved?'res':'rej';const promises=this._promises||[];for(let i=0;iname!=='onProgress'&&name!=='onComplete'&&name!=='fn',});defaults.set('animations',{colors:{type:'color',properties:colors},numbers:{type:'number',properties:numbers},});defaults.describe('animations',{_fallback:'animation',});defaults.set('transitions',{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:'transparent'},visible:{type:'boolean',duration:0},}},hide:{animations:{colors:{to:'transparent'},visible:{type:'boolean',easing:'linear',fn:v=>v|0},}}});class Animations{constructor(chart,config){this._chart=chart;this._properties=new Map();this.configure(config);} -configure(config){if(!isObject(config)){return;} -const animatedProps=this._properties;Object.getOwnPropertyNames(config).forEach(key=>{const cfg=config[key];if(!isObject(cfg)){return;} -const resolved={};for(const option of animationOptions){resolved[option]=cfg[option];} -(isArray(cfg.properties)&&cfg.properties||[key]).forEach((prop)=>{if(prop===key||!animatedProps.has(prop)){animatedProps.set(prop,resolved);}});});} -_animateOptions(target,values){const newOptions=values.options;const options=resolveTargetOptions(target,newOptions);if(!options){return[];} -const animations=this._createAnimations(options,newOptions);if(newOptions.$shared){awaitAll(target.options.$animations,newOptions).then(()=>{target.options=newOptions;},()=>{});} -return animations;} -_createAnimations(target,values){const animatedProps=this._properties;const animations=[];const running=target.$animations||(target.$animations={});const props=Object.keys(values);const date=Date.now();let i;for(i=props.length-1;i>=0;--i){const prop=props[i];if(prop.charAt(0)==='$'){continue;} -if(prop==='options'){animations.push(...this._animateOptions(target,values));continue;} -const value=values[prop];let animation=running[prop];const cfg=animatedProps.get(prop);if(animation){if(cfg&&animation.active()){animation.update(cfg,value,date);continue;}else{animation.cancel();}} -if(!cfg||!cfg.duration){target[prop]=value;continue;} -running[prop]=animation=new Animation(cfg,target,prop,value);animations.push(animation);} -return animations;} -update(target,values){if(this._properties.size===0){Object.assign(target,values);return;} -const animations=this._createAnimations(target,values);if(animations.length){animator.add(this._chart,animations);return true;}}} -function awaitAll(animations,properties){const running=[];const keys=Object.keys(properties);for(let i=0;i0)||(!positive&&value<0)){return meta.index;}} -return null;} -function updateStacks(controller,parsed){const{chart,_cachedMeta:meta}=controller;const stacks=chart._stacks||(chart._stacks={});const{iScale,vScale,index:datasetIndex}=meta;const iAxis=iScale.axis;const vAxis=vScale.axis;const key=getStackKey(iScale,vScale,meta);const ilen=parsed.length;let stack;for(let i=0;iscales[key].axis===axis).shift();} -function createDatasetContext(parent,index){return Object.assign(Object.create(parent),{active:false,dataset:undefined,datasetIndex:index,index,mode:'default',type:'dataset'});} -function createDataContext(parent,index,element){return Object.assign(Object.create(parent),{active:false,dataIndex:index,parsed:undefined,raw:undefined,element,index,mode:'default',type:'data'});} -function clearStacks(meta,items){const datasetIndex=meta.controller.index;const axis=meta.vScale&&meta.vScale.axis;if(!axis){return;} -items=items||meta._parsed;for(const parsed of items){const stacks=parsed._stacks;if(!stacks||stacks[axis]===undefined||stacks[axis][datasetIndex]===undefined){return;} -delete stacks[axis][datasetIndex];}} -const isDirectUpdateMode=(mode)=>mode==='reset'||mode==='none';const cloneIfNotShared=(cached,shared)=>shared?cached:Object.assign({},cached);class DatasetController{constructor(chart,datasetIndex){this.chart=chart;this._ctx=chart.ctx;this.index=datasetIndex;this._cachedDataOpts={};this._cachedMeta=this.getMeta();this._type=this._cachedMeta.type;this.options=undefined;this._parsing=false;this._data=undefined;this._objectData=undefined;this._sharedOptions=undefined;this._drawStart=undefined;this._drawCount=undefined;this.enableOptionSharing=false;this.$context=undefined;this._syncList=[];this.initialize();} -initialize(){const me=this;const meta=me._cachedMeta;me.configure();me.linkScales();meta._stacked=isStacked(meta.vScale,meta);me.addElements();} -updateIndex(datasetIndex){if(this.index!==datasetIndex){clearStacks(this._cachedMeta);} -this.index=datasetIndex;} -linkScales(){const me=this;const chart=me.chart;const meta=me._cachedMeta;const dataset=me.getDataset();const chooseId=(axis,x,y,r)=>axis==='x'?x:axis==='r'?r:y;const xid=meta.xAxisID=valueOrDefault(dataset.xAxisID,getFirstScaleId(chart,'x'));const yid=meta.yAxisID=valueOrDefault(dataset.yAxisID,getFirstScaleId(chart,'y'));const rid=meta.rAxisID=valueOrDefault(dataset.rAxisID,getFirstScaleId(chart,'r'));const indexAxis=meta.indexAxis;const iid=meta.iAxisID=chooseId(indexAxis,xid,yid,rid);const vid=meta.vAxisID=chooseId(indexAxis,yid,xid,rid);meta.xScale=me.getScaleForId(xid);meta.yScale=me.getScaleForId(yid);meta.rScale=me.getScaleForId(rid);meta.iScale=me.getScaleForId(iid);meta.vScale=me.getScaleForId(vid);} -getDataset(){return this.chart.data.datasets[this.index];} -getMeta(){return this.chart.getDatasetMeta(this.index);} -getScaleForId(scaleID){return this.chart.scales[scaleID];} -_getOtherScale(scale){const meta=this._cachedMeta;return scale===meta.iScale?meta.vScale:meta.iScale;} -reset(){this._update('reset');} -_destroy(){const meta=this._cachedMeta;if(this._data){unlistenArrayEvents(this._data,this);} -if(meta._stacked){clearStacks(meta);}} -_dataCheck(){const me=this;const dataset=me.getDataset();const data=dataset.data||(dataset.data=[]);const _data=me._data;if(isObject(data)){me._data=convertObjectDataToArray(data);}else if(_data!==data){if(_data){unlistenArrayEvents(_data,me);const meta=me._cachedMeta;clearStacks(meta);meta._parsed=[];} -if(data&&Object.isExtensible(data)){listenArrayEvents(data,me);} -me._syncList=[];me._data=data;}} -addElements(){const me=this;const meta=me._cachedMeta;me._dataCheck();if(me.datasetElementType){meta.dataset=new me.datasetElementType();}} -buildOrUpdateElements(resetNewElements){const me=this;const meta=me._cachedMeta;const dataset=me.getDataset();let stackChanged=false;me._dataCheck();const oldStacked=meta._stacked;meta._stacked=isStacked(meta.vScale,meta);if(meta.stack!==dataset.stack){stackChanged=true;clearStacks(meta);meta.stack=dataset.stack;} -me._resyncElements(resetNewElements);if(stackChanged||oldStacked!==meta._stacked){updateStacks(me,meta._parsed);}} -configure(){const me=this;const config=me.chart.config;const scopeKeys=config.datasetScopeKeys(me._type);const scopes=config.getOptionScopes(me.getDataset(),scopeKeys,true);me.options=config.createResolver(scopes,me.getContext());me._parsing=me.options.parsing;} -parse(start,count){const me=this;const{_cachedMeta:meta,_data:data}=me;const{iScale,_stacked}=meta;const iAxis=iScale.axis;let sorted=start===0&&count===data.length?true:meta._sorted;let prev=start>0&&meta._parsed[start-1];let i,cur,parsed;if(me._parsing===false){meta._parsed=data;meta._sorted=true;parsed=data;}else{if(isArray(data[start])){parsed=me.parseArrayData(meta,data,start,count);}else if(isObject(data[start])){parsed=me.parseObjectData(meta,data,start,count);}else{parsed=me.parsePrimitiveData(meta,data,start,count);} -const isNotInOrderComparedToPrev=()=>cur[iAxis]===null||(prev&&cur[iAxis]otherValue||otherMax=0;--i){if(_skip()){continue;} -me.updateRangeFromParsed(range,scale,parsed,stack);break;}} -return range;} -getAllParsedValues(scale){const parsed=this._cachedMeta._parsed;const values=[];let i,ilen,value;for(i=0,ilen=parsed.length;i=0&&indexme.getContext(index,active);const values=config.resolveNamedOptions(scopes,names,context,prefixes);if(values.$shared){values.$shared=sharing;cache[cacheKey]=Object.freeze(cloneIfNotShared(values,sharing));} -return values;} -_resolveAnimations(index,transition,active){const me=this;const chart=me.chart;const cache=me._cachedDataOpts;const cacheKey=`animation-${transition}`;const cached=cache[cacheKey];if(cached){return cached;} -let options;if(chart.options.animation!==false){const config=me.chart.config;const scopeKeys=config.datasetAnimationScopeKeys(me._type,transition);const scopes=config.getOptionScopes(me.getDataset(),scopeKeys);options=config.createResolver(scopes,me.getContext(index,active,transition));} -const animations=new Animations(chart,options&&options.animations);if(options&&options._cacheable){cache[cacheKey]=Object.freeze(animations);} -return animations;} -getSharedOptions(options){if(!options.$shared){return;} -return this._sharedOptions||(this._sharedOptions=Object.assign({},options));} -includeOptions(mode,sharedOptions){return!sharedOptions||isDirectUpdateMode(mode)||this.chart._animationsDisabled;} -updateElement(element,index,properties,mode){if(isDirectUpdateMode(mode)){Object.assign(element,properties);}else{this._resolveAnimations(index,mode).update(element,properties);}} -updateSharedOptions(sharedOptions,mode,newOptions){if(sharedOptions&&!isDirectUpdateMode(mode)){this._resolveAnimations(undefined,mode).update(sharedOptions,newOptions);}} -_setStyle(element,index,mode,active){element.active=active;const options=this.getStyle(index,active);this._resolveAnimations(index,mode,active).update(element,{options:(!active&&this.getSharedOptions(options))||options});} -removeHoverStyle(element,datasetIndex,index){this._setStyle(element,index,'active',false);} -setHoverStyle(element,datasetIndex,index){this._setStyle(element,index,'active',true);} -_removeDatasetHoverStyle(){const element=this._cachedMeta.dataset;if(element){this._setStyle(element,undefined,'active',false);}} -_setDatasetHoverStyle(){const element=this._cachedMeta.dataset;if(element){this._setStyle(element,undefined,'active',true);}} -_resyncElements(resetNewElements){const me=this;const data=me._data;const elements=me._cachedMeta.data;for(const[method,arg1,arg2]of me._syncList){me[method](arg1,arg2);} -me._syncList=[];const numMeta=elements.length;const numData=data.length;const count=Math.min(numData,numMeta);if(count){me.parse(0,count);} -if(numData>numMeta){me._insertElements(numMeta,numData-numMeta,resetNewElements);}else if(numData{arr.length+=count;for(i=arr.length-1;i>=end;i--){arr[i]=arr[i-count];}};move(data);for(i=start;i{ret[prop]=anims[prop]&&anims[prop].active()?anims[prop]._to:me[prop];});return ret;}} -Element.defaults={};Element.defaultRoutes=undefined;const formatters={values(value){return isArray(value)?value:''+value;},numeric(tickValue,index,ticks){if(tickValue===0){return'0';} -const locale=this.chart.options.locale;let notation;let delta=tickValue;if(ticks.length>1){const maxTick=Math.max(Math.abs(ticks[0].value),Math.abs(ticks[ticks.length-1].value));if(maxTick<1e-4||maxTick>1e+15){notation='scientific';} -delta=calculateDelta(tickValue,ticks);} -const logDelta=log10(Math.abs(delta));const numDecimal=Math.max(Math.min(-1*Math.floor(logDelta),20),0);const options={notation,minimumFractionDigits:numDecimal,maximumFractionDigits:numDecimal};Object.assign(options,this.options.ticks.format);return formatNumber(tickValue,locale,options);},logarithmic(tickValue,index,ticks){if(tickValue===0){return'0';} -const remain=tickValue/(Math.pow(10,Math.floor(log10(tickValue))));if(remain===1||remain===2||remain===5){return formatters.numeric.call(this,tickValue,index,ticks);} -return'';}};function calculateDelta(tickValue,ticks){let delta=ticks.length>3?ticks[2].value-ticks[1].value:ticks[1].value-ticks[0].value;if(Math.abs(delta)>=1&&tickValue!==Math.floor(tickValue)){delta=tickValue-Math.floor(tickValue);} -return delta;} -var Ticks={formatters};defaults.set('scale',{display:true,offset:false,reverse:false,beginAtZero:false,bounds:'ticks',grace:0,grid:{display:true,lineWidth:1,drawBorder:true,drawOnChartArea:true,drawTicks:true,tickLength:8,tickWidth:(_ctx,options)=>options.lineWidth,tickColor:(_ctx,options)=>options.color,offset:false,borderDash:[],borderDashOffset:0.0,borderWidth:1},title:{display:false,text:'',padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:false,textStrokeWidth:0,textStrokeColor:'',padding:3,display:true,autoSkip:true,autoSkipPadding:3,labelOffset:0,callback:Ticks.formatters.values,minor:{},major:{},align:'center',crossAlign:'near',showLabelBackdrop:false,backdropColor:'rgba(255, 255, 255, 0.75)',backdropPadding:2,}});defaults.route('scale.ticks','color','','color');defaults.route('scale.grid','color','','borderColor');defaults.route('scale.grid','borderColor','','borderColor');defaults.route('scale.title','color','','color');defaults.describe('scale',{_fallback:false,_scriptable:(name)=>!name.startsWith('before')&&!name.startsWith('after')&&name!=='callback'&&name!=='parser',_indexable:(name)=>name!=='borderDash'&&name!=='tickBorderDash',});defaults.describe('scales',{_fallback:'scale',});defaults.describe('scale.ticks',{_scriptable:(name)=>name!=='backdropPadding'&&name!=='callback',_indexable:(name)=>name!=='backdropPadding',});function autoSkip(scale,ticks){const tickOpts=scale.options.ticks;const ticksLimit=tickOpts.maxTicksLimit||determineMaxTicks(scale);const majorIndices=tickOpts.major.enabled?getMajorIndices(ticks):[];const numMajorIndices=majorIndices.length;const first=majorIndices[0];const last=majorIndices[numMajorIndices-1];const newTicks=[];if(numMajorIndices>ticksLimit){skipMajors(ticks,newTicks,majorIndices,numMajorIndices/ticksLimit);return newTicks;} -const spacing=calculateSpacing(majorIndices,ticks,ticksLimit);if(numMajorIndices>0){let i,ilen;const avgMajorSpacing=numMajorIndices>1?Math.round((last-first)/(numMajorIndices-1)):null;skip(ticks,newTicks,spacing,isNullOrUndef(avgMajorSpacing)?0:first-avgMajorSpacing,first);for(i=0,ilen=numMajorIndices-1;ispacing){return factor;}} -return Math.max(spacing,1);} -function getMajorIndices(ticks){const result=[];let i,ilen;for(i=0,ilen=ticks.length;ialign==='left'?'right':align==='right'?'left':align;const offsetFromEdge=(scale,edge,offset)=>edge==='top'||edge==='left'?scale[edge]+offset:scale[edge]-offset;function sample(arr,numItems){const result=[];const increment=arr.length/numItems;const len=arr.length;let i=0;for(;iend+epsilon){return;}} -return lineValue;} -function garbageCollect(caches,length){each(caches,(cache)=>{const gc=cache.gc;const gcLen=gc.length/2;let i;if(gcLen>length){for(i=0;i=maxRotation||numTicks<=1||!me.isHorizontal()){me.labelRotation=minRotation;return;} -const labelSizes=me._getLabelSizes();const maxLabelWidth=labelSizes.widest.width;const maxLabelHeight=labelSizes.highest.height;const maxWidth=_limitValue(me.chart.width-maxLabelWidth,0,me.maxWidth);tickWidth=options.offset?me.maxWidth/numTicks:maxWidth/(numTicks-1);if(maxLabelWidth+6>tickWidth){tickWidth=maxWidth/(numTicks-(options.offset?0.5:1));maxHeight=me.maxHeight-getTickMarkLength(options.grid) --tickOpts.padding-getTitleHeight(options.title,me.chart.options.font);maxLabelDiagonal=Math.sqrt(maxLabelWidth*maxLabelWidth+maxLabelHeight*maxLabelHeight);labelRotation=toDegrees(Math.min(Math.asin(_limitValue((labelSizes.highest.height+6)/tickWidth,-1,1)),Math.asin(_limitValue(maxHeight/maxLabelDiagonal,-1,1))-Math.asin(_limitValue(maxLabelHeight/maxLabelDiagonal,-1,1))));labelRotation=Math.max(minRotation,Math.min(maxRotation,labelRotation));} -me.labelRotation=labelRotation;} -afterCalculateLabelRotation(){callback(this.options.afterCalculateLabelRotation,[this]);} -beforeFit(){callback(this.options.beforeFit,[this]);} -fit(){const me=this;const minSize={width:0,height:0};const{chart,options:{ticks:tickOpts,title:titleOpts,grid:gridOpts}}=me;const display=me._isVisible();const isHorizontal=me.isHorizontal();if(display){const titleHeight=getTitleHeight(titleOpts,chart.options.font);if(isHorizontal){minSize.width=me.maxWidth;minSize.height=getTickMarkLength(gridOpts)+titleHeight;}else{minSize.height=me.maxHeight;minSize.width=getTickMarkLength(gridOpts)+titleHeight;} -if(tickOpts.display&&me.ticks.length){const{first,last,widest,highest}=me._getLabelSizes();const tickPadding=tickOpts.padding*2;const angleRadians=toRadians(me.labelRotation);const cos=Math.cos(angleRadians);const sin=Math.sin(angleRadians);if(isHorizontal){const labelHeight=tickOpts.mirror?0:sin*widest.width+cos*highest.height;minSize.height=Math.min(me.maxHeight,minSize.height+labelHeight+tickPadding);}else{const labelWidth=tickOpts.mirror?0:cos*widest.width+sin*highest.height;minSize.width=Math.min(me.maxWidth,minSize.width+labelWidth+tickPadding);} -me._calculatePadding(first,last,sin,cos);}} -me._handleMargins();if(isHorizontal){me.width=me._length=chart.width-me._margins.left-me._margins.right;me.height=minSize.height;}else{me.width=minSize.width;me.height=me._length=chart.height-me._margins.top-me._margins.bottom;}} -_calculatePadding(first,last,sin,cos){const me=this;const{ticks:{align,padding},position}=me.options;const isRotated=me.labelRotation!==0;const labelsBelowTicks=position!=='top'&&me.axis==='x';if(me.isHorizontal()){const offsetLeft=me.getPixelForTick(0)-me.left;const offsetRight=me.right-me.getPixelForTick(me.ticks.length-1);let paddingLeft=0;let paddingRight=0;if(isRotated){if(labelsBelowTicks){paddingLeft=cos*first.width;paddingRight=sin*last.height;}else{paddingLeft=sin*first.height;paddingRight=cos*last.width;}}else if(align==='start'){paddingRight=last.width;}else if(align==='end'){paddingLeft=first.width;}else{paddingLeft=first.width/2;paddingRight=last.width/2;} -me.paddingLeft=Math.max((paddingLeft-offsetLeft+padding)*me.width/(me.width-offsetLeft),0);me.paddingRight=Math.max((paddingRight-offsetRight+padding)*me.width/(me.width-offsetRight),0);}else{let paddingTop=last.height/2;let paddingBottom=first.height/2;if(align==='start'){paddingTop=0;paddingBottom=first.height;}else if(align==='end'){paddingTop=last.height;paddingBottom=0;} -me.paddingTop=paddingTop+padding;me.paddingBottom=paddingBottom+padding;}} -_handleMargins(){const me=this;if(me._margins){me._margins.left=Math.max(me.paddingLeft,me._margins.left);me._margins.top=Math.max(me.paddingTop,me._margins.top);me._margins.right=Math.max(me.paddingRight,me._margins.right);me._margins.bottom=Math.max(me.paddingBottom,me._margins.bottom);}} -afterFit(){callback(this.options.afterFit,[this]);} -isHorizontal(){const{axis,position}=this.options;return position==='top'||position==='bottom'||axis==='x';} -isFullSize(){return this.options.fullSize;} -_convertTicksToLabels(ticks){const me=this;me.beforeTickToLabelConversion();me.generateTickLabels(ticks);let i,ilen;for(i=0,ilen=ticks.length;i({width:widths[idx]||0,height:heights[idx]||0});return{first:valueAt(0),last:valueAt(length-1),widest:valueAt(widest),highest:valueAt(highest),widths,heights,};} -getLabelForValue(value){return value;} -getPixelForValue(value,index){return NaN;} -getValueForPixel(pixel){} -getPixelForTick(index){const ticks=this.ticks;if(index<0||index>ticks.length-1){return null;} -return this.getPixelForValue(ticks[index].value);} -getPixelForDecimal(decimal){const me=this;if(me._reversePixels){decimal=1-decimal;} -const pixel=me._startPixel+decimal*me._length;return _int16Range(me._alignToPixels?_alignPixel(me.chart,pixel,0):pixel);} -getDecimalForPixel(pixel){const decimal=(pixel-this._startPixel)/this._length;return this._reversePixels?1-decimal:decimal;} -getBasePixel(){return this.getPixelForValue(this.getBaseValue());} -getBaseValue(){const{min,max}=this;return min<0&&max<0?max:min>0&&max>0?min:0;} -getContext(index){const me=this;const ticks=me.ticks||[];if(index>=0&&indexw*sin?w/cos:h/sin:h*sin0;} -_computeGridLineItems(chartArea){const me=this;const axis=me.axis;const chart=me.chart;const options=me.options;const{grid,position}=options;const offset=grid.offset;const isHorizontal=me.isHorizontal();const ticks=me.ticks;const ticksLength=ticks.length+(offset?1:0);const tl=getTickMarkLength(grid);const items=[];const borderOpts=grid.setContext(me.getContext());const axisWidth=borderOpts.drawBorder?borderOpts.borderWidth:0;const axisHalfWidth=axisWidth/2;const alignBorderValue=function(pixel){return _alignPixel(chart,pixel,axisWidth);};let borderValue,i,lineValue,alignedLineValue;let tx1,ty1,tx2,ty2,x1,y1,x2,y2;if(position==='top'){borderValue=alignBorderValue(me.bottom);ty1=me.bottom-tl;ty2=borderValue-axisHalfWidth;y1=alignBorderValue(chartArea.top)+axisHalfWidth;y2=chartArea.bottom;}else if(position==='bottom'){borderValue=alignBorderValue(me.top);y1=chartArea.top;y2=alignBorderValue(chartArea.bottom)-axisHalfWidth;ty1=borderValue+axisHalfWidth;ty2=me.top+tl;}else if(position==='left'){borderValue=alignBorderValue(me.right);tx1=me.right-tl;tx2=borderValue-axisHalfWidth;x1=alignBorderValue(chartArea.left)+axisHalfWidth;x2=chartArea.right;}else if(position==='right'){borderValue=alignBorderValue(me.left);x1=chartArea.left;x2=alignBorderValue(chartArea.right)-axisHalfWidth;tx1=borderValue+axisHalfWidth;tx2=me.left+tl;}else if(axis==='x'){if(position==='center'){borderValue=alignBorderValue((chartArea.top+chartArea.bottom)/2+0.5);}else if(isObject(position)){const positionAxisID=Object.keys(position)[0];const value=position[positionAxisID];borderValue=alignBorderValue(me.chart.scales[positionAxisID].getPixelForValue(value));} -y1=chartArea.top;y2=chartArea.bottom;ty1=borderValue+axisHalfWidth;ty2=ty1+tl;}else if(axis==='y'){if(position==='center'){borderValue=alignBorderValue((chartArea.left+chartArea.right)/2);}else if(isObject(position)){const positionAxisID=Object.keys(position)[0];const value=position[positionAxisID];borderValue=alignBorderValue(me.chart.scales[positionAxisID].getPixelForValue(value));} -tx1=borderValue-axisHalfWidth;tx2=tx1-tl;x1=chartArea.left;x2=chartArea.right;} -const limit=valueOrDefault(options.ticks.maxTicksLimit,ticksLength);const step=Math.max(1,Math.ceil(ticksLength/limit));for(i=0;it.value===value);if(index>=0){const opts=grid.setContext(me.getContext(index));return opts.lineWidth;} -return 0;} -drawGrid(chartArea){const me=this;const grid=me.options.grid;const ctx=me.ctx;const items=me._gridLineItems||(me._gridLineItems=me._computeGridLineItems(chartArea));let i,ilen;const drawLine=(p1,p2,style)=>{if(!style.width||!style.color){return;} -ctx.save();ctx.lineWidth=style.width;ctx.strokeStyle=style.color;ctx.setLineDash(style.borderDash||[]);ctx.lineDashOffset=style.borderDashOffset;ctx.beginPath();ctx.moveTo(p1.x,p1.y);ctx.lineTo(p2.x,p2.y);ctx.stroke();ctx.restore();};if(grid.display){for(i=0,ilen=items.length;i{const propertyParts=property.split('.');const sourceName=propertyParts.pop();const sourceScope=[scope].concat(propertyParts).join('.');const parts=routes[property].split('.');const targetName=parts.pop();const targetScope=parts.join('.');defaults.route(sourceScope,sourceName,targetScope,targetName);});} -function isIChartComponent(proto){return'id'in proto&&'defaults'in proto;} -class Registry{constructor(){this.controllers=new TypedRegistry(DatasetController,'datasets',true);this.elements=new TypedRegistry(Element,'elements');this.plugins=new TypedRegistry(Object,'plugins');this.scales=new TypedRegistry(Scale,'scales');this._typedRegistries=[this.controllers,this.scales,this.elements];} -add(...args){this._each('register',args);} -remove(...args){this._each('unregister',args);} -addControllers(...args){this._each('register',args,this.controllers);} -addElements(...args){this._each('register',args,this.elements);} -addPlugins(...args){this._each('register',args,this.plugins);} -addScales(...args){this._each('register',args,this.scales);} -getController(id){return this._get(id,this.controllers,'controller');} -getElement(id){return this._get(id,this.elements,'element');} -getPlugin(id){return this._get(id,this.plugins,'plugin');} -getScale(id){return this._get(id,this.scales,'scale');} -removeControllers(...args){this._each('unregister',args,this.controllers);} -removeElements(...args){this._each('unregister',args,this.elements);} -removePlugins(...args){this._each('unregister',args,this.plugins);} -removeScales(...args){this._each('unregister',args,this.scales);} -_each(method,args,typedRegistry){const me=this;[...args].forEach(arg=>{const reg=typedRegistry||me._getRegistryForType(arg);if(typedRegistry||reg.isForType(arg)||(reg===me.plugins&&arg.id)){me._exec(method,reg,arg);}else{each(arg,item=>{const itemReg=typedRegistry||me._getRegistryForType(item);me._exec(method,itemReg,item);});}});} -_exec(method,registry,component){const camelMethod=_capitalize(method);callback(component['before'+camelMethod],[],component);registry[method](component);callback(component['after'+camelMethod],[],component);} -_getRegistryForType(type){for(let i=0;ia.filter(x=>!b.some(y=>x.plugin.id===y.plugin.id));this._notify(diff(previousDescriptors,descriptors),chart,'stop');this._notify(diff(descriptors,previousDescriptors),chart,'start');}} -function allPlugins(config){const plugins=[];const keys=Object.keys(registry.plugins.items);for(let i=0;i{const scaleConf=configScales[id];const axis=determineAxis(id,scaleConf);const defaultId=getDefaultScaleIDFromAxis(axis,chartIndexAxis);const defaultScaleOptions=chartDefaults.scales||{};firstIDs[axis]=firstIDs[axis]||id;scales[id]=mergeIf(Object.create(null),[{axis},scaleConf,defaultScaleOptions[axis],defaultScaleOptions[defaultId]]);});config.data.datasets.forEach(dataset=>{const type=dataset.type||config.type;const indexAxis=dataset.indexAxis||getIndexAxis(type,options);const datasetDefaults=overrides[type]||{};const defaultScaleOptions=datasetDefaults.scales||{};Object.keys(defaultScaleOptions).forEach(defaultID=>{const axis=getAxisFromDefaultScaleID(defaultID,indexAxis);const id=dataset[axis+'AxisID']||firstIDs[axis]||axis;scales[id]=scales[id]||Object.create(null);mergeIf(scales[id],[{axis},configScales[id],defaultScaleOptions[defaultID]]);});});Object.keys(scales).forEach(key=>{const scale=scales[key];mergeIf(scale,[defaults.scales[scale.type],defaults.scale]);});return scales;} -function initOptions(config){const options=config.options||(config.options={});options.plugins=valueOrDefault(options.plugins,{});options.scales=mergeScaleConfig(config,options);} -function initData(data){data=data||{};data.datasets=data.datasets||[];data.labels=data.labels||[];return data;} -function initConfig(config){config=config||{};config.data=initData(config.data);initOptions(config);return config;} -const keyCache=new Map();const keysCached=new Set();function cachedKeys(cacheKey,generate){let keys=keyCache.get(cacheKey);if(!keys){keys=generate();keyCache.set(cacheKey,keys);keysCached.add(keys);} -return keys;} -const addIfFound=(set,obj,key)=>{const opts=resolveObjectKey(obj,key);if(opts!==undefined){set.add(opts);}};class Config{constructor(config){this._config=initConfig(config);this._scopeCache=new Map();this._resolverCache=new Map();} -get platform(){return this._config.platform;} -get type(){return this._config.type;} -set type(type){this._config.type=type;} -get data(){return this._config.data;} -set data(data){this._config.data=initData(data);} -get options(){return this._config.options;} -set options(options){this._config.options=options;} -get plugins(){return this._config.plugins;} -update(){const config=this._config;this.clearCache();initOptions(config);} -clearCache(){this._scopeCache.clear();this._resolverCache.clear();} -datasetScopeKeys(datasetType){return cachedKeys(datasetType,()=>[[`datasets.${datasetType}`,'']]);} -datasetAnimationScopeKeys(datasetType,transition){return cachedKeys(`${datasetType}.transition.${transition}`,()=>[[`datasets.${datasetType}.transitions.${transition}`,`transitions.${transition}`,],[`datasets.${datasetType}`,'']]);} -datasetElementScopeKeys(datasetType,elementType){return cachedKeys(`${datasetType}-${elementType}`,()=>[[`datasets.${datasetType}.elements.${elementType}`,`datasets.${datasetType}`,`elements.${elementType}`,'']]);} -pluginScopeKeys(plugin){const id=plugin.id;const type=this.type;return cachedKeys(`${type}-plugin-${id}`,()=>[[`plugins.${id}`,...plugin.additionalOptionScopes||[],]]);} -_cachedScopes(mainScope,resetCache){const _scopeCache=this._scopeCache;let cache=_scopeCache.get(mainScope);if(!cache||resetCache){cache=new Map();_scopeCache.set(mainScope,cache);} -return cache;} -getOptionScopes(mainScope,keyLists,resetCache){const{options,type}=this;const cache=this._cachedScopes(mainScope,resetCache);const cached=cache.get(keyLists);if(cached){return cached;} -const scopes=new Set();keyLists.forEach(keys=>{if(mainScope){scopes.add(mainScope);keys.forEach(key=>addIfFound(scopes,mainScope,key));} -keys.forEach(key=>addIfFound(scopes,options,key));keys.forEach(key=>addIfFound(scopes,overrides[type]||{},key));keys.forEach(key=>addIfFound(scopes,defaults,key));keys.forEach(key=>addIfFound(scopes,descriptors,key));});const array=Array.from(scopes);if(array.length===0){array.push(Object.create(null));} -if(keysCached.has(keyLists)){cache.set(keyLists,array);} -return array;} -chartOptionScopes(){const{options,type}=this;return[options,overrides[type]||{},defaults.datasets[type]||{},{type},defaults,descriptors];} -resolveNamedOptions(scopes,names,context,prefixes=['']){const result={$shared:true};const{resolver,subPrefixes}=getResolver(this._resolverCache,scopes,prefixes);let options=resolver;if(needContext(resolver,names)){result.$shared=false;context=isFunction(context)?context():context;const subResolver=this.createResolver(scopes,context,subPrefixes);options=_attachContext(resolver,context,subResolver);} -for(const prop of names){result[prop]=options[prop];} -return result;} -createResolver(scopes,context,prefixes=[''],descriptorDefaults){const{resolver}=getResolver(this._resolverCache,scopes,prefixes);return isObject(context)?_attachContext(resolver,context,undefined,descriptorDefaults):resolver;}} -function getResolver(resolverCache,scopes,prefixes){let cache=resolverCache.get(scopes);if(!cache){cache=new Map();resolverCache.set(scopes,cache);} -const cacheKey=prefixes.join();let cached=cache.get(cacheKey);if(!cached){const resolver=_createResolver(scopes,prefixes);cached={resolver,subPrefixes:prefixes.filter(p=>!p.toLowerCase().includes('hover'))};cache.set(cacheKey,cached);} -return cached;} -function needContext(proxy,names){const{isScriptable,isIndexable}=_descriptors(proxy);for(const prop of names){if((isScriptable(prop)&&isFunction(proxy[prop]))||(isIndexable(prop)&&isArray(proxy[prop]))){return true;}} -return false;} -var version="3.5.1";const KNOWN_POSITIONS=['top','bottom','left','right','chartArea'];function positionIsHorizontal(position,axis){return position==='top'||position==='bottom'||(KNOWN_POSITIONS.indexOf(position)===-1&&axis==='x');} -function compare2Level(l1,l2){return function(a,b){return a[l1]===b[l1]?a[l2]-b[l2]:a[l1]-b[l1];};} -function onAnimationsComplete(context){const chart=context.chart;const animationOptions=chart.options.animation;chart.notifyPlugins('afterRender');callback(animationOptions&&animationOptions.onComplete,[context],chart);} -function onAnimationProgress(context){const chart=context.chart;const animationOptions=chart.options.animation;callback(animationOptions&&animationOptions.onProgress,[context],chart);} -function getCanvas(item){if(_isDomSupported()&&typeof item==='string'){item=document.getElementById(item);}else if(item&&item.length){item=item[0];} -if(item&&item.canvas){item=item.canvas;} -return item;} -const instances={};const getChart=(key)=>{const canvas=getCanvas(key);return Object.values(instances).filter((c)=>c.canvas===canvas).pop();};class Chart{constructor(item,userConfig){const me=this;const config=this.config=new Config(userConfig);const initialCanvas=getCanvas(item);const existingChart=getChart(initialCanvas);if(existingChart){throw new Error('Canvas is already in use. Chart with ID \''+existingChart.id+'\''+' must be destroyed before the canvas can be reused.');} -const options=config.createResolver(config.chartOptionScopes(),me.getContext());this.platform=new(config.platform||_detectPlatform(initialCanvas))();const context=me.platform.acquireContext(initialCanvas,options.aspectRatio);const canvas=context&&context.canvas;const height=canvas&&canvas.height;const width=canvas&&canvas.width;this.id=uid();this.ctx=context;this.canvas=canvas;this.width=width;this.height=height;this._options=options;this._aspectRatio=this.aspectRatio;this._layers=[];this._metasets=[];this._stacks=undefined;this.boxes=[];this.currentDevicePixelRatio=undefined;this.chartArea=undefined;this._active=[];this._lastEvent=undefined;this._listeners={};this._responsiveListeners=undefined;this._sortedMetasets=[];this.scales={};this._plugins=new PluginService();this.$proxies={};this._hiddenIndices={};this.attached=false;this._animationsDisabled=undefined;this.$context=undefined;this._doResize=debounce(()=>this.update('resize'),options.resizeDelay||0);instances[me.id]=me;if(!context||!canvas){console.error("Failed to create chart: can't acquire context from the given item");return;} -animator.listen(me,'complete',onAnimationsComplete);animator.listen(me,'progress',onAnimationProgress);me._initialize();if(me.attached){me.update();}} -get aspectRatio(){const{options:{aspectRatio,maintainAspectRatio},width,height,_aspectRatio}=this;if(!isNullOrUndef(aspectRatio)){return aspectRatio;} -if(maintainAspectRatio&&_aspectRatio){return _aspectRatio;} -return height?width/height:null;} -get data(){return this.config.data;} -set data(data){this.config.data=data;} -get options(){return this._options;} -set options(options){this.config.options=options;} -_initialize(){const me=this;me.notifyPlugins('beforeInit');if(me.options.responsive){me.resize();}else{retinaScale(me,me.options.devicePixelRatio);} -me.bindEvents();me.notifyPlugins('afterInit');return me;} -clear(){clearCanvas(this.canvas,this.ctx);return this;} -stop(){animator.stop(this);return this;} -resize(width,height){if(!animator.running(this)){this._resize(width,height);}else{this._resizeBeforeDraw={width,height};}} -_resize(width,height){const me=this;const options=me.options;const canvas=me.canvas;const aspectRatio=options.maintainAspectRatio&&me.aspectRatio;const newSize=me.platform.getMaximumSize(canvas,width,height,aspectRatio);const newRatio=options.devicePixelRatio||me.platform.getDevicePixelRatio();me.width=newSize.width;me.height=newSize.height;me._aspectRatio=me.aspectRatio;if(!retinaScale(me,newRatio,true)){return;} -me.notifyPlugins('resize',{size:newSize});callback(options.onResize,[me,newSize],me);if(me.attached){if(me._doResize()){me.render();}}} -ensureScalesHaveIDs(){const options=this.options;const scalesOptions=options.scales||{};each(scalesOptions,(axisOptions,axisID)=>{axisOptions.id=axisID;});} -buildOrUpdateScales(){const me=this;const options=me.options;const scaleOpts=options.scales;const scales=me.scales;const updated=Object.keys(scales).reduce((obj,id)=>{obj[id]=false;return obj;},{});let items=[];if(scaleOpts){items=items.concat(Object.keys(scaleOpts).map((id)=>{const scaleOptions=scaleOpts[id];const axis=determineAxis(id,scaleOptions);const isRadial=axis==='r';const isHorizontal=axis==='x';return{options:scaleOptions,dposition:isRadial?'chartArea':isHorizontal?'bottom':'left',dtype:isRadial?'radialLinear':isHorizontal?'category':'linear'};}));} -each(items,(item)=>{const scaleOptions=item.options;const id=scaleOptions.id;const axis=determineAxis(id,scaleOptions);const scaleType=valueOrDefault(scaleOptions.type,item.dtype);if(scaleOptions.position===undefined||positionIsHorizontal(scaleOptions.position,axis)!==positionIsHorizontal(item.dposition)){scaleOptions.position=item.dposition;} -updated[id]=true;let scale=null;if(id in scales&&scales[id].type===scaleType){scale=scales[id];}else{const scaleClass=registry.getScale(scaleType);scale=new scaleClass({id,type:scaleType,ctx:me.ctx,chart:me});scales[scale.id]=scale;} -scale.init(scaleOptions,options);});each(updated,(hasUpdated,id)=>{if(!hasUpdated){delete scales[id];}});each(scales,(scale)=>{layouts.configure(me,scale,scale.options);layouts.addBox(me,scale);});} -_updateMetasets(){const me=this;const metasets=me._metasets;const numData=me.data.datasets.length;const numMeta=metasets.length;metasets.sort((a,b)=>a.index-b.index);if(numMeta>numData){for(let i=numData;idatasets.length){delete me._stacks;} -metasets.forEach((meta,index)=>{if(datasets.filter(x=>x===meta._dataset).length===0){me._destroyDatasetMeta(index);}});} -buildOrUpdateControllers(){const me=this;const newControllers=[];const datasets=me.data.datasets;let i,ilen;me._removeUnreferencedMetasets();for(i=0,ilen=datasets.length;i{me.getDatasetMeta(datasetIndex).controller.reset();},me);} -reset(){this._resetElements();this.notifyPlugins('reset');} -update(mode){const me=this;const config=me.config;config.update();me._options=config.createResolver(config.chartOptionScopes(),me.getContext());each(me.scales,(scale)=>{layouts.removeBox(me,scale);});const animsDisabled=me._animationsDisabled=!me.options.animation;me.ensureScalesHaveIDs();me.buildOrUpdateScales();const existingEvents=new Set(Object.keys(me._listeners));const newEvents=new Set(me.options.events);if(!setsEqual(existingEvents,newEvents)||!!this._responsiveListeners!==me.options.responsive){me.unbindEvents();me.bindEvents();} -me._plugins.invalidate();if(me.notifyPlugins('beforeUpdate',{mode,cancelable:true})===false){return;} -const newControllers=me.buildOrUpdateControllers();me.notifyPlugins('beforeElementsUpdate');let minPadding=0;for(let i=0,ilen=me.data.datasets.length;i{controller.reset();});} -me._updateDatasets(mode);me.notifyPlugins('afterUpdate',{mode});me._layers.sort(compare2Level('z','_idx'));if(me._lastEvent){me._eventHandler(me._lastEvent,true);} -me.render();} -_updateLayout(minPadding){const me=this;if(me.notifyPlugins('beforeLayout',{cancelable:true})===false){return;} -layouts.update(me,me.width,me.height,minPadding);const area=me.chartArea;const noArea=area.width<=0||area.height<=0;me._layers=[];each(me.boxes,(box)=>{if(noArea&&box.position==='chartArea'){return;} -if(box.configure){box.configure();} -me._layers.push(...box._layers());},me);me._layers.forEach((item,index)=>{item._idx=index;});me.notifyPlugins('afterLayout');} -_updateDatasets(mode){const me=this;const isFunction=typeof mode==='function';if(me.notifyPlugins('beforeDatasetsUpdate',{mode,cancelable:true})===false){return;} -for(let i=0,ilen=me.data.datasets.length;i=0;--i){me._drawDataset(metasets[i]);} -me.notifyPlugins('afterDatasetsDraw');} -_drawDataset(meta){const me=this;const ctx=me.ctx;const clip=meta._clip;const useClip=!clip.disabled;const area=me.chartArea;const args={meta,index:meta.index,cancelable:true};if(me.notifyPlugins('beforeDatasetDraw',args)===false){return;} -if(useClip){clipArea(ctx,{left:clip.left===false?0:area.left-clip.left,right:clip.right===false?me.width:area.right+clip.right,top:clip.top===false?0:area.top-clip.top,bottom:clip.bottom===false?me.height:area.bottom+clip.bottom});} -meta.controller.draw();if(useClip){unclipArea(ctx);} -args.cancelable=false;me.notifyPlugins('afterDatasetDraw',args);} -getElementsAtEventForMode(e,mode,options,useFinalPosition){const method=Interaction.modes[mode];if(typeof method==='function'){return method(this,e,options,useFinalPosition);} -return[];} -getDatasetMeta(datasetIndex){const me=this;const dataset=me.data.datasets[datasetIndex];const metasets=me._metasets;let meta=metasets.filter(x=>x&&x._dataset===dataset).pop();if(!meta){meta={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:dataset&&dataset.order||0,index:datasetIndex,_dataset:dataset,_parsed:[],_sorted:false};metasets.push(meta);} -return meta;} -getContext(){return this.$context||(this.$context={chart:this,type:'chart'});} -getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length;} -isDatasetVisible(datasetIndex){const dataset=this.data.datasets[datasetIndex];if(!dataset){return false;} -const meta=this.getDatasetMeta(datasetIndex);return typeof meta.hidden==='boolean'?!meta.hidden:!dataset.hidden;} -setDatasetVisibility(datasetIndex,visible){const meta=this.getDatasetMeta(datasetIndex);meta.hidden=!visible;} -toggleDataVisibility(index){this._hiddenIndices[index]=!this._hiddenIndices[index];} -getDataVisibility(index){return!this._hiddenIndices[index];} -_updateVisibility(datasetIndex,dataIndex,visible){const me=this;const mode=visible?'show':'hide';const meta=me.getDatasetMeta(datasetIndex);const anims=meta.controller._resolveAnimations(undefined,mode);if(defined(dataIndex)){meta.data[dataIndex].hidden=!visible;me.update();}else{me.setDatasetVisibility(datasetIndex,visible);anims.update(meta,{visible});me.update((ctx)=>ctx.datasetIndex===datasetIndex?mode:undefined);}} -hide(datasetIndex,dataIndex){this._updateVisibility(datasetIndex,dataIndex,false);} -show(datasetIndex,dataIndex){this._updateVisibility(datasetIndex,dataIndex,true);} -_destroyDatasetMeta(datasetIndex){const me=this;const meta=me._metasets&&me._metasets[datasetIndex];if(meta&&meta.controller){meta.controller._destroy();delete me._metasets[datasetIndex];}} -destroy(){const me=this;const{canvas,ctx}=me;let i,ilen;me.stop();animator.remove(me);for(i=0,ilen=me.data.datasets.length;i{platform.addEventListener(me,type,listener);listeners[type]=listener;};const listener=function(e,x,y){e.offsetX=x;e.offsetY=y;me._eventHandler(e);};each(me.options.events,(type)=>_add(type,listener));} -bindResponsiveEvents(){const me=this;if(!me._responsiveListeners){me._responsiveListeners={};} -const listeners=me._responsiveListeners;const platform=me.platform;const _add=(type,listener)=>{platform.addEventListener(me,type,listener);listeners[type]=listener;};const _remove=(type,listener)=>{if(listeners[type]){platform.removeEventListener(me,type,listener);delete listeners[type];}};const listener=(width,height)=>{if(me.canvas){me.resize(width,height);}};let detached;const attached=()=>{_remove('attach',attached);me.attached=true;me.resize();_add('resize',listener);_add('detach',detached);};detached=()=>{me.attached=false;_remove('resize',listener);_add('attach',attached);};if(platform.isAttached(me.canvas)){attached();}else{detached();}} -unbindEvents(){const me=this;each(me._listeners,(listener,type)=>{me.platform.removeEventListener(me,type,listener);});me._listeners={};each(me._responsiveListeners,(listener,type)=>{me.platform.removeEventListener(me,type,listener);});me._responsiveListeners=undefined;} -updateHoverStyle(items,mode,enabled){const prefix=enabled?'set':'remove';let meta,item,i,ilen;if(mode==='dataset'){meta=this.getDatasetMeta(items[0].datasetIndex);meta.controller['_'+prefix+'DatasetHoverStyle']();} -for(i=0,ilen=items.length;i{const meta=me.getDatasetMeta(datasetIndex);if(!meta){throw new Error('No dataset found at index '+datasetIndex);} -return{datasetIndex,element:meta.data[index],index,};});const changed=!_elementsEqual(active,lastActive);if(changed){me._active=active;me._updateHoverStyles(active,lastActive);}} -notifyPlugins(hook,args,filter){return this._plugins.notify(this,hook,args,filter);} -_updateHoverStyles(active,lastActive,replay){const me=this;const hoverOptions=me.options.hover;const diff=(a,b)=>a.filter(x=>!b.some(y=>x.datasetIndex===y.datasetIndex&&x.index===y.index));const deactivated=diff(lastActive,active);const activated=replay?active:diff(active,lastActive);if(deactivated.length){me.updateHoverStyle(deactivated,hoverOptions.mode,false);} -if(activated.length&&hoverOptions.mode){me.updateHoverStyle(activated,hoverOptions.mode,true);}} -_eventHandler(e,replay){const me=this;const args={event:e,replay,cancelable:true};const eventFilter=(plugin)=>(plugin.options.events||this.options.events).includes(e.type);if(me.notifyPlugins('beforeEvent',args,eventFilter)===false){return;} -const changed=me._handleEvent(e,replay);args.cancelable=false;me.notifyPlugins('afterEvent',args,eventFilter);if(changed||args.changed){me.render();} -return me;} -_handleEvent(e,replay){const me=this;const{_active:lastActive=[],options}=me;const hoverOptions=options.hover;const useFinalPosition=replay;let active=[];let changed=false;let lastEvent=null;if(e.type!=='mouseout'){active=me.getElementsAtEventForMode(e,hoverOptions.mode,hoverOptions,useFinalPosition);lastEvent=e.type==='click'?me._lastEvent:e;} -me._lastEvent=null;if(_isPointInArea(e,me.chartArea,me._minPadding)){callback(options.onHover,[e,active,me],me);if(e.type==='mouseup'||e.type==='click'||e.type==='contextmenu'){callback(options.onClick,[e,active,me],me);}} -changed=!_elementsEqual(active,lastActive);if(changed||replay){me._active=active;me._updateHoverStyles(active,lastActive,replay);} -me._lastEvent=lastEvent;return changed;}} -const invalidatePlugins=()=>each(Chart.instances,(chart)=>chart._plugins.invalidate());const enumerable=true;Object.defineProperties(Chart,{defaults:{enumerable,value:defaults},instances:{enumerable,value:instances},overrides:{enumerable,value:overrides},registry:{enumerable,value:registry},version:{enumerable,value:version},getChart:{enumerable,value:getChart},register:{enumerable,value:(...items)=>{registry.add(...items);invalidatePlugins();}},unregister:{enumerable,value:(...items)=>{registry.remove(...items);invalidatePlugins();}}});function abstract(){throw new Error('This method is not implemented: Check that a complete date adapter is provided.');} -class DateAdapter{constructor(options){this.options=options||{};} -formats(){return abstract();} -parse(value,format){return abstract();} -format(timestamp,format){return abstract();} -add(timestamp,amount,unit){return abstract();} -diff(a,b,unit){return abstract();} -startOf(timestamp,unit,weekday){return abstract();} -endOf(timestamp,unit){return abstract();}} -DateAdapter.override=function(members){Object.assign(DateAdapter.prototype,members);};var _adapters={_date:DateAdapter};function getAllScaleValues(scale){if(!scale._cache.$bar){const metas=scale.getMatchingVisibleMetas('bar');let values=[];for(let i=0,ilen=metas.length;ia-b));} -return scale._cache.$bar;} -function computeMinSampleSize(scale){const values=getAllScaleValues(scale);let min=scale._length;let i,ilen,curr,prev;const updateMinAndPrev=()=>{if(curr===32767||curr===-32768){return;} -if(defined(prev)){min=Math.min(min,Math.abs(curr-prev)||min);} -prev=curr;};for(i=0,ilen=values.length;i0?pixels[index-1]:null;let next=indexMath.abs(max)){barStart=max;barEnd=min;} -item[vScale.axis]=barEnd;item._custom={barStart,barEnd,start:startValue,end:endValue,min,max};} -function parseValue(entry,item,vScale,i){if(isArray(entry)){parseFloatBar(entry,item,vScale,i);}else{item[vScale.axis]=vScale.parse(entry,i);} -return item;} -function parseArrayOrPrimitive(meta,data,start,count){const iScale=meta.iScale;const vScale=meta.vScale;const labels=iScale.getLabels();const singleScale=iScale===vScale;const parsed=[];let i,ilen,item,entry;for(i=start,ilen=start+count;i=actualBase?1:-1);} -function borderProps(properties){let reverse,start,end,top,bottom;if(properties.horizontal){reverse=properties.base>properties.x;start='left';end='right';}else{reverse=properties.base=0;--i){max=Math.max(max,data[i].size()/2,_parsed[i]._custom);} -return max>0&&max;} -getLabelAndValue(index){const me=this;const meta=me._cachedMeta;const{xScale,yScale}=meta;const parsed=me.getParsed(index);const x=xScale.getLabelForValue(parsed.x);const y=yScale.getLabelForValue(parsed.y);const r=parsed._custom;return{label:meta.label,value:'('+x+', '+y+(r?', '+r:'')+')'};} -update(mode){const me=this;const points=me._cachedMeta.data;me.updateElements(points,0,points.length,mode);} -updateElements(points,start,count,mode){const me=this;const reset=mode==='reset';const{iScale,vScale}=me._cachedMeta;const firstOpts=me.resolveDataElementOptions(start,mode);const sharedOptions=me.getSharedOptions(firstOpts);const includeOptions=me.includeOptions(mode,sharedOptions);const iAxis=iScale.axis;const vAxis=vScale.axis;for(let i=start;i_angleBetween(angle,startAngle,endAngle,true)?1:Math.max(a,a*cutout,b,b*cutout);const calcMin=(angle,a,b)=>_angleBetween(angle,startAngle,endAngle,true)?-1:Math.min(a,a*cutout,b,b*cutout);const maxX=calcMax(0,startX,endX);const maxY=calcMax(HALF_PI,startY,endY);const minX=calcMin(PI,startX,endX);const minY=calcMin(PI+HALF_PI,startY,endY);ratioX=(maxX-minX)/2;ratioY=(maxY-minY)/2;offsetX=-(maxX+minX)/2;offsetY=-(maxY+minY)/2;} -return{ratioX,ratioY,offsetX,offsetY};} -class DoughnutController extends DatasetController{constructor(chart,datasetIndex){super(chart,datasetIndex);this.enableOptionSharing=true;this.innerRadius=undefined;this.outerRadius=undefined;this.offsetX=undefined;this.offsetY=undefined;} -linkScales(){} -parse(start,count){const data=this.getDataset().data;const meta=this._cachedMeta;let i,ilen;for(i=start,ilen=start+count;i0&&!isNaN(value)){return TAU*(Math.abs(value)/total);} -return 0;} -getLabelAndValue(index){const me=this;const meta=me._cachedMeta;const chart=me.chart;const labels=chart.data.labels||[];const value=formatNumber(meta._parsed[index],chart.options.locale);return{label:labels[index]||'',value,};} -getMaxBorderWidth(arcs){const me=this;let max=0;const chart=me.chart;let i,ilen,meta,controller,options;if(!arcs){for(i=0,ilen=chart.data.datasets.length;iname!=='spacing',_indexable:(name)=>name!=='spacing',};DoughnutController.overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(chart){const data=chart.data;if(data.labels.length&&data.datasets.length){const{labels:{pointStyle}}=chart.legend.options;return data.labels.map((label,i)=>{const meta=chart.getDatasetMeta(0);const style=meta.controller.getStyle(i);return{text:label,fillStyle:style.backgroundColor,strokeStyle:style.borderColor,lineWidth:style.borderWidth,pointStyle:pointStyle,hidden:!chart.getDataVisibility(i),index:i};});} -return[];}},onClick(e,legendItem,legend){legend.chart.toggleDataVisibility(legendItem.index);legend.chart.update();}},tooltip:{callbacks:{title(){return'';},label(tooltipItem){let dataLabel=tooltipItem.label;const value=': '+tooltipItem.formattedValue;if(isArray(dataLabel)){dataLabel=dataLabel.slice();dataLabel[0]+=value;}else{dataLabel+=value;} -return dataLabel;}}}}};class LineController extends DatasetController{initialize(){this.enableOptionSharing=true;super.initialize();} -update(mode){const me=this;const meta=me._cachedMeta;const{dataset:line,data:points=[],_dataset}=meta;const animationsDisabled=me.chart._animationsDisabled;let{start,count}=getStartAndCountOfVisiblePoints(meta,points,animationsDisabled);me._drawStart=start;me._drawCount=count;if(scaleRangesChanged(meta)){start=0;count=points.length;} -line._datasetIndex=me.index;line._decimated=!!_dataset._decimated;line.points=points;const options=me.resolveDatasetElementOptions(mode);if(!me.options.showLine){options.borderWidth=0;} -options.segment=me.options.segment;me.updateElement(line,undefined,{animated:!animationsDisabled,options},mode);me.updateElements(points,start,count,mode);} -updateElements(points,start,count,mode){const me=this;const reset=mode==='reset';const{iScale,vScale,_stacked}=me._cachedMeta;const firstOpts=me.resolveDataElementOptions(start,mode);const sharedOptions=me.getSharedOptions(firstOpts);const includeOptions=me.includeOptions(mode,sharedOptions);const iAxis=iScale.axis;const vAxis=vScale.axis;const spanGaps=me.options.spanGaps;const maxGapLength=isNumber(spanGaps)?spanGaps:Number.POSITIVE_INFINITY;const directUpdate=me.chart._animationsDisabled||reset||mode==='none';let prevParsed=start>0&&me.getParsed(start-1);for(let i=start;i0&&(parsed[iAxis]-prevParsed[iAxis])>maxGapLength;properties.parsed=parsed;if(includeOptions){properties.options=sharedOptions||me.resolveDataElementOptions(i,point.active?'active':mode);} -if(!directUpdate){me.updateElement(point,i,properties,mode);} -prevParsed=parsed;} -me.updateSharedOptions(sharedOptions,mode,firstOpts);} -getMaxOverflow(){const me=this;const meta=me._cachedMeta;const dataset=meta.dataset;const border=dataset.options&&dataset.options.borderWidth||0;const data=meta.data||[];if(!data.length){return border;} -const firstPoint=data[0].size(me.resolveDataElementOptions(0));const lastPoint=data[data.length-1].size(me.resolveDataElementOptions(data.length-1));return Math.max(border,firstPoint,lastPoint)/2;} -draw(){const meta=this._cachedMeta;meta.dataset.updateControlPoints(this.chart.chartArea,meta.iScale.axis);super.draw();}} -LineController.id='line';LineController.defaults={datasetElementType:'line',dataElementType:'point',showLine:true,spanGaps:false,};LineController.overrides={scales:{_index_:{type:'category',},_value_:{type:'linear',},}};function getStartAndCountOfVisiblePoints(meta,points,animationsDisabled){const pointCount=points.length;let start=0;let count=pointCount;if(meta._sorted){const{iScale,_parsed}=meta;const axis=iScale.axis;const{min,max,minDefined,maxDefined}=iScale.getUserBounds();if(minDefined){start=_limitValue(Math.min(_lookupByKey(_parsed,iScale.axis,min).lo,animationsDisabled?pointCount:_lookupByKey(points,axis,iScale.getPixelForValue(min)).lo),0,pointCount-1);} -if(maxDefined){count=_limitValue(Math.max(_lookupByKey(_parsed,iScale.axis,max).hi+1,animationsDisabled?0:_lookupByKey(points,axis,iScale.getPixelForValue(max)).hi+1),start,pointCount)-start;}else{count=pointCount-start;}} -return{start,count};} -function scaleRangesChanged(meta){const{xScale,yScale,_scaleRanges}=meta;const newRanges={xmin:xScale.min,xmax:xScale.max,ymin:yScale.min,ymax:yScale.max};if(!_scaleRanges){meta._scaleRanges=newRanges;return true;} -const changed=_scaleRanges.xmin!==xScale.min||_scaleRanges.xmax!==xScale.max||_scaleRanges.ymin!==yScale.min||_scaleRanges.ymax!==yScale.max;Object.assign(_scaleRanges,newRanges);return changed;} -class PolarAreaController extends DatasetController{constructor(chart,datasetIndex){super(chart,datasetIndex);this.innerRadius=undefined;this.outerRadius=undefined;} -getLabelAndValue(index){const me=this;const meta=me._cachedMeta;const chart=me.chart;const labels=chart.data.labels||[];const value=formatNumber(meta._parsed[index].r,chart.options.locale);return{label:labels[index]||'',value,};} -update(mode){const arcs=this._cachedMeta.data;this._updateRadius();this.updateElements(arcs,0,arcs.length,mode);} -_updateRadius(){const me=this;const chart=me.chart;const chartArea=chart.chartArea;const opts=chart.options;const minSize=Math.min(chartArea.right-chartArea.left,chartArea.bottom-chartArea.top);const outerRadius=Math.max(minSize/2,0);const innerRadius=Math.max(opts.cutoutPercentage?(outerRadius/100)*(opts.cutoutPercentage):1,0);const radiusLength=(outerRadius-innerRadius)/chart.getVisibleDatasetCount();me.outerRadius=outerRadius-(radiusLength*me.index);me.innerRadius=me.outerRadius-radiusLength;} -updateElements(arcs,start,count,mode){const me=this;const reset=mode==='reset';const chart=me.chart;const dataset=me.getDataset();const opts=chart.options;const animationOpts=opts.animation;const scale=me._cachedMeta.rScale;const centerX=scale.xCenter;const centerY=scale.yCenter;const datasetStartAngle=scale.getIndexAngle(0)-0.5*PI;let angle=datasetStartAngle;let i;const defaultAngle=360/me.countVisibleElements();for(i=0;i{if(!isNaN(dataset.data[index])&&this.chart.getDataVisibility(index)){count++;}});return count;} -_computeAngle(index,mode,defaultAngle){return this.chart.getDataVisibility(index)?toRadians(this.resolveDataElementOptions(index,mode).angle||defaultAngle):0;}} -PolarAreaController.id='polarArea';PolarAreaController.defaults={dataElementType:'arc',animation:{animateRotate:true,animateScale:true},animations:{numbers:{type:'number',properties:['x','y','startAngle','endAngle','innerRadius','outerRadius']},},indexAxis:'r',startAngle:0,};PolarAreaController.overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(chart){const data=chart.data;if(data.labels.length&&data.datasets.length){const{labels:{pointStyle}}=chart.legend.options;return data.labels.map((label,i)=>{const meta=chart.getDatasetMeta(0);const style=meta.controller.getStyle(i);return{text:label,fillStyle:style.backgroundColor,strokeStyle:style.borderColor,lineWidth:style.borderWidth,pointStyle:pointStyle,hidden:!chart.getDataVisibility(i),index:i};});} -return[];}},onClick(e,legendItem,legend){legend.chart.toggleDataVisibility(legendItem.index);legend.chart.update();}},tooltip:{callbacks:{title(){return'';},label(context){return context.chart.data.labels[context.dataIndex]+': '+context.formattedValue;}}}},scales:{r:{type:'radialLinear',angleLines:{display:false},beginAtZero:true,grid:{circular:true},pointLabels:{display:false},startAngle:0}}};class PieController extends DoughnutController{} -PieController.id='pie';PieController.defaults={cutout:0,rotation:0,circumference:360,radius:'100%'};class RadarController extends DatasetController{getLabelAndValue(index){const me=this;const vScale=me._cachedMeta.vScale;const parsed=me.getParsed(index);return{label:vScale.getLabels()[index],value:''+vScale.getLabelForValue(parsed[vScale.axis])};} -update(mode){const me=this;const meta=me._cachedMeta;const line=meta.dataset;const points=meta.data||[];const labels=meta.iScale.getLabels();line.points=points;if(mode!=='resize'){const options=me.resolveDatasetElementOptions(mode);if(!me.options.showLine){options.borderWidth=0;} -const properties={_loop:true,_fullLoop:labels.length===points.length,options};me.updateElement(line,undefined,properties,mode);} -me.updateElements(points,0,points.length,mode);} -updateElements(points,start,count,mode){const me=this;const dataset=me.getDataset();const scale=me._cachedMeta.rScale;const reset=mode==='reset';for(let i=start;ipixelMargin){angleMargin=pixelMargin/innerRadius;ctx.arc(x,y,innerRadius,endAngle+angleMargin,startAngle-angleMargin,true);}else{ctx.arc(x,y,pixelMargin,endAngle+HALF_PI,startAngle-HALF_PI);} -ctx.closePath();ctx.clip();} -function toRadiusCorners(value){return _readValueToProps(value,['outerStart','outerEnd','innerStart','innerEnd']);} -function parseBorderRadius$1(arc,innerRadius,outerRadius,angleDelta){const o=toRadiusCorners(arc.options.borderRadius);const halfThickness=(outerRadius-innerRadius)/2;const innerLimit=Math.min(halfThickness,angleDelta*innerRadius/2);const computeOuterLimit=(val)=>{const outerArcLimit=(outerRadius-Math.min(halfThickness,val))*angleDelta/2;return _limitValue(val,0,Math.min(halfThickness,outerArcLimit));};return{outerStart:computeOuterLimit(o.outerStart),outerEnd:computeOuterLimit(o.outerEnd),innerStart:_limitValue(o.innerStart,0,innerLimit),innerEnd:_limitValue(o.innerEnd,0,innerLimit),};} -function rThetaToXY(r,theta,x,y){return{x:x+r*Math.cos(theta),y:y+r*Math.sin(theta),};} -function pathArc(ctx,element,offset,spacing,end){const{x,y,startAngle:start,pixelMargin,innerRadius:innerR}=element;const outerRadius=Math.max(element.outerRadius+spacing+offset-pixelMargin,0);const innerRadius=innerR>0?innerR+spacing+offset+pixelMargin:0;let spacingOffset=0;const alpha=end-start;if(spacing){const noSpacingInnerRadius=innerR>0?innerR-spacing:0;const noSpacingOuterRadius=outerRadius>0?outerRadius-spacing:0;const avNogSpacingRadius=(noSpacingInnerRadius+noSpacingOuterRadius)/2;const adjustedAngle=avNogSpacingRadius!==0?(alpha*avNogSpacingRadius)/(avNogSpacingRadius+spacing):alpha;spacingOffset=(alpha-adjustedAngle)/2;} -const beta=Math.max(0.001,alpha*outerRadius-offset/PI)/outerRadius;const angleOffset=(alpha-beta)/2;const startAngle=start+angleOffset+spacingOffset;const endAngle=end-angleOffset-spacingOffset;const{outerStart,outerEnd,innerStart,innerEnd}=parseBorderRadius$1(element,innerRadius,outerRadius,endAngle-startAngle);const outerStartAdjustedRadius=outerRadius-outerStart;const outerEndAdjustedRadius=outerRadius-outerEnd;const outerStartAdjustedAngle=startAngle+outerStart/outerStartAdjustedRadius;const outerEndAdjustedAngle=endAngle-outerEnd/outerEndAdjustedRadius;const innerStartAdjustedRadius=innerRadius+innerStart;const innerEndAdjustedRadius=innerRadius+innerEnd;const innerStartAdjustedAngle=startAngle+innerStart/innerStartAdjustedRadius;const innerEndAdjustedAngle=endAngle-innerEnd/innerEndAdjustedRadius;ctx.beginPath();ctx.arc(x,y,outerRadius,outerStartAdjustedAngle,outerEndAdjustedAngle);if(outerEnd>0){const pCenter=rThetaToXY(outerEndAdjustedRadius,outerEndAdjustedAngle,x,y);ctx.arc(pCenter.x,pCenter.y,outerEnd,outerEndAdjustedAngle,endAngle+HALF_PI);} -const p4=rThetaToXY(innerEndAdjustedRadius,endAngle,x,y);ctx.lineTo(p4.x,p4.y);if(innerEnd>0){const pCenter=rThetaToXY(innerEndAdjustedRadius,innerEndAdjustedAngle,x,y);ctx.arc(pCenter.x,pCenter.y,innerEnd,endAngle+HALF_PI,innerEndAdjustedAngle+Math.PI);} -ctx.arc(x,y,innerRadius,endAngle-(innerEnd/innerRadius),startAngle+(innerStart/innerRadius),true);if(innerStart>0){const pCenter=rThetaToXY(innerStartAdjustedRadius,innerStartAdjustedAngle,x,y);ctx.arc(pCenter.x,pCenter.y,innerStart,innerStartAdjustedAngle+Math.PI,startAngle-HALF_PI);} -const p8=rThetaToXY(outerStartAdjustedRadius,startAngle,x,y);ctx.lineTo(p8.x,p8.y);if(outerStart>0){const pCenter=rThetaToXY(outerStartAdjustedRadius,outerStartAdjustedAngle,x,y);ctx.arc(pCenter.x,pCenter.y,outerStart,startAngle-HALF_PI,outerStartAdjustedAngle);} -ctx.closePath();} -function drawArc(ctx,element,offset,spacing){const{fullCircles,startAngle,circumference}=element;let endAngle=element.endAngle;if(fullCircles){pathArc(ctx,element,offset,spacing,startAngle+TAU);for(let i=0;i=TAU||_angleBetween(angle,startAngle,endAngle);const withinRadius=(distance>=innerRadius+rAdjust&&distance<=outerRadius+rAdjust);return(betweenAngles&&withinRadius);} -getCenterPoint(useFinalPosition){const{x,y,startAngle,endAngle,innerRadius,outerRadius}=this.getProps(['x','y','startAngle','endAngle','innerRadius','outerRadius','circumference',],useFinalPosition);const{offset,spacing}=this.options;const halfAngle=(startAngle+endAngle)/2;const halfRadius=(innerRadius+outerRadius+spacing+offset)/2;return{x:x+Math.cos(halfAngle)*halfRadius,y:y+Math.sin(halfAngle)*halfRadius};} -tooltipPosition(useFinalPosition){return this.getCenterPoint(useFinalPosition);} -draw(ctx){const me=this;const{options,circumference}=me;const offset=(options.offset||0)/2;const spacing=(options.spacing||0)/2;me.pixelMargin=(options.borderAlign==='inner')?0.33:0;me.fullCircles=circumference>TAU?Math.floor(circumference/TAU):0;if(circumference===0||me.innerRadius<0||me.outerRadius<0){return;} -ctx.save();let radiusOffset=0;if(offset){radiusOffset=offset/2;const halfAngle=(me.startAngle+me.endAngle)/2;ctx.translate(Math.cos(halfAngle)*radiusOffset,Math.sin(halfAngle)*radiusOffset);if(me.circumference>=PI){radiusOffset=offset;}} -ctx.fillStyle=options.backgroundColor;ctx.strokeStyle=options.borderColor;const endAngle=drawArc(ctx,me,radiusOffset,spacing);drawBorder(ctx,me,radiusOffset,spacing,endAngle);ctx.restore();}} -ArcElement.id='arc';ArcElement.defaults={borderAlign:'center',borderColor:'#fff',borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:undefined,};ArcElement.defaultRoutes={backgroundColor:'backgroundColor'};function setStyle(ctx,options,style=options){ctx.lineCap=valueOrDefault(style.borderCapStyle,options.borderCapStyle);ctx.setLineDash(valueOrDefault(style.borderDash,options.borderDash));ctx.lineDashOffset=valueOrDefault(style.borderDashOffset,options.borderDashOffset);ctx.lineJoin=valueOrDefault(style.borderJoinStyle,options.borderJoinStyle);ctx.lineWidth=valueOrDefault(style.borderWidth,options.borderWidth);ctx.strokeStyle=valueOrDefault(style.borderColor,options.borderColor);} -function lineTo(ctx,previous,target){ctx.lineTo(target.x,target.y);} -function getLineMethod(options){if(options.stepped){return _steppedLineTo;} -if(options.tension||options.cubicInterpolationMode==='monotone'){return _bezierCurveTo;} -return lineTo;} -function pathVars(points,segment,params={}){const count=points.length;const{start:paramsStart=0,end:paramsEnd=count-1}=params;const{start:segmentStart,end:segmentEnd}=segment;const start=Math.max(paramsStart,segmentStart);const end=Math.min(paramsEnd,segmentEnd);const outside=paramsStartsegmentEnd&¶msEnd>segmentEnd;return{count,start,loop:segment.loop,ilen:end(start+(reverse?ilen-index:index))%count;const drawX=()=>{if(minY!==maxY){ctx.lineTo(avgX,maxY);ctx.lineTo(avgX,minY);ctx.lineTo(avgX,lastY);}};if(move){point=points[pointIndex(0)];ctx.moveTo(point.x,point.y);} -for(i=0;i<=ilen;++i){point=points[pointIndex(i)];if(point.skip){continue;} -const x=point.x;const y=point.y;const truncX=x|0;if(truncX===prevX){if(ymaxY){maxY=y;} -avgX=(countX*avgX+x)/++countX;}else{drawX();ctx.lineTo(x,y);prevX=truncX;countX=0;minY=maxY=y;} -lastY=y;} -drawX();} -function _getSegmentMethod(line){const opts=line.options;const borderDash=opts.borderDash&&opts.borderDash.length;const useFastPath=!line._decimated&&!line._loop&&!opts.tension&&opts.cubicInterpolationMode!=='monotone'&&!opts.stepped&&!borderDash;return useFastPath?fastPathSegment:pathSegment;} -function _getInterpolationMethod(options){if(options.stepped){return _steppedInterpolation;} -if(options.tension||options.cubicInterpolationMode==='monotone'){return _bezierInterpolation;} -return _pointInLine;} -function strokePathWithCache(ctx,line,start,count){let path=line._path;if(!path){path=line._path=new Path2D();if(line.path(path,start,count)){path.closePath();}} -setStyle(ctx,line.options);ctx.stroke(path);} -function strokePathDirect(ctx,line,start,count){const{segments,options}=line;const segmentMethod=_getSegmentMethod(line);for(const segment of segments){setStyle(ctx,options,segment.style);ctx.beginPath();if(segmentMethod(ctx,line,segment,{start,end:start+count-1})){ctx.closePath();} -ctx.stroke();}} -const usePath2D=typeof Path2D==='function';function draw(ctx,line,start,count){if(usePath2D&&line.segments.length===1){strokePathWithCache(ctx,line,start,count);}else{strokePathDirect(ctx,line,start,count);}} -class LineElement extends Element{constructor(cfg){super();this.animated=true;this.options=undefined;this._loop=undefined;this._fullLoop=undefined;this._path=undefined;this._points=undefined;this._segments=undefined;this._decimated=false;this._pointsUpdated=false;this._datasetIndex=undefined;if(cfg){Object.assign(this,cfg);}} -updateControlPoints(chartArea,indexAxis){const me=this;const options=me.options;if((options.tension||options.cubicInterpolationMode==='monotone')&&!options.stepped&&!me._pointsUpdated){const loop=options.spanGaps?me._loop:me._fullLoop;_updateBezierControlPoints(me._points,options,chartArea,loop,indexAxis);me._pointsUpdated=true;}} -set points(points){const me=this;me._points=points;delete me._segments;delete me._path;me._pointsUpdated=false;} -get points(){return this._points;} -get segments(){return this._segments||(this._segments=_computeSegments(this,this.options.segment));} -first(){const segments=this.segments;const points=this.points;return segments.length&&points[segments[0].start];} -last(){const segments=this.segments;const points=this.points;const count=segments.length;return count&&points[segments[count-1].end];} -interpolate(point,property){const me=this;const options=me.options;const value=point[property];const points=me.points;const segments=_boundSegments(me,{property,start:value,end:value});if(!segments.length){return;} -const result=[];const _interpolate=_getInterpolationMethod(options);let i,ilen;for(i=0,ilen=segments.length;iname!=='borderDash'&&name!=='fill',};function inRange$1(el,pos,axis,useFinalPosition){const options=el.options;const{[axis]:value}=el.getProps([axis],useFinalPosition);return(Math.abs(pos-value)=bounds.left&&x<=bounds.right)&&(skipY||y>=bounds.top&&y<=bounds.bottom);} -function hasRadius(radius){return radius.topLeft||radius.topRight||radius.bottomLeft||radius.bottomRight;} -function addNormalRectPath(ctx,rect){ctx.rect(rect.x,rect.y,rect.w,rect.h);} -function inflateRect(rect,amount,refRect={}){const x=rect.x!==refRect.x?-amount:0;const y=rect.y!==refRect.y?-amount:0;const w=(rect.x+rect.w!==refRect.x+refRect.w?amount:0)-x;const h=(rect.y+rect.h!==refRect.y+refRect.h?amount:0)-y;return{x:rect.x+x,y:rect.y+y,w:rect.w+w,h:rect.h+h,radius:rect.radius};} -class BarElement extends Element{constructor(cfg){super();this.options=undefined;this.horizontal=undefined;this.base=undefined;this.width=undefined;this.height=undefined;if(cfg){Object.assign(this,cfg);}} -draw(ctx){const options=this.options;const{inner,outer}=boundingRects(this);const addRectPath=hasRadius(outer.radius)?addRoundedRectPath:addNormalRectPath;const inflateAmount=0.33;ctx.save();if(outer.w!==inner.w||outer.h!==inner.h){ctx.beginPath();addRectPath(ctx,inflateRect(outer,inflateAmount,inner));ctx.clip();addRectPath(ctx,inflateRect(inner,-inflateAmount,outer));ctx.fillStyle=options.borderColor;ctx.fill('evenodd');} -ctx.beginPath();addRectPath(ctx,inflateRect(inner,inflateAmount,outer));ctx.fillStyle=options.backgroundColor;ctx.fill();ctx.restore();} -inRange(mouseX,mouseY,useFinalPosition){return inRange(this,mouseX,mouseY,useFinalPosition);} -inXRange(mouseX,useFinalPosition){return inRange(this,mouseX,null,useFinalPosition);} -inYRange(mouseY,useFinalPosition){return inRange(this,null,mouseY,useFinalPosition);} -getCenterPoint(useFinalPosition){const{x,y,base,horizontal}=this.getProps(['x','y','base','horizontal'],useFinalPosition);return{x:horizontal?(x+base)/2:x,y:horizontal?y:(y+base)/2};} -getRange(axis){return axis==='x'?this.width/2:this.height/2;}} -BarElement.id='bar';BarElement.defaults={borderSkipped:'start',borderWidth:0,borderRadius:0,enableBorderRadius:true,pointStyle:undefined};BarElement.defaultRoutes={backgroundColor:'backgroundColor',borderColor:'borderColor'};var elements=Object.freeze({__proto__:null,ArcElement:ArcElement,LineElement:LineElement,PointElement:PointElement,BarElement:BarElement});function lttbDecimation(data,start,count,availableWidth,options){const samples=options.samples||availableWidth;if(samples>=count){return data.slice(start,start+count);} -const decimated=[];const bucketWidth=(count-2)/(samples-2);let sampledIndex=0;const endIndex=start+count-1;let a=start;let i,maxAreaPoint,maxArea,area,nextA;decimated[sampledIndex++]=data[a];for(i=0;imaxArea){maxArea=area;maxAreaPoint=data[j];nextA=j;}} -decimated[sampledIndex++]=maxAreaPoint;a=nextA;} -decimated[sampledIndex++]=data[endIndex];return decimated;} -function minMaxDecimation(data,start,count,availableWidth){let avgX=0;let countX=0;let i,point,x,y,prevX,minIndex,maxIndex,startIndex,minY,maxY;const decimated=[];const endIndex=start+count-1;const xMin=data[start].x;const xMax=data[endIndex].x;const dx=xMax-xMin;for(i=start;imaxY){maxY=y;maxIndex=i;} -avgX=(countX*avgX+point.x)/++countX;}else{const lastIndex=i-1;if(!isNullOrUndef(minIndex)&&!isNullOrUndef(maxIndex)){const intermediateIndex1=Math.min(minIndex,maxIndex);const intermediateIndex2=Math.max(minIndex,maxIndex);if(intermediateIndex1!==startIndex&&intermediateIndex1!==lastIndex){decimated.push({...data[intermediateIndex1],x:avgX,});} -if(intermediateIndex2!==startIndex&&intermediateIndex2!==lastIndex){decimated.push({...data[intermediateIndex2],x:avgX});}} -if(i>0&&lastIndex!==startIndex){decimated.push(data[lastIndex]);} -decimated.push(point);prevX=truncX;countX=0;minY=maxY=y;minIndex=maxIndex=startIndex=i;}} -return decimated;} -function cleanDecimatedDataset(dataset){if(dataset._decimated){const data=dataset._data;delete dataset._decimated;delete dataset._data;Object.defineProperty(dataset,'data',{value:data});}} -function cleanDecimatedData(chart){chart.data.datasets.forEach((dataset)=>{cleanDecimatedDataset(dataset);});} -function getStartAndCountOfVisiblePointsSimplified(meta,points){const pointCount=points.length;let start=0;let count;const{iScale}=meta;const{min,max,minDefined,maxDefined}=iScale.getUserBounds();if(minDefined){start=_limitValue(_lookupByKey(points,iScale.axis,min).lo,0,pointCount-1);} -if(maxDefined){count=_limitValue(_lookupByKey(points,iScale.axis,max).hi+1,start,pointCount)-start;}else{count=pointCount-start;} -return{start,count};} -var plugin_decimation={id:'decimation',defaults:{algorithm:'min-max',enabled:false,},beforeElementsUpdate:(chart,args,options)=>{if(!options.enabled){cleanDecimatedData(chart);return;} -const availableWidth=chart.width;chart.data.datasets.forEach((dataset,datasetIndex)=>{const{_data,indexAxis}=dataset;const meta=chart.getDatasetMeta(datasetIndex);const data=_data||dataset.data;if(resolve([indexAxis,chart.options.indexAxis])==='y'){return;} -if(meta.type!=='line'){return;} -const xAxis=chart.scales[meta.xAxisID];if(xAxis.type!=='linear'&&xAxis.type!=='time'){return;} -if(chart.options.parsing){return;} -let{start,count}=getStartAndCountOfVisiblePointsSimplified(meta,data);const threshold=options.threshold||4*availableWidth;if(count<=threshold){cleanDecimatedDataset(dataset);return;} -if(isNullOrUndef(_data)){dataset._data=data;delete dataset.data;Object.defineProperty(dataset,'data',{configurable:true,enumerable:true,get:function(){return this._decimated;},set:function(d){this._data=d;}});} -let decimated;switch(options.algorithm){case'lttb':decimated=lttbDecimation(data,start,count,availableWidth,options);break;case'min-max':decimated=minMaxDecimation(data,start,count,availableWidth);break;default:throw new Error(`Unsupported decimation algorithm '${options.algorithm}'`);} -dataset._decimated=decimated;});},destroy(chart){cleanDecimatedData(chart);}};function getLineByIndex(chart,index){const meta=chart.getDatasetMeta(index);const visible=meta&&chart.isDatasetVisible(index);return visible?meta.dataset:null;} -function parseFillOption(line){const options=line.options;const fillOption=options.fill;let fill=valueOrDefault(fillOption&&fillOption.target,fillOption);if(fill===undefined){fill=!!options.backgroundColor;} -if(fill===false||fill===null){return false;} -if(fill===true){return'origin';} -return fill;} -function decodeFill(line,index,count){const fill=parseFillOption(line);if(isObject(fill)){return isNaN(fill.value)?false:fill;} -let target=parseFloat(fill);if(isNumberFinite(target)&&Math.floor(target)===target){if(fill[0]==='-'||fill[0]==='+'){target=index+target;} -if(target===index||target<0||target>=count){return false;} -return target;} -return['origin','start','end','stack','shape'].indexOf(fill)>=0&&fill;} -function computeLinearBoundary(source){const{scale={},fill}=source;let target=null;let horizontal;if(fill==='start'){target=scale.bottom;}else if(fill==='end'){target=scale.top;}else if(isObject(fill)){target=scale.getPixelForValue(fill.value);}else if(scale.getBasePixel){target=scale.getBasePixel();} -if(isNumberFinite(target)){horizontal=scale.isHorizontal();return{x:horizontal?target:null,y:horizontal?null:target};} -return null;} -class simpleArc{constructor(opts){this.x=opts.x;this.y=opts.y;this.radius=opts.radius;} -pathSegment(ctx,bounds,opts){const{x,y,radius}=this;bounds=bounds||{start:0,end:TAU};ctx.arc(x,y,radius,bounds.end,bounds.start,true);return!opts.bounds;} -interpolate(point){const{x,y,radius}=this;const angle=point.angle;return{x:x+Math.cos(angle)*radius,y:y+Math.sin(angle)*radius,angle};}} -function computeCircularBoundary(source){const{scale,fill}=source;const options=scale.options;const length=scale.getLabels().length;const target=[];const start=options.reverse?scale.max:scale.min;const end=options.reverse?scale.min:scale.max;let i,center,value;if(fill==='start'){value=start;}else if(fill==='end'){value=end;}else if(isObject(fill)){value=fill.value;}else{value=scale.getBaseValue();} -if(options.grid.circular){center=scale.getPointPositionForValue(0,start);return new simpleArc({x:center.x,y:center.y,radius:scale.getDistanceFromCenterForValue(value)});} -for(i=0;istart;end--){const point=points[end];if(!isNaN(point.x)&&!isNaN(point.y)){break;}} -return end;} -function pointsFromSegments(boundary,line){const{x=null,y=null}=boundary||{};const linePoints=line.points;const points=[];line.segments.forEach(({start,end})=>{end=findSegmentEnd(start,end,linePoints);const first=linePoints[start];const last=linePoints[end];if(y!==null){points.push({x:first.x,y});points.push({x:last.x,y});}else if(x!==null){points.push({x,y:first.y});points.push({x,y:last.y});}});return points;} -function buildStackLine(source){const{chart,scale,index,line}=source;const points=[];const segments=line.segments;const sourcePoints=line.points;const linesBelow=getLinesBelow(chart,index);linesBelow.push(createBoundaryLine({x:null,y:scale.bottom},line));for(let i=0;imeta.type==='line'&&!meta.hidden;function getLinesBelow(chart,index){const below=[];const metas=chart.getSortedVisibleDatasetMetas();for(let i=0;i=firstValue&&pointValue<=lastValue){first=pointValue===firstValue;last=pointValue===lastValue;break;}} -return{first,last,point};} -function getTarget(source){const{chart,fill,line}=source;if(isNumberFinite(fill)){return getLineByIndex(chart,fill);} -if(fill==='stack'){return buildStackLine(source);} -if(fill==='shape'){return true;} -const boundary=computeBoundary(source);if(boundary instanceof simpleArc){return boundary;} -return createBoundaryLine(boundary,line);} -function createBoundaryLine(boundary,line){let points=[];let _loop=false;if(isArray(boundary)){_loop=true;points=boundary;}else{points=pointsFromSegments(boundary,line);} -return points.length?new LineElement({points,options:{tension:0},_loop,_fullLoop:_loop}):null;} -function resolveTarget(sources,index,propagate){const source=sources[index];let fill=source.fill;const visited=[index];let target;if(!propagate){return fill;} -while(fill!==false&&visited.indexOf(fill)===-1){if(!isNumberFinite(fill)){return fill;} -target=sources[fill];if(!target){return false;} -if(target.visible){return fill;} -visited.push(fill);fill=target.fill;} -return false;} -function _clip(ctx,target,clipY){ctx.beginPath();target.path(ctx);ctx.lineTo(target.last().x,clipY);ctx.lineTo(target.first().x,clipY);ctx.closePath();ctx.clip();} -function getBounds(property,first,last,loop){if(loop){return;} -let start=first[property];let end=last[property];if(property==='angle'){start=_normalizeAngle(start);end=_normalizeAngle(end);} -return{property,start,end};} -function _getEdge(a,b,prop,fn){if(a&&b){return fn(a[prop],b[prop]);} -return a?a[prop]:b?b[prop]:0;} -function _segments(line,target,property){const segments=line.segments;const points=line.points;const tpoints=target.points;const parts=[];for(const segment of segments){let{start,end}=segment;end=findSegmentEnd(start,end,points);const bounds=getBounds(property,points[start],points[end],segment.loop);if(!target.segments){parts.push({source:segment,target:bounds,start:points[start],end:points[end]});continue;} -const targetSegments=_boundSegments(target,bounds);for(const tgt of targetSegments){const subBounds=getBounds(property,tpoints[tgt.start],tpoints[tgt.end],tgt.loop);const fillSources=_boundSegment(segment,points,subBounds);for(const fillSource of fillSources){parts.push({source:fillSource,target:tgt,start:{[property]:_getEdge(bounds,subBounds,'start',Math.max)},end:{[property]:_getEdge(bounds,subBounds,'end',Math.min)}});}}} -return parts;} -function clipBounds(ctx,scale,bounds){const{top,bottom}=scale.chart.chartArea;const{property,start,end}=bounds||{};if(property==='x'){ctx.beginPath();ctx.rect(start,top,end-start,bottom-top);ctx.clip();}} -function interpolatedLineTo(ctx,target,point,property){const interpolatedPoint=target.interpolate(point,property);if(interpolatedPoint){ctx.lineTo(interpolatedPoint.x,interpolatedPoint.y);}} -function _fill(ctx,cfg){const{line,target,property,color,scale}=cfg;const segments=_segments(line,target,property);for(const{source:src,target:tgt,start,end}of segments){const{style:{backgroundColor=color}={}}=src;const notShape=target!==true;ctx.save();ctx.fillStyle=backgroundColor;clipBounds(ctx,scale,notShape&&getBounds(property,start,end));ctx.beginPath();const lineLoop=!!line.pathSegment(ctx,src);let loop;if(notShape){if(lineLoop){ctx.closePath();}else{interpolatedLineTo(ctx,target,end,property);} -const targetLoop=!!target.pathSegment(ctx,tgt,{move:lineLoop,reverse:true});loop=lineLoop&&targetLoop;if(!loop){interpolatedLineTo(ctx,target,start,property);}} -ctx.closePath();ctx.fill(loop?'evenodd':'nonzero');ctx.restore();}} -function doFill(ctx,cfg){const{line,target,above,below,area,scale}=cfg;const property=line._loop?'angle':cfg.axis;ctx.save();if(property==='x'&&below!==above){_clip(ctx,target,area.top);_fill(ctx,{line,target,color:above,scale,property});ctx.restore();ctx.save();_clip(ctx,target,area.bottom);} -_fill(ctx,{line,target,color:below,scale,property});ctx.restore();} -function drawfill(ctx,source,area){const target=getTarget(source);const{line,scale,axis}=source;const lineOpts=line.options;const fillOption=lineOpts.fill;const color=lineOpts.backgroundColor;const{above=color,below=color}=fillOption||{};if(target&&line.points.length){clipArea(ctx,area);doFill(ctx,{line,target,above,below,area,scale,axis});unclipArea(ctx);}} -var plugin_filler={id:'filler',afterDatasetsUpdate(chart,_args,options){const count=(chart.data.datasets||[]).length;const sources=[];let meta,i,line,source;for(i=0;i=0;--i){const source=metasets[i].$filler;if(!source){continue;} -source.line.updateControlPoints(area,source.axis);if(draw){drawfill(chart.ctx,source,area);}}},beforeDatasetsDraw(chart,_args,options){if(options.drawTime!=='beforeDatasetsDraw'){return;} -const metasets=chart.getSortedVisibleDatasetMetas();for(let i=metasets.length-1;i>=0;--i){const source=metasets[i].$filler;if(source){drawfill(chart.ctx,source,chart.chartArea);}}},beforeDatasetDraw(chart,args,options){const source=args.meta.$filler;if(!source||source.fill===false||options.drawTime!=='beforeDatasetDraw'){return;} -drawfill(chart.ctx,source,chart.chartArea);},defaults:{propagate:true,drawTime:'beforeDatasetDraw'}};const getBoxSize=(labelOpts,fontSize)=>{let{boxHeight=fontSize,boxWidth=fontSize}=labelOpts;if(labelOpts.usePointStyle){boxHeight=Math.min(boxHeight,fontSize);boxWidth=Math.min(boxWidth,fontSize);} -return{boxWidth,boxHeight,itemHeight:Math.max(fontSize,boxHeight)};};const itemsEqual=(a,b)=>a!==null&&b!==null&&a.datasetIndex===b.datasetIndex&&a.index===b.index;class Legend extends Element{constructor(config){super();this._added=false;this.legendHitBoxes=[];this._hoveredItem=null;this.doughnutMode=false;this.chart=config.chart;this.options=config.options;this.ctx=config.ctx;this.legendItems=undefined;this.columnSizes=undefined;this.lineWidths=undefined;this.maxHeight=undefined;this.maxWidth=undefined;this.top=undefined;this.bottom=undefined;this.left=undefined;this.right=undefined;this.height=undefined;this.width=undefined;this._margins=undefined;this.position=undefined;this.weight=undefined;this.fullSize=undefined;} -update(maxWidth,maxHeight,margins){const me=this;me.maxWidth=maxWidth;me.maxHeight=maxHeight;me._margins=margins;me.setDimensions();me.buildLabels();me.fit();} -setDimensions(){const me=this;if(me.isHorizontal()){me.width=me.maxWidth;me.left=me._margins.left;me.right=me.width;}else{me.height=me.maxHeight;me.top=me._margins.top;me.bottom=me.height;}} -buildLabels(){const me=this;const labelOpts=me.options.labels||{};let legendItems=callback(labelOpts.generateLabels,[me.chart],me)||[];if(labelOpts.filter){legendItems=legendItems.filter((item)=>labelOpts.filter(item,me.chart.data));} -if(labelOpts.sort){legendItems=legendItems.sort((a,b)=>labelOpts.sort(a,b,me.chart.data));} -if(me.options.reverse){legendItems.reverse();} -me.legendItems=legendItems;} -fit(){const me=this;const{options,ctx}=me;if(!options.display){me.width=me.height=0;return;} -const labelOpts=options.labels;const labelFont=toFont(labelOpts.font);const fontSize=labelFont.size;const titleHeight=me._computeTitleHeight();const{boxWidth,itemHeight}=getBoxSize(labelOpts,fontSize);let width,height;ctx.font=labelFont.string;if(me.isHorizontal()){width=me.maxWidth;height=me._fitRows(titleHeight,fontSize,boxWidth,itemHeight)+10;}else{height=me.maxHeight;width=me._fitCols(titleHeight,fontSize,boxWidth,itemHeight)+10;} -me.width=Math.min(width,options.maxWidth||me.maxWidth);me.height=Math.min(height,options.maxHeight||me.maxHeight);} -_fitRows(titleHeight,fontSize,boxWidth,itemHeight){const me=this;const{ctx,maxWidth,options:{labels:{padding}}}=me;const hitboxes=me.legendHitBoxes=[];const lineWidths=me.lineWidths=[0];const lineHeight=itemHeight+padding;let totalHeight=titleHeight;ctx.textAlign='left';ctx.textBaseline='middle';let row=-1;let top=-lineHeight;me.legendItems.forEach((legendItem,i)=>{const itemWidth=boxWidth+(fontSize/2)+ctx.measureText(legendItem.text).width;if(i===0||lineWidths[lineWidths.length-1]+itemWidth+2*padding>maxWidth){totalHeight+=lineHeight;lineWidths[lineWidths.length-(i>0?0:1)]=0;top+=lineHeight;row++;} -hitboxes[i]={left:0,top,row,width:itemWidth,height:itemHeight};lineWidths[lineWidths.length-1]+=itemWidth+padding;});return totalHeight;} -_fitCols(titleHeight,fontSize,boxWidth,itemHeight){const me=this;const{ctx,maxHeight,options:{labels:{padding}}}=me;const hitboxes=me.legendHitBoxes=[];const columnSizes=me.columnSizes=[];const heightLimit=maxHeight-titleHeight;let totalWidth=padding;let currentColWidth=0;let currentColHeight=0;let left=0;let col=0;me.legendItems.forEach((legendItem,i)=>{const itemWidth=boxWidth+(fontSize/2)+ctx.measureText(legendItem.text).width;if(i>0&¤tColHeight+itemHeight+2*padding>heightLimit){totalWidth+=currentColWidth+padding;columnSizes.push({width:currentColWidth,height:currentColHeight});left+=currentColWidth+padding;col++;currentColWidth=currentColHeight=0;} -hitboxes[i]={left,top:currentColHeight,col,width:itemWidth,height:itemHeight};currentColWidth=Math.max(currentColWidth,itemWidth);currentColHeight+=itemHeight+padding;});totalWidth+=currentColWidth;columnSizes.push({width:currentColWidth,height:currentColHeight});return totalWidth;} -adjustHitBoxes(){const me=this;if(!me.options.display){return;} -const titleHeight=me._computeTitleHeight();const{legendHitBoxes:hitboxes,options:{align,labels:{padding},rtl}}=me;const rtlHelper=getRtlAdapter(rtl,me.left,me.width);if(this.isHorizontal()){let row=0;let left=_alignStartEnd(align,me.left+padding,me.right-me.lineWidths[row]);for(const hitbox of hitboxes){if(row!==hitbox.row){row=hitbox.row;left=_alignStartEnd(align,me.left+padding,me.right-me.lineWidths[row]);} -hitbox.top+=me.top+titleHeight+padding;hitbox.left=rtlHelper.leftForLtr(rtlHelper.x(left),hitbox.width);left+=hitbox.width+padding;}}else{let col=0;let top=_alignStartEnd(align,me.top+titleHeight+padding,me.bottom-me.columnSizes[col].height);for(const hitbox of hitboxes){if(hitbox.col!==col){col=hitbox.col;top=_alignStartEnd(align,me.top+titleHeight+padding,me.bottom-me.columnSizes[col].height);} -hitbox.top=top;hitbox.left+=me.left+padding;hitbox.left=rtlHelper.leftForLtr(rtlHelper.x(hitbox.left),hitbox.width);top+=hitbox.height+padding;}}} -isHorizontal(){return this.options.position==='top'||this.options.position==='bottom';} -draw(){const me=this;if(me.options.display){const ctx=me.ctx;clipArea(ctx,me);me._draw();unclipArea(ctx);}} -_draw(){const me=this;const{options:opts,columnSizes,lineWidths,ctx}=me;const{align,labels:labelOpts}=opts;const defaultColor=defaults.color;const rtlHelper=getRtlAdapter(opts.rtl,me.left,me.width);const labelFont=toFont(labelOpts.font);const{color:fontColor,padding}=labelOpts;const fontSize=labelFont.size;const halfFontSize=fontSize/2;let cursor;me.drawTitle();ctx.textAlign=rtlHelper.textAlign('left');ctx.textBaseline='middle';ctx.lineWidth=0.5;ctx.font=labelFont.string;const{boxWidth,boxHeight,itemHeight}=getBoxSize(labelOpts,fontSize);const drawLegendBox=function(x,y,legendItem){if(isNaN(boxWidth)||boxWidth<=0||isNaN(boxHeight)||boxHeight<0){return;} -ctx.save();const lineWidth=valueOrDefault(legendItem.lineWidth,1);ctx.fillStyle=valueOrDefault(legendItem.fillStyle,defaultColor);ctx.lineCap=valueOrDefault(legendItem.lineCap,'butt');ctx.lineDashOffset=valueOrDefault(legendItem.lineDashOffset,0);ctx.lineJoin=valueOrDefault(legendItem.lineJoin,'miter');ctx.lineWidth=lineWidth;ctx.strokeStyle=valueOrDefault(legendItem.strokeStyle,defaultColor);ctx.setLineDash(valueOrDefault(legendItem.lineDash,[]));if(labelOpts.usePointStyle){const drawOptions={radius:boxWidth*Math.SQRT2/2,pointStyle:legendItem.pointStyle,rotation:legendItem.rotation,borderWidth:lineWidth};const centerX=rtlHelper.xPlus(x,boxWidth/2);const centerY=y+halfFontSize;drawPoint(ctx,drawOptions,centerX,centerY);}else{const yBoxTop=y+Math.max((fontSize-boxHeight)/2,0);const xBoxLeft=rtlHelper.leftForLtr(x,boxWidth);const borderRadius=toTRBLCorners(legendItem.borderRadius);ctx.beginPath();if(Object.values(borderRadius).some(v=>v!==0)){addRoundedRectPath(ctx,{x:xBoxLeft,y:yBoxTop,w:boxWidth,h:boxHeight,radius:borderRadius,});}else{ctx.rect(xBoxLeft,yBoxTop,boxWidth,boxHeight);} -ctx.fill();if(lineWidth!==0){ctx.stroke();}} -ctx.restore();};const fillText=function(x,y,legendItem){renderText(ctx,legendItem.text,x,y+(itemHeight/2),labelFont,{strikethrough:legendItem.hidden,textAlign:rtlHelper.textAlign(legendItem.textAlign)});};const isHorizontal=me.isHorizontal();const titleHeight=this._computeTitleHeight();if(isHorizontal){cursor={x:_alignStartEnd(align,me.left+padding,me.right-lineWidths[0]),y:me.top+padding+titleHeight,line:0};}else{cursor={x:me.left+padding,y:_alignStartEnd(align,me.top+titleHeight+padding,me.bottom-columnSizes[0].height),line:0};} -overrideTextDirection(me.ctx,opts.textDirection);const lineHeight=itemHeight+padding;me.legendItems.forEach((legendItem,i)=>{ctx.strokeStyle=legendItem.fontColor||fontColor;ctx.fillStyle=legendItem.fontColor||fontColor;const textWidth=ctx.measureText(legendItem.text).width;const textAlign=rtlHelper.textAlign(legendItem.textAlign||(legendItem.textAlign=labelOpts.textAlign));const width=boxWidth+halfFontSize+textWidth;let x=cursor.x;let y=cursor.y;rtlHelper.setWidth(me.width);if(isHorizontal){if(i>0&&x+width+padding>me.right){y=cursor.y+=lineHeight;cursor.line++;x=cursor.x=_alignStartEnd(align,me.left+padding,me.right-lineWidths[cursor.line]);}}else if(i>0&&y+lineHeight>me.bottom){x=cursor.x=x+columnSizes[cursor.line].width+padding;cursor.line++;y=cursor.y=_alignStartEnd(align,me.top+titleHeight+padding,me.bottom-columnSizes[cursor.line].height);} -const realX=rtlHelper.x(x);drawLegendBox(realX,y,legendItem);x=_textX(textAlign,x+boxWidth+halfFontSize,isHorizontal?x+width:me.right,opts.rtl);fillText(rtlHelper.x(x),y,legendItem);if(isHorizontal){cursor.x+=width+padding;}else{cursor.y+=lineHeight;}});restoreTextDirection(me.ctx,opts.textDirection);} -drawTitle(){const me=this;const opts=me.options;const titleOpts=opts.title;const titleFont=toFont(titleOpts.font);const titlePadding=toPadding(titleOpts.padding);if(!titleOpts.display){return;} -const rtlHelper=getRtlAdapter(opts.rtl,me.left,me.width);const ctx=me.ctx;const position=titleOpts.position;const halfFontSize=titleFont.size/2;const topPaddingPlusHalfFontSize=titlePadding.top+halfFontSize;let y;let left=me.left;let maxWidth=me.width;if(this.isHorizontal()){maxWidth=Math.max(...me.lineWidths);y=me.top+topPaddingPlusHalfFontSize;left=_alignStartEnd(opts.align,left,me.right-maxWidth);}else{const maxHeight=me.columnSizes.reduce((acc,size)=>Math.max(acc,size.height),0);y=topPaddingPlusHalfFontSize+_alignStartEnd(opts.align,me.top,me.bottom-maxHeight-opts.labels.padding-me._computeTitleHeight());} -const x=_alignStartEnd(position,left,left+maxWidth);ctx.textAlign=rtlHelper.textAlign(_toLeftRightCenter(position));ctx.textBaseline='middle';ctx.strokeStyle=titleOpts.color;ctx.fillStyle=titleOpts.color;ctx.font=titleFont.string;renderText(ctx,titleOpts.text,x,y,titleFont);} -_computeTitleHeight(){const titleOpts=this.options.title;const titleFont=toFont(titleOpts.font);const titlePadding=toPadding(titleOpts.padding);return titleOpts.display?titleFont.lineHeight+titlePadding.height:0;} -_getLegendItemAt(x,y){const me=this;let i,hitBox,lh;if(x>=me.left&&x<=me.right&&y>=me.top&&y<=me.bottom){lh=me.legendHitBoxes;for(i=0;i=hitBox.left&&x<=hitBox.left+hitBox.width&&y>=hitBox.top&&y<=hitBox.top+hitBox.height){return me.legendItems[i];}}} -return null;} -handleEvent(e){const me=this;const opts=me.options;if(!isListened(e.type,opts)){return;} -const hoveredItem=me._getLegendItemAt(e.x,e.y);if(e.type==='mousemove'){const previous=me._hoveredItem;const sameItem=itemsEqual(previous,hoveredItem);if(previous&&!sameItem){callback(opts.onLeave,[e,previous,me],me);} -me._hoveredItem=hoveredItem;if(hoveredItem&&!sameItem){callback(opts.onHover,[e,hoveredItem,me],me);}}else if(hoveredItem){callback(opts.onClick,[e,hoveredItem,me],me);}}} -function isListened(type,opts){if(type==='mousemove'&&(opts.onHover||opts.onLeave)){return true;} -if(opts.onClick&&(type==='click'||type==='mouseup')){return true;} -return false;} -var plugin_legend={id:'legend',_element:Legend,start(chart,_args,options){const legend=chart.legend=new Legend({ctx:chart.ctx,options,chart});layouts.configure(chart,legend,options);layouts.addBox(chart,legend);},stop(chart){layouts.removeBox(chart,chart.legend);delete chart.legend;},beforeUpdate(chart,_args,options){const legend=chart.legend;layouts.configure(chart,legend,options);legend.options=options;},afterUpdate(chart){const legend=chart.legend;legend.buildLabels();legend.adjustHitBoxes();},afterEvent(chart,args){if(!args.replay){chart.legend.handleEvent(args.event);}},defaults:{display:true,position:'top',align:'center',fullSize:true,reverse:false,weight:1000,onClick(e,legendItem,legend){const index=legendItem.datasetIndex;const ci=legend.chart;if(ci.isDatasetVisible(index)){ci.hide(index);legendItem.hidden=true;}else{ci.show(index);legendItem.hidden=false;}},onHover:null,onLeave:null,labels:{color:(ctx)=>ctx.chart.options.color,boxWidth:40,padding:10,generateLabels(chart){const datasets=chart.data.datasets;const{labels:{usePointStyle,pointStyle,textAlign,color}}=chart.legend.options;return chart._getSortedDatasetMetas().map((meta)=>{const style=meta.controller.getStyle(usePointStyle?0:undefined);const borderWidth=toPadding(style.borderWidth);return{text:datasets[meta.index].label,fillStyle:style.backgroundColor,fontColor:color,hidden:!meta.visible,lineCap:style.borderCapStyle,lineDash:style.borderDash,lineDashOffset:style.borderDashOffset,lineJoin:style.borderJoinStyle,lineWidth:(borderWidth.width+borderWidth.height)/4,strokeStyle:style.borderColor,pointStyle:pointStyle||style.pointStyle,rotation:style.rotation,textAlign:textAlign||style.textAlign,borderRadius:0,datasetIndex:meta.index};},this);}},title:{color:(ctx)=>ctx.chart.options.color,display:false,position:'center',text:'',}},descriptors:{_scriptable:(name)=>!name.startsWith('on'),labels:{_scriptable:(name)=>!['generateLabels','filter','sort'].includes(name),}},};class Title extends Element{constructor(config){super();this.chart=config.chart;this.options=config.options;this.ctx=config.ctx;this._padding=undefined;this.top=undefined;this.bottom=undefined;this.left=undefined;this.right=undefined;this.width=undefined;this.height=undefined;this.position=undefined;this.weight=undefined;this.fullSize=undefined;} -update(maxWidth,maxHeight){const me=this;const opts=me.options;me.left=0;me.top=0;if(!opts.display){me.width=me.height=me.right=me.bottom=0;return;} -me.width=me.right=maxWidth;me.height=me.bottom=maxHeight;const lineCount=isArray(opts.text)?opts.text.length:1;me._padding=toPadding(opts.padding);const textSize=lineCount*toFont(opts.font).lineHeight+me._padding.height;if(me.isHorizontal()){me.height=textSize;}else{me.width=textSize;}} -isHorizontal(){const pos=this.options.position;return pos==='top'||pos==='bottom';} -_drawArgs(offset){const{top,left,bottom,right,options}=this;const align=options.align;let rotation=0;let maxWidth,titleX,titleY;if(this.isHorizontal()){titleX=_alignStartEnd(align,left,right);titleY=top+offset;maxWidth=right-left;}else{if(options.position==='left'){titleX=left+offset;titleY=_alignStartEnd(align,bottom,top);rotation=PI*-0.5;}else{titleX=right-offset;titleY=_alignStartEnd(align,top,bottom);rotation=PI*0.5;} -maxWidth=bottom-top;} -return{titleX,titleY,maxWidth,rotation};} -draw(){const me=this;const ctx=me.ctx;const opts=me.options;if(!opts.display){return;} -const fontOpts=toFont(opts.font);const lineHeight=fontOpts.lineHeight;const offset=lineHeight/2+me._padding.top;const{titleX,titleY,maxWidth,rotation}=me._drawArgs(offset);renderText(ctx,opts.text,0,0,fontOpts,{color:opts.color,maxWidth,rotation,textAlign:_toLeftRightCenter(opts.align),textBaseline:'middle',translation:[titleX,titleY],});}} -function createTitle(chart,titleOpts){const title=new Title({ctx:chart.ctx,options:titleOpts,chart});layouts.configure(chart,title,titleOpts);layouts.addBox(chart,title);chart.titleBlock=title;} -var plugin_title={id:'title',_element:Title,start(chart,_args,options){createTitle(chart,options);},stop(chart){const titleBlock=chart.titleBlock;layouts.removeBox(chart,titleBlock);delete chart.titleBlock;},beforeUpdate(chart,_args,options){const title=chart.titleBlock;layouts.configure(chart,title,options);title.options=options;},defaults:{align:'center',display:false,font:{weight:'bold',},fullSize:true,padding:10,position:'top',text:'',weight:2000},defaultRoutes:{color:'color'},descriptors:{_scriptable:true,_indexable:false,},};const map=new WeakMap();var plugin_subtitle={id:'subtitle',start(chart,_args,options){const title=new Title({ctx:chart.ctx,options,chart});layouts.configure(chart,title,options);layouts.addBox(chart,title);map.set(chart,title);},stop(chart){layouts.removeBox(chart,map.get(chart));map.delete(chart);},beforeUpdate(chart,_args,options){const title=map.get(chart);layouts.configure(chart,title,options);title.options=options;},defaults:{align:'center',display:false,font:{weight:'normal',},fullSize:true,padding:0,position:'top',text:'',weight:1500},defaultRoutes:{color:'color'},descriptors:{_scriptable:true,_indexable:false,},};const positioners={average(items){if(!items.length){return false;} -let i,len;let x=0;let y=0;let count=0;for(i=0,len=items.length;i-1){return str.split('\n');} -return str;} -function createTooltipItem(chart,item){const{element,datasetIndex,index}=item;const controller=chart.getDatasetMeta(datasetIndex).controller;const{label,value}=controller.getLabelAndValue(index);return{chart,label,parsed:controller.getParsed(index),raw:chart.data.datasets[datasetIndex].data[index],formattedValue:value,dataset:controller.getDataset(),dataIndex:index,datasetIndex,element};} -function getTooltipSize(tooltip,options){const ctx=tooltip._chart.ctx;const{body,footer,title}=tooltip;const{boxWidth,boxHeight}=options;const bodyFont=toFont(options.bodyFont);const titleFont=toFont(options.titleFont);const footerFont=toFont(options.footerFont);const titleLineCount=title.length;const footerLineCount=footer.length;const bodyLineItemCount=body.length;const padding=toPadding(options.padding);let height=padding.height;let width=0;let combinedBodyLength=body.reduce((count,bodyItem)=>count+bodyItem.before.length+bodyItem.lines.length+bodyItem.after.length,0);combinedBodyLength+=tooltip.beforeBody.length+tooltip.afterBody.length;if(titleLineCount){height+=titleLineCount*titleFont.lineHeight -+(titleLineCount-1)*options.titleSpacing -+options.titleMarginBottom;} -if(combinedBodyLength){const bodyLineHeight=options.displayColors?Math.max(boxHeight,bodyFont.lineHeight):bodyFont.lineHeight;height+=bodyLineItemCount*bodyLineHeight -+(combinedBodyLength-bodyLineItemCount)*bodyFont.lineHeight -+(combinedBodyLength-1)*options.bodySpacing;} -if(footerLineCount){height+=options.footerMarginTop -+footerLineCount*footerFont.lineHeight -+(footerLineCount-1)*options.footerSpacing;} -let widthPadding=0;const maxLineWidth=function(line){width=Math.max(width,ctx.measureText(line).width+widthPadding);};ctx.save();ctx.font=titleFont.string;each(tooltip.title,maxLineWidth);ctx.font=bodyFont.string;each(tooltip.beforeBody.concat(tooltip.afterBody),maxLineWidth);widthPadding=options.displayColors?(boxWidth+2):0;each(body,(bodyItem)=>{each(bodyItem.before,maxLineWidth);each(bodyItem.lines,maxLineWidth);each(bodyItem.after,maxLineWidth);});widthPadding=0;ctx.font=footerFont.string;each(tooltip.footer,maxLineWidth);ctx.restore();width+=padding.width;return{width,height};} -function determineYAlign(chart,size){const{y,height}=size;if(y(chart.height-height/2)){return'bottom';} -return'center';} -function doesNotFitWithAlign(xAlign,chart,options,size){const{x,width}=size;const caret=options.caretSize+options.caretPadding;if(xAlign==='left'&&x+width+caret>chart.width){return true;} -if(xAlign==='right'&&x-width-caret<0){return true;}} -function determineXAlign(chart,options,size,yAlign){const{x,width}=size;const{width:chartWidth,chartArea:{left,right}}=chart;let xAlign='center';if(yAlign==='center'){xAlign=x<=(left+right)/2?'left':'right';}else if(x<=width/2){xAlign='left';}else if(x>=chartWidth-width/2){xAlign='right';} -if(doesNotFitWithAlign(xAlign,chart,options,size)){xAlign='center';} -return xAlign;} -function determineAlignment(chart,options,size){const yAlign=options.yAlign||determineYAlign(chart,size);return{xAlign:options.xAlign||determineXAlign(chart,options,size,yAlign),yAlign};} -function alignX(size,xAlign){let{x,width}=size;if(xAlign==='right'){x-=width;}else if(xAlign==='center'){x-=(width/2);} -return x;} -function alignY(size,yAlign,paddingAndSize){let{y,height}=size;if(yAlign==='top'){y+=paddingAndSize;}else if(yAlign==='bottom'){y-=height+paddingAndSize;}else{y-=(height/2);} -return y;} -function getBackgroundPoint(options,size,alignment,chart){const{caretSize,caretPadding,cornerRadius}=options;const{xAlign,yAlign}=alignment;const paddingAndSize=caretSize+caretPadding;const radiusAndPadding=cornerRadius+caretPadding;let x=alignX(size,xAlign);const y=alignY(size,yAlign,paddingAndSize);if(yAlign==='center'){if(xAlign==='left'){x+=paddingAndSize;}else if(xAlign==='right'){x-=paddingAndSize;}}else if(xAlign==='left'){x-=radiusAndPadding;}else if(xAlign==='right'){x+=radiusAndPadding;} -return{x:_limitValue(x,0,chart.width-size.width),y:_limitValue(y,0,chart.height-size.height)};} -function getAlignedX(tooltip,align,options){const padding=toPadding(options.padding);return align==='center'?tooltip.x+tooltip.width/2:align==='right'?tooltip.x+tooltip.width-padding.right:tooltip.x+padding.left;} -function getBeforeAfterBodyLines(callback){return pushOrConcat([],splitNewlines(callback));} -function createTooltipContext(parent,tooltip,tooltipItems){return Object.assign(Object.create(parent),{tooltip,tooltipItems,type:'tooltip'});} -function overrideCallbacks(callbacks,context){const override=context&&context.dataset&&context.dataset.tooltip&&context.dataset.tooltip.callbacks;return override?callbacks.override(override):callbacks;} -class Tooltip extends Element{constructor(config){super();this.opacity=0;this._active=[];this._chart=config._chart;this._eventPosition=undefined;this._size=undefined;this._cachedAnimations=undefined;this._tooltipItems=[];this.$animations=undefined;this.$context=undefined;this.options=config.options;this.dataPoints=undefined;this.title=undefined;this.beforeBody=undefined;this.body=undefined;this.afterBody=undefined;this.footer=undefined;this.xAlign=undefined;this.yAlign=undefined;this.x=undefined;this.y=undefined;this.height=undefined;this.width=undefined;this.caretX=undefined;this.caretY=undefined;this.labelColors=undefined;this.labelPointStyles=undefined;this.labelTextColors=undefined;} -initialize(options){this.options=options;this._cachedAnimations=undefined;this.$context=undefined;} -_resolveAnimations(){const me=this;const cached=me._cachedAnimations;if(cached){return cached;} -const chart=me._chart;const options=me.options.setContext(me.getContext());const opts=options.enabled&&chart.options.animation&&options.animations;const animations=new Animations(me._chart,opts);if(opts._cacheable){me._cachedAnimations=Object.freeze(animations);} -return animations;} -getContext(){const me=this;return me.$context||(me.$context=createTooltipContext(me._chart.getContext(),me,me._tooltipItems));} -getTitle(context,options){const me=this;const{callbacks}=options;const beforeTitle=callbacks.beforeTitle.apply(me,[context]);const title=callbacks.title.apply(me,[context]);const afterTitle=callbacks.afterTitle.apply(me,[context]);let lines=[];lines=pushOrConcat(lines,splitNewlines(beforeTitle));lines=pushOrConcat(lines,splitNewlines(title));lines=pushOrConcat(lines,splitNewlines(afterTitle));return lines;} -getBeforeBody(tooltipItems,options){return getBeforeAfterBodyLines(options.callbacks.beforeBody.apply(this,[tooltipItems]));} -getBody(tooltipItems,options){const me=this;const{callbacks}=options;const bodyItems=[];each(tooltipItems,(context)=>{const bodyItem={before:[],lines:[],after:[]};const scoped=overrideCallbacks(callbacks,context);pushOrConcat(bodyItem.before,splitNewlines(scoped.beforeLabel.call(me,context)));pushOrConcat(bodyItem.lines,scoped.label.call(me,context));pushOrConcat(bodyItem.after,splitNewlines(scoped.afterLabel.call(me,context)));bodyItems.push(bodyItem);});return bodyItems;} -getAfterBody(tooltipItems,options){return getBeforeAfterBodyLines(options.callbacks.afterBody.apply(this,[tooltipItems]));} -getFooter(tooltipItems,options){const me=this;const{callbacks}=options;const beforeFooter=callbacks.beforeFooter.apply(me,[tooltipItems]);const footer=callbacks.footer.apply(me,[tooltipItems]);const afterFooter=callbacks.afterFooter.apply(me,[tooltipItems]);let lines=[];lines=pushOrConcat(lines,splitNewlines(beforeFooter));lines=pushOrConcat(lines,splitNewlines(footer));lines=pushOrConcat(lines,splitNewlines(afterFooter));return lines;} -_createItems(options){const me=this;const active=me._active;const data=me._chart.data;const labelColors=[];const labelPointStyles=[];const labelTextColors=[];let tooltipItems=[];let i,len;for(i=0,len=active.length;ioptions.filter(element,index,array,data));} -if(options.itemSort){tooltipItems=tooltipItems.sort((a,b)=>options.itemSort(a,b,data));} -each(tooltipItems,(context)=>{const scoped=overrideCallbacks(options.callbacks,context);labelColors.push(scoped.labelColor.call(me,context));labelPointStyles.push(scoped.labelPointStyle.call(me,context));labelTextColors.push(scoped.labelTextColor.call(me,context));});me.labelColors=labelColors;me.labelPointStyles=labelPointStyles;me.labelTextColors=labelTextColors;me.dataPoints=tooltipItems;return tooltipItems;} -update(changed,replay){const me=this;const options=me.options.setContext(me.getContext());const active=me._active;let properties;let tooltipItems=[];if(!active.length){if(me.opacity!==0){properties={opacity:0};}}else{const position=positioners[options.position].call(me,active,me._eventPosition);tooltipItems=me._createItems(options);me.title=me.getTitle(tooltipItems,options);me.beforeBody=me.getBeforeBody(tooltipItems,options);me.body=me.getBody(tooltipItems,options);me.afterBody=me.getAfterBody(tooltipItems,options);me.footer=me.getFooter(tooltipItems,options);const size=me._size=getTooltipSize(me,options);const positionAndSize=Object.assign({},position,size);const alignment=determineAlignment(me._chart,options,positionAndSize);const backgroundPoint=getBackgroundPoint(options,positionAndSize,alignment,me._chart);me.xAlign=alignment.xAlign;me.yAlign=alignment.yAlign;properties={opacity:1,x:backgroundPoint.x,y:backgroundPoint.y,width:size.width,height:size.height,caretX:position.x,caretY:position.y};} -me._tooltipItems=tooltipItems;me.$context=undefined;if(properties){me._resolveAnimations().update(me,properties);} -if(changed&&options.external){options.external.call(me,{chart:me._chart,tooltip:me,replay});}} -drawCaret(tooltipPoint,ctx,size,options){const caretPosition=this.getCaretPosition(tooltipPoint,size,options);ctx.lineTo(caretPosition.x1,caretPosition.y1);ctx.lineTo(caretPosition.x2,caretPosition.y2);ctx.lineTo(caretPosition.x3,caretPosition.y3);} -getCaretPosition(tooltipPoint,size,options){const{xAlign,yAlign}=this;const{cornerRadius,caretSize}=options;const{x:ptX,y:ptY}=tooltipPoint;const{width,height}=size;let x1,x2,x3,y1,y2,y3;if(yAlign==='center'){y2=ptY+(height/2);if(xAlign==='left'){x1=ptX;x2=x1-caretSize;y1=y2+caretSize;y3=y2-caretSize;}else{x1=ptX+width;x2=x1+caretSize;y1=y2-caretSize;y3=y2+caretSize;} -x3=x1;}else{if(xAlign==='left'){x2=ptX+cornerRadius+(caretSize);}else if(xAlign==='right'){x2=ptX+width-cornerRadius-caretSize;}else{x2=this.caretX;} -if(yAlign==='top'){y1=ptY;y2=y1-caretSize;x1=x2-caretSize;x3=x2+caretSize;}else{y1=ptY+height;y2=y1+caretSize;x1=x2+caretSize;x3=x2-caretSize;} -y3=y1;} -return{x1,x2,x3,y1,y2,y3};} -drawTitle(pt,ctx,options){const me=this;const title=me.title;const length=title.length;let titleFont,titleSpacing,i;if(length){const rtlHelper=getRtlAdapter(options.rtl,me.x,me.width);pt.x=getAlignedX(me,options.titleAlign,options);ctx.textAlign=rtlHelper.textAlign(options.titleAlign);ctx.textBaseline='middle';titleFont=toFont(options.titleFont);titleSpacing=options.titleSpacing;ctx.fillStyle=options.titleColor;ctx.font=titleFont.string;for(i=0;iv!==0)){ctx.beginPath();ctx.fillStyle=options.multiKeyBackground;addRoundedRectPath(ctx,{x:outerX,y:colorY,w:boxWidth,h:boxHeight,radius:borderRadius,});ctx.fill();ctx.stroke();ctx.fillStyle=labelColors.backgroundColor;ctx.beginPath();addRoundedRectPath(ctx,{x:innerX,y:colorY+1,w:boxWidth-2,h:boxHeight-2,radius:borderRadius,});ctx.fill();}else{ctx.fillStyle=options.multiKeyBackground;ctx.fillRect(outerX,colorY,boxWidth,boxHeight);ctx.strokeRect(outerX,colorY,boxWidth,boxHeight);ctx.fillStyle=labelColors.backgroundColor;ctx.fillRect(innerX,colorY+1,boxWidth-2,boxHeight-2);}} -ctx.fillStyle=me.labelTextColors[i];} -drawBody(pt,ctx,options){const me=this;const{body}=me;const{bodySpacing,bodyAlign,displayColors,boxHeight,boxWidth}=options;const bodyFont=toFont(options.bodyFont);let bodyLineHeight=bodyFont.lineHeight;let xLinePadding=0;const rtlHelper=getRtlAdapter(options.rtl,me.x,me.width);const fillLineOfText=function(line){ctx.fillText(line,rtlHelper.x(pt.x+xLinePadding),pt.y+bodyLineHeight/2);pt.y+=bodyLineHeight+bodySpacing;};const bodyAlignForCalculation=rtlHelper.textAlign(bodyAlign);let bodyItem,textColor,lines,i,j,ilen,jlen;ctx.textAlign=bodyAlign;ctx.textBaseline='middle';ctx.font=bodyFont.string;pt.x=getAlignedX(me,bodyAlignForCalculation,options);ctx.fillStyle=options.bodyColor;each(me.beforeBody,fillLineOfText);xLinePadding=displayColors&&bodyAlignForCalculation!=='right'?bodyAlign==='center'?(boxWidth/2+1):(boxWidth+2):0;for(i=0,ilen=body.length;i0){ctx.stroke();}} -_updateAnimationTarget(options){const me=this;const chart=me._chart;const anims=me.$animations;const animX=anims&&anims.x;const animY=anims&&anims.y;if(animX||animY){const position=positioners[options.position].call(me,me._active,me._eventPosition);if(!position){return;} -const size=me._size=getTooltipSize(me,options);const positionAndSize=Object.assign({},position,me._size);const alignment=determineAlignment(chart,options,positionAndSize);const point=getBackgroundPoint(options,positionAndSize,alignment,chart);if(animX._to!==point.x||animY._to!==point.y){me.xAlign=alignment.xAlign;me.yAlign=alignment.yAlign;me.width=size.width;me.height=size.height;me.caretX=position.x;me.caretY=position.y;me._resolveAnimations().update(me,point);}}} -draw(ctx){const me=this;const options=me.options.setContext(me.getContext());let opacity=me.opacity;if(!opacity){return;} -me._updateAnimationTarget(options);const tooltipSize={width:me.width,height:me.height};const pt={x:me.x,y:me.y};opacity=Math.abs(opacity)<1e-3?0:opacity;const padding=toPadding(options.padding);const hasTooltipContent=me.title.length||me.beforeBody.length||me.body.length||me.afterBody.length||me.footer.length;if(options.enabled&&hasTooltipContent){ctx.save();ctx.globalAlpha=opacity;me.drawBackground(pt,ctx,tooltipSize,options);overrideTextDirection(ctx,options.textDirection);pt.y+=padding.top;me.drawTitle(pt,ctx,options);me.drawBody(pt,ctx,options);me.drawFooter(pt,ctx,options);restoreTextDirection(ctx,options.textDirection);ctx.restore();}} -getActiveElements(){return this._active||[];} -setActiveElements(activeElements,eventPosition){const me=this;const lastActive=me._active;const active=activeElements.map(({datasetIndex,index})=>{const meta=me._chart.getDatasetMeta(datasetIndex);if(!meta){throw new Error('Cannot find a dataset at index '+datasetIndex);} -return{datasetIndex,element:meta.data[index],index,};});const changed=!_elementsEqual(lastActive,active);const positionChanged=me._positionChanged(active,eventPosition);if(changed||positionChanged){me._active=active;me._eventPosition=eventPosition;me.update(true);}} -handleEvent(e,replay){const me=this;const options=me.options;const lastActive=me._active||[];let changed=false;let active=[];if(e.type!=='mouseout'){active=me._chart.getElementsAtEventForMode(e,options.mode,options,replay);if(options.reverse){active.reverse();}} -const positionChanged=me._positionChanged(active,e);changed=replay||!_elementsEqual(active,lastActive)||positionChanged;if(changed){me._active=active;if(options.enabled||options.external){me._eventPosition={x:e.x,y:e.y};me.update(true,replay);}} -return changed;} -_positionChanged(active,e){const{caretX,caretY,options}=this;const position=positioners[options.position].call(this,active,e);return position!==false&&(caretX!==position.x||caretY!==position.y);}} -Tooltip.positioners=positioners;var plugin_tooltip={id:'tooltip',_element:Tooltip,positioners,afterInit(chart,_args,options){if(options){chart.tooltip=new Tooltip({_chart:chart,options});}},beforeUpdate(chart,_args,options){if(chart.tooltip){chart.tooltip.initialize(options);}},reset(chart,_args,options){if(chart.tooltip){chart.tooltip.initialize(options);}},afterDraw(chart){const tooltip=chart.tooltip;const args={tooltip};if(chart.notifyPlugins('beforeTooltipDraw',args)===false){return;} -if(tooltip){tooltip.draw(chart.ctx);} -chart.notifyPlugins('afterTooltipDraw',args);},afterEvent(chart,args){if(chart.tooltip){const useFinalPosition=args.replay;if(chart.tooltip.handleEvent(args.event,useFinalPosition)){args.changed=true;}}},defaults:{enabled:true,external:null,position:'average',backgroundColor:'rgba(0,0,0,0.8)',titleColor:'#fff',titleFont:{weight:'bold',},titleSpacing:2,titleMarginBottom:6,titleAlign:'left',bodyColor:'#fff',bodySpacing:2,bodyFont:{},bodyAlign:'left',footerColor:'#fff',footerSpacing:2,footerMarginTop:6,footerFont:{weight:'bold',},footerAlign:'left',padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(ctx,opts)=>opts.bodyFont.size,boxWidth:(ctx,opts)=>opts.bodyFont.size,multiKeyBackground:'#fff',displayColors:true,borderColor:'rgba(0,0,0,0)',borderWidth:0,animation:{duration:400,easing:'easeOutQuart',},animations:{numbers:{type:'number',properties:['x','y','width','height','caretX','caretY'],},opacity:{easing:'linear',duration:200}},callbacks:{beforeTitle:noop,title(tooltipItems){if(tooltipItems.length>0){const item=tooltipItems[0];const labels=item.chart.data.labels;const labelCount=labels?labels.length:0;if(this&&this.options&&this.options.mode==='dataset'){return item.dataset.label||'';}else if(item.label){return item.label;}else if(labelCount>0&&item.dataIndexname!=='filter'&&name!=='itemSort'&&name!=='external',_indexable:false,callbacks:{_scriptable:false,_indexable:false,},animation:{_fallback:false},animations:{_fallback:'animation'}},additionalOptionScopes:['interaction']};var plugins=Object.freeze({__proto__:null,Decimation:plugin_decimation,Filler:plugin_filler,Legend:plugin_legend,SubTitle:plugin_subtitle,Title:plugin_title,Tooltip:plugin_tooltip});const addIfString=(labels,raw,index)=>typeof raw==='string'?labels.push(raw)-1:isNaN(raw)?null:index;function findOrAddLabel(labels,raw,index){const first=labels.indexOf(raw);if(first===-1){return addIfString(labels,raw,index);} -const last=labels.lastIndexOf(raw);return first!==last?index:first;} -const validIndex=(index,max)=>index===null?null:_limitValue(Math.round(index),0,max);class CategoryScale extends Scale{constructor(cfg){super(cfg);this._startValue=undefined;this._valueRange=0;} -parse(raw,index){if(isNullOrUndef(raw)){return null;} -const labels=this.getLabels();index=isFinite(index)&&labels[index]===raw?index:findOrAddLabel(labels,raw,valueOrDefault(index,raw));return validIndex(index,labels.length-1);} -determineDataLimits(){const me=this;const{minDefined,maxDefined}=me.getUserBounds();let{min,max}=me.getMinMax(true);if(me.options.bounds==='ticks'){if(!minDefined){min=0;} -if(!maxDefined){max=me.getLabels().length-1;}} -me.min=min;me.max=max;} -buildTicks(){const me=this;const min=me.min;const max=me.max;const offset=me.options.offset;const ticks=[];let labels=me.getLabels();labels=(min===0&&max===labels.length-1)?labels:labels.slice(min,max+1);me._valueRange=Math.max(labels.length-(offset?0:1),1);me._startValue=me.min-(offset?0.5:0);for(let value=min;value<=max;value++){ticks.push({value});} -return ticks;} -getLabelForValue(value){const me=this;const labels=me.getLabels();if(value>=0&&valueticks.length-1){return null;} -return me.getPixelForValue(ticks[index].value);} -getValueForPixel(pixel){const me=this;return Math.round(me._startValue+me.getDecimalForPixel(pixel)*me._valueRange);} -getBasePixel(){return this.bottom;}} -CategoryScale.id='category';CategoryScale.defaults={ticks:{callback:CategoryScale.prototype.getLabelForValue}};function generateTicks$1(generationOptions,dataRange){const ticks=[];const MIN_SPACING=1e-14;const{bounds,step,min,max,precision,count,maxTicks,maxDigits,includeBounds}=generationOptions;const unit=step||1;const maxSpaces=maxTicks-1;const{min:rmin,max:rmax}=dataRange;const minDefined=!isNullOrUndef(min);const maxDefined=!isNullOrUndef(max);const countDefined=!isNullOrUndef(count);const minSpacing=(rmax-rmin)/(maxDigits+1);let spacing=niceNum((rmax-rmin)/maxSpaces/unit)*unit;let factor,niceMin,niceMax,numSpaces;if(spacingmaxSpaces){spacing=niceNum(numSpaces*spacing/maxSpaces/unit)*unit;} -if(!isNullOrUndef(precision)){factor=Math.pow(10,precision);spacing=Math.ceil(spacing*factor)/factor;} -if(bounds==='ticks'){niceMin=Math.floor(rmin/spacing)*spacing;niceMax=Math.ceil(rmax/spacing)*spacing;}else{niceMin=rmin;niceMax=rmax;} -if(minDefined&&maxDefined&&step&&almostWhole((max-min)/step,spacing/1000)){numSpaces=Math.round(Math.min((max-min)/spacing,maxTicks));spacing=(max-min)/numSpaces;niceMin=min;niceMax=max;}else if(countDefined){niceMin=minDefined?min:niceMin;niceMax=maxDefined?max:niceMax;numSpaces=count-1;spacing=(niceMax-niceMin)/numSpaces;}else{numSpaces=(niceMax-niceMin)/spacing;if(almostEquals(numSpaces,Math.round(numSpaces),spacing/1000)){numSpaces=Math.round(numSpaces);}else{numSpaces=Math.ceil(numSpaces);}} -const decimalPlaces=Math.max(_decimalPlaces(spacing),_decimalPlaces(niceMin));factor=Math.pow(10,isNullOrUndef(precision)?decimalPlaces:precision);niceMin=Math.round(niceMin*factor)/factor;niceMax=Math.round(niceMax*factor)/factor;let j=0;if(minDefined){if(includeBounds&&niceMin!==min){ticks.push({value:min});if(niceMin(min=minDefined?min:v);const setMax=v=>(max=maxDefined?max:v);if(beginAtZero){const minSign=sign(min);const maxSign=sign(max);if(minSign<0&&maxSign<0){setMax(0);}else if(minSign>0&&maxSign>0){setMin(0);}} -if(min===max){let offset=1;if(max>=Number.MAX_SAFE_INTEGER||min<=Number.MIN_SAFE_INTEGER){offset=Math.abs(max*0.05);} -setMax(max+offset);if(!beginAtZero){setMin(min-offset);}} -me.min=min;me.max=max;} -getTickLimit(){const me=this;const tickOpts=me.options.ticks;let{maxTicksLimit,stepSize}=tickOpts;let maxTicks;if(stepSize){maxTicks=Math.ceil(me.max/stepSize)-Math.floor(me.min/stepSize)+1;}else{maxTicks=me.computeTickLimit();maxTicksLimit=maxTicksLimit||11;} -if(maxTicksLimit){maxTicks=Math.min(maxTicksLimit,maxTicks);} -return maxTicks;} -computeTickLimit(){return Number.POSITIVE_INFINITY;} -buildTicks(){const me=this;const opts=me.options;const tickOpts=opts.ticks;let maxTicks=me.getTickLimit();maxTicks=Math.max(2,maxTicks);const numericGeneratorOptions={maxTicks,bounds:opts.bounds,min:opts.min,max:opts.max,precision:tickOpts.precision,step:tickOpts.stepSize,count:tickOpts.count,maxDigits:me._maxDigits(),horizontal:me.isHorizontal(),minRotation:tickOpts.minRotation||0,includeBounds:tickOpts.includeBounds!==false};const dataRange=me._range||me;const ticks=generateTicks$1(numericGeneratorOptions,dataRange);if(opts.bounds==='ticks'){_setMinAndMaxByKey(ticks,me,'value');} -if(opts.reverse){ticks.reverse();me.start=me.max;me.end=me.min;}else{me.start=me.min;me.end=me.max;} -return ticks;} -configure(){const me=this;const ticks=me.ticks;let start=me.min;let end=me.max;super.configure();if(me.options.offset&&ticks.length){const offset=(end-start)/Math.max(ticks.length-1,1)/2;start-=offset;end+=offset;} -me._startValue=start;me._endValue=end;me._valueRange=end-start;} -getLabelForValue(value){return formatNumber(value,this.chart.options.locale);}} -class LinearScale extends LinearScaleBase{determineDataLimits(){const me=this;const{min,max}=me.getMinMax(true);me.min=isNumberFinite(min)?min:0;me.max=isNumberFinite(max)?max:1;me.handleTickRangeOptions();} -computeTickLimit(){const me=this;const horizontal=me.isHorizontal();const length=horizontal?me.width:me.height;const minRotation=toRadians(me.options.ticks.minRotation);const ratio=(horizontal?Math.sin(minRotation):Math.cos(minRotation))||0.001;const tickFont=me._resolveTickFontOptions(0);return Math.ceil(length/Math.min(40,tickFont.lineHeight/ratio));} -getPixelForValue(value){return value===null?NaN:this.getPixelForDecimal((value-this._startValue)/this._valueRange);} -getValueForPixel(pixel){return this._startValue+this.getDecimalForPixel(pixel)*this._valueRange;}} -LinearScale.id='linear';LinearScale.defaults={ticks:{callback:Ticks.formatters.numeric}};function isMajor(tickVal){const remain=tickVal/(Math.pow(10,Math.floor(log10(tickVal))));return remain===1;} -function generateTicks(generationOptions,dataRange){const endExp=Math.floor(log10(dataRange.max));const endSignificand=Math.ceil(dataRange.max/Math.pow(10,endExp));const ticks=[];let tickVal=finiteOrDefault(generationOptions.min,Math.pow(10,Math.floor(log10(dataRange.min))));let exp=Math.floor(log10(tickVal));let significand=Math.floor(tickVal/Math.pow(10,exp));let precision=exp<0?Math.pow(10,Math.abs(exp)):1;do{ticks.push({value:tickVal,major:isMajor(tickVal)});++significand;if(significand===10){significand=1;++exp;precision=exp>=0?1:precision;} -tickVal=Math.round(significand*Math.pow(10,exp)*precision)/precision;}while(exp0?value:null;} -determineDataLimits(){const me=this;const{min,max}=me.getMinMax(true);me.min=isNumberFinite(min)?Math.max(0,min):null;me.max=isNumberFinite(max)?Math.max(0,max):null;if(me.options.beginAtZero){me._zero=true;} -me.handleTickRangeOptions();} -handleTickRangeOptions(){const me=this;const{minDefined,maxDefined}=me.getUserBounds();let min=me.min;let max=me.max;const setMin=v=>(min=minDefined?min:v);const setMax=v=>(max=maxDefined?max:v);const exp=(v,m)=>Math.pow(10,Math.floor(log10(v))+m);if(min===max){if(min<=0){setMin(1);setMax(10);}else{setMin(exp(min,-1));setMax(exp(max,+1));}} -if(min<=0){setMin(exp(max,-1));} -if(max<=0){setMax(exp(min,+1));} -if(me._zero&&me.min!==me._suggestedMin&&min===exp(me.min,0)){setMin(exp(min,-1));} -me.min=min;me.max=max;} -buildTicks(){const me=this;const opts=me.options;const generationOptions={min:me._userMin,max:me._userMax};const ticks=generateTicks(generationOptions,me);if(opts.bounds==='ticks'){_setMinAndMaxByKey(ticks,me,'value');} -if(opts.reverse){ticks.reverse();me.start=me.max;me.end=me.min;}else{me.start=me.min;me.end=me.max;} -return ticks;} -getLabelForValue(value){return value===undefined?'0':formatNumber(value,this.chart.options.locale);} -configure(){const me=this;const start=me.min;super.configure();me._startValue=log10(start);me._valueRange=log10(me.max)-log10(start);} -getPixelForValue(value){const me=this;if(value===undefined||value===0){value=me.min;} -if(value===null||isNaN(value)){return NaN;} -return me.getPixelForDecimal(value===me.min?0:(log10(value)-me._startValue)/me._valueRange);} -getValueForPixel(pixel){const me=this;const decimal=me.getDecimalForPixel(pixel);return Math.pow(10,me._startValue+decimal*me._valueRange);}} -LogarithmicScale.id='logarithmic';LogarithmicScale.defaults={ticks:{callback:Ticks.formatters.logarithmic,major:{enabled:true}}};function getTickBackdropHeight(opts){const tickOpts=opts.ticks;if(tickOpts.display&&opts.display){const padding=toPadding(tickOpts.backdropPadding);return valueOrDefault(tickOpts.font&&tickOpts.font.size,defaults.font.size)+padding.height;} -return 0;} -function measureLabelSize(ctx,font,label){label=isArray(label)?label:[label];return{w:_longestText(ctx,font.string,label),h:label.length*font.lineHeight};} -function determineLimits(angle,pos,size,min,max){if(angle===min||angle===max){return{start:pos-(size/2),end:pos+(size/2)};}else if(anglemax){return{start:pos-size,end:pos};} -return{start:pos,end:pos+size};} -function fitWithPointLabels(scale){const furthestLimits={l:0,r:scale.width,t:0,b:scale.height-scale.paddingTop};const furthestAngles={};const labelSizes=[];const padding=[];const valueCount=scale.getLabels().length;for(let i=0;ifurthestLimits.r){furthestLimits.r=hLimits.end;furthestAngles.r=angleRadians;} -if(vLimits.startfurthestLimits.b){furthestLimits.b=vLimits.end;furthestAngles.b=angleRadians;}} -scale._setReductions(scale.drawingArea,furthestLimits,furthestAngles);scale._pointLabelItems=buildPointLabelItems(scale,labelSizes,padding);} -function buildPointLabelItems(scale,labelSizes,padding){const items=[];const valueCount=scale.getLabels().length;const opts=scale.options;const tickBackdropHeight=getTickBackdropHeight(opts);const outerDistance=scale.getDistanceFromCenterForValue(opts.ticks.reverse?scale.min:scale.max);for(let i=0;i270||angle<90){y-=h;} -return y;} -function drawPointLabels(scale,labelCount){const{ctx,options:{pointLabels}}=scale;for(let i=labelCount-1;i>=0;i--){const optsAtIndex=pointLabels.setContext(scale.getPointLabelContext(i));const plFont=toFont(optsAtIndex.font);const{x,y,textAlign,left,top,right,bottom}=scale._pointLabelItems[i];const{backdropColor}=optsAtIndex;if(!isNullOrUndef(backdropColor)){const padding=toPadding(optsAtIndex.backdropPadding);ctx.fillStyle=backdropColor;ctx.fillRect(left-padding.left,top-padding.top,right-left+padding.width,bottom-top+padding.height);} -renderText(ctx,scale._pointLabels[i],x,y+(plFont.lineHeight/2),plFont,{color:optsAtIndex.color,textAlign:textAlign,textBaseline:'middle'});}} -function pathRadiusLine(scale,radius,circular,labelCount){const{ctx}=scale;if(circular){ctx.arc(scale.xCenter,scale.yCenter,radius,0,TAU);}else{let pointPosition=scale.getPointPosition(0,radius);ctx.moveTo(pointPosition.x,pointPosition.y);for(let i=1;i{const label=callback(me.options.pointLabels.callback,[value,index],me);return label||label===0?label:'';});} -fit(){const me=this;const opts=me.options;if(opts.display&&opts.pointLabels.display){fitWithPointLabels(me);}else{me.setCenterPoint(0,0,0,0);}} -_setReductions(largestPossibleRadius,furthestLimits,furthestAngles){const me=this;let radiusReductionLeft=furthestLimits.l/Math.sin(furthestAngles.l);let radiusReductionRight=Math.max(furthestLimits.r-me.width,0)/Math.sin(furthestAngles.r);let radiusReductionTop=-furthestLimits.t/Math.cos(furthestAngles.t);let radiusReductionBottom=-Math.max(furthestLimits.b-(me.height-me.paddingTop),0)/Math.cos(furthestAngles.b);radiusReductionLeft=numberOrZero(radiusReductionLeft);radiusReductionRight=numberOrZero(radiusReductionRight);radiusReductionTop=numberOrZero(radiusReductionTop);radiusReductionBottom=numberOrZero(radiusReductionBottom);me.drawingArea=Math.max(largestPossibleRadius/2,Math.min(Math.floor(largestPossibleRadius-(radiusReductionLeft+radiusReductionRight)/2),Math.floor(largestPossibleRadius-(radiusReductionTop+radiusReductionBottom)/2)));me.setCenterPoint(radiusReductionLeft,radiusReductionRight,radiusReductionTop,radiusReductionBottom);} -setCenterPoint(leftMovement,rightMovement,topMovement,bottomMovement){const me=this;const maxRight=me.width-rightMovement-me.drawingArea;const maxLeft=leftMovement+me.drawingArea;const maxTop=topMovement+me.drawingArea;const maxBottom=(me.height-me.paddingTop)-bottomMovement-me.drawingArea;me.xCenter=Math.floor(((maxLeft+maxRight)/2)+me.left);me.yCenter=Math.floor(((maxTop+maxBottom)/2)+me.top+me.paddingTop);} -getIndexAngle(index){const angleMultiplier=TAU/this.getLabels().length;const startAngle=this.options.startAngle||0;return _normalizeAngle(index*angleMultiplier+toRadians(startAngle));} -getDistanceFromCenterForValue(value){const me=this;if(isNullOrUndef(value)){return NaN;} -const scalingFactor=me.drawingArea/(me.max-me.min);if(me.options.reverse){return(me.max-value)*scalingFactor;} -return(value-me.min)*scalingFactor;} -getValueForDistanceFromCenter(distance){if(isNullOrUndef(distance)){return NaN;} -const me=this;const scaledDistance=distance/(me.drawingArea/(me.max-me.min));return me.options.reverse?me.max-scaledDistance:me.min+scaledDistance;} -getPointLabelContext(index){const me=this;const pointLabels=me._pointLabels||[];if(index>=0&&index{if(index!==0){offset=me.getDistanceFromCenterForValue(tick.value);const optsAtIndex=grid.setContext(me.getContext(index-1));drawRadiusLine(me,optsAtIndex,offset,labelCount);}});} -if(angleLines.display){ctx.save();for(i=me.getLabels().length-1;i>=0;i--){const optsAtIndex=angleLines.setContext(me.getPointLabelContext(i));const{color,lineWidth}=optsAtIndex;if(!lineWidth||!color){continue;} -ctx.lineWidth=lineWidth;ctx.strokeStyle=color;ctx.setLineDash(optsAtIndex.borderDash);ctx.lineDashOffset=optsAtIndex.borderDashOffset;offset=me.getDistanceFromCenterForValue(opts.ticks.reverse?me.min:me.max);position=me.getPointPosition(i,offset);ctx.beginPath();ctx.moveTo(me.xCenter,me.yCenter);ctx.lineTo(position.x,position.y);ctx.stroke();} -ctx.restore();}} -drawBorder(){} -drawLabels(){const me=this;const ctx=me.ctx;const opts=me.options;const tickOpts=opts.ticks;if(!tickOpts.display){return;} -const startAngle=me.getIndexAngle(0);let offset,width;ctx.save();ctx.translate(me.xCenter,me.yCenter);ctx.rotate(startAngle);ctx.textAlign='center';ctx.textBaseline='middle';me.ticks.forEach((tick,index)=>{if(index===0&&!opts.reverse){return;} -const optsAtIndex=tickOpts.setContext(me.getContext(index));const tickFont=toFont(optsAtIndex.font);offset=me.getDistanceFromCenterForValue(me.ticks[index].value);if(optsAtIndex.showLabelBackdrop){ctx.font=tickFont.string;width=ctx.measureText(tick.label).width;ctx.fillStyle=optsAtIndex.backdropColor;const padding=toPadding(optsAtIndex.backdropPadding);ctx.fillRect(-width/2-padding.left,-offset-tickFont.size/2-padding.top,width+padding.width,tickFont.size+padding.height);} -renderText(ctx,tick.label,0,-offset,tickFont,{color:optsAtIndex.color,});});ctx.restore();} -drawTitle(){}} -RadialLinearScale.id='radialLinear';RadialLinearScale.defaults={display:true,animate:true,position:'chartArea',angleLines:{display:true,lineWidth:1,borderDash:[],borderDashOffset:0.0},grid:{circular:false},startAngle:0,ticks:{showLabelBackdrop:true,callback:Ticks.formatters.numeric},pointLabels:{backdropColor:undefined,backdropPadding:2,display:true,font:{size:10},callback(label){return label;},padding:5}};RadialLinearScale.defaultRoutes={'angleLines.color':'borderColor','pointLabels.color':'color','ticks.color':'color'};RadialLinearScale.descriptors={angleLines:{_fallback:'grid'}};const INTERVALS={millisecond:{common:true,size:1,steps:1000},second:{common:true,size:1000,steps:60},minute:{common:true,size:60000,steps:60},hour:{common:true,size:3600000,steps:24},day:{common:true,size:86400000,steps:30},week:{common:false,size:604800000,steps:4},month:{common:true,size:2.628e9,steps:12},quarter:{common:false,size:7.884e9,steps:4},year:{common:true,size:3.154e10}};const UNITS=(Object.keys(INTERVALS));function sorter(a,b){return a-b;} -function parse(scale,input){if(isNullOrUndef(input)){return null;} -const adapter=scale._adapter;const{parser,round,isoWeekday}=scale._parseOpts;let value=input;if(typeof parser==='function'){value=parser(value);} -if(!isNumberFinite(value)){value=typeof parser==='string'?adapter.parse(value,parser):adapter.parse(value);} -if(value===null){return null;} -if(round){value=round==='week'&&(isNumber(isoWeekday)||isoWeekday===true)?adapter.startOf(value,'isoWeek',isoWeekday):adapter.startOf(value,round);} -return+value;} -function determineUnitForAutoTicks(minUnit,min,max,capacity){const ilen=UNITS.length;for(let i=UNITS.indexOf(minUnit);i=UNITS.indexOf(minUnit);i--){const unit=UNITS[i];if(INTERVALS[unit].common&&scale._adapter.diff(max,min,unit)>=numTicks-1){return unit;}} -return UNITS[minUnit?UNITS.indexOf(minUnit):0];} -function determineMajorUnit(unit){for(let i=UNITS.indexOf(unit)+1,ilen=UNITS.length;i=time?timestamps[lo]:timestamps[hi];ticks[timestamp]=true;}} -function setMajorTicks(scale,ticks,map,majorUnit){const adapter=scale._adapter;const first=+adapter.startOf(ticks[0].value,majorUnit);const last=ticks[ticks.length-1].value;let major,index;for(major=first;major<=last;major=+adapter.add(major,1,majorUnit)){index=map[major];if(index>=0){ticks[index].major=true;}} -return ticks;} -function ticksFromTimestamps(scale,values,majorUnit){const ticks=[];const map={};const ilen=values.length;let i,value;for(i=0;i100000*stepSize){throw new Error(min+' and '+max+' are too far apart with stepSize of '+stepSize+' '+minor);} -const timestamps=options.ticks.source==='data'&&me.getDataTimestamps();for(time=first,count=0;timea-b).map(x=>+x);} -getLabelForValue(value){const me=this;const adapter=me._adapter;const timeOpts=me.options.time;if(timeOpts.tooltipFormat){return adapter.format(value,timeOpts.tooltipFormat);} -return adapter.format(value,timeOpts.displayFormats.datetime);} -_tickFormatFunction(time,index,ticks,format){const me=this;const options=me.options;const formats=options.time.displayFormats;const unit=me._unit;const majorUnit=me._majorUnit;const minorFormat=unit&&formats[unit];const majorFormat=majorUnit&&formats[majorUnit];const tick=ticks[index];const major=majorUnit&&majorFormat&&tick&&tick.major;const label=me._adapter.format(time,format||(major?majorFormat:minorFormat));const formatter=options.ticks.callback;return formatter?callback(formatter,[label,index,ticks],me):label;} -generateTickLabels(ticks){let i,ilen,tick;for(i=0,ilen=ticks.length;i0?capacity:1;} -getDataTimestamps(){const me=this;let timestamps=me._cache.data||[];let i,ilen;if(timestamps.length){return timestamps;} -const metas=me.getMatchingVisibleMetas();if(me._normalized&&metas.length){return(me._cache.data=metas[0].controller.getAllParsedValues(me));} -for(i=0,ilen=metas.length;i=table[lo].pos&&val<=table[hi].pos){({lo,hi}=_lookupByKey(table,'pos',val));} -({pos:prevSource,time:prevTarget}=table[lo]);({pos:nextSource,time:nextTarget}=table[hi]);}else{if(val>=table[lo].time&&val<=table[hi].time){({lo,hi}=_lookupByKey(table,'time',val));} -({time:prevSource,pos:prevTarget}=table[lo]);({time:nextSource,pos:nextTarget}=table[hi]);} -const span=nextSource-prevSource;return span?prevTarget+(nextTarget-prevTarget)*(val-prevSource)/span:prevTarget;} -class TimeSeriesScale extends TimeScale{constructor(props){super(props);this._table=[];this._minPos=undefined;this._tableRange=undefined;} -initOffsets(){const me=this;const timestamps=me._getTimestampsForTable();const table=me._table=me.buildLookupTable(timestamps);me._minPos=interpolate(table,me.min);me._tableRange=interpolate(table,me.max)-me._minPos;super.initOffsets(timestamps);} -buildLookupTable(timestamps){const{min,max}=this;const items=[];const table=[];let i,ilen,prev,curr,next;for(i=0,ilen=timestamps.length;i=min&&curr<=max){items.push(curr);}} -if(items.length<2){return[{time:min,pos:0},{time:max,pos:1}];} -for(i=0,ilen=items.length;i`\\x00-\\x20]+';var single_quoted="'[^']*'";var double_quoted='"[^"]*"';var attr_value='(?:'+unquoted+'|'+single_quoted+'|'+double_quoted+')';var attribute='(?:\\s+'+attr_name+'(?:\\s*=\\s*'+attr_value+')?)';var open_tag='<[A-Za-z][A-Za-z0-9\\-]*'+attribute+'*\\s*\\/?>';var close_tag='<\\/[A-Za-z][A-Za-z0-9\\-]*\\s*>';var comment='|';var processing='<[?].*?[?]>';var declaration=']*>';var cdata='';var HTML_TAG_RE=new RegExp('^(?:'+open_tag+'|'+close_tag+'|'+comment+'|'+processing+'|'+declaration+'|'+cdata+')');var HTML_OPEN_CLOSE_TAG_RE=new RegExp('^(?:'+open_tag+'|'+close_tag+')');module.exports.HTML_TAG_RE=HTML_TAG_RE;module.exports.HTML_OPEN_CLOSE_TAG_RE=HTML_OPEN_CLOSE_TAG_RE;},{}],4:[function(require,module,exports){'use strict';function _class(obj){return Object.prototype.toString.call(obj);} -function isString(obj){return _class(obj)==='[object String]';} -var _hasOwnProperty=Object.prototype.hasOwnProperty;function has(object,key){return _hasOwnProperty.call(object,key);} -function assign(obj){var sources=Array.prototype.slice.call(arguments,1);sources.forEach(function(source){if(!source){return;} -if(typeof source!=='object'){throw new TypeError(source+'must be object');} -Object.keys(source).forEach(function(key){obj[key]=source[key];});});return obj;} -function arrayReplaceAt(src,pos,newElements){return[].concat(src.slice(0,pos),newElements,src.slice(pos+1));} -function isValidEntityCode(c){if(c>=0xD800&&c<=0xDFFF){return false;} -if(c>=0xFDD0&&c<=0xFDEF){return false;} -if((c&0xFFFF)===0xFFFF||(c&0xFFFF)===0xFFFE){return false;} -if(c>=0x00&&c<=0x08){return false;} -if(c===0x0B){return false;} -if(c>=0x0E&&c<=0x1F){return false;} -if(c>=0x7F&&c<=0x9F){return false;} -if(c>0x10FFFF){return false;} -return true;} -function fromCodePoint(c){if(c>0xffff){c-=0x10000;var surrogate1=0xd800+(c>>10),surrogate2=0xdc00+(c&0x3ff);return String.fromCharCode(surrogate1,surrogate2);} -return String.fromCharCode(c);} -var UNESCAPE_MD_RE=/\\([!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~])/g;var ENTITY_RE=/&([a-z#][a-z0-9]{1,31});/gi;var UNESCAPE_ALL_RE=new RegExp(UNESCAPE_MD_RE.source+'|'+ENTITY_RE.source,'gi');var DIGITAL_ENTITY_TEST_RE=/^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i;var entities=require('./entities');function replaceEntityPattern(match,name){var code=0;if(has(entities,name)){return entities[name];} -if(name.charCodeAt(0)===0x23&&DIGITAL_ENTITY_TEST_RE.test(name)){code=name[1].toLowerCase()==='x'?parseInt(name.slice(2),16):parseInt(name.slice(1),10);if(isValidEntityCode(code)){return fromCodePoint(code);}} -return match;} -function unescapeMd(str){if(str.indexOf('\\')<0){return str;} -return str.replace(UNESCAPE_MD_RE,'$1');} -function unescapeAll(str){if(str.indexOf('\\')<0&&str.indexOf('&')<0){return str;} -return str.replace(UNESCAPE_ALL_RE,function(match,escaped,entity){if(escaped){return escaped;} -return replaceEntityPattern(match,entity);});} -var HTML_ESCAPE_TEST_RE=/[&<>"]/;var HTML_ESCAPE_REPLACE_RE=/[&<>"]/g;var HTML_REPLACEMENTS={'&':'&','<':'<','>':'>','"':'"'};function replaceUnsafeChar(ch){return HTML_REPLACEMENTS[ch];} -function escapeHtml(str){if(HTML_ESCAPE_TEST_RE.test(str)){return str.replace(HTML_ESCAPE_REPLACE_RE,replaceUnsafeChar);} -return str;} -var REGEXP_ESCAPE_RE=/[.?*+^$[\]\\(){}|-]/g;function escapeRE(str){return str.replace(REGEXP_ESCAPE_RE,'\\$&');} -function isSpace(code){switch(code){case 0x09:case 0x20:return true;} -return false;} -function isWhiteSpace(code){if(code>=0x2000&&code<=0x200A){return true;} -switch(code){case 0x09:case 0x0A:case 0x0B:case 0x0C:case 0x0D:case 0x20:case 0xA0:case 0x1680:case 0x202F:case 0x205F:case 0x3000:return true;} -return false;} -var UNICODE_PUNCT_RE=require('uc.micro/categories/P/regex');function isPunctChar(ch){return UNICODE_PUNCT_RE.test(ch);} -function isMdAsciiPunct(ch){switch(ch){case 0x21:case 0x22:case 0x23:case 0x24:case 0x25:case 0x26:case 0x27:case 0x28:case 0x29:case 0x2A:case 0x2B:case 0x2C:case 0x2D:case 0x2E:case 0x2F:case 0x3A:case 0x3B:case 0x3C:case 0x3D:case 0x3E:case 0x3F:case 0x40:case 0x5B:case 0x5C:case 0x5D:case 0x5E:case 0x5F:case 0x60:case 0x7B:case 0x7C:case 0x7D:case 0x7E:return true;default:return false;}} -function normalizeReference(str){return str.trim().replace(/\s+/g,' ').toUpperCase();} -exports.lib={};exports.lib.mdurl=require('mdurl');exports.lib.ucmicro=require('uc.micro');exports.assign=assign;exports.isString=isString;exports.has=has;exports.unescapeMd=unescapeMd;exports.unescapeAll=unescapeAll;exports.isValidEntityCode=isValidEntityCode;exports.fromCodePoint=fromCodePoint;exports.escapeHtml=escapeHtml;exports.arrayReplaceAt=arrayReplaceAt;exports.isSpace=isSpace;exports.isWhiteSpace=isWhiteSpace;exports.isMdAsciiPunct=isMdAsciiPunct;exports.isPunctChar=isPunctChar;exports.escapeRE=escapeRE;exports.normalizeReference=normalizeReference;},{"./entities":1,"mdurl":58,"uc.micro":65,"uc.micro/categories/P/regex":63}],5:[function(require,module,exports){'use strict';exports.parseLinkLabel=require('./parse_link_label');exports.parseLinkDestination=require('./parse_link_destination');exports.parseLinkTitle=require('./parse_link_title');},{"./parse_link_destination":6,"./parse_link_label":7,"./parse_link_title":8}],6:[function(require,module,exports){'use strict';var isSpace=require('../common/utils').isSpace;var unescapeAll=require('../common/utils').unescapeAll;module.exports=function parseLinkDestination(str,pos,max){var code,level,lines=0,start=pos,result={ok:false,pos:0,lines:0,str:''};if(str.charCodeAt(pos)===0x3C){pos++;while(pos=max){return result;} -marker=str.charCodeAt(pos);if(marker!==0x22&&marker!==0x27&&marker!==0x28){return result;} -pos++;if(marker===0x28){marker=0x29;} -while(pos=0){try{parsed.hostname=punycode.toASCII(parsed.hostname);}catch(er){}}} -return mdurl.encode(mdurl.format(parsed));} -function normalizeLinkText(url){var parsed=mdurl.parse(url,true);if(parsed.hostname){if(!parsed.protocol||RECODE_HOSTNAME_FOR.indexOf(parsed.protocol)>=0){try{parsed.hostname=punycode.toUnicode(parsed.hostname);}catch(er){}}} -return mdurl.decode(mdurl.format(parsed));} -function MarkdownIt(presetName,options){if(!(this instanceof MarkdownIt)){return new MarkdownIt(presetName,options);} -if(!options){if(!utils.isString(presetName)){options=presetName||{};presetName='default';}} -this.inline=new ParserInline();this.block=new ParserBlock();this.core=new ParserCore();this.renderer=new Renderer();this.linkify=new LinkifyIt();this.validateLink=validateLink;this.normalizeLink=normalizeLink;this.normalizeLinkText=normalizeLinkText;this.utils=utils;this.helpers=utils.assign({},helpers);this.options={};this.configure(presetName);if(options){this.set(options);}} -MarkdownIt.prototype.set=function(options){utils.assign(this.options,options);return this;};MarkdownIt.prototype.configure=function(presets){var self=this,presetName;if(utils.isString(presets)){presetName=presets;presets=config[presetName];if(!presets){throw new Error('Wrong `markdown-it` preset "'+presetName+'", check name');}} -if(!presets){throw new Error('Wrong `markdown-it` preset, can\'t be empty');} -if(presets.options){self.set(presets.options);} -if(presets.components){Object.keys(presets.components).forEach(function(name){if(presets.components[name].rules){self[name].ruler.enableOnly(presets.components[name].rules);} -if(presets.components[name].rules2){self[name].ruler2.enableOnly(presets.components[name].rules2);}});} -return this;};MarkdownIt.prototype.enable=function(list,ignoreInvalid){var result=[];if(!Array.isArray(list)){list=[list];} -['core','block','inline'].forEach(function(chain){result=result.concat(this[chain].ruler.enable(list,true));},this);result=result.concat(this.inline.ruler2.enable(list,true));var missed=list.filter(function(name){return result.indexOf(name)<0;});if(missed.length&&!ignoreInvalid){throw new Error('MarkdownIt. Failed to enable unknown rule(s): '+missed);} -return this;};MarkdownIt.prototype.disable=function(list,ignoreInvalid){var result=[];if(!Array.isArray(list)){list=[list];} -['core','block','inline'].forEach(function(chain){result=result.concat(this[chain].ruler.disable(list,true));},this);result=result.concat(this.inline.ruler2.disable(list,true));var missed=list.filter(function(name){return result.indexOf(name)<0;});if(missed.length&&!ignoreInvalid){throw new Error('MarkdownIt. Failed to disable unknown rule(s): '+missed);} -return this;};MarkdownIt.prototype.use=function(plugin){var args=[this].concat(Array.prototype.slice.call(arguments,1));plugin.apply(plugin,args);return this;};MarkdownIt.prototype.parse=function(src,env){if(typeof src!=='string'){throw new Error('Input data should be a String');} -var state=new this.core.State(src,this,env);this.core.process(state);return state.tokens;};MarkdownIt.prototype.render=function(src,env){env=env||{};return this.renderer.render(this.parse(src,env),this.options,env);};MarkdownIt.prototype.parseInline=function(src,env){var state=new this.core.State(src,this,env);state.inlineMode=true;this.core.process(state);return state.tokens;};MarkdownIt.prototype.renderInline=function(src,env){env=env||{};return this.renderer.render(this.parseInline(src,env),this.options,env);};module.exports=MarkdownIt;},{"./common/utils":4,"./helpers":5,"./parser_block":10,"./parser_core":11,"./parser_inline":12,"./presets/commonmark":13,"./presets/default":14,"./presets/zero":15,"./renderer":16,"linkify-it":53,"mdurl":58,"punycode":60}],10:[function(require,module,exports){'use strict';var Ruler=require('./ruler');var _rules=[['table',require('./rules_block/table'),['paragraph','reference']],['code',require('./rules_block/code')],['fence',require('./rules_block/fence'),['paragraph','reference','blockquote','list']],['blockquote',require('./rules_block/blockquote'),['paragraph','reference','blockquote','list']],['hr',require('./rules_block/hr'),['paragraph','reference','blockquote','list']],['list',require('./rules_block/list'),['paragraph','reference','blockquote']],['reference',require('./rules_block/reference')],['heading',require('./rules_block/heading'),['paragraph','reference','blockquote']],['lheading',require('./rules_block/lheading')],['html_block',require('./rules_block/html_block'),['paragraph','reference','blockquote']],['paragraph',require('./rules_block/paragraph')]];function ParserBlock(){this.ruler=new Ruler();for(var i=0;i<_rules.length;i++){this.ruler.push(_rules[i][0],_rules[i][1],{alt:(_rules[i][2]||[]).slice()});}} -ParserBlock.prototype.tokenize=function(state,startLine,endLine){var ok,i,rules=this.ruler.getRules(''),len=rules.length,line=startLine,hasEmptyLines=false,maxNesting=state.md.options.maxNesting;while(line=endLine){break;} -if(state.sCount[line]=maxNesting){state.line=endLine;break;} -for(i=0;i=end){break;} -continue;} -state.pending+=state.src[state.pos++];} -if(state.pending){state.pushPending();}};ParserInline.prototype.parse=function(str,md,env,outTokens){var i,rules,len;var state=new this.State(str,md,env,outTokens);this.tokenize(state);rules=this.ruler2.getRules('');len=rules.length;for(i=0;i'+ -escapeHtml(tokens[idx].content)+'';};default_rules.code_block=function(tokens,idx,options,env,slf){var token=tokens[idx];return''+ -escapeHtml(tokens[idx].content)+'\n';};default_rules.fence=function(tokens,idx,options,env,slf){var token=tokens[idx],info=token.info?unescapeAll(token.info).trim():'',langName='',highlighted,i,tmpAttrs,tmpToken;if(info){langName=info.split(/\s+/g)[0];} -if(options.highlight){highlighted=options.highlight(token.content,langName)||escapeHtml(token.content);}else{highlighted=escapeHtml(token.content);} -if(highlighted.indexOf('' -+highlighted -+'\n';} -return'
'
-+highlighted
-+'
\n';};default_rules.image=function(tokens,idx,options,env,slf){var token=tokens[idx];token.attrs[token.attrIndex('alt')][1]=slf.renderInlineAsText(token.children,options,env);return slf.renderToken(tokens,idx,options);};default_rules.hardbreak=function(tokens,idx,options){return options.xhtmlOut?'
\n':'
\n';};default_rules.softbreak=function(tokens,idx,options){return options.breaks?(options.xhtmlOut?'
\n':'
\n'):'\n';};default_rules.text=function(tokens,idx){return escapeHtml(tokens[idx].content);};default_rules.html_block=function(tokens,idx){return tokens[idx].content;};default_rules.html_inline=function(tokens,idx){return tokens[idx].content;};function Renderer(){this.rules=assign({},default_rules);} -Renderer.prototype.renderAttrs=function renderAttrs(token){var i,l,result;if(!token.attrs){return'';} -result='';for(i=0,l=token.attrs.length;i\n':'>';return result;};Renderer.prototype.renderInline=function(tokens,options,env){var type,result='',rules=this.rules;for(var i=0,len=tokens.length;i=4){return false;} -if(state.src.charCodeAt(pos++)!==0x3E){return false;} -if(silent){return true;} -initial=offset=state.sCount[startLine]+pos-(state.bMarks[startLine]+state.tShift[startLine]);if(state.src.charCodeAt(pos)===0x20){pos++;initial++;offset++;adjustTab=false;spaceAfterMarker=true;}else if(state.src.charCodeAt(pos)===0x09){spaceAfterMarker=true;if((state.bsCount[startLine]+offset)%4===3){pos++;initial++;offset++;adjustTab=false;}else{adjustTab=true;}}else{spaceAfterMarker=false;} -oldBMarks=[state.bMarks[startLine]];state.bMarks[startLine]=pos;while(pos=max;oldSCount=[state.sCount[startLine]];state.sCount[startLine]=offset-initial;oldTShift=[state.tShift[startLine]];state.tShift[startLine]=pos-state.bMarks[startLine];terminatorRules=state.md.block.ruler.getRules('blockquote');oldParentType=state.parentType;state.parentType='blockquote';wasOutdented=false;for(nextLine=startLine+1;nextLine=max){break;} -if(state.src.charCodeAt(pos++)===0x3E&&!wasOutdented){initial=offset=state.sCount[nextLine]+pos-(state.bMarks[nextLine]+state.tShift[nextLine]);if(state.src.charCodeAt(pos)===0x20){pos++;initial++;offset++;adjustTab=false;spaceAfterMarker=true;}else if(state.src.charCodeAt(pos)===0x09){spaceAfterMarker=true;if((state.bsCount[nextLine]+offset)%4===3){pos++;initial++;offset++;adjustTab=false;}else{adjustTab=true;}}else{spaceAfterMarker=false;} -oldBMarks.push(state.bMarks[nextLine]);state.bMarks[nextLine]=pos;while(pos=max;oldBSCount.push(state.bsCount[nextLine]);state.bsCount[nextLine]=state.sCount[nextLine]+1+(spaceAfterMarker?1:0);oldSCount.push(state.sCount[nextLine]);state.sCount[nextLine]=offset-initial;oldTShift.push(state.tShift[nextLine]);state.tShift[nextLine]=pos-state.bMarks[nextLine];continue;} -if(lastLineEmpty){break;} -terminate=false;for(i=0,l=terminatorRules.length;i';token.map=lines=[startLine,0];state.md.block.tokenize(state,startLine,nextLine);token=state.push('blockquote_close','blockquote',-1);token.markup='>';state.lineMax=oldLineMax;state.parentType=oldParentType;lines[1]=state.line;for(i=0;i=4){nextLine++;last=nextLine;continue;} -break;} -state.line=last;token=state.push('code_block','code',0);token.content=state.getLines(startLine,last,4+state.blkIndent,true);token.map=[startLine,state.line];return true;};},{}],20:[function(require,module,exports){'use strict';module.exports=function fence(state,startLine,endLine,silent){var marker,len,params,nextLine,mem,token,markup,haveEndMarker=false,pos=state.bMarks[startLine]+state.tShift[startLine],max=state.eMarks[startLine];if(state.sCount[startLine]-state.blkIndent>=4){return false;} -if(pos+3>max){return false;} -marker=state.src.charCodeAt(pos);if(marker!==0x7E&&marker!==0x60){return false;} -mem=pos;pos=state.skipChars(pos,marker);len=pos-mem;if(len<3){return false;} -markup=state.src.slice(mem,pos);params=state.src.slice(pos,max);if(params.indexOf(String.fromCharCode(marker))>=0){return false;} -if(silent){return true;} -nextLine=startLine;for(;;){nextLine++;if(nextLine>=endLine){break;} -pos=mem=state.bMarks[nextLine]+state.tShift[nextLine];max=state.eMarks[nextLine];if(pos=4){continue;} -pos=state.skipChars(pos,marker);if(pos-mem=4){return false;} -ch=state.src.charCodeAt(pos);if(ch!==0x23||pos>=max){return false;} -level=1;ch=state.src.charCodeAt(++pos);while(ch===0x23&&pos6||(pospos&&isSpace(state.src.charCodeAt(tmp-1))){max=tmp;} -state.line=startLine+1;token=state.push('heading_open','h'+String(level),1);token.markup='########'.slice(0,level);token.map=[startLine,state.line];token=state.push('inline','',0);token.content=state.src.slice(pos,max).trim();token.map=[startLine,state.line];token.children=[];token=state.push('heading_close','h'+String(level),-1);token.markup='########'.slice(0,level);return true;};},{"../common/utils":4}],22:[function(require,module,exports){'use strict';var isSpace=require('../common/utils').isSpace;module.exports=function hr(state,startLine,endLine,silent){var marker,cnt,ch,token,pos=state.bMarks[startLine]+state.tShift[startLine],max=state.eMarks[startLine];if(state.sCount[startLine]-state.blkIndent>=4){return false;} -marker=state.src.charCodeAt(pos++);if(marker!==0x2A&&marker!==0x2D&&marker!==0x5F){return false;} -cnt=1;while(pos|$))/i,/<\/(script|pre|style)>/i,true],[/^/,true],[/^<\?/,/\?>/,true],[/^/,true],[/^/,true],[new RegExp('^|$))','i'),/^$/,true],[new RegExp(HTML_OPEN_CLOSE_TAG_RE.source+'\\s*$'),/^$/,false]];module.exports=function html_block(state,startLine,endLine,silent){var i,nextLine,token,lineText,pos=state.bMarks[startLine]+state.tShift[startLine],max=state.eMarks[startLine];if(state.sCount[startLine]-state.blkIndent>=4){return false;} -if(!state.md.options.html){return false;} -if(state.src.charCodeAt(pos)!==0x3C){return false;} -lineText=state.src.slice(pos,max);for(i=0;i=4){return false;} -oldParentType=state.parentType;state.parentType='paragraph';for(;nextLine3){continue;} -if(state.sCount[nextLine]>=state.blkIndent){pos=state.bMarks[nextLine]+state.tShift[nextLine];max=state.eMarks[nextLine];if(pos=max){level=(marker===0x3D?1:2);break;}}}} -if(state.sCount[nextLine]<0){continue;} -terminate=false;for(i=0,l=terminatorRules.length;i=max){return-1;} -ch=state.src.charCodeAt(pos++);if(ch<0x30||ch>0x39){return-1;} -for(;;){if(pos>=max){return-1;} -ch=state.src.charCodeAt(pos++);if(ch>=0x30&&ch<=0x39){if(pos-start>=10){return-1;} -continue;} -if(ch===0x29||ch===0x2e){break;} -return-1;} -if(pos=4){return false;} -if(silent&&state.parentType==='paragraph'){if(state.tShift[startLine]>=state.blkIndent){isTerminatingParagraph=true;}} -if((posAfterMarker=skipOrderedListMarker(state,startLine))>=0){isOrdered=true;start=state.bMarks[startLine]+state.tShift[startLine];markerValue=Number(state.src.substr(start,posAfterMarker-start-1));if(isTerminatingParagraph&&markerValue!==1)return false;}else if((posAfterMarker=skipBulletListMarker(state,startLine))>=0){isOrdered=false;}else{return false;} -if(isTerminatingParagraph){if(state.skipSpaces(posAfterMarker)>=state.eMarks[startLine])return false;} -markerCharCode=state.src.charCodeAt(posAfterMarker-1);if(silent){return true;} -listTokIdx=state.tokens.length;if(isOrdered){token=state.push('ordered_list_open','ol',1);if(markerValue!==1){token.attrs=[['start',markerValue]];}}else{token=state.push('bullet_list_open','ul',1);} -token.map=listLines=[startLine,0];token.markup=String.fromCharCode(markerCharCode);nextLine=startLine;prevEmptyEnd=false;terminatorRules=state.md.block.ruler.getRules('list');oldParentType=state.parentType;state.parentType='list';while(nextLine=max){indentAfterMarker=1;}else{indentAfterMarker=offset-initial;} -if(indentAfterMarker>4){indentAfterMarker=1;} -indent=initial+indentAfterMarker;token=state.push('list_item_open','li',1);token.markup=String.fromCharCode(markerCharCode);token.map=itemLines=[startLine,0];oldIndent=state.blkIndent;oldTight=state.tight;oldTShift=state.tShift[startLine];oldLIndent=state.sCount[startLine];state.blkIndent=indent;state.tight=true;state.tShift[startLine]=contentStart-state.bMarks[startLine];state.sCount[startLine]=offset;if(contentStart>=max&&state.isEmpty(startLine+1)){state.line=Math.min(state.line+2,endLine);}else{state.md.block.tokenize(state,startLine,endLine,true);} -if(!state.tight||prevEmptyEnd){tight=false;} -prevEmptyEnd=(state.line-startLine)>1&&state.isEmpty(state.line-1);state.blkIndent=oldIndent;state.tShift[startLine]=oldTShift;state.sCount[startLine]=oldLIndent;state.tight=oldTight;token=state.push('list_item_close','li',-1);token.markup=String.fromCharCode(markerCharCode);nextLine=startLine=state.line;itemLines[1]=nextLine;contentStart=state.bMarks[startLine];if(nextLine>=endLine){break;} -if(state.sCount[nextLine]3){continue;} -if(state.sCount[nextLine]<0){continue;} -terminate=false;for(i=0,l=terminatorRules.length;i=4){return false;} -if(state.src.charCodeAt(pos)!==0x5B){return false;} -while(++pos3){continue;} -if(state.sCount[nextLine]<0){continue;} -terminate=false;for(i=0,l=terminatorRules.length;i0){this.level++;} -this.tokens.push(token);return token;};StateBlock.prototype.isEmpty=function isEmpty(line){return this.bMarks[line]+this.tShift[line]>=this.eMarks[line];};StateBlock.prototype.skipEmptyLines=function skipEmptyLines(from){for(var max=this.lineMax;frommin){if(!isSpace(this.src.charCodeAt(--pos))){return pos+1;}} -return pos;};StateBlock.prototype.skipChars=function skipChars(pos,code){for(var max=this.src.length;posmin){if(code!==this.src.charCodeAt(--pos)){return pos+1;}} -return pos;};StateBlock.prototype.getLines=function getLines(begin,end,indent,keepLastLF){var i,lineIndent,ch,first,last,queue,lineStart,line=begin;if(begin>=end){return'';} -queue=new Array(end-begin);for(i=0;lineindent){queue[i]=new Array(lineIndent-indent+1).join(' ')+this.src.slice(first,last);}else{queue[i]=this.src.slice(first,last);}} -return queue.join('');};StateBlock.prototype.Token=Token;module.exports=StateBlock;},{"../common/utils":4,"../token":51}],29:[function(require,module,exports){'use strict';var isSpace=require('../common/utils').isSpace;function getLine(state,line){var pos=state.bMarks[line]+state.blkIndent,max=state.eMarks[line];return state.src.substr(pos,max-pos);} -function escapedSplit(str){var result=[],pos=0,max=str.length,ch,escapes=0,lastPos=0,backTicked=false,lastBackTick=0;ch=str.charCodeAt(pos);while(posendLine){return false;} -nextLine=startLine+1;if(state.sCount[nextLine]=4){return false;} -pos=state.bMarks[nextLine]+state.tShift[nextLine];if(pos>=state.eMarks[nextLine]){return false;} -ch=state.src.charCodeAt(pos++);if(ch!==0x7C&&ch!==0x2D&&ch!==0x3A){return false;} -while(pos=4){return false;} -columns=escapedSplit(lineText.replace(/^\||\|$/g,''));columnCount=columns.length;if(columnCount>aligns.length){return false;} -if(silent){return true;} -token=state.push('table_open','table',1);token.map=tableLines=[startLine,0];token=state.push('thead_open','thead',1);token.map=[startLine,startLine+1];token=state.push('tr_open','tr',1);token.map=[startLine,startLine+1];for(i=0;i=4){break;} -columns=escapedSplit(lineText.replace(/^\||\|$/g,''));token=state.push('tr_open','tr',1);for(i=0;i\s]/i.test(str);} -function isLinkClose(str){return/^<\/a\s*>/i.test(str);} -module.exports=function linkify(state){var i,j,l,tokens,token,currentToken,nodes,ln,text,pos,lastPos,level,htmlLinkLevel,url,fullUrl,urlText,blockTokens=state.tokens,links;if(!state.md.options.linkify){return;} -for(j=0,l=blockTokens.length;j=0;i--){currentToken=tokens[i];if(currentToken.type==='link_close'){i--;while(tokens[i].level!==currentToken.level&&tokens[i].type!=='link_open'){i--;} -continue;} -if(currentToken.type==='html_inline'){if(isLinkOpen(currentToken.content)&&htmlLinkLevel>0){htmlLinkLevel--;} -if(isLinkClose(currentToken.content)){htmlLinkLevel++;}} -if(htmlLinkLevel>0){continue;} -if(currentToken.type==='text'&&state.md.linkify.test(currentToken.content)){text=currentToken.content;links=state.md.linkify.match(text);nodes=[];level=currentToken.level;lastPos=0;for(ln=0;lnlastPos){token=new state.Token('text','',0);token.content=text.slice(lastPos,pos);token.level=level;nodes.push(token);} -token=new state.Token('link_open','a',1);token.attrs=[['href',fullUrl]];token.level=level++;token.markup='linkify';token.info='auto';nodes.push(token);token=new state.Token('text','',0);token.content=urlText;token.level=level;nodes.push(token);token=new state.Token('link_close','a',-1);token.level=--level;token.markup='linkify';token.info='auto';nodes.push(token);lastPos=links[ln].lastIndex;} -if(lastPos=0;i--){token=inlineTokens[i];if(token.type==='text'&&!inside_autolink){token.content=token.content.replace(SCOPED_ABBR_RE,replaceFn);} -if(token.type==='link_open'&&token.info==='auto'){inside_autolink--;} -if(token.type==='link_close'&&token.info==='auto'){inside_autolink++;}}} -function replace_rare(inlineTokens){var i,token,inside_autolink=0;for(i=inlineTokens.length-1;i>=0;i--){token=inlineTokens[i];if(token.type==='text'&&!inside_autolink){if(RARE_RE.test(token.content)){token.content=token.content.replace(/\+-/g,'±').replace(/\.{2,}/g,'…').replace(/([?!])…/g,'$1..').replace(/([?!]){4,}/g,'$1$1$1').replace(/,{2,}/g,',').replace(/(^|[^-])---([^-]|$)/mg,'$1\u2014$2').replace(/(^|\s)--(\s|$)/mg,'$1\u2013$2').replace(/(^|[^-\s])--([^-\s]|$)/mg,'$1\u2013$2');}} -if(token.type==='link_open'&&token.info==='auto'){inside_autolink--;} -if(token.type==='link_close'&&token.info==='auto'){inside_autolink++;}}} -module.exports=function replace(state){var blkIdx;if(!state.md.options.typographer){return;} -for(blkIdx=state.tokens.length-1;blkIdx>=0;blkIdx--){if(state.tokens[blkIdx].type!=='inline'){continue;} -if(SCOPED_ABBR_TEST_RE.test(state.tokens[blkIdx].content)){replace_scoped(state.tokens[blkIdx].children);} -if(RARE_RE.test(state.tokens[blkIdx].content)){replace_rare(state.tokens[blkIdx].children);}}};},{}],35:[function(require,module,exports){'use strict';var isWhiteSpace=require('../common/utils').isWhiteSpace;var isPunctChar=require('../common/utils').isPunctChar;var isMdAsciiPunct=require('../common/utils').isMdAsciiPunct;var QUOTE_TEST_RE=/['"]/;var QUOTE_RE=/['"]/g;var APOSTROPHE='\u2019';function replaceAt(str,index,ch){return str.substr(0,index)+ch+str.substr(index+1);} -function process_inlines(tokens,state){var i,token,text,t,pos,max,thisLevel,item,lastChar,nextChar,isLastPunctChar,isNextPunctChar,isLastWhiteSpace,isNextWhiteSpace,canOpen,canClose,j,isSingle,stack,openQuote,closeQuote;stack=[];for(i=0;i=0;j--){if(stack[j].level<=thisLevel){break;}} -stack.length=j+1;if(token.type!=='text'){continue;} -text=token.content;pos=0;max=text.length;OUTER:while(pos=0){lastChar=text.charCodeAt(t.index-1);}else{for(j=i-1;j>=0;j--){if(tokens[j].type==='softbreak'||tokens[j].type==='hardbreak')break;if(tokens[j].type!=='text')continue;lastChar=tokens[j].content.charCodeAt(tokens[j].content.length-1);break;}} -nextChar=0x20;if(pos=0x30&&lastChar<=0x39){canClose=canOpen=false;}} -if(canOpen&&canClose){canOpen=false;canClose=isNextPunctChar;} -if(!canOpen&&!canClose){if(isSingle){token.content=replaceAt(token.content,t.index,APOSTROPHE);} -continue;} -if(canClose){for(j=stack.length-1;j>=0;j--){item=stack[j];if(stack[j].level=0;blkIdx--){if(state.tokens[blkIdx].type!=='inline'||!QUOTE_TEST_RE.test(state.tokens[blkIdx].content)){continue;} -process_inlines(state.tokens[blkIdx].children,state);}};},{"../common/utils":4}],36:[function(require,module,exports){'use strict';var Token=require('../token');function StateCore(src,md,env){this.src=src;this.env=env;this.tokens=[];this.inlineMode=false;this.md=md;} -StateCore.prototype.Token=Token;module.exports=StateCore;},{"../token":51}],37:[function(require,module,exports){'use strict';var EMAIL_RE=/^<([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/;var AUTOLINK_RE=/^<([a-zA-Z][a-zA-Z0-9+.\-]{1,31}):([^<>\x00-\x20]*)>/;module.exports=function autolink(state,silent){var tail,linkMatch,emailMatch,url,fullUrl,token,pos=state.pos;if(state.src.charCodeAt(pos)!==0x3C){return false;} -tail=state.src.slice(pos);if(tail.indexOf('>')<0){return false;} -if(AUTOLINK_RE.test(tail)){linkMatch=tail.match(AUTOLINK_RE);url=linkMatch[0].slice(1,-1);fullUrl=state.md.normalizeLink(url);if(!state.md.validateLink(fullUrl)){return false;} -if(!silent){token=state.push('link_open','a',1);token.attrs=[['href',fullUrl]];token.markup='autolink';token.info='auto';token=state.push('text','',0);token.content=state.md.normalizeLinkText(url);token=state.push('link_close','a',-1);token.markup='autolink';token.info='auto';} -state.pos+=linkMatch[0].length;return true;} -if(EMAIL_RE.test(tail)){emailMatch=tail.match(EMAIL_RE);url=emailMatch[0].slice(1,-1);fullUrl=state.md.normalizeLink('mailto:'+url);if(!state.md.validateLink(fullUrl)){return false;} -if(!silent){token=state.push('link_open','a',1);token.attrs=[['href',fullUrl]];token.markup='autolink';token.info='auto';token=state.push('text','',0);token.content=state.md.normalizeLinkText(url);token=state.push('link_close','a',-1);token.markup='autolink';token.info='auto';} -state.pos+=emailMatch[0].length;return true;} -return false;};},{}],38:[function(require,module,exports){'use strict';module.exports=function backtick(state,silent){var start,max,marker,matchStart,matchEnd,token,pos=state.pos,ch=state.src.charCodeAt(pos);if(ch!==0x60){return false;} -start=pos;pos++;max=state.posMax;while(pos=0){currDelim=delimiters[j];if(currDelim.open&&currDelim.marker===lastDelim.marker&&currDelim.end<0&&currDelim.level===lastDelim.level){var odd_match=(currDelim.close||lastDelim.open)&&typeof currDelim.length!=='undefined'&&typeof lastDelim.length!=='undefined'&&(currDelim.length+lastDelim.length)%3===0;if(!odd_match){lastDelim.jump=i-j;lastDelim.open=false;currDelim.end=i;currDelim.jump=0;break;}} -j-=currDelim.jump+1;}}};},{}],40:[function(require,module,exports){'use strict';module.exports.tokenize=function emphasis(state,silent){var i,scanned,token,start=state.pos,marker=state.src.charCodeAt(start);if(silent){return false;} -if(marker!==0x5F&&marker!==0x2A){return false;} -scanned=state.scanDelims(state.pos,marker===0x2A);for(i=0;i=0;i--){startDelim=delimiters[i];if(startDelim.marker!==0x5F&&startDelim.marker!==0x2A){continue;} -if(startDelim.end===-1){continue;} -endDelim=delimiters[startDelim.end];isStrong=i>0&&delimiters[i-1].end===startDelim.end+1&&delimiters[i-1].token===startDelim.token-1&&delimiters[startDelim.end+1].token===endDelim.token+1&&delimiters[i-1].marker===startDelim.marker;ch=String.fromCharCode(startDelim.marker);token=state.tokens[startDelim.token];token.type=isStrong?'strong_open':'em_open';token.tag=isStrong?'strong':'em';token.nesting=1;token.markup=isStrong?ch+ch:ch;token.content='';token=state.tokens[endDelim.token];token.type=isStrong?'strong_close':'em_close';token.tag=isStrong?'strong':'em';token.nesting=-1;token.markup=isStrong?ch+ch:ch;token.content='';if(isStrong){state.tokens[delimiters[i-1].token].content='';state.tokens[delimiters[startDelim.end+1].token].content='';i--;}}};},{}],41:[function(require,module,exports){'use strict';var entities=require('../common/entities');var has=require('../common/utils').has;var isValidEntityCode=require('../common/utils').isValidEntityCode;var fromCodePoint=require('../common/utils').fromCodePoint;var DIGITAL_RE=/^&#((?:x[a-f0-9]{1,8}|[0-9]{1,8}));/i;var NAMED_RE=/^&([a-z][a-z0-9]{1,31});/i;module.exports=function entity(state,silent){var ch,code,match,pos=state.pos,max=state.posMax;if(state.src.charCodeAt(pos)!==0x26){return false;} -if(pos+1?@[]^_`{|}~-'.split('').forEach(function(ch){ESCAPED[ch.charCodeAt(0)]=1;});module.exports=function escape(state,silent){var ch,pos=state.pos,max=state.posMax;if(state.src.charCodeAt(pos)!==0x5C){return false;} -pos++;if(pos=0x61)&&(lc<=0x7a);} -module.exports=function html_inline(state,silent){var ch,match,max,token,pos=state.pos;if(!state.md.options.html){return false;} -max=state.posMax;if(state.src.charCodeAt(pos)!==0x3C||pos+2>=max){return false;} -ch=state.src.charCodeAt(pos+1);if(ch!==0x21&&ch!==0x3F&&ch!==0x2F&&!isLetter(ch)){return false;} -match=state.src.slice(pos).match(HTML_TAG_RE);if(!match){return false;} -if(!silent){token=state.push('html_inline','',0);token.content=state.src.slice(pos,pos+match[0].length);} -state.pos+=match[0].length;return true;};},{"../common/html_re":3}],44:[function(require,module,exports){'use strict';var normalizeReference=require('../common/utils').normalizeReference;var isSpace=require('../common/utils').isSpace;module.exports=function image(state,silent){var attrs,code,content,label,labelEnd,labelStart,pos,ref,res,title,token,tokens,start,href='',oldPos=state.pos,max=state.posMax;if(state.src.charCodeAt(state.pos)!==0x21){return false;} -if(state.src.charCodeAt(state.pos+1)!==0x5B){return false;} -labelStart=state.pos+2;labelEnd=state.md.helpers.parseLinkLabel(state,state.pos+1,false);if(labelEnd<0){return false;} -pos=labelEnd+1;if(pos=max){return false;} -start=pos;res=state.md.helpers.parseLinkDestination(state.src,pos,state.posMax);if(res.ok){href=state.md.normalizeLink(res.str);if(state.md.validateLink(href)){pos=res.pos;}else{href='';}} -start=pos;for(;pos=max||state.src.charCodeAt(pos)!==0x29){state.pos=oldPos;return false;} -pos++;}else{if(typeof state.env.references==='undefined'){return false;} -if(pos=0){label=state.src.slice(start,pos++);}else{pos=labelEnd+1;}}else{pos=labelEnd+1;} -if(!label){label=state.src.slice(labelStart,labelEnd);} -ref=state.env.references[normalizeReference(label)];if(!ref){state.pos=oldPos;return false;} -href=ref.href;title=ref.title;} -if(!silent){content=state.src.slice(labelStart,labelEnd);state.md.inline.parse(content,state.md,state.env,tokens=[]);token=state.push('image','img',0);token.attrs=attrs=[['src',href],['alt','']];token.children=tokens;token.content=content;if(title){attrs.push(['title',title]);}} -state.pos=pos;state.posMax=max;return true;};},{"../common/utils":4}],45:[function(require,module,exports){'use strict';var normalizeReference=require('../common/utils').normalizeReference;var isSpace=require('../common/utils').isSpace;module.exports=function link(state,silent){var attrs,code,label,labelEnd,labelStart,pos,res,ref,title,token,href='',oldPos=state.pos,max=state.posMax,start=state.pos,parseReference=true;if(state.src.charCodeAt(state.pos)!==0x5B){return false;} -labelStart=state.pos+1;labelEnd=state.md.helpers.parseLinkLabel(state,state.pos,true);if(labelEnd<0){return false;} -pos=labelEnd+1;if(pos=max){return false;} -start=pos;res=state.md.helpers.parseLinkDestination(state.src,pos,state.posMax);if(res.ok){href=state.md.normalizeLink(res.str);if(state.md.validateLink(href)){pos=res.pos;}else{href='';}} -start=pos;for(;pos=max||state.src.charCodeAt(pos)!==0x29){parseReference=true;} -pos++;} -if(parseReference){if(typeof state.env.references==='undefined'){return false;} -if(pos=0){label=state.src.slice(start,pos++);}else{pos=labelEnd+1;}}else{pos=labelEnd+1;} -if(!label){label=state.src.slice(labelStart,labelEnd);} -ref=state.env.references[normalizeReference(label)];if(!ref){state.pos=oldPos;return false;} -href=ref.href;title=ref.title;} -if(!silent){state.pos=labelStart;state.posMax=labelEnd;token=state.push('link_open','a',1);token.attrs=attrs=[['href',href]];if(title){attrs.push(['title',title]);} -state.md.inline.tokenize(state);token=state.push('link_close','a',-1);} -state.pos=pos;state.posMax=max;return true;};},{"../common/utils":4}],46:[function(require,module,exports){'use strict';var isSpace=require('../common/utils').isSpace;module.exports=function newline(state,silent){var pmax,max,pos=state.pos;if(state.src.charCodeAt(pos)!==0x0A){return false;} -pmax=state.pending.length-1;max=state.posMax;if(!silent){if(pmax>=0&&state.pending.charCodeAt(pmax)===0x20){if(pmax>=1&&state.pending.charCodeAt(pmax-1)===0x20){state.pending=state.pending.replace(/ +$/,'');state.push('hardbreak','br',0);}else{state.pending=state.pending.slice(0,-1);state.push('softbreak','br',0);}}else{state.push('softbreak','br',0);}} -pos++;while(pos0){this.level++;} -this.pendingLevel=this.level;this.tokens.push(token);return token;};StateInline.prototype.scanDelims=function(start,canSplitWord){var pos=start,lastChar,nextChar,count,can_open,can_close,isLastWhiteSpace,isLastPunctChar,isNextWhiteSpace,isNextPunctChar,left_flanking=true,right_flanking=true,max=this.posMax,marker=this.src.charCodeAt(start);lastChar=start>0?this.src.charCodeAt(start-1):0x20;while(pos=0){value=this.attrs[idx][1];} -return value;};Token.prototype.attrJoin=function attrJoin(name,value){var idx=this.attrIndex(name);if(idx<0){this.attrPush([name,value]);}else{this.attrs[idx][1]=this.attrs[idx][1]+' '+value;}};module.exports=Token;},{}],52:[function(require,module,exports){module.exports={"Aacute":"\u00C1","aacute":"\u00E1","Abreve":"\u0102","abreve":"\u0103","ac":"\u223E","acd":"\u223F","acE":"\u223E\u0333","Acirc":"\u00C2","acirc":"\u00E2","acute":"\u00B4","Acy":"\u0410","acy":"\u0430","AElig":"\u00C6","aelig":"\u00E6","af":"\u2061","Afr":"\uD835\uDD04","afr":"\uD835\uDD1E","Agrave":"\u00C0","agrave":"\u00E0","alefsym":"\u2135","aleph":"\u2135","Alpha":"\u0391","alpha":"\u03B1","Amacr":"\u0100","amacr":"\u0101","amalg":"\u2A3F","amp":"&","AMP":"&","andand":"\u2A55","And":"\u2A53","and":"\u2227","andd":"\u2A5C","andslope":"\u2A58","andv":"\u2A5A","ang":"\u2220","ange":"\u29A4","angle":"\u2220","angmsdaa":"\u29A8","angmsdab":"\u29A9","angmsdac":"\u29AA","angmsdad":"\u29AB","angmsdae":"\u29AC","angmsdaf":"\u29AD","angmsdag":"\u29AE","angmsdah":"\u29AF","angmsd":"\u2221","angrt":"\u221F","angrtvb":"\u22BE","angrtvbd":"\u299D","angsph":"\u2222","angst":"\u00C5","angzarr":"\u237C","Aogon":"\u0104","aogon":"\u0105","Aopf":"\uD835\uDD38","aopf":"\uD835\uDD52","apacir":"\u2A6F","ap":"\u2248","apE":"\u2A70","ape":"\u224A","apid":"\u224B","apos":"'","ApplyFunction":"\u2061","approx":"\u2248","approxeq":"\u224A","Aring":"\u00C5","aring":"\u00E5","Ascr":"\uD835\uDC9C","ascr":"\uD835\uDCB6","Assign":"\u2254","ast":"*","asymp":"\u2248","asympeq":"\u224D","Atilde":"\u00C3","atilde":"\u00E3","Auml":"\u00C4","auml":"\u00E4","awconint":"\u2233","awint":"\u2A11","backcong":"\u224C","backepsilon":"\u03F6","backprime":"\u2035","backsim":"\u223D","backsimeq":"\u22CD","Backslash":"\u2216","Barv":"\u2AE7","barvee":"\u22BD","barwed":"\u2305","Barwed":"\u2306","barwedge":"\u2305","bbrk":"\u23B5","bbrktbrk":"\u23B6","bcong":"\u224C","Bcy":"\u0411","bcy":"\u0431","bdquo":"\u201E","becaus":"\u2235","because":"\u2235","Because":"\u2235","bemptyv":"\u29B0","bepsi":"\u03F6","bernou":"\u212C","Bernoullis":"\u212C","Beta":"\u0392","beta":"\u03B2","beth":"\u2136","between":"\u226C","Bfr":"\uD835\uDD05","bfr":"\uD835\uDD1F","bigcap":"\u22C2","bigcirc":"\u25EF","bigcup":"\u22C3","bigodot":"\u2A00","bigoplus":"\u2A01","bigotimes":"\u2A02","bigsqcup":"\u2A06","bigstar":"\u2605","bigtriangledown":"\u25BD","bigtriangleup":"\u25B3","biguplus":"\u2A04","bigvee":"\u22C1","bigwedge":"\u22C0","bkarow":"\u290D","blacklozenge":"\u29EB","blacksquare":"\u25AA","blacktriangle":"\u25B4","blacktriangledown":"\u25BE","blacktriangleleft":"\u25C2","blacktriangleright":"\u25B8","blank":"\u2423","blk12":"\u2592","blk14":"\u2591","blk34":"\u2593","block":"\u2588","bne":"=\u20E5","bnequiv":"\u2261\u20E5","bNot":"\u2AED","bnot":"\u2310","Bopf":"\uD835\uDD39","bopf":"\uD835\uDD53","bot":"\u22A5","bottom":"\u22A5","bowtie":"\u22C8","boxbox":"\u29C9","boxdl":"\u2510","boxdL":"\u2555","boxDl":"\u2556","boxDL":"\u2557","boxdr":"\u250C","boxdR":"\u2552","boxDr":"\u2553","boxDR":"\u2554","boxh":"\u2500","boxH":"\u2550","boxhd":"\u252C","boxHd":"\u2564","boxhD":"\u2565","boxHD":"\u2566","boxhu":"\u2534","boxHu":"\u2567","boxhU":"\u2568","boxHU":"\u2569","boxminus":"\u229F","boxplus":"\u229E","boxtimes":"\u22A0","boxul":"\u2518","boxuL":"\u255B","boxUl":"\u255C","boxUL":"\u255D","boxur":"\u2514","boxuR":"\u2558","boxUr":"\u2559","boxUR":"\u255A","boxv":"\u2502","boxV":"\u2551","boxvh":"\u253C","boxvH":"\u256A","boxVh":"\u256B","boxVH":"\u256C","boxvl":"\u2524","boxvL":"\u2561","boxVl":"\u2562","boxVL":"\u2563","boxvr":"\u251C","boxvR":"\u255E","boxVr":"\u255F","boxVR":"\u2560","bprime":"\u2035","breve":"\u02D8","Breve":"\u02D8","brvbar":"\u00A6","bscr":"\uD835\uDCB7","Bscr":"\u212C","bsemi":"\u204F","bsim":"\u223D","bsime":"\u22CD","bsolb":"\u29C5","bsol":"\\","bsolhsub":"\u27C8","bull":"\u2022","bullet":"\u2022","bump":"\u224E","bumpE":"\u2AAE","bumpe":"\u224F","Bumpeq":"\u224E","bumpeq":"\u224F","Cacute":"\u0106","cacute":"\u0107","capand":"\u2A44","capbrcup":"\u2A49","capcap":"\u2A4B","cap":"\u2229","Cap":"\u22D2","capcup":"\u2A47","capdot":"\u2A40","CapitalDifferentialD":"\u2145","caps":"\u2229\uFE00","caret":"\u2041","caron":"\u02C7","Cayleys":"\u212D","ccaps":"\u2A4D","Ccaron":"\u010C","ccaron":"\u010D","Ccedil":"\u00C7","ccedil":"\u00E7","Ccirc":"\u0108","ccirc":"\u0109","Cconint":"\u2230","ccups":"\u2A4C","ccupssm":"\u2A50","Cdot":"\u010A","cdot":"\u010B","cedil":"\u00B8","Cedilla":"\u00B8","cemptyv":"\u29B2","cent":"\u00A2","centerdot":"\u00B7","CenterDot":"\u00B7","cfr":"\uD835\uDD20","Cfr":"\u212D","CHcy":"\u0427","chcy":"\u0447","check":"\u2713","checkmark":"\u2713","Chi":"\u03A7","chi":"\u03C7","circ":"\u02C6","circeq":"\u2257","circlearrowleft":"\u21BA","circlearrowright":"\u21BB","circledast":"\u229B","circledcirc":"\u229A","circleddash":"\u229D","CircleDot":"\u2299","circledR":"\u00AE","circledS":"\u24C8","CircleMinus":"\u2296","CirclePlus":"\u2295","CircleTimes":"\u2297","cir":"\u25CB","cirE":"\u29C3","cire":"\u2257","cirfnint":"\u2A10","cirmid":"\u2AEF","cirscir":"\u29C2","ClockwiseContourIntegral":"\u2232","CloseCurlyDoubleQuote":"\u201D","CloseCurlyQuote":"\u2019","clubs":"\u2663","clubsuit":"\u2663","colon":":","Colon":"\u2237","Colone":"\u2A74","colone":"\u2254","coloneq":"\u2254","comma":",","commat":"@","comp":"\u2201","compfn":"\u2218","complement":"\u2201","complexes":"\u2102","cong":"\u2245","congdot":"\u2A6D","Congruent":"\u2261","conint":"\u222E","Conint":"\u222F","ContourIntegral":"\u222E","copf":"\uD835\uDD54","Copf":"\u2102","coprod":"\u2210","Coproduct":"\u2210","copy":"\u00A9","COPY":"\u00A9","copysr":"\u2117","CounterClockwiseContourIntegral":"\u2233","crarr":"\u21B5","cross":"\u2717","Cross":"\u2A2F","Cscr":"\uD835\uDC9E","cscr":"\uD835\uDCB8","csub":"\u2ACF","csube":"\u2AD1","csup":"\u2AD0","csupe":"\u2AD2","ctdot":"\u22EF","cudarrl":"\u2938","cudarrr":"\u2935","cuepr":"\u22DE","cuesc":"\u22DF","cularr":"\u21B6","cularrp":"\u293D","cupbrcap":"\u2A48","cupcap":"\u2A46","CupCap":"\u224D","cup":"\u222A","Cup":"\u22D3","cupcup":"\u2A4A","cupdot":"\u228D","cupor":"\u2A45","cups":"\u222A\uFE00","curarr":"\u21B7","curarrm":"\u293C","curlyeqprec":"\u22DE","curlyeqsucc":"\u22DF","curlyvee":"\u22CE","curlywedge":"\u22CF","curren":"\u00A4","curvearrowleft":"\u21B6","curvearrowright":"\u21B7","cuvee":"\u22CE","cuwed":"\u22CF","cwconint":"\u2232","cwint":"\u2231","cylcty":"\u232D","dagger":"\u2020","Dagger":"\u2021","daleth":"\u2138","darr":"\u2193","Darr":"\u21A1","dArr":"\u21D3","dash":"\u2010","Dashv":"\u2AE4","dashv":"\u22A3","dbkarow":"\u290F","dblac":"\u02DD","Dcaron":"\u010E","dcaron":"\u010F","Dcy":"\u0414","dcy":"\u0434","ddagger":"\u2021","ddarr":"\u21CA","DD":"\u2145","dd":"\u2146","DDotrahd":"\u2911","ddotseq":"\u2A77","deg":"\u00B0","Del":"\u2207","Delta":"\u0394","delta":"\u03B4","demptyv":"\u29B1","dfisht":"\u297F","Dfr":"\uD835\uDD07","dfr":"\uD835\uDD21","dHar":"\u2965","dharl":"\u21C3","dharr":"\u21C2","DiacriticalAcute":"\u00B4","DiacriticalDot":"\u02D9","DiacriticalDoubleAcute":"\u02DD","DiacriticalGrave":"`","DiacriticalTilde":"\u02DC","diam":"\u22C4","diamond":"\u22C4","Diamond":"\u22C4","diamondsuit":"\u2666","diams":"\u2666","die":"\u00A8","DifferentialD":"\u2146","digamma":"\u03DD","disin":"\u22F2","div":"\u00F7","divide":"\u00F7","divideontimes":"\u22C7","divonx":"\u22C7","DJcy":"\u0402","djcy":"\u0452","dlcorn":"\u231E","dlcrop":"\u230D","dollar":"$","Dopf":"\uD835\uDD3B","dopf":"\uD835\uDD55","Dot":"\u00A8","dot":"\u02D9","DotDot":"\u20DC","doteq":"\u2250","doteqdot":"\u2251","DotEqual":"\u2250","dotminus":"\u2238","dotplus":"\u2214","dotsquare":"\u22A1","doublebarwedge":"\u2306","DoubleContourIntegral":"\u222F","DoubleDot":"\u00A8","DoubleDownArrow":"\u21D3","DoubleLeftArrow":"\u21D0","DoubleLeftRightArrow":"\u21D4","DoubleLeftTee":"\u2AE4","DoubleLongLeftArrow":"\u27F8","DoubleLongLeftRightArrow":"\u27FA","DoubleLongRightArrow":"\u27F9","DoubleRightArrow":"\u21D2","DoubleRightTee":"\u22A8","DoubleUpArrow":"\u21D1","DoubleUpDownArrow":"\u21D5","DoubleVerticalBar":"\u2225","DownArrowBar":"\u2913","downarrow":"\u2193","DownArrow":"\u2193","Downarrow":"\u21D3","DownArrowUpArrow":"\u21F5","DownBreve":"\u0311","downdownarrows":"\u21CA","downharpoonleft":"\u21C3","downharpoonright":"\u21C2","DownLeftRightVector":"\u2950","DownLeftTeeVector":"\u295E","DownLeftVectorBar":"\u2956","DownLeftVector":"\u21BD","DownRightTeeVector":"\u295F","DownRightVectorBar":"\u2957","DownRightVector":"\u21C1","DownTeeArrow":"\u21A7","DownTee":"\u22A4","drbkarow":"\u2910","drcorn":"\u231F","drcrop":"\u230C","Dscr":"\uD835\uDC9F","dscr":"\uD835\uDCB9","DScy":"\u0405","dscy":"\u0455","dsol":"\u29F6","Dstrok":"\u0110","dstrok":"\u0111","dtdot":"\u22F1","dtri":"\u25BF","dtrif":"\u25BE","duarr":"\u21F5","duhar":"\u296F","dwangle":"\u29A6","DZcy":"\u040F","dzcy":"\u045F","dzigrarr":"\u27FF","Eacute":"\u00C9","eacute":"\u00E9","easter":"\u2A6E","Ecaron":"\u011A","ecaron":"\u011B","Ecirc":"\u00CA","ecirc":"\u00EA","ecir":"\u2256","ecolon":"\u2255","Ecy":"\u042D","ecy":"\u044D","eDDot":"\u2A77","Edot":"\u0116","edot":"\u0117","eDot":"\u2251","ee":"\u2147","efDot":"\u2252","Efr":"\uD835\uDD08","efr":"\uD835\uDD22","eg":"\u2A9A","Egrave":"\u00C8","egrave":"\u00E8","egs":"\u2A96","egsdot":"\u2A98","el":"\u2A99","Element":"\u2208","elinters":"\u23E7","ell":"\u2113","els":"\u2A95","elsdot":"\u2A97","Emacr":"\u0112","emacr":"\u0113","empty":"\u2205","emptyset":"\u2205","EmptySmallSquare":"\u25FB","emptyv":"\u2205","EmptyVerySmallSquare":"\u25AB","emsp13":"\u2004","emsp14":"\u2005","emsp":"\u2003","ENG":"\u014A","eng":"\u014B","ensp":"\u2002","Eogon":"\u0118","eogon":"\u0119","Eopf":"\uD835\uDD3C","eopf":"\uD835\uDD56","epar":"\u22D5","eparsl":"\u29E3","eplus":"\u2A71","epsi":"\u03B5","Epsilon":"\u0395","epsilon":"\u03B5","epsiv":"\u03F5","eqcirc":"\u2256","eqcolon":"\u2255","eqsim":"\u2242","eqslantgtr":"\u2A96","eqslantless":"\u2A95","Equal":"\u2A75","equals":"=","EqualTilde":"\u2242","equest":"\u225F","Equilibrium":"\u21CC","equiv":"\u2261","equivDD":"\u2A78","eqvparsl":"\u29E5","erarr":"\u2971","erDot":"\u2253","escr":"\u212F","Escr":"\u2130","esdot":"\u2250","Esim":"\u2A73","esim":"\u2242","Eta":"\u0397","eta":"\u03B7","ETH":"\u00D0","eth":"\u00F0","Euml":"\u00CB","euml":"\u00EB","euro":"\u20AC","excl":"!","exist":"\u2203","Exists":"\u2203","expectation":"\u2130","exponentiale":"\u2147","ExponentialE":"\u2147","fallingdotseq":"\u2252","Fcy":"\u0424","fcy":"\u0444","female":"\u2640","ffilig":"\uFB03","fflig":"\uFB00","ffllig":"\uFB04","Ffr":"\uD835\uDD09","ffr":"\uD835\uDD23","filig":"\uFB01","FilledSmallSquare":"\u25FC","FilledVerySmallSquare":"\u25AA","fjlig":"fj","flat":"\u266D","fllig":"\uFB02","fltns":"\u25B1","fnof":"\u0192","Fopf":"\uD835\uDD3D","fopf":"\uD835\uDD57","forall":"\u2200","ForAll":"\u2200","fork":"\u22D4","forkv":"\u2AD9","Fouriertrf":"\u2131","fpartint":"\u2A0D","frac12":"\u00BD","frac13":"\u2153","frac14":"\u00BC","frac15":"\u2155","frac16":"\u2159","frac18":"\u215B","frac23":"\u2154","frac25":"\u2156","frac34":"\u00BE","frac35":"\u2157","frac38":"\u215C","frac45":"\u2158","frac56":"\u215A","frac58":"\u215D","frac78":"\u215E","frasl":"\u2044","frown":"\u2322","fscr":"\uD835\uDCBB","Fscr":"\u2131","gacute":"\u01F5","Gamma":"\u0393","gamma":"\u03B3","Gammad":"\u03DC","gammad":"\u03DD","gap":"\u2A86","Gbreve":"\u011E","gbreve":"\u011F","Gcedil":"\u0122","Gcirc":"\u011C","gcirc":"\u011D","Gcy":"\u0413","gcy":"\u0433","Gdot":"\u0120","gdot":"\u0121","ge":"\u2265","gE":"\u2267","gEl":"\u2A8C","gel":"\u22DB","geq":"\u2265","geqq":"\u2267","geqslant":"\u2A7E","gescc":"\u2AA9","ges":"\u2A7E","gesdot":"\u2A80","gesdoto":"\u2A82","gesdotol":"\u2A84","gesl":"\u22DB\uFE00","gesles":"\u2A94","Gfr":"\uD835\uDD0A","gfr":"\uD835\uDD24","gg":"\u226B","Gg":"\u22D9","ggg":"\u22D9","gimel":"\u2137","GJcy":"\u0403","gjcy":"\u0453","gla":"\u2AA5","gl":"\u2277","glE":"\u2A92","glj":"\u2AA4","gnap":"\u2A8A","gnapprox":"\u2A8A","gne":"\u2A88","gnE":"\u2269","gneq":"\u2A88","gneqq":"\u2269","gnsim":"\u22E7","Gopf":"\uD835\uDD3E","gopf":"\uD835\uDD58","grave":"`","GreaterEqual":"\u2265","GreaterEqualLess":"\u22DB","GreaterFullEqual":"\u2267","GreaterGreater":"\u2AA2","GreaterLess":"\u2277","GreaterSlantEqual":"\u2A7E","GreaterTilde":"\u2273","Gscr":"\uD835\uDCA2","gscr":"\u210A","gsim":"\u2273","gsime":"\u2A8E","gsiml":"\u2A90","gtcc":"\u2AA7","gtcir":"\u2A7A","gt":">","GT":">","Gt":"\u226B","gtdot":"\u22D7","gtlPar":"\u2995","gtquest":"\u2A7C","gtrapprox":"\u2A86","gtrarr":"\u2978","gtrdot":"\u22D7","gtreqless":"\u22DB","gtreqqless":"\u2A8C","gtrless":"\u2277","gtrsim":"\u2273","gvertneqq":"\u2269\uFE00","gvnE":"\u2269\uFE00","Hacek":"\u02C7","hairsp":"\u200A","half":"\u00BD","hamilt":"\u210B","HARDcy":"\u042A","hardcy":"\u044A","harrcir":"\u2948","harr":"\u2194","hArr":"\u21D4","harrw":"\u21AD","Hat":"^","hbar":"\u210F","Hcirc":"\u0124","hcirc":"\u0125","hearts":"\u2665","heartsuit":"\u2665","hellip":"\u2026","hercon":"\u22B9","hfr":"\uD835\uDD25","Hfr":"\u210C","HilbertSpace":"\u210B","hksearow":"\u2925","hkswarow":"\u2926","hoarr":"\u21FF","homtht":"\u223B","hookleftarrow":"\u21A9","hookrightarrow":"\u21AA","hopf":"\uD835\uDD59","Hopf":"\u210D","horbar":"\u2015","HorizontalLine":"\u2500","hscr":"\uD835\uDCBD","Hscr":"\u210B","hslash":"\u210F","Hstrok":"\u0126","hstrok":"\u0127","HumpDownHump":"\u224E","HumpEqual":"\u224F","hybull":"\u2043","hyphen":"\u2010","Iacute":"\u00CD","iacute":"\u00ED","ic":"\u2063","Icirc":"\u00CE","icirc":"\u00EE","Icy":"\u0418","icy":"\u0438","Idot":"\u0130","IEcy":"\u0415","iecy":"\u0435","iexcl":"\u00A1","iff":"\u21D4","ifr":"\uD835\uDD26","Ifr":"\u2111","Igrave":"\u00CC","igrave":"\u00EC","ii":"\u2148","iiiint":"\u2A0C","iiint":"\u222D","iinfin":"\u29DC","iiota":"\u2129","IJlig":"\u0132","ijlig":"\u0133","Imacr":"\u012A","imacr":"\u012B","image":"\u2111","ImaginaryI":"\u2148","imagline":"\u2110","imagpart":"\u2111","imath":"\u0131","Im":"\u2111","imof":"\u22B7","imped":"\u01B5","Implies":"\u21D2","incare":"\u2105","in":"\u2208","infin":"\u221E","infintie":"\u29DD","inodot":"\u0131","intcal":"\u22BA","int":"\u222B","Int":"\u222C","integers":"\u2124","Integral":"\u222B","intercal":"\u22BA","Intersection":"\u22C2","intlarhk":"\u2A17","intprod":"\u2A3C","InvisibleComma":"\u2063","InvisibleTimes":"\u2062","IOcy":"\u0401","iocy":"\u0451","Iogon":"\u012E","iogon":"\u012F","Iopf":"\uD835\uDD40","iopf":"\uD835\uDD5A","Iota":"\u0399","iota":"\u03B9","iprod":"\u2A3C","iquest":"\u00BF","iscr":"\uD835\uDCBE","Iscr":"\u2110","isin":"\u2208","isindot":"\u22F5","isinE":"\u22F9","isins":"\u22F4","isinsv":"\u22F3","isinv":"\u2208","it":"\u2062","Itilde":"\u0128","itilde":"\u0129","Iukcy":"\u0406","iukcy":"\u0456","Iuml":"\u00CF","iuml":"\u00EF","Jcirc":"\u0134","jcirc":"\u0135","Jcy":"\u0419","jcy":"\u0439","Jfr":"\uD835\uDD0D","jfr":"\uD835\uDD27","jmath":"\u0237","Jopf":"\uD835\uDD41","jopf":"\uD835\uDD5B","Jscr":"\uD835\uDCA5","jscr":"\uD835\uDCBF","Jsercy":"\u0408","jsercy":"\u0458","Jukcy":"\u0404","jukcy":"\u0454","Kappa":"\u039A","kappa":"\u03BA","kappav":"\u03F0","Kcedil":"\u0136","kcedil":"\u0137","Kcy":"\u041A","kcy":"\u043A","Kfr":"\uD835\uDD0E","kfr":"\uD835\uDD28","kgreen":"\u0138","KHcy":"\u0425","khcy":"\u0445","KJcy":"\u040C","kjcy":"\u045C","Kopf":"\uD835\uDD42","kopf":"\uD835\uDD5C","Kscr":"\uD835\uDCA6","kscr":"\uD835\uDCC0","lAarr":"\u21DA","Lacute":"\u0139","lacute":"\u013A","laemptyv":"\u29B4","lagran":"\u2112","Lambda":"\u039B","lambda":"\u03BB","lang":"\u27E8","Lang":"\u27EA","langd":"\u2991","langle":"\u27E8","lap":"\u2A85","Laplacetrf":"\u2112","laquo":"\u00AB","larrb":"\u21E4","larrbfs":"\u291F","larr":"\u2190","Larr":"\u219E","lArr":"\u21D0","larrfs":"\u291D","larrhk":"\u21A9","larrlp":"\u21AB","larrpl":"\u2939","larrsim":"\u2973","larrtl":"\u21A2","latail":"\u2919","lAtail":"\u291B","lat":"\u2AAB","late":"\u2AAD","lates":"\u2AAD\uFE00","lbarr":"\u290C","lBarr":"\u290E","lbbrk":"\u2772","lbrace":"{","lbrack":"[","lbrke":"\u298B","lbrksld":"\u298F","lbrkslu":"\u298D","Lcaron":"\u013D","lcaron":"\u013E","Lcedil":"\u013B","lcedil":"\u013C","lceil":"\u2308","lcub":"{","Lcy":"\u041B","lcy":"\u043B","ldca":"\u2936","ldquo":"\u201C","ldquor":"\u201E","ldrdhar":"\u2967","ldrushar":"\u294B","ldsh":"\u21B2","le":"\u2264","lE":"\u2266","LeftAngleBracket":"\u27E8","LeftArrowBar":"\u21E4","leftarrow":"\u2190","LeftArrow":"\u2190","Leftarrow":"\u21D0","LeftArrowRightArrow":"\u21C6","leftarrowtail":"\u21A2","LeftCeiling":"\u2308","LeftDoubleBracket":"\u27E6","LeftDownTeeVector":"\u2961","LeftDownVectorBar":"\u2959","LeftDownVector":"\u21C3","LeftFloor":"\u230A","leftharpoondown":"\u21BD","leftharpoonup":"\u21BC","leftleftarrows":"\u21C7","leftrightarrow":"\u2194","LeftRightArrow":"\u2194","Leftrightarrow":"\u21D4","leftrightarrows":"\u21C6","leftrightharpoons":"\u21CB","leftrightsquigarrow":"\u21AD","LeftRightVector":"\u294E","LeftTeeArrow":"\u21A4","LeftTee":"\u22A3","LeftTeeVector":"\u295A","leftthreetimes":"\u22CB","LeftTriangleBar":"\u29CF","LeftTriangle":"\u22B2","LeftTriangleEqual":"\u22B4","LeftUpDownVector":"\u2951","LeftUpTeeVector":"\u2960","LeftUpVectorBar":"\u2958","LeftUpVector":"\u21BF","LeftVectorBar":"\u2952","LeftVector":"\u21BC","lEg":"\u2A8B","leg":"\u22DA","leq":"\u2264","leqq":"\u2266","leqslant":"\u2A7D","lescc":"\u2AA8","les":"\u2A7D","lesdot":"\u2A7F","lesdoto":"\u2A81","lesdotor":"\u2A83","lesg":"\u22DA\uFE00","lesges":"\u2A93","lessapprox":"\u2A85","lessdot":"\u22D6","lesseqgtr":"\u22DA","lesseqqgtr":"\u2A8B","LessEqualGreater":"\u22DA","LessFullEqual":"\u2266","LessGreater":"\u2276","lessgtr":"\u2276","LessLess":"\u2AA1","lesssim":"\u2272","LessSlantEqual":"\u2A7D","LessTilde":"\u2272","lfisht":"\u297C","lfloor":"\u230A","Lfr":"\uD835\uDD0F","lfr":"\uD835\uDD29","lg":"\u2276","lgE":"\u2A91","lHar":"\u2962","lhard":"\u21BD","lharu":"\u21BC","lharul":"\u296A","lhblk":"\u2584","LJcy":"\u0409","ljcy":"\u0459","llarr":"\u21C7","ll":"\u226A","Ll":"\u22D8","llcorner":"\u231E","Lleftarrow":"\u21DA","llhard":"\u296B","lltri":"\u25FA","Lmidot":"\u013F","lmidot":"\u0140","lmoustache":"\u23B0","lmoust":"\u23B0","lnap":"\u2A89","lnapprox":"\u2A89","lne":"\u2A87","lnE":"\u2268","lneq":"\u2A87","lneqq":"\u2268","lnsim":"\u22E6","loang":"\u27EC","loarr":"\u21FD","lobrk":"\u27E6","longleftarrow":"\u27F5","LongLeftArrow":"\u27F5","Longleftarrow":"\u27F8","longleftrightarrow":"\u27F7","LongLeftRightArrow":"\u27F7","Longleftrightarrow":"\u27FA","longmapsto":"\u27FC","longrightarrow":"\u27F6","LongRightArrow":"\u27F6","Longrightarrow":"\u27F9","looparrowleft":"\u21AB","looparrowright":"\u21AC","lopar":"\u2985","Lopf":"\uD835\uDD43","lopf":"\uD835\uDD5D","loplus":"\u2A2D","lotimes":"\u2A34","lowast":"\u2217","lowbar":"_","LowerLeftArrow":"\u2199","LowerRightArrow":"\u2198","loz":"\u25CA","lozenge":"\u25CA","lozf":"\u29EB","lpar":"(","lparlt":"\u2993","lrarr":"\u21C6","lrcorner":"\u231F","lrhar":"\u21CB","lrhard":"\u296D","lrm":"\u200E","lrtri":"\u22BF","lsaquo":"\u2039","lscr":"\uD835\uDCC1","Lscr":"\u2112","lsh":"\u21B0","Lsh":"\u21B0","lsim":"\u2272","lsime":"\u2A8D","lsimg":"\u2A8F","lsqb":"[","lsquo":"\u2018","lsquor":"\u201A","Lstrok":"\u0141","lstrok":"\u0142","ltcc":"\u2AA6","ltcir":"\u2A79","lt":"<","LT":"<","Lt":"\u226A","ltdot":"\u22D6","lthree":"\u22CB","ltimes":"\u22C9","ltlarr":"\u2976","ltquest":"\u2A7B","ltri":"\u25C3","ltrie":"\u22B4","ltrif":"\u25C2","ltrPar":"\u2996","lurdshar":"\u294A","luruhar":"\u2966","lvertneqq":"\u2268\uFE00","lvnE":"\u2268\uFE00","macr":"\u00AF","male":"\u2642","malt":"\u2720","maltese":"\u2720","Map":"\u2905","map":"\u21A6","mapsto":"\u21A6","mapstodown":"\u21A7","mapstoleft":"\u21A4","mapstoup":"\u21A5","marker":"\u25AE","mcomma":"\u2A29","Mcy":"\u041C","mcy":"\u043C","mdash":"\u2014","mDDot":"\u223A","measuredangle":"\u2221","MediumSpace":"\u205F","Mellintrf":"\u2133","Mfr":"\uD835\uDD10","mfr":"\uD835\uDD2A","mho":"\u2127","micro":"\u00B5","midast":"*","midcir":"\u2AF0","mid":"\u2223","middot":"\u00B7","minusb":"\u229F","minus":"\u2212","minusd":"\u2238","minusdu":"\u2A2A","MinusPlus":"\u2213","mlcp":"\u2ADB","mldr":"\u2026","mnplus":"\u2213","models":"\u22A7","Mopf":"\uD835\uDD44","mopf":"\uD835\uDD5E","mp":"\u2213","mscr":"\uD835\uDCC2","Mscr":"\u2133","mstpos":"\u223E","Mu":"\u039C","mu":"\u03BC","multimap":"\u22B8","mumap":"\u22B8","nabla":"\u2207","Nacute":"\u0143","nacute":"\u0144","nang":"\u2220\u20D2","nap":"\u2249","napE":"\u2A70\u0338","napid":"\u224B\u0338","napos":"\u0149","napprox":"\u2249","natural":"\u266E","naturals":"\u2115","natur":"\u266E","nbsp":"\u00A0","nbump":"\u224E\u0338","nbumpe":"\u224F\u0338","ncap":"\u2A43","Ncaron":"\u0147","ncaron":"\u0148","Ncedil":"\u0145","ncedil":"\u0146","ncong":"\u2247","ncongdot":"\u2A6D\u0338","ncup":"\u2A42","Ncy":"\u041D","ncy":"\u043D","ndash":"\u2013","nearhk":"\u2924","nearr":"\u2197","neArr":"\u21D7","nearrow":"\u2197","ne":"\u2260","nedot":"\u2250\u0338","NegativeMediumSpace":"\u200B","NegativeThickSpace":"\u200B","NegativeThinSpace":"\u200B","NegativeVeryThinSpace":"\u200B","nequiv":"\u2262","nesear":"\u2928","nesim":"\u2242\u0338","NestedGreaterGreater":"\u226B","NestedLessLess":"\u226A","NewLine":"\n","nexist":"\u2204","nexists":"\u2204","Nfr":"\uD835\uDD11","nfr":"\uD835\uDD2B","ngE":"\u2267\u0338","nge":"\u2271","ngeq":"\u2271","ngeqq":"\u2267\u0338","ngeqslant":"\u2A7E\u0338","nges":"\u2A7E\u0338","nGg":"\u22D9\u0338","ngsim":"\u2275","nGt":"\u226B\u20D2","ngt":"\u226F","ngtr":"\u226F","nGtv":"\u226B\u0338","nharr":"\u21AE","nhArr":"\u21CE","nhpar":"\u2AF2","ni":"\u220B","nis":"\u22FC","nisd":"\u22FA","niv":"\u220B","NJcy":"\u040A","njcy":"\u045A","nlarr":"\u219A","nlArr":"\u21CD","nldr":"\u2025","nlE":"\u2266\u0338","nle":"\u2270","nleftarrow":"\u219A","nLeftarrow":"\u21CD","nleftrightarrow":"\u21AE","nLeftrightarrow":"\u21CE","nleq":"\u2270","nleqq":"\u2266\u0338","nleqslant":"\u2A7D\u0338","nles":"\u2A7D\u0338","nless":"\u226E","nLl":"\u22D8\u0338","nlsim":"\u2274","nLt":"\u226A\u20D2","nlt":"\u226E","nltri":"\u22EA","nltrie":"\u22EC","nLtv":"\u226A\u0338","nmid":"\u2224","NoBreak":"\u2060","NonBreakingSpace":"\u00A0","nopf":"\uD835\uDD5F","Nopf":"\u2115","Not":"\u2AEC","not":"\u00AC","NotCongruent":"\u2262","NotCupCap":"\u226D","NotDoubleVerticalBar":"\u2226","NotElement":"\u2209","NotEqual":"\u2260","NotEqualTilde":"\u2242\u0338","NotExists":"\u2204","NotGreater":"\u226F","NotGreaterEqual":"\u2271","NotGreaterFullEqual":"\u2267\u0338","NotGreaterGreater":"\u226B\u0338","NotGreaterLess":"\u2279","NotGreaterSlantEqual":"\u2A7E\u0338","NotGreaterTilde":"\u2275","NotHumpDownHump":"\u224E\u0338","NotHumpEqual":"\u224F\u0338","notin":"\u2209","notindot":"\u22F5\u0338","notinE":"\u22F9\u0338","notinva":"\u2209","notinvb":"\u22F7","notinvc":"\u22F6","NotLeftTriangleBar":"\u29CF\u0338","NotLeftTriangle":"\u22EA","NotLeftTriangleEqual":"\u22EC","NotLess":"\u226E","NotLessEqual":"\u2270","NotLessGreater":"\u2278","NotLessLess":"\u226A\u0338","NotLessSlantEqual":"\u2A7D\u0338","NotLessTilde":"\u2274","NotNestedGreaterGreater":"\u2AA2\u0338","NotNestedLessLess":"\u2AA1\u0338","notni":"\u220C","notniva":"\u220C","notnivb":"\u22FE","notnivc":"\u22FD","NotPrecedes":"\u2280","NotPrecedesEqual":"\u2AAF\u0338","NotPrecedesSlantEqual":"\u22E0","NotReverseElement":"\u220C","NotRightTriangleBar":"\u29D0\u0338","NotRightTriangle":"\u22EB","NotRightTriangleEqual":"\u22ED","NotSquareSubset":"\u228F\u0338","NotSquareSubsetEqual":"\u22E2","NotSquareSuperset":"\u2290\u0338","NotSquareSupersetEqual":"\u22E3","NotSubset":"\u2282\u20D2","NotSubsetEqual":"\u2288","NotSucceeds":"\u2281","NotSucceedsEqual":"\u2AB0\u0338","NotSucceedsSlantEqual":"\u22E1","NotSucceedsTilde":"\u227F\u0338","NotSuperset":"\u2283\u20D2","NotSupersetEqual":"\u2289","NotTilde":"\u2241","NotTildeEqual":"\u2244","NotTildeFullEqual":"\u2247","NotTildeTilde":"\u2249","NotVerticalBar":"\u2224","nparallel":"\u2226","npar":"\u2226","nparsl":"\u2AFD\u20E5","npart":"\u2202\u0338","npolint":"\u2A14","npr":"\u2280","nprcue":"\u22E0","nprec":"\u2280","npreceq":"\u2AAF\u0338","npre":"\u2AAF\u0338","nrarrc":"\u2933\u0338","nrarr":"\u219B","nrArr":"\u21CF","nrarrw":"\u219D\u0338","nrightarrow":"\u219B","nRightarrow":"\u21CF","nrtri":"\u22EB","nrtrie":"\u22ED","nsc":"\u2281","nsccue":"\u22E1","nsce":"\u2AB0\u0338","Nscr":"\uD835\uDCA9","nscr":"\uD835\uDCC3","nshortmid":"\u2224","nshortparallel":"\u2226","nsim":"\u2241","nsime":"\u2244","nsimeq":"\u2244","nsmid":"\u2224","nspar":"\u2226","nsqsube":"\u22E2","nsqsupe":"\u22E3","nsub":"\u2284","nsubE":"\u2AC5\u0338","nsube":"\u2288","nsubset":"\u2282\u20D2","nsubseteq":"\u2288","nsubseteqq":"\u2AC5\u0338","nsucc":"\u2281","nsucceq":"\u2AB0\u0338","nsup":"\u2285","nsupE":"\u2AC6\u0338","nsupe":"\u2289","nsupset":"\u2283\u20D2","nsupseteq":"\u2289","nsupseteqq":"\u2AC6\u0338","ntgl":"\u2279","Ntilde":"\u00D1","ntilde":"\u00F1","ntlg":"\u2278","ntriangleleft":"\u22EA","ntrianglelefteq":"\u22EC","ntriangleright":"\u22EB","ntrianglerighteq":"\u22ED","Nu":"\u039D","nu":"\u03BD","num":"#","numero":"\u2116","numsp":"\u2007","nvap":"\u224D\u20D2","nvdash":"\u22AC","nvDash":"\u22AD","nVdash":"\u22AE","nVDash":"\u22AF","nvge":"\u2265\u20D2","nvgt":">\u20D2","nvHarr":"\u2904","nvinfin":"\u29DE","nvlArr":"\u2902","nvle":"\u2264\u20D2","nvlt":"<\u20D2","nvltrie":"\u22B4\u20D2","nvrArr":"\u2903","nvrtrie":"\u22B5\u20D2","nvsim":"\u223C\u20D2","nwarhk":"\u2923","nwarr":"\u2196","nwArr":"\u21D6","nwarrow":"\u2196","nwnear":"\u2927","Oacute":"\u00D3","oacute":"\u00F3","oast":"\u229B","Ocirc":"\u00D4","ocirc":"\u00F4","ocir":"\u229A","Ocy":"\u041E","ocy":"\u043E","odash":"\u229D","Odblac":"\u0150","odblac":"\u0151","odiv":"\u2A38","odot":"\u2299","odsold":"\u29BC","OElig":"\u0152","oelig":"\u0153","ofcir":"\u29BF","Ofr":"\uD835\uDD12","ofr":"\uD835\uDD2C","ogon":"\u02DB","Ograve":"\u00D2","ograve":"\u00F2","ogt":"\u29C1","ohbar":"\u29B5","ohm":"\u03A9","oint":"\u222E","olarr":"\u21BA","olcir":"\u29BE","olcross":"\u29BB","oline":"\u203E","olt":"\u29C0","Omacr":"\u014C","omacr":"\u014D","Omega":"\u03A9","omega":"\u03C9","Omicron":"\u039F","omicron":"\u03BF","omid":"\u29B6","ominus":"\u2296","Oopf":"\uD835\uDD46","oopf":"\uD835\uDD60","opar":"\u29B7","OpenCurlyDoubleQuote":"\u201C","OpenCurlyQuote":"\u2018","operp":"\u29B9","oplus":"\u2295","orarr":"\u21BB","Or":"\u2A54","or":"\u2228","ord":"\u2A5D","order":"\u2134","orderof":"\u2134","ordf":"\u00AA","ordm":"\u00BA","origof":"\u22B6","oror":"\u2A56","orslope":"\u2A57","orv":"\u2A5B","oS":"\u24C8","Oscr":"\uD835\uDCAA","oscr":"\u2134","Oslash":"\u00D8","oslash":"\u00F8","osol":"\u2298","Otilde":"\u00D5","otilde":"\u00F5","otimesas":"\u2A36","Otimes":"\u2A37","otimes":"\u2297","Ouml":"\u00D6","ouml":"\u00F6","ovbar":"\u233D","OverBar":"\u203E","OverBrace":"\u23DE","OverBracket":"\u23B4","OverParenthesis":"\u23DC","para":"\u00B6","parallel":"\u2225","par":"\u2225","parsim":"\u2AF3","parsl":"\u2AFD","part":"\u2202","PartialD":"\u2202","Pcy":"\u041F","pcy":"\u043F","percnt":"%","period":".","permil":"\u2030","perp":"\u22A5","pertenk":"\u2031","Pfr":"\uD835\uDD13","pfr":"\uD835\uDD2D","Phi":"\u03A6","phi":"\u03C6","phiv":"\u03D5","phmmat":"\u2133","phone":"\u260E","Pi":"\u03A0","pi":"\u03C0","pitchfork":"\u22D4","piv":"\u03D6","planck":"\u210F","planckh":"\u210E","plankv":"\u210F","plusacir":"\u2A23","plusb":"\u229E","pluscir":"\u2A22","plus":"+","plusdo":"\u2214","plusdu":"\u2A25","pluse":"\u2A72","PlusMinus":"\u00B1","plusmn":"\u00B1","plussim":"\u2A26","plustwo":"\u2A27","pm":"\u00B1","Poincareplane":"\u210C","pointint":"\u2A15","popf":"\uD835\uDD61","Popf":"\u2119","pound":"\u00A3","prap":"\u2AB7","Pr":"\u2ABB","pr":"\u227A","prcue":"\u227C","precapprox":"\u2AB7","prec":"\u227A","preccurlyeq":"\u227C","Precedes":"\u227A","PrecedesEqual":"\u2AAF","PrecedesSlantEqual":"\u227C","PrecedesTilde":"\u227E","preceq":"\u2AAF","precnapprox":"\u2AB9","precneqq":"\u2AB5","precnsim":"\u22E8","pre":"\u2AAF","prE":"\u2AB3","precsim":"\u227E","prime":"\u2032","Prime":"\u2033","primes":"\u2119","prnap":"\u2AB9","prnE":"\u2AB5","prnsim":"\u22E8","prod":"\u220F","Product":"\u220F","profalar":"\u232E","profline":"\u2312","profsurf":"\u2313","prop":"\u221D","Proportional":"\u221D","Proportion":"\u2237","propto":"\u221D","prsim":"\u227E","prurel":"\u22B0","Pscr":"\uD835\uDCAB","pscr":"\uD835\uDCC5","Psi":"\u03A8","psi":"\u03C8","puncsp":"\u2008","Qfr":"\uD835\uDD14","qfr":"\uD835\uDD2E","qint":"\u2A0C","qopf":"\uD835\uDD62","Qopf":"\u211A","qprime":"\u2057","Qscr":"\uD835\uDCAC","qscr":"\uD835\uDCC6","quaternions":"\u210D","quatint":"\u2A16","quest":"?","questeq":"\u225F","quot":"\"","QUOT":"\"","rAarr":"\u21DB","race":"\u223D\u0331","Racute":"\u0154","racute":"\u0155","radic":"\u221A","raemptyv":"\u29B3","rang":"\u27E9","Rang":"\u27EB","rangd":"\u2992","range":"\u29A5","rangle":"\u27E9","raquo":"\u00BB","rarrap":"\u2975","rarrb":"\u21E5","rarrbfs":"\u2920","rarrc":"\u2933","rarr":"\u2192","Rarr":"\u21A0","rArr":"\u21D2","rarrfs":"\u291E","rarrhk":"\u21AA","rarrlp":"\u21AC","rarrpl":"\u2945","rarrsim":"\u2974","Rarrtl":"\u2916","rarrtl":"\u21A3","rarrw":"\u219D","ratail":"\u291A","rAtail":"\u291C","ratio":"\u2236","rationals":"\u211A","rbarr":"\u290D","rBarr":"\u290F","RBarr":"\u2910","rbbrk":"\u2773","rbrace":"}","rbrack":"]","rbrke":"\u298C","rbrksld":"\u298E","rbrkslu":"\u2990","Rcaron":"\u0158","rcaron":"\u0159","Rcedil":"\u0156","rcedil":"\u0157","rceil":"\u2309","rcub":"}","Rcy":"\u0420","rcy":"\u0440","rdca":"\u2937","rdldhar":"\u2969","rdquo":"\u201D","rdquor":"\u201D","rdsh":"\u21B3","real":"\u211C","realine":"\u211B","realpart":"\u211C","reals":"\u211D","Re":"\u211C","rect":"\u25AD","reg":"\u00AE","REG":"\u00AE","ReverseElement":"\u220B","ReverseEquilibrium":"\u21CB","ReverseUpEquilibrium":"\u296F","rfisht":"\u297D","rfloor":"\u230B","rfr":"\uD835\uDD2F","Rfr":"\u211C","rHar":"\u2964","rhard":"\u21C1","rharu":"\u21C0","rharul":"\u296C","Rho":"\u03A1","rho":"\u03C1","rhov":"\u03F1","RightAngleBracket":"\u27E9","RightArrowBar":"\u21E5","rightarrow":"\u2192","RightArrow":"\u2192","Rightarrow":"\u21D2","RightArrowLeftArrow":"\u21C4","rightarrowtail":"\u21A3","RightCeiling":"\u2309","RightDoubleBracket":"\u27E7","RightDownTeeVector":"\u295D","RightDownVectorBar":"\u2955","RightDownVector":"\u21C2","RightFloor":"\u230B","rightharpoondown":"\u21C1","rightharpoonup":"\u21C0","rightleftarrows":"\u21C4","rightleftharpoons":"\u21CC","rightrightarrows":"\u21C9","rightsquigarrow":"\u219D","RightTeeArrow":"\u21A6","RightTee":"\u22A2","RightTeeVector":"\u295B","rightthreetimes":"\u22CC","RightTriangleBar":"\u29D0","RightTriangle":"\u22B3","RightTriangleEqual":"\u22B5","RightUpDownVector":"\u294F","RightUpTeeVector":"\u295C","RightUpVectorBar":"\u2954","RightUpVector":"\u21BE","RightVectorBar":"\u2953","RightVector":"\u21C0","ring":"\u02DA","risingdotseq":"\u2253","rlarr":"\u21C4","rlhar":"\u21CC","rlm":"\u200F","rmoustache":"\u23B1","rmoust":"\u23B1","rnmid":"\u2AEE","roang":"\u27ED","roarr":"\u21FE","robrk":"\u27E7","ropar":"\u2986","ropf":"\uD835\uDD63","Ropf":"\u211D","roplus":"\u2A2E","rotimes":"\u2A35","RoundImplies":"\u2970","rpar":")","rpargt":"\u2994","rppolint":"\u2A12","rrarr":"\u21C9","Rrightarrow":"\u21DB","rsaquo":"\u203A","rscr":"\uD835\uDCC7","Rscr":"\u211B","rsh":"\u21B1","Rsh":"\u21B1","rsqb":"]","rsquo":"\u2019","rsquor":"\u2019","rthree":"\u22CC","rtimes":"\u22CA","rtri":"\u25B9","rtrie":"\u22B5","rtrif":"\u25B8","rtriltri":"\u29CE","RuleDelayed":"\u29F4","ruluhar":"\u2968","rx":"\u211E","Sacute":"\u015A","sacute":"\u015B","sbquo":"\u201A","scap":"\u2AB8","Scaron":"\u0160","scaron":"\u0161","Sc":"\u2ABC","sc":"\u227B","sccue":"\u227D","sce":"\u2AB0","scE":"\u2AB4","Scedil":"\u015E","scedil":"\u015F","Scirc":"\u015C","scirc":"\u015D","scnap":"\u2ABA","scnE":"\u2AB6","scnsim":"\u22E9","scpolint":"\u2A13","scsim":"\u227F","Scy":"\u0421","scy":"\u0441","sdotb":"\u22A1","sdot":"\u22C5","sdote":"\u2A66","searhk":"\u2925","searr":"\u2198","seArr":"\u21D8","searrow":"\u2198","sect":"\u00A7","semi":";","seswar":"\u2929","setminus":"\u2216","setmn":"\u2216","sext":"\u2736","Sfr":"\uD835\uDD16","sfr":"\uD835\uDD30","sfrown":"\u2322","sharp":"\u266F","SHCHcy":"\u0429","shchcy":"\u0449","SHcy":"\u0428","shcy":"\u0448","ShortDownArrow":"\u2193","ShortLeftArrow":"\u2190","shortmid":"\u2223","shortparallel":"\u2225","ShortRightArrow":"\u2192","ShortUpArrow":"\u2191","shy":"\u00AD","Sigma":"\u03A3","sigma":"\u03C3","sigmaf":"\u03C2","sigmav":"\u03C2","sim":"\u223C","simdot":"\u2A6A","sime":"\u2243","simeq":"\u2243","simg":"\u2A9E","simgE":"\u2AA0","siml":"\u2A9D","simlE":"\u2A9F","simne":"\u2246","simplus":"\u2A24","simrarr":"\u2972","slarr":"\u2190","SmallCircle":"\u2218","smallsetminus":"\u2216","smashp":"\u2A33","smeparsl":"\u29E4","smid":"\u2223","smile":"\u2323","smt":"\u2AAA","smte":"\u2AAC","smtes":"\u2AAC\uFE00","SOFTcy":"\u042C","softcy":"\u044C","solbar":"\u233F","solb":"\u29C4","sol":"/","Sopf":"\uD835\uDD4A","sopf":"\uD835\uDD64","spades":"\u2660","spadesuit":"\u2660","spar":"\u2225","sqcap":"\u2293","sqcaps":"\u2293\uFE00","sqcup":"\u2294","sqcups":"\u2294\uFE00","Sqrt":"\u221A","sqsub":"\u228F","sqsube":"\u2291","sqsubset":"\u228F","sqsubseteq":"\u2291","sqsup":"\u2290","sqsupe":"\u2292","sqsupset":"\u2290","sqsupseteq":"\u2292","square":"\u25A1","Square":"\u25A1","SquareIntersection":"\u2293","SquareSubset":"\u228F","SquareSubsetEqual":"\u2291","SquareSuperset":"\u2290","SquareSupersetEqual":"\u2292","SquareUnion":"\u2294","squarf":"\u25AA","squ":"\u25A1","squf":"\u25AA","srarr":"\u2192","Sscr":"\uD835\uDCAE","sscr":"\uD835\uDCC8","ssetmn":"\u2216","ssmile":"\u2323","sstarf":"\u22C6","Star":"\u22C6","star":"\u2606","starf":"\u2605","straightepsilon":"\u03F5","straightphi":"\u03D5","strns":"\u00AF","sub":"\u2282","Sub":"\u22D0","subdot":"\u2ABD","subE":"\u2AC5","sube":"\u2286","subedot":"\u2AC3","submult":"\u2AC1","subnE":"\u2ACB","subne":"\u228A","subplus":"\u2ABF","subrarr":"\u2979","subset":"\u2282","Subset":"\u22D0","subseteq":"\u2286","subseteqq":"\u2AC5","SubsetEqual":"\u2286","subsetneq":"\u228A","subsetneqq":"\u2ACB","subsim":"\u2AC7","subsub":"\u2AD5","subsup":"\u2AD3","succapprox":"\u2AB8","succ":"\u227B","succcurlyeq":"\u227D","Succeeds":"\u227B","SucceedsEqual":"\u2AB0","SucceedsSlantEqual":"\u227D","SucceedsTilde":"\u227F","succeq":"\u2AB0","succnapprox":"\u2ABA","succneqq":"\u2AB6","succnsim":"\u22E9","succsim":"\u227F","SuchThat":"\u220B","sum":"\u2211","Sum":"\u2211","sung":"\u266A","sup1":"\u00B9","sup2":"\u00B2","sup3":"\u00B3","sup":"\u2283","Sup":"\u22D1","supdot":"\u2ABE","supdsub":"\u2AD8","supE":"\u2AC6","supe":"\u2287","supedot":"\u2AC4","Superset":"\u2283","SupersetEqual":"\u2287","suphsol":"\u27C9","suphsub":"\u2AD7","suplarr":"\u297B","supmult":"\u2AC2","supnE":"\u2ACC","supne":"\u228B","supplus":"\u2AC0","supset":"\u2283","Supset":"\u22D1","supseteq":"\u2287","supseteqq":"\u2AC6","supsetneq":"\u228B","supsetneqq":"\u2ACC","supsim":"\u2AC8","supsub":"\u2AD4","supsup":"\u2AD6","swarhk":"\u2926","swarr":"\u2199","swArr":"\u21D9","swarrow":"\u2199","swnwar":"\u292A","szlig":"\u00DF","Tab":"\t","target":"\u2316","Tau":"\u03A4","tau":"\u03C4","tbrk":"\u23B4","Tcaron":"\u0164","tcaron":"\u0165","Tcedil":"\u0162","tcedil":"\u0163","Tcy":"\u0422","tcy":"\u0442","tdot":"\u20DB","telrec":"\u2315","Tfr":"\uD835\uDD17","tfr":"\uD835\uDD31","there4":"\u2234","therefore":"\u2234","Therefore":"\u2234","Theta":"\u0398","theta":"\u03B8","thetasym":"\u03D1","thetav":"\u03D1","thickapprox":"\u2248","thicksim":"\u223C","ThickSpace":"\u205F\u200A","ThinSpace":"\u2009","thinsp":"\u2009","thkap":"\u2248","thksim":"\u223C","THORN":"\u00DE","thorn":"\u00FE","tilde":"\u02DC","Tilde":"\u223C","TildeEqual":"\u2243","TildeFullEqual":"\u2245","TildeTilde":"\u2248","timesbar":"\u2A31","timesb":"\u22A0","times":"\u00D7","timesd":"\u2A30","tint":"\u222D","toea":"\u2928","topbot":"\u2336","topcir":"\u2AF1","top":"\u22A4","Topf":"\uD835\uDD4B","topf":"\uD835\uDD65","topfork":"\u2ADA","tosa":"\u2929","tprime":"\u2034","trade":"\u2122","TRADE":"\u2122","triangle":"\u25B5","triangledown":"\u25BF","triangleleft":"\u25C3","trianglelefteq":"\u22B4","triangleq":"\u225C","triangleright":"\u25B9","trianglerighteq":"\u22B5","tridot":"\u25EC","trie":"\u225C","triminus":"\u2A3A","TripleDot":"\u20DB","triplus":"\u2A39","trisb":"\u29CD","tritime":"\u2A3B","trpezium":"\u23E2","Tscr":"\uD835\uDCAF","tscr":"\uD835\uDCC9","TScy":"\u0426","tscy":"\u0446","TSHcy":"\u040B","tshcy":"\u045B","Tstrok":"\u0166","tstrok":"\u0167","twixt":"\u226C","twoheadleftarrow":"\u219E","twoheadrightarrow":"\u21A0","Uacute":"\u00DA","uacute":"\u00FA","uarr":"\u2191","Uarr":"\u219F","uArr":"\u21D1","Uarrocir":"\u2949","Ubrcy":"\u040E","ubrcy":"\u045E","Ubreve":"\u016C","ubreve":"\u016D","Ucirc":"\u00DB","ucirc":"\u00FB","Ucy":"\u0423","ucy":"\u0443","udarr":"\u21C5","Udblac":"\u0170","udblac":"\u0171","udhar":"\u296E","ufisht":"\u297E","Ufr":"\uD835\uDD18","ufr":"\uD835\uDD32","Ugrave":"\u00D9","ugrave":"\u00F9","uHar":"\u2963","uharl":"\u21BF","uharr":"\u21BE","uhblk":"\u2580","ulcorn":"\u231C","ulcorner":"\u231C","ulcrop":"\u230F","ultri":"\u25F8","Umacr":"\u016A","umacr":"\u016B","uml":"\u00A8","UnderBar":"_","UnderBrace":"\u23DF","UnderBracket":"\u23B5","UnderParenthesis":"\u23DD","Union":"\u22C3","UnionPlus":"\u228E","Uogon":"\u0172","uogon":"\u0173","Uopf":"\uD835\uDD4C","uopf":"\uD835\uDD66","UpArrowBar":"\u2912","uparrow":"\u2191","UpArrow":"\u2191","Uparrow":"\u21D1","UpArrowDownArrow":"\u21C5","updownarrow":"\u2195","UpDownArrow":"\u2195","Updownarrow":"\u21D5","UpEquilibrium":"\u296E","upharpoonleft":"\u21BF","upharpoonright":"\u21BE","uplus":"\u228E","UpperLeftArrow":"\u2196","UpperRightArrow":"\u2197","upsi":"\u03C5","Upsi":"\u03D2","upsih":"\u03D2","Upsilon":"\u03A5","upsilon":"\u03C5","UpTeeArrow":"\u21A5","UpTee":"\u22A5","upuparrows":"\u21C8","urcorn":"\u231D","urcorner":"\u231D","urcrop":"\u230E","Uring":"\u016E","uring":"\u016F","urtri":"\u25F9","Uscr":"\uD835\uDCB0","uscr":"\uD835\uDCCA","utdot":"\u22F0","Utilde":"\u0168","utilde":"\u0169","utri":"\u25B5","utrif":"\u25B4","uuarr":"\u21C8","Uuml":"\u00DC","uuml":"\u00FC","uwangle":"\u29A7","vangrt":"\u299C","varepsilon":"\u03F5","varkappa":"\u03F0","varnothing":"\u2205","varphi":"\u03D5","varpi":"\u03D6","varpropto":"\u221D","varr":"\u2195","vArr":"\u21D5","varrho":"\u03F1","varsigma":"\u03C2","varsubsetneq":"\u228A\uFE00","varsubsetneqq":"\u2ACB\uFE00","varsupsetneq":"\u228B\uFE00","varsupsetneqq":"\u2ACC\uFE00","vartheta":"\u03D1","vartriangleleft":"\u22B2","vartriangleright":"\u22B3","vBar":"\u2AE8","Vbar":"\u2AEB","vBarv":"\u2AE9","Vcy":"\u0412","vcy":"\u0432","vdash":"\u22A2","vDash":"\u22A8","Vdash":"\u22A9","VDash":"\u22AB","Vdashl":"\u2AE6","veebar":"\u22BB","vee":"\u2228","Vee":"\u22C1","veeeq":"\u225A","vellip":"\u22EE","verbar":"|","Verbar":"\u2016","vert":"|","Vert":"\u2016","VerticalBar":"\u2223","VerticalLine":"|","VerticalSeparator":"\u2758","VerticalTilde":"\u2240","VeryThinSpace":"\u200A","Vfr":"\uD835\uDD19","vfr":"\uD835\uDD33","vltri":"\u22B2","vnsub":"\u2282\u20D2","vnsup":"\u2283\u20D2","Vopf":"\uD835\uDD4D","vopf":"\uD835\uDD67","vprop":"\u221D","vrtri":"\u22B3","Vscr":"\uD835\uDCB1","vscr":"\uD835\uDCCB","vsubnE":"\u2ACB\uFE00","vsubne":"\u228A\uFE00","vsupnE":"\u2ACC\uFE00","vsupne":"\u228B\uFE00","Vvdash":"\u22AA","vzigzag":"\u299A","Wcirc":"\u0174","wcirc":"\u0175","wedbar":"\u2A5F","wedge":"\u2227","Wedge":"\u22C0","wedgeq":"\u2259","weierp":"\u2118","Wfr":"\uD835\uDD1A","wfr":"\uD835\uDD34","Wopf":"\uD835\uDD4E","wopf":"\uD835\uDD68","wp":"\u2118","wr":"\u2240","wreath":"\u2240","Wscr":"\uD835\uDCB2","wscr":"\uD835\uDCCC","xcap":"\u22C2","xcirc":"\u25EF","xcup":"\u22C3","xdtri":"\u25BD","Xfr":"\uD835\uDD1B","xfr":"\uD835\uDD35","xharr":"\u27F7","xhArr":"\u27FA","Xi":"\u039E","xi":"\u03BE","xlarr":"\u27F5","xlArr":"\u27F8","xmap":"\u27FC","xnis":"\u22FB","xodot":"\u2A00","Xopf":"\uD835\uDD4F","xopf":"\uD835\uDD69","xoplus":"\u2A01","xotime":"\u2A02","xrarr":"\u27F6","xrArr":"\u27F9","Xscr":"\uD835\uDCB3","xscr":"\uD835\uDCCD","xsqcup":"\u2A06","xuplus":"\u2A04","xutri":"\u25B3","xvee":"\u22C1","xwedge":"\u22C0","Yacute":"\u00DD","yacute":"\u00FD","YAcy":"\u042F","yacy":"\u044F","Ycirc":"\u0176","ycirc":"\u0177","Ycy":"\u042B","ycy":"\u044B","yen":"\u00A5","Yfr":"\uD835\uDD1C","yfr":"\uD835\uDD36","YIcy":"\u0407","yicy":"\u0457","Yopf":"\uD835\uDD50","yopf":"\uD835\uDD6A","Yscr":"\uD835\uDCB4","yscr":"\uD835\uDCCE","YUcy":"\u042E","yucy":"\u044E","yuml":"\u00FF","Yuml":"\u0178","Zacute":"\u0179","zacute":"\u017A","Zcaron":"\u017D","zcaron":"\u017E","Zcy":"\u0417","zcy":"\u0437","Zdot":"\u017B","zdot":"\u017C","zeetrf":"\u2128","ZeroWidthSpace":"\u200B","Zeta":"\u0396","zeta":"\u03B6","zfr":"\uD835\uDD37","Zfr":"\u2128","ZHcy":"\u0416","zhcy":"\u0436","zigrarr":"\u21DD","zopf":"\uD835\uDD6B","Zopf":"\u2124","Zscr":"\uD835\uDCB5","zscr":"\uD835\uDCCF","zwj":"\u200D","zwnj":"\u200C"}},{}],53:[function(require,module,exports){'use strict';function assign(obj){var sources=Array.prototype.slice.call(arguments,1);sources.forEach(function(source){if(!source){return;} -Object.keys(source).forEach(function(key){obj[key]=source[key];});});return obj;} -function _class(obj){return Object.prototype.toString.call(obj);} -function isString(obj){return _class(obj)==='[object String]';} -function isObject(obj){return _class(obj)==='[object Object]';} -function isRegExp(obj){return _class(obj)==='[object RegExp]';} -function isFunction(obj){return _class(obj)==='[object Function]';} -function escapeRE(str){return str.replace(/[.?*+^$[\]\\(){}|-]/g,'\\$&');} -var defaultOptions={fuzzyLink:true,fuzzyEmail:true,fuzzyIP:false};function isOptionsObj(obj){return Object.keys(obj||{}).reduce(function(acc,k){return acc||defaultOptions.hasOwnProperty(k);},false);} -var defaultSchemas={'http:':{validate:function(text,pos,self){var tail=text.slice(pos);if(!self.re.http){self.re.http=new RegExp('^\\/\\/'+self.re.src_auth+self.re.src_host_port_strict+self.re.src_path,'i');} -if(self.re.http.test(tail)){return tail.match(self.re.http)[0].length;} -return 0;}},'https:':'http:','ftp:':'http:','//':{validate:function(text,pos,self){var tail=text.slice(pos);if(!self.re.no_http){self.re.no_http=new RegExp('^'+ -self.re.src_auth+'(?:localhost|(?:(?:'+self.re.src_domain+')\\.)+'+self.re.src_domain_root+')'+ -self.re.src_port+ -self.re.src_host_terminator+ -self.re.src_path,'i');} -if(self.re.no_http.test(tail)){if(pos>=3&&text[pos-3]===':'){return 0;} -if(pos>=3&&text[pos-3]==='/'){return 0;} -return tail.match(self.re.no_http)[0].length;} -return 0;}},'mailto:':{validate:function(text,pos,self){var tail=text.slice(pos);if(!self.re.mailto){self.re.mailto=new RegExp('^'+self.re.src_email_name+'@'+self.re.src_host_strict,'i');} -if(self.re.mailto.test(tail)){return tail.match(self.re.mailto)[0].length;} -return 0;}}};var tlds_2ch_src_re='a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]';var tlds_default='biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф'.split('|');function resetScanCache(self){self.__index__=-1;self.__text_cache__='';} -function createValidator(re){return function(text,pos){var tail=text.slice(pos);if(re.test(tail)){return tail.match(re)[0].length;} -return 0;};} -function createNormalizer(){return function(match,self){self.normalize(match);};} -function compile(self){var re=self.re=require('./lib/re')(self.__opts__);var tlds=self.__tlds__.slice();self.onCompile();if(!self.__tlds_replaced__){tlds.push(tlds_2ch_src_re);} -tlds.push(re.src_xn);re.src_tlds=tlds.join('|');function untpl(tpl){return tpl.replace('%TLDS%',re.src_tlds);} -re.email_fuzzy=RegExp(untpl(re.tpl_email_fuzzy),'i');re.link_fuzzy=RegExp(untpl(re.tpl_link_fuzzy),'i');re.link_no_ip_fuzzy=RegExp(untpl(re.tpl_link_no_ip_fuzzy),'i');re.host_fuzzy_test=RegExp(untpl(re.tpl_host_fuzzy_test),'i');var aliases=[];self.__compiled__={};function schemaError(name,val){throw new Error('(LinkifyIt) Invalid schema "'+name+'": '+val);} -Object.keys(self.__schemas__).forEach(function(name){var val=self.__schemas__[name];if(val===null){return;} -var compiled={validate:null,link:null};self.__compiled__[name]=compiled;if(isObject(val)){if(isRegExp(val.validate)){compiled.validate=createValidator(val.validate);}else if(isFunction(val.validate)){compiled.validate=val.validate;}else{schemaError(name,val);} -if(isFunction(val.normalize)){compiled.normalize=val.normalize;}else if(!val.normalize){compiled.normalize=createNormalizer();}else{schemaError(name,val);} -return;} -if(isString(val)){aliases.push(name);return;} -schemaError(name,val);});aliases.forEach(function(alias){if(!self.__compiled__[self.__schemas__[alias]]){return;} -self.__compiled__[alias].validate=self.__compiled__[self.__schemas__[alias]].validate;self.__compiled__[alias].normalize=self.__compiled__[self.__schemas__[alias]].normalize;});self.__compiled__['']={validate:null,normalize:createNormalizer()};var slist=Object.keys(self.__compiled__).filter(function(name){return name.length>0&&self.__compiled__[name];}).map(escapeRE).join('|');self.re.schema_test=RegExp('(^|(?!_)(?:[><\uff5c]|'+re.src_ZPCc+'))('+slist+')','i');self.re.schema_search=RegExp('(^|(?!_)(?:[><\uff5c]|'+re.src_ZPCc+'))('+slist+')','ig');self.re.pretest=RegExp('('+self.re.schema_test.source+')|'+'('+self.re.host_fuzzy_test.source+')|'+'@','i');resetScanCache(self);} -function Match(self,shift){var start=self.__index__,end=self.__last_index__,text=self.__text_cache__.slice(start,end);this.schema=self.__schema__.toLowerCase();this.index=start+shift;this.lastIndex=end+shift;this.raw=text;this.text=text;this.url=text;} -function createMatch(self,shift){var match=new Match(self,shift);self.__compiled__[match.schema].normalize(match,self);return match;} -function LinkifyIt(schemas,options){if(!(this instanceof LinkifyIt)){return new LinkifyIt(schemas,options);} -if(!options){if(isOptionsObj(schemas)){options=schemas;schemas={};}} -this.__opts__=assign({},defaultOptions,options);this.__index__=-1;this.__last_index__=-1;this.__schema__='';this.__text_cache__='';this.__schemas__=assign({},defaultSchemas,schemas);this.__compiled__={};this.__tlds__=tlds_default;this.__tlds_replaced__=false;this.re={};compile(this);} -LinkifyIt.prototype.add=function add(schema,definition){this.__schemas__[schema]=definition;compile(this);return this;};LinkifyIt.prototype.set=function set(options){this.__opts__=assign(this.__opts__,options);return this;};LinkifyIt.prototype.test=function test(text){this.__text_cache__=text;this.__index__=-1;if(!text.length){return false;} -var m,ml,me,len,shift,next,re,tld_pos,at_pos;if(this.re.schema_test.test(text)){re=this.re.schema_search;re.lastIndex=0;while((m=re.exec(text))!==null){len=this.testSchemaAt(text,m[2],re.lastIndex);if(len){this.__schema__=m[2];this.__index__=m.index+m[1].length;this.__last_index__=m.index+m[0].length+len;break;}}} -if(this.__opts__.fuzzyLink&&this.__compiled__['http:']){tld_pos=text.search(this.re.host_fuzzy_test);if(tld_pos>=0){if(this.__index__<0||tld_pos=0){if((me=text.match(this.re.email_fuzzy))!==null){shift=me.index+me[1].length;next=me.index+me[0].length;if(this.__index__<0||shiftthis.__last_index__)){this.__schema__='mailto:';this.__index__=shift;this.__last_index__=next;}}}} -return this.__index__>=0;};LinkifyIt.prototype.pretest=function pretest(text){return this.re.pretest.test(text);};LinkifyIt.prototype.testSchemaAt=function testSchemaAt(text,schema,pos){if(!this.__compiled__[schema.toLowerCase()]){return 0;} -return this.__compiled__[schema.toLowerCase()].validate(text,pos,this);};LinkifyIt.prototype.match=function match(text){var shift=0,result=[];if(this.__index__>=0&&this.__text_cache__===text){result.push(createMatch(this,shift));shift=this.__last_index__;} -var tail=shift?text.slice(shift):text;while(this.test(tail)){result.push(createMatch(this,shift));tail=tail.slice(this.__last_index__);shift+=this.__last_index__;} -if(result.length){return result;} -return null;};LinkifyIt.prototype.tlds=function tlds(list,keepOld){list=Array.isArray(list)?list:[list];if(!keepOld){this.__tlds__=list.slice();this.__tlds_replaced__=true;compile(this);return this;} -this.__tlds__=this.__tlds__.concat(list).sort().filter(function(el,idx,arr){return el!==arr[idx-1];}).reverse();compile(this);return this;};LinkifyIt.prototype.normalize=function normalize(match){if(!match.schema){match.url='http://'+match.url;} -if(match.schema==='mailto:'&&!/^mailto:/i.test(match.url)){match.url='mailto:'+match.url;}};LinkifyIt.prototype.onCompile=function onCompile(){};module.exports=LinkifyIt;},{"./lib/re":54}],54:[function(require,module,exports){'use strict';module.exports=function(opts){var re={};re.src_Any=require('uc.micro/properties/Any/regex').source;re.src_Cc=require('uc.micro/categories/Cc/regex').source;re.src_Z=require('uc.micro/categories/Z/regex').source;re.src_P=require('uc.micro/categories/P/regex').source;re.src_ZPCc=[re.src_Z,re.src_P,re.src_Cc].join('|');re.src_ZCc=[re.src_Z,re.src_Cc].join('|');var text_separators='[><\uff5c]';re.src_pseudo_letter='(?:(?!'+text_separators+'|'+re.src_ZPCc+')'+re.src_Any+')';re.src_ip4='(?:(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)';re.src_auth='(?:(?:(?!'+re.src_ZCc+'|[@/\\[\\]()]).)+@)?';re.src_port='(?::(?:6(?:[0-4]\\d{3}|5(?:[0-4]\\d{2}|5(?:[0-2]\\d|3[0-5])))|[1-5]?\\d{1,4}))?';re.src_host_terminator='(?=$|'+text_separators+'|'+re.src_ZPCc+')(?!-|_|:\\d|\\.-|\\.(?!$|'+re.src_ZPCc+'))';re.src_path='(?:'+'[/?#]'+'(?:'+'(?!'+re.src_ZCc+'|'+text_separators+'|[()[\\]{}.,"\'?!\\-]).|'+'\\[(?:(?!'+re.src_ZCc+'|\\]).)*\\]|'+'\\((?:(?!'+re.src_ZCc+'|[)]).)*\\)|'+'\\{(?:(?!'+re.src_ZCc+'|[}]).)*\\}|'+'\\"(?:(?!'+re.src_ZCc+'|["]).)+\\"|'+"\\'(?:(?!"+re.src_ZCc+"|[']).)+\\'|"+"\\'(?="+re.src_pseudo_letter+'|[-]).|'+'\\.{2,3}[a-zA-Z0-9%/]|'+'\\.(?!'+re.src_ZCc+'|[.]).|'+ -(opts&&opts['---']?'\\-(?!--(?:[^-]|$))(?:-*)|':'\\-+|')+'\\,(?!'+re.src_ZCc+').|'+'\\!(?!'+re.src_ZCc+'|[!]).|'+'\\?(?!'+re.src_ZCc+'|[?]).'+')+'+'|\\/'+')?';re.src_email_name='[\\-;:&=\\+\\$,\\"\\.a-zA-Z0-9_]+';re.src_xn='xn--[a-z0-9\\-]{1,59}';re.src_domain_root='(?:'+ -re.src_xn+'|'+ -re.src_pseudo_letter+'{1,63}'+')';re.src_domain='(?:'+ -re.src_xn+'|'+'(?:'+re.src_pseudo_letter+')'+'|'+'(?:'+re.src_pseudo_letter+'(?:-(?!-)|'+re.src_pseudo_letter+'){0,61}'+re.src_pseudo_letter+')'+')';re.src_host='(?:'+'(?:(?:(?:'+re.src_domain+')\\.)*'+re.src_domain+')'+')';re.tpl_host_fuzzy='(?:'+ -re.src_ip4+'|'+'(?:(?:(?:'+re.src_domain+')\\.)+(?:%TLDS%))'+')';re.tpl_host_no_ip_fuzzy='(?:(?:(?:'+re.src_domain+')\\.)+(?:%TLDS%))';re.src_host_strict=re.src_host+re.src_host_terminator;re.tpl_host_fuzzy_strict=re.tpl_host_fuzzy+re.src_host_terminator;re.src_host_port_strict=re.src_host+re.src_port+re.src_host_terminator;re.tpl_host_port_fuzzy_strict=re.tpl_host_fuzzy+re.src_port+re.src_host_terminator;re.tpl_host_port_no_ip_fuzzy_strict=re.tpl_host_no_ip_fuzzy+re.src_port+re.src_host_terminator;re.tpl_host_fuzzy_test='localhost|www\\.|\\.\\d{1,3}\\.|(?:\\.(?:%TLDS%)(?:'+re.src_ZPCc+'|>|$))';re.tpl_email_fuzzy='(^|'+text_separators+'|\\(|'+re.src_ZCc+')('+re.src_email_name+'@'+re.tpl_host_fuzzy_strict+')';re.tpl_link_fuzzy='(^|(?![.:/\\-_@])(?:[$+<=>^`|\uff5c]|'+re.src_ZPCc+'))'+'((?![$+<=>^`|\uff5c])'+re.tpl_host_port_fuzzy_strict+re.src_path+')';re.tpl_link_no_ip_fuzzy='(^|(?![.:/\\-_@])(?:[$+<=>^`|\uff5c]|'+re.src_ZPCc+'))'+'((?![$+<=>^`|\uff5c])'+re.tpl_host_port_no_ip_fuzzy_strict+re.src_path+')';return re;};},{"uc.micro/categories/Cc/regex":61,"uc.micro/categories/P/regex":63,"uc.micro/categories/Z/regex":64,"uc.micro/properties/Any/regex":66}],55:[function(require,module,exports){'use strict';var decodeCache={};function getDecodeCache(exclude){var i,ch,cache=decodeCache[exclude];if(cache){return cache;} -cache=decodeCache[exclude]=[];for(i=0;i<128;i++){ch=String.fromCharCode(i);cache.push(ch);} -for(i=0;i=0xD800&&chr<=0xDFFF)){result+='\ufffd\ufffd\ufffd';}else{result+=String.fromCharCode(chr);} -i+=6;continue;}} -if((b1&0xF8)===0xF0&&(i+90x10FFFF){result+='\ufffd\ufffd\ufffd\ufffd';}else{chr-=0x10000;result+=String.fromCharCode(0xD800+(chr>>10),0xDC00+(chr&0x3FF));} -i+=9;continue;}} -result+='\ufffd';} -return result;});} -decode.defaultChars=';/?:@&=+$,#';decode.componentChars='';module.exports=decode;},{}],56:[function(require,module,exports){'use strict';var encodeCache={};function getEncodeCache(exclude){var i,ch,cache=encodeCache[exclude];if(cache){return cache;} -cache=encodeCache[exclude]=[];for(i=0;i<128;i++){ch=String.fromCharCode(i);if(/^[0-9a-z]$/i.test(ch)){cache.push(ch);}else{cache.push('%'+('0'+i.toString(16).toUpperCase()).slice(-2));}} -for(i=0;i=0xD800&&code<=0xDFFF){if(code>=0xD800&&code<=0xDBFF&&i+1=0xDC00&&nextCode<=0xDFFF){result+=encodeURIComponent(string[i]+string[i+1]);i++;continue;}} -result+='%EF%BF%BD';continue;} -result+=encodeURIComponent(string[i]);} -return result;} -encode.defaultChars=";/?:@&=+$,-_.!~*'()#";encode.componentChars="-_.!~*'()";module.exports=encode;},{}],57:[function(require,module,exports){'use strict';module.exports=function format(url){var result='';result+=url.protocol||'';result+=url.slashes?'//':'';result+=url.auth?url.auth+'@':'';if(url.hostname&&url.hostname.indexOf(':')!==-1){result+='['+url.hostname+']';}else{result+=url.hostname||'';} -result+=url.port?':'+url.port:'';result+=url.pathname||'';result+=url.search||'';result+=url.hash||'';return result;};},{}],58:[function(require,module,exports){'use strict';module.exports.encode=require('./encode');module.exports.decode=require('./decode');module.exports.format=require('./format');module.exports.parse=require('./parse');},{"./decode":55,"./encode":56,"./format":57,"./parse":59}],59:[function(require,module,exports){'use strict';function Url(){this.protocol=null;this.slashes=null;this.auth=null;this.port=null;this.hostname=null;this.hash=null;this.search=null;this.pathname=null;} -var protocolPattern=/^([a-z0-9.+-]+:)/i,portPattern=/:[0-9]*$/,simplePathPattern=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,delims=['<','>','"','`',' ','\r','\n','\t'],unwise=['{','}','|','\\','^','`'].concat(delims),autoEscape=['\''].concat(unwise),nonHostChars=['%','/','?',';','#'].concat(autoEscape),hostEndingChars=['/','?','#'],hostnameMaxLen=255,hostnamePartPattern=/^[+a-z0-9A-Z_-]{0,63}$/,hostnamePartStart=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,hostlessProtocol={'javascript':true,'javascript:':true},slashedProtocol={'http':true,'https':true,'ftp':true,'gopher':true,'file':true,'http:':true,'https:':true,'ftp:':true,'gopher:':true,'file:':true};function urlParse(url,slashesDenoteHost){if(url&&url instanceof Url){return url;} -var u=new Url();u.parse(url,slashesDenoteHost);return u;} -Url.prototype.parse=function(url,slashesDenoteHost){var i,l,lowerProto,hec,slashes,rest=url;rest=rest.trim();if(!slashesDenoteHost&&url.split('#').length===1){var simplePath=simplePathPattern.exec(rest);if(simplePath){this.pathname=simplePath[1];if(simplePath[2]){this.search=simplePath[2];} -return this;}} -var proto=protocolPattern.exec(rest);if(proto){proto=proto[0];lowerProto=proto.toLowerCase();this.protocol=proto;rest=rest.substr(proto.length);} -if(slashesDenoteHost||proto||rest.match(/^\/\/[^@\/]+@[^@\/]+/)){slashes=rest.substr(0,2)==='//';if(slashes&&!(proto&&hostlessProtocol[proto])){rest=rest.substr(2);this.slashes=true;}} -if(!hostlessProtocol[proto]&&(slashes||(proto&&!slashedProtocol[proto]))){var hostEnd=-1;for(i=0;i127){newpart+='x';}else{newpart+=part[j];}} -if(!newpart.match(hostnamePartPattern)){var validParts=hostparts.slice(0,i);var notHost=hostparts.slice(i+1);var bit=part.match(hostnamePartStart);if(bit){validParts.push(bit[1]);notHost.unshift(bit[2]);} -if(notHost.length){rest=notHost.join('.')+rest;} -this.hostname=validParts.join('.');break;}}}} -if(this.hostname.length>hostnameMaxLen){this.hostname='';} -if(ipv6Hostname){this.hostname=this.hostname.substr(1,this.hostname.length-2);}} -var hash=rest.indexOf('#');if(hash!==-1){this.hash=rest.substr(hash);rest=rest.slice(0,hash);} -var qm=rest.indexOf('?');if(qm!==-1){this.search=rest.substr(qm);rest=rest.slice(0,qm);} -if(rest){this.pathname=rest;} -if(slashedProtocol[lowerProto]&&this.hostname&&!this.pathname){this.pathname='';} -return this;};Url.prototype.parseHost=function(host){var port=portPattern.exec(host);if(port){port=port[0];if(port!==':'){this.port=port.substr(1);} -host=host.substr(0,host.length-port.length);} -if(host){this.hostname=host;}};module.exports=urlParse;},{}],60:[function(require,module,exports){(function(global){;(function(root){var freeExports=typeof exports=='object'&&exports&&!exports.nodeType&&exports;var freeModule=typeof module=='object'&&module&&!module.nodeType&&module;var freeGlobal=typeof global=='object'&&global;if(freeGlobal.global===freeGlobal||freeGlobal.window===freeGlobal||freeGlobal.self===freeGlobal){root=freeGlobal;} -var punycode,maxInt=2147483647,base=36,tMin=1,tMax=26,skew=38,damp=700,initialBias=72,initialN=128,delimiter='-',regexPunycode=/^xn--/,regexNonASCII=/[^\x20-\x7E]/,regexSeparators=/[\x2E\u3002\uFF0E\uFF61]/g,errors={'overflow':'Overflow: input needs wider integers to process','not-basic':'Illegal input >= 0x80 (not a basic code point)','invalid-input':'Invalid input'},baseMinusTMin=base-tMin,floor=Math.floor,stringFromCharCode=String.fromCharCode,key;function error(type){throw new RangeError(errors[type]);} -function map(array,fn){var length=array.length;var result=[];while(length--){result[length]=fn(array[length]);} -return result;} -function mapDomain(string,fn){var parts=string.split('@');var result='';if(parts.length>1){result=parts[0]+'@';string=parts[1];} -string=string.replace(regexSeparators,'\x2E');var labels=string.split('.');var encoded=map(labels,fn).join('.');return result+encoded;} -function ucs2decode(string){var output=[],counter=0,length=string.length,value,extra;while(counter=0xD800&&value<=0xDBFF&&counter0xFFFF){value-=0x10000;output+=stringFromCharCode(value>>>10&0x3FF|0xD800);value=0xDC00|value&0x3FF;} -output+=stringFromCharCode(value);return output;}).join('');} -function basicToDigit(codePoint){if(codePoint-48<10){return codePoint-22;} -if(codePoint-65<26){return codePoint-65;} -if(codePoint-97<26){return codePoint-97;} -return base;} -function digitToBasic(digit,flag){return digit+22+75*(digit<26)-((flag!=0)<<5);} -function adapt(delta,numPoints,firstTime){var k=0;delta=firstTime?floor(delta/damp):delta>>1;delta+=floor(delta/numPoints);for(;delta>baseMinusTMin*tMax>>1;k+=base){delta=floor(delta/baseMinusTMin);} -return floor(k+(baseMinusTMin+1)*delta/(delta+skew));} -function decode(input){var output=[],inputLength=input.length,out,i=0,n=initialN,bias=initialBias,basic,j,index,oldi,w,k,digit,t,baseMinusT;basic=input.lastIndexOf(delimiter);if(basic<0){basic=0;} -for(j=0;j=0x80){error('not-basic');} -output.push(input.charCodeAt(j));} -for(index=basic>0?basic+1:0;index=inputLength){error('invalid-input');} -digit=basicToDigit(input.charCodeAt(index++));if(digit>=base||digit>floor((maxInt-i)/w)){error('overflow');} -i+=digit*w;t=k<=bias?tMin:(k>=bias+tMax?tMax:k-bias);if(digitfloor(maxInt/baseMinusT)){error('overflow');} -w*=baseMinusT;} -out=output.length+1;bias=adapt(i-oldi,out,oldi==0);if(floor(i/out)>maxInt-n){error('overflow');} -n+=floor(i/out);i%=out;output.splice(i++,0,n);} -return ucs2encode(output);} -function encode(input){var n,delta,handledCPCount,basicLength,bias,j,m,q,k,t,currentValue,output=[],inputLength,handledCPCountPlusOne,baseMinusT,qMinusT;input=ucs2decode(input);inputLength=input.length;n=initialN;delta=0;bias=initialBias;for(j=0;j=n&¤tValuefloor((maxInt-delta)/handledCPCountPlusOne)){error('overflow');} -delta+=(m-n)*handledCPCountPlusOne;n=m;for(j=0;jmaxInt){error('overflow');} -if(currentValue==n){for(q=delta,k=base;;k+=base){t=k<=bias?tMin:(k>=bias+tMax?tMax:k-bias);if(q1&&void 0!==arguments[1]?arguments[1]:null;return document.execCommand(t,!1,e)},l={bold:{icon:"B",title:"Bold",state:function(){return o("bold")},result:function(){return c("bold")}},italic:{icon:"I",title:"Italic",state:function(){return o("italic")},result:function(){return c("italic")}},underline:{icon:"U",title:"Underline",state:function(){return o("underline")},result:function(){return c("underline")}},strikethrough:{icon:"S",title:"Strike-through",state:function(){return o("strikeThrough")},result:function(){return c("strikeThrough")}},heading1:{icon:"H1",title:"Heading 1",result:function(){return c("formatBlock","

")}},heading2:{icon:"H2",title:"Heading 2",result:function(){return c("formatBlock","

")}},paragraph:{icon:"¶",title:"Paragraph",result:function(){return c("formatBlock","

")}},quote:{icon:"“ ”",title:"Quote",result:function(){return c("formatBlock","

")}},olist:{icon:"#",title:"Ordered List",result:function(){return c("insertOrderedList")}},ulist:{icon:"•",title:"Unordered List",result:function(){return c("insertUnorderedList")}},code:{icon:"</>",title:"Code",result:function(){return c("formatBlock","
")}},line:{icon:"―",title:"Horizontal Line",result:function(){return c("insertHorizontalRule")}},link:{icon:"🔗",title:"Link",result:function(){var t=window.prompt("Enter the link URL");t&&c("createLink",t)}},image:{icon:"📷",title:"Image",result:function(){var t=window.prompt("Enter the image URL");t&&c("insertImage",t)}}},a={actionbar:"pell-actionbar",button:"pell-button",content:"pell-content",selected:"pell-button-selected"},s=function(t){var o=t.actions?t.actions.map(function(t){return"string"==typeof t?l[t]:l[t.name]?e({},l[t.name],t):t}):Object.keys(l).map(function(t){return l[t]}),s=e({},a,t.classes),f=t.defaultParagraphSeparator||"div",d=i("div");d.className=s.actionbar,r(t.element,d);var m=t.element.content=i("div");return m.contentEditable=!0,m.className=s.content,m.oninput=function(e){var n=e.target.firstChild;n&&3===n.nodeType?c("formatBlock","<"+f+">"):"
"===m.innerHTML&&(m.innerHTML=""),t.onChange(m.innerHTML)},m.onkeydown=function(t){"Tab"===t.key?t.preventDefault():"Enter"===t.key&&"blockquote"===u("formatBlock")&&setTimeout(function(){return c("formatBlock","<"+f+">")},0)},r(t.element,m),o.forEach(function(t){var e=i("button");if(e.className=s.button,e.innerHTML=t.icon,e.title=t.title,e.setAttribute("type","button"),e.onclick=function(){return t.result()&&m.focus()},t.state){var o=function(){return e.classList[t.state()?"add":"remove"](s.selected)};n(m,"keyup",o),n(m,"mouseup",o),n(e,"click",o)}r(d,e)}),t.styleWithCSS&&c("styleWithCSS"),c("defaultParagraphSeparator",f),t.element},f={exec:c,init:s};t.exec=c,t.init=s,t.default=f,Object.defineProperty(t,"__esModule",{value:!0})});var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(u){var c=/\blang(?:uage)?-([\w-]+)\b/i,n=0,M={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof W?new W(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/=l.reach);y+=m.value.length,m=m.next){var k=m.value;if(r.length>n.length)return;if(!(k instanceof W)){var b,x=1;if(h){if(!(b=z(p,y,n,f)))break;var w=b.index,A=b.index+b[0].length,P=y;for(P+=m.value.length;P<=w;)m=m.next,P+=m.value.length;if(P-=m.value.length,y=P,m.value instanceof W)continue;for(var S=m;S!==r.tail&&(Pl.reach&&(l.reach=N);var j=m.prev;O&&(j=I(r,j,O),y+=O.length),q(r,j,x);var C=new W(o,g?M.tokenize(E,g):E,d,E);if(m=I(r,j,C),L&&I(r,m,L),1l.reach&&(l.reach=_.reach)}}}}}}(e,a,n,a.head,0),function(e){var n=[],r=e.head.next;for(;r!==e.tail;)n.push(r.value),r=r.next;return n}(a)},hooks:{all:{},add:function(e,n){var r=M.hooks.all;r[e]=r[e]||[],r[e].push(n)},run:function(e,n){var r=M.hooks.all[e];if(r&&r.length)for(var t,a=0;t=r[a++];)t(n)}},Token:W};function W(e,n,r,t){this.type=e,this.content=n,this.alias=r,this.length=0|(t||"").length}function z(e,n,r,t){e.lastIndex=n;var a=e.exec(r);if(a&&t&&a[1]){var i=a[1].length;a.index+=i,a[0]=a[0].slice(i)}return a}function i(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function I(e,n,r){var t=n.next,a={value:r,prev:n,next:t};return n.next=a,t.prev=a,e.length++,a}function q(e,n,r){for(var t=n.next,a=0;a"+a.content+""},!u.document)return u.addEventListener&&(M.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),r=n.language,t=n.code,a=n.immediateClose;u.postMessage(M.highlight(t,M.languages[r],r)),a&&u.close()},!1)),M;var e=M.util.currentScript();function r(){M.manual||M.highlightAll()}if(e&&(M.filename=e.src,e.hasAttribute("data-manual")&&(M.manual=!0)),!M.manual){var t=document.readyState;"loading"===t||"interactive"===t&&e&&e.defer?document.addEventListener("DOMContentLoaded",r):window.requestAnimationFrame?window.requestAnimationFrame(r):window.setTimeout(r,16)}return M}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism);Prism.languages.markup={comment://,prolog:/<\?[\s\S]+?\?>/,doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/,name:/[^\s<>'"]+/}},cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^$/i;var n={"included-cdata":{pattern://i,inside:s}};n["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var t={};t[a]={pattern:RegExp("(<__[^>]*>)(?:))*\\]\\]>|(?!)".replace(/__/g,function(){return a}),"i"),lookbehind:!0,greedy:!0,inside:n},Prism.languages.insertBefore("markup","cdata",t)}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml;!function(s){var e=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:RegExp("[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+e.source+")*(?=\\s*\\{)"),string:{pattern:e,greedy:!0},property:/(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,important:/!important\b/i,function:/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var t=s.languages.markup;t&&(t.tag.addInlined("style","css"),s.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/(^|["'\s])style\s*=\s*(?:"[^"]*"|'[^']*')/i,lookbehind:!0,inside:{"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{style:{pattern:/(["'])[\s\S]+(?=["']$)/,lookbehind:!0,alias:"language-css",inside:s.languages.css},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},"attr-name":/^style/i}}},t.tag))}(Prism);Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|interface|extends|implements|trait|instanceof|new)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,boolean:/\b(?:true|false)\b/,function:/\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/};Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:/\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyus]{0,6}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-flags":/[a-z]+$/,"regex-delimiter":/^\/|\/$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\${)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.js=Prism.languages.javascript;!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},a={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--?|-=|\+\+?|\+=|!=?|~|\*\*?|\*=|\/=?|%=?|<<=?|>>=?|<=?|>=?|==?|&&?|&=|\^=?|\|\|?|\|=|\?|:/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|x[0-9a-fA-F]{1,2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)\w+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b\w+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+?)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:a},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)(["'])(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|(?!\2)[^\\`$])*\2/,lookbehind:!0,greedy:!0,inside:a}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:a.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|aptitude|apt-cache|apt-get|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:if|then|else|elif|fi|for|while|in|case|esac|function|select|do|done|until)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|break|cd|continue|eval|exec|exit|export|getopts|hash|pwd|readonly|return|shift|test|times|trap|umask|unset|alias|bind|builtin|caller|command|declare|echo|enable|help|let|local|logout|mapfile|printf|read|readarray|source|type|typeset|ulimit|unalias|set|shopt)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:true|false)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|==?|!=?|=~|<<[<-]?|[&\d]?>>|\d?[<>]&?|&[>&]?|\|[&|]?|<=?|>=?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var s=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],i=a.variable[1].inside,o=0;o>/g,function(e,n){return"(?:"+s[+n]+")"})}function t(e,n,s){return RegExp(a(e,n),s||"")}function e(e,n){for(var s=0;s>/g,function(){return"(?:"+e+")"});return e.replace(/<>/g,"[^\\s\\S]")}var n="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",i="class enum interface struct",r="add alias and ascending async await by descending from get global group into join let nameof not notnull on or orderby partial remove select set unmanaged value when where",o="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var d=l(i),p=RegExp(l(n+" "+i+" "+r+" "+o)),c=l(i+" "+r+" "+o),u=l(n+" "+i+" "+o),g=e("<(?:[^<>;=+\\-*/%&|^]|<>)*>",2),b=e("\\((?:[^()]|<>)*\\)",2),h="@?\\b[A-Za-z_]\\w*\\b",f=a("<<0>>(?:\\s*<<1>>)?",[h,g]),m=a("(?!<<0>>)<<1>>(?:\\s*\\.\\s*<<1>>)*",[c,f]),k="\\[\\s*(?:,\\s*)*\\]",y=a("<<0>>(?:\\s*(?:\\?\\s*)?<<1>>)*(?:\\s*\\?)?",[m,k]),w=a("(?:<<0>>|<<1>>)(?:\\s*(?:\\?\\s*)?<<2>>)*(?:\\s*\\?)?",[a("\\(<<0>>+(?:,<<0>>+)+\\)",[a("[^,()<>[\\];=+\\-*/%&|^]|<<0>>|<<1>>|<<2>>",[g,b,k])]),m,k]),v={keyword:p,punctuation:/[<>()?,.:[\]]/},x="'(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'",$='"(?:\\\\.|[^\\\\"\r\n])*"';s.languages.csharp=s.languages.extend("clike",{string:[{pattern:t("(^|[^$\\\\])<<0>>",['@"(?:""|\\\\[^]|[^\\\\"])*"(?!")']),lookbehind:!0,greedy:!0},{pattern:t("(^|[^@$\\\\])<<0>>",[$]),lookbehind:!0,greedy:!0},{pattern:RegExp(x),greedy:!0,alias:"character"}],"class-name":[{pattern:t("(\\busing\\s+static\\s+)<<0>>(?=\\s*;)",[m]),lookbehind:!0,inside:v},{pattern:t("(\\busing\\s+<<0>>\\s*=\\s*)<<1>>(?=\\s*;)",[h,w]),lookbehind:!0,inside:v},{pattern:t("(\\busing\\s+)<<0>>(?=\\s*=)",[h]),lookbehind:!0},{pattern:t("(\\b<<0>>\\s+)<<1>>",[d,f]),lookbehind:!0,inside:v},{pattern:t("(\\bcatch\\s*\\(\\s*)<<0>>",[m]),lookbehind:!0,inside:v},{pattern:t("(\\bwhere\\s+)<<0>>",[h]),lookbehind:!0},{pattern:t("(\\b(?:is(?:\\s+not)?|as)\\s+)<<0>>",[y]),lookbehind:!0,inside:v},{pattern:t("\\b<<0>>(?=\\s+(?!<<1>>)<<2>>(?:\\s*[=,;:{)\\]]|\\s+(?:in|when)\\b))",[w,u,h]),inside:v}],keyword:p,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:ul|lu|[dflmu])?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),s.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),s.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:t("([(,]\\s*)<<0>>(?=\\s*:)",[h]),lookbehind:!0,alias:"punctuation"}}),s.languages.insertBefore("csharp","class-name",{namespace:{pattern:t("(\\b(?:namespace|using)\\s+)<<0>>(?:\\s*\\.\\s*<<0>>)*(?=\\s*[;{])",[h]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:t("(\\b(?:default|typeof|sizeof)\\s*\\(\\s*(?!\\s))(?:[^()\\s]|\\s(?!\\s)|<<0>>)*(?=\\s*\\))",[b]),lookbehind:!0,alias:"class-name",inside:v},"return-type":{pattern:t("<<0>>(?=\\s+(?:<<1>>\\s*(?:=>|[({]|\\.\\s*this\\s*\\[)|this\\s*\\[))",[w,m]),inside:v,alias:"class-name"},"constructor-invocation":{pattern:t("(\\bnew\\s+)<<0>>(?=\\s*[[({])",[w]),lookbehind:!0,inside:v,alias:"class-name"},"generic-method":{pattern:t("<<0>>\\s*<<1>>(?=\\s*\\()",[h,g]),inside:{function:t("^<<0>>",[h]),generic:{pattern:RegExp(g),alias:"class-name",inside:v}}},"type-list":{pattern:t("\\b((?:<<0>>\\s+<<1>>|where\\s+<<2>>)\\s*:\\s*)(?:<<3>>|<<4>>)(?:\\s*,\\s*(?:<<3>>|<<4>>))*(?=\\s*(?:where|[{;]|=>|$))",[d,f,h,w,p.source]),lookbehind:!0,inside:{keyword:p,"class-name":{pattern:RegExp(w),greedy:!0,inside:v},punctuation:/,/}},preprocessor:{pattern:/(^\s*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(\s*#)\b(?:define|elif|else|endif|endregion|error|if|line|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var _=$+"|"+x,B=a("/(?![*/])|//[^\r\n]*[\r\n]|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>",[_]),E=e(a("[^\"'/()]|<<0>>|\\(<>*\\)",[B]),2),R="\\b(?:assembly|event|field|method|module|param|property|return|type)\\b",P=a("<<0>>(?:\\s*\\(<<1>>*\\))?",[m,E]);s.languages.insertBefore("csharp","class-name",{attribute:{pattern:t("((?:^|[^\\s\\w>)?])\\s*\\[\\s*)(?:<<0>>\\s*:\\s*)?<<1>>(?:\\s*,\\s*<<1>>)*(?=\\s*\\])",[R,P]),lookbehind:!0,greedy:!0,inside:{target:{pattern:t("^<<0>>(?=\\s*:)",[R]),alias:"keyword"},"attribute-arguments":{pattern:t("\\(<<0>>*\\)",[E]),inside:s.languages.csharp},"class-name":{pattern:RegExp(m),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var z=":[^}\r\n]+",S=e(a("[^\"'/()]|<<0>>|\\(<>*\\)",[B]),2),j=a("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[S,z]),A=e(a("[^\"'/()]|/(?!\\*)|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>|\\(<>*\\)",[_]),2),F=a("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[A,z]);function U(e,n){return{interpolation:{pattern:t("((?:^|[^{])(?:\\{\\{)*)<<0>>",[e]),lookbehind:!0,inside:{"format-string":{pattern:t("(^\\{(?:(?![}:])<<0>>)*)<<1>>(?=\\}$)",[n,z]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:s.languages.csharp}}},string:/[\s\S]+/}}s.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:t('(^|[^\\\\])(?:\\$@|@\\$)"(?:""|\\\\[^]|\\{\\{|<<0>>|[^\\\\{"])*"',[j]),lookbehind:!0,greedy:!0,inside:U(j,S)},{pattern:t('(^|[^@\\\\])\\$"(?:\\\\.|\\{\\{|<<0>>|[^\\\\"{])*"',[F]),lookbehind:!0,greedy:!0,inside:U(F,A)}]})}(Prism),Prism.languages.dotnet=Prism.languages.cs=Prism.languages.csharp;Prism.languages.dart=Prism.languages.extend("clike",{string:[{pattern:/r?("""|''')[\s\S]*?\1/,greedy:!0},{pattern:/r?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0}],keyword:[/\b(?:async|sync|yield)\*/,/\b(?:abstract|assert|async|await|break|case|catch|class|const|continue|covariant|default|deferred|do|dynamic|else|enum|export|extension|external|extends|factory|final|finally|for|Function|get|hide|if|implements|interface|import|in|library|mixin|new|null|on|operator|part|rethrow|return|set|show|static|super|switch|sync|this|throw|try|typedef|var|void|while|with|yield)\b/],operator:/\bis!|\b(?:as|is)\b|\+\+|--|&&|\|\||<<=?|>>=?|~(?:\/=?)?|[+\-*\/%&^|=!<>]=?|\?/}),Prism.languages.insertBefore("dart","function",{metadata:{pattern:/@\w+/,alias:"symbol"}});Prism.languages.go=Prism.languages.extend("clike",{string:{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|iota|nil|true|false)\b/,number:/(?:\b0x[a-f\d]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[-+]?\d+)?)i?/i,operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:bool|byte|complex(?:64|128)|error|float(?:32|64)|rune|string|u?int(?:8|16|32|64)?|uintptr|append|cap|close|complex|copy|delete|imag|len|make|new|panic|print(?:ln)?|real|recover)\b/}),delete Prism.languages.go["class-name"];Prism.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:Prism.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:true|false)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*)[a-zA-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,punctuation:/[!(){}\[\]:=,]/,constant:/\b(?!ID\b)[A-Z][A-Z_\d]*\b/};!function(t){t.languages.http={"request-line":{pattern:/^(?:GET|HEAD|POST|PUT|DELETE|CONNECT|OPTIONS|TRACE|PATCH|PRI|SEARCH)\s(?:https?:\/\/|\/)\S*\sHTTP\/[0-9.]+/m,inside:{method:{pattern:/^[A-Z]+\b/,alias:"property"},"request-target":{pattern:/^(\s)(?:https?:\/\/|\/)\S*(?=\s)/,lookbehind:!0,alias:"url",inside:t.languages.uri},"http-version":{pattern:/^(\s)HTTP\/[0-9.]+/,lookbehind:!0,alias:"property"}}},"response-status":{pattern:/^HTTP\/[0-9.]+ \d+ .+/m,inside:{"http-version":{pattern:/^HTTP\/[0-9.]+/,alias:"property"},"status-code":{pattern:/^(\s)\d+(?=\s)/,lookbehind:!0,alias:"number"},"reason-phrase":{pattern:/^(\s).+/,lookbehind:!0,alias:"string"}}},"header-name":{pattern:/^[\w-]+:(?=.)/m,alias:"keyword"}};var a,e,s,n=t.languages,i={"application/javascript":n.javascript,"application/json":n.json||n.javascript,"application/xml":n.xml,"text/xml":n.xml,"text/html":n.html,"text/css":n.css},r={"application/json":!0,"application/xml":!0};for(var p in i)if(i[p]){a=a||{};var o=r[p]?(void 0,s=(e=p).replace(/^[a-z]+\//,""),"(?:"+e+"|\\w+/(?:[\\w.-]+\\+)+"+s+"(?![+\\w.-]))"):p;a[p.replace(/\//g,"-")]={pattern:RegExp("(content-type:\\s*"+o+".*)(?:\\r?\\n|\\r){2}[\\s\\S]*","i"),lookbehind:!0,inside:i[p]}}a&&t.languages.insertBefore("http","header-name",a)}(Prism);!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n="(^|[^\\w.])(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*",a={pattern:RegExp(n+"[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b"),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{"class-name":[a,{pattern:RegExp(n+"[A-Z]\\w*(?=\\s+\\w+\\s*[;,=())])"),lookbehind:!0,inside:a.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(\:\:\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/,inside:{"class-name":a,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},namespace:{pattern:RegExp("(\\b(?:exports|import(?:\\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\\s+)(?!)[a-z]\\w*(?:\\.[a-z]\\w*)*\\.?".replace(//g,function(){return t.source})),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism);Prism.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:true|false)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},Prism.languages.webmanifest=Prism.languages.json;!function(e){e.languages.kotlin=e.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete e.languages.kotlin["class-name"],e.languages.insertBefore("kotlin","string",{"raw-string":{pattern:/("""|''')[\s\S]*?\1/,alias:"string"}}),e.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),e.languages.insertBefore("kotlin","function",{label:{pattern:/\w+@|@\w+/,alias:"symbol"}});var n=[{pattern:/\$\{[^}]+\}/,inside:{delimiter:{pattern:/^\$\{|\}$/,alias:"variable"},rest:e.languages.kotlin}},{pattern:/\$\w+/,alias:"variable"}];e.languages.kotlin.string.inside=e.languages.kotlin["raw-string"].inside={interpolation:n},e.languages.kt=e.languages.kotlin,e.languages.kts=e.languages.kotlin}(Prism);!function(h){function v(e,n){return"___"+e.toUpperCase()+n+"___"}Object.defineProperties(h.languages["markup-templating"]={},{buildPlaceholders:{value:function(a,r,e,o){if(a.language===r){var c=a.tokenStack=[];a.code=a.code.replace(e,function(e){if("function"==typeof o&&!o(e))return e;for(var n,t=c.length;-1!==a.code.indexOf(n=v(r,t));)++t;return c[t]=e,n}),a.grammar=h.languages.markup}}},tokenizePlaceholders:{value:function(p,k){if(p.language===k&&p.tokenStack){p.grammar=h.languages[k];var m=0,d=Object.keys(p.tokenStack);!function e(n){for(var t=0;t=d.length);t++){var a=n[t];if("string"==typeof a||a.content&&"string"==typeof a.content){var r=d[m],o=p.tokenStack[r],c="string"==typeof a?a:a.content,i=v(k,r),u=c.indexOf(i);if(-1|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,s=/[{}\[\](),:;]/;a.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:e,variable:/\$+(?:\w+\b|(?={))/i,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},keyword:[{pattern:/(\(\s*)\b(?:bool|boolean|int|integer|float|string|object|array)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:bool|int|float|string|object|array(?!\s*\()|mixed|self|static|callable|iterable|(?:null|false)(?=\s*\|))\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*[a-z0-9_|]\|\s*)(?:null|false)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:bool|int|float|string|object|void|array(?!\s*\()|mixed|self|static|callable|iterable|(?:null|false)(?=\s*\|))\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?[a-z0-9_|]\|\s*)(?:null|false)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:bool|int|float|string|object|void|array(?!\s*\()|mixed|iterable|(?:null|false)(?=\s*\|))\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:null|false)\b/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},/\b(?:__halt_compiler|abstract|and|array|as|break|callable|case|catch|class|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|eval|exit|extends|final|finally|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|namespace|match|new|or|parent|print|private|protected|public|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield)\b/i],"argument-name":/\b[a-z_]\w*(?=\s*:(?!:))/i,"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,function:/\w+\s*(?=\()/,property:{pattern:/(->)[\w]+/,lookbehind:!0},number:i,operator:n,punctuation:s};var l={pattern:/{\$(?:{(?:{[^{}]+}|[^{}]+)}|[^{}])+}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)*)/,lookbehind:!0,inside:a.languages.php},r=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:l}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:l}}];a.languages.insertBefore("php","variable",{string:r}),a.languages.insertBefore("php","variable",{attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=]$)/,lookbehind:!0,inside:{comment:e,string:r,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,number:i,operator:n,punctuation:s}},delimiter:{pattern:/^#\[|]$/,alias:"punctuation"}}}}),a.hooks.add("before-tokenize",function(e){if(/<\?/.test(e.code)){a.languages["markup-templating"].buildPlaceholders(e,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/gi)}}),a.hooks.add("after-tokenize",function(e){a.languages["markup-templating"].tokenizePlaceholders(e,"php")})}(Prism);!function(e){var i=Prism.languages.powershell={comment:[{pattern:/(^|[^`])<#[\s\S]*?#>/,lookbehind:!0},{pattern:/(^|[^`])#.*/,lookbehind:!0}],string:[{pattern:/"(?:`[\s\S]|[^`"])*"/,greedy:!0,inside:{function:{pattern:/(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,lookbehind:!0,inside:{}}}},{pattern:/'(?:[^']|'')*'/,greedy:!0}],namespace:/\[[a-z](?:\[(?:\[[^\]]*]|[^\[\]])*]|[^\[\]])*]/i,boolean:/\$(?:true|false)\b/i,variable:/\$\w+\b/,function:[/\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,/\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i],keyword:/\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,operator:{pattern:/(\W?)(?:!|-(?:eq|ne|gt|ge|lt|le|sh[lr]|not|b?(?:and|x?or)|(?:Not)?(?:Like|Match|Contains|In)|Replace|Join|is(?:Not)?|as)\b|-[-=]?|\+[+=]?|[*\/%]=?)/i,lookbehind:!0},punctuation:/[|{}[\];(),.]/},r=i.string[0].inside;r.boolean=i.boolean,r.variable=i.variable,r.function.inside=i}();Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},"string-interpolation":{pattern:/(?:f|rf|fr)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:{{)*){(?!{)(?:[^{}]|{(?!{)(?:[^{}]|{(?!{)(?:[^{}])+})+})+}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|rb|br)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|rb|br)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^\s*)@\w+(?:\.\w+)*/im,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:and|as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:True|False|None)\b/,number:/(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python;!function(e){e.languages.ruby=e.languages.extend("clike",{comment:[/#.*/,{pattern:/^=begin\s[\s\S]*?^=end/m,greedy:!0}],"class-name":{pattern:/(\b(?:class)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|protected|private|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/});var n={pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"tag"},rest:e.languages.ruby}};delete e.languages.ruby.function,e.languages.insertBefore("ruby","keyword",{regex:[{pattern:RegExp("%r(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\1)[^\\\\]|\\\\[^])*\\1[gim]{0,3}","\\((?:[^()\\\\]|\\\\[^])*\\)[gim]{0,3}","\\{(?:[^#{}\\\\]|#(?:\\{[^}]+\\})?|\\\\[^])*\\}[gim]{0,3}","\\[(?:[^\\[\\]\\\\]|\\\\[^])*\\][gim]{0,3}","<(?:[^<>\\\\]|\\\\[^])*>[gim]{0,3}"].join("|")+")"),greedy:!0,inside:{interpolation:n}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[gim]{0,3}(?=\s*(?:$|[\r\n,.;})]))/,lookbehind:!0,greedy:!0}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:{pattern:/(^|[^:]):[a-zA-Z_]\w*(?:[?!]|\b)/,lookbehind:!0},"method-definition":{pattern:/(\bdef\s+)[\w.]+/,lookbehind:!0,inside:{function:/\w+$/,rest:e.languages.ruby}}}),e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|Fixnum|Float|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/,constant:/\b[A-Z]\w*(?:[?!]|\b)/}),e.languages.ruby.string=[{pattern:RegExp("%[qQiIwWxs]?(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\1)[^\\\\]|\\\\[^])*\\1","\\((?:[^()\\\\]|\\\\[^])*\\)","\\{(?:[^#{}\\\\]|#(?:\\{[^}]+\\})?|\\\\[^])*\\}","\\[(?:[^\\[\\]\\\\]|\\\\[^])*\\]","<(?:[^<>\\\\]|\\\\[^])*>"].join("|")+")"),greedy:!0,inside:{interpolation:n}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:n}}],e.languages.rb=e.languages.ruby}(Prism);Prism.languages.swift=Prism.languages.extend("clike",{string:{pattern:/("|')(?:\\(?:\((?:[^()]|\([^)]+\))+\)|\r\n|[^(])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{interpolation:{pattern:/\\\((?:[^()]|\([^)]+\))+\)/,inside:{delimiter:{pattern:/^\\\(|\)$/,alias:"variable"}}}}},keyword:/\b(?:as|associativity|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic(?:Type)?|else|enum|extension|fallthrough|final|for|func|get|guard|if|import|in|infix|init|inout|internal|is|lazy|left|let|mutating|new|none|nonmutating|operator|optional|override|postfix|precedence|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|Self|set|static|struct|subscript|super|switch|throws?|try|Type|typealias|unowned|unsafe|var|weak|where|while|willSet|__(?:COLUMN__|FILE__|FUNCTION__|LINE__))\b/,number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,constant:/\b(?:nil|[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,atrule:/@\b(?:IB(?:Outlet|Designable|Action|Inspectable)|class_protocol|exported|noreturn|NS(?:Copying|Managed)|objc|UIApplicationMain|auto_closure)\b/,builtin:/\b(?:[A-Z]\S+|abs|advance|alignof(?:Value)?|assert|contains|count(?:Elements)?|debugPrint(?:ln)?|distance|drop(?:First|Last)|dump|enumerate|equal|filter|find|first|getVaList|indices|isEmpty|join|last|lexicographicalCompare|map|max(?:Element)?|min(?:Element)?|numericCast|overlaps|partition|print(?:ln)?|reduce|reflect|reverse|sizeof(?:Value)?|sort(?:ed)?|split|startsWith|stride(?:of(?:Value)?)?|suffix|swap|toDebugString|toString|transcode|underestimateCount|unsafeBitCast|with(?:ExtendedLifetime|Unsafe(?:MutablePointers?|Pointers?)|VaList))\b/}),Prism.languages.swift.string.inside.interpolation.inside.rest=Prism.languages.swift;!function(e){e.languages.typescript=e.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},keyword:/\b(?:abstract|as|asserts|async|await|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|is|keyof|let|module|namespace|new|null|of|package|private|protected|public|readonly|return|require|set|static|super|switch|this|throw|try|type|typeof|undefined|var|void|while|with|yield)\b/,builtin:/\b(?:string|Function|any|number|boolean|Array|symbol|console|Promise|unknown|never)\b/}),delete e.languages.typescript.parameter;var n=e.languages.extend("typescript",{});delete n["class-name"],e.languages.typescript["class-name"].inside=n,e.languages.insertBefore("typescript","function",{"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:n}}}}),e.languages.ts=e.languages.typescript}(Prism);!function(e){var n=/[*&][^\s[\]{},]+/,r=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,t="(?:"+r.source+"(?:[ \t]+"+n.source+")?|"+n.source+"(?:[ \t]+"+r.source+")?)",a="(?:[^\\s\\x00-\\x08\\x0e-\\x1f!\"#%&'*,\\-:>?@[\\]`{|}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*".replace(//g,function(){return"[^\\s\\x00-\\x08\\x0e-\\x1f,[\\]{}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]"}),d="\"(?:[^\"\\\\\r\n]|\\\\.)*\"|'(?:[^'\\\\\r\n]|\\\\.)*'";function o(e,n){n=(n||"").replace(/m/g,"")+"m";var r="([:\\-,[{]\\s*(?:\\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|]|}|(?:[\r\n]\\s*)?#))".replace(/<>/g,function(){return t}).replace(/<>/g,function(){return e});return RegExp(r,n)}e.languages.yaml={scalar:{pattern:RegExp("([\\-:]\\s*(?:\\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\\S[^\r\n]*(?:\\2[^\r\n]+)*)".replace(/<>/g,function(){return t})),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp("((?:^|[:\\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\\s*:\\s)".replace(/<>/g,function(){return t}).replace(/<>/g,function(){return"(?:"+a+"|"+d+")"})),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:o("\\d{4}-\\d\\d?-\\d\\d?(?:[tT]|[ \t]+)\\d\\d?:\\d{2}:\\d{2}(?:\\.\\d*)?(?:[ \t]*(?:Z|[-+]\\d\\d?(?::\\d{2})?))?|\\d{4}-\\d{2}-\\d{2}|\\d\\d?:\\d{2}(?::\\d{2}(?:\\.\\d*)?)?"),lookbehind:!0,alias:"number"},boolean:{pattern:o("true|false","i"),lookbehind:!0,alias:"important"},null:{pattern:o("null|~","i"),lookbehind:!0,alias:"important"},string:{pattern:o(d),lookbehind:!0,greedy:!0},number:{pattern:o("[+-]?(?:0x[\\da-f]+|0o[0-7]+|(?:\\d+(?:\\.\\d*)?|\\.?\\d+)(?:e[+-]?\\d+)?|\\.inf|\\.nan)","i"),lookbehind:!0},tag:r,important:n,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism);!function(){if("undefined"!=typeof self&&self.Prism&&self.document){var o="line-numbers",a=/\n(?!$)/g,e=Prism.plugins.lineNumbers={getLine:function(e,n){if("PRE"===e.tagName&&e.classList.contains(o)){var t=e.querySelector(".line-numbers-rows");if(t){var i=parseInt(e.getAttribute("data-start"),10)||1,r=i+(t.children.length-1);n");(i=document.createElement("span")).setAttribute("aria-hidden","true"),i.className="line-numbers-rows",i.innerHTML=l,t.hasAttribute("data-start")&&(t.style.counterReset="linenumber "+(parseInt(t.getAttribute("data-start"),10)-1)),e.element.appendChild(i),u([t]),Prism.hooks.run("line-numbers",e)}}}),Prism.hooks.add("line-numbers",function(e){e.plugins=e.plugins||{},e.plugins.lineNumbers=!0})}function u(e){if(0!=(e=e.filter(function(e){var n=t(e)["white-space"];return"pre-wrap"===n||"pre-line"===n})).length){var n=e.map(function(e){var n=e.querySelector("code"),t=e.querySelector(".line-numbers-rows");if(n&&t){var i=e.querySelector(".line-numbers-sizer"),r=n.textContent.split(a);i||((i=document.createElement("span")).className="line-numbers-sizer",n.appendChild(i)),i.innerHTML="0",i.style.display="block";var s=i.getBoundingClientRect().height;return i.innerHTML="",{element:e,lines:r,lineHeights:[],oneLinerHeight:s,sizer:i}}}).filter(Boolean);n.forEach(function(e){var i=e.sizer,n=e.lines,r=e.lineHeights,s=e.oneLinerHeight;r[n.length-1]=void 0,n.forEach(function(e,n){if(e&&1 ');return'\n\n'+content+'\n\n'}};rules.list={filter:['ul','ol'],replacement:function(content,node){var parent=node.parentNode;if(parent.nodeName==='LI'&&parent.lastElementChild===node){return'\n'+content}else{return'\n\n'+content+'\n\n'}}};rules.listItem={filter:'li',replacement:function(content,node,options){content=content.replace(/^\n+/,'').replace(/\n+$/,'\n').replace(/\n/gm,'\n ');var prefix=options.bulletListMarker+' ';var parent=node.parentNode;if(parent.nodeName==='OL'){var start=parent.getAttribute('start');var index=Array.prototype.indexOf.call(parent.children,node);prefix=(start?Number(start)+index:index+1)+'. ';} -return(prefix+content+(node.nextSibling&&!/\n$/.test(content)?'\n':''))}};rules.indentedCodeBlock={filter:function(node,options){return(options.codeBlockStyle==='indented'&&node.nodeName==='PRE'&&node.firstChild&&node.firstChild.nodeName==='CODE')},replacement:function(content,node,options){return('\n\n '+ -node.firstChild.textContent.replace(/\n/g,'\n ')+'\n\n')}};rules.fencedCodeBlock={filter:function(node,options){return(options.codeBlockStyle==='fenced'&&node.nodeName==='PRE'&&node.firstChild&&node.firstChild.nodeName==='CODE')},replacement:function(content,node,options){var className=node.firstChild.className||'';var language=(className.match(/language-(\S+)/)||[null,''])[1];return('\n\n'+options.fence+language+'\n'+ -node.firstChild.textContent+'\n'+options.fence+'\n\n')}};rules.horizontalRule={filter:'hr',replacement:function(content,node,options){return'\n\n'+options.hr+'\n\n'}};rules.inlineLink={filter:function(node,options){return(options.linkStyle==='inlined'&&node.nodeName==='A'&&node.getAttribute('href'))},replacement:function(content,node){var href=node.getAttribute('href');var title=node.title?' "'+node.title+'"':'';return'['+content+']('+href+title+')'}};rules.referenceLink={filter:function(node,options){return(options.linkStyle==='referenced'&&node.nodeName==='A'&&node.getAttribute('href'))},replacement:function(content,node,options){var href=node.getAttribute('href');var title=node.title?' "'+node.title+'"':'';var replacement;var reference;switch(options.linkReferenceStyle){case'collapsed':replacement='['+content+'][]';reference='['+content+']: '+href+title;break -case'shortcut':replacement='['+content+']';reference='['+content+']: '+href+title;break -default:var id=this.references.length+1;replacement='['+content+']['+id+']';reference='['+id+']: '+href+title;} -this.references.push(reference);return replacement},references:[],append:function(options){var references='';if(this.references.length){references='\n\n'+this.references.join('\n')+'\n\n';this.references=[];} -return references}};rules.emphasis={filter:['em','i'],replacement:function(content,node,options){if(!content.trim())return'' -return options.emDelimiter+content+options.emDelimiter}};rules.strong={filter:['strong','b'],replacement:function(content,node,options){if(!content.trim())return'' -return options.strongDelimiter+content+options.strongDelimiter}};rules.code={filter:function(node){var hasSiblings=node.previousSibling||node.nextSibling;var isCodeBlock=node.parentNode.nodeName==='PRE'&&!hasSiblings;return node.nodeName==='CODE'&&!isCodeBlock},replacement:function(content){if(!content.trim())return'' -var delimiter='`';var leadingSpace='';var trailingSpace='';var matches=content.match(/`+/gm);if(matches){if(/^`/.test(content))leadingSpace=' ';if(/`$/.test(content))trailingSpace=' ';while(matches.indexOf(delimiter)!==-1)delimiter=delimiter+'`';} -return delimiter+leadingSpace+content+trailingSpace+delimiter}};rules.image={filter:'img',replacement:function(content,node){var alt=node.alt||'';var src=node.getAttribute('src')||'';var title=node.title||'';var titlePart=title?' "'+title+'"':'';return src?'!['+alt+']'+'('+src+titlePart+')':''}};function Rules(options){this.options=options;this._keep=[];this._remove=[];this.blankRule={replacement:options.blankReplacement};this.keepReplacement=options.keepReplacement;this.defaultRule={replacement:options.defaultReplacement};this.array=[];for(var key in options.rules)this.array.push(options.rules[key]);} -Rules.prototype={add:function(key,rule){this.array.unshift(rule);},keep:function(filter){this._keep.unshift({filter:filter,replacement:this.keepReplacement});},remove:function(filter){this._remove.unshift({filter:filter,replacement:function(){return''}});},forNode:function(node){if(node.isBlank)return this.blankRule -var rule;if((rule=findRule(this.array,node,this.options)))return rule -if((rule=findRule(this._keep,node,this.options)))return rule -if((rule=findRule(this._remove,node,this.options)))return rule -return this.defaultRule},forEach:function(fn){for(var i=0;i-1)return true}else if(typeof filter==='function'){if(filter.call(rule,node,options))return true}else{throw new TypeError('`filter` needs to be a string, array, or function')}} -function collapseWhitespace(options){var element=options.element;var isBlock=options.isBlock;var isVoid=options.isVoid;var isPre=options.isPre||function(node){return node.nodeName==='PRE'};if(!element.firstChild||isPre(element))return -var prevText=null;var prevVoid=false;var prev=null;var node=next(prev,element,isPre);while(node!==element){if(node.nodeType===3||node.nodeType===4){var text=node.data.replace(/[ \r\n\t]+/g,' ');if((!prevText||/ $/.test(prevText.data))&&!prevVoid&&text[0]===' '){text=text.substr(1);} -if(!text){node=remove(node);continue} -node.data=text;prevText=node;}else if(node.nodeType===1){if(isBlock(node)||node.nodeName==='BR'){if(prevText){prevText.data=prevText.data.replace(/ $/,'');} -prevText=null;prevVoid=false;}else if(isVoid(node)){prevText=null;prevVoid=true;}}else{node=remove(node);continue} -var nextNode=next(prev,node,isPre);prev=node;node=nextNode;} -if(prevText){prevText.data=prevText.data.replace(/ $/,'');if(!prevText.data){remove(prevText);}}} -function remove(node){var next=node.nextSibling||node.parentNode;node.parentNode.removeChild(node);return next} -function next(prev,current,isPre){if((prev&&prev.parentNode===current)||isPre(current)){return current.nextSibling||current.parentNode} -return current.firstChild||current.nextSibling||current.parentNode} -var root=(typeof window!=='undefined'?window:{});function canParseHTMLNatively(){var Parser=root.DOMParser;var canParse=false;try{if(new Parser().parseFromString('','text/html')){canParse=true;}}catch(e){} -return canParse} -function createHTMLParser(){var Parser=function(){};{if(shouldUseActiveX()){Parser.prototype.parseFromString=function(string){var doc=new window.ActiveXObject('htmlfile');doc.designMode='on';doc.open();doc.write(string);doc.close();return doc};}else{Parser.prototype.parseFromString=function(string){var doc=document.implementation.createHTMLDocument('');doc.open();doc.write(string);doc.close();return doc};}} -return Parser} -function shouldUseActiveX(){var useActiveX=false;try{document.implementation.createHTMLDocument('').open();}catch(e){if(window.ActiveXObject)useActiveX=true;} -return useActiveX} -var HTMLParser=canParseHTMLNatively()?root.DOMParser:createHTMLParser();function RootNode(input){var root;if(typeof input==='string'){var doc=htmlParser().parseFromString(''+input+'','text/html');root=doc.getElementById('turndown-root');}else{root=input.cloneNode(true);} -collapseWhitespace({element:root,isBlock:isBlock,isVoid:isVoid});return root} -var _htmlParser;function htmlParser(){_htmlParser=_htmlParser||new HTMLParser();return _htmlParser} -function Node(node){node.isBlock=isBlock(node);node.isCode=node.nodeName.toLowerCase()==='code'||node.parentNode.isCode;node.isBlank=isBlank(node);node.flankingWhitespace=flankingWhitespace(node);return node} -function isBlank(node){return(['A','TH','TD'].indexOf(node.nodeName)===-1&&/^\s*$/i.test(node.textContent)&&!isVoid(node)&&!hasVoid(node))} -function flankingWhitespace(node){var leading='';var trailing='';if(!node.isBlock){var hasLeading=/^[ \r\n\t]/.test(node.textContent);var hasTrailing=/[ \r\n\t]$/.test(node.textContent);if(hasLeading&&!isFlankedByWhitespace('left',node)){leading=' ';} -if(hasTrailing&&!isFlankedByWhitespace('right',node)){trailing=' ';}} -return{leading:leading,trailing:trailing}} -function isFlankedByWhitespace(side,node){var sibling;var regExp;var isFlanked;if(side==='left'){sibling=node.previousSibling;regExp=/ $/;}else{sibling=node.nextSibling;regExp=/^ /;} -if(sibling){if(sibling.nodeType===3){isFlanked=regExp.test(sibling.nodeValue);}else if(sibling.nodeType===1&&!isBlock(sibling)){isFlanked=regExp.test(sibling.textContent);}} -return isFlanked} -var reduce=Array.prototype.reduce;var leadingNewLinesRegExp=/^\n*/;var trailingNewLinesRegExp=/\n*$/;function TurndownService(options){if(!(this instanceof TurndownService))return new TurndownService(options) -var defaults={rules:rules,headingStyle:'setext',hr:'* * *',bulletListMarker:'*',codeBlockStyle:'indented',fence:'```',emDelimiter:'_',strongDelimiter:'**',linkStyle:'inlined',linkReferenceStyle:'full',br:' ',blankReplacement:function(content,node){return node.isBlock?'\n\n':''},keepReplacement:function(content,node){return node.isBlock?'\n\n'+node.outerHTML+'\n\n':node.outerHTML},defaultReplacement:function(content,node){return node.isBlock?'\n\n'+content+'\n\n':content}};this.options=extend({},defaults,options);this.rules=new Rules(this.options);} -TurndownService.prototype={turndown:function(input){if(!canConvert(input)){throw new TypeError(input+' is not a string, or an element/document/fragment node.')} -if(input==='')return'' -var output=process.call(this,new RootNode(input));return postProcess.call(this,output)},use:function(plugin){if(Array.isArray(plugin)){for(var i=0;i /gm,'$1\\> ').replace(/\*+(?![*\s\W]).+?\*+/g,function(match){return match.replace(/\*/g,'\\*')}).replace(/_+(?![_\s\W]).+?_+/g,function(match){return match.replace(/_/g,'\\_')}).replace(/`+(?![`\s\W]).+?`+/g,function(match){return match.replace(/`/g,'\\`')}).replace(/[\[\]]/g,'\\$&'))}};function process(parentNode){var self=this;return reduce.call(parentNode.childNodes,function(output,node){node=new Node(node);var replacement='';if(node.nodeType===3){replacement=node.isCode?node.nodeValue:self.escape(node.nodeValue);}else if(node.nodeType===1){replacement=replacementForNode.call(self,node);} -return join(output,replacement)},'')} -function postProcess(output){var self=this;this.rules.forEach(function(rule){if(typeof rule.append==='function'){output=join(output,rule.append(self.options));}});return output.replace(/^[\t\r\n]+/,'').replace(/[\t\r\n\s]+$/,'')} -function replacementForNode(node){var rule=this.rules.forNode(node);var content=process.call(this,node);var whitespace=node.flankingWhitespace;if(whitespace.leading||whitespace.trailing)content=content.trim();return(whitespace.leading+ -rule.replacement(content,node,this.options)+ -whitespace.trailing)} -function separatingNewlines(output,replacement){var newlines=[output.match(trailingNewLinesRegExp)[0],replacement.match(leadingNewLinesRegExp)[0]].sort();var maxNewlines=newlines[newlines.length-1];return maxNewlines.length<2?maxNewlines:'\n\n'} -function join(string1,string2){var separator=separatingNewlines(string1,string2);string1=string1.replace(trailingNewLinesRegExp,'');string2=string2.replace(leadingNewLinesRegExp,'');return string1+separator+string2} -function canConvert(input){return(input!=null&&(typeof input==='string'||(input.nodeType&&(input.nodeType===1||input.nodeType===9||input.nodeType===11))))} -return TurndownService;}()); - -window.ls=window.ls||{};window.ls.container=function(){let stock={};let listeners={};let namespaces={};let set=function(name,object,singleton,watch=true){if(typeof name!=='string'){throw new Error('var name must be of type string');} -if(typeof singleton!=='boolean'){throw new Error('var singleton "'+singleton+'" of service "'+name+'" must be of type boolean');} -stock[name]={name:name,object:object,singleton:singleton,instance:null,watch:watch,};if(!watch){return this;} -let binds=listeners[name]||{};for(let key in binds){if(binds.hasOwnProperty(key)){document.dispatchEvent(new CustomEvent(key));}} -return this;};let get=function(name){let service=(undefined!==stock[name])?stock[name]:null;if(null==service){return null;} -if(service.instance){return service.instance;} -let instance=(typeof service.object==='function')?this.resolve(service.object):service.object;let skip=false;if(service.watch&&name!=='window'&&name!=='document'&&name!=='element'&&typeof instance==='object'&&instance!==null){let handler={name:service.name,watch:function(){},get:function(target,key){if(key==="__name"){return this.name;} -if(key==="__watch"){return this.watch;} -if(key==="__proxy"){return true;} -if(key!=='constructor'&&typeof target[key]==='function'&&([Map,Set,WeakMap,WeakSet].includes(target.constructor))){return target[key].bind(target);} -if(typeof target[key]==='object'&&target[key]!==null&&!target[key].__proxy){let handler=Object.assign({},this);handler.name=handler.name+'.'+key;return new Proxy(target[key],handler)} -else{return target[key];}},set:function(target,key,value,receiver){if(key==="__name"){return this.name=value;} -if(key==="__watch"){return this.watch=value;} -target[key]=value;let path=receiver.__name+'.'+key;document.dispatchEvent(new CustomEvent(path+'.changed'));if(skip){return true;} -skip=true;container.set('$prop',key,true);container.set('$value',value,true);container.resolve(this.watch);container.set('$key',null,true);container.set('$value',null,true);skip=false;return true;},};instance=new Proxy(instance,handler);} -if(service.singleton){service.instance=instance;} -return instance;};let resolve=function(target){if(!target){return()=>{};} -let self=this;const REGEX_COMMENTS=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;const REGEX_FUNCTION_PARAMS=/(?:\s*(?:function\s*[^(]*)?\s*)((?:[^'"]|(?:(?:(['"])(?:(?:.*?[^\\]\2)|\2))))*?)\s*(?=(?:=>)|{)/m;const REGEX_PARAMETERS_VALUES=/\s*([\w\\$]+)\s*(?:=\s*((?:(?:(['"])(?:\3|(?:.*?[^\\]\3)))((\s*\+\s*)(?:(?:(['"])(?:\6|(?:.*?[^\\]\6)))|(?:[\w$]*)))*)|.*?))?\s*(?:,|$)/gm;function getParams(func){let functionAsString=func.toString();let params=[];let match;functionAsString=functionAsString.replace(REGEX_COMMENTS,'');functionAsString=functionAsString.match(REGEX_FUNCTION_PARAMS)[1];if(functionAsString.charAt(0)==='('){functionAsString=functionAsString.slice(1,-1);} -while(match=REGEX_PARAMETERS_VALUES.exec(functionAsString)){params.push(match[1]);} -return params;} -let args=getParams(target);return target.apply(target,args.map(function(value){return self.get(value.trim());}));};let path=function(path,value,type){type=(type)?type:'assign';path=container.scope(path).split('.');let name=path.shift();let object=container.get(name);let result=null;while(path.length>1){if(!object){return null;} -object=object[path.shift()];} -let shift=path.shift();if(value!==null&&value!==undefined&&object&&shift&&(object[shift]!==undefined||object[shift]!==null)){switch(type){case'append':if(!Array.isArray(object[shift])){object[shift]=[];} -object[shift].push(value);break;case'prepend':if(!Array.isArray(object[shift])){object[shift]=[];} -object[shift].unshift(value);break;case'splice':if(!Array.isArray(object[shift])){object[shift]=[];} -object[shift].splice(value,1);break;default:object[shift]=value;} -return true;} -if(!object){return null;} -if(!shift){result=object;} -else{return object[shift];} -return result;};let bind=function(element,path,callback){let event=container.scope(path)+'.changed';let service=event.split('.').slice(0,1).pop();let debug=element.getAttribute('data-debug')||false;listeners[service]=listeners[service]||{};listeners[service][event]=true;let printer=(function(x){return function(){if(!document.body.contains(element)){element=null;document.removeEventListener(event,printer,false);return false;} -let oldNamespaces=namespaces;namespaces=x;callback();namespaces=oldNamespaces;}}(Object.assign({},namespaces)));document.addEventListener(event,printer);};let addNamespace=function(key,scope){namespaces[key]=scope;return this;} -let removeNamespace=function(key){delete namespaces[key];return this;} -let scope=function(path){for(let[key,value]of Object.entries(namespaces)){path=(path.indexOf('.')>-1)?path.replace(key+'.',value+'.'):path.replace(key,value);} -return path;} -let container={set:set,get:get,resolve:resolve,path:path,bind:bind,scope:scope,addNamespace:addNamespace,removeNamespace:removeNamespace,stock:stock,listeners:listeners,namespaces:namespaces,};set('container',container,true,false);return container;}();window.ls.container.set('http',function(document){let globalParams=[],globalHeaders=[];let addParam=function(url,param,value){param=encodeURIComponent(param);let a=document.createElement('a');param+=(value?"="+encodeURIComponent(value):"");a.href=url;a.search+=(a.search?"&":"")+param;return a.href;};let request=function(method,url,headers,payload,progress){let i;if(-1===['GET','POST','PUT','DELETE','TRACE','HEAD','OPTIONS','CONNECT','PATCH'].indexOf(method)){throw new Error('var method must contain a valid HTTP method name');} -if(typeof url!=='string'){throw new Error('var url must be of type string');} -if(typeof headers!=='object'){throw new Error('var headers must be of type object');} -if(typeof url!=='string'){throw new Error('var url must be of type string');} -for(i=0;i-1?part.substr(0,eq):part;let val=eq>-1?decodeURIComponent(part.substr(eq+1)):'';let from=key.indexOf('[');if(from===-1){result[decodeURIComponent(key)]=val;} -else{let to=key.indexOf(']');let index=decodeURIComponent(key.substring(from+1,to));key=decodeURIComponent(key.substring(0,from));if(!result[key]){result[key]=[];} -if(!index){result[key].push(val);} -else{result[key][index]=val;}}});return result;};let states=[];let params=getJsonFromUrl(window.location.search);let hash=window.location.hash;let current=null;let previous=null;let getPrevious=()=>previous;let getCurrent=()=>current;let setPrevious=(value)=>{previous=value;return this;};let setCurrent=(value)=>{current=value;return this;};let setParam=function(key,value){params[key]=value;return this;};let getParam=function(key,def){if(key in params){return params[key];} -return def;};let getParams=function(){return params;};let getURL=function(){return window.location.href;};let add=function(path,view){if(typeof path!=='string'){throw new Error('path must be of type string');} -if(typeof view!=='object'){throw new Error('view must be of type object');} -states[states.length++]={path:path,view:view};return this;};let match=function(location){let url=location.pathname;if(url.endsWith('/')){url=url.slice(0,-1);} -states.sort(function(a,b){return b.path.length-a.path.length;});states.sort(function(a,b){let n=b.path.split('/').length-a.path.split('/').length;if(n!==0){return n;} -return b.path.length-a.path.length;});for(let i=0;i{let reference=match.substring(2,match.length-2).replace('[\'','.').replace('\']','').trim();reference=reference.split('|');let path=container.scope((reference[0]||''));let result=container.path(path);path=container.scope(path);if(!paths.includes(path)){paths.push(path);} -if(reference.length>=2){for(let i=1;ipaths,}},true,false);window.ls.container.set('filter',function(container){let filters={};let add=function(name,callback){filters[name]=callback;return this;};let apply=function(name,value){container.set('$value',value,true,false);return container.resolve(filters[name]);};add('uppercase',($value)=>{if(typeof $value!=='string'){return $value;} -return $value.toUpperCase();});add('lowercase',($value)=>{if(typeof $value!=='string'){return $value;} -return $value.toLowerCase();});return{add:add,apply:apply}},true,false);window.ls.container.get('filter').add('escape',$value=>{if(typeof $value!=='string'){return $value;} -return $value.replace(/&/g,'&').replace(//g,'>').replace(/\"/g,'"').replace(/\'/g,''').replace(/\//g,'/');});window.ls=window.ls||{};window.ls.container.set('window',window,true,false).set('document',window.document,true,false).set('element',window.document,true,false);window.ls.run=function(window){try{this.view.render(window.document);} -catch(error){let handler=window.ls.container.resolve(this.error);handler(error);}};window.ls.error=()=>{return error=>{console.error('ls-error',error.message,error.stack,error.toString());}};window.ls.router=window.ls.container.get('router');window.ls.view=window.ls.container.get('view');window.ls.filter=window.ls.container.get('filter');window.ls.container.get('view').add({selector:'data-ls-router',controller:function(element,window,document,view,router){let firstFromServer=(element.getAttribute('data-first-from-server')==='true');let scope={selector:'data-ls-scope',template:false,repeat:true,controller:function(){},};let init=function(route){let count=parseInt(element.getAttribute('data-ls-scope-count')||0);element.setAttribute('data-ls-scope-count',count+1);window.scrollTo(0,0);if(window.document.body.scrollTo){window.document.body.scrollTo(0,0);} -router.reset();if(null===route){return;} -scope.template=(undefined!==route.view.template)?route.view.template:null;scope.controller=(undefined!==route.view.controller)?route.view.controller:function(){};document.dispatchEvent(new CustomEvent('state-change'));if(firstFromServer&&null===router.getPrevious()){scope.template='';document.dispatchEvent(new CustomEvent('state-changed'));} -else if(count===1){view.render(element,function(){document.dispatchEvent(new CustomEvent('state-changed'));});} -else if(null!==router.getPrevious()){view.render(element,function(){document.dispatchEvent(new CustomEvent('state-changed'));});}};let findParent=function(tagName,el){if((el.nodeName||el.tagName).toLowerCase()===tagName.toLowerCase()){return el;} -while(el=el.parentNode){if((el.nodeName||el.tagName).toLowerCase()===tagName.toLowerCase()){return el;}} -return null;};element.removeAttribute('data-ls-router');element.setAttribute('data-ls-scope','');element.setAttribute('data-ls-scope-count',1);view.add(scope);document.addEventListener('click',function(event){let target=findParent('a',event.target);if(!target){return false;} -if(!target.href){return false;} -if((event.metaKey)){return false;} -if((target.hasAttribute('target'))&&('_blank'===target.getAttribute('target'))){return false;} -if(target.hostname!==window.location.hostname){return false;} -let route=router.match(target);if(null===route){return false;} -event.preventDefault();if(window.location===target.href){return false;} -route.view.state=(undefined===route.view.state)?true:route.view.state;if(true===route.view.state){if(router.getPrevious()&&router.getPrevious().view&&(router.getPrevious().view.scope!==route.view.scope)){window.location.href=target.href;return false;} -window.history.pushState({},'Unknown',target.href);} -init(route);return true;});window.addEventListener('popstate',function(){init(router.match(window.location));});window.addEventListener('hashchange',function(){init(router.match(window.location));});init(router.match(window.location));}});window.ls.container.get('view').add({selector:'data-ls-attrs',controller:function(element,expression,container){let attrs=element.getAttribute('data-ls-attrs').trim().split(',');let paths=[];let debug=element.getAttribute('data-debug')||false;let check=()=>{container.set('element',element,true,false);if(debug){console.info('debug-ls-attrs attributes:',attrs);} -for(let i=0;i{for(let i=0;i-1));value=element.value;} -catch{return null;}} -if(bind){element.addEventListener('change',()=>{for(let i=0;i-1){value.splice(index,1);} -container.path(paths[i],value);}});} -return;} -if(element.value!==value){element.value=value;element.dispatchEvent(new Event('change'));} -if(bind){element.addEventListener('input',sync);element.addEventListener('change',sync);}} -else{if(element.textContent!=value){element.textContent=value;}}};let sync=(()=>{return()=>{if(debug){console.info('debug-ls-bind','sync-path',paths);console.info('debug-ls-bind','sync-syntax',syntax);console.info('debug-ls-bind','sync-syntax-parsed',parsedSyntax);console.info('debug-ls-bind','sync-value',element.value);} -for(let i=0;i{echo(expression.parse(parsedSyntax),false);});path.pop();}}}});window.ls.container.get('view').add({selector:'data-ls-if',controller:function(element,expression,container,view){let result='';let syntax=element.getAttribute('data-ls-if')||'';let debug=element.getAttribute('data-debug')||false;let paths=[];let check=()=>{if(debug){console.info('debug-ls-if',expression.parse(syntax.replace(/(\r\n|\n|\r)/gm,' '),'undefined',true));} -try{result=(eval(expression.parse(syntax.replace(/(\r\n|\n|\r)/gm,' '),'undefined',true)));} -catch(error){throw new Error('Failed to evaluate expression "'+syntax+' (resulted with: "'+result+'")": '+error);} -if(debug){console.info('debug-ls-if result:',result);} -paths=expression.getPaths();let prv=element.$lsSkip;element.$lsSkip=!result;if(!result){element.style.visibility='hidden';element.style.display='none';} -else{element.style.removeProperty('display');element.style.removeProperty('visibility');} -if(prv===true&&element.$lsSkip===false){view.render(element)}};check();for(let i=0;i{let context=expr+'.'+index;container.addNamespace(as,context);if(debug){console.info('debug-ls-loop','index',index);console.info('debug-ls-loop','context',context);console.info('debug-ls-loop','context-path',container.path(context).name);console.info('debug-ls-loop','namespaces',container.namespaces);} -container.set(as,container.path(context),true,watch);container.set(key,index,true,false);view.render(children[prop]);container.removeNamespace(as);})(prop);} -element.dispatchEvent(new Event('looped'));};let template=(element.children.length===1)?element.children[0]:window.document.createElement('li');echo();container.bind(element,expr+'.length',echo);let path=(expr+'.length').split('.');while(path.length){container.bind(element,path.join('.'),echo);path.pop();}}});window.ls.container.get('view').add({selector:'data-ls-template',template:false,controller:function(element,view,http,expression,document,container){let template=element.getAttribute('data-ls-template')||'';let type=element.getAttribute('data-type')||'url';let debug=element.getAttribute('data-debug')||false;let paths=[];let check=function(init=false){let source=expression.parse(template);paths=expression.getPaths();element.innerHTML='';if('script'===type){let inlineTemplate=document.getElementById(source);if(inlineTemplate&&inlineTemplate.innerHTML){element.innerHTML=inlineTemplate.innerHTML;element.dispatchEvent(new CustomEvent('template-loaded',{bubbles:true,cancelable:false}));} -else{if(debug){console.error('Missing template "'+source+'"');}} -if(!init){view.render(element);} -return;} -http.get(source).then(function(element){return function(data){element.innerHTML=data;view.render(element);element.dispatchEvent(new CustomEvent('template-loaded',{bubbles:true,cancelable:false}));}}(element),function(){throw new Error('Failed loading template');});};check(true);for(let i=0;i{var flushPending=false;var flushing=false;var queue=[];function scheduler(callback){queueJob(callback);} -function queueJob(job){if(!queue.includes(job)) -queue.push(job);queueFlush();} -function queueFlush(){if(!flushing&&!flushPending){flushPending=true;queueMicrotask(flushJobs);}} -function flushJobs(){flushPending=false;flushing=true;for(let i=0;iengine.effect(callback,{scheduler:(task)=>{if(shouldSchedule){scheduler(task);}else{task();}}});raw=engine.raw;} -function overrideEffect(override){effect=override;} -function elementBoundEffect(el){let cleanup2=()=>{};let wrappedEffect=(callback)=>{let effectReference=effect(callback);if(!el._x_effects){el._x_effects=new Set();el._x_runEffects=()=>{el._x_effects.forEach((i)=>i());};} -el._x_effects.add(effectReference);cleanup2=()=>{if(effectReference===void 0) -return;el._x_effects.delete(effectReference);release(effectReference);};};return[wrappedEffect,()=>{cleanup2();}];} -var onAttributeAddeds=[];var onElRemoveds=[];var onElAddeds=[];function onElAdded(callback){onElAddeds.push(callback);} -function onElRemoved(callback){onElRemoveds.push(callback);} -function onAttributesAdded(callback){onAttributeAddeds.push(callback);} -function onAttributeRemoved(el,name,callback){if(!el._x_attributeCleanups) -el._x_attributeCleanups={};if(!el._x_attributeCleanups[name]) -el._x_attributeCleanups[name]=[];el._x_attributeCleanups[name].push(callback);} -function cleanupAttributes(el,names){if(!el._x_attributeCleanups) -return;Object.entries(el._x_attributeCleanups).forEach(([name,value])=>{if(names===void 0||names.includes(name)){value.forEach((i)=>i());delete el._x_attributeCleanups[name];}});} -var observer=new MutationObserver(onMutate);var currentlyObserving=false;function startObservingMutations(){observer.observe(document,{subtree:true,childList:true,attributes:true,attributeOldValue:true});currentlyObserving=true;} -function stopObservingMutations(){flushObserver();observer.disconnect();currentlyObserving=false;} -var recordQueue=[];var willProcessRecordQueue=false;function flushObserver(){recordQueue=recordQueue.concat(observer.takeRecords());if(recordQueue.length&&!willProcessRecordQueue){willProcessRecordQueue=true;queueMicrotask(()=>{processRecordQueue();willProcessRecordQueue=false;});}} -function processRecordQueue(){onMutate(recordQueue);recordQueue.length=0;} -function mutateDom(callback){if(!currentlyObserving) -return callback();stopObservingMutations();let result=callback();startObservingMutations();return result;} -var isCollecting=false;var deferredMutations=[];function deferMutations(){isCollecting=true;} -function flushAndStopDeferringMutations(){isCollecting=false;onMutate(deferredMutations);deferredMutations=[];} -function onMutate(mutations){if(isCollecting){deferredMutations=deferredMutations.concat(mutations);return;} -let addedNodes=[];let removedNodes=[];let addedAttributes=new Map();let removedAttributes=new Map();for(let i=0;inode.nodeType===1&&addedNodes.push(node));mutations[i].removedNodes.forEach((node)=>node.nodeType===1&&removedNodes.push(node));} -if(mutations[i].type==="attributes"){let el=mutations[i].target;let name=mutations[i].attributeName;let oldValue=mutations[i].oldValue;let add2=()=>{if(!addedAttributes.has(el)) -addedAttributes.set(el,[]);addedAttributes.get(el).push({name,value:el.getAttribute(name)});};let remove=()=>{if(!removedAttributes.has(el)) -removedAttributes.set(el,[]);removedAttributes.get(el).push(name);};if(el.hasAttribute(name)&&oldValue===null){add2();}else if(el.hasAttribute(name)){remove();add2();}else{remove();}}} -removedAttributes.forEach((attrs,el)=>{cleanupAttributes(el,attrs);});addedAttributes.forEach((attrs,el)=>{onAttributeAddeds.forEach((i)=>i(el,attrs));});for(let node of addedNodes){if(removedNodes.includes(node)) -continue;onElAddeds.forEach((i)=>i(node));} -for(let node of removedNodes){if(addedNodes.includes(node)) -continue;onElRemoveds.forEach((i)=>i(node));} -addedNodes=null;removedNodes=null;addedAttributes=null;removedAttributes=null;} -function addScopeToNode(node,data2,referenceNode){node._x_dataStack=[data2,...closestDataStack(referenceNode||node)];return()=>{node._x_dataStack=node._x_dataStack.filter((i)=>i!==data2);};} -function refreshScope(element,scope){let existingScope=element._x_dataStack[0];Object.entries(scope).forEach(([key,value])=>{existingScope[key]=value;});} -function closestDataStack(node){if(node._x_dataStack) -return node._x_dataStack;if(typeof ShadowRoot==="function"&&node instanceof ShadowRoot){return closestDataStack(node.host);} -if(!node.parentNode){return[];} -return closestDataStack(node.parentNode);} -function mergeProxies(objects){let thisProxy=new Proxy({},{ownKeys:()=>{return Array.from(new Set(objects.flatMap((i)=>Object.keys(i))));},has:(target,name)=>{return objects.some((obj)=>obj.hasOwnProperty(name));},get:(target,name)=>{return(objects.find((obj)=>{if(obj.hasOwnProperty(name)){let descriptor=Object.getOwnPropertyDescriptor(obj,name);if(descriptor.get&&descriptor.get._x_alreadyBound||descriptor.set&&descriptor.set._x_alreadyBound){return true;} -if((descriptor.get||descriptor.set)&&descriptor.enumerable){let getter=descriptor.get;let setter=descriptor.set;let property=descriptor;getter=getter&&getter.bind(thisProxy);setter=setter&&setter.bind(thisProxy);if(getter) -getter._x_alreadyBound=true;if(setter) -setter._x_alreadyBound=true;Object.defineProperty(obj,name,{...property,get:getter,set:setter});} -return true;} -return false;})||{})[name];},set:(target,name,value)=>{let closestObjectWithKey=objects.find((obj)=>obj.hasOwnProperty(name));if(closestObjectWithKey){closestObjectWithKey[name]=value;}else{objects[objects.length-1][name]=value;} -return true;}});return thisProxy;} -function initInterceptors(data2){let isObject2=(val)=>typeof val==="object"&&!Array.isArray(val)&&val!==null;let recurse=(obj,basePath="")=>{Object.entries(Object.getOwnPropertyDescriptors(obj)).forEach(([key,{value,enumerable}])=>{if(enumerable===false||value===void 0) -return;let path=basePath===""?key:`${basePath}.${key}`;if(typeof value==="object"&&value!==null&&value._x_interceptor){obj[key]=value.initialize(data2,path,key);}else{if(isObject2(value)&&value!==obj&&!(value instanceof Element)){recurse(value,path);}}});};return recurse(data2);} -function interceptor(callback,mutateObj=()=>{}){let obj={initialValue:void 0,_x_interceptor:true,initialize(data2,path,key){return callback(this.initialValue,()=>get(data2,path),(value)=>set(data2,path,value),path,key);}};mutateObj(obj);return(initialValue)=>{if(typeof initialValue==="object"&&initialValue!==null&&initialValue._x_interceptor){let initialize=obj.initialize.bind(obj);obj.initialize=(data2,path,key)=>{let innerValue=initialValue.initialize(data2,path,key);obj.initialValue=innerValue;return initialize(data2,path,key);};}else{obj.initialValue=initialValue;} -return obj;};} -function get(obj,path){return path.split(".").reduce((carry,segment)=>carry[segment],obj);} -function set(obj,path,value){if(typeof path==="string") -path=path.split(".");if(path.length===1) -obj[path[0]]=value;else if(path.length===0) -throw error;else{if(obj[path[0]]) -return set(obj[path[0]],path.slice(1),value);else{obj[path[0]]={};return set(obj[path[0]],path.slice(1),value);}}} -var magics={};function magic(name,callback){magics[name]=callback;} -function injectMagics(obj,el){Object.entries(magics).forEach(([name,callback])=>{Object.defineProperty(obj,`$${name}`,{get(){return callback(el,{Alpine:alpine_default,interceptor});},enumerable:false});});return obj;} -function tryCatch(el,expression,callback,...args){try{return callback(...args);}catch(e){handleError(e,el,expression);}} -function handleError(error2,el,expression=void 0){Object.assign(error2,{el,expression});console.warn(`Alpine Expression Error: ${error2.message} - - ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`,el);setTimeout(()=>{throw error2;},0);} -function evaluate(el,expression,extras={}){let result;evaluateLater(el,expression)((value)=>result=value,extras);return result;} -function evaluateLater(...args){return theEvaluatorFunction(...args);} -var theEvaluatorFunction=normalEvaluator;function setEvaluator(newEvaluator){theEvaluatorFunction=newEvaluator;} -function normalEvaluator(el,expression){let overriddenMagics={};injectMagics(overriddenMagics,el);let dataStack=[overriddenMagics,...closestDataStack(el)];if(typeof expression==="function"){return generateEvaluatorFromFunction(dataStack,expression);} -let evaluator=generateEvaluatorFromString(dataStack,expression,el);return tryCatch.bind(null,el,expression,evaluator);} -function generateEvaluatorFromFunction(dataStack,func){return(receiver=()=>{},{scope={},params=[]}={})=>{let result=func.apply(mergeProxies([scope,...dataStack]),params);runIfTypeOfFunction(receiver,result);};} -var evaluatorMemo={};function generateFunctionFromString(expression,el){if(evaluatorMemo[expression]){return evaluatorMemo[expression];} -let AsyncFunction=Object.getPrototypeOf(async function(){}).constructor;let rightSideSafeExpression=/^[\n\s]*if.*\(.*\)/.test(expression)||/^(let|const)\s/.test(expression)?`(() => { ${expression} })()`:expression;const safeAsyncFunction=()=>{try{return new AsyncFunction(["__self","scope"],`with (scope) { __self.result = ${rightSideSafeExpression} }; __self.finished = true; return __self.result;`);}catch(error2){handleError(error2,el,expression);return Promise.resolve();}};let func=safeAsyncFunction();evaluatorMemo[expression]=func;return func;} -function generateEvaluatorFromString(dataStack,expression,el){let func=generateFunctionFromString(expression,el);return(receiver=()=>{},{scope={},params=[]}={})=>{func.result=void 0;func.finished=false;let completeScope=mergeProxies([scope,...dataStack]);if(typeof func==="function"){let promise=func(func,completeScope).catch((error2)=>handleError(error2,el,expression));if(func.finished){runIfTypeOfFunction(receiver,func.result,completeScope,params,el);}else{promise.then((result)=>{runIfTypeOfFunction(receiver,result,completeScope,params,el);}).catch((error2)=>handleError(error2,el,expression));}}};} -function runIfTypeOfFunction(receiver,value,scope,params,el){if(typeof value==="function"){let result=value.apply(scope,params);if(result instanceof Promise){result.then((i)=>runIfTypeOfFunction(receiver,i,scope,params)).catch((error2)=>handleError(error2,el,value));}else{receiver(result);}}else{receiver(value);}} -var prefixAsString="x-";function prefix(subject=""){return prefixAsString+subject;} -function setPrefix(newPrefix){prefixAsString=newPrefix;} -var directiveHandlers={};function directive(name,callback){directiveHandlers[name]=callback;} -function directives(el,attributes,originalAttributeOverride){let transformedAttributeMap={};let directives2=Array.from(attributes).map(toTransformedAttributes((newName,oldName)=>transformedAttributeMap[newName]=oldName)).filter(outNonAlpineAttributes).map(toParsedDirectives(transformedAttributeMap,originalAttributeOverride)).sort(byPriority);return directives2.map((directive2)=>{return getDirectiveHandler(el,directive2);});} -function attributesOnly(attributes){return Array.from(attributes).map(toTransformedAttributes()).filter((attr)=>!outNonAlpineAttributes(attr));} -var isDeferringHandlers=false;var directiveHandlerStacks=new Map();var currentHandlerStackKey=Symbol();function deferHandlingDirectives(callback){isDeferringHandlers=true;let key=Symbol();currentHandlerStackKey=key;directiveHandlerStacks.set(key,[]);let flushHandlers=()=>{while(directiveHandlerStacks.get(key).length) -directiveHandlerStacks.get(key).shift()();directiveHandlerStacks.delete(key);};let stopDeferring=()=>{isDeferringHandlers=false;flushHandlers();};callback(flushHandlers);stopDeferring();} -function getDirectiveHandler(el,directive2){let noop=()=>{};let handler3=directiveHandlers[directive2.type]||noop;let cleanups=[];let cleanup2=(callback)=>cleanups.push(callback);let[effect3,cleanupEffect]=elementBoundEffect(el);cleanups.push(cleanupEffect);let utilities={Alpine:alpine_default,effect:effect3,cleanup:cleanup2,evaluateLater:evaluateLater.bind(evaluateLater,el),evaluate:evaluate.bind(evaluate,el)};let doCleanup=()=>cleanups.forEach((i)=>i());onAttributeRemoved(el,directive2.original,doCleanup);let fullHandler=()=>{if(el._x_ignore||el._x_ignoreSelf) -return;handler3.inline&&handler3.inline(el,directive2,utilities);handler3=handler3.bind(handler3,el,directive2,utilities);isDeferringHandlers?directiveHandlerStacks.get(currentHandlerStackKey).push(handler3):handler3();};fullHandler.runCleanups=doCleanup;return fullHandler;} -var startingWith=(subject,replacement)=>({name,value})=>{if(name.startsWith(subject)) -name=name.replace(subject,replacement);return{name,value};};var into=(i)=>i;function toTransformedAttributes(callback=()=>{}){return({name,value})=>{let{name:newName,value:newValue}=attributeTransformers.reduce((carry,transform)=>{return transform(carry);},{name,value});if(newName!==name) -callback(newName,name);return{name:newName,value:newValue};};} -var attributeTransformers=[];function mapAttributes(callback){attributeTransformers.push(callback);} -function outNonAlpineAttributes({name}){return alpineAttributeRegex().test(name);} -var alpineAttributeRegex=()=>new RegExp(`^${prefixAsString}([^:^.]+)\\b`);function toParsedDirectives(transformedAttributeMap,originalAttributeOverride){return({name,value})=>{let typeMatch=name.match(alpineAttributeRegex());let valueMatch=name.match(/:([a-zA-Z0-9\-:]+)/);let modifiers=name.match(/\.[^.\]]+(?=[^\]]*$)/g)||[];let original=originalAttributeOverride||transformedAttributeMap[name]||name;return{type:typeMatch?typeMatch[1]:null,value:valueMatch?valueMatch[1]:null,modifiers:modifiers.map((i)=>i.replace(".","")),expression:value,original};};} -var DEFAULT="DEFAULT";var directiveOrder=["ignore","ref","data","bind","init","for","model","transition","show","if",DEFAULT,"element"];function byPriority(a,b){let typeA=directiveOrder.indexOf(a.type)===-1?DEFAULT:a.type;let typeB=directiveOrder.indexOf(b.type)===-1?DEFAULT:b.type;return directiveOrder.indexOf(typeA)-directiveOrder.indexOf(typeB);} -function dispatch(el,name,detail={}){el.dispatchEvent(new CustomEvent(name,{detail,bubbles:true,composed:true,cancelable:true}));} -var tickStack=[];var isHolding=false;function nextTick(callback){tickStack.push(callback);queueMicrotask(()=>{isHolding||setTimeout(()=>{releaseNextTicks();});});} -function releaseNextTicks(){isHolding=false;while(tickStack.length) -tickStack.shift()();} -function holdNextTicks(){isHolding=true;} -function walk(el,callback){if(typeof ShadowRoot==="function"&&el instanceof ShadowRoot){Array.from(el.children).forEach((el2)=>walk(el2,callback));return;} -let skip=false;callback(el,()=>skip=true);if(skip) -return;let node=el.firstElementChild;while(node){walk(node,callback,false);node=node.nextElementSibling;}} -function warn(message,...args){console.warn(`Alpine Warning: ${message}`,...args);} -function start(){if(!document.body) -warn("Unable to initialize. Trying to load Alpine before `` is available. Did you forget to add `defer` in Alpine's `