diff --git a/.github/ISSUE_TEMPLATE/01_bug-report.md b/.github/ISSUE_TEMPLATE/01_bug-report.md index 019f8c739..8734fc0c3 100644 --- a/.github/ISSUE_TEMPLATE/01_bug-report.md +++ b/.github/ISSUE_TEMPLATE/01_bug-report.md @@ -16,11 +16,11 @@ First, in order to avoid duplicate Issues, please search to see if the problem y -## 🙂 Expected Behavior +## đŸĨ° Expected Behavior -## ☚ī¸ Actual Behavior +## đŸ¤Ŧ Actual Behavior @@ -33,3 +33,7 @@ First, in order to avoid duplicate Issues, please search to see if the problem y ## 📌 Environment + +Misskey version: +Your OS: +Your browser: diff --git a/CHANGELOG.md b/CHANGELOG.md index 65f5e0194..b60a85cf1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,11 +2,46 @@ ## 12.x.x (unreleased) ### Improvements +- ### Bugfixes +- +You should also include the user name that made the change. --> +## 12.104.0 (2022/02/09) + +### Note +こぎãƒĒãƒĒãƒŧ゚はマイグãƒŦãƒŧã‚ˇãƒ§ãƒŗぎčĻæ¨ĄãŒå¤§ãã„ため、イãƒŗã‚šã‚ŋãƒŗã‚šãĢよãŖãĻはマイグãƒŦãƒŧã‚ˇãƒ§ãƒŗãĢ時間がかかる可čƒŊ性がありぞす。 +マイグãƒŦãƒŧã‚ˇãƒ§ãƒŗがįĩ‚わらãĒい場合は、チãƒŖãƒŧãƒˆãŽæƒ…å ąã¯ãƒĒã‚ģットされãĻしぞいぞすが`__chart__`で始ぞるテãƒŧブãƒĢぎ**ãƒŦã‚ŗãƒŧド**を全ãĻ削除(テãƒŧブãƒĢč‡ĒäŊ“はæļˆã•ãĒいでください)しãĻから再åēĻčŠĻす斚æŗ•ã‚‚ありぞす。 + +### Improvements +- チãƒŖãƒŧトエãƒŗジãƒŗぎåŧˇåŒ– @syuilo + - テãƒŧブãƒĢã‚ĩイã‚ēぎ削減 + - notes/instance/perUserNotesチãƒŖãƒŧトãĢæˇģäģ˜ãƒ•ã‚Ąã‚¤ãƒĢäģ˜ããƒŽãƒŧトぎ数をčŋŊ加 + - activeUsersチãƒŖãƒŧトãĢ新しい項į›Žã‚’čŋŊ加 + - federationチãƒŖãƒŧトãĢ新しい項į›Žã‚’čŋŊ加 + - apRequestチãƒŖãƒŧトをčŋŊ加 + - networkチãƒŖãƒŧトåģƒæ­ĸ +- クナイã‚ĸãƒŗト: č‡Ēイãƒŗã‚šã‚ŋãƒŗã‚šæƒ…å ąãƒšãƒŧジでチãƒŖãƒŧトをčĻ‹ã‚Œã‚‹ã‚ˆã†ãĢ @syuilo +- クナイã‚ĸãƒŗト: デバイ゚ぎį¨ŽéĄžã‚’手動指厚できるようãĢ @syuilo +- クナイã‚ĸãƒŗト: UIぎã‚ĸイã‚ŗãƒŗを更新 @syuilo +- クナイã‚ĸãƒŗト: UIぎã‚ĸイã‚ŗãƒŗをã‚ģãƒĢフポテã‚ŖãƒŗグするようãĢ @syuilo +- NodeInfo ぎãƒĻãƒŧã‚ļãƒŧ数と投į¨ŋ数ぎ内厚をčĻ‹į›´ã™ @xianonn + +### Bugfixes +- Client: ã‚ŋイムナイãƒŗį¨ŽåˆĨを切りæ›ŋえると「新しいノãƒŧãƒˆãŒã‚ã‚Šãžã™ã€ãŽčĄ¨į¤ēが掋į•™ã—ãĻしぞうぎをäŋŽæ­Ŗ @tamaina +- Client: UIぎã‚ĩイã‚ēがおかしくãĒã‚‹å•éĄŒãŽäŋŽæ­Ŗ @tamaina +- Client: Setting instance information of notes to always show breaks the timeline @Johann150 +- Client: į’°åĸƒãĢ䞝ãŖãĻはčŋ”äŋĄã™ã‚‹éš›ãŽã‚Ģãƒŧã‚ŊãƒĢäŊįŊŽãŒæ­ŖしくãĒã„å•éĄŒã‚’äŋŽæ­Ŗ @syuilo +- Client: ã‚ŗãƒŗトロãƒŧãƒĢパネãƒĢぎãƒĻãƒŧã‚ļãƒŧã€ãƒ•ã‚Ąã‚¤ãƒĢãĢãĻ、イãƒŗã‚šã‚ŋãƒŗã‚šãŽčĄ¨į¤ēį¯„å›˛åˆ‡ã‚Šæ›ŋえが抟čƒŊしãĒã„å•éĄŒã‚’äŋŽæ­Ŗ @syuilo +- Client: ã‚ĸップデãƒŧトおįŸĨらせダイã‚ĸログがå‡ēãĒいぎをäŋŽæ­Ŗ @syuilo +- Client: Follows/Followers Visibility changes won't be saved unless clicking on an other checkbox @Johann150 +- API: Fix API cast @mei23 +- add instance favicon where it's missing @solfisher +- チãƒŖãƒŧトぎ厚期resyncが動äŊœã—ãĻいãĒã„å•éĄŒã‚’äŋŽæ­Ŗ @syuilo + ## 12.103.1 (2022/02/02) ### Bugfixes diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 662fa709b..6e0f500be 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -16,6 +16,9 @@ Before creating an issue, please check the following: ## Before implementation When you want to add a feature or fix a bug, **first have the design and policy reviewed in an Issue** (if it is not there, please make one). Without this step, there is a high possibility that the PR will not be merged even if it is implemented. +At this point, you also need to clarify the goals of the PR you will create, and make sure that the other members of the team are aware of them. +PRs that do not have a clear set of do's and don'ts tend to be bloated and difficult to review. + Also, when you start implementation, assign yourself to the Issue (if you cannot do it yourself, ask another member to assign you). By expressing your intention to work the Issue, you can prevent conflicts in the work. ## Well-known branches @@ -39,6 +42,23 @@ Thank you for your PR! Before creating a PR, please check the following: Thanks for your cooperation 🤗 +## Reviewers guide +Be willing to comment on the good points and not just the things you want fixed đŸ’¯ + +### Review perspective +- Scope + - Are the goals of the PR clear? + - Is the granularity of the PR appropriate? +- Security + - Does merging this PR create a vulnerability? +- Performance + - Will merging this PR cause unexpected performance degradation? + - Is there a more efficient way? +- Testing + - Does the test ensure the expected behavior? + - Are there any omissions or gaps? + - Does it check for anomalies? + ## Localization (l10n) Misskey uses [Crowdin](https://crowdin.com/project/misskey) for localization management. You can improve our translations with your Crowdin account. diff --git a/gulpfile.js b/gulpfile.js index 3bc0b23be..b7aa4e328 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -19,6 +19,10 @@ gulp.task('copy:client:fonts', () => gulp.src('./packages/client/node_modules/three/examples/fonts/**/*').pipe(gulp.dest('./built/_client_dist_/fonts/')) ); +gulp.task('copy:client:fontawesome', () => + gulp.src('./packages/client/node_modules/@fortawesome/fontawesome-free/**/*').pipe(gulp.dest('./built/_client_dist_/fontawesome/')) +); + gulp.task('copy:client:locales', cb => { fs.mkdirSync('./built/_client_dist_/locales', { recursive: true }); @@ -50,7 +54,7 @@ gulp.task('build:backend:style', () => { }); gulp.task('build', gulp.parallel( - 'copy:client:locales', 'copy:backend:views', 'build:backend:script', 'build:backend:style', 'copy:client:fonts' + 'copy:client:locales', 'copy:backend:views', 'build:backend:script', 'build:backend:style', 'copy:client:fonts', 'copy:client:fontawesome' )); gulp.task('default', gulp.task('build')); diff --git a/locales/ar-SA.yml b/locales/ar-SA.yml index 5a053cdee..914a16bb2 100644 --- a/locales/ar-SA.yml +++ b/locales/ar-SA.yml @@ -1110,6 +1110,8 @@ _exportOrImport: blockingList: "اŲ„Ų…ØŗØĒ؎دŲ…ŲˆŲ† اŲ„Ų…Ø­ØŦŲˆØ¨ŲˆŲ†" userLists: "اŲ„Ų‚ŲˆØ§ØĻŲ…" _charts: + federation: "اŲ„ŲØ¯ŲŠØąØ§Ų„ŲŠØŠ" + apRequest: "اŲ„ØˇŲ„باØĒ" usersIncDec: "ا؎ØĒŲ„اŲ ؚدد اŲ„Ų…ØŗØĒ؎دŲ…ŲŠŲ†" usersTotal: "Ų…ØŦŲ…ŲˆØš ؚدد اŲ„Ų…ØŗØĒ؎دŲ…ŲŠŲ† ŲˆØ§Ų„Ų…ØŗØĒ؎دŲ…اØĒ" activeUsers: "اŲ„Ų…ØŗØĒ؎دŲ…ŲˆŲ† اŲ„Ų†Ø´ØˇŲˆŲ†" diff --git a/locales/bn-BD.yml b/locales/bn-BD.yml index 02f18cd1e..fa18a8b3d 100644 --- a/locales/bn-BD.yml +++ b/locales/bn-BD.yml @@ -141,6 +141,8 @@ flagAsBot: "āĻŦāĻŸ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻšāĻŋāĻšā§āĻ¨āĻŋāĻ¤ āĻ•āĻ°ā§āĻ¨" flagAsBotDescription: "āĻāĻ‡ āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸāĻŸāĻŋ āĻ¯āĻĻāĻŋ āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽ āĻĻā§āĻŦāĻžāĻ°āĻž āĻĒāĻ°āĻŋāĻšāĻžāĻ˛āĻŋāĻ¤ āĻšāĻ¯āĻŧ, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻāĻ‡ āĻ…āĻĒāĻļāĻ¨āĻŸāĻŋ āĻšāĻžāĻ˛ā§ āĻ•āĻ°ā§āĻ¨āĨ¤ āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻ…ā§āĻ¯āĻžāĻ•āĻļāĻžāĻ¨ āĻšā§‡āĻ‡āĻ¨āĻŋāĻ‚ āĻ°ā§‹āĻ§ āĻ•āĻ°āĻ¤ā§‡, āĻŽāĻŋāĻ¸ā§āĻ•āĻŋāĻ° āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻĒāĻ°āĻŋāĻšāĻžāĻ˛āĻ¨āĻžāĻ•ā§‡ āĻŦāĻŸ-āĻŦāĻžāĻ¨ā§āĻ§āĻŦ āĻ•āĻ°āĻ¤ā§‡ āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻĄā§‡āĻ­ā§‡āĻ˛āĻĒāĻžāĻ°āĻĻā§‡āĻ° āĻ¸āĻžāĻšāĻžāĻ¯ā§āĻ¯ āĻ•āĻ°āĻ¤ā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻŦāĻŸ āĻ āĻāĻ‡ āĻ…āĻĒāĻļāĻ¨āĻŸāĻŋ āĻšāĻžāĻ˛ā§ āĻ•āĻ°ā§āĻ¨ā§ˇ" flagAsCat: "āĻŦāĻŋā§œāĻžāĻ˛ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻšāĻŋāĻšā§āĻ¨āĻŋāĻ¤ āĻ•āĻ°ā§āĻ¨" flagAsCatDescription: "āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸāĻŸāĻŋāĻ•ā§‡ āĻŦāĻŋā§œāĻžāĻ˛ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻšāĻŋāĻšā§āĻ¨āĻŋāĻ¤ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻĒāĻļāĻ¨āĻŸāĻŋ āĻšāĻžāĻ˛ā§ āĻ•āĻ°ā§āĻ¨āĨ¤" +flagShowTimelineReplies: "āĻŸāĻžāĻ‡āĻŽāĻ˛āĻžāĻ‡āĻ¨ā§‡ āĻ¨ā§‹āĻŸāĻ—ā§āĻ˛āĻŋāĻ° āĻ°āĻŋāĻĒā§āĻ˛āĻžāĻ‡ āĻĻā§‡āĻ–āĻžāĻ¨" +flagShowTimelineRepliesDescription: "āĻšāĻžāĻ˛ā§ āĻ•āĻ°āĻ˛ā§‡, āĻŸāĻžāĻ‡āĻŽāĻ˛āĻžāĻ‡āĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻ¨ā§‹āĻŸ āĻ›āĻžāĻĄāĻŧāĻžāĻ“ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻ…āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻ¨ā§‹āĻŸā§‡āĻ° āĻœāĻŦāĻžāĻŦāĻ—ā§āĻ˛ā§‹ āĻĻā§‡āĻ–āĻžāĻ¯āĻŧāĨ¤" autoAcceptFollowed: "āĻ†āĻĒāĻ¨āĻŋ āĻ¯ā§‡āĻ¸āĻŦ āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖ āĻ•āĻ°ā§‡āĻ¨, āĻ¸ā§āĻŦā§ŸāĻ‚āĻ•ā§āĻ°āĻŋā§ŸāĻ­āĻžāĻŦā§‡ āĻ¤āĻžāĻĻā§‡āĻ° āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖā§‡āĻ° āĻ…āĻ¨ā§āĻ°āĻ§ āĻ¸ā§āĻŦā§€āĻ•āĻžāĻ° āĻ•āĻ°ā§āĻ¨" addAccount: "āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ āĻ¯ā§‹āĻ— āĻ•āĻ°ā§āĻ¨" loginFailed: "āĻĒā§āĻ°āĻŦā§‡āĻļ āĻ•āĻ°āĻž āĻ¯āĻžā§ŸāĻ¨āĻŋ" @@ -297,8 +299,8 @@ disconnectedFromServer: "āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻĨā§‡āĻ•ā§‡ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻŦ reload: "āĻ†āĻŦāĻžāĻ° āĻ˛ā§‹āĻĄ āĻ•āĻ°ā§āĻ¨" doNothing: "āĻ•āĻŋāĻ›ā§ āĻ•āĻ°āĻŦā§‡āĻ¨ āĻ¨āĻž" reloadConfirm: "āĻ†āĻĒāĻ¨āĻŋ āĻ•āĻŋ āĻ°āĻŋāĻ˛ā§‹āĻĄ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ¨?" -watch: "āĻĻā§‡āĻ–ā§āĻ¨" -unwatch: "āĻĻā§‡āĻ–āĻž āĻŦāĻ¨ā§āĻ§ āĻ•āĻ°ā§āĻ¨ " +watch: "āĻŦāĻŋāĻœā§āĻžāĻĒā§āĻ¤āĻŋ āĻĒāĻžāĻ¨" +unwatch: "āĻŦāĻŋāĻœā§āĻžāĻĒā§āĻ¤āĻŋ āĻĒāĻžāĻ“ā§ŸāĻž āĻŦāĻ¨ā§āĻ§ āĻ•āĻ°ā§āĻ¨ " accept: "āĻ…āĻ¨ā§āĻŽā§‹āĻĻāĻ¨" reject: "āĻĒā§āĻ°āĻ¤ā§āĻ¯āĻžāĻ–ā§āĻ¯āĻžāĻ¨" normal: "āĻ¸ā§āĻŦāĻžāĻ­āĻžāĻŦāĻŋāĻ•" @@ -345,6 +347,8 @@ hcaptchaSecretKey: "āĻ¸āĻŋāĻ•ā§āĻ°ā§‡āĻŸ āĻ•ā§€" recaptcha: "reCAPTCHA" enableRecaptcha: "reCAPTCHA āĻšāĻžāĻ˛ā§ āĻ•āĻ°ā§āĻ¨" recaptchaSiteKey: "āĻ¸āĻžāĻ‡āĻŸ āĻ•ā§€" +recaptchaSecretKey: "āĻ¸āĻŋāĻ•ā§āĻ°ā§‡āĻŸ āĻ•ā§€" +avoidMultiCaptchaConfirm: "āĻāĻ•āĻžāĻ§āĻŋāĻ• Captcha āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ˛ā§‡ āĻ¤āĻžāĻ°āĻž āĻĒāĻ°āĻ¸ā§āĻĒāĻ°ā§‡āĻ° āĻ•āĻžāĻœā§‡ āĻŦāĻžāĻ§āĻž āĻĻāĻŋāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻ•āĻŋ āĻ…āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ Captcha āĻ¨āĻŋāĻˇā§āĻ•ā§āĻ°āĻŋāĻ¯āĻŧ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ¨? āĻ†āĻĒāĻ¨āĻŋ 'āĻŦāĻžāĻ¤āĻŋāĻ˛' āĻ•ā§āĻ˛āĻŋāĻ• āĻ•āĻ°āĻžāĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻāĻ•āĻžāĻ§āĻŋāĻ• Captcha āĻšāĻžāĻ˛ā§ āĻ°āĻžāĻ–āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤" antennas: "āĻ…ā§āĻ¯āĻžāĻ¨ā§āĻŸā§‡āĻ¨āĻž" manageAntennas: "āĻ…ā§āĻ¯āĻžāĻ¨ā§āĻŸā§‡āĻ¨āĻž āĻŦā§āĻ¯āĻŦāĻ¸ā§āĻĨāĻžāĻĒāĻ¨āĻž" name: "āĻ¨āĻžāĻŽ" @@ -396,8 +400,56 @@ uploadFolder: "āĻ†āĻĒāĻ˛ā§‹āĻĄā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻĄāĻŋāĻĢāĻ˛ā§āĻŸ āĻĢā§‹āĻ˛ cacheClear: "āĻ•ā§āĻ¯āĻžāĻļ āĻĒāĻ°āĻŋāĻˇā§āĻ•āĻžāĻ° āĻ•āĻ°ā§āĻ¨" markAsReadAllNotifications: "āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻŦāĻŋāĻœā§āĻžāĻĒā§āĻ¤āĻŋāĻ—ā§āĻ˛āĻŋ āĻĒāĻ āĻŋāĻ¤ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻšāĻŋāĻšā§āĻ¨āĻŋāĻ¤ āĻ•āĻ°ā§āĻ¨" markAsReadAllUnreadNotes: "āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ¨ā§‹āĻŸāĻ—ā§āĻ˛āĻŋ āĻĒāĻ āĻŋāĻ¤ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻšāĻŋāĻšā§āĻ¨āĻŋāĻ¤ āĻ•āĻ°ā§āĻ¨" +markAsReadAllTalkMessages: "āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻŽā§‡āĻ¸ā§‡āĻœ āĻĒāĻ āĻŋāĻ¤ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻšāĻŋāĻšā§āĻ¨āĻŋāĻ¤ āĻ•āĻ°ā§āĻ¨" +help: "āĻ¸āĻšāĻžāĻ¯āĻŧāĻ¤āĻž" +inputMessageHere: "āĻāĻ–āĻžāĻ¨ā§‡ āĻŽā§‡āĻ¸ā§‡āĻœ āĻ˛āĻŋāĻ–ā§āĻ¨" +close: "āĻŦāĻ¨ā§āĻ§" +group: "āĻ—ā§āĻ°ā§āĻĒ" +groups: "āĻ—ā§āĻ°ā§āĻĒāĻ¸āĻŽā§‚āĻš" +createGroup: "āĻ—ā§āĻ°ā§āĻĒ āĻ¤ā§ˆāĻ°ā§€ āĻ•āĻ°ā§āĻ¨" +ownedGroups: "āĻ†āĻĒāĻ¨āĻžāĻ° āĻ—ā§āĻ°ā§āĻĒāĻ—ā§āĻ˛āĻŋ" +joinedGroups: "āĻ¯ā§‡āĻ¸āĻŦ āĻ—ā§āĻ°ā§āĻĒā§‡ āĻ†āĻĒāĻ¨āĻŋ āĻ†āĻ›ā§‡āĻ¨" invites: "āĻ†āĻŽāĻ¨ā§āĻ¤ā§āĻ°āĻŖ" +groupName: "āĻ—ā§āĻ°ā§āĻĒā§‡āĻ° āĻ¨āĻžāĻŽ" +members: "āĻ¸āĻĻāĻ¸ā§āĻ¯āĻŦā§ƒāĻ¨ā§āĻĻ" +transfer: "āĻšāĻ¸ā§āĻ¤āĻžāĻ¨ā§āĻ¤āĻ°" +messagingWithUser: "āĻĒā§āĻ°āĻžāĻ‡āĻ­ā§‡āĻŸ āĻšā§āĻ¯āĻžāĻŸ" +messagingWithGroup: "āĻ—ā§āĻ°ā§āĻĒ āĻšā§āĻ¯āĻžāĻŸ" +title: "āĻļāĻŋāĻ°ā§‹āĻ¨āĻžāĻŽ" +text: "āĻĒāĻžāĻ ā§āĻ¯" +enable: "āĻ¸āĻ•ā§āĻ°āĻŋā§Ÿ" +next: "āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§€" +retype: "āĻĒā§āĻ¨āĻƒ āĻĒā§āĻ°āĻŦā§‡āĻļ" +noteOf: "{user} āĻāĻ° āĻ¨ā§‹āĻŸ" +inviteToGroup: "āĻ—ā§āĻ°ā§āĻĒā§‡ āĻ†āĻŽāĻ¨ā§āĻ¤ā§āĻ°āĻŖ āĻœāĻžāĻ¨āĻžāĻ¨" +maxNoteTextLength: "āĻ¨ā§‹āĻŸ āĻāĻ° āĻ¸āĻ°ā§āĻŦā§‹āĻšā§āĻš āĻĻā§ˆāĻ°ā§āĻ˜ā§āĻ¯" +quoteAttached: "āĻ‰āĻĻā§āĻ§ā§ƒāĻ¤" +quoteQuestion: "āĻ‰āĻĻā§āĻ§ā§ƒāĻ¤āĻŋ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻ¸āĻ‚āĻ¯ā§āĻ•ā§āĻ¤ āĻ•āĻ°āĻŦā§‡āĻ¨?" +noMessagesYet: "āĻ•ā§‹āĻ¨ āĻŽā§‡āĻ¸ā§‡āĻœ āĻ¨ā§‡āĻ‡" +newMessageExists: "āĻ¨āĻ¤ā§āĻ¨ āĻŽā§‡āĻ¸ā§‡āĻœ āĻĒā§‡ā§Ÿā§‡āĻ›ā§‡āĻ¨" +onlyOneFileCanBeAttached: "āĻ†āĻĒāĻ¨āĻŋ āĻŽā§‡āĻ¸ā§‡āĻœā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻ°ā§āĻŦā§‹āĻšā§āĻš āĻāĻ•āĻŸāĻŋ āĻĢāĻžāĻ‡āĻ˛ āĻ¯ā§āĻ•ā§āĻ¤ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŦā§‡āĻ¨" +signinRequired: "āĻĻāĻ¯āĻŧāĻž āĻ•āĻ°ā§‡ āĻ˛āĻ— āĻ‡āĻ¨ āĻ•āĻ°ā§āĻ¨" invitations: "āĻ†āĻŽāĻ¨ā§āĻ¤ā§āĻ°āĻŖ" +invitationCode: "āĻ‡āĻ¨āĻ­āĻžāĻ‡āĻŸ āĻ•ā§‹āĻĄ" +checking: "āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡..." +available: "āĻ‰āĻĒāĻ˛āĻŦā§āĻ§" +unavailable: "āĻ…āĻ¨ā§āĻĒāĻ˛āĻŦā§āĻ§" +usernameInvalidFormat: "āĻ†āĻĒāĻ¨āĻŋ āĻ•ā§‡āĻŦāĻ˛āĻŽāĻžāĻ¤ā§āĻ° a-z, A-Z, 0-9, _ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨" +tooShort: "āĻ–ā§āĻŦ āĻ›ā§‹āĻŸ" +tooLong: "āĻ–ā§āĻŦ āĻŦā§œ" +weakPassword: "āĻĻā§āĻ°ā§āĻŦāĻ˛ āĻĒāĻžāĻ¸āĻ“ā§ŸāĻžāĻ°ā§āĻĄ" +normalPassword: "āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻĒāĻžāĻ¸āĻ“ā§ŸāĻžāĻ°ā§āĻĄ" +strongPassword: "āĻļāĻ•ā§āĻ¤āĻŋāĻļāĻžāĻ˛ā§€ āĻĒāĻžāĻ¸āĻ“ā§ŸāĻžāĻ°ā§āĻĄ" +passwordMatched: "āĻŽāĻŋāĻ˛ā§‡āĻ›ā§‡" +passwordNotMatched: "āĻŽāĻŋāĻ˛ā§‡āĻ¨āĻŋ" +signinWith: "{x} āĻāĻ° āĻ¸āĻžāĻšāĻžāĻ¯ā§āĻ¯ā§‡ āĻ¸āĻžāĻ‡āĻ¨ āĻ‡āĻ¨ āĻ•āĻ°ā§āĻ¨" +signinFailed: "āĻ˛āĻ— āĻ‡āĻ¨ āĻ•āĻ°āĻž āĻ¯āĻžāĻ¯āĻŧāĻ¨āĻŋāĨ¤ āĻ†āĻĒāĻ¨āĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻ¨āĻžāĻŽ āĻāĻŦāĻ‚ āĻĒāĻžāĻ¸āĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻĄ āĻšā§‡āĻ• āĻ•āĻ°ā§āĻ¨." +tapSecurityKey: "āĻ¸āĻŋāĻ•āĻŋāĻ‰āĻ°āĻŋāĻŸāĻŋ āĻ•ā§€ āĻ¸ā§āĻĒāĻ°ā§āĻļ āĻ•āĻ°ā§āĻ¨" +or: "āĻ…āĻĨāĻŦāĻž" +language: "āĻ­āĻžāĻˇāĻž" +uiLanguage: "UI āĻāĻ° āĻ­āĻžāĻˇāĻž" +groupInvited: "āĻ†āĻĒāĻ¨āĻŋ āĻāĻ•āĻŸāĻŋ āĻ—ā§āĻ°ā§āĻĒā§‡ āĻ†āĻŽāĻ¨ā§āĻ¤ā§āĻ°āĻŋāĻ¤ āĻšā§Ÿā§‡āĻ›ā§‡āĻ¨" +aboutX: "{x} āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡" useOsNativeEmojis: "āĻ…āĻĒāĻžāĻ°ā§‡āĻŸāĻŋāĻ‚ āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āĻ° āĻ¨ā§‡āĻŸāĻŋāĻ­ āĻ‡āĻŽā§‹āĻœāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§āĻ¨" disableDrawer: "āĻĄā§āĻ°āĻ¯āĻŧāĻžāĻ° āĻŽā§‡āĻ¨ā§ āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻ¨ āĻ•āĻ°āĻŦā§‡āĻ¨ āĻ¨āĻž" youHaveNoGroups: "āĻ†āĻĒāĻ¨āĻžāĻ° āĻ•ā§‹āĻ¨ āĻ—ā§āĻ°ā§āĻĒ āĻ¨ā§‡āĻ‡ " @@ -428,37 +480,704 @@ promotion: "āĻĒā§āĻ°āĻŽā§‹āĻļāĻ¨" promote: "āĻĒā§āĻ°āĻšāĻžāĻ° āĻ•āĻ°ā§āĻ¨" numberOfDays: "āĻĻāĻŋāĻ¨ā§‡āĻ° āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž" hideThisNote: "āĻ¨ā§‹āĻŸāĻŸāĻŋ āĻ˛ā§āĻ•āĻžāĻ¨" +showFeaturedNotesInTimeline: "āĻŸāĻžāĻ‡āĻŽāĻ˛āĻžāĻ‡āĻ¨ā§‡ āĻ¸ā§āĻĒāĻžāĻ°āĻŋāĻļāĻ•ā§ƒāĻ¤ āĻ¨ā§‹āĻŸāĻ—ā§āĻ˛āĻŋ āĻĻā§‡āĻ–āĻžāĻ¨" +objectStorage: "āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸ āĻ¸ā§āĻŸā§‹āĻ°ā§‡āĻœ" +useObjectStorage: "āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸ āĻ¸ā§āĻŸā§‹āĻ°ā§‡āĻœ āĻŦā§āĻ¯āĻžāĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§āĻ¨" +objectStorageBaseUrl: "Base URL" +objectStorageBaseUrlDesc: "āĻ°ā§‡āĻĢāĻžāĻ°ā§‡āĻ¨ā§āĻ¸ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻŦā§āĻ¯āĻŦāĻšā§ƒāĻ¤ URLāĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻāĻ•āĻŸāĻŋ CDN āĻŦāĻž āĻĒā§āĻ°āĻ•ā§āĻ¸āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ˛ā§‡ URL, S3: 'https://.s3.amazonaws.com', GCS: 'https://storage.googleapis.com/'āĨ¤" +objectStorageBucket: "Bucket" +objectStorageBucketDesc: "āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻžāĻ° bucket āĻāĻ° āĻ¨āĻžāĻŽ āĻ˛āĻŋāĻ–ā§āĻ¨āĨ¤ " +objectStoragePrefix: "Prefix" +objectStoragePrefixDesc: "āĻĢāĻžāĻ‡āĻ˛āĻ¸āĻŽā§‚āĻš āĻāĻ‡ prefix āĻ¯ā§āĻ•ā§āĻ¤ āĻĢā§‹āĻ˛ā§āĻĄāĻžāĻ°ā§‡āĻ° āĻ…āĻ§ā§€āĻ¨ā§‡ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻž āĻšāĻŦā§‡āĨ¤" +objectStorageEndpoint: "āĻāĻ¨ā§āĻĄāĻĒā§Ÿā§‡āĻ¨ā§āĻŸ" +objectStorageEndpointDesc: "S3 āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻĢāĻžāĻāĻ•āĻž āĻ°āĻžāĻ–ā§āĻ¨, āĻ…āĻ¨ā§āĻ¯āĻĨāĻžāĻ¯āĻŧ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻžāĻ° āĻāĻ¨ā§āĻĄāĻĒā§Ÿā§‡āĻ¨ā§āĻŸ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ•āĻ°ā§āĻ¨āĨ¤ ''āĻŦāĻž': ' āĻšāĻŋāĻ¸ā§‡āĻŦā§‡ āĻ˛āĻŋāĻ–ā§āĻ¨āĨ¤" +objectStorageRegion: "Region" +objectStorageRegionDesc: "'xx-east-1'-āĻāĻ° āĻŽāĻ¤ā§‹ āĻāĻ•āĻŸāĻŋ region āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ•āĻ°ā§āĻ¨āĨ¤ āĻ¯āĻĻāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ° āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻžāĻ¤ā§‡ region āĻāĻ° āĻ§āĻžāĻ°āĻŖāĻž āĻ¨āĻž āĻĨāĻžāĻ•ā§‡, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻāĻŸāĻŋ āĻ–āĻžāĻ˛āĻŋ āĻŦāĻž 'us-east-1' āĻšāĻ“āĻ¯āĻŧāĻž āĻ‰āĻšāĻŋāĻ¤āĨ¤" +objectStorageUseSSL: "SSL āĻŦā§āĻ¯āĻžāĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§āĻ¨" +objectStorageUseSSLDesc: "API āĻ•āĻžāĻ¨ā§‡āĻ•āĻļāĻ¨āĻ—ā§āĻ˛āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¯āĻĻāĻŋ https āĻŦā§āĻ¯āĻžāĻŦāĻšāĻžāĻ° āĻ¨āĻž āĻ•āĻ°ā§‡āĻ¨, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻāĻ‡ āĻ…āĻĒāĻļāĻ¨āĻŸāĻŋ āĻŦāĻ¨ā§āĻ§ āĻ•āĻ°ā§āĻ¨" +objectStorageUseProxy: "Proxy āĻŦā§āĻ¯āĻžāĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§āĻ¨" +objectStorageUseProxyDesc: "āĻ†āĻĒāĻ¨āĻŋ API āĻ¸āĻ‚āĻ¯ā§‹āĻ—ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ proxy āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ¨āĻž āĻ•āĻ°āĻ˛ā§‡, āĻāĻŸāĻŋ āĻŦāĻ¨ā§āĻ§ āĻ•āĻ°ā§āĻ¨āĨ¤" +objectStorageSetPublicRead: "āĻ†āĻĒāĻ˛ā§‹āĻĄā§‡āĻ° āĻ‰āĻĒāĻ° ''public-read' āĻ¸ā§‡āĻŸ āĻ•āĻ°ā§āĻ¨" +serverLogs: "āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻ˛āĻ—" +deleteAll: "āĻ¸āĻŦ āĻŽā§āĻ›ā§āĻ¨" +showFixedPostForm: "āĻŸāĻžāĻ‡āĻŽāĻ˛āĻžāĻ‡āĻ¨ā§‡āĻ° āĻļā§€āĻ°ā§āĻˇā§‡ āĻĒā§‹āĻ¸ā§āĻŸ āĻ•āĻ°āĻžāĻ° āĻĢāĻ°ā§āĻŽāĻŸāĻŋ āĻĻā§‡āĻ–āĻžāĻ¨" +newNoteRecived: "āĻ¨āĻ¤ā§āĻ¨ āĻ¨ā§‹āĻŸ āĻ†āĻ›ā§‡" +sounds: "āĻļāĻŦā§āĻĻ" +listen: "āĻļā§āĻ¨ā§āĻ¨" +none: "āĻ•āĻŋāĻ›ā§āĻ‡ āĻ¨āĻž" +showInPage: "āĻĒā§‡āĻœā§‡ āĻĻā§‡āĻ–āĻžāĻ¨" +popout: "āĻĒāĻĒ-āĻ†āĻ‰āĻŸ" +volume: "āĻ†āĻ“ā§ŸāĻžāĻœā§‡āĻ° āĻŽāĻžāĻ¤ā§āĻ°āĻž" +masterVolume: "āĻŽāĻžāĻ¸ā§āĻŸāĻžāĻ° āĻ†āĻ“ā§ŸāĻžāĻœā§‡āĻ° āĻŽāĻžāĻ¤ā§āĻ°āĻž" +details: "āĻ†āĻ°āĻ“ āĻœāĻžāĻ¨ā§āĻ¨" +chooseEmoji: "āĻ‡āĻŽā§‹āĻœāĻŋ āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻšāĻ¨ āĻ•āĻ°ā§āĻ¨" +unableToProcess: "āĻ•āĻžāĻœāĻŸāĻŋ āĻ¸āĻŽā§āĻĒāĻ¨ā§āĻ¨ āĻ•āĻ°āĻž āĻ¯āĻžā§ŸāĻ¨āĻŋ" +recentUsed: "āĻ¸āĻŽā§āĻĒā§āĻ°āĻ¤āĻŋ āĻŦā§āĻ¯āĻŦāĻšā§ƒāĻ¤" +install: "āĻ‡āĻ¨ā§āĻ¸āĻŸāĻ˛" +uninstall: "āĻ†āĻ¨āĻ‡āĻ¨ā§āĻ¸āĻŸāĻ˛" +installedApps: "āĻ‡āĻ¨ā§āĻ¸āĻŸāĻ˛ āĻ•āĻ°āĻž āĻ…ā§āĻ¯āĻžāĻĒāĻ¸āĻŽā§‚āĻš" +nothing: "āĻāĻ–āĻžāĻ¨ā§‡ āĻ•āĻŋāĻ›ā§āĻ‡ āĻ¨āĻžāĻ‡" +installedDate: "āĻ‡āĻ¨ā§āĻ¸āĻŸāĻ˛ āĻ•āĻ°āĻžāĻ° āĻ¤āĻžāĻ°āĻŋāĻ–" +lastUsedDate: "āĻ¸āĻ°ā§āĻŦāĻļā§‡āĻˇ āĻŦā§āĻ¯āĻžāĻŦāĻšā§ƒāĻ¤" +state: "āĻ…āĻŦāĻ¸ā§āĻĨāĻž" +sort: "āĻ¸āĻžāĻœāĻžāĻ¨" +ascendingOrder: "āĻŠāĻ°ā§āĻ§ā§āĻŦāĻ•ā§āĻ°āĻŽā§‡" +descendingOrder: "āĻ¨āĻŋāĻŽā§āĻ¨āĻ•ā§āĻ°āĻŽā§‡" +scratchpad: "āĻ¸ā§āĻ•ā§āĻ°ā§āĻ¯āĻžāĻšāĻĒā§āĻ¯āĻžāĻĄ" +scratchpadDescription: "āĻ¸ā§āĻ•ā§āĻ°ā§āĻ¯āĻžāĻšāĻĒā§āĻ¯āĻžāĻĄ AiScript-āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻŽā§‚āĻ˛āĻ• āĻĒāĻ°āĻŋāĻŦā§‡āĻļ āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°ā§‡āĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻŽāĻŋāĻ¸ā§āĻ•āĻŋāĻ° āĻ¸āĻžāĻĨā§‡ āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻ…ā§āĻ¯āĻžāĻ•ā§āĻŸ āĻ•āĻ°ā§‡ āĻāĻŽāĻ¨ āĻ•ā§‹āĻĄ āĻ˛āĻŋāĻ–āĻ¤ā§‡, āĻšāĻžāĻ˛āĻžāĻ¤ā§‡ āĻāĻŦāĻ‚ āĻ¤āĻžāĻ° āĻĢāĻ˛āĻžāĻĢāĻ˛ āĻĻā§‡āĻ–āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤" +output: "āĻ†āĻ‰āĻŸāĻĒā§āĻŸ" +script: "āĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ" +disablePagesScript: "āĻĒā§‡āĻœāĻ—ā§āĻ˛ā§‹āĻ¤ā§‡ AiScript āĻ…āĻ•ā§āĻˇāĻŽ āĻ•āĻ°ā§āĻ¨" +updateRemoteUser: "āĻ°āĻŋāĻŽā§‹āĻŸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻ¤āĻĨā§āĻ¯ āĻ†āĻĒāĻĄā§‡āĻŸ āĻ•āĻ°ā§āĻ¨" +deleteAllFiles: "āĻ¸āĻ•āĻ˛ āĻĢāĻžāĻ‡āĻ˛ āĻĄāĻŋāĻ˛āĻŋāĻŸ āĻ•āĻ°ā§āĻ¨" +deleteAllFilesConfirm: "āĻ¸āĻ•āĻ˛ āĻĢāĻžāĻ‡āĻ˛ āĻĄāĻŋāĻ˛āĻŋāĻŸ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ¨?" +removeAllFollowing: "āĻ¸āĻ•āĻ˛ āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖ āĻŦāĻžāĻ¤āĻŋāĻ˛ āĻ•āĻ°ā§āĻ¨" +removeAllFollowingDescription: "{host} āĻāĻ° āĻ¸āĻ•āĻ˛ āĻŦā§āĻ¯āĻžāĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ•ā§‡ āĻ†āĻ° āĻĢāĻ˛ā§‹āĻ“ āĻ•āĻ°āĻŦā§‡āĻ¨ āĻ¨āĻž āĨ¤ āĻ¯āĻĻāĻŋ āĻ‡āĻ¨ā§āĻ¸āĻ¤ā§āĻ¯āĻžāĻ¨ā§āĻ¸āĻŸāĻŋāĻ° āĻ•ā§‹āĻ¨ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž (āĻ¯ā§‡āĻŽāĻ¨āĻƒ āĻ‡āĻ¨ā§āĻ¸āĻ¤ā§āĻ¯āĻžāĻ¨ā§āĻ¸āĻŸāĻŋ āĻ†āĻ° āĻ¨ā§‡āĻ‡) āĻšā§Ÿā§‡ āĻĨāĻžāĻ•ā§‡ āĻ¤āĻŦā§‡ āĻāĻŸāĻŋ āĻŦā§āĻ¯āĻžāĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§āĻ¨ āĨ¤ " +userSuspended: "āĻāĻ‡ āĻŦā§āĻ¯āĻžāĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°āĻŋāĻ° āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ āĻ¸ā§āĻĨāĻ—āĻŋāĻ¤ āĻ•āĻ°āĻž āĻšā§Ÿā§‡āĻ›ā§‡" +userSilenced: "āĻāĻ‡ āĻŦā§āĻ¯āĻžāĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°āĻŋāĻ•ā§‡ āĻŽāĻŋāĻ‰āĻŸ āĻ•āĻ°āĻž āĻšā§Ÿā§‡āĻ›ā§‡" +yourAccountSuspendedTitle: "āĻāĻ‡ āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸāĻŸāĻŋ āĻ¸ā§āĻĨāĻ—āĻŋāĻ¤ āĻ•āĻ°āĻž āĻšā§Ÿā§‡āĻ›ā§‡" +yourAccountSuspendedDescription: "āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡āĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°ā§‡āĻ° āĻļāĻ°ā§āĻ¤āĻžāĻŦāĻ˛ā§€ āĻ˛āĻ™ā§āĻ˜āĻ¨ā§‡āĻ° āĻŽāĻ¤ā§‹ āĻ•āĻžāĻ°āĻŖā§‡ āĻāĻ‡ āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸāĻŸāĻŋ āĻ¸ā§āĻĨāĻ—āĻŋāĻ¤ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡ā§ˇ āĻŦāĻŋāĻ¸ā§āĻ¤āĻžāĻ°āĻŋāĻ¤ āĻœāĻžāĻ¨āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻĒā§āĻ°āĻļāĻžāĻ¸āĻ•ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¯ā§‹āĻ—āĻžāĻ¯ā§‹āĻ— āĻ•āĻ°ā§āĻ¨ āĨ¤ āĻāĻ•āĻŸāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻŦā§‡āĻ¨ āĻ¨āĻž āĻĻāĻ¯āĻŧāĻž āĻ•āĻ°ā§‡ āĨ¤" +menu: "āĻŽā§‡āĻ¨ā§" +divider: "āĻ–āĻ¨ā§āĻĄāĻ•" +addItem: "āĻ†āĻ‡āĻŸā§‡āĻŽ āĻ¯ā§‹āĻ— āĻ•āĻ°ā§āĻ¨" +relays: "āĻ°āĻŋāĻ˛ā§‡āĻ—ā§āĻ˛āĻŋ" +addRelay: "āĻ°āĻŋāĻ˛ā§‡ āĻ¯ā§‹āĻ— āĻ•āĻ°ā§āĻ¨" +inboxUrl: "inbox āĻāĻ° URL" +addedRelays: "āĻ¯ā§‹āĻ—āĻ•ā§ƒāĻ¤ āĻ°āĻŋāĻ˛ā§‡āĻ—ā§āĻ˛āĻŋ" +serviceworkerInfo: "āĻĒā§āĻļ āĻŦāĻŋāĻœā§āĻžāĻĒā§āĻ¤āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻšāĻžāĻ˛ā§ āĻ•āĻ°āĻž āĻ˛āĻžāĻ—āĻŦā§‡āĨ¤" +deletedNote: "āĻĄāĻŋāĻ˛āĻŋāĻŸ āĻ•āĻ°āĻž āĻ¨ā§‹āĻŸ" +invisibleNote: "āĻ…āĻĻā§ƒāĻļā§āĻ¯ āĻ¨ā§‹āĻŸ" +enableInfiniteScroll: "āĻ‡āĻ¨āĻĢāĻŋāĻ¨āĻŋāĻŸ āĻ¸ā§āĻ•ā§āĻ°āĻ˛ āĻšāĻžāĻ˛ā§ āĻ•āĻ°ā§āĻ¨" +visibility: "āĻĻā§ƒāĻļā§āĻ¯āĻŽāĻžāĻ¨āĻ¤āĻž" +poll: "āĻœāĻ°āĻŋāĻĒ" +useCw: "āĻ•āĻ¨ā§āĻŸā§‡āĻ¨ā§āĻŸ āĻ˛ā§āĻ•āĻžāĻ¨" +enablePlayer: "āĻ­āĻŋāĻĄāĻŋāĻ“ āĻĒā§āĻ˛ā§‡ā§ŸāĻžāĻ° āĻ–ā§āĻ˛ā§āĻ¨" +disablePlayer: "āĻ­āĻŋāĻĄāĻŋāĻ“ āĻĒā§āĻ˛ā§‡ā§ŸāĻžāĻ° āĻŦāĻ¨ā§āĻ§ āĻ•āĻ°ā§āĻ¨" +expandTweet: "āĻŸā§āĻ‡āĻŸ āĻŦāĻŋāĻ¸ā§āĻ¤āĻžāĻ°āĻŋāĻ¤ āĻ•āĻ°ā§āĻ¨" +themeEditor: "āĻĨāĻŋāĻŽ āĻ¸āĻŽā§āĻĒāĻžāĻĻāĻ•" +description: "āĻŦāĻ°ā§āĻŖāĻ¨āĻž" +describeFile: "āĻ•ā§āĻ¯āĻžāĻĒāĻļāĻ¨ āĻ¯ā§‹āĻ— āĻ•āĻ°ā§āĻ¨" +enterFileDescription: "āĻ•ā§āĻ¯āĻžāĻĒāĻļāĻ¨ āĻ¯ā§‹āĻ— āĻ•āĻ°ā§āĻ¨" +author: "āĻ˛ā§‡āĻ–āĻ•" +leaveConfirm: "āĻ•āĻŋāĻ›ā§ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ¸ā§‡āĻ­ āĻ•āĻ°āĻž āĻšā§ŸāĻ¨āĻŋāĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻ•āĻŋ āĻšāĻ˛ā§‡ āĻ¯ā§‡āĻ¤ā§‡ āĻšāĻžāĻ¨?" +manage: "āĻĒāĻ°āĻŋāĻšāĻžāĻ˛āĻ¨āĻž" +plugins: "āĻĒā§āĻ˛āĻžāĻ—āĻ‡āĻ¨āĻ¸āĻŽā§‚āĻš" +deck: "āĻĄā§‡āĻ•" +undeck: "āĻĄā§‡āĻ•āĻŽā§āĻ•ā§āĻ¤ āĻ•āĻ°ā§āĻ¨" +useBlurEffectForModal: "āĻŽā§‹āĻĄāĻžāĻ˛ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻŦā§āĻ˛āĻžāĻ° āĻ‡āĻĢā§‡āĻ•ā§āĻŸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§āĻ¨" +useFullReactionPicker: "āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻŦā§ˆāĻļāĻŋāĻˇā§āĻŸā§āĻ¯āĻ¯ā§āĻ•ā§āĻ¤ āĻ°āĻŋāĻ…ā§āĻ¯āĻžāĻ•āĻļāĻ¨ āĻĒāĻŋāĻ•āĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§āĻ¨" +width: "āĻĒā§āĻ°āĻ¸ā§āĻĨ" +height: "āĻ‰āĻšā§āĻšāĻ¤āĻž" +large: "āĻŦā§œ" +medium: "āĻŽāĻžāĻāĻžāĻ°āĻŋ" +small: "āĻ›ā§‹āĻŸ" +generateAccessToken: "āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ āĻŸā§‹āĻ•ā§‡āĻ¨ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨" +permission: "āĻ…āĻ¨ā§āĻŽāĻ¤āĻŋ" +enableAll: "āĻ¸āĻŦāĻ—ā§āĻ˛āĻŋ āĻ¸āĻ•ā§āĻ°āĻŋā§Ÿ āĻ•āĻ°ā§āĻ¨" +disableAll: "āĻ¸āĻŦāĻ—ā§āĻ˛āĻŋ āĻ¨āĻŋāĻˇā§āĻ•ā§āĻ°āĻŋā§Ÿ āĻ•āĻ°ā§āĻ¨" +tokenRequested: "āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸā§‡ āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°āĻŦā§‡āĻ¨" +pluginTokenRequestedDescription: "āĻāĻ‡ āĻĒā§āĻ˛āĻžāĻ—āĻ‡āĻ¨āĻŸāĻŋ āĻāĻ–āĻžāĻ¨ā§‡ āĻĻā§‡āĻ“ā§ŸāĻž āĻ…āĻ¨ā§āĻŽā§āĻ¤āĻŋāĻ¸āĻŽā§‚āĻš āĻŦā§āĻ¯āĻžāĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŦā§‡" +notificationType: "āĻŦāĻŋāĻœā§āĻžāĻĒā§āĻ¤āĻŋāĻ° āĻ§āĻ°āĻ¨" +edit: "āĻ¸āĻŽā§āĻĒāĻžāĻĻāĻ¨āĻž" +useStarForReactionFallback: "āĻ°āĻŋāĻ…ā§āĻ¯āĻžāĻ•āĻļāĻ¨ā§‡āĻ° āĻ‡āĻŽā§‹āĻœāĻŋ āĻ¨āĻž āĻœāĻžāĻ¨āĻ˛ā§‡ ★ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§āĻ¨" +emailServer: "āĻ‡āĻŽā§‡āĻ‡āĻ˛ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°" +enableEmail: "āĻ‡āĻŽā§‡āĻ‡āĻ˛ āĻŦāĻŋāĻ¤āĻ°āĻŖ āĻšāĻžāĻ˛ā§ āĻ•āĻ°ā§āĻ¨" +emailConfigInfo: "āĻ†āĻĒāĻ¨āĻžāĻ° āĻ‡āĻŽā§‡āĻ˛ āĻ āĻŋāĻ•āĻžāĻ¨āĻž āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤ āĻ•āĻ°āĻ¤ā§‡ āĻāĻŦāĻ‚ āĻ†āĻĒāĻ¨āĻžāĻ° āĻĒāĻžāĻ¸āĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻĄ āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻ¤ā§‡ āĻŦā§āĻ¯āĻŦāĻšā§ƒāĻ¤ āĻšāĻ¯āĻŧ" +email: "āĻ‡āĻŽā§‡āĻ‡āĻ˛" +emailAddress: "āĻ‡āĻŽā§‡āĻ‡āĻ˛ āĻ āĻŋāĻ•āĻžāĻ¨āĻž" +smtpConfig: "SMTP āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨" smtpHost: "āĻšā§‹āĻ¸ā§āĻŸ" +smtpPort: "āĻĒā§‹āĻ°ā§āĻŸ" smtpUser: "āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻ¨āĻžāĻŽ" smtpPass: "āĻĒāĻžāĻ¸āĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻĄ" +emptyToDisableSmtpAuth: "āĻ†āĻĒāĻ¨āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻ¨āĻžāĻŽ āĻāĻŦāĻ‚ āĻĒāĻžāĻ¸āĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻĄ āĻĢāĻžāĻāĻ•āĻž āĻ°ā§‡āĻ–ā§‡ SMTP āĻĒā§āĻ°āĻŽāĻžāĻŖā§€āĻ•āĻ°āĻŖ āĻ¨āĻŋāĻˇā§āĻ•ā§āĻ°āĻŋāĻ¯āĻŧ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤" +smtpSecure: "SMTP āĻ¸āĻ‚āĻ¯ā§‹āĻ—ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ SSL/TLS āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§āĻ¨" +smtpSecureInfo: "STARTTLS āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻāĻŸāĻŋ āĻŦāĻ¨ā§āĻ§ āĻ•āĻ°ā§āĻ¨āĨ¤" +testEmail: "āĻ‡āĻŽā§‡āĻ˛ āĻŦāĻŋāĻ¤āĻ°āĻŖ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°ā§āĻ¨" +wordMute: "āĻŦāĻŋāĻļā§‡āĻˇ āĻ•ā§‹āĻ¨ āĻļāĻŦā§āĻĻāĻ•ā§‡ āĻŽāĻŋāĻ‰āĻŸ āĻ•āĻ°ā§āĻ¨" +instanceMute: "āĻŽāĻŋāĻ‰āĻŸ āĻ•āĻ°āĻž āĻ‡āĻ¨ā§āĻ¸āĻ¤ā§āĻ¯āĻžāĻ¨ā§āĻ¸āĻ—ā§āĻ˛āĻŋ" +userSaysSomething: "{name} āĻ•āĻŋāĻ›ā§ āĻŦāĻ˛ā§‡āĻ›ā§‡" +makeActive: "āĻ¸āĻ•ā§āĻ°āĻŋāĻ¯āĻŧ āĻ•āĻ°āĻž" +display: "āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻ¨" +copy: "āĻ…āĻ¨ā§āĻ˛āĻŋāĻĒāĻŋ" +metrics: "āĻŽā§‡āĻŸā§āĻ°āĻŋāĻ•ā§āĻ¸" +overview: "āĻ¸āĻžāĻ°āĻžāĻ‚āĻļ" +logs: "āĻ˛āĻ—" +delayed: "āĻĻā§‡āĻ°āĻŋ āĻ•āĻ°ā§āĻ¨" +database: "āĻĄā§‡āĻŸāĻžāĻŦā§‡āĻœ" +channel: "āĻšā§āĻ¯āĻžāĻ¨ā§‡āĻ˛āĻ—ā§āĻ˛āĻŋ" +create: "āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨" +notificationSetting: "āĻŦāĻŋāĻœā§āĻžāĻĒā§āĻ¤āĻŋāĻ° āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸" +notificationSettingDesc: "āĻ•āĻŋ āĻ§āĻ°āĻ¨ā§‡āĻ° āĻŦāĻŋāĻœā§āĻžāĻĒā§āĻ¤āĻŋ āĻĒāĻžāĻŦā§‡āĻ¨ āĻ¤āĻž āĻ¨āĻŋāĻ°ā§āĻ§āĻžāĻ°āĻŖ āĻ•āĻ°ā§āĻ¨" +useGlobalSetting: "āĻ—ā§āĻ˛ā§‹āĻŦāĻžāĻ˛ āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸ āĻŦā§āĻ¯āĻžāĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§āĻ¨" +useGlobalSettingDesc: "āĻšāĻžāĻ˛ā§ āĻ•āĻ°āĻ˛ā§‡, āĻ†āĻĒāĻ¨āĻžāĻ° āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸā§‡āĻ° āĻŦāĻŋāĻœā§āĻžāĻĒā§āĻ¤āĻŋ āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻšāĻŦā§‡āĨ¤ āĻŦāĻ¨ā§āĻ§ āĻ•āĻ°āĻ˛ā§‡, āĻāĻŸāĻŋ āĻĒā§ƒāĻĨāĻ•āĻ­āĻžāĻŦā§‡ āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤" +other: "āĻ…āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯" +regenerateLoginToken: "āĻ˛āĻ—āĻ‡āĻ¨ āĻŸā§‹āĻ•ā§‡āĻ¨ āĻ†āĻŦāĻžāĻ° āĻŦāĻžāĻ¨āĻžāĻ¨" +regenerateLoginTokenDescription: "āĻ˛āĻ— āĻ‡āĻ¨ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻŦā§āĻ¯āĻŦāĻšā§ƒāĻ¤ āĻ…āĻ­ā§āĻ¯āĻ¨ā§āĻ¤āĻ°ā§€āĻŖ āĻŸā§‹āĻ•ā§‡āĻ¨ āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡āĨ¤ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ¤ āĻ†āĻĒāĻ¨āĻžāĻ° āĻāĻŸāĻŋ āĻ•āĻ°āĻžāĻ° āĻĻāĻ°āĻ•āĻžāĻ° āĻ¨ā§‡āĻ‡āĨ¤ āĻāĻŸāĻŋ āĻ•āĻ°āĻ˛ā§‡, āĻ†āĻĒāĻ¨āĻŋ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻĄāĻŋāĻ­āĻžāĻ‡āĻ¸ā§‡ āĻ˛āĻ— āĻ†āĻ‰āĻŸ āĻšāĻ¯āĻŧā§‡ āĻ¯āĻžāĻŦā§‡āĻ¨ā§ˇ" +setMultipleBySeparatingWithSpace: "āĻ†āĻĒāĻ¨āĻŋ āĻāĻ•āĻŸāĻŋ āĻ¸ā§āĻĒā§‡āĻ¸ āĻĻāĻŋāĻ¯āĻŧā§‡ āĻ†āĻ˛āĻžāĻĻāĻž āĻ•āĻ°ā§‡ āĻāĻ•āĻžāĻ§āĻŋāĻ• āĻāĻ¨ā§āĻŸā§āĻ°āĻŋ āĻĻāĻŋāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤" +fileIdOrUrl: "āĻĢāĻžāĻ‡āĻ˛ ID āĻ…āĻĨāĻŦāĻž URL" +behavior: "āĻ†āĻšāĻ°āĻŖ" +sample: "āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ" +abuseReports: "āĻ…āĻ­āĻŋāĻ¯ā§‹āĻ—" +reportAbuse: "āĻ…āĻ­āĻŋāĻ¯ā§‹āĻ—" +reportAbuseOf: "{name} āĻ āĻ…āĻ­āĻŋāĻ¯ā§‹āĻ— āĻ•āĻ°ā§āĻ¨" +fillAbuseReportDescription: "āĻ°āĻŋāĻĒā§‹āĻ°ā§āĻŸā§‡āĻ° āĻ•āĻžāĻ°āĻŖ āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻ•āĻ°ā§āĻ¨. āĻāĻ•āĻŸāĻŋ āĻŦāĻŋāĻļā§‡āĻˇ āĻ¨ā§‹āĻŸ āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻ°āĻŋāĻĒā§‹āĻ°ā§āĻŸāĻŸāĻŋ āĻšā§Ÿā§‡ āĻĨāĻžāĻ•ā§‡ āĻ¤āĻŦā§‡ āĻ¤āĻžāĻ° URL āĻŸāĻŋ āĻ…āĻ¨ā§āĻ¤āĻ°ā§āĻ­ā§āĻ•ā§āĻ¤ āĻ•āĻ°ā§āĻ¨āĨ¤ " +abuseReported: "āĻ†āĻĒāĻ¨āĻžāĻ° āĻ…āĻ­āĻŋāĻ¯ā§‹āĻ—āĻŸāĻŋ āĻĻāĻžāĻ–āĻŋāĻ˛ āĻ•āĻ°āĻž āĻšā§Ÿā§‡āĻ›ā§‡āĨ¤ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ§āĻ¨ā§āĻ¯āĻŦāĻžāĻĻāĨ¤" +reporter: "āĻ…āĻ­āĻŋāĻ¯ā§‹āĻ—āĻ•āĻžāĻ°ā§€" +reporteeOrigin: "āĻ…āĻ­āĻŋāĻ¯ā§‹āĻ—āĻŸāĻŋāĻ° āĻ‰ā§ŽāĻ¸" +reporterOrigin: "āĻ…āĻ­āĻŋāĻ¯ā§‹āĻ—āĻ•āĻžāĻ°ā§€āĻ° āĻ‰ā§ŽāĻ¸" +forwardReport: "āĻ°āĻŋāĻŽā§‹āĻŸ āĻ‡āĻ¨ā§āĻ¸āĻ¤ā§āĻ¯āĻžāĻ¨ā§āĻ¸ā§‡ āĻ…āĻ­āĻŋāĻ¯ā§‹āĻ—āĻŸāĻŋ āĻĒāĻžāĻ āĻžāĻ¨" +forwardReportIsAnonymous: "āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¤āĻĨā§āĻ¯ āĻ°āĻŋāĻŽā§‹āĻŸ āĻ‡āĻ¨ā§āĻ¸āĻ¤ā§āĻ¯āĻžāĻ¨ā§āĻ¸ā§‡ āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻšāĻŦā§‡ āĻ¨āĻž āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻŦā§‡āĻ¨āĻžāĻŽā§€ āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻŋāĻ¤ āĻšāĻŦā§‡āĨ¤" +send: "āĻĒāĻžāĻ āĻžāĻ¨" +abuseMarkAsResolved: "āĻ…āĻ­āĻŋāĻ¯ā§‹āĻ—āĻŸāĻŋāĻ•ā§‡ āĻ¸āĻŽāĻžāĻ§āĻžāĻ•ā§ƒāĻ¤ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻšāĻŋāĻšā§āĻ¨āĻŋāĻ¤ āĻ•āĻ°ā§āĻ¨" +openInNewTab: "āĻ¨āĻ¤ā§āĻ¨ āĻŸā§āĻ¯āĻžāĻŦā§‡ āĻ–ā§āĻ˛ā§āĻ¨" +openInSideView: "āĻ¸āĻžāĻ‡āĻĄ āĻ­āĻŋāĻ‰āĻ¤ā§‡ āĻ–ā§āĻ˛ā§āĻ¨" +defaultNavigationBehaviour: "āĻĄāĻŋāĻĢāĻ˛ā§āĻŸ āĻ¨ā§‡āĻ­āĻŋāĻ—ā§‡āĻļāĻ¨" +editTheseSettingsMayBreakAccount: "āĻāĻ¸āĻŦ āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸ āĻ¸āĻŽā§āĻĒāĻžāĻĻāĻ¨āĻž āĻ•āĻ°āĻ˛ā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸā§‡āĻ° āĻ•ā§āĻˇāĻ¤āĻŋ āĻšāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤ " +instanceTicker: "āĻ‡āĻ¨ā§āĻ¸āĻ¤ā§āĻ¯āĻžāĻ¨ā§āĻ¸ā§‡ āĻ¨ā§‹āĻŸā§‡āĻ° āĻ¤āĻĨā§āĻ¯" +waitingFor: "{x} āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡" +random: "āĻ°â€ā§āĻ¯āĻžāĻ¨ā§āĻĄāĻŽ" +system: "āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽ" +switchUi: "UI āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°ā§āĻ¨" +desktop: "āĻĄā§‡āĻ¸ā§āĻ•āĻŸāĻĒ" +clip: "āĻ•ā§āĻ˛āĻŋāĻĒ" +createNew: "āĻ¨āĻ¤ā§āĻ¨" +optional: "āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€ā§Ÿ āĻ¨ā§Ÿ" +createNewClip: "āĻ¨āĻ¤ā§āĻ¨ āĻ•ā§āĻ˛āĻŋāĻĒ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨" +public: "āĻ¸āĻ°ā§āĻŦāĻœāĻ¨ā§€āĻ¨" +i18nInfo: "Misskey āĻ¸ā§āĻŦā§‡āĻšā§āĻ›āĻžāĻ¸ā§‡āĻŦāĻ•āĻĻā§‡āĻ° āĻĻā§āĻŦāĻžāĻ°āĻž āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āĻ¨ āĻ­āĻžāĻˇāĻžāĻ¯āĻŧ āĻ…āĻ¨ā§āĻŦāĻžāĻĻ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡āĨ¤ āĻ†āĻĒāĻ¨āĻŋ {link} āĻ āĻ—āĻŋā§Ÿā§‡ āĻ…āĻ¨ā§āĻŦāĻžāĻĻā§‡ āĻ¸āĻšāĻ¯ā§‹āĻ—āĻŋāĻ¤āĻž āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤" +manageAccessTokens: "āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ āĻŸā§‹āĻ•ā§‡āĻ¨ āĻĒāĻ°āĻŋāĻšāĻžāĻ˛āĻ¨āĻž āĻ•āĻ°ā§āĻ¨" +accountInfo: "āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸā§‡āĻ° āĻ¤āĻĨā§āĻ¯" +notesCount: "āĻ¨ā§‹āĻŸā§‡āĻ° āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž" +repliesCount: "āĻœāĻŦāĻžāĻŦā§‡āĻ° āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž" +renotesCount: "āĻ°āĻŋāĻ¨ā§‹āĻŸā§‡āĻ° āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž" +repliedCount: "āĻœāĻŦāĻžāĻŦ āĻ—ā§āĻ°āĻšāĻ¨ āĻ•āĻ°āĻž āĻšā§Ÿā§‡āĻ›ā§‡" +renotedCount: "āĻ°āĻŋāĻ¨ā§‹āĻŸ āĻĒā§‡ā§Ÿā§‡āĻ›ā§‡āĻ¨" +followingCount: "āĻ¯āĻžāĻĻā§‡āĻ°āĻ•ā§‡ āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖ āĻ•āĻ°ā§‡āĻ¨, āĻ¤āĻžāĻĻā§‡āĻ° āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž" +followersCount: "āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖāĻ•āĻžāĻ°ā§€āĻĻā§‡āĻ° āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž" +sentReactionsCount: "āĻ°āĻŋāĻ…ā§āĻ¯āĻžāĻ•āĻļāĻ¨ āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻšā§Ÿā§‡āĻ›ā§‡" +receivedReactionsCount: "āĻ°āĻŋāĻ…ā§āĻ¯āĻžāĻ•āĻļāĻ¨ āĻĒā§‡ā§Ÿā§‡āĻ›ā§‡āĻ¨" +pollVotesCount: "āĻĒā§‹āĻ˛ āĻ­ā§‹āĻŸ āĻĻāĻŋā§Ÿā§‡āĻ›ā§‡āĻ¨" +pollVotedCount: "āĻĒā§‹āĻ˛ āĻ­ā§‹āĻŸ āĻĒā§‡ā§Ÿā§‡āĻ›ā§‡āĻ¨" +yes: "āĻšā§āĻ¯āĻžāĻ" +no: "āĻ¨āĻž" +driveFilesCount: "āĻĄā§āĻ°āĻžāĻ‡āĻ­ā§‡ āĻĢāĻžāĻ‡āĻ˛ āĻāĻ° āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž" +driveUsage: "āĻĄā§āĻ°āĻžāĻ‡āĻ­ āĻāĻ° āĻŦā§āĻ¯āĻžāĻŦāĻšāĻžāĻ°" +noCrawle: "āĻ•ā§āĻ°āĻ˛āĻžāĻ° āĻ‡āĻ¨ā§āĻĄā§‡āĻ•ā§āĻ¸āĻŋāĻ‚ āĻŦāĻ¨ā§āĻ§ āĻ•āĻ°ā§āĻ¨" +noCrawleDescription: "āĻ¸āĻžāĻ°ā§āĻš āĻ‡āĻžā§āĻœāĻŋāĻ¨āĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻĒā§āĻ°ā§‹āĻĢāĻžāĻ‡āĻ˛, āĻ¨ā§‹āĻŸ, āĻĒā§‡āĻœ āĻ‡āĻ¤ā§āĻ¯āĻžāĻĻāĻŋ āĻ‡āĻ¨āĻĄā§‡āĻ•ā§āĻ¸ āĻ•āĻ°āĻ¤ā§‡ āĻ¨āĻŋāĻˇā§‡āĻ§ āĻ•āĻ°ā§āĻ¨āĨ¤ " +lockedAccountInfo: "āĻāĻŽāĻ¨āĻ•āĻŋ āĻ†āĻĒāĻ¨āĻŋ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖāĻ•āĻžāĻ°ā§€āĻĻā§‡āĻ° āĻŦā§‡āĻ›ā§‡ āĻŦā§‡āĻ›ā§‡ āĻ…āĻ¨ā§āĻŽā§‹āĻĻāĻ¨ āĻ•āĻ°āĻ˛ā§‡āĻ“, āĻ¯ā§‡ āĻ•ā§‡āĻ‰ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¨ā§‹āĻŸāĻ—ā§āĻ˛āĻŋ āĻĻā§‡āĻ–āĻ¤ā§‡ āĻĒāĻžāĻŦā§‡, āĻ¯āĻ¤āĻ•ā§āĻˇāĻŖ āĻ¨āĻž āĻ†āĻĒāĻ¨āĻŋ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¨ā§‹āĻŸāĻ—ā§āĻ˛āĻŋāĻ•ā§‡ \"āĻ…āĻ¨ā§āĻ¸āĻžāĻ°ā§€āĻĻā§‡āĻ° āĻœāĻ¨ā§āĻ¯\" āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻ¸ā§‡āĻŸ āĻ¨āĻž āĻ•āĻ°ā§‡āĻ¨ā§ˇ" +alwaysMarkSensitive: "āĻ¸āĻ°ā§āĻŦāĻĻāĻž āĻ¸ā§āĻĒāĻ°ā§āĻļāĻ•āĻžāĻ¤āĻ° āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻšāĻŋāĻšā§āĻ¨āĻŋāĻ¤ āĻ•āĻ°ā§āĻ¨" +loadRawImages: "āĻ¸āĻ‚āĻ¯ā§āĻ•ā§āĻ¤ āĻ›āĻŦāĻŋāĻ° āĻĨāĻžāĻŽā§āĻŦāĻ¨ā§‡āĻ‡āĻ˛āĻŸāĻŋ āĻĻā§‡āĻ–āĻžāĻ¨āĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤ā§‡ āĻ†āĻ¸āĻ˛ āĻ›āĻŦāĻŋ āĻĻā§‡āĻ–āĻžāĻ¨" +disableShowingAnimatedImages: "āĻ…ā§āĻ¯āĻžāĻ¨āĻŋāĻŽā§‡āĻŸā§‡āĻĄ āĻšāĻŋāĻ¤ā§āĻ° āĻĻā§‡āĻ–āĻžāĻ¨ā§‹ āĻŦāĻ¨ā§āĻ§ āĻ•āĻ°ā§āĻ¨" +verificationEmailSent: "āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤āĻ•āĻ°āĻŖ āĻ‡āĻŽā§‡āĻ˛ āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻšā§Ÿā§‡āĻ›ā§‡āĨ¤ āĻ¸ā§‡āĻŸāĻ†āĻĒ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ•āĻ°āĻ¤ā§‡ āĻ‡āĻŽā§‡āĻ˛ āĻāĻ° āĻ˛āĻŋāĻ™ā§āĻ• āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖ āĻ•āĻ°ā§āĻ¨āĨ¤" +notSet: "āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻž āĻšā§ŸāĻ¨āĻŋ" +emailVerified: "āĻ‡āĻŽā§‡āĻ‡āĻ˛ āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤ āĻ•āĻ°āĻž āĻšā§Ÿā§‡āĻ›ā§‡" +noteFavoritesCount: "āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āĻ°āĻž āĻ¨ā§‹āĻŸā§‡āĻ° āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž" +pageLikesCount: "āĻĒā§‡āĻœ āĻ˛āĻžāĻ‡āĻ• āĻ•āĻ°ā§‡āĻ›ā§‡āĻ¨" +pageLikedCount: "āĻĒā§‡āĻœ āĻ˛āĻžāĻ‡āĻ• āĻĒā§‡ā§Ÿā§‡āĻ›ā§‡āĻ¨" +contact: "āĻĒāĻ°āĻŋāĻšāĻŋāĻ¤āĻŋ āĻ¸āĻŽā§‚āĻš" +useSystemFont: "āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻĢāĻ¨ā§āĻŸ āĻŦā§āĻ¯āĻžāĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§āĻ¨" +clips: "āĻ•ā§āĻ˛āĻŋāĻĒāĻ—ā§āĻ˛āĻŋ " +experimentalFeatures: "āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻŽā§‚āĻ˛āĻ• āĻŦā§ˆāĻļāĻŋāĻˇā§āĻŸā§āĻ¯āĻ—ā§āĻ˛āĻŋ" +developer: "āĻĄā§‡āĻ­ā§‡āĻ˛āĻĒāĻžāĻ°" +makeExplorable: "āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ \"āĻ˜ā§āĻ°ā§‡ āĻĻā§‡āĻ–ā§āĻ¨\" āĻĒā§ƒāĻˇā§āĻ āĻžā§Ÿ āĻĻā§‡āĻ–āĻžāĻ¨" +makeExplorableDescription: "āĻ†āĻĒāĻ¨āĻŋ āĻāĻŸāĻŋ āĻŦāĻ¨ā§āĻ§ āĻ•āĻ°āĻ˛ā§‡, āĻ†āĻĒāĻ¨āĻžāĻ° āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ \"āĻ˜ā§āĻ°ā§‡ āĻĻā§‡āĻ–ā§āĻ¨\" āĻĒā§ƒāĻˇā§āĻ āĻžā§Ÿ āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻŋāĻ¤ āĻšāĻŦā§‡ āĻ¨āĻžāĨ¤" +showGapBetweenNotesInTimeline: "āĻŸāĻžāĻ‡āĻŽāĻ˛āĻžāĻ‡āĻ¨ āĻāĻŦāĻ‚ āĻ¨ā§‹āĻŸā§‡āĻ° āĻŽāĻžāĻā§‡ āĻĢāĻžāĻ•āĻž āĻœāĻžā§ŸāĻ—āĻž āĻ°āĻžāĻ–ā§āĻ¨" +duplicate: "āĻĒā§āĻ°āĻ¤āĻŋāĻ°ā§‚āĻĒ" +left: "āĻŦāĻžāĻŽ" +center: "āĻŽāĻžāĻāĻ–āĻžāĻ¨" +wide: "āĻšāĻ“ā§œāĻž" +narrow: "āĻ¸āĻ‚āĻ•ā§€āĻ°ā§āĻŖ" +reloadToApplySetting: "āĻĒā§ƒāĻˇā§āĻ āĻžāĻŸāĻŋ āĻ°āĻŋāĻ˛ā§‹āĻĄ āĻ•āĻ°āĻžāĻ° āĻĒāĻ° āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸āĻŸāĻŋ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻ— āĻ•āĻ°āĻž āĻšāĻŦā§‡āĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻ•āĻŋ āĻāĻ–āĻ¨ āĻ°āĻŋāĻ˛ā§‹āĻĄ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ¨?" +needReloadToApply: "āĻĒā§ƒāĻˇā§āĻ āĻžāĻŸāĻŋ āĻ°āĻŋāĻ˛ā§‹āĻĄ āĻ•āĻ°āĻžāĻ° āĻĒāĻ° āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸āĻŸāĻŋ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻ— āĻ•āĻ°āĻž āĻšāĻŦā§‡āĨ¤" +showTitlebar: "āĻŸāĻžāĻ‡āĻŸā§‡āĻ˛ āĻŦāĻžāĻ° āĻĻā§‡āĻ–āĻžāĻ¨" clearCache: "āĻ•ā§āĻ¯āĻžāĻļ āĻĒāĻ°āĻŋāĻˇā§āĻ•āĻžāĻ° āĻ•āĻ°ā§āĻ¨" +onlineUsersCount: "{n} āĻœāĻ¨ āĻŦā§āĻ¯āĻžāĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€ āĻ…āĻ¨āĻ˛āĻžāĻ‡āĻ¨" +nUsers: "{n} āĻœāĻ¨ āĻŦā§āĻ¯āĻžāĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€" +nNotes: "{n} āĻŸāĻŋ āĻ¨ā§‹āĻŸ" +sendErrorReports: "āĻ•ā§āĻ°ā§āĻŸāĻŋ āĻĒā§āĻ°āĻ¤āĻŋāĻŦā§‡āĻĻāĻ¨ āĻĒāĻžāĻ āĻžāĻ¨" +sendErrorReportsDescription: "āĻšāĻžāĻ˛ā§ āĻĨāĻžāĻ•āĻ˛ā§‡, āĻŦāĻŋāĻ¸ā§āĻ¤āĻžāĻ°āĻŋāĻ¤ āĻ¤ā§āĻ°ā§āĻŸāĻŋāĻ° āĻ¤āĻĨā§āĻ¯ Misskey-āĻāĻ° āĻ¸āĻžāĻĨā§‡ āĻļā§‡āĻ¯āĻŧāĻžāĻ° āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻ¯āĻž āĻ¸āĻĢā§āĻŸāĻ“āĻ¯āĻŧā§āĻ¯āĻžāĻ°āĻŸāĻŋāĻ° āĻ—ā§āĻŖāĻŽāĻžāĻ¨ āĻ‰āĻ¨ā§āĻ¨āĻ¤ āĻ•āĻ°āĻ¤ā§‡ āĻ¸āĻžāĻšāĻžāĻ¯ā§āĻ¯ āĻ•āĻ°ā§‡āĨ¤ āĻ¤ā§āĻ°ā§āĻŸāĻŋāĻ° āĻ¤āĻĨā§āĻ¯ā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡ OS āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ, āĻŦā§āĻ°āĻžāĻ‰āĻœāĻžāĻ°ā§‡āĻ° āĻ§āĻ°āĻ¨, āĻ•āĻ°ā§āĻŽā§‡āĻ° āĻ‡āĻ¤āĻŋāĻšāĻžāĻ¸ āĻ‡āĻ¤ā§āĻ¯āĻžāĻĻāĻŋāĨ¤" +myTheme: "āĻ†āĻŽāĻžāĻ° āĻĨāĻŋāĻŽ" +backgroundColor: "āĻĒāĻŸāĻ­ā§‚āĻŽāĻŋāĻ° āĻ°āĻ‚" +accentColor: "āĻāĻ•ā§āĻ¸ā§‡āĻ¨ā§āĻŸā§‡āĻ° āĻ°āĻ‚" +textColor: "āĻ˛ā§‡āĻ–āĻžāĻ° āĻ°āĻ‚" +saveAs: "āĻāĻ‡āĻ°ā§‚āĻĒā§‡ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°ā§āĻ¨" +advanced: "āĻ‰āĻ¨ā§āĻ¨āĻ¤" +value: "āĻŽāĻžāĻ¨" +createdAt: "āĻ¤ā§ˆāĻ°āĻŋ āĻšā§Ÿā§‡āĻ›ā§‡" +updatedAt: "āĻļā§‡āĻˇ āĻšāĻžāĻ˛āĻ¨āĻžāĻ—āĻžāĻĻ āĻšāĻ¯āĻŧā§‡āĻ›ā§‡" +saveConfirm: "āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨āĻ—ā§āĻ˛āĻŋ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ¨?" +deleteConfirm: "āĻ†āĻ¸āĻ˛ā§‡āĻ‡ āĻŽā§āĻ›ā§‡ āĻĢā§‡āĻ˛āĻ¤ā§‡ āĻšāĻžāĻ¨?" +invalidValue: "āĻ…āĻ—ā§āĻ°āĻšāĻŖāĻ¯ā§‹āĻ—ā§āĻ¯ āĻŽāĻžāĻ¨" +registry: "āĻ°ā§‡āĻœāĻŋāĻ¸ā§āĻŸā§āĻ°āĻŋ" +closeAccount: "āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ āĻŦāĻ¨ā§āĻ§ āĻ•āĻ°ā§āĻ¨" +currentVersion: "āĻŦāĻ°ā§āĻ¤āĻŽāĻžāĻ¨ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ" +latestVersion: "āĻ¸āĻ°ā§āĻŦāĻļā§‡āĻˇ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ" +youAreRunningUpToDateClient: "āĻ†āĻĒāĻ¨āĻŋ āĻ¸āĻŦāĻšā§‡ā§Ÿā§‡ āĻ¨āĻ¤ā§āĻ¨ āĻ•ā§āĻ˛āĻžā§Ÿā§‡āĻ¨ā§āĻŸ āĻŦā§āĻ¯āĻžāĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ›ā§‡āĻ¨" +newVersionOfClientAvailable: "āĻ†āĻĒāĻ¨āĻžāĻ° āĻ•ā§āĻ˛āĻžā§Ÿā§‡āĻ¨ā§āĻŸā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻ­āĻžāĻ°ā§āĻ¸āĻ¨ āĻšāĻ˛ā§‡ āĻāĻ¸ā§‡āĻ›ā§‡" +usageAmount: "āĻŦā§āĻ¯āĻžāĻŦāĻšāĻžāĻ°" +capacity: "āĻ§āĻžāĻ°āĻŖāĻ•ā§āĻˇāĻŽāĻ¤āĻž" +inUse: "āĻŦā§āĻ¯āĻŦāĻšā§ƒāĻ¤" +editCode: "āĻ•ā§‹āĻĄ āĻ¸āĻŽā§āĻĒāĻžāĻĻāĻ¨āĻž āĻ•āĻ°ā§āĻ¨" +apply: "āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻ— āĻ•āĻ°ā§āĻ¨" +receiveAnnouncementFromInstance: "āĻāĻ‡ āĻ‡āĻ¨ā§āĻ¸āĻŸā§āĻ¯āĻžāĻ¨ā§āĻ¸ āĻĨā§‡āĻ•ā§‡ āĻŦāĻŋāĻœā§āĻžāĻĒā§āĻ¤āĻŋ āĻĒāĻžāĻ¨" +emailNotification: "āĻ‡āĻŽā§‡āĻ‡āĻ˛ āĻŦāĻŋāĻœā§āĻžāĻĒā§āĻ¤āĻŋ" +publish: "āĻĒā§āĻ°āĻ•āĻžāĻļ" +inChannelSearch: "āĻšā§āĻ¯āĻžāĻ¨ā§‡āĻ˛ā§‡ āĻ–ā§āĻāĻœā§āĻ¨" +useReactionPickerForContextMenu: "āĻ°āĻžāĻ‡āĻŸ āĻ•ā§āĻ˛āĻŋāĻ•ā§‡āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻ°āĻŋāĻ…ā§āĻ¯āĻžāĻ•āĻļāĻ¨ āĻĒāĻŋāĻ•āĻžāĻ° āĻ–ā§āĻ˛ā§āĻ¨" +typingUsers: "{users} āĻ˛ā§‡āĻ–āĻ›ā§‡" +jumpToSpecifiedDate: "āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ¤āĻžāĻ°āĻŋāĻ–ā§‡ āĻ¯āĻžāĻ¨" +showingPastTimeline: "āĻ…āĻ¤ā§€āĻ¤ā§‡āĻ° āĻŸāĻžāĻ‡āĻŽāĻ˛āĻžāĻ‡āĻ¨ āĻĻā§‡āĻ–āĻžāĻ¨ā§‹ āĻšāĻšā§āĻ›ā§‡" +clear: "āĻĒāĻ°āĻŋāĻˇā§āĻ•āĻžāĻ°" +markAllAsRead: "āĻ¸āĻŦ āĻĒāĻ āĻŋāĻ¤ āĻšāĻŋāĻ¸ā§‡āĻŦā§‡ āĻšāĻŋāĻšā§āĻ¨āĻŋāĻ¤ āĻ•āĻ°ā§āĻ¨" +goBack: "āĻĒāĻŋāĻ›āĻ¨ā§‡" +unlikeConfirm: "āĻ†āĻ¸āĻ˛ā§‡āĻ‡ āĻ˛āĻžāĻ‡āĻ• āĻ¸āĻ°āĻŋā§Ÿā§‡ āĻ¨āĻŋāĻŦā§‡āĻ¨?" +fullView: "āĻĢā§āĻ˛ āĻ­āĻŋāĻ‰" +quitFullView: "āĻĢā§āĻ˛ āĻ­āĻŋāĻ‰ āĻŦāĻ¨ā§āĻ§ āĻ•āĻ°ā§āĻ¨" +addDescription: "āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻ¯ā§‹āĻ— āĻ•āĻ°ā§āĻ¨" +userPagePinTip: "āĻ†āĻĒāĻ¨āĻŋ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ¨ā§‹āĻŸā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻŽā§‡āĻ¨ā§ āĻĨā§‡āĻ•ā§‡ \"āĻĒā§āĻ°ā§‹āĻĢāĻžāĻ‡āĻ˛ā§‡ āĻĒāĻŋāĻ¨ āĻ•āĻ°ā§āĻ¨\" āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻšāĻ¨ āĻ•āĻ°ā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¨ā§‹āĻŸāĻ—ā§āĻ˛āĻŋ āĻāĻ–āĻžāĻ¨ā§‡ āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤" +notSpecifiedMentionWarning: "āĻĒā§āĻ°āĻžāĻĒāĻ• āĻ›āĻžā§œāĻžāĻ“ āĻāĻ‡ āĻ¨ā§‹āĻŸā§‡ āĻ…āĻ¨ā§āĻ¯ āĻŦā§āĻ¯āĻžāĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻĻā§‡āĻ° āĻ‰āĻ˛ā§āĻ˛ā§‡āĻ–ā§āĻ¯ āĻ•āĻ°āĻž āĻšā§Ÿā§‡āĻ›ā§‡" info: "āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡" +userInfo: "āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻ¤āĻĨā§āĻ¯" +unknown: "āĻ…āĻœāĻžāĻ¨āĻž" +onlineStatus: "āĻ…āĻ¨āĻ˛āĻžāĻ‡āĻ¨ āĻ¸ā§āĻŸā§āĻ¯āĻžāĻŸāĻžāĻ¸" +hideOnlineStatus: "āĻ…āĻ¨āĻ˛āĻžāĻ‡āĻ¨ āĻ¸ā§āĻŸā§āĻ¯āĻžāĻŸāĻžāĻ¸ āĻ˛ā§āĻ•āĻžāĻ¨" +hideOnlineStatusDescription: "āĻ…āĻ¨āĻ˛āĻžāĻ‡āĻ¨ āĻ¸ā§āĻŸā§āĻ¯āĻžāĻŸāĻžāĻ¸ āĻ˛ā§āĻ•āĻŋāĻ¯āĻŧā§‡ āĻ°āĻžāĻ–āĻ˛ā§‡ āĻ¸āĻžāĻ°ā§āĻšā§‡āĻ° āĻŽāĻ¤ā§‹ āĻ•āĻŋāĻ›ā§ āĻĢāĻžāĻ‚āĻļāĻ¨ā§‡āĻ° āĻ¸ā§āĻŦāĻŋāĻ§āĻž āĻ•āĻŽā§‡ āĻ¯āĻžā§ŸāĨ¤" +online: "āĻ…āĻ¨āĻ˛āĻžāĻ‡āĻ¨" +active: "āĻ…ā§āĻ¯āĻžāĻ•āĻŸāĻŋāĻ­" +offline: "āĻ…āĻĢāĻ˛āĻžāĻ‡āĻ¨" +notRecommended: "āĻ¸ā§āĻĒāĻžāĻ°āĻŋāĻļ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ āĻ¨āĻž" +botProtection: "āĻŦāĻŸ āĻĒā§āĻ°ā§‹āĻŸā§‡āĻ•āĻļāĻ¨" +instanceBlocking: "āĻŦā§āĻ˛āĻ• āĻ•āĻ°āĻž āĻ‡āĻ¨ā§āĻ¸āĻŸā§āĻ¯āĻžāĻ¨ā§āĻ¸āĻ—ā§āĻ˛āĻŋ" +selectAccount: "āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻšāĻ¨" +switchAccount: "āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ āĻĒāĻžāĻ˛ā§āĻŸāĻžāĻ¨" +enabled: "āĻšāĻžāĻ˛ā§" +disabled: "āĻŦāĻ¨ā§āĻ§" +quickAction: "āĻ•ā§āĻ‡āĻ• āĻ…ā§āĻ¯āĻžāĻ•āĻļāĻ¨" user: "āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ—āĻŖ" +administration: "āĻĒāĻ°āĻŋāĻšāĻžāĻ˛āĻ¨āĻž" +accounts: "āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸāĻ—ā§āĻ˛āĻŋ" +switch: "āĻĒāĻžāĻ˛ā§āĻŸāĻžāĻ¨" +noMaintainerInformationWarning: "āĻĒā§āĻ°āĻļāĻžāĻ¸āĻ•ā§‡āĻ° āĻ¤āĻĨā§āĻ¯ āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĻ¨āĻŋāĨ¤" +noBotProtectionWarning: "āĻŦāĻŸ āĻĒā§āĻ°ā§‹āĻŸā§‡āĻ•āĻļāĻ¨ āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĻ¨āĻŋāĨ¤" +configure: "āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ° āĻ•āĻ°ā§āĻ¨" +postToGallery: "āĻ—ā§āĻ¯āĻžāĻ˛āĻžāĻ°ā§€ āĻĒā§‹āĻ¸ā§āĻŸ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨" +gallery: "āĻ—ā§āĻ¯āĻžāĻ˛āĻžāĻ°ā§€" +recentPosts: "āĻ¨āĻ¤ā§āĻ¨ āĻĒā§‹āĻ¸ā§āĻŸ" +popularPosts: "āĻœāĻ¨āĻĒā§āĻ°āĻŋā§Ÿ āĻĒā§‹āĻ¸ā§āĻŸ" +shareWithNote: "āĻ¨ā§‹āĻŸā§‡āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻļā§‡ā§ŸāĻžāĻ° āĻ•āĻ°ā§āĻ¨" +ads: "āĻŦāĻŋāĻœā§āĻžāĻžāĻĒāĻ¨" +expiration: "āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ¸āĻŽāĻ¯āĻŧāĻ¸ā§€āĻŽāĻž" +memo: "āĻŽā§‡āĻŽā§‹" +priority: "āĻ…āĻ—ā§āĻ°āĻžāĻ§āĻŋāĻ•āĻžāĻ°" +high: "āĻ‰āĻšā§āĻš" +middle: "āĻŽāĻžāĻāĻžāĻ°āĻŋ" +low: "āĻ¨āĻŋāĻŽā§āĻ¨" +emailNotConfiguredWarning: "āĻ‡āĻŽā§‡āĻ‡āĻ˛ āĻ…ā§āĻ¯āĻžāĻĄā§āĻ°ā§‡āĻ¸ āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻž āĻšā§ŸāĻ¨āĻŋāĨ¤" +ratio: "āĻ…āĻ¨ā§āĻĒāĻžāĻ¤" +previewNoteText: "āĻĒā§āĻ°āĻŋāĻ­āĻŋāĻ‰ āĻĻā§‡āĻ–āĻžāĻ¨" +customCss: "āĻ•āĻžāĻ¸ā§āĻŸāĻŽ CSS" +customCssWarn: "āĻāĻ‡ āĻŦā§āĻ¯āĻžāĻĒāĻžāĻ°ā§‡ āĻ…āĻ­āĻŋāĻœā§āĻžāĻ¤āĻž āĻ¨āĻž āĻĨāĻžāĻ•āĻ˛ā§‡ āĻāĻ‡ āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻŸāĻŋ āĻŦā§āĻ¯āĻžāĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŦā§‡āĻ¨ āĻ¨āĻžāĨ¤ āĻ…āĻ¨ā§āĻĒāĻ¯ā§āĻ•ā§āĻ¤ āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸ āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸāĻ•ā§‡ āĻ¸ā§āĻŦāĻžāĻ­āĻžāĻŦāĻŋāĻ•āĻ­āĻžāĻŦā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻŦāĻžāĻ§āĻž āĻĻāĻŋāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤" +global: "āĻ—ā§āĻ˛ā§‹āĻŦāĻžāĻ˛" +squareAvatars: "āĻšāĻžāĻ°āĻ•ā§‹āĻ¨āĻž āĻĒā§āĻ°ā§‹āĻĢāĻžāĻ‡āĻ˛ āĻĒāĻŋāĻ•āĻšāĻžāĻ° āĻĻā§‡āĻ–āĻžāĻ¨ " +sent: "āĻĒāĻžāĻ āĻžāĻ¨" +received: "āĻĒā§āĻ°āĻžāĻĒā§āĻ¤" +searchResult: "āĻ…āĻ¨ā§āĻ¸āĻ¨ā§āĻ§āĻžāĻ¨ā§‡āĻ° āĻĢāĻ˛āĻžāĻĢāĻ˛" +hashtags: "āĻšā§āĻ¯āĻžāĻļāĻŸā§āĻ¯āĻžāĻ—" +troubleshooting: "āĻŸā§āĻ°āĻžāĻŦāĻ˛āĻļā§āĻŸāĻŋāĻ‚" +useBlurEffect: "UI āĻ¤ā§‡ āĻŦā§āĻ˛āĻžāĻ° āĻ‡āĻĢā§‡āĻ•ā§āĻŸ āĻŦā§āĻ¯āĻžāĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§āĻ¨" +learnMore: "āĻ†āĻ°āĻ“ āĻœāĻžāĻ¨ā§āĻ¨" +misskeyUpdated: "Misskey āĻ†āĻĒāĻĄā§‡āĻŸ āĻ•āĻ°āĻž āĻšā§Ÿā§‡āĻ›ā§‡īŧ" +whatIsNew: "āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨āĻ—ā§āĻ˛āĻŋ āĻĻā§‡āĻ–āĻžāĻ¨" +translate: "āĻ…āĻ¨ā§āĻŦāĻžāĻĻ" +translatedFrom: "{x} āĻšāĻ¤ā§‡ āĻ…āĻ¨ā§āĻŦāĻžāĻĻ āĻ•āĻ°āĻž" +accountDeletionInProgress: "āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ āĻŽā§āĻ›ā§‡ āĻĢā§‡āĻ˛āĻž āĻšāĻšā§āĻ›ā§‡" +usernameInfo: "āĻāĻ•āĻŸāĻŋ āĻ¨āĻžāĻŽ āĻ¯āĻž āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸāĻŸāĻŋāĻ•ā§‡ āĻ…āĻ¨āĻ¨ā§āĻ¯āĻ­āĻžāĻŦā§‡ āĻ¸āĻ¨āĻžāĻ•ā§āĻ¤ āĻ•āĻ°ā§‡āĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻŦāĻ°ā§āĻŖāĻŽāĻžāĻ˛āĻž (a ~ z, A ~ Z), āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž (0 ~ 9), āĻāĻŦāĻ‚ āĻ†āĻ¨ā§āĻĄāĻžāĻ°āĻ¸ā§āĻ•ā§‹āĻ° (_) āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻ¨āĻžāĻŽ āĻĒāĻ°ā§‡ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°āĻž āĻ¯āĻžāĻŦā§‡ āĻ¨āĻžāĨ¤" +aiChanMode: "Ai āĻŽā§‹āĻĄ" +keepCw: "CW āĻ°āĻžāĻ–ā§āĻ¨" +pubSub: "Pub/Sub āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸāĻ—ā§āĻ˛ā§‹" +lastCommunication: "āĻļā§‡āĻˇ āĻ¯ā§‹āĻ—āĻžāĻ¯ā§‹āĻ—" +resolved: "āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ āĻšāĻ¯āĻŧā§‡āĻ›ā§‡" +unresolved: "āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ āĻšāĻ¯āĻŧāĻ¨āĻŋ" +breakFollow: "āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖ āĻ•āĻ°āĻž āĻŦāĻ¨ā§āĻ§" +itsOn: "āĻšāĻžāĻ˛ā§" +itsOff: "āĻŦāĻ¨ā§āĻ§" +emailRequiredForSignup: "āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ āĻ¤ā§ˆāĻ°āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻ‡āĻŽā§‡āĻ‡āĻ˛ āĻāĻ° āĻĻāĻ°āĻ•āĻžāĻ° āĻĒā§œāĻŦā§‡" +unread: "āĻ…āĻĒāĻ āĻŋāĻ¤" +filter: "āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ°" controlPanel: "āĻ¨āĻŋā§ŸāĻ¨ā§āĻ¤ā§āĻ°āĻ¨ āĻ•ā§‡āĻ¨ā§āĻĻā§āĻ°" +manageAccounts: "āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸāĻ—ā§āĻ˛āĻŋ āĻĒāĻ°āĻŋāĻšāĻžāĻ˛āĻ¨āĻž āĻ•āĻ°ā§āĻ¨" +makeReactionsPublic: "āĻ°āĻŋāĻ…ā§āĻ¯āĻžāĻ•āĻļāĻ¨ā§‡āĻ° āĻ‡āĻ¤āĻŋāĻšāĻžāĻ¸ āĻ‰āĻ¨ā§āĻŽā§āĻ•ā§āĻ¤ āĻ•āĻ°ā§āĻ¨" +makeReactionsPublicDescription: "āĻ†āĻĒāĻ¨āĻžāĻ° āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āĻ¤ā§€ āĻ°āĻŋāĻ…ā§āĻ¯āĻžāĻ•āĻļāĻ¨āĻ—ā§āĻ˛āĻŋāĻ° āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž āĻ¯ā§‡ āĻ•āĻžāĻ°āĻ“ āĻ•āĻžāĻ›ā§‡ āĻĻā§ƒāĻļā§āĻ¯āĻŽāĻžāĻ¨ āĻšāĻŦā§‡āĨ¤" +classic: "āĻ•ā§āĻ˛āĻžāĻ¸āĻŋāĻ•" +muteThread: "āĻĨā§āĻ°ā§‡āĻĄ āĻŽāĻŋāĻ‰āĻŸ āĻ•āĻ°ā§āĻ¨" +unmuteThread: "āĻĨā§āĻ°ā§‡āĻĄ āĻ†āĻ¨āĻŽāĻŋāĻ‰āĻŸ āĻ•āĻ°ā§āĻ¨" +ffVisibility: "āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖ/āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖāĻ•āĻžāĻ°ā§€āĻĻā§‡āĻ° āĻĻā§ƒāĻļā§āĻ¯āĻŽāĻžāĻ¨ā§āĻ¯āĻ¤āĻž" +ffVisibilityDescription: "āĻ†āĻĒāĻ¨āĻŋ āĻ•āĻžāĻ•ā§‡ āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖ āĻ•āĻ°ā§‡āĻ¨ āĻāĻŦāĻ‚ āĻ•ā§‡ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖ āĻ•āĻ°ā§‡, āĻ¸ā§‡āĻŸāĻž āĻ•āĻžāĻ°āĻž āĻĻā§‡āĻ–āĻ¤ā§‡ āĻĒāĻžāĻŦā§‡ āĻ¤āĻž āĻ¨āĻŋāĻ°ā§āĻ§āĻžāĻ°āĻŖ āĻ•āĻ°ā§‡āĨ¤" +continueThread: "āĻ†āĻ°ā§‹ āĻĨā§āĻ°ā§‡āĻĄ āĻĻā§‡āĻ–ā§āĻ¨" +deleteAccountConfirm: "āĻ†āĻĒāĻ¨āĻžāĻ° āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ āĻŽā§āĻ›ā§‡ āĻĢā§‡āĻ˛āĻž āĻšāĻŦā§‡āĨ¤ āĻ āĻŋāĻ• āĻ†āĻ›ā§‡?" +incorrectPassword: "āĻ†āĻĒāĻ¨āĻžāĻ° āĻĻā§‡āĻ“ā§ŸāĻž āĻĒāĻžāĻ¸āĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻĄāĻŸāĻŋ āĻ­ā§āĻ˛āĨ¤" +voteConfirm: "\"{choice}\" āĻ āĻ­ā§‹āĻŸ āĻĻāĻŋāĻ¤ā§‡ āĻšāĻžāĻ¨īŧŸ" +hide: "āĻ˛ā§āĻ•āĻžāĻ¨" +leaveGroup: "āĻ—ā§āĻ°ā§āĻĒ āĻ›ā§‡ā§œā§‡ āĻšāĻ˛ā§‡ āĻ¯āĻžāĻ¨" +leaveGroupConfirm: "\"{name}\" āĻ—ā§āĻ°ā§āĻĒ āĻ›ā§‡ā§œā§‡ āĻšāĻ˛ā§‡ āĻ¯ā§‡āĻ¤ā§‡ āĻšāĻžāĻ¨?" +useDrawerReactionPickerForMobile: "āĻŽā§‹āĻŦāĻžāĻ‡āĻ˛ā§‡ āĻ°āĻŋāĻ…ā§āĻ¯āĻžāĻ•āĻļāĻ¨ āĻĒāĻŋāĻ•āĻžāĻ°āĻ•ā§‡ āĻĄā§āĻ°āĻ¯āĻŧāĻžāĻ°ā§‡ āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻ¨ āĻ•āĻ°ā§āĻ¨" +welcomeBackWithName: "āĻ†āĻŦāĻžāĻ° āĻ¸ā§āĻŦāĻžāĻ—āĻ¤āĻŽ, {name}" +clickToFinishEmailVerification: " [{ok}] āĻ•ā§āĻ˛āĻŋāĻ• āĻ•āĻ°āĻžāĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ‡āĻŽā§‡āĻ˛ āĻ āĻŋāĻ•āĻžāĻ¨āĻž āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤ āĻ•āĻ°ā§āĻ¨āĨ¤" +_emailUnavailable: + used: "āĻāĻ‡ āĻ‡āĻŽā§‡āĻ‡āĻ˛ āĻ āĻŋāĻ•āĻžāĻ¨āĻžāĻŸāĻŋ āĻ‡āĻ¤ā§‹āĻŽāĻ§ā§āĻ¯ā§‡ āĻŦā§āĻ¯āĻŦāĻšā§ƒāĻ¤ āĻšā§Ÿā§‡āĻ›ā§‡" + format: "āĻāĻ‡ āĻ‡āĻŽā§‡āĻ˛ āĻ āĻŋāĻ•āĻžāĻ¨āĻžāĻŸāĻŋ āĻ¸āĻ āĻŋāĻ•āĻ­āĻžāĻŦā§‡ āĻ˛āĻŋāĻ–āĻž āĻšā§ŸāĻ¨āĻŋ" + disposable: "āĻ…āĻ¸ā§āĻĨāĻžā§Ÿā§€ āĻ‡āĻŽā§‡āĻ‡āĻ˛ āĻ āĻŋāĻ•āĻžāĻ¨āĻž āĻŦā§āĻ¯āĻžāĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ¯āĻžāĻŦā§‡ āĻ¨āĻž" + mx: "āĻ‡āĻŽā§‡āĻ‡āĻ˛ ​​āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°āĻŸāĻŋ āĻ āĻŋāĻ• āĻ¨āĻžāĻ‡" + smtp: "āĻ‡āĻŽā§‡āĻ‡āĻ˛ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°āĻŸāĻŋ āĻ¸āĻžā§œāĻž āĻĻāĻŋāĻšā§āĻ›ā§‡ āĻ¨āĻž" +_ffVisibility: + public: "āĻĒā§āĻ°āĻ•āĻžāĻļ" + followers: "āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖāĻ•āĻžāĻ°ā§€āĻĻā§‡āĻ° āĻ•āĻžāĻ›ā§‡ āĻĻā§ƒāĻļā§āĻ¯āĻŽāĻžāĻ¨" + private: "āĻŦā§āĻ¯āĻžāĻ•ā§āĻ¤āĻŋāĻ—āĻ¤" +_signup: + almostThere: "āĻĒā§āĻ°āĻžāĻ¯āĻŧ āĻļā§‡āĻˇ" + emailAddressInfo: "āĻ†āĻĒāĻ¨āĻŋ āĻ¯ā§‡ āĻ‡āĻŽā§‡āĻ˛ āĻ āĻŋāĻ•āĻžāĻ¨āĻžāĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŦā§‡āĻ¨ āĻ¸ā§‡āĻŸāĻŋ āĻ˛āĻŋāĻ–ā§āĻ¨āĨ¤ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ‡āĻŽā§‡āĻ‡āĻ˛ āĻ āĻŋāĻ•āĻžāĻ¨āĻž āĻĒā§āĻ°āĻ•āĻžāĻļ āĻ•āĻ°āĻž āĻšāĻŦā§‡ āĻ¨āĻžāĨ¤" + emailSent: "āĻ†āĻĒāĻ¨āĻžāĻ° āĻĻā§‡āĻ“āĻ¯āĻŧāĻž āĻ‡āĻŽā§‡āĻ˛ āĻ āĻŋāĻ•āĻžāĻ¨āĻžāĻ¯āĻŧ ({email}) āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤āĻ•āĻ°āĻŖ āĻ‡āĻŽā§‡āĻ˛ āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻšāĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ āĻ¤ā§ˆāĻ°āĻŋ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ•āĻ°āĻ¤ā§‡ āĻ‡āĻŽā§‡āĻ˛ā§‡āĻ° āĻ˛āĻŋāĻ™ā§āĻ•āĻŸāĻŋ āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ āĻ•āĻ°ā§āĻ¨āĨ¤" +_accountDelete: + accountDelete: "āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ āĻŽā§āĻ›ā§‡ āĻĢā§‡āĻ˛ā§āĻ¨" + mayTakeTime: "āĻāĻ•āĻŸāĻŋ āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ āĻŽā§āĻ›ā§‡ āĻĢā§‡āĻ˛āĻž āĻāĻ•āĻŸāĻŋ āĻĻā§€āĻ°ā§āĻ˜ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻāĻŦāĻ‚ āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻĒā§āĻ°āĻšā§āĻ° āĻĒāĻ°āĻŋāĻŽāĻžāĻŖā§‡ āĻ¸āĻžāĻŽāĻ—ā§āĻ°ā§€ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡ āĻĨāĻžāĻ•ā§‡āĻ¨ āĻŦāĻž āĻĢāĻžāĻ‡āĻ˛ āĻ†āĻĒāĻ˛ā§‹āĻĄ āĻ•āĻ°ā§‡āĻ¨ āĻ¤āĻŦā§‡ āĻāĻŸāĻŋ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻšāĻ¤ā§‡ āĻĻā§€āĻ°ā§āĻ˜ āĻ¸āĻŽāĻ¯āĻŧ āĻ¨āĻŋāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤" + sendEmail: "āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ āĻŽā§āĻ›ā§‡ āĻĢā§‡āĻ˛āĻž āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻšāĻ˛ā§‡, āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻŋāĻ¤ āĻ‡āĻŽā§‡āĻ˛ āĻ āĻŋāĻ•āĻžāĻ¨āĻžāĻ¯āĻŧ āĻāĻ•āĻŸāĻŋ āĻŦāĻŋāĻœā§āĻžāĻĒā§āĻ¤āĻŋ āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻšāĻŦā§‡āĨ¤" + requestAccountDelete: "āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ āĻŽā§āĻ›ā§‡ āĻĢā§‡āĻ˛āĻžāĻ° āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻ•āĻ°ā§āĻ¨" + started: "āĻŽā§āĻ›ā§‡ āĻĢā§‡āĻ˛āĻžāĻ° āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻļā§āĻ°ā§ āĻšāĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤" + inProgress: "āĻŽā§āĻ›ā§‡ āĻĢā§‡āĻ˛āĻžāĻ° āĻ•āĻžāĻœ āĻšāĻ˛āĻ›ā§‡" +_ad: + back: "āĻĒāĻŋāĻ›āĻ¨ā§‡" + reduceFrequencyOfThisAd: "āĻāĻ‡ āĻŦāĻŋāĻœā§āĻžāĻžāĻĒāĻ¨āĻŸāĻŋ āĻ•āĻŽ āĻĻā§‡āĻ–āĻžāĻ¨" +_forgotPassword: + enterEmail: "āĻ†āĻĒāĻ¨āĻŋ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻŋāĻ¤ āĻ‡āĻŽā§‡āĻ˛ āĻ āĻŋāĻ•āĻžāĻ¨āĻž āĻ˛āĻŋāĻ–ā§āĻ¨. āĻ¸ā§‡āĻ‡ āĻ āĻŋāĻ•āĻžāĻ¨āĻžāĻ¯āĻŧ āĻāĻ•āĻŸāĻŋ āĻĒāĻžāĻ¸āĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻĄ āĻ°āĻŋāĻ¸ā§‡āĻŸ āĻ˛āĻŋāĻ™ā§āĻ• āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻšāĻŦā§‡āĨ¤" + ifNoEmail: "āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻ¨ā§‡āĻ° āĻ¸āĻŽā§Ÿ āĻ‡-āĻŽā§‡āĻ‡āĻ˛ āĻ āĻŋāĻ•āĻžāĻ¨āĻž āĻ¨āĻž āĻĻāĻŋā§Ÿā§‡ āĻĨāĻžāĻ•ā§‡āĻ¨, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻ…āĻ¨ā§āĻ—ā§āĻ°āĻš āĻ•āĻ°ā§‡ āĻĒā§āĻ°āĻļāĻžāĻ¸āĻ•ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¯ā§‹āĻ—āĻžāĻ¯ā§‹āĻ— āĻ•āĻ°ā§āĻ¨āĨ¤" + contactAdmin: "āĻāĻ‡ āĻ‡āĻ¨ā§āĻ¸āĻŸā§āĻ¯āĻžāĻ¨ā§āĻ¸āĻŸāĻŋ āĻ‡āĻŽā§‡āĻ‡āĻ˛ āĻŦā§āĻ¯āĻžāĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ¨āĻž, āĻ¤āĻžāĻ‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻĒāĻžāĻ¸āĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻĄ āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻ¤ā§‡ āĻĒā§āĻ°āĻļāĻžāĻ¸āĻ•ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¯ā§‹āĻ—āĻžāĻ¯ā§‹āĻ— āĻ•āĻ°ā§āĻ¨ā§ˇ" +_gallery: + my: "āĻ†āĻŽāĻžāĻ° āĻ—ā§āĻ¯āĻžāĻ˛āĻžāĻ°ā§€" + liked: "āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āĻ°āĻž āĻĒā§‹āĻ¸ā§āĻŸ" + like: "āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āĻ°āĻž" + unlike: "āĻĒāĻ›āĻ¨ā§āĻĻ āĻ¸āĻ°āĻžāĻ¨" _email: _follow: title: "āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖ āĻ•āĻ°āĻ›ā§‡" + _receiveFollowRequest: + title: "āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖ āĻ•āĻ°āĻžāĻ° āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻĒā§‡ā§Ÿā§‡āĻ›ā§‡āĻ¨" +_plugin: + install: "āĻĒā§āĻ˛āĻžāĻ—āĻ‡āĻ¨ āĻ‡āĻ¨ā§āĻ¸āĻŸāĻ˛ āĻ•āĻ°ā§āĻ¨" + installWarn: "āĻ…āĻŦāĻŋāĻļā§āĻŦāĻ¸ā§āĻ¤ āĻĒā§āĻ˛āĻžāĻ—āĻ‡āĻ¨ āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°āĻŦā§‡āĻ¨ āĻ¨āĻžāĨ¤" + manage: "āĻĒā§āĻ˛āĻžāĻ—āĻ‡āĻ¨ āĻŽā§āĻ¯āĻžāĻ¨ā§‡āĻœ āĻ•āĻ°ā§āĻ¨" +_registry: + scope: "āĻ¸ā§āĻ•ā§‹āĻĒ" + key: "āĻ•ā§€" + keys: "āĻ•ā§€ - āĻ¸āĻŽā§‚āĻš" + domain: "āĻĄā§‹āĻŽā§‡āĻ¨" + createKey: "āĻ•ā§€ āĻŦāĻžāĻ¨āĻžāĻ¨" +_aboutMisskey: + about: "Misskey, āĻāĻ•āĻŸāĻŋ āĻ“āĻĒā§‡āĻ¨ āĻ¸ā§‹āĻ°ā§āĻ¸ āĻ¸āĻĢā§āĻŸāĻ“āĻ¯āĻŧā§āĻ¯āĻžāĻ° āĻ¯āĻž 2014 āĻ¸āĻžāĻ˛ āĻĨā§‡āĻ•ā§‡ syuilo āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ›ā§‡āĻ¨āĨ¤" + contributors: "āĻĒā§āĻ°āĻ§āĻžāĻ¨ āĻ•āĻ¨ā§āĻŸā§āĻ°āĻŋāĻŦāĻŋāĻ‰āĻŸāĻžāĻ°āĻ—āĻŖ" + allContributors: "āĻ¸āĻ•āĻ˛ āĻ•āĻ¨ā§āĻŸā§āĻ°āĻŋāĻŦāĻŋāĻ‰āĻŸāĻžāĻ°āĻ—āĻŖ" + source: "āĻ¸ā§‹āĻ°ā§āĻ¸ āĻ•ā§‹āĻĄ" + translation: "Misskey āĻ…āĻ¨ā§āĻŦāĻžāĻĻ āĻ•āĻ°ā§āĻ¨" + donate: "Misskey āĻ¤ā§‡ āĻĻāĻžāĻ¨ āĻ•āĻ°ā§āĻ¨" + morePatrons: "āĻ†āĻ°āĻ“ āĻ…āĻ¨ā§‡āĻ•ā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ¸āĻžāĻšāĻžāĻ¯ā§āĻ¯ āĻ•āĻ°āĻ›ā§‡āĻ¨āĨ¤ āĻ¤āĻžāĻĻā§‡āĻ° āĻ¸āĻŦāĻžāĻ‡āĻ•ā§‡ āĻ§āĻ¨ā§āĻ¯āĻŦāĻžāĻĻ đŸĨ°" + patrons: "āĻ¸āĻŽāĻ°ā§āĻĨāĻ¨āĻ•āĻžāĻ°ā§€" +_nsfw: + respect: "āĻ¸ā§āĻĒāĻ°ā§āĻļāĻ•āĻžāĻ¤āĻ° āĻŽāĻŋāĻĄāĻŋā§ŸāĻž āĻ˛ā§āĻ•āĻžāĻ¨" + ignore: "āĻ¸ā§āĻĒāĻ°ā§āĻļāĻ•āĻžāĻ¤āĻ° āĻŽāĻŋāĻĄāĻŋā§ŸāĻž āĻ˛ā§āĻ•āĻžāĻŦā§‡āĻ¨ āĻ¨āĻž" + force: "āĻ¸āĻ•āĻ˛ āĻŽāĻŋāĻĄāĻŋā§ŸāĻž āĻ˛ā§āĻ•āĻžāĻ¨" _mfm: + cheatSheet: "MFM āĻšāĻŋāĻŸāĻļāĻŋāĻŸ" + intro: "MFM āĻāĻ•āĻŸāĻŋ āĻŽāĻžāĻ°ā§āĻ•āĻ†āĻĒ āĻ­āĻžāĻˇāĻž āĻ¯āĻž Misskey-āĻāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āĻ¨ āĻœāĻžāĻ¯āĻŧāĻ—āĻžāĻ¯āĻŧ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤ āĻāĻ–āĻžāĻ¨ā§‡ āĻ†āĻĒāĻ¨āĻŋ MFM-āĻāĻ° āĻ¸āĻŋāĻ¨āĻŸā§āĻ¯āĻžāĻ•ā§āĻ¸āĻ—ā§āĻ˛āĻŋāĻ° āĻāĻ•āĻŸāĻŋ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž āĻĻā§‡āĻ–āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŦā§‡āĻ¨āĨ¤" + dummy: "āĻŽāĻŋāĻ¸āĻ•āĻŋ āĻĢā§‡āĻĄāĻŋāĻ­āĻžāĻ°ā§āĻ¸ā§‡āĻ° āĻŦāĻŋāĻļā§āĻŦāĻ•ā§‡ āĻĒā§āĻ°āĻ¸āĻžāĻ°āĻŋāĻ¤ āĻ•āĻ°ā§‡" mention: "āĻ‰āĻ˛ā§āĻ˛ā§‡āĻ–" + mentionDescription: "@ āĻšāĻŋāĻšā§āĻ¨ + āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻ¨āĻžāĻŽ āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ•ā§‡ āĻ¨āĻŋāĻ°ā§āĻĻā§‡āĻļ āĻ•āĻ°āĻ¤ā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ¯āĻžā§ŸāĨ¤" + hashtag: "āĻšā§āĻ¯āĻžāĻļāĻŸā§āĻ¯āĻžāĻ—" + hashtagDescription: "āĻ†āĻĒāĻ¨āĻŋ āĻāĻ•āĻŸāĻŋ # āĻšāĻŋāĻšā§āĻ¨ + āĻŸā§āĻ¯āĻžāĻ— āĻ¸āĻš āĻāĻ•āĻŸāĻŋ āĻšā§āĻ¯āĻžāĻļāĻŸā§āĻ¯āĻžāĻ— āĻ¨āĻŋāĻ°ā§āĻĻā§‡āĻļ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤" + url: "URL" + urlDescription: "URL āĻĻā§‡āĻ–āĻžāĻ¨ā§‹ āĻ¸āĻŽā§āĻ­āĻŦāĨ¤" + link: "āĻ˛āĻŋāĻ‚āĻ•" + linkDescription: "āĻ†āĻĒāĻ¨āĻŋ āĻĒāĻžāĻ ā§āĻ¯ā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ…āĻ‚āĻļāĻ•ā§‡ URL āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻĻā§‡āĻ–āĻžāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ā§ˇ" + bold: "āĻ—āĻžā§" + boldDescription: "āĻ…āĻ•ā§āĻˇāĻ°āĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻŽā§‹āĻŸāĻžāĻ•āĻ°ā§‡ āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻ¨ āĻ•āĻ°āĻž āĻšāĻŦā§‡āĨ¤" + small: "āĻ›ā§‹āĻŸ" + smallDescription: "āĻ˛ā§‡āĻ–āĻž āĻ›ā§‹āĻŸ āĻāĻŦāĻ‚ āĻĒāĻžāĻ¤āĻ˛āĻž āĻ•āĻ°ā§‡ āĻĻā§‡āĻ–āĻžāĻ¨ā§‹ āĻšāĻŦā§‡āĨ¤" + center: "āĻ¸ā§‡āĻ¨ā§āĻŸāĻžāĻ°" + centerDescription: "āĻ˛ā§‡āĻ–āĻž āĻŽāĻžāĻ āĻŦāĻ°āĻžāĻŦāĻ° āĻĻā§‡āĻ–āĻžāĻ¨ā§‹ āĻšāĻŦā§‡" + inlineCode: "āĻ•ā§‹āĻĄ (āĻ‡āĻ¨āĻ˛āĻžāĻ‡āĻ¨)" + inlineCodeDescription: " āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽā§‡āĻ° āĻ•ā§‹āĻĄā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ‡āĻ¨āĻ˛āĻžāĻ‡āĻ¨ āĻ¸āĻŋāĻ¨āĻŸā§āĻ¯āĻžāĻ•ā§āĻ¸ āĻšāĻžāĻ‡āĻ˛āĻžāĻ‡āĻŸāĻŋāĻ‚ āĻ•āĻ°āĻž āĻšāĻŦā§‡" + blockCode: "āĻ•ā§‹āĻĄ (āĻŦā§āĻ˛āĻ•)" + blockCodeDescription: "āĻŽāĻžāĻ˛ā§āĻŸāĻŋ-āĻ˛āĻžāĻ‡āĻ¨ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽā§‡āĻ° āĻ•ā§‹āĻĄā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸āĻŋāĻ¨āĻŸā§āĻ¯āĻžāĻ•ā§āĻ¸ āĻšāĻžāĻ‡āĻ˛āĻžāĻ‡āĻŸ āĻ•āĻ°ā§‡āĨ¤" + inlineMath: "āĻ—āĻžāĻŖāĻŋāĻ¤āĻŋāĻ• āĻ¸ā§‚āĻ¤ā§āĻ° (āĻ‡āĻ¨āĻ˛āĻžāĻ‡āĻ¨)" + inlineMathDescription: "āĻ—āĻžāĻŖāĻŋāĻ¤āĻŋāĻ• āĻ¸ā§‚āĻ¤ā§āĻ° āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻ¨ āĻ•āĻ°ā§āĻ¨ (KaTeX) āĻ‡āĻ¨āĻ˛āĻžāĻ‡āĻ¨āĨ¤" + blockMath: "āĻ—āĻžāĻŖāĻŋāĻ¤āĻŋāĻ• āĻ¸ā§‚āĻ¤ā§āĻ° (āĻŦā§āĻ˛āĻ•)" + blockMathDescription: "āĻāĻ•āĻŸāĻŋ āĻŦā§āĻ˛āĻ•ā§‡ āĻāĻ•āĻžāĻ§āĻŋāĻ• āĻ˛āĻžāĻ‡āĻ¨ā§‡āĻ° āĻ—āĻžāĻŖāĻŋāĻ¤āĻŋāĻ• āĻ¸ā§‚āĻ¤ā§āĻ° āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻ¨ āĻ•āĻ°ā§āĻ¨ (KaTeX)āĨ¤" quote: "āĻ‰āĻĻā§āĻ§ā§ƒāĻ¤āĻŋ" + quoteDescription: "āĻŦāĻŋāĻˇāĻ¯āĻŧāĻŦāĻ¸ā§āĻ¤ā§āĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻ‰āĻĻā§āĻ§ā§ƒāĻ¤āĻŋ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻĻā§‡āĻ–āĻžāĻ¨ā§‹ āĻšāĻŦā§‡āĨ¤" emoji: "āĻ¸ā§āĻŦāĻ¨āĻŋāĻ°ā§āĻ§āĻžāĻ°āĻŋāĻ¤ āĻ‡āĻŽā§‹āĻœāĻŋāĻ—ā§āĻ˛āĻŋ" + emojiDescription: "āĻ†āĻĒāĻ¨āĻŋ āĻāĻ•āĻŸāĻŋ āĻ•āĻžāĻ¸ā§āĻŸāĻŽ āĻ‡āĻŽā§‹āĻœāĻŋāĻ° āĻ¨āĻžāĻŽ āĻ•ā§‹āĻ˛āĻ¨ā§‡ āĻ†āĻŦāĻĻā§āĻ§ āĻ•āĻ°ā§‡ āĻ•āĻžāĻ¸ā§āĻŸāĻŽ āĻ‡āĻŽā§‹āĻœāĻŋāĻŸāĻŋ āĻĻā§‡āĻ–āĻžāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ā§ˇ" search: "āĻ–ā§āĻāĻœā§āĻ¨" + searchDescription: "āĻĒā§‚āĻ°ā§āĻŦ-āĻŸāĻžāĻ‡āĻĒ āĻ•āĻ°āĻž āĻĒāĻžāĻ ā§āĻ¯ āĻ¸āĻš āĻāĻ•āĻŸāĻŋ āĻ…āĻ¨ā§āĻ¸āĻ¨ā§āĻ§āĻžāĻ¨ āĻŦāĻžāĻ•ā§āĻ¸ āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻ¨ āĻ•āĻ°ā§‡āĨ¤" + flip: "āĻ‰āĻ˛ā§āĻŸāĻžāĻ¨" + flipDescription: "āĻŦāĻŋāĻˇāĻ¯āĻŧāĻŦāĻ¸ā§āĻ¤ā§ āĻ‰āĻĒāĻ°ā§‡/āĻ¨ā§€āĻšā§‡ āĻŦāĻž āĻŦāĻžāĻŽ/āĻĄāĻžāĻ¨ā§‡ āĻ‰āĻ˛ā§āĻŸāĻžāĻ¨āĨ¤" + jelly: "āĻ…ā§āĻ¯āĻžāĻ¨āĻŋāĻŽā§‡āĻļāĻ¨ (āĻœā§‡āĻ˛āĻŋ)" + jellyDescription: "āĻœā§‡āĻ˛āĻŋāĻ° āĻŽāĻ¤ āĻ…ā§āĻ¯āĻžāĻ¨āĻŋāĻŽā§‡āĻļāĻ¨ āĻĻā§‡āĻ–āĻžā§ŸāĨ¤" + tada: "āĻ…ā§āĻ¯āĻžāĻ¨āĻŋāĻŽā§‡āĻļāĻ¨ (āĻŸāĻžāĻĄāĻž)" + tadaDescription: "\"āĻŸāĻžāĻĄāĻž!\" āĻāĻ° āĻŽāĻ¤ āĻ…ā§āĻ¯āĻžāĻ¨āĻŋāĻŽā§‡āĻļāĻ¨ āĻĻā§‡āĻ–āĻžā§ŸāĨ¤" + jump: "āĻ…ā§āĻ¯āĻžāĻ¨āĻŋāĻŽā§‡āĻļāĻ¨ (āĻ˛āĻžāĻĢ)" + jumpDescription: "āĻŦāĻŋāĻˇā§ŸāĻŦāĻ¸ā§āĻ¤ā§āĻ¤ā§‡ āĻ˛āĻžāĻĢ āĻŽāĻžāĻ°āĻžāĻ° āĻŽāĻ¤ āĻ…ā§āĻ¯āĻžāĻ¨āĻŋāĻŽā§‡āĻļāĻ¨ āĻĻā§‡āĻ–āĻžā§ŸāĨ¤" + bounce: "āĻ…ā§āĻ¯āĻžāĻ¨āĻŋāĻŽā§‡āĻļāĻ¨ (āĻ¤āĻŋā§œāĻŋāĻ‚ āĻŦāĻŋā§œāĻŋāĻ‚)" + bounceDescription: "āĻ¤āĻŋā§œāĻŋāĻ‚ āĻŦāĻŋā§œāĻŋāĻ‚ āĻ•āĻ°āĻžāĻ° āĻŽāĻ¤ āĻ…ā§āĻ¯āĻžāĻ¨āĻŋāĻŽā§‡āĻļāĻ¨ āĻĻā§‡āĻ–āĻžā§ŸāĨ¤" + shake: "āĻ…ā§āĻ¯āĻžāĻ¨āĻŋāĻŽā§‡āĻļāĻ¨ (āĻāĻžāĻāĻ•āĻŋ)" + shakeDescription: "āĻāĻžāĻāĻ•āĻŋāĻ° āĻŽāĻ¤ āĻ…ā§āĻ¯āĻžāĻ¨āĻŋāĻŽā§‡āĻļāĻ¨ āĻĻā§‡āĻ–āĻžā§ŸāĨ¤" + twitch: "āĻ…ā§āĻ¯āĻžāĻ¨āĻŋāĻŽā§‡āĻļāĻ¨ (āĻŽā§‹āĻšāĻĄāĻŧāĻžāĻ¨ā§‹)" + twitchDescription: "āĻŽā§‹āĻšāĻĄāĻŧāĻžāĻ¨ā§‹āĻ° āĻŽāĻ¤ āĻ…ā§āĻ¯āĻžāĻ¨āĻŋāĻŽā§‡āĻļāĻ¨ āĻĻā§‡āĻ–āĻžā§ŸāĨ¤" + spin: "āĻ…ā§āĻ¯āĻžāĻ¨āĻŋāĻŽā§‡āĻļāĻ¨ (āĻ˜ā§āĻ°āĻž)" + spinDescription: "āĻ˜ā§āĻ°āĻžāĻ° āĻŽāĻ¤ āĻ…ā§āĻ¯āĻžāĻ¨āĻŋāĻŽā§‡āĻļāĻ¨ āĻĻā§‡āĻ–āĻžā§ŸāĨ¤" + x2: "āĻŦā§œ" + x2Description: "āĻŦāĻŋāĻˇā§ŸāĻŦāĻ¸ā§āĻ¤ā§ āĻŦā§œ āĻ•āĻ°ā§‡ āĻĻā§‡āĻ–āĻžā§ŸāĨ¤" + x3: "āĻ…āĻ¨ā§‡āĻ• āĻŦā§œ" + x3Description: "āĻŦāĻŋāĻˇā§ŸāĻŦāĻ¸ā§āĻ¤ā§ āĻ†āĻ°āĻ“ āĻŦā§œ āĻ•āĻ°ā§‡ āĻĻā§‡āĻ–āĻžā§ŸāĨ¤" + x4: "āĻ…āĻ¸ā§āĻŦāĻžāĻ­āĻžāĻŦāĻŋāĻ• āĻŦā§œ" + x4Description: "āĻŦāĻŋāĻˇā§ŸāĻŦāĻ¸ā§āĻ¤ā§āĻ•ā§‡ āĻ†āĻ—ā§‡āĻ° āĻĨā§‡āĻ•ā§‡āĻ“ āĻ†āĻ°āĻ“ āĻŦā§œ āĻ•āĻ°ā§‡ āĻĻā§‡āĻ–āĻžā§ŸāĨ¤" + blur: "āĻŦā§āĻ˛āĻžāĻ°" + blurDescription: "āĻŦāĻŋāĻˇāĻ¯āĻŧāĻŦāĻ¸ā§āĻ¤ā§āĻ•ā§‡ āĻŦā§āĻ˛āĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻāĻ° āĻ‰āĻĒāĻ° āĻŽāĻžāĻ‰āĻ¸ āĻ•āĻžāĻ°ā§āĻ¸āĻžāĻ° āĻ°āĻžāĻ–āĻ˛ā§‡, āĻāĻŸāĻŋ āĻĒāĻ°āĻŋāĻˇā§āĻ•āĻžāĻ°āĻ­āĻžāĻŦā§‡ āĻĻā§‡āĻ–āĻ¤ā§‡ āĻĒāĻžāĻŦā§‡āĻ¨āĨ¤" + font: "āĻĢāĻ¨ā§āĻŸ" + fontDescription: "āĻŦāĻŋāĻˇā§ŸāĻŦāĻ¸ā§āĻ¤ā§āĻ•ā§‡ āĻ•ā§‹āĻ¨ āĻĢāĻ¨ā§āĻŸā§‡ āĻĻā§‡āĻ–āĻžāĻ¨ā§‹ āĻšāĻŦā§‡ āĻ¤āĻž āĻ¨āĻŋāĻ°ā§āĻ§āĻžāĻ°āĻŖ āĻ•āĻ°ā§‡āĨ¤" + rainbow: "āĻ°ā§‡āĻ‡āĻ¨āĻŦā§‹" + rainbowDescription: "āĻŦāĻŋāĻˇā§ŸāĻŦāĻ¸ā§āĻ¤ā§āĻ•ā§‡ āĻ°āĻ‚āĻ§āĻ¨ā§āĻ° āĻ°āĻ‚ āĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻ¨ āĻ•āĻ°ā§‡āĨ¤" + sparkle: "āĻšāĻŋāĻ• āĻšāĻŋāĻ•" + sparkleDescription: "āĻŦāĻŋāĻˇāĻ¯āĻŧāĻŦāĻ¸ā§āĻ¤ā§āĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻšāĻŋāĻ•āĻšāĻŋāĻ•ā§‡ āĻ•āĻŖāĻž āĻĒā§āĻ°āĻ­āĻžāĻŦ āĻĻā§‡āĻ¯āĻŧāĨ¤" + rotate: "āĻ˜ā§āĻ°āĻžāĻ¨" + rotateDescription: "āĻŦāĻŋāĻˇā§ŸāĻŦāĻ¸ā§āĻ¤ā§āĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ•ā§‹āĻ¨ā§‡ āĻ˜ā§āĻ°āĻžā§ŸāĨ¤" +_instanceTicker: + none: "āĻĻā§‡āĻ–āĻžāĻŦā§‡āĻ¨ āĻ¨āĻž" + remote: "āĻ°āĻŋāĻŽā§‹āĻŸ āĻŦā§āĻ¯āĻžāĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻĻā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻĻā§‡āĻ–āĻžāĻ¨" + always: "āĻ¸āĻ°ā§āĻŦāĻĻāĻž āĻĻā§‡āĻ–āĻžāĻ¨" +_serverDisconnectedBehavior: + reload: "āĻ¸ā§āĻŦā§ŸāĻ‚āĻ•ā§āĻ°āĻŋā§ŸāĻ­āĻžāĻŦā§‡ āĻ°āĻŋāĻ˛ā§‹āĻĄ" + dialog: "āĻ¸āĻ¤āĻ°ā§āĻ•āĻ¤āĻž āĻĄāĻžā§ŸāĻžāĻ˛āĻ— āĻĻā§‡āĻ–āĻžāĻ¨" + quiet: "āĻ…āĻ—āĻšāĻ°ā§€ āĻ¸āĻ¤āĻ°ā§āĻ•āĻ¤āĻž āĻĻā§‡āĻ–āĻžāĻ¨" +_channel: + create: "āĻšā§āĻ¯āĻžāĻ¨ā§‡āĻ˛ āĻŦāĻžāĻ¨āĻžāĻ¨" + edit: "āĻšā§āĻ¯āĻžāĻ¨ā§‡āĻ˛ āĻ¸āĻŽā§āĻĒāĻžāĻĻāĻ¨āĻž āĻ•āĻ°ā§āĻ¨" + setBanner: "āĻŦā§āĻ¯āĻžāĻ¨āĻžāĻ° āĻ¸ā§‡āĻŸ āĻ•āĻ°ā§āĻ¨" + removeBanner: "āĻŦā§āĻ¯āĻžāĻ¨āĻžāĻ° āĻ¸āĻ°āĻžāĻ¨" + featured: "āĻŦāĻ°ā§āĻ¤āĻŽāĻžāĻ¨ā§‡ āĻœāĻ¨āĻĒā§āĻ°āĻŋā§Ÿ" + owned: "āĻ¨āĻŋāĻœā§‡āĻ°" + following: "āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡" + usersCount: "{n} āĻœāĻ¨ āĻ…āĻ‚āĻļāĻ—ā§āĻ°āĻšāĻŖāĻ•āĻžāĻ°ā§€" + notesCount: "{n} āĻŸāĻŋ āĻ¨ā§‹āĻŸ" +_menuDisplay: + sideFull: "āĻĒāĻžāĻļā§‡" + sideIcon: "āĻĒāĻžāĻļā§‡ (āĻ†āĻ‡āĻ•āĻ¨)" + top: "āĻļā§€āĻ°ā§āĻˇā§‡" + hide: "āĻ˛ā§āĻ•āĻžāĻ¨" +_wordMute: + muteWords: "āĻ¨āĻŋāĻƒāĻļāĻŦā§āĻĻ āĻ•āĻ°āĻž āĻļāĻŦā§āĻĻāĻ—ā§āĻ˛āĻŋ" + muteWordsDescription: "āĻ¸ā§āĻĒā§‡āĻ¸ āĻĻāĻŋāĻ¯āĻŧā§‡ āĻ†āĻ˛āĻžāĻĻāĻž āĻ•āĻ°āĻ˛ā§‡ AND āĻļāĻ°ā§āĻ¤ āĻ¤ā§ˆāĻ°āĻŋ āĻšāĻŦā§‡ āĻāĻŦāĻ‚ āĻ†āĻ˛āĻžāĻĻāĻž āĻ˛āĻžāĻ‡āĻ¨ā§‡ āĻ˛āĻŋāĻ–āĻ˛ā§‡ OR āĻļāĻ°ā§āĻ¤ āĻ¤ā§ˆāĻ°āĻŋ āĻšāĻŦā§‡āĨ¤" + muteWordsDescription2: "āĻ°ā§‡āĻ—ā§āĻ˛āĻžāĻ° āĻāĻ•ā§āĻ¸āĻĒā§āĻ°ā§‡āĻļāĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻ¸ā§āĻ˛ā§āĻ¯āĻžāĻļ āĻĻāĻŋāĻ¯āĻŧā§‡ āĻ•ā§€āĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻĄāĻ•ā§‡ āĻ˜āĻŋāĻ°ā§‡ āĻ°āĻžāĻ–ā§āĻ¨āĨ¤" + softDescription: "āĻŸāĻžāĻ‡āĻŽāĻ˛āĻžāĻ‡āĻ¨ āĻĨā§‡āĻ•ā§‡ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻļāĻ°ā§āĻ¤āĻžāĻ¨ā§āĻ¯āĻžā§Ÿā§€ āĻ¨ā§‹āĻŸ āĻ˛ā§āĻ•āĻŋāĻ¯āĻŧā§‡ āĻ°āĻžāĻ–ā§‡āĨ¤" + hardDescription: "āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻļāĻ°ā§āĻ¤āĻžāĻ¨ā§āĻ¯āĻžā§Ÿā§€ āĻ¨ā§‹āĻŸāĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻŸāĻžāĻ‡āĻŽāĻ˛āĻžāĻ‡āĻ¨ āĻĨā§‡āĻ•ā§‡ āĻŦāĻžāĻĻ āĻĻā§‡ā§ŸāĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻļāĻ°ā§āĻ¤ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°āĻ˛ā§‡āĻ“ āĻ¯ā§‡ āĻ¨ā§‹āĻŸāĻ—ā§āĻ˛āĻŋ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĻ¨āĻŋ āĻ¸ā§‡āĻ—ā§āĻ˛āĻŋ āĻŦāĻžāĻĻ āĻĻā§‡āĻ“āĻ¯āĻŧāĻž āĻšāĻŦā§‡āĨ¤" + soft: "āĻ¨āĻŽāĻ¨ā§€ā§Ÿ" + hard: "āĻ•āĻ ā§‹āĻ°" + mutedNotes: "āĻŽāĻŋāĻ‰āĻŸ āĻ•āĻ°āĻž āĻ¨ā§‹āĻŸāĻ—ā§āĻ˛āĻŋ" +_instanceMute: + instanceMuteDescription: "āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ° āĻ•āĻ°āĻž āĻ‡āĻ¨ā§āĻ¸āĻŸā§āĻ¯āĻžāĻ¨ā§āĻ¸ā§‡āĻ° āĻ¸āĻŦ āĻ¨ā§‹āĻŸ āĻāĻŦāĻ‚ āĻ°āĻŋāĻ¨ā§‹āĻŸ āĻŽāĻŋāĻ‰āĻŸ āĻ•āĻ°ā§āĻ¨, āĻŽāĻŋāĻ‰āĻŸ āĻ•āĻ°āĻž āĻ‡āĻ¨ā§āĻ¸āĻŸā§āĻ¯āĻžāĻ¨ā§āĻ¸ā§‡āĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻĻā§‡āĻ° āĻ‰āĻ¤ā§āĻ¤āĻ° āĻ¸āĻšāĨ¤" + instanceMuteDescription2: "āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋāĻ•ā§‡ āĻ†āĻ˛āĻžāĻĻāĻž āĻ˛āĻžāĻ‡āĻ¨ā§‡ āĻ˛āĻŋāĻ–ā§āĻ¨" + title: "āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ° āĻ•āĻ°āĻž āĻ‡āĻ¨ā§āĻ¸āĻŸā§āĻ¯āĻžāĻ¨ā§āĻ¸ā§‡āĻ° āĻ¨ā§‹āĻŸāĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻ˛ā§āĻ•āĻŋāĻ¯āĻŧā§‡ āĻ°āĻžāĻ–ā§‡āĨ¤" + heading: "āĻŽāĻŋāĻ‰āĻŸ āĻ•āĻ°āĻž āĻ‡āĻ¨ā§āĻ¸āĻ¤ā§āĻ¯āĻžāĻ¨ā§āĻ¸ā§‡āĻ° āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž" _theme: + explore: "āĻĨāĻŋāĻŽāĻ—ā§āĻ˛āĻŋ āĻ˜ā§āĻ°ā§‡ āĻĻā§‡āĻ–ā§āĻ¨" + install: "āĻĨāĻŋāĻŽ āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°ā§āĻ¨" + manage: "āĻĨāĻŋāĻŽ āĻŦā§āĻ¯āĻžāĻŦāĻ¸ā§āĻĨāĻžāĻĒāĻ¨āĻž" + code: "āĻĨāĻŋāĻŽ āĻ•ā§‹āĻĄ" + description: "āĻŦāĻ°ā§āĻŖāĻ¨āĻž" + installed: "{name} āĻ‡āĻ¨ā§āĻ¸āĻŸāĻ˛ āĻ•āĻ°āĻž āĻšā§Ÿā§‡āĻ›ā§‡" + installedThemes: "āĻ‡āĻ¨ā§āĻ¸āĻŸāĻ˛ āĻ•āĻ°āĻž āĻĨāĻŋāĻŽāĻ¸āĻŽā§‚āĻš" + builtinThemes: "āĻŦāĻŋāĻ˛ā§āĻŸ-āĻ‡āĻ¨ āĻĨāĻŋāĻŽāĻ¸āĻŽā§‚āĻš" + alreadyInstalled: "āĻāĻ‡ āĻĨāĻŋāĻŽāĻŸāĻŋ āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡ āĻ‡āĻ¨ā§āĻ¸āĻŸāĻ˛ āĻ•āĻ°āĻž āĻšā§Ÿā§‡āĻ›ā§‡" + invalid: "āĻĨāĻŋāĻŽāĻŸāĻŋāĻ° āĻĢāĻ°āĻŽā§āĻ¯āĻžāĻŸ āĻ¸āĻ āĻŋāĻ• āĻ¨ā§Ÿ" + make: "āĻĨāĻŋāĻŽ āĻŦāĻžāĻ¨āĻžāĻ¨" + base: "āĻŦā§‡āĻ¸" + addConstant: "āĻ§ā§āĻ°ā§āĻŦāĻ• āĻ¯ā§‹āĻ— āĻ•āĻ°ā§āĻ¨" + constant: "āĻ§ā§āĻ°ā§āĻŦāĻ•" + defaultValue: "āĻĄāĻŋāĻĢāĻ˛ā§āĻŸ āĻŽāĻžāĻ¨" + color: "āĻ°āĻ‚" + refProp: "āĻĒā§āĻ°ā§‹āĻĒāĻžāĻ°ā§āĻŸāĻŋ āĻ°ā§‡āĻĢāĻžāĻ°ā§‡āĻ¨ā§āĻ¸ āĻ•āĻ°ā§āĻ¨" + refConst: "āĻ§ā§āĻ°ā§āĻŦāĻ• āĻ°ā§‡āĻĢāĻžāĻ°ā§‡āĻ¨ā§āĻ¸ āĻ•āĻ°ā§āĻ¨" + key: "āĻ•ā§€" + func: "āĻĢāĻžāĻ‚āĻļāĻ¨" + funcKind: "āĻĢāĻžāĻ‚āĻļāĻ¨ā§‡āĻ° āĻ§āĻ°āĻ¨" + argument: "āĻ†āĻ°ā§āĻ—ā§āĻŽā§‡āĻ¨ā§āĻŸ" + basedProp: "āĻ°ā§‡āĻĢāĻžāĻ°ā§‡āĻ¨ā§āĻ¸ āĻ•āĻ°āĻž āĻĒā§āĻ°ā§‹āĻĒāĻžāĻ°ā§āĻŸāĻŋ" + alpha: "āĻ…āĻ¸ā§āĻŦāĻšā§āĻ›āĻ¤āĻž" + darken: "āĻ…āĻ¨ā§āĻ§āĻ•āĻžāĻ° āĻ•āĻ°ā§āĻ¨" + lighten: "āĻ‰āĻœā§āĻœā§āĻŦāĻ˛ āĻ•āĻ°ā§āĻ¨" + inputConstantName: "āĻ§ā§āĻ°ā§āĻŦāĻ•āĻŸāĻŋāĻ° āĻ¨āĻžāĻŽ āĻ˛āĻŋāĻ–ā§āĻ¨" + importInfo: "āĻ†āĻĒāĻ¨āĻŋ āĻāĻ–āĻžāĻ¨ā§‡ āĻĨāĻŋāĻŽ āĻ•ā§‹āĻĄ āĻĒā§‡āĻ¸ā§āĻŸ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ āĻāĻŦāĻ‚ āĻ¸ā§‡āĻŸāĻŋāĻ•ā§‡ āĻāĻĄāĻŋāĻŸāĻ°ā§‡ āĻ‡āĻŽā§āĻĒā§‹āĻ°ā§āĻŸ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨" + deleteConstantConfirm: "āĻ†āĻĒāĻ¨āĻŋ āĻ•āĻŋ āĻ§ā§āĻ°ā§āĻŦāĻ• {const} āĻŽā§āĻ›ā§‡ āĻĢā§‡āĻ˛āĻ¤ā§‡ āĻšāĻžāĻ¨īŧŸ" keys: + accent: "āĻ…ā§āĻ¯āĻžāĻ•āĻ¸ā§‡āĻ¨ā§āĻŸ" + bg: "āĻĒāĻŸāĻ­ā§‚āĻŽāĻŋ" + fg: "āĻ˛ā§‡āĻ–āĻž" + focus: "āĻĢā§‹āĻ•āĻžāĻ¸" + indicator: "āĻ‡āĻ¨āĻĄāĻŋāĻ•ā§‡āĻŸāĻ°" + panel: "āĻĒā§āĻ¯āĻžāĻ¨ā§‡āĻ˛" + shadow: "āĻ›āĻžā§ŸāĻž" + header: "āĻšā§‡āĻĄāĻžāĻ°" + navBg: "āĻ¸āĻžāĻ‡āĻĄāĻŦāĻžāĻ°ā§‡āĻ° āĻĒāĻŸāĻ­ā§‚āĻŽāĻŋ" + navFg: "āĻ¸āĻžāĻ‡āĻĄāĻŦāĻžāĻ°ā§‡āĻ° āĻĒāĻžāĻ ā§āĻ¯" + navHoverFg: "āĻ¸āĻžāĻ‡āĻĄāĻŦāĻžāĻ°ā§‡āĻ° āĻĒāĻžāĻ ā§āĻ¯ (āĻšāĻ­āĻžāĻ°)" + navActive: "āĻ¸āĻžāĻ‡āĻĄāĻŦāĻžāĻ°ā§‡āĻ° āĻĒāĻžāĻ ā§āĻ¯ (āĻ…ā§āĻ¯āĻžāĻ•āĻŸāĻŋāĻ­)" + navIndicator: "āĻ¸āĻžāĻ‡āĻĄāĻŦāĻžāĻ°ā§‡āĻ° āĻ‡āĻ¨āĻĄāĻŋāĻ•ā§‡āĻŸāĻ°" + link: "āĻ˛āĻŋāĻ‚āĻ•" + hashtag: "āĻšā§āĻ¯āĻžāĻļāĻŸā§āĻ¯āĻžāĻ—" mention: "āĻ‰āĻ˛ā§āĻ˛ā§‡āĻ–" + mentionMe: "āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ‰āĻ˛ā§āĻ˛ā§‡āĻ–ā§āĻ¯ āĻ•āĻ°āĻž" renote: "āĻ°āĻŋāĻ¨ā§‹āĻŸ" + modalBg: "āĻŽā§‹āĻĄāĻžāĻ˛ā§‡āĻ° āĻĒāĻŸāĻ­ā§‚āĻŽāĻŋ" + divider: "āĻ–āĻ¨ā§āĻĄāĻ•" + scrollbarHandle: "āĻ¸ā§āĻ•ā§āĻ°āĻ˛āĻŦāĻžāĻ° āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄā§‡āĻ˛" + scrollbarHandleHover: "āĻ¸ā§āĻ•ā§āĻ°āĻ˛āĻŦāĻžāĻ° āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄā§‡āĻ˛ (āĻšāĻ­āĻžāĻ°)" + dateLabelFg: "āĻ¤āĻžāĻ°āĻŋāĻ– āĻ˛ā§‡āĻŦā§‡āĻ˛ā§‡āĻ° āĻĒāĻžāĻ ā§āĻ¯" + infoBg: "āĻ¤āĻĨā§āĻ¯ā§‡āĻ° āĻĒāĻŸāĻ­ā§‚āĻŽāĻŋ" + infoFg: "āĻ¤āĻĨā§āĻ¯ā§‡āĻ° āĻĒāĻžāĻ ā§āĻ¯" + infoWarnBg: "āĻ“ā§ŸāĻžāĻ°ā§āĻ¨āĻŋāĻ‚ āĻāĻ° āĻĒāĻŸāĻ­ā§‚āĻŽāĻŋ" + infoWarnFg: "āĻ“ā§ŸāĻžāĻ°ā§āĻ¨āĻŋāĻ‚ āĻāĻ° āĻĒāĻžāĻ ā§āĻ¯" + cwBg: "CW āĻŦāĻžāĻŸāĻ¨ā§‡āĻ° āĻĒāĻŸāĻ­ā§‚āĻŽāĻŋ" + cwFg: "CW āĻŦāĻžāĻŸāĻ¨ā§‡āĻ° āĻĒāĻžāĻ ā§āĻ¯" + cwHoverBg: "CW āĻŦāĻžāĻŸāĻ¨ā§‡āĻ° āĻĒāĻŸāĻ­ā§‚āĻŽāĻŋ (āĻšāĻ­āĻžāĻ°)" + toastBg: "āĻŦāĻŋāĻœā§āĻžāĻĒā§āĻ¤āĻŋāĻ° āĻĒāĻŸāĻ­ā§‚āĻŽāĻŋ" + toastFg: "āĻŦāĻŋāĻœā§āĻžāĻĒā§āĻ¤āĻŋāĻ° āĻĒāĻžāĻ ā§āĻ¯" + buttonBg: "āĻŦāĻžāĻŸāĻ¨ā§‡āĻ° āĻĒāĻŸāĻ­ā§‚āĻŽāĻŋ" + buttonHoverBg: "āĻŦāĻžāĻŸāĻ¨ā§‡āĻ° āĻĒāĻŸāĻ­ā§‚āĻŽāĻŋ (āĻšāĻ­āĻžāĻ°)" + inputBorder: "āĻ‡āĻ¨āĻĒā§āĻŸ āĻĢāĻŋāĻ˛ā§āĻĄā§‡āĻ° āĻŦāĻ°ā§āĻĄāĻžāĻ°" + listItemHoverBg: "āĻ˛āĻŋāĻ¸ā§āĻŸ āĻ†āĻ‡āĻŸā§‡āĻŽā§‡āĻ° āĻĒāĻŸāĻ­ā§‚āĻŽāĻŋ (āĻšā§‹āĻ­āĻžāĻ°)" + driveFolderBg: "āĻĄā§āĻ°āĻžāĻ‡āĻ­ āĻĢā§‹āĻ˛ā§āĻĄāĻžāĻ°ā§‡āĻ° āĻĒāĻŸāĻ­ā§‚āĻŽāĻŋ" + wallpaperOverlay: "āĻ“āĻ¯āĻŧāĻžāĻ˛āĻĒā§‡āĻĒāĻžāĻ° āĻ“āĻ­āĻžāĻ°āĻ˛ā§‡" + badge: "āĻŦā§āĻ¯āĻžāĻœ" + messageBg: "āĻšā§āĻ¯āĻžāĻŸā§‡āĻ° āĻĒāĻŸāĻ­ā§‚āĻŽāĻŋ" + accentDarken: "āĻ…ā§āĻ¯āĻžāĻ•āĻ¸ā§‡āĻ¨ā§āĻŸ (āĻ—āĻžā§)" + accentLighten: "āĻ…ā§āĻ¯āĻžāĻ•āĻ¸ā§‡āĻ¨ā§āĻŸ (āĻšāĻžāĻ˛ā§āĻ•āĻž)" + fgHighlighted: "āĻšāĻžāĻ‡āĻ˛āĻžāĻ‡āĻŸ āĻ•āĻ°āĻž āĻĒāĻžāĻ ā§āĻ¯" _sfx: note: "āĻ¨ā§‹āĻŸāĻ—ā§āĻ˛āĻŋ" + noteMy: "āĻ¨ā§‹āĻŸ (āĻ†āĻĒāĻ¨āĻžāĻ°)" notification: "āĻŦāĻŋāĻœā§āĻžāĻĒā§āĻ¤āĻŋ" chat: "āĻšā§āĻ¯āĻžāĻŸ" + chatBg: "āĻšā§āĻ¯āĻžāĻŸ (āĻŦā§āĻ¯āĻžāĻ•āĻ—ā§āĻ°āĻžāĻ‰āĻ¨ā§āĻĄ)" + antenna: "āĻ…ā§āĻ¯āĻžāĻ¨ā§āĻŸā§‡āĻ¨āĻžāĻ—ā§āĻ˛āĻŋ" + channel: "āĻšā§āĻ¯āĻžāĻ¨ā§‡āĻ˛ā§‡āĻ° āĻŦāĻŋāĻœā§āĻžāĻĒā§āĻ¤āĻŋ" +_ago: + unknown: "āĻ…āĻœāĻžāĻ¨āĻž" + future: "āĻ­āĻŦāĻŋāĻˇā§āĻ¯ā§Ž" + justNow: "āĻāĻ‡āĻŽāĻžāĻ¤ā§āĻ°" + secondsAgo: "{n} āĻ¸ā§‡āĻ•ā§‡āĻ¨ā§āĻĄ āĻ†āĻ—ā§‡" + minutesAgo: "{n} āĻŽāĻŋāĻ¨āĻŋāĻŸ āĻ†āĻ—ā§‡" + hoursAgo: "{n} āĻ˜āĻŖā§āĻŸāĻž āĻ†āĻ—ā§‡" + daysAgo: "{n} āĻĻāĻŋāĻ¨ āĻ†āĻ—ā§‡" + weeksAgo: "{n} āĻ¸āĻĒā§āĻ¤āĻžāĻš āĻ†āĻ—ā§‡" + monthsAgo: "{n} āĻŽāĻžāĻ¸ āĻ†āĻ—ā§‡" + yearsAgo: "{n} āĻŦāĻ›āĻ° āĻ†āĻ—ā§‡" +_time: + second: "āĻ¸ā§‡āĻ•ā§‡āĻ¨ā§āĻĄ" + minute: "āĻŽāĻŋāĻ¨āĻŋāĻŸ" + hour: "āĻ˜āĻŖā§āĻŸāĻž" + day: "āĻĻāĻŋāĻ¨" +_tutorial: + title: "Misskey āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻŦā§āĻ¯āĻžāĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŦā§‡āĻ¨" + step1_1: "āĻ¸ā§āĻŦāĻžāĻ—āĻ¤āĻŽ!" + step1_2: "āĻāĻ‡ āĻ¸ā§āĻ•ā§āĻ°ā§€āĻ¨āĻŸāĻŋāĻ•ā§‡ \"āĻŸāĻžāĻ‡āĻŽāĻ˛āĻžāĻ‡āĻ¨\" āĻŦāĻ˛āĻž āĻšāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻ•āĻžāĻ˛āĻžāĻ¨ā§āĻ•ā§āĻ°āĻŽāĻŋāĻ• āĻ•ā§āĻ°āĻŽā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻāĻŦāĻ‚ āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻžāĻĻā§‡āĻ° \"āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖ āĻ•āĻ°ā§‡āĻ¨\" āĻ¤āĻžāĻĻā§‡āĻ° \"āĻ¨ā§‹āĻŸāĻ—ā§āĻ˛āĻŋ\" āĻĻā§‡āĻ–āĻžāĻ¯āĻŧā§ˇ" + step1_3: "āĻ†āĻĒāĻ¨āĻŋ āĻ†āĻĒāĻ¨āĻžāĻ° āĻŸāĻžāĻ‡āĻŽāĻ˛āĻžāĻ‡āĻ¨ā§‡ āĻ•āĻŋāĻ›ā§ āĻĻā§‡āĻ–āĻ¤ā§‡ āĻĒāĻžāĻŦā§‡āĻ¨ āĻ¨āĻž āĻ•āĻžāĻ°āĻŖ āĻ†āĻĒāĻ¨āĻŋ āĻāĻ–āĻ¨āĻ“ āĻ•ā§‹āĻ¨ā§‹ āĻ¨ā§‹āĻŸ āĻĒā§‹āĻ¸ā§āĻŸ āĻ•āĻ°ā§‡āĻ¨āĻ¨āĻŋ āĻāĻŦāĻ‚ āĻ†āĻĒāĻ¨āĻŋ āĻ•āĻžāĻ‰āĻ•ā§‡ āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖ āĻ•āĻ°āĻ›ā§‡āĻ¨ āĻ¨āĻžā§ˇ" + step2_1: "āĻ¨ā§‹āĻŸ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻžāĻ° āĻ†āĻ—ā§‡ āĻŦāĻž āĻ•āĻžāĻ‰āĻ•ā§‡ āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖ āĻ•āĻ°āĻžāĻ° āĻ†āĻ—ā§‡ āĻĒā§āĻ°āĻĨāĻŽā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻĒā§āĻ°ā§‹āĻĢāĻžāĻ‡āĻ˛āĻŸāĻŋ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ•āĻ°ā§āĻ¨āĨ¤" + step2_2: "āĻ†āĻĒāĻ¨āĻŋ āĻ•ā§‡ āĻ¤āĻž āĻœāĻžāĻ¨āĻž āĻ…āĻ¨ā§‡āĻ• āĻ˛ā§‹āĻ•ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¨ā§‹āĻŸāĻ—ā§āĻ˛āĻŋ āĻĻā§‡āĻ–āĻž āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖ āĻ•āĻ°āĻžāĻ•ā§‡ āĻ¸āĻšāĻœ āĻ•āĻ°ā§‡ āĻ¤ā§‹āĻ˛ā§‡ā§ˇ" + step3_1: "āĻ†āĻĒāĻ¨āĻŋ āĻ•āĻŋ āĻ¸āĻĢāĻ˛āĻ­āĻžāĻŦā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻĒā§āĻ°ā§‹āĻĢāĻžāĻ‡āĻ˛ āĻ¸ā§‡āĻŸ āĻ†āĻĒ āĻ•āĻ°ā§‡āĻ›ā§‡āĻ¨?" + step3_2: "āĻāĻ–āĻ¨, āĻ•āĻŋāĻ›ā§ āĻ¨ā§‹āĻŸ āĻĒā§‹āĻ¸ā§āĻŸ āĻ•āĻ°āĻžāĻ° āĻšā§‡āĻˇā§āĻŸāĻž āĻ•āĻ°ā§āĻ¨āĨ¤ āĻĒā§‹āĻ¸ā§āĻŸ āĻĢāĻ°ā§āĻŽ āĻ–ā§āĻ˛āĻ¤ā§‡ āĻĒā§‡āĻ¨ā§āĻ¸āĻŋāĻ˛ āĻšāĻŋāĻšā§āĻ¨āĻ¯ā§āĻ•ā§āĻ¤ āĻŦāĻžāĻŸāĻ¨ā§‡ āĻ•ā§āĻ˛āĻŋāĻ• āĻ•āĻ°ā§āĻ¨āĨ¤" + step3_3: "āĻŦāĻŋāĻˇāĻ¯āĻŧāĻŦāĻ¸ā§āĻ¤ā§ āĻ˛ā§‡āĻ–āĻžāĻ° āĻĒāĻ°ā§‡, āĻ†āĻĒāĻ¨āĻŋ āĻĢāĻ°ā§āĻŽā§‡āĻ° āĻ‰āĻĒāĻ°ā§‡āĻ° āĻĄāĻžāĻ¨āĻĻāĻŋāĻ•ā§‡āĻ° āĻŦāĻžāĻŸāĻ¨ā§‡ āĻ•ā§āĻ˛āĻŋāĻ• āĻ•āĻ°ā§‡ āĻĒā§‹āĻ¸ā§āĻŸ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤" + step3_4: "āĻĒā§‹āĻ¸ā§āĻŸ āĻ•āĻ°āĻžāĻ° āĻŽāĻ¤ āĻ•āĻŋāĻ›ā§ āĻŽāĻ¨ā§‡ āĻĒāĻ°āĻ›ā§‡ āĻ¨āĻž? \"āĻ†āĻŽāĻŋ āĻŽāĻŋāĻ¸āĻ•āĻŋ āĻ¸ā§‡āĻŸ āĻ†āĻĒ āĻ•āĻ°āĻ›āĻŋ\" āĻŦāĻ˛āĻ˛ā§‡ āĻ•ā§‡āĻŽāĻ¨ āĻšāĻ¯āĻŧ?" + step4_1: "āĻĒā§‹āĻ¸ā§āĻŸ āĻ•āĻ°ā§‡āĻ›ā§‡āĻ¨?" + step4_2: "āĻ¸āĻžāĻŦāĻžāĻļ! āĻāĻ–āĻ¨ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¨ā§‹āĻŸ āĻŸāĻžāĻ‡āĻŽāĻ˛āĻžāĻ‡āĻ¨ā§‡ āĻĻā§‡āĻ–āĻž āĻ¯āĻžāĻŦā§‡āĨ¤" + step5_1: "āĻāĻ–āĻ¨ āĻ…āĻ¨ā§āĻ¯āĻĻā§‡āĻ°āĻ•ā§‡ āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖ āĻ•āĻ°ā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻŸāĻžāĻ‡āĻŽāĻ˛āĻžāĻ‡āĻ¨āĻ•ā§‡ āĻĒā§āĻ°āĻžāĻŖāĻŦāĻ¨ā§āĻ¤ āĻ•āĻ°ā§‡ āĻ¤ā§āĻ˛ā§āĻ¨āĨ¤" + step5_2: "āĻ†āĻĒāĻ¨āĻŋ {featured}-āĻ āĻœāĻ¨āĻĒā§āĻ°āĻŋāĻ¯āĻŧ āĻ¨ā§‹āĻŸāĻ—ā§āĻ˛āĻŋ āĻĻā§‡āĻ–āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨, āĻ¯āĻžāĻ¤ā§‡ āĻ†āĻĒāĻ¨āĻŋ āĻ¯ā§‡ āĻŦā§āĻ¯āĻ•ā§āĻ¤āĻŋāĻ•ā§‡ āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āĻ°ā§‡āĻ¨ āĻ¤āĻžāĻ•ā§‡ āĻŦā§‡āĻ›ā§‡ āĻ¨āĻŋāĻ¤ā§‡ āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨, āĻ…āĻĨāĻŦāĻž {explore}-āĻ āĻœāĻ¨āĻĒā§āĻ°āĻŋāĻ¯āĻŧ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻĻā§‡āĻ° āĻĻā§‡āĻ–āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ā§ˇ" + step5_3: "āĻāĻ•āĻœāĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ•ā§‡ āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖ āĻ•āĻ°āĻ¤ā§‡, āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻ†āĻ‡āĻ•āĻ¨ā§‡ āĻ•ā§āĻ˛āĻŋāĻ• āĻ•āĻ°ā§āĻ¨ āĻāĻŦāĻ‚ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻĒā§ƒāĻˇā§āĻ āĻžāĻ¤ā§‡ \"āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖ āĻ•āĻ°ā§āĻ¨\" āĻŦāĻžāĻŸāĻ¨ā§‡ āĻ•ā§āĻ˛āĻŋāĻ• āĻ•āĻ°ā§āĻ¨āĨ¤" + step5_4: "āĻ¯āĻĻāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻ¨āĻžāĻŽā§‡āĻ° āĻĒāĻžāĻļā§‡ āĻāĻ•āĻŸāĻŋ āĻ˛āĻ• āĻ†āĻ‡āĻ•āĻ¨ āĻĨāĻžāĻ•ā§‡ āĻ¤āĻžāĻšāĻ˛ā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖā§‡āĻ° āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻ—ā§āĻ°āĻšāĻŖ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¤āĻžāĻ°āĻž āĻ•āĻŋāĻ›ā§ āĻ¸āĻŽāĻ¯āĻŧ āĻ¨āĻŋāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤" + step6_1: "āĻ¸āĻŦāĻ•āĻŋāĻ›ā§ āĻ āĻŋāĻ• āĻĨāĻžāĻ•āĻ˛ā§‡ āĻ†āĻĒāĻ¨āĻŋ āĻŸāĻžāĻ‡āĻŽāĻ˛āĻžāĻ‡āĻ¨ā§‡ āĻ…āĻ¨ā§āĻ¯ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻĻā§‡āĻ° āĻ¨ā§‹āĻŸ āĻĻā§‡āĻ–āĻ¤ā§‡ āĻĒāĻžāĻŦā§‡āĻ¨āĨ¤" + step6_2: "āĻ†āĻĒāĻ¨āĻŋ āĻ¸āĻšāĻœā§‡āĻ‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻœāĻžāĻ¨āĻžāĻ¤ā§‡ āĻ…āĻ¨ā§āĻ¯ āĻŦā§āĻ¯āĻ•ā§āĻ¤āĻŋāĻ° āĻ¨ā§‹āĻŸā§‡ \"āĻ°āĻŋāĻ…ā§āĻ¯āĻžāĻ•āĻļāĻ¨\" āĻ¯ā§‹āĻ— āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤" + step6_3: "āĻāĻ•āĻŸāĻŋ āĻ°āĻŋāĻ…ā§āĻ¯āĻžāĻ•āĻļāĻ¨ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻ¤ā§‡, āĻ¨ā§‹āĻŸā§‡ \"+\" āĻšāĻŋāĻšā§āĻ¨ā§‡ āĻ•ā§āĻ˛āĻŋāĻ• āĻ•āĻ°ā§āĻ¨ āĻāĻŦāĻ‚ āĻ†āĻĒāĻ¨āĻžāĻ° āĻĒāĻ›āĻ¨ā§āĻĻā§‡āĻ° āĻ°āĻŋāĻ…ā§āĻ¯āĻžāĻ•āĻļāĻ¨ āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻšāĻ¨ āĻ•āĻ°ā§āĻ¨āĨ¤" + step7_1: "āĻ…āĻ­āĻŋāĻ¨āĻ¨ā§āĻĻāĻ¨! āĻ†āĻĒāĻ¨āĻŋ āĻāĻ–āĻ¨ Misskey-āĻ° āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ• āĻŸāĻŋāĻ‰āĻŸā§‹āĻ°āĻŋāĻ¯āĻŧāĻžāĻ˛āĻŸāĻŋ āĻļā§‡āĻˇ āĻ•āĻ°ā§‡āĻ›ā§‡āĻ¨āĨ¤" + step7_2: "āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ Misskey āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ†āĻ°āĻ“ āĻœāĻžāĻ¨āĻ¤ā§‡ āĻšāĻžāĻ¨, āĻ¤āĻžāĻšāĻ˛ā§‡ {help} āĻ āĻĻā§‡āĻ–ā§āĻ¨āĨ¤" + step7_3: "āĻāĻ–āĻ¨ Misskey āĻ‰āĻĒāĻ­ā§‹āĻ— āĻ•āĻ°ā§āĻ¨ 🚀" +_2fa: + alreadyRegistered: "āĻ†āĻĒāĻ¨āĻŋ āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡ āĻāĻ•āĻŸāĻŋ 2-āĻĢā§āĻ¯āĻžāĻ•ā§āĻŸāĻ° āĻ…āĻĨā§‡āĻ¨āĻŸāĻŋāĻ•ā§‡āĻļāĻ¨ āĻĄāĻŋāĻ­āĻžāĻ‡āĻ¸ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻ¨ āĻ•āĻ°ā§‡āĻ›ā§‡āĻ¨ā§ˇ" + registerDevice: "āĻ¨āĻ¤ā§āĻ¨ āĻĄāĻŋāĻ­āĻžāĻ‡āĻ¸ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻ¨ āĻ•āĻ°ā§āĻ¨" + registerKey: "āĻ¸āĻŋāĻ•āĻŋāĻ‰āĻ°āĻŋāĻŸāĻŋ āĻ•ā§€ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻ¨ āĻ•āĻ°ā§āĻ¨" + step1: "āĻĒā§āĻ°āĻĨāĻŽā§‡, āĻ†āĻĒāĻ¨āĻžāĻ° āĻĄāĻŋāĻ­āĻžāĻ‡āĻ¸ā§‡ {a} āĻŦāĻž {b} āĻāĻ° āĻŽāĻ¤ā§‹ āĻāĻ•āĻŸāĻŋ āĻ…āĻĨā§‡āĻ¨āĻŸāĻŋāĻ•ā§‡āĻļāĻ¨ āĻ…ā§āĻ¯āĻžāĻĒ āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°ā§āĻ¨ā§ˇ" +_permissions: + "read:pages": "āĻ†āĻĒāĻ¨āĻžāĻ° āĻĒā§‡āĻœāĻ—ā§āĻ˛āĻŋ āĻĻā§‡āĻ–ā§āĻ¨" + "write:pages": "āĻĒā§‡āĻœāĻ—ā§āĻ˛āĻŋ āĻ¸āĻŽā§āĻĒāĻžāĻĻāĻ¨āĻž āĻŦāĻž āĻĄāĻŋāĻ˛āĻŋāĻŸ āĻ•āĻ°ā§āĻ¨" +_auth: + pleaseGoBack: "āĻĻā§ŸāĻž āĻ•āĻ°ā§‡ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ā§‡ āĻĢāĻŋāĻ°ā§‡ āĻ¯āĻžāĻ¨" + callback: "āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ā§‡ āĻĢāĻŋāĻ°ā§‡ āĻ¯āĻžāĻšā§āĻ›āĻŋ" + denied: "āĻĒā§āĻ°āĻŦā§‡āĻļ āĻ¨āĻŋāĻˇā§‡āĻ§" +_antennaSources: + all: "āĻ¸āĻ•āĻ˛ āĻ¨ā§‹āĻŸ" + homeTimeline: "āĻ†āĻĒāĻ¨āĻŋ āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖ āĻ•āĻ°āĻ›ā§‡āĻ¨, āĻāĻŽāĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻĻā§‡āĻ° āĻ¨ā§‹āĻŸ" + users: "āĻāĻ• āĻŦāĻž āĻāĻ•āĻžāĻ§āĻŋāĻ• āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻ¨ā§‹āĻŸ" + userList: "āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻžāĻ¯āĻŧ āĻ¨āĻžāĻŽ āĻĨāĻžāĻ•āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻĻā§‡āĻ° āĻ¨ā§‹āĻŸ" + userGroup: "āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ—ā§āĻ°ā§āĻĒā§‡ āĻĨāĻžāĻ•āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻĻā§‡āĻ° āĻ¨ā§‹āĻŸ" +_weekday: + sunday: "āĻ°āĻŦāĻŋāĻŦāĻžāĻ°" + monday: "āĻ¸ā§‹āĻŽāĻŦāĻžāĻ°" + tuesday: "āĻŽāĻ™ā§āĻ—āĻ˛āĻŦāĻžāĻ°" + wednesday: "āĻŦā§āĻ§āĻŦāĻžāĻ°" + thursday: "āĻŦā§ƒāĻšāĻ¸ā§āĻĒāĻ¤āĻŋāĻŦāĻžāĻ°" + friday: "āĻļā§āĻ•ā§āĻ°āĻŦāĻžāĻ°" + saturday: "āĻļāĻ¨āĻŋāĻŦāĻžāĻ°" _widgets: + memo: "āĻ¸ā§āĻŸāĻŋāĻ•āĻŋ āĻ¨ā§‹āĻŸ" notifications: "āĻŦāĻŋāĻœā§āĻžāĻĒā§āĻ¤āĻŋ" timeline: "āĻŸāĻžāĻ‡āĻŽāĻ˛āĻžāĻ‡āĻ¨" + calendar: "āĻ•ā§āĻ¯āĻžāĻ˛ā§‡āĻ¨ā§āĻĄāĻžāĻ°" + trends: "āĻŦāĻ°ā§āĻ¤āĻŽāĻžāĻ¨ā§‡ āĻœāĻ¨āĻĒā§āĻ°āĻŋā§Ÿ" + clock: "āĻ˜āĻĄāĻŧāĻŋ" + rss: "RSS āĻ°āĻŋāĻĄāĻžāĻ°" activity: "āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻ˛āĻžāĻĒ" + photos: "āĻĢāĻŸā§‹āĻ—ā§āĻ˛āĻŋ" + digitalClock: "āĻĄāĻŋāĻœāĻŋāĻŸāĻžāĻ˛ āĻ˜ā§œāĻŋ" federation: "āĻĢā§‡āĻĄāĻŋāĻ­āĻžāĻ°ā§āĻ¸" + postForm: "āĻ¨ā§‹āĻŸ āĻ˛āĻŋāĻ–ā§āĻ¨" + slideshow: "āĻ¸ā§āĻ˛āĻžāĻ‡āĻĄāĻļā§‹" + button: "āĻŦāĻžāĻŸāĻ¨" + onlineUsers: "āĻ…āĻ¨āĻ˛āĻžāĻ‡āĻ¨ā§‡ āĻĨāĻžāĻ•āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ—āĻŖ" jobQueue: "āĻœāĻŦ āĻ•āĻŋāĻ‰" + serverMetric: "āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻŽā§‡āĻŸā§āĻ°āĻŋāĻ•ā§āĻ¸" + aiscript: "AiScript āĻ•āĻ¨āĻ¸ā§‹āĻ˛" + aichan: "āĻ†āĻ‡ āĻšāĻžāĻ¨" _cw: + hide: "āĻ˛ā§āĻ•āĻžāĻ¨" show: "āĻ†āĻ°āĻ“ āĻĻā§‡āĻ–ā§āĻ¨" + chars: "{count} āĻŸāĻŋ āĻ…āĻ•ā§āĻˇāĻ°" + files: "{count} āĻŸāĻŋ āĻĢāĻžāĻ‡āĻ˛" +_poll: + noOnlyOneChoice: "āĻ¸āĻ°ā§āĻŦāĻ¨āĻŋāĻŽā§āĻ¨ 2 āĻŸāĻŋ āĻ…āĻĒāĻļāĻ¨ āĻŦā§‡āĻ›ā§‡ āĻ¨āĻŋāĻ¤ā§‡ āĻšāĻŦā§‡" + choiceN: "āĻŦāĻŋāĻ•āĻ˛ā§āĻĒāĻ—ā§āĻ˛āĻŋ {n}" + noMore: "āĻ†āĻĒāĻ¨āĻŋ āĻ†āĻ° āĻ•ā§‹āĻ¨ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŦā§‡āĻ¨ āĻ¨āĻž" + canMultipleVote: "āĻāĻ•āĻžāĻ§āĻŋāĻ• āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āĻŦāĻžāĻ›āĻžāĻ‡ āĻ•āĻ°āĻž āĻ¯āĻžāĻŦā§‡" + expiration: "āĻĒā§‹āĻ˛ā§‡āĻ° āĻ¸āĻŽāĻ¯āĻŧāĻ¸ā§€āĻŽāĻž" + infinite: "āĻ…āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ" + at: "āĻļā§‡āĻˇ āĻšāĻŦā§‡" + after: "āĻļā§‡āĻˇ āĻšāĻŦā§‡" + deadlineDate: "āĻļā§‡āĻˇ āĻšāĻ“ā§ŸāĻžāĻ° āĻ¤āĻžāĻ°āĻŋāĻ–" + deadlineTime: "āĻ˜āĻŖā§āĻŸāĻž" + duration: "āĻŦā§āĻ¯āĻžāĻĒā§āĻ¤āĻŋāĻ•āĻžāĻ˛" + votesCount: "{n} āĻŸāĻŋ āĻ­ā§‹āĻŸ" + totalVotes: "āĻ¸āĻ°ā§āĻŦāĻŽā§‹āĻŸ {n} āĻŸāĻŋ āĻ­ā§‹āĻŸ" + vote: "āĻ­ā§‹āĻŸ āĻĻāĻŋāĻ¨" + showResult: "āĻ°ā§‡āĻœāĻžāĻ˛ā§āĻŸ āĻĻā§‡āĻ–āĻžāĻ¨" + voted: "āĻ­ā§‹āĻŸ āĻĻāĻŋāĻ¯āĻŧā§‡āĻ›ā§‡āĻ¨" + closed: "āĻļā§‡āĻˇ āĻšā§Ÿā§‡ āĻ—ā§‡āĻ›ā§‡" + remainingDays: "āĻ†āĻ° {d} āĻĻāĻŋāĻ¨ {h} āĻ˜āĻŖā§āĻŸāĻž āĻŦāĻžāĻ•āĻŋ āĻ†āĻ›ā§‡" + remainingHours: "āĻ†āĻ° {h} āĻ˜āĻŖā§āĻŸāĻž {m} āĻŽāĻŋāĻ¨āĻŋāĻŸ āĻŦāĻžāĻ•āĻŋ āĻ†āĻ›ā§‡" _visibility: home: "āĻŽā§‚āĻ˛ āĻĒāĻžāĻ¤āĻž" followers: "āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖāĻ•āĻžāĻ°ā§€" @@ -466,13 +1185,17 @@ _profile: name: "āĻ¨āĻžāĻŽ" username: "āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻ¨āĻžāĻŽ" _exportOrImport: + allNotes: "āĻ¸āĻ•āĻ˛ āĻ¨ā§‹āĻŸ" followingList: "āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡" muteList: "āĻŽāĻŋāĻ‰āĻŸ" blockingList: "āĻŦā§āĻ˛āĻ•" userLists: "āĻ˛āĻŋāĻ¸ā§āĻŸ" +_charts: + federation: "āĻĢā§‡āĻĄāĻŋāĻ­āĻžāĻ°ā§āĻ¸" _timelines: home: "āĻŽā§‚āĻ˛ āĻĒāĻžāĻ¤āĻž" _pages: + viewPage: "āĻ†āĻĒāĻ¨āĻžāĻ° āĻĒā§‡āĻœāĻ—ā§āĻ˛āĻŋ āĻĻā§‡āĻ–ā§āĻ¨" blocks: image: "āĻ›āĻŦāĻŋ" script: @@ -483,6 +1206,12 @@ _pages: arg1: "āĻ˛āĻŋāĻ¸ā§āĻŸ" _randomPick: arg1: "āĻ˛āĻŋāĻ¸ā§āĻŸ" + _dailyRandom: + arg1: "āĻ¸āĻŽā§āĻ­āĻžāĻŦā§āĻ¯āĻ¤āĻž" + dailyRannum: "āĻ°â€ā§āĻ¯āĻžāĻ¨ā§āĻĄāĻŽ āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž (āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻœāĻ¨ā§āĻ¯ āĻĒā§āĻ°āĻ¤āĻŋāĻĻāĻŋāĻ¨ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤ā§€āĻ¤ āĻšā§Ÿ)" + _dailyRannum: + arg1: "āĻ¨ā§āĻ¯ā§‚āĻ¨āĻ¤āĻŽ āĻŽāĻžāĻ¨" + arg2: "āĻ¸āĻ°ā§āĻŦā§‹āĻšā§āĻš āĻŽāĻžāĻ¨" _dailyRandomPick: arg1: "āĻ˛āĻŋāĻ¸ā§āĻŸ" _seedRandomPick: @@ -491,20 +1220,83 @@ _pages: arg1: "āĻ˛āĻŋāĻ¸ā§āĻŸ" _listLen: arg1: "āĻ˛āĻŋāĻ¸ā§āĻŸ" + _numberToString: + arg1: "āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž" + splitStrByLine: "āĻĒāĻžāĻ ā§āĻ¯āĻ•ā§‡ āĻ˛āĻžāĻ‡āĻ¨ā§‡ āĻŦāĻŋāĻ­āĻ•ā§āĻ¤ āĻ•āĻ°ā§āĻ¨" + _splitStrByLine: + arg1: "āĻ˛ā§‡āĻ–āĻž" + ref: "āĻšāĻ˛āĻ•" + aiScriptVar: "AiScript āĻšāĻ˛āĻ•" + fn: "āĻĢāĻžāĻ‚āĻļāĻ¨" + _fn: + slots: "āĻ¸ā§āĻ˛āĻŸāĻ—ā§āĻ˛āĻŋ" + slots-info: "āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ¸ā§āĻ˛āĻŸāĻ•ā§‡ āĻ†āĻ˛āĻžāĻĻāĻž āĻ˛āĻžāĻ‡āĻ¨ā§‡ āĻ˛āĻŋāĻ–ā§āĻ¨" + arg1: "āĻ†āĻ‰āĻŸāĻĒā§āĻŸ" + for: "for-āĻ˛ā§āĻĒ" + _for: + arg1: "āĻ•āĻ¤āĻŦāĻžāĻ° āĻšāĻ˛āĻŦā§‡" + arg2: "āĻ…ā§āĻ¯āĻžāĻ•āĻļāĻ¨" + typeError: "āĻ¸ā§āĻ˛āĻŸ {slot}, {expect} āĻ§āĻ°āĻ¨ā§‡āĻ° āĻŽāĻžāĻ¨ āĻ—ā§āĻ°āĻšāĻŖ āĻ•āĻ°ā§‡, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ {actual} āĻ§āĻ°āĻ¨ā§‡āĻ° āĻŽāĻžāĻ¨ āĻĻā§‡āĻ“ā§ŸāĻž āĻšā§Ÿā§‡āĻ›ā§‡!" + thereIsEmptySlot: "āĻ¸ā§āĻ˛āĻŸ {slot} āĻ–āĻžāĻ˛āĻŋīŧ" types: + string: "āĻ˛ā§‡āĻ–āĻž" + number: "āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž" + boolean: "āĻĢā§āĻ˛ā§āĻ¯āĻžāĻ—" array: "āĻ˛āĻŋāĻ¸ā§āĻŸ" + stringArray: "āĻ˛ā§‡āĻ–āĻžāĻ° āĻ˛āĻŋāĻ¸ā§āĻŸ" + emptySlot: "āĻ–āĻžāĻ˛āĻŋ āĻ¸ā§āĻ˛āĻŸ" + enviromentVariables: "āĻāĻ¨āĻ­āĻžāĻ‡āĻ°āĻ¨āĻŽā§‡āĻ¨ā§āĻŸ āĻ­ā§āĻ¯āĻžāĻ°āĻŋā§Ÿā§‡āĻŦāĻ˛" + pageVariables: "āĻĒā§‡āĻœā§‡āĻ° āĻšāĻ˛āĻ•" + argVariables: "āĻ‡āĻ¨āĻĒā§āĻŸā§‡āĻ° āĻœāĻžā§ŸāĻ—āĻž" +_relayStatus: + requesting: "āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻŽāĻžāĻ¨" + accepted: "āĻ…āĻ¨ā§āĻŽā§‹āĻĻāĻŋāĻ¤" + rejected: "āĻĒā§āĻ°āĻ¤ā§āĻ¯āĻžāĻ–āĻŋāĻ¤" _notification: + fileUploaded: "āĻĢāĻžāĻ‡āĻ˛ āĻ¸āĻĢāĻ˛āĻ­āĻžāĻŦā§‡ āĻ†āĻĒāĻ˛ā§‹āĻĄ āĻ•āĻ°āĻž āĻšā§Ÿā§‡āĻ›ā§‡" + youGotMention: "{name} āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ‰āĻ˛ā§āĻ˛ā§‡āĻ–ā§āĻ¯ āĻ•āĻ°ā§‡āĻ›ā§‡" + youGotReply: "{name} āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻœāĻŦāĻžāĻŦ āĻĻāĻŋā§Ÿā§‡āĻ›ā§‡" + youGotQuote: "{name} āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ‰āĻĻā§āĻ§ā§ƒāĻ¤ āĻ•āĻ°ā§‡āĻ›ā§‡" + youRenoted: "{name} āĻāĻ° Renote" + youGotPoll: "{name} āĻ†āĻĒāĻ¨āĻžāĻ° āĻĒā§‹āĻ˛ā§‡ āĻ­ā§‹āĻŸ āĻĻāĻŋā§Ÿā§‡āĻ›ā§‡" + youGotMessagingMessageFromUser: "{name} āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻŽā§‡āĻ¸ā§‡āĻœ āĻ•āĻ°ā§‡āĻ›ā§‡" + youGotMessagingMessageFromGroup: "{name} āĻ—ā§āĻ°ā§āĻĒā§‡ āĻāĻ•āĻŸāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻŽā§‡āĻ¸ā§‡āĻœ āĻ†āĻ›ā§‡" youWereFollowed: "āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖ āĻ•āĻ°āĻ›ā§‡" + youReceivedFollowRequest: "āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻĒāĻžāĻ“ā§ŸāĻž āĻ—ā§‡āĻ›ā§‡" + yourFollowRequestAccepted: "āĻ†āĻĒāĻ¨āĻžāĻ° āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖ āĻ•āĻ°āĻžāĻ° āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻ—ā§ƒāĻšā§€āĻ¤ āĻšā§Ÿā§‡āĻ›ā§‡" + youWereInvitedToGroup: "āĻ†āĻĒāĻ¨āĻŋ āĻāĻ•āĻŸāĻŋ āĻ—ā§āĻ°ā§āĻĒā§‡ āĻ†āĻŽāĻ¨ā§āĻ¤ā§āĻ°āĻŋāĻ¤ āĻšā§Ÿā§‡āĻ›ā§‡āĻ¨" _types: + all: "āĻ¸āĻ•āĻ˛" follow: "āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡" mention: "āĻ‰āĻ˛ā§āĻ˛ā§‡āĻ–" + reply: "āĻ‰āĻ¤ā§āĻ¤āĻ° āĻĻāĻŋāĻ¨" renote: "āĻ°āĻŋāĻ¨ā§‹āĻŸ" quote: "āĻ‰āĻĻā§āĻ§ā§ƒāĻ¤āĻŋ" reaction: "āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž" + pollVote: "āĻĒā§‹āĻ˛ā§‡ āĻ­ā§‹āĻŸ āĻ†āĻ›ā§‡" + receiveFollowRequest: "āĻĒā§āĻ°āĻžāĻĒā§āĻ¤ āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖā§‡āĻ° āĻ…āĻ¨ā§āĻ°ā§‹āĻ§āĻ¸āĻŽā§‚āĻš" + followRequestAccepted: "āĻ—ā§ƒāĻšā§€āĻ¤ āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖā§‡āĻ° āĻ…āĻ¨ā§āĻ°ā§‹āĻ§āĻ¸āĻŽā§‚āĻš" + groupInvited: "āĻ—ā§āĻ°ā§āĻĒā§‡āĻ° āĻ†āĻŽāĻ¨ā§āĻ¤ā§āĻ°āĻ¨āĻ¸āĻŽā§‚āĻš" + app: "āĻ˛āĻŋāĻ™ā§āĻ• āĻ•āĻ°āĻž āĻ…ā§āĻ¯āĻžāĻĒ āĻĨā§‡āĻ•ā§‡ āĻŦāĻŋāĻœā§āĻžāĻĒā§āĻ¤āĻŋ" _deck: + alwaysShowMainColumn: "āĻ¸āĻ°ā§āĻŦāĻĻāĻž āĻŽā§‡āĻ‡āĻ¨ āĻ•āĻ˛āĻžāĻŽ āĻĻā§‡āĻ–āĻžāĻ¨" + columnAlign: "āĻ•āĻ˛āĻžāĻŽ āĻ¸āĻžāĻœāĻžāĻ¨" + columnMargin: "āĻ•āĻ˛āĻžāĻŽā§‡āĻ° āĻŽāĻ§ā§āĻ¯āĻŦāĻ°ā§āĻ¤ā§€ āĻŽāĻžāĻ°ā§āĻœāĻŋāĻ¨" + columnHeaderHeight: "āĻ•āĻ˛āĻžāĻŽā§‡āĻ° āĻšā§‡āĻĄāĻžāĻ°ā§‡āĻ° āĻ‰āĻšā§āĻšāĻ¤āĻž" + addColumn: "āĻ•āĻ˛āĻžāĻŽ āĻ¯ā§āĻ•ā§āĻ¤ āĻ•āĻ°ā§āĻ¨" + swapLeft: "āĻŦāĻžāĻŽā§‡ āĻ¸āĻ°āĻžāĻ¨" + swapRight: "āĻĄāĻžāĻ¨ā§‡ āĻ¸āĻ°āĻžāĻ¨" + swapUp: "āĻ‰āĻĒāĻ°ā§‡ āĻ‰āĻ āĻžāĻ¨" + swapDown: "āĻ¨āĻŋāĻšā§‡ āĻ¨āĻžāĻŽāĻžāĻ¨" + stackLeft: "āĻŦāĻžāĻŽ āĻ•āĻ˛āĻžāĻŽā§‡ āĻ¸āĻžāĻœāĻžāĻ¨" + popRight: "āĻĄāĻžāĻ¨āĻĻāĻŋāĻ•ā§‡ āĻ°āĻžāĻ–ā§āĻ¨" + profile: "āĻĒā§āĻ°ā§‹āĻĢāĻžāĻ‡āĻ˛" _columns: + main: "āĻĒā§āĻ°āĻ§āĻžāĻ¨" + widgets: "āĻ‰āĻ‡āĻœā§‡āĻŸāĻ—ā§āĻ˛āĻŋ" notifications: "āĻŦāĻŋāĻœā§āĻžāĻĒā§āĻ¤āĻŋ" tl: "āĻŸāĻžāĻ‡āĻŽāĻ˛āĻžāĻ‡āĻ¨" antenna: "āĻ…ā§āĻ¯āĻžāĻ¨ā§āĻŸā§‡āĻ¨āĻž" list: "āĻ˛āĻŋāĻ¸ā§āĻŸ" mentions: "āĻ‰āĻ˛ā§āĻ˛ā§‡āĻ–āĻ¸āĻŽā§‚āĻš" + direct: "āĻĄāĻžāĻ‡āĻ°ā§‡āĻ•ā§āĻŸ āĻ¨ā§‹āĻŸāĻ—ā§āĻ˛āĻŋ" diff --git a/locales/de-DE.yml b/locales/de-DE.yml index 05360e170..cec230e10 100644 --- a/locales/de-DE.yml +++ b/locales/de-DE.yml @@ -141,6 +141,8 @@ flagAsBot: "Als Bot markieren" flagAsBotDescription: "Aktiviere diese Option, falls dieses Benutzerkonto durch ein Programm gesteuert wird. Falls aktiviert, agiert es als Flag fÃŧr andere Entwickler zur Verhinderung von endlosen Kettenreaktionen mit anderen Bots und lässt Misskeys interne Systeme dieses Benutzerkonto als Bot behandeln." flagAsCat: "Als Katze markieren" flagAsCatDescription: "Aktiviere diese Option, um dieses Benutzerkonto als Katze zu markieren." +flagShowTimelineReplies: "Antworten in der Chronik anzeigen" +flagShowTimelineRepliesDescription: "Ist diese Option aktiviert, so werden Antworten von Benutzern auf die Notizen anderer Benuzter in der Chronik an angezeigt." autoAcceptFollowed: "Follow-Anfragen von Benutzern, denen du folgst, automatisch akzeptieren" addAccount: "Benutzerkonto hinzufÃŧgen" loginFailed: "Anmeldung fehlgeschlagen" @@ -822,6 +824,10 @@ leaveGroupConfirm: "MÃļchtest du \"{name}\" wirklich verlassen?" useDrawerReactionPickerForMobile: "Auf mobilen Geräten ausfahrbare Reaktionsauswahl anzeigen" welcomeBackWithName: "Willkommen zurÃŧck, {name}" clickToFinishEmailVerification: "DrÃŧcke bitte auf [{ok}], um die Email-Bestätigung abzuschließen." +overridedDeviceKind: "Gerätetyp" +smartphone: "Smartphone" +tablet: "Tablet" +auto: "Automatisch" _emailUnavailable: used: "Diese Email-Adresse wird bereits verwendet" format: "Das Format dieser Email-Adresse ist ungÃŧltig" @@ -1258,8 +1264,8 @@ _exportOrImport: excludeMutingUsers: "Stummgeschaltete Benutzer aussortieren" excludeInactiveUsers: "Inaktive Benutzer aussortieren" _charts: - federationInstancesIncDec: "Unterschied in der Anzahl von fÃļrderierenden Instanzen" - federationInstancesTotal: "Anzahl aller fÃļderierenden Instanzen" + federation: "FÃļderation" + apRequest: "Anfragen" usersIncDec: "Unterschied in der Anzahl von Benutzern" usersTotal: "Anzahl aller Benutzer" activeUsers: "Aktive Benutzer" diff --git a/locales/en-US.yml b/locales/en-US.yml index 9a2b0bf5c..43ecf9820 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -141,6 +141,8 @@ flagAsBot: "Mark this account as a bot" flagAsBotDescription: "Enable this option if this account is controlled by a program. If enabled, it will act as a flag for other developers to prevent endless interaction chains with other bots and adjust Misskey's internal systems to treat this account as a bot." flagAsCat: "Mark this account as a cat" flagAsCatDescription: "Enable this option to mark this account as a cat." +flagShowTimelineReplies: "Show replies in timeline" +flagShowTimelineRepliesDescription: "Shows replies of users to notes of other users in the timeline if turned on." autoAcceptFollowed: "Automatically approve follow requests from users you're following" addAccount: "Add account" loginFailed: "Failed to sign in" @@ -822,6 +824,10 @@ leaveGroupConfirm: "Are you sure you want to leave \"{name}\"?" useDrawerReactionPickerForMobile: "Display reaction picker as drawer on mobile" welcomeBackWithName: "Welcome back, {name}" clickToFinishEmailVerification: "Please click [{ok}] to complete email verification." +overridedDeviceKind: "Device type" +smartphone: "Smartphone" +tablet: "Tablet" +auto: "Auto" _emailUnavailable: used: "This email address is already being used" format: "The format of this email address is invalid" @@ -1258,8 +1264,8 @@ _exportOrImport: excludeMutingUsers: "Exclude muted users" excludeInactiveUsers: "Exclude inactive users" _charts: - federationInstancesIncDec: "Difference in # of federating instances" - federationInstancesTotal: "Total # of federating instances" + federation: "Federation" + apRequest: "Requests" usersIncDec: "Difference in # of users" usersTotal: "Total # of users" activeUsers: "Active users" diff --git a/locales/eo-UY.yml b/locales/eo-UY.yml index 0689834a1..286a0d857 100644 --- a/locales/eo-UY.yml +++ b/locales/eo-UY.yml @@ -65,6 +65,8 @@ files: "Dosieroj" download: "Elŝuti" driveFileDeleteConfirm: "Ĉu vi certas, ke vi volas forviŝi la dosieron \"{name}\"? Tio ankaÅ­ forviŝos la notojn kiuj citas ĝin." unfollowConfirm: "Ĉu vi certas, ke vi volas ĉesi sekvi {name}?" +exportRequested: "Vi petis elporton. Ĝi povas bezoni longan tempon. ElportaÄĩo estos aldonita al disko post elportado." +importRequested: "Vi petis enportadon. Ĝi povas bezoni longan tempon. " lists: "Listoj" noLists: "Neniu listo" note: "Noti" @@ -77,7 +79,10 @@ manageLists: "Bonteni liston" error: "Eraro" somethingHappened: "Problemo okazis" retry: "Provi denove" +pageLoadError: "Fuŝiĝis enlegi paĝon." +pageLoadErrorDescription: "Ordinare tio okazas pro la retkondiĉo aÅ­ la staplo de retumilo.\nPurigu la staplon, aÅ­ refaru poste. " serverIsDead: "La servilo ne respondas. Vole atendu iom kaj penu denove." +youShouldUpgradeClient: "Por montri ĉi paĝon, bonvolu enlegi refoje kaj uzi klienton novversian." enterListName: "Entajpu nomon de la listo" privacy: "Privateco" makeFollowManuallyApprove: "Eksekvi vin devas peti al vi" @@ -132,6 +137,7 @@ settingGuide: "Agordaj rekomendoj" cacheRemoteFiles: "Stapli forajn dosierojn" flagAsBot: "Marki kiel esti uzanto de roboto" flagAsCat: "Marki kiel esti kato" +flagShowTimelineReplies: "Montri respondon de notoj en templinio." autoAcceptFollowed: "AÅ­tomate akcepti la peton de sekvado far uzantoj kiujn vi sekvas" addAccount: "Aldoni konton" loginFailed: "Saluto malsukcesis" @@ -178,6 +184,7 @@ noUsers: "Neniu uzanto" editProfile: "Redakti profilon" noteDeleteConfirm: "Ĉu vi certas ke vi volas forviŝi la noton?" pinLimitExceeded: "Vi ne povas alpingli pli" +intro: "Instalado de Misskey finiĝis! Kreu administran konton." done: "Fini" processing: "Prilaboradoâ€Ļ" preview: "AntaÅ­montro" @@ -326,6 +333,7 @@ antennaExcludeKeywords: "Krom ĉefterminoj" notifyAntenna: "Oni sciigos novajn notojn" withFileAntenna: "Nur kun aldonaÄĩo" enableServiceworker: "Aktivigi ServiceWorker" +caseSensitive: "Distingi usklecon" withReplies: "Inkluzive respondoj" connectedTo: "Sekva konto estas konektita" notesAndReplies: "Kun respondoj" @@ -363,6 +371,7 @@ notFound: "Ne trovita" uploadFolder: "Dosierujo implicita por alŝuto" cacheClear: "Malplenigi staplon" markAsReadAllNotifications: "Marki ĉiujn sciigojn kiel legita" +markAsReadAllUnreadNotes: "Marki ĉiujn afiŝojn kiel legita" markAsReadAllTalkMessages: "Marki ĉiujn retbabiladojn kiel legita" help: "Manlibro de uzado" inputMessageHere: "Entajpu mesaĝon tie" @@ -385,6 +394,7 @@ next: "Sekve" retype: "Retajpu" noteOf: "Noto de {user}" inviteToGroup: "Inviti al grupo" +maxNoteTextLength: "Limnombro de leteroj en noto" quoteAttached: "Kun citaÄĩo" quoteQuestion: "Ĉu vi volas aldoni citaÄĩon?" noMessagesYet: "AnkoraÅ­ neniu mesaĝo" @@ -393,6 +403,7 @@ onlyOneFileCanBeAttached: "Oni povas aldoni nur unu dosieron po mesaĝo." signinRequired: "Bonvolu saluti" invitations: "Inviti" invitationCode: "Kodo de invito" +checking: "kontrolante..." available: "Disposabla" unavailable: "Ne disponebla" usernameInvalidFormat: "La uzantnomo povas enhavi minusklajn kaj majusklajn literojn, numerojn, nur kaj '_'." @@ -404,6 +415,7 @@ strongPassword: "Forta pasvorto" passwordMatched: "Konforma" passwordNotMatched: "Nekonforma" signinWith: "Saluti kun {x}" +signinFailed: "Fuŝiĝis ensaluti. Bonvolu kontroli uzantnomon kaj pasvorton." or: "AÅ­" language: "Lingvo" uiLanguage: "Lingvo de fasado" @@ -430,6 +442,7 @@ total: "Entute" appearance: "EksteraÄĩo" clientSettings: "Agordoj de kliento" accountSettings: "Agordoj de konto" +promote: "Reklamata" numberOfDays: "Nombro de tagoj" hideThisNote: "Kaŝi la noton" showFeaturedNotesInTimeline: "Montri en via templinio notojn de la tendenco" @@ -465,11 +478,13 @@ scratchpad: "Malneta redaktilo" output: "Elmeto" script: "Skripto" disablePagesScript: "Malebligi AiScript en la paĝoj" +updateRemoteUser: "Aktualigi informon de foraj uzantoj" deleteAllFiles: "Forviŝi ĉiujn dosierojn" deleteAllFilesConfirm: "Ĉu vi certas, ke vi volas forviŝi ĉiujn dosierojn?" removeAllFollowing: "Ĉesi sekvi ĉiujn sekvatojn" userSuspended: "La uzanto estas flostigita." userSilenced: "La uzanto estas mutigita." +yourAccountSuspendedTitle: "La konto estas frostigita." menu: "Menuo" addItem: "Aldoni novaÄĩon" deletedNote: "Forviŝita noto" @@ -499,6 +514,7 @@ generateAccessToken: "Generi aÅ­tentikigan pecon" permission: "Permesoj" enableAll: "Ebligi ĉiujn" disableAll: "Malebligi ĉiujn" +tokenRequested: "Alirpermeso al konto" notificationType: "Tipo de sciigoj" edit: "Redakti" emailServer: "Retpoŝta servilo" @@ -530,6 +546,7 @@ regenerateLoginToken: "Regeneri la aÅ­tentikigan pecon" fileIdOrUrl: "Dosiera identigilo aÅ­ URL" behavior: "Konduto" sample: "Ekzemplo" +reporter: "Informanto" send: "Sendi" openInNewTab: "Malfermi en nova langeto" editTheseSettingsMayBreakAccount: "Redakti tiujn agordojn povas damaĝi vian konton." @@ -553,6 +570,7 @@ followingCount: "La nombro de sekvatoj" followersCount: "La nombro de sekvantoj" sentReactionsCount: "La nombro de la reagoj senditaj" receivedReactionsCount: "La nombro de la reagoj ricevitaj" +pollVotesCount: "Nombro de voĉdonado" yes: "Jes" no: "Ne" driveFilesCount: "La nombro de la dosieroj sur la disko" @@ -587,6 +605,7 @@ createdAt: "Kreita je" updatedAt: "Laste ĝisdatigita" saveConfirm: "Ĉu vi konservas la ŝanĝon?" deleteConfirm: "Ĉu certas forviŝi?" +invalidValue: "Nevalida valoro" closeAccount: "Forigi konton" currentVersion: "La aktuala versio" latestVersion: "La plej nova versio" @@ -608,14 +627,18 @@ userInfo: "Informoj de uzanto" unknown: "Nekonata" online: "Surkonektita" offline: "Forkonektita" +notRecommended: "Evitindaj" instanceBlocking: "Bloki specifajn nodojn" selectAccount: "Elekti konton" user: "Uzantoj" administration: "Bontenado" accounts: "Kontoj" +configure: "Agordi" recentPosts: "Novaj afiŝoj" +popularPosts: "Populara noto" shareWithNote: "Kundividi en noto" ads: "ReklamaÄĩo" +expiration: "Limtempo" memo: "Memorigilo" high: "Alta" middle: "Meza" @@ -629,12 +652,18 @@ searchResult: "Serĉorezultoj" hashtags: "Kradvorto" troubleshooting: "Problemsolvi" learnMore: "Lernu pli" +misskeyUpdated: "Misskey ĝisdatiĝis!" +whatIsNew: "Montri novaÄĩojn" translate: "Traduki" translatedFrom: "Tradukita el {x}" +accountDeletionInProgress: "La konto estas forviŝanta." +resolved: "Solvita" +unresolved: "Nesolvita" breakFollow: "Ĉesigi la sekvadon al vi" itsOn: "Ŝaltita" emailRequiredForSignup: "Registri konton devas konformi retpoŝtadreson" unread: "Nelegita" +filter: "Filtrilo" controlPanel: "Ŝaltpodio" manageAccounts: "Bonteni la kontojn" classic: "Klasika" @@ -644,6 +673,7 @@ ffVisibility: "Videbleco de viaj sekvatoj/sekvantoj" ffVisibilityDescription: "Oni permesas agordi tiuln kiuj povas vidi la homojn kiujn vi sekvas, kaj la homojn kiuj sekvas vin." continueThread: "Pli vidi la mesaĝaron" incorrectPassword: "Nevalida pasvorto" +voteConfirm: "Ĉu vi voĉdonas {choice}n?" leaveGroup: "Eliĝi el la grupo" leaveGroupConfirm: "Ĉu vi certas ke vi volas eliĝi el la grupo {name}?" welcomeBackWithName: "Bonrevenon, {name}!" @@ -661,11 +691,14 @@ _signup: emailAddressInfo: "Entajpu vian retpoŝton" _accountDelete: accountDelete: "Forigi konton" + requestAccountDelete: "Peti forviŝi konton" + started: "Forviŝado komenciĝis." _ad: back: "Nuligi" _forgotPassword: enterEmail: "Entajpu la retpoŝton kiun vi registrigis al via konto. Ligilo por restarigi pasvorton estos sendita al la retadreso." _gallery: + my: "Mia afiŝo" liked: "Ŝatitaj notoj" like: "Ŝati" _email: @@ -687,6 +720,7 @@ _aboutMisskey: allContributors: "Ĉiuj kontribuantoj" source: "Fontkodo" translation: "Traduki Misskey" + donate: "Mondonaci al Misskey" patrons: "Mecenatoj" _mfm: dummy: "Misskey evoluigas la mondon de Fediverso" @@ -724,6 +758,7 @@ _channel: owned: "Bontenitaj de vi" following: "Sekvado" usersCount: "{n} partoprenantoj" + notesCount: "{n} notoj" _menuDisplay: sideFull: "Flanko" sideIcon: "Flanko (bildsimbolo)" @@ -735,9 +770,15 @@ _wordMute: hard: "Per la servilo" mutedNotes: "Silentigitaj notoj" _theme: + explore: "Serĉi koloraron" + install: "Instali koloraron" manage: "Bonteni kolorarojn" code: "Kolorara kodo" description: "Priskribo" + installedThemes: "Instalita koloraro" + make: "Krei koloraron" + addConstant: "Aldoni konstanton" + constant: "Konstanto" defaultValue: "ImplicitaÄĩa valoro" color: "Koloro" func: "Funkcio" @@ -745,12 +786,14 @@ _theme: lighten: "Brileco" keys: bg: "Fono" + shadow: "Ombro" navBg: "Fono de flanka stango" link: "Ligilo" hashtag: "Kradvorto" mention: "Mencioj" mentionMe: "Mencio al vi" renote: "Plusendita" + infoBg: "Fono de informo" buttonBg: "Fono de butono" driveFolderBg: "Fono de dosierujo de la disko" messageBg: "Fono de la retbabilejo" @@ -823,6 +866,7 @@ _widgets: timeline: "Templinio" clock: "Horloĝo" activity: "Aktiveco" + photos: "Fotoj" federation: "FederaÄĩo" slideshow: "Bildoprezento" button: "Butono" @@ -830,10 +874,12 @@ _widgets: aichan: "Ai" _cw: show: "Vidi pli" + chars: "{count} literoj" files: "{count} dosiero(j)" _poll: choiceN: "Balotilo {n}" noMore: "Oni ne povas aldoni pli." + expiration: "Limtempo" infinite: "Neniam" deadlineTime: "hor" votesCount: "{n} balotiloj" @@ -876,7 +922,7 @@ _exportOrImport: blockingList: "Blokitoj" userLists: "Listoj" _charts: - federationInstancesTotal: "La totala nombro de nodoj federantaj" + federation: "FederaÄĩo" usersTotal: "La totala nombro de la uzantoj" activeUsers: "La nombro de la uzantoj aktivaj" notesTotal: "La totala nombro de notoj" @@ -965,6 +1011,45 @@ _pages: _join: arg1: "Listoj" arg2: "apartigilo" + _add: + arg1: "A" + arg2: "B" + _subtract: + arg1: "A" + arg2: "B" + _multiply: + arg1: "A" + arg2: "B" + _divide: + arg1: "A" + arg2: "B" + _mod: + arg1: "A" + arg2: "B" + _eq: + arg1: "A" + arg2: "B" + _notEq: + arg1: "A" + arg2: "B" + _and: + arg1: "A" + arg2: "B" + _or: + arg1: "A" + arg2: "B" + _lt: + arg1: "A" + arg2: "B" + _gt: + arg1: "A" + arg2: "B" + _ltEq: + arg1: "A" + arg2: "B" + _gtEq: + arg1: "A" + arg2: "B" random: "Hazardo" _randomPick: arg1: "Listoj" diff --git a/locales/es-ES.yml b/locales/es-ES.yml index a9339acf7..1e85e7d8c 100644 --- a/locales/es-ES.yml +++ b/locales/es-ES.yml @@ -1091,8 +1091,8 @@ _exportOrImport: blockingList: "Bloqueados" userLists: "Listas" _charts: - federationInstancesIncDec: "VariaciÃŗn de instancias federando" - federationInstancesTotal: "Total de instancias federando" + federation: "FederaciÃŗn" + apRequest: "Pedidos" usersIncDec: "VariaciÃŗn de usuarios" usersTotal: "Total de usuarios" activeUsers: "Cantidad de usuarios activos" diff --git a/locales/fr-FR.yml b/locales/fr-FR.yml index 62f85bef8..1deda414c 100644 --- a/locales/fr-FR.yml +++ b/locales/fr-FR.yml @@ -141,6 +141,7 @@ flagAsBot: "Ce compte est un robot" flagAsBotDescription: "Si ce compte est gÊrÊ de manière automatisÊe, choisissez cette option. Si elle est activÊe, elle agira comme un marqueur pour les autres dÊveloppeurs afin d'Êviter des chaÃŽnes d'interaction sans fin avec d'autres robots et d'ajuster les systèmes internes de Misskey pour traiter ce compte comme un robot." flagAsCat: "Ce compte est un chat" flagAsCatDescription: "Activer l'option \" Je suis un chat \" pour ce compte." +flagShowTimelineReplies: "Afficher les rÊponses dans le fil" autoAcceptFollowed: "Accepter automatiquement les demandes d’abonnement venant d’utilisateur¡rice¡s que vous suivez" addAccount: "Ajouter un compte" loginFailed: "Échec de la connexion" @@ -811,6 +812,7 @@ ffVisibilityDescription: "Permet de configurer qui peut voir les personnes que t continueThread: "Afficher la suite du fil" deleteAccountConfirm: "Votre compte sera supprimÊ. Êtes vous certain ?" incorrectPassword: "Le mot de passe est incorrect." +voteConfirm: "Confirmez-vous votre vote pour ÂĢ {choice} Âģ ?" hide: "Masquer" leaveGroup: "Quitter le groupe" leaveGroupConfirm: "Êtes vous sÃģr de vouloir quitter \"{name}\" ?" @@ -972,6 +974,8 @@ _wordMute: hard: "Strict" mutedNotes: "Notes filtrÊes" _instanceMute: + instanceMuteDescription2: "SÊparer avec de nouvelles lignes" + title: "Masque les notes venant des instances listÊes." heading: "Instances à mettre en sourdine" _theme: explore: "Explorer les thèmes" @@ -1247,8 +1251,8 @@ _exportOrImport: excludeMutingUsers: "Exclure les utilisateur¡rice¡s mis en sourdine" excludeInactiveUsers: "Exclure les utilisateur¡rice¡s inactifs" _charts: - federationInstancesIncDec: "Variation du nombre d'instances fÊdÊrÊes" - federationInstancesTotal: "Nombre total d'instances fÊdÊrÊes" + federation: "FÊdÊration" + apRequest: "RequÃĒtes" usersIncDec: "Variation du nombre d'utilisateur¡rice¡s" usersTotal: "Nombre des utilisateur¡rice¡s au total" activeUsers: "Nombre d'utilisateurices actif¡ve¡s" diff --git a/locales/id-ID.yml b/locales/id-ID.yml index a1d52f6ef..be766e72c 100644 --- a/locales/id-ID.yml +++ b/locales/id-ID.yml @@ -106,6 +106,7 @@ clickToShow: "Klik untuk melihat" sensitive: "Konten sensitif" add: "Tambahkan" reaction: "Reaksi" +reactionSetting: "Reaksi untuk dimunculkan di bilah reaksi" reactionSettingDescription2: "Geser untuk memindah urutkan, klik untuk menghapus, tekan \"+\" untuk menambahkan" rememberNoteVisibility: "Ingat pengaturan visibilitas catatan" attachCancel: "Hapus lampiran" @@ -140,6 +141,8 @@ flagAsBot: "Atur akun ini sebagai Bot" flagAsBotDescription: "Jika akun ini dikendalikan oleh program, tetapkanlah opsi ini. Jika diaktifkan, ini akan berfungsi sebagai tanda bagi pengembang lain untuk mencegah interaksi berantai dengan bot lain dan menyesuaikan sistem internal Misskey untuk memperlakukan akun ini sebagai bot." flagAsCat: "Atur akun ini sebagai kucing" flagAsCatDescription: "Nyalakan tanda ini untuk menandai akun ini sebagai kucing." +flagShowTimelineReplies: "Tampilkan balasan di linimasa" +flagShowTimelineRepliesDescription: "Menampilkan balasan pengguna dari note pengguna lain di linimasa apabila dinyalakan." autoAcceptFollowed: "Setujui otomatis permintaan mengikuti dari pengguna yang kamu ikuti" addAccount: "Tambahkan akun" loginFailed: "Gagal untuk masuk" @@ -234,6 +237,8 @@ resetAreYouSure: "Yakin mau atur ulang?" saved: "Telah disimpan" messaging: "Pesan" upload: "Unggah" +keepOriginalUploading: "Simpan gambar asli" +keepOriginalUploadingDescription: "Simpan gambar yang diunggah sebagaimana gambar aslinya. Bila dimatikan, versi tampilan web akan dihasilkan pada saat diunggah." fromDrive: "Dari Drive" fromUrl: "Dari URL" uploadFromUrl: "Unggah dari URL" @@ -446,6 +451,7 @@ uiLanguage: "Bahasa antarmuka pengguna" groupInvited: "Telah diundang ke grup" aboutX: "Tentang {x}" useOsNativeEmojis: "Gunakan Emoji bawaan sistem operasi" +disableDrawer: "Jangan gunakan menu bergaya laci" youHaveNoGroups: "Kamu tidak memiliki grup" joinOrCreateGroup: "Bergabunglah dengan grup atau kamu dapat membuat grupmu sendiri." noHistory: "Tidak ada riwayat" @@ -589,6 +595,7 @@ smtpSecure: "Gunakan SSL/TLS implisit untuk koneksi SMTP" smtpSecureInfo: "Matikan ini ketika menggunakan STARTTLS" testEmail: "Tes pengiriman surel" wordMute: "Bisukan kata" +instanceMute: "Bisuka instansi" userSaysSomething: "{name} mengatakan sesuatu" makeActive: "Aktifkan" display: "Tampilkan" @@ -616,8 +623,11 @@ reportAbuse: "Laporkan" reportAbuseOf: "Laporkan {name}" fillAbuseReportDescription: "Mohon isi rincian laporan. Jika laporan ini mengenai catatan yang spesifik, mohon lampirkan serta URL catatan tersebut." abuseReported: "Laporan kamu telah dikirimkan. Terima kasih." +reporter: "Pelapor" reporteeOrigin: "Yang dilaporkan" reporterOrigin: "Pelapor" +forwardReport: "Teruskan laporan ke instansi luar" +forwardReportIsAnonymous: "Untuk melindungi privasi akun kamu, akun anonim dari sistem akan digunakan sebagai pelapor pada instansi luar." send: "Kirim" abuseMarkAsResolved: "Tandai laporan sebagai selesai" openInNewTab: "Buka di tab baru" @@ -679,6 +689,7 @@ center: "Tengah" wide: "Lebar" narrow: "Sempit" reloadToApplySetting: "Pengaturan ini akan diterapkan saat memuat halaman kembali. Apakah kamu ingin memuat halaman kembali sekarang?" +needReloadToApply: "Pengaturan ini hanya akan diterapkan setelah memuat ulang halaman." showTitlebar: "Tampilkan bilah judul" clearCache: "Hapus tembolok" onlineUsersCount: "{n} orang sedang daring" @@ -739,6 +750,7 @@ notRecommended: "Tidak disarankan" botProtection: "Perlindungan Bot" instanceBlocking: "Instansi yang diblokir" selectAccount: "Pilih akun" +switchAccount: "Ganti akun" enabled: "Aktif" disabled: "Nonaktif" quickAction: "Aksi cepat" @@ -787,6 +799,7 @@ pubSub: "Akun Pub/Sub" lastCommunication: "Komunikasi terakhir" resolved: "Selesai" unresolved: "Belum selesai" +breakFollow: "Batalkan mengikuti" itsOn: "Aktif" itsOff: "Nonaktif" emailRequiredForSignup: "Membutuhkan alamat surel untuk mendaftar" @@ -806,6 +819,15 @@ deleteAccountConfirm: "Akun akan dihapus. Apakah kamu yakin?" incorrectPassword: "Kata sandi salah." voteConfirm: "Konfirmasi suara kamu untuk ({choice})īŧŸ" hide: "Sembunyikan" +leaveGroup: "Keluar grup" +leaveGroupConfirm: "Apakah kamu yakin untuk keluar dari \"{name}\"?" +useDrawerReactionPickerForMobile: "Tampilkan bilah reaksi sebagai laci di ponsel" +welcomeBackWithName: "Selamat datang kembali, {name}." +clickToFinishEmailVerification: "Mohon klik [{ok}] untuk menyelesaikan verifikasi email." +overridedDeviceKind: "Tipe perangkat" +smartphone: "Ponsel" +tablet: "Tablet" +auto: "Otomatis" _emailUnavailable: used: "Alamat surel ini telah digunakan" format: "Format tidak valid." @@ -963,6 +985,11 @@ _wordMute: soft: "Lembut" hard: "Keras" mutedNotes: "Catatan yang dibisukan" +_instanceMute: + instanceMuteDescription: "Pengaturan ini akan membisukan note/renote apa saja dari instansi yang terdaftar, termasuk pengguna yang membalas pengguna lain dalam instansi yang dibisukan." + instanceMuteDescription2: "Pisah dengan baris baru" + title: "Sembunyikan note dari instansi terdaftar." + heading: "Daftar instansi yang akan dibisukan" _theme: explore: "Jelajahi tema" install: "Pasang tema" @@ -1234,9 +1261,11 @@ _exportOrImport: muteList: "Bisukan" blockingList: "Blokir" userLists: "Daftar" + excludeMutingUsers: "Kecualikan pengguna yang dibisukan" + excludeInactiveUsers: "Kecualikan pengguna tidak aktif" _charts: - federationInstancesIncDec: "Perbedaan jumlah # instansi yang memfederasi" - federationInstancesTotal: "Jumlah # instansi yang memfederasi" + federation: "Federasi" + apRequest: "Permintaan" usersIncDec: "Perbedaan dalam # pengguna" usersTotal: "Jumlah # pengguna" activeUsers: "Pengguna aktif" diff --git a/locales/it-IT.yml b/locales/it-IT.yml index d13e53625..c4ec4232a 100644 --- a/locales/it-IT.yml +++ b/locales/it-IT.yml @@ -1177,8 +1177,8 @@ _exportOrImport: blockingList: "Account bloccati" userLists: "Liste" _charts: - federationInstancesIncDec: "Variazione del numero di istanze federate" - federationInstancesTotal: "Numero totale di istanze federate" + federation: "Federazione" + apRequest: "Richieste" usersIncDec: "Variazione del numero di utenti" usersTotal: "Numero totale di utenti" activeUsers: "Numero di utenti attivi" diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 8fd41e533..ac8d4951a 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -141,6 +141,8 @@ flagAsBot: "BotとしãĻč¨­åŽš" flagAsBotDescription: "こぎã‚ĸã‚Ģã‚ĻãƒŗトがプログナムãĢよãŖãĻ運į”¨ã•ã‚Œã‚‹å ´åˆã¯ã€ã“ぎフナグをã‚ĒãƒŗãĢしぞす。ã‚ĒãƒŗãĢすると、反åŋœãŽé€ŖéŽ–ã‚’é˜˛ããŸã‚ãŽãƒ•ãƒŠã‚°ã¨ã—ãĻäģ–ぎ開į™ē者ãĢåŊšįĢ‹ãŖたり、MisskeyãŽã‚ˇã‚šãƒ†ãƒ ä¸Šã§ãŽæ‰ąã„ãŒBotãĢ合ãŖたもぎãĢãĒりぞす。" flagAsCat: "CatとしãĻč¨­åŽš" flagAsCatDescription: "こぎã‚ĸã‚Ģã‚ĻãƒŗトがįŒĢであることをį¤ēす場合は、こぎフナグをã‚ĒãƒŗãĢしぞす。" +flagShowTimelineReplies: "ã‚ŋイムナイãƒŗãĢノãƒŧトへぎčŋ”äŋĄã‚’襨į¤ēする" +flagShowTimelineRepliesDescription: "ã‚ĒãƒŗãĢすると、ã‚ŋイムナイãƒŗãĢãƒĻãƒŧã‚ļãƒŧぎノãƒŧトäģĨ外ãĢもそぎãƒĻãƒŧã‚ļãƒŧぎäģ–ぎノãƒŧトへぎčŋ”äŋĄã‚’襨į¤ēしぞす。" autoAcceptFollowed: "フりロãƒŧ中ãƒĻãƒŧã‚ļãƒŧからぎフりロãƒĒクをč‡Ē動æ‰ŋčĒ" addAccount: "ã‚ĸã‚Ģã‚ĻãƒŗトをčŋŊ加" loginFailed: "ログイãƒŗãĢå¤ąæ•—ã—ãžã—ãŸ" @@ -822,6 +824,10 @@ leaveGroupConfirm: "「{name}」から抜けぞすかīŧŸ" useDrawerReactionPickerForMobile: "ãƒĸバイãƒĢデバイ゚ぎときドロワãƒŧã§čĄ¨į¤ē" welcomeBackWithName: "おかえりãĒさい、{name}さん" clickToFinishEmailVerification: "[{ok}]をæŠŧしãĻã€ãƒĄãƒŧãƒĢã‚ĸドãƒŦ゚ぎįĸēčĒã‚’厌äē†ã—ãĻください。" +overridedDeviceKind: "デバイ゚ã‚ŋイプ" +smartphone: "゚マãƒŧトフりãƒŗ" +tablet: "ã‚ŋブãƒŦット" +auto: "č‡Ē動" _emailUnavailable: used: "æ—ĸãĢäŊŋį”¨ã•ã‚ŒãĻいぞす" @@ -1296,8 +1302,8 @@ _exportOrImport: excludeInactiveUsers: "äŊŋわれãĻいãĒいã‚ĸã‚Ģã‚Ļãƒŗトを除外" _charts: - federationInstancesIncDec: "é€Ŗ合ぎåĸ—減" - federationInstancesTotal: "é€ŖåˆãŽåˆč¨ˆ" + federation: "é€Ŗ合" + apRequest: "ãƒĒクエ゚ト" usersIncDec: "ãƒĻãƒŧã‚ļãƒŧぎåĸ—減" usersTotal: "ãƒĻãƒŧã‚ļãƒŧãŽåˆč¨ˆ" activeUsers: "ã‚ĸクテã‚ŖブãƒĻãƒŧã‚ļãƒŧ数" diff --git a/locales/ja-KS.yml b/locales/ja-KS.yml index 45ab9684d..b5b4e7257 100644 --- a/locales/ja-KS.yml +++ b/locales/ja-KS.yml @@ -81,6 +81,8 @@ somethingHappened: "ãĒんかã‚ĸã‚Ģãƒŗことがčĩˇã“ãŖたで" retry: "もãŖãēんやるīŧŸ" pageLoadError: "ペãƒŧジぎčĒ­ãŋčžŧãŋãĢå¤ąæ•—ã—ãĻしもうたでâ€Ļ" pageLoadErrorDescription: "これは晎通、ネットワãƒŧクかブナã‚Ļã‚ļキãƒŖãƒƒã‚ˇãƒĨが原因やからね。キãƒŖãƒƒã‚ˇãƒĨをクãƒĒã‚ĸã™ã‚‹ã‹ã€ã‚‚ã†ãĄãŖとだけ垅ãŖãĻくれへんかīŧŸ" +serverIsDead: "The server is not responding. Please wait for a while before trying again." +youShouldUpgradeClient: "To display this page, please reload and use a new version client. " enterListName: "ãƒĒ゚ト名をå…ĨれãĻや" privacy: "ãƒ—ãƒŠã‚¤ãƒã‚ˇãƒŧ" makeFollowManuallyApprove: "č‡Ē分がčĒã‚ãŸäēēだけがこぎã‚ĸã‚Ģã‚ĻãƒŗトをフりロãƒŧできるようãĢする" @@ -104,6 +106,7 @@ clickToShow: "æŠŧしたらčĻ‹ãˆã‚‹ã§" sensitive: "ãĄã‚‡ãŖとã‚ĸã‚Ģãƒŗやつやで" add: "åĸ—やす" reaction: "ãƒĒã‚ĸã‚¯ã‚ˇãƒ§ãƒŗ" +reactionSetting: "Reaction that will be displayed in Picker. " reactionSettingDescription2: "ドナッグでä¸Ļãŗæ›ŋえ、クãƒĒックで削除、īŧ‹ã‚’æŠŧしãĻčŋŊ加やで。" rememberNoteVisibility: "å…Ŧ開į¯„å›˛čĻšãˆã¨ã„ãĻ" attachCancel: "ぎãŖけるぎやめる" @@ -138,6 +141,8 @@ flagAsBot: "Botやで" flagAsBotDescription: "もしこぎã‚ĸã‚Ģã‚ĻãƒŗトがプログナムãĢよãŖãĻ運į”¨ã•ã‚Œã‚‹ã‚“ã‚„ãŖたら、こぎフナグをã‚ĒãƒŗãĢしãĻたぎむで。ã‚ĒãƒŗãĢすると、反åŋœãŽé€ŖéŽ–ã‚’é˜˛ããŸã‚ãŽãƒ•ãƒŠã‚°ã¨ã—ãĻäģ–ぎ開į™ē者ãĢåŊšįĢ‹ãŖたり、MisskeyãŽã‚ˇã‚šãƒ†ãƒ ä¸Šã§ãŽæ‰ąã„ãŒBotãĢ合ãŖたもんãĢãĒるんやで。" flagAsCat: "Catやで" flagAsCatDescription: "ワãƒŦ、įŒĢãĄã‚ƒã‚“ãĒらこぎフナグをつけãĻãŋīŧŸ" +flagShowTimelineReplies: "It will display the reply to the note in the timeline. " +flagShowTimelineRepliesDescription: "It will display the reply to notes other than the user notes in the timeline when you turn it on. " autoAcceptFollowed: "フりロãƒŧしとるãƒĻãƒŧã‚ļãƒŧからぎフりロãƒŧãƒĒクエ゚トを勝手ãĢč¨ąå¯ã—ã¨ã" addAccount: "ã‚ĸã‚Ģã‚ĻãƒŗトをčŋŊ加" loginFailed: "ログイãƒŗãĢå¤ąæ•—ã—ãĻしもうたâ€Ļ" @@ -232,6 +237,8 @@ resetAreYouSure: "ãƒĒã‚ģットしãĻええんīŧŸ" saved: "äŋå­˜ã—たでīŧ" messaging: "チãƒŖット" upload: "ã‚ĸップロãƒŧド" +keepOriginalUploading: "Retain the original image. " +keepOriginalUploadingDescription: "When uploading the clip, the original version will be retained. Turning it of then uploading will produce images for public use. " fromDrive: "ドナイブから" fromUrl: "URLから" uploadFromUrl: "URLã‚ĸップロãƒŧド" @@ -884,6 +891,8 @@ _exportOrImport: blockingList: "ブロック" userLists: "ãƒĒ゚ト" _charts: + federation: "é€Ŗ合" + apRequest: "ãƒĒクエ゚ト" usersTotal: "ãƒĻãƒŧã‚ļãƒŧãŽåˆč¨ˆ" activeUsers: "ã‚ĸクテã‚ŖブãƒĻãƒŧã‚ļãƒŧ数" notesIncDec: "ノãƒŧトぎåĸ—減" diff --git a/locales/ko-KR.yml b/locales/ko-KR.yml index 38a328862..116e397ff 100644 --- a/locales/ko-KR.yml +++ b/locales/ko-KR.yml @@ -141,6 +141,8 @@ flagAsBot: "나는 봇ėž…니다" flagAsBotDescription: "ė´ ęŗ„ė •ė„ ėžë™í™”된 ėˆ˜ë‹¨ėœŧ로 ėš´ėšŠí•  ę˛Ŋėš°ė— 활ė„ąí™”í•´ ėŖŧė„¸ėš”. ė´ 플래그ëĨŧ 활ė„ąí™”하늴, 다ëĨ¸ 봇ė´ ė´ëĨŧ ė°¸ęŗ í•˜ė—Ŧ 봇 ëŧëĻŦė˜ ëŦ´í•œ ė—°ė‡„ 반ė‘ė„ 회í”ŧ하거나, ė´ ęŗ„ė •ė˜ ė‹œėŠ¤í…œ ėƒė—ė„œė˜ ėˇ¨ę¸‰ė´ Bot ėš´ė˜ė— ėĩœė í™”되는 등ė˜ ëŗ€í™”ę°€ ėƒęšë‹ˆë‹¤." flagAsCat: "나는 ęŗ ė–‘ė´ë‹¤ëƒĨ" flagAsCatDescription: "ė´ ęŗ„ė •ė´ ęŗ ė–‘ė´ëŧ늴 활ė„ąí™” 해ėŖŧė„¸ėš”." +flagShowTimelineReplies: "타ėž„ëŧė¸ė— 노트ė˜ ë‹ĩ글ė„ 표ė‹œí•˜ę¸°" +flagShowTimelineRepliesDescription: "ė´ ė„¤ė •ė„ 활ė„ąí™”하늴 타ėž„ëŧė¸ė— 다ëĨ¸ ėœ ė € 간ė˜ ë‹ĩ글ė„ 표ė‹œí•Šë‹ˆë‹¤." autoAcceptFollowed: "팔로ėš° ė¤‘ė¸ ėœ ė €ëĄœëļ€í„°ė˜ 팔로ėš° ėš”ė˛­ė„ ėžë™ ėˆ˜ëŊ" addAccount: "ęŗ„ė • ėļ”ę°€" loginFailed: "로그ė¸ė— ė‹¤íŒ¨í–ˆėŠĩ니다" @@ -822,6 +824,10 @@ leaveGroupConfirm: "\"{name}\"ė—ė„œ 나갈까ėš”?" useDrawerReactionPickerForMobile: "ëĒ¨ë°”ėŧė—ė„œ 드로ė–´ 메뉴로 표ė‹œ" welcomeBackWithName: "환ė˜í•Šë‹ˆë‹¤, {name}님" clickToFinishEmailVerification: "[{ok}]ëĨŧ 눌ëŸŦ ė´ëŠ”ėŧ ė¸ėĻė„ ė™„ëŖŒí•˜ė„¸ėš”." +overridedDeviceKind: "ėžĨėš˜ ėœ í˜•" +smartphone: "ėŠ¤ë§ˆíŠ¸í°" +tablet: "태블ëĻŋ" +auto: "ėžë™" _emailUnavailable: used: "ė´ 메ėŧ ėŖŧė†ŒëŠ” ė‚ŦėšŠė¤‘ėž…니다" format: "형ė‹ė´ ė˜Ŧ바ëĨ´ė§€ ė•ŠėŠĩ니다" @@ -1258,8 +1264,8 @@ _exportOrImport: excludeMutingUsers: "뮤트한 ėœ ė € ė œė™¸í•˜ę¸°" excludeInactiveUsers: "휴면 ė¤‘ė¸ ęŗ„ė • ė œė™¸í•˜ę¸°" _charts: - federationInstancesIncDec: "ė—°í•Š ė¸ėŠ¤í„´ėŠ¤ ėˆ˜ ėĻę°" - federationInstancesTotal: "ė—°í•Š ė¸ėŠ¤í„´ėŠ¤ ėˆ˜ 합ęŗ„" + federation: "ė—°í•Š" + apRequest: "ėš”ė˛­" usersIncDec: "ėœ ė € ėˆ˜ ėĻę°" usersTotal: "ėœ ė € ėˆ˜ 합ęŗ„" activeUsers: "활ė„ą ėœ ė € ėˆ˜" diff --git a/locales/nl-NL.yml b/locales/nl-NL.yml index 386357f2d..38f9a88af 100644 --- a/locales/nl-NL.yml +++ b/locales/nl-NL.yml @@ -291,6 +291,8 @@ _exportOrImport: userLists: "Lijsten" excludeMutingUsers: "Negeer gedempte gebruikers" excludeInactiveUsers: "Negeer inactieve gebruikers" +_charts: + federation: "Federatie" _timelines: home: "Startpagina" _pages: diff --git a/locales/pl-PL.yml b/locales/pl-PL.yml index 27772663b..0b57a3a46 100644 --- a/locales/pl-PL.yml +++ b/locales/pl-PL.yml @@ -1084,7 +1084,8 @@ _exportOrImport: blockingList: "Zablokuj" userLists: "Listy" _charts: - federationInstancesTotal: "Łącznie sfederowanych instancji" + federation: "Federacja" + apRequest: "Åģądania" usersTotal: "Łącznie # uÅŧytkownikÃŗw" activeUsers: "Aktywni uÅŧytkownicy" _instanceCharts: diff --git a/locales/ru-RU.yml b/locales/ru-RU.yml index 7de9f8ff9..b29d2173c 100644 --- a/locales/ru-RU.yml +++ b/locales/ru-RU.yml @@ -235,6 +235,7 @@ resetAreYouSure: "На ŅĐ°ĐŧĐžĐŧ Đ´ĐĩĐģĐĩ ŅĐąŅ€ĐžŅĐ¸Ņ‚ŅŒ?" saved: "ĐĄĐžŅ…Ņ€Đ°ĐŊĐĩĐŊĐž" messaging: "ХООйŅ‰ĐĩĐŊиŅ" upload: "ЗаĐŗŅ€ŅƒĐˇĐ¸Ņ‚ŅŒ" +keepOriginalUploading: "ĐĄĐžŅ…Ņ€Đ°ĐŊиŅ‚ŅŒ иŅŅ…ОдĐŊĐžĐĩ иСОйŅ€Đ°ĐļĐĩĐŊиĐĩ" fromDrive: "ĐĄ ÂĢдиŅĐēĐ°Âģ" fromUrl: "По ŅŅŅ‹ĐģĐēĐĩ" uploadFromUrl: "ЗаĐŗŅ€ŅƒĐˇĐ¸Ņ‚ŅŒ ĐŋĐž ŅŅŅ‹ĐģĐēĐĩ" @@ -743,6 +744,7 @@ notRecommended: "НĐĩ Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒĐĩŅ‚ŅŅ" botProtection: "БоŅ‚ОСаŅ‰Đ¸Ņ‚Đ°" instanceBlocking: "БĐģĐžĐēиŅ€ĐžĐ˛ĐēĐ° иĐŊŅŅ‚Đ°ĐŊŅĐžĐ˛" selectAccount: "ВŅ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ ŅƒŅ‡Ņ‘Ņ‚ĐŊŅƒŅŽ СаĐŋиŅŅŒ" +switchAccount: "ĐĄĐŧĐĩĐŊиŅ‚ŅŒ ŅƒŅ‡Ņ‘Ņ‚ĐŊŅƒŅŽ СаĐŋиŅŅŒ" enabled: "ВĐēĐģ." disabled: "ОŅ‚ĐēĐģ." quickAction: "БŅ‹ŅŅ‚Ņ€ĐžĐĩ Đ´ĐĩĐšŅŅ‚виĐĩ" @@ -1249,8 +1251,8 @@ _exportOrImport: excludeMutingUsers: "За иŅĐēĐģŅŽŅ‡ĐĩĐŊиĐĩĐŧ СаĐŗĐģŅƒŅˆĐĩĐŊĐŊŅ‹Ņ… ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģĐĩĐš" excludeInactiveUsers: "БĐĩС ĐŊĐĩĐ°ĐēŅ‚ивĐŊŅ‹Ņ… ŅƒŅ‡Ņ‘Ņ‚ĐŊŅ‹Ņ… СаĐŋиŅĐĩĐš" _charts: - federationInstancesIncDec: "ИСĐŧĐĩĐŊĐĩĐŊиĐĩ вĐŊĐĩŅˆĐŊиŅ… ŅĐ˛ŅĐˇĐĩĐš" - federationInstancesTotal: "КоĐģиŅ‡ĐĩŅŅ‚вО вĐŊĐĩŅˆĐŊиŅ… ŅĐ˛ŅĐˇĐĩĐš" + federation: "ФĐĩĐ´ĐĩŅ€Đ°Ņ†Đ¸Ņ" + apRequest: "ЗаĐŋŅ€ĐžŅŅ‹" usersIncDec: "ИСĐŧĐĩĐŊĐĩĐŊиĐĩ Ņ‡Đ¸ŅĐģĐ° ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģĐĩĐš" usersTotal: "КоĐģиŅ‡ĐĩŅŅ‚вО ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģĐĩĐš" activeUsers: "АĐēŅ‚ивĐŊŅ‹Đĩ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģи" diff --git a/locales/sk-SK.yml b/locales/sk-SK.yml new file mode 100644 index 000000000..7ee4f5be7 --- /dev/null +++ b/locales/sk-SK.yml @@ -0,0 +1,1636 @@ +--- +_lang_: "Slovenčina" +headlineMisskey: "SieÅĨ prepojenÃĄ poznÃĄmkami" +introMisskey: "Vitajte! Misskey je otvorenÃĄ a decentralizovanÃĄ mikroblogovacia sluÅžba.\n\"PoznÃĄmkami\" môŞete zdieÄžaÅĨ svoje myÅĄlienky so vÅĄetkÃŊmi okolo. 📡\nPomocou \"reakcií\" môŞete rÃŊchlo vyjadri svoje pocity o kaÅždÊho poznÃĄmkach. 👍\nPoďte objavovaÅĨ svet! 🚀" +monthAndDay: "{day}. {month}." +search: "HÄžadaÅĨ" +notifications: "OznÃĄmenia" +username: "Meno pouŞívateÄža" +password: "Heslo" +forgotPassword: "ZabudnutÊ heslo" +fetchingAsApObject: "Načítam Ãēdaje z Fediverzu" +ok: "OK" +gotIt: "Rozumiem!" +cancel: "ZruÅĄiÅĨ" +enterUsername: "Zadajte meno pouŞívateÄža" +renotedBy: "{user} preposlal/a" +noNotes: "ÅŊiadne poznÃĄmky" +noNotifications: "ÅŊiadne oznÃĄmenia" +instance: "InÅĄtancia" +settings: "Nastavenia" +basicSettings: "VÅĄeobecnÊ nastavenia" +otherSettings: "RozÅĄÃ­renÊ nastavenia" +openInWindow: "OtvoriÅĨ v novom okne" +profile: "Profil" +timeline: "ČasovÃĄ os" +noAccountDescription: "Tento pouŞívateÄž zatiaÄž nenapísal o sebe." +login: "PrihlÃĄsiÅĨ sa" +loggingIn: "Prebieha prihlasovanie" +logout: "OdhlÃĄsiÅĨ" +signup: "RegistrovaÅĨ" +uploading: "NahrÃĄvanie..." +save: "UloÅžiÅĨ" +users: "PouŞívatelia" +addUser: "PridaÅĨ pouŞívateÄža" +favorite: "PÃĄÄi sa mi" +favorites: "ObÄžÃēbenÊ" +unfavorite: "NepÃĄÄi sa mi" +favorited: "PridanÊ do obÄžÃēbenÃŊch" +alreadyFavorited: "UÅž je medzi obÄžÃēbenÃŊmi" +cantFavorite: "Nepodarilo sa pridaÅĨ medzi obÄžÃēbenÊ." +pin: "PripnÃēÅĨ" +unpin: "OdopnÃēÅĨ" +copyContent: "KopírovaÅĨ obsah" +copyLink: "KopírovaÅĨ odkaz" +delete: "OdstrÃĄniÅĨ" +deleteAndEdit: "OdstrÃĄniÅĨ a upraviÅĨ" +deleteAndEditConfirm: "Naozaj chcete odstrÃĄniÅĨ tÃēto poznÃĄmku a upraviÅĨ ju? Stratíte tÃŊm vÅĄetky reakcie a odpovede na ňu." +addToList: "PridaÅĨ do zoznamu" +sendMessage: "OdoslaÅĨ sprÃĄvu" +copyUsername: "KopírovaÅĨ meno pouŞívateÄža" +searchUser: "HÄžadaÅĨ pouŞívateÄžov" +reply: "OdpovedaÅĨ" +loadMore: "ZobraziÅĨ viac" +showMore: "ZobraziÅĨ viac" +youGotNewFollower: "MÃĄte novÊho sledujÃēceho" +receiveFollowRequest: "ÅŊiadosÅĨ o sledovanie prijatÃĄ" +followRequestAccepted: "ÅŊiadosÅĨ o sledovanie akceptovanÃĄ" +mention: "Zmienka" +mentions: "Zmienky" +directNotes: "Priame poznÃĄmky" +importAndExport: "Import a export" +import: "ImportovaÅĨ" +export: "ExportovaÅĨ" +files: "SÃēbor/y" +download: "StiahnuÅĨ" +driveFileDeleteConfirm: "Naozaj chcete odstrÃĄniÅĨ sÃēbor \"{name}\"? PoznÃĄmky s tÃŊmto sÃēborom sa odstrÃĄnia tieÅž." +unfollowConfirm: "Naozaj uÅž nechcete sledovaÅĨ {name}?" +exportRequested: "VyÅžiadali ste export. MôŞe to chvíĞu trvaÅĨ. Po skončení pribudne na vaÅĄom disku." +importRequested: "PoÅžiadali ste o export. MôŞe to chvíĞu trvaÅĨ." +lists: "Zoznamy" +noLists: "NemÃĄte Åžiadne zoznamy" +note: "PoznÃĄmka" +notes: "PoznÃĄmky" +following: "Sledujete" +followers: "SledujÃēci" +followsYou: "SledujÃē vÃĄs" +createList: "VytvoriÅĨ zoznam" +manageLists: "SpravovaÅĨ zoznamy" +error: "Chyba" +somethingHappened: "Ups. Niečo sa nepodarilo." +retry: "OpakovaÅĨ" +pageLoadError: "Nepodarilo sa načítaÅĨ strÃĄnku" +pageLoadErrorDescription: "Toto môŞe byÅĨ spôsobenÊ problÊmami so sieÅĨou alebo cachou prehliadača. SkÃēste vyčistiÅĨ cache a potom skÃēsiÅĨ znova po chvíli." +serverIsDead: "Tento server nereaguje. Prosím chvíĞu počkajte a skÃēste znova." +youShouldUpgradeClient: "Na pozretie tejto strÃĄnky prosím obnovte svojho klienta." +enterListName: "Zadajte nÃĄzov zoznamu" +privacy: "SÃēkromie" +makeFollowManuallyApprove: "ÅŊiadosti o sledovanie treba schvÃĄliÅĨ" +defaultNoteVisibility: "PredvolenÃĄ viditeÄžnosÅĨ" +follow: "SledovaÅĨ" +followRequest: "PoÅžiadaÅĨ o sledovanie" +followRequests: "ÅŊiadosti o sledovanie" +unfollow: "NesledovaÅĨ" +followRequestPending: "ÅŊiadosÅĨ o sledovanie čakÃĄ" +enterEmoji: "Zadajte emoji" +renote: "PreposlaÅĨ" +unrenote: "VrÃĄtiÅĨ preposlanie" +renoted: "PreposlanÊ." +cantRenote: "Tento príspevok sa nedÃĄ preposlaÅĨ." +cantReRenote: "Odpoveď nemôŞe byÅĨ odstrÃĄnenÃĄ." +quote: "CitovaÅĨ" +pinnedNote: "PripnutÊ poznÃĄmky" +pinned: "PripnÃēÅĨ" +you: "Vy" +clickToShow: "Kliknutím zobrazíte" +sensitive: "NSFW" +add: "PridaÅĨ" +reaction: "Reakcie" +reactionSetting: "Reakcie zobrazenÊ vo vÃŊbere reakcií" +reactionSettingDescription2: "Ťahaním preusporiadate, kliknutím odstrÃĄnite, Stlačením \"+\" pridÃĄte" +rememberNoteVisibility: "ZapamätaÅĨ nastavenia viditeÄžnosti poznÃĄmky" +attachCancel: "OdstrÃĄniÅĨ prílohu" +markAsSensitive: "OznačiÅĨ ako NSFW" +unmarkAsSensitive: "OdznačiÅĨ NSFW" +enterFileName: "Zadajte nÃĄzov sÃēboru" +mute: "VypnÃēÅĨ zvuk" +unmute: "ZapnÃēÅĨ zvuk" +block: "ZablokovaÅĨ" +unblock: "OdblokovaÅĨ" +suspend: "ZmraziÅĨ" +unsuspend: "OdmraziÅĨ" +blockConfirm: "Naozaj chcete zablokovaÅĨ tento Ãēčet?" +unblockConfirm: "Naozaj chcete odblokovaÅĨ tento Ãēčet?" +suspendConfirm: "Naozaj chcete zmraziÅĨ tento Ãēčet?" +unsuspendConfirm: "Naozaj chcete odmraziÅĨ tento Ãēčet?" +selectList: "Vyberte zoznam" +selectAntenna: "Vyberte antÊnu" +selectWidget: "Vyberte widget" +editWidgets: "UpraviÅĨ widget" +editWidgetsExit: "Hotovo" +customEmojis: "VlastnÊ emoji" +emoji: "Emoji" +emojis: "Emoji" +emojiName: "NÃĄzov emoji" +emojiUrl: "URL obrÃĄzku" +addEmoji: "PridaÅĨ emoji" +settingGuide: "OdporÃēčanÊ nastavenia" +cacheRemoteFiles: "Cachovanie vzdialenÃŊch sÃēborov" +cacheRemoteFilesDescription: "ZakÃĄzanie tohoto nastavenia spôsobí, Åže vzdialenÊ sÃēbory budÃē odkazovanÊ priamo, namiesto ukladania do cache. UÅĄetrí sa tak miesto na serveri, ale zvÃŊÅĄi sa dÃĄtovÃŊ tok, pretoÅže sa negenerujÃē miniatÃēry." +flagAsBot: "Tento Ãēčet je bot" +flagAsBotDescription: "Ak je tento Ãēčet ovlÃĄdanÃŊ programom, zaÅĄkrtnite tÃēto voÄžbu. Ostatní uvidia, Åže je to bot a zabrÃĄni nekonečnÃŊm interakciÃĄm s ďalÅĄÃ­mi botmi a upraví internÊ systÊmy Misskey, aby ho povaÅžoval za bota." +flagAsCat: "Tento Ãēčet je mačka" +flagAsCatDescription: "ZvoÄžte tÃēto voÄžbu, aby bol tento Ãēčet označenÃŊ ako mačka." +flagShowTimelineReplies: "ZobraziÅĨ odpovede na poznÃĄmky v časovej osi" +flagShowTimelineRepliesDescription: "Keď je zapnutÊ, na časovej osi sa zobrazia odpovede k poznÃĄmkam pouŞívateÄžov okrem samotnÃŊch poznÃĄmok." +autoAcceptFollowed: "Automaticky prijaÅĨ sledovanie od Ãēčtov, ktorÊ sledujete" +addAccount: "PridaÅĨ Ãēčet" +loginFailed: "PrihlÃĄsenie sa nepodarilo." +showOnRemote: "ZobraziÅĨ na vzdialenom serveri" +general: "VÅĄeobecnÊ" +wallpaper: "Tapeta" +setWallpaper: "NastaviÅĨ tapetu" +removeWallpaper: "OdstrÃĄniÅĨ tapetu" +searchWith: "HÄžadaÅĨ: {q}" +youHaveNoLists: "NemÃĄte Åžiadne zoznamy" +followConfirm: "Naozaj chcete sledovaÅĨ {name}?" +proxyAccount: "Proxy Ãēčet" +proxyAccountDescription: "Proxy Ãēčet je Ãēčet, ktorÃŊ za určitÃŊch podmienok sleduje pouŞívateÄžov na diaÄžku vaÅĄÃ­m menom. Napríklad keď pouŞívateÄž zaradí vzdialenÊho pouŞívateÄža do zoznamu, pokiaÄž nikto nesleduje pouŞívateÄža na zozname, aktivita nebude doručenÃĄ na server, takÅže namiesto toho bude pouŞívateÄža sledova proxy Ãēčet." +host: "Host" +selectUser: "Vyberte pouŞívateÄža" +recipient: "PrijímateÄž" +annotation: "KomentÃĄre" +federation: "FederÃĄcia" +instances: "InÅĄtancia" +registeredAt: "RegistrÃĄcia" +latestRequestSentAt: "PoslednÃĄ odoslanÃĄ poÅžiadavka" +latestRequestReceivedAt: "PoslednÃĄ prijatÃĄ poÅžiadavka" +latestStatus: "PoslednÃŊ status" +storageUsage: "VyuÅžitÊ ÃēloÅžisko" +charts: "Grafy" +perHour: "za hodinu" +perDay: "za deň" +stopActivityDelivery: "ZastaviÅĨ posielanie aktivít" +blockThisInstance: "BlokovaÅĨ tento server" +operations: "OperÃĄcie" +software: "SoftvÊr" +version: "Verzia" +metadata: "MetadÃĄta" +withNFiles: "{n} sÃēbor(ov)" +monitor: "Monitor" +jobQueue: "Fronta Ãēloh" +cpuAndMemory: "CPU a pamäÅĨ" +network: "SieÅĨ" +disk: "Disk" +instanceInfo: "InformÃĄcie o serveri" +statistics: "Å tatistiky" +clearQueue: "VyčistiÅĨ frontu" +clearQueueConfirmTitle: "Naozaj chcete zruÅĄiÅĨ vÅĄetky Ãēlohy vo fronte?" +clearQueueConfirmText: "VÅĄetky nedoručenÊ poznÃĄmky čakajÃēce vo fronte nebudÃē federovanÊ. Zvyčajne tÃĄto operÃĄcia nie je potrebnÃĄ." +clearCachedFiles: "VyprÃĄzdniÅĨ cache" +clearCachedFilesConfirm: "Naozaj chcete odstrÃĄniÅĨ vÅĄetky nacachovanÊ vzdialenÊ sÃēbory?" +blockedInstances: "BlokovanÊ servery" +blockedInstancesDescription: "Zoznam blokovanÃŊch serverov na riadkoch. BlokovanÊ servery nebudÃē môcÅĨ komunikovaÅĨ s tÃŊmto serverom." +muteAndBlock: "Umlčania a blokÃĄcie" +mutedUsers: "Umlčaní pouŞívatelia" +blockedUsers: "Blokovaní pouŞívatelia" +noUsers: "ÅŊiadni pouŞívatelia" +editProfile: "UpraviÅĨ profil" +noteDeleteConfirm: "Naozaj chcete odstrÃĄniÅĨ tÃēto poznÃĄmku?" +pinLimitExceeded: "ĎalÅĄie poznÃĄmky uÅž nemôŞete pripnÃēÅĨ." +intro: "InÅĄtalÃĄcia Misskey je dokončenÃĄ! Prosím vytvorte administrÃĄtora." +done: "Hotovo" +processing: "Pracujem..." +preview: "NÃĄhÄžad" +default: "PredvolenÊ" +noCustomEmojis: "ÅŊiadne emoji" +noJobs: "ÅŊiadne Ãēlohy" +federating: "FederÃĄcia" +blocked: "BlokovanÊ" +suspended: "ZmrazenÊ" +all: "VÅĄetko" +subscribing: "Odoberanie" +publishing: "Zverejňovanie" +notResponding: "NeodpovedÃĄ" +instanceFollowing: "Sledujem na serveri" +instanceFollowers: "SledujÃēci zo servera" +instanceUsers: "PouŞívatelia servera" +changePassword: "ZmeniÅĨ heslo" +security: "Zabezpečenie" +retypedNotMatch: "ZadanÊ vstupy nesÃēhlasia" +currentPassword: "AktuÃĄlne heslo" +newPassword: "NovÊ heslo" +newPasswordRetype: "NovÊ heslo (znovu)" +attachFile: "PriloÅžiÅĨ sÃēbor" +more: "Viac!" +featured: "ObÄžÃēbenÊ poznÃĄmky" +usernameOrUserId: "Meno pouŞívateÄža alebo ID pouŞívateÄža" +noSuchUser: "PouŞívateÄž sa nenaÅĄiel" +lookup: "VyhÄžadaÅĨ" +announcements: "Oznamy" +imageUrl: "URL obrÃĄzku" +remove: "OdstrÃĄniÅĨ" +removed: "OdstrÃĄnenÊ" +removeAreYouSure: "Naozaj chcete odstrÃĄniÅĨ \"{x}\"?" +deleteAreYouSure: "Naozaj chcete odstrÃĄniÅĨ \"{x}\"?" +resetAreYouSure: "Naozaj resetovaÅĨ?" +saved: "UloÅženÊ" +messaging: "Chat" +upload: "NahraÅĨ sÃēbor" +keepOriginalUploading: "ZachovaÅĨ pôvodnÃŊ obrÃĄzok" +keepOriginalUploadingDescription: "UloŞí pôvodnÃŊ obrÃĄzok ako je. Ak je vypnutÊ, verzia pre web sa vygeneruje pri nahratí." +fromDrive: "Z disku" +fromUrl: "Z URL" +uploadFromUrl: "NahraÅĨ z URL adresy" +uploadFromUrlDescription: "URL adresa nahrÃĄvanÊho sÃēboru" +uploadFromUrlRequested: "Upload vyÅžiadanÃŊ" +uploadFromUrlMayTakeTime: "NahrÃĄvanie môŞe nejakÃŊ čas trvaÅĨ." +explore: "ObjavovaÅĨ" +messageRead: "PrečítanÊ" +noMoreHistory: "To je vÅĄetko" +startMessaging: "ZačaÅĨ chat" +nUsersRead: "prečítanÊ {n} pouŞívateÄžmi" +agreeTo: "SÃēhlasím s {0}" +tos: "Podmienky pouŞívania" +start: "ZačaÅĨ" +home: "Domov" +remoteUserCaution: "Tieto informÃĄcie nemusia byÅĨ aktuÃĄlne, keďŞe pouŞívateÄž je na vzdialenom serveri." +activity: "Aktivita" +images: "ObrÃĄzky" +birthday: "DÃĄtum narodenia" +yearsOld: "{age} rokov" +registeredDate: "DÃĄtum registrÃĄcie" +location: "Lokalita" +theme: "TÊma" +themeForLightMode: "TÊma pri svetlom reÅžime" +themeForDarkMode: "TÊma pri tmavom reÅžime" +light: "SvetlÃĄ" +dark: "TmavÃĄ" +lightThemes: "SvetlÃĄ tÊma" +darkThemes: "TmavÃĄ tÊma" +syncDeviceDarkMode: "SynchronizovaÅĨ tmavÃē tÊmu s nastavení vÃĄÅĄho systÊmu" +drive: "Disk" +fileName: "NÃĄzov sÃēboru" +selectFile: "Vyberte sÃēbor" +selectFiles: "Vyberte sÃēbory" +selectFolder: "Vyberte priečinok" +selectFolders: "Vyberte priečinky" +renameFile: "PremenovaÅĨ sÃēbor" +folderName: "NÃĄzov priečinka" +createFolder: "VytvoriÅĨ priečinok" +renameFolder: "PremenovaÅĨ priečinok" +deleteFolder: "OdstrÃĄniÅĨ priečinok" +addFile: "PridaÅĨ sÃēbor" +emptyDrive: "VÃĄÅĄ disk je prÃĄzdny" +emptyFolder: "Tento priečinok je prÃĄzdny" +unableToDelete: "NedÃĄ sa odstrÃĄniÅĨ" +inputNewFileName: "Zadajte novÃŊ nÃĄzov" +inputNewDescription: "Zadajte novÃŊ popis" +inputNewFolderName: "Zadajte novÃŊ nÃĄzov priečinka" +circularReferenceFolder: "CieÄžovÃŊ priečinok je podpriečinkom priečinka, ktorÃŊ chcete presunÃēÅĨ." +hasChildFilesOrFolders: "NemôŞete odstrÃĄniÅĨ priečinok sÃē sÃēbormi." +copyUrl: "KopírovaÅĨ URL" +rename: "PremenovaÅĨ" +avatar: "Avatar" +banner: "BAnner" +nsfw: "NSFW" +whenServerDisconnected: "Keď sa stratí spojenie so serverom" +disconnectedFromServer: "Spojenie so serverom bolo preruÅĄenÊ" +reload: "ObnoviÅĨ" +doNothing: "IgnorovaÅĨ" +reloadConfirm: "Chcete obnoviÅĨ časovÃē os?" +watch: "SledovaÅĨ" +unwatch: "NesledovaÅĨ" +accept: "SÃēhlasím" +reject: "NesÃēhlasím" +normal: "NormÃĄlne" +instanceName: "NÃĄzov servera" +instanceDescription: "Popis servera" +maintainerName: "SprÃĄvca" +maintainerEmail: "E-mailovÃĄ adresa sprÃĄvcu" +tosUrl: "URL zmluvnÃŊch podmienok" +thisYear: "Rok" +thisMonth: "Mesiac" +today: "Dnes" +dayX: "{day}" +monthX: "{month}" +yearX: "{year}" +pages: "StrÃĄnky" +integration: "IntegrÃĄcia" +connectService: "PripojiÅĨ" +disconnectService: "OdpojiÅĨ" +enableLocalTimeline: "PovoliÅĨ lokÃĄlnu časovÃē os" +enableGlobalTimeline: "PovoliÅĨ globÃĄlnu časovÃē os" +disablingTimelinesInfo: "AdministrÃĄtori a moderÃĄtori majÃē vÅždy prístup ku vÅĄetkÃŊm časovÃŊm osiam, aj keď sÃē vypnutÊ." +registration: "RegistrÃĄcia" +enableRegistration: "PovoliÅĨ registrÃĄciu novÃŊch pouŞívateÄžov" +invite: "PozvaÅĨ" +proxyRemoteFiles: "Proxy vzdialenÃŊch sÃēborov" +proxyRemoteFilesDescription: "Ak je zapnutÊ, vzdialenÊ sÃēbory, ktorÊ nie sÃē uloÅženÊ lokÃĄlne alebo boli odstrÃĄnenÊ kvôli obmedzeniam ÃēloÅžiska, budÃē vyÅžiadanÊ cez proxy, vrÃĄtane generovani miniatÃēr. Neovplyvní to ÃēloÅžisko na serveri." +driveCapacityPerLocalAccount: "Kapacita disku pre pouŞívateÄža" +driveCapacityPerRemoteAccount: "Kapacita disku pre vzdialenÊho pouŞívateÄža" +inMb: "V megabajtoch" +iconUrl: "Favicon URL" +bannerUrl: "URL obrÃĄzku bannera" +backgroundImageUrl: "URL obrÃĄzku pozadia" +basicInfo: "ZÃĄkladnÊ informÃĄcie" +pinnedUsers: "Pripnutí pouŞívatelia" +pinnedUsersDescription: "Zoznam mien pouŞívateÄžov oddelenÃŊch riadkami, ktorÃŊ budÃē pripnutí v zÃĄloÅžke \"ObjavovaÅĨ\"." +pinnedPages: "PripnutÊ strÃĄnky" +pinnedPagesDescription: "Na kaÅždÃŊ riadok zadajte cesty strÃĄnok, ktorÊ chcete pripnÃēÅĨ na vrch strÃĄnky tohoto servera." +pinnedClipId: "ID pripnutÊho klipu" +pinnedNotes: "PripnutÊ poznÃĄmky" +hcaptcha: "hCaptcha" +enableHcaptcha: "ZapnÃēÅĨ hCaptchu" +hcaptchaSiteKey: "Site key" +hcaptchaSecretKey: "Secret key" +recaptcha: "reCAPTCHA" +enableRecaptcha: "ZapnÃēÅĨ ReCAPTCHA" +recaptchaSiteKey: "Site key" +recaptchaSecretKey: "Secret key" +avoidMultiCaptchaConfirm: "PouÅžitie viacerÃŊch Captcha systÊmov môŞe sposobiÅĨ problÊmy. Chcete radÅĄej vypnÃēÅĨ ostatnÊ Captcha systÊmy? MôŞete ich povoliÅĨ viacerÊ stlačení ZruÅĄiÅĨ." +antennas: "AntÊny" +manageAntennas: "SpravovaÅĨ antÊny" +name: "NÃĄzov" +antennaSource: "Zdroj antÊny" +antennaKeywords: "PočÃēvanÊ kÄžÃēčovÊ slovÃĄ" +antennaExcludeKeywords: "VylÃēčenÊ kÄžÃēčovÊ slovÃĄ" +antennaKeywordsDescription: "OddeÄžte medzerami pre podmienku AND alebo novÃŊmi riadkami pre podmienku OR." +notifyAntenna: "UpozorniÅĨ na novÊ poznÃĄmky" +withFileAntenna: "Len poznÃĄmky so sÃēbormi" +enableServiceworker: "PovoliÅĨ Service Worker" +antennaUsersDescription: "Zoznam pouŞívateÄžov jeden na riadok" +caseSensitive: "RozliÅĄuje malÊ a veÄžkÊ písmenÃĄ" +withReplies: "VrÃĄtane odpovedí" +connectedTo: "NasledujÃēce Ãēčty sÃē pripojenÊ" +notesAndReplies: "PoznÃĄmky a odpovede" +withFiles: "VrÃĄtane sÃēborov" +silence: "Ticho" +silenceConfirm: "Naozaj chcete utÃ­ÅĄiÅĨ tohoto pouŞívateÄža?" +unsilence: "VrÃĄtiÅĨ utÃ­ÅĄenie" +unsilenceConfirm: "Naozaj chcete vrÃĄtiÅĨ utÃ­ÅĄenie tohoto pouŞívateÄža?" +popularUsers: "PopulÃĄrni pouŞívatelia" +recentlyUpdatedUsers: "PouŞívatelia s najnovÅĄou aktivitou" +recentlyRegisteredUsers: "NajnovÅĄÃ­ pouŞívatelia" +recentlyDiscoveredUsers: "Naposledy objavení pouŞívatelia" +exploreUsersCount: "Existuje {count} pouŞívateÄžov" +exploreFediverse: "ObjavovaÅĨ Fediverzum" +popularTags: "PopulÃĄrne značky" +userList: "Zoznamy" +about: "InformÃĄcie" +aboutMisskey: "O Misskey" +administrator: "AdministrÃĄtor" +token: "Token" +twoStepAuthentication: "DvojfaktorovÃĄ autentifikÃĄcia" +moderator: "ModerÃĄtor" +nUsersMentioned: "{n} pouŞívateÄžov spomenulo" +securityKey: "BezpečnostnÃŊ kÄžÃēč" +securityKeyName: "NÃĄzov kÄžÃēča" +registerSecurityKey: "RegistrovaÅĨ bezpečnostnÃŊ kÄžÃēč" +lastUsed: "Naposledy pouÅžitÊ" +unregister: "OdregistrovaÅĨ" +passwordLessLogin: "NastaviÅĨ bezheslovÊ prihlÃĄsenie" +resetPassword: "ResetovaÅĨ heslo" +newPasswordIs: "NovÊ heslo je \"{password}\"" +reduceUiAnimation: "Menej UI animÃĄcií" +share: "ZdieÄžaÅĨ" +notFound: "NenÃĄjdenÊ" +notFoundDescription: "NenaÅĄla sa Åžiadna strÃĄnka na zadanej URL." +uploadFolder: "PredvolenÃŊ priečinok pre nahrÃĄvanie" +cacheClear: "VyčistiÅĨ cache" +markAsReadAllNotifications: "OznačiÅĨ vÅĄetky oznÃĄmenia ako prečítanÊ" +markAsReadAllUnreadNotes: "OznačiÅĨ vÅĄetky poznÃĄmky ako prečítanÊ" +markAsReadAllTalkMessages: "OznačiÅĨ vÅĄetky sprÃĄvy ako prečítanÊ" +help: "Pomoc" +inputMessageHere: "Sem napÃ­ÅĄte sprÃĄvu" +close: "ZavrieÅĨ" +group: "Skupina" +groups: "Skupiny" +createGroup: "VytvoriÅĨ skupinu" +ownedGroups: "VlastnenÊ skupiny" +joinedGroups: "Členstvo v skupinÃĄch" +invites: "PozvaÅĨ" +groupName: "NÃĄzov skupiny" +members: "Členovia" +transfer: "Presun" +messagingWithUser: "SÃēkromnÃŊ chat" +messagingWithGroup: "SkupinovÃŊ chat" +title: "Nadpis" +text: "Text" +enable: "PovoliÅĨ" +next: "ĎalÅĄÃ­" +retype: "Zadajte znovu" +noteOf: "PoznÃĄmky pouŞívateÄža {user}" +inviteToGroup: "PozvaÅĨ do skupiny" +maxNoteTextLength: "MaximÃĄlny počet znakov poznÃĄmky" +quoteAttached: "CitovanÊ" +quoteQuestion: "PripojiÅĨ ako citÃĄt?" +noMessagesYet: "ZatiaÄž Åžiadne sprÃĄvy" +newMessageExists: "MÃĄte novÃē sprÃĄvu" +onlyOneFileCanBeAttached: "Ku sprÃĄve môŞete priloÅžiÅĨ len jeden sÃēbor" +signinRequired: "PrihlÃĄste sa, prosím!" +invitations: "PozvaÅĨ" +invitationCode: "KÃŗd pozvÃĄnky" +checking: "Overujem..." +available: "DostupnÊ" +unavailable: "NedostupnÊ" +usernameInvalidFormat: "PovolenÊ sÃē písmenÃĄ, čísla a _." +tooShort: "PríliÅĄ krÃĄtke" +tooLong: "PríliÅĄ dlhÊ" +weakPassword: "SlabÊ heslo" +normalPassword: "DobrÊ heslo" +strongPassword: "SilnÊ heslo" +passwordMatched: "HeslÃĄ sÃē rovnakÊ" +passwordNotMatched: "HeslÃĄ nie sÃē rovnakÊ" +signinWith: "PrihlÃĄsiÅĨ sa pouÅžitím {x}" +signinFailed: "NedÃĄ sa prihlÃĄsiÅĨ. Skontrolujte prosím meno pouŞívateÄža a heslo." +tapSecurityKey: "Ťuknite na bezpečnostnÃŊ kÄžÃēč" +or: "Alebo" +language: "Jazyk" +uiLanguage: "Jazyk pouŞívateÄžskÊho prostredia" +groupInvited: "PozvaÅĨ do skupiny" +aboutX: "O {x}" +useOsNativeEmojis: "PouŞívaÅĨ natívne emoji z OS" +disableDrawer: "NepouŞívaÅĨ ÅĄuflíkovÊ menu" +youHaveNoGroups: "NemÃĄte Åžiadne skupiny" +joinOrCreateGroup: "PoÅžiadajte o pozvanie do existujÃēcej skupiny alebo vytvorte novÃē." +noHistory: "ÅŊiadna histÃŗria" +signinHistory: "HistÃŗria prihlÃĄsení" +disableAnimatedMfm: "VypnÃēÅĨ MFM s animÃĄciou" +doing: "Pracujem..." +category: "KategÃŗrie" +tags: "Značky" +docSource: "Zdroj tohoto dokumentu" +createAccount: "VytvoriÅĨ Ãēčet" +existingAccount: "ExistujÃēci Ãēčet" +regenerate: "PregenerovaÅĨ" +fontSize: "VeÄžkosÅĨ písma" +noFollowRequests: "NemÃĄte nijakÊ čakajÃēce Åžiadosti o sledovanie" +openImageInNewTab: "OtvoriÅĨ obrÃĄzok v novom tabe" +dashboard: "PrehÄžad" +local: "LokÃĄlne" +remote: "VzdialenÊ" +total: "Celkom" +weekOverWeekChanges: "MedzitÃŊÅždňovÊ zmeny" +dayOverDayChanges: "MedzidennÊ zmeny" +appearance: "VzhÄžad" +clientSettings: "Nastavenia klienta" +accountSettings: "Nastavenia Ãēčtu" +promotion: "PropagÃĄcia" +promote: "PropagovaÅĨ" +numberOfDays: "Počet dní" +hideThisNote: "SkryÅĨ tÃēto poznÃĄmku" +showFeaturedNotesInTimeline: "ZobraziÅĨ vÃŊznamnÊ poznÃĄmky v časovej osi" +objectStorage: "ObjektovÊ ÃēloÅžisko" +useObjectStorage: "PouÅžiÅĨ objektovÊ ÃēloÅžisko" +objectStorageBaseUrl: "ZÃĄkladnÃĄ URL" +objectStorageBaseUrlDesc: "URL pouÅžitÃĄ ako referencia. Zadajte URL svojho CDN alebo Proxy ak niektorÊ pouŞívate. S3: 'https://.s3.amazonaws.com', GCS: 'https://storage.googleapis.com/' atď." +objectStorageBucket: "Bucket" +objectStorageBucketDesc: "Prosím zadajte nÃĄzov bucketu od svojho poskytovateÄža." +objectStoragePrefix: "Prefix" +objectStoragePrefixDesc: "SÃēbory budÃē ukladanÊ do priečinkov pod tÃŊmto prefixom." +objectStorageEndpoint: "Endpoint" +objectStorageEndpointDesc: "Nechajte prÃĄzdne ak pouŞívate AWS S3, inak zadajte endpoint ako \"\" alebo \":\". ZÃĄleŞí to od sluÅžby, ktorÃē pouŞívate." +objectStorageRegion: "RegiÃŗn" +objectStorageRegionDesc: "Zadajte regiÃŗn ako 'xx-east-1'. Ak vaÅĄa sluÅžba nerozliÅĄuje regiÃŗny, nechajte prÃĄzdne alebo zadajte 'us-east-1'." +objectStorageUseSSL: "PouÅžiÅĨ SSL" +objectStorageUseSSLDesc: "Vypnite to ak nechcete pouÅžiÅĨ HTTPS na API spojenia." +objectStorageUseProxy: "PripÃĄjaÅĨ cez Proxy" +objectStorageUseProxyDesc: "Vypnite ak nechcete, aby spojenia na API iÅĄli cez Proxy" +objectStorageSetPublicRead: "Pri nahratí nastaviÅĨ \"public-read\"" +serverLogs: "Logy servera" +deleteAll: "OdstrÃĄniÅĨ vÅĄetko" +showFixedPostForm: "ZobraziÅĨ formulÃĄr na novÊ príspevky nad časovou osou" +newNoteRecived: "SÃē novÊ poznÃĄmky" +sounds: "Zvuky" +listen: "PočÃēvaÅĨ" +none: "ÅŊiadne" +showInPage: "ZobraziÅĨ v strÃĄnke" +popout: "Pop-out" +volume: "HlasitosÅĨ" +masterVolume: "CelkovÃĄ hlasitosÅĨ" +details: "Detaily" +chooseEmoji: "VybraÅĨ emoji" +unableToProcess: "OperÃĄciu sa nepodarilo dokončiÅĨ." +recentUsed: "Neposledy pouÅžitÊ" +install: "NainÅĄtalovaÅĨ" +uninstall: "OdinÅĄtalovaÅĨ" +installedApps: "AutorizovanÊ aplikÃĄcie" +nothing: "Nič tu nie je" +installedDate: "DÃĄtum autorizÃĄcie" +lastUsedDate: "Naposledy pouÅžitÊ" +state: "Status" +sort: "ZoradiÅĨ" +ascendingOrder: "Vzostupne" +descendingOrder: "Zostupne" +scratchpad: "ZÃĄpisník" +scratchpadDescription: "ZÃĄpisník poskytuje prostredia pre experimenty s AiScriptom. MôŞete písaÅĨ, spÃēÅĄÅĨaÅĨ a skÃēÅĄaÅĨ vysledky pri interakcii s Misskey." +output: "VÃŊstup" +script: "Skript" +disablePagesScript: "VypnÃēÅĨ AiScript na strÃĄnkach" +updateRemoteUser: "AktualizovaÅĨ informÃĄcie o vzdialenom Ãēčte" +deleteAllFiles: "OdstrÃĄniÅĨ vÅĄetky sÃēbory" +deleteAllFilesConfirm: "Naozaj chcete odstrÃĄniÅĨ vÅĄetky sÃēbory" +removeAllFollowing: "ZruÅĄiÅĨ sledovani vÅĄetkÃŊch pouŞívateÄžov" +removeAllFollowingDescription: "TÃŊmto zruÅĄÃ­te sledovanie vÅĄetkÃŊch pouŞívateÄžov z {host}. Spustite to prosím, keď server napríklad uÅž neexistuje." +userSuspended: "Tento pouŞívateÄž je zmrazenÃŊ." +userSilenced: "Tento pouŞívateÄž je umlčanÃŊ." +yourAccountSuspendedTitle: "Tento Ãēčet je zmrazenÃŊ" +yourAccountSuspendedDescription: "Tento Ãēčet bol zmrazenÃŊ, lebo poruÅĄoval zmluvnÊ podmienky. Kontaktujte administrÃĄtora ak chcete viac podrobností. Prosím nevytvÃĄrajte novÃŊ Ãēčet." +menu: "Menu" +divider: "OddeÄžovač" +addItem: "PridaÅĨ poloÅžku" +relays: "Prenos" +addRelay: "PridaÅĨ prenos" +inboxUrl: "Inbox URL" +addedRelays: "PridanÊ prenosy" +serviceworkerInfo: "Musí byÅĨ zapnutÊ pre push notifikÃĄcie." +deletedNote: "OdstrÃĄnenÊ príspevky" +invisibleNote: "SkrytÊ príspevky" +enableInfiniteScroll: "ZapnÃēÅĨ nekonečnÊ skrolovanie" +visibility: "ViditeÄžnosÅĨ" +poll: "Hlasovanie" +useCw: "SkryÅĨ obsah" +enablePlayer: "OtvoriÅĨ video prehrÃĄvač" +disablePlayer: "ZavrieÅĨ video prehrÃĄvač" +expandTweet: "RozÅĄÃ­riÅĨ tweet" +themeEditor: "Editor tÊm" +description: "Popis" +describeFile: "PridaÅĨ nadpis" +enterFileDescription: "Zadajte nadpis" +author: "Autor" +leaveConfirm: "MÃĄte neuloÅženÊ zmeny. Chcete ich zahodiÅĨ?" +manage: "AdministrÃĄcia" +plugins: "Pluginy" +deck: "Deck" +useBlurEffectForModal: "PouÅžiÅĨ efekt rozmazania na oknÃĄ" +useFullReactionPicker: "PouÅžiÅĨ plnÃē veÄžkosÅĨ vÃŊberu reakcií" +width: "Šírka" +height: "VÃŊÅĄka" +large: "VeÄžkÊ" +medium: "StrednÊ" +small: "MalÊ" +generateAccessToken: "VygenerovaÅĨ prístupovÃŊ token" +permission: "OprÃĄvnenia" +enableAll: "PovoliÅĨ vÅĄetko" +disableAll: "VypnÃēÅĨ vÅĄetko" +tokenRequested: "PovoliÅĨ prístup k Ãēčtu" +pluginTokenRequestedDescription: "Tento plugin bude môcÅĨ pouŞívaÅĨ oprÃĄvnenia nastavenÊ tu." +notificationType: "Typ oznÃĄmenia" +edit: "UpraviÅĨ" +useStarForReactionFallback: "PouÅžiÅĨ ★ keď emoji reakcie nie je znÃĄme" +emailServer: "Email server" +enableEmail: "ZapnÃēÅĨ email" +emailConfigInfo: "PouŞíva sa na overenie emaily pri registrÃĄcii alebo pri zabudnutí hesla" +email: "Email" +emailAddress: "EmailovÃĄ adresa" +smtpConfig: "Nastavenia SMTP servera" +smtpHost: "Host" +smtpPort: "Port" +smtpUser: "Meno pouŞívateÄža" +smtpPass: "Heslo" +emptyToDisableSmtpAuth: "Vynechaním mena hesla vypnete SMTP verifikÃĄciu" +smtpSecure: "PouÅžiÅĨ implicitnÊ SSL/TLS pre SMTP spojenia" +smtpSecureInfo: "Toto vypnite keď pouŞívate STARTTLS" +testEmail: "Doručenie testovacieho emailu" +wordMute: "StÃ­ÅĄenie slova" +instanceMute: "StÃ­ÅĄenÊ servery" +userSaysSomething: "{name} niečo povedal/a" +makeActive: "AktivovaÅĨ" +display: "ZobraziÅĨ" +copy: "KopírovaÅĨ" +metrics: "Metriky" +overview: "PrehÄžad" +logs: "Logy" +delayed: "OneskorenÊ" +database: "DatabÃĄza" +channel: "KanÃĄly" +create: "VytvoriÅĨ" +notificationSetting: "Nastavenia oznÃĄmení" +notificationSettingDesc: "Vyberte typ oznÃĄmení na zobrazenie" +useGlobalSetting: "PouÅžiÅĨ globÃĄlne nastavenie" +useGlobalSettingDesc: "Ak je zapnutÊ, pouÅžijÃē sa oznÃĄmenia vÃĄÅĄho Ãēčtu. Ak je vypnutÊ, pouÅžijÃē sa jednotlivÊ nastavenia." +other: "Ostatní" +regenerateLoginToken: "PregenerovaÅĨ prihlasovací token" +regenerateLoginTokenDescription: "Pregeneruje token interne pouŞívanÃŊ počas prihlÃĄsenia. NormÃĄlne toto netreba robiÅĨ. Ak sa pregeneruje, vÅĄetky zariadenia sa odhlÃĄsia." +setMultipleBySeparatingWithSpace: "ViacerÊ poloÅžky oddeÄžte medzerami." +fileIdOrUrl: "ID alebo URL sÃēboru" +behavior: "SprÃĄvanie" +sample: "UkÃĄÅžka" +abuseReports: "NahlÃĄsenia" +reportAbuse: "NahlÃĄsiÅĨ" +reportAbuseOf: "NahlÃĄsiÅĨ {name}" +fillAbuseReportDescription: "Prosím vyplňte podrobnosti nahlÃĄsenia. Ak sa tÃŊka konkrÊtnej poznÃĄmky, prosím napÃ­ÅĄte jej URL." +abuseReported: "VaÅĄe nahlÃĄsenie je odoslanÊ. VeÄžmi pekne ďakujeme." +reporter: "NahlÃĄsil" +reporteeOrigin: "Pôvod nahlÃĄsenÊho" +reporterOrigin: "Pôvod nahlasovača" +forwardReport: "PreposlaÅĨ nahlÃĄsenie na server" +forwardReportIsAnonymous: "Namiesto vÃĄÅĄho Ãēčtu bude zobrazenÃŊ anonymnÃŊ systÊmovÃŊ Ãēčet na vzdialenom serveri ako autor nahlÃĄsenia." +send: "PoslaÅĨ" +abuseMarkAsResolved: "OznačiÅĨ nahlÃĄsenia ako vyrieÅĄenÊ" +openInNewTab: "OtvoriÅĨ v novom tabe" +openInSideView: "OtvoriÅĨ v bočnom paneli" +defaultNavigationBehaviour: "PredvolenÊ sprÃĄvanie navigÃĄcie" +editTheseSettingsMayBreakAccount: "Úpravou tÃŊchto nastavení si môŞete pokaziÅĨ Ãēčet." +instanceTicker: "InformÃĄcie servera o poznÃĄmkach" +waitingFor: "ČakÃĄ sa na {x}" +random: "NÃĄhodnÊ" +system: "SystÊm" +switchUi: "PrepnÃēÅĨ UI" +desktop: "Desktop" +clip: "Klip" +createNew: "VytvoriÅĨ novÃŊ" +optional: "VoliteÄžnÊ" +createNewClip: "VytvoriÅĨ novÃŊ klip" +public: "VerejnÊ" +i18nInfo: "Misskey je prekladanÃŊ do rôznych jazykov dobrovoÄžníkmi. PomôcÅĨ môŞete na {link}." +manageAccessTokens: "SpravovaÅĨ prístupovÊ tokeny" +accountInfo: "InformÃĄcie o Ãēčte" +notesCount: "Počet poznÃĄmok" +repliesCount: "Počet odoslanÃŊch odpovedí" +renotesCount: "Počet preposlanÃŊch poznÃĄmok" +repliedCount: "Počet odpovedí prijatÃŊch" +renotedCount: "Počet preposlaní prijatÃŊch" +followingCount: "Počet sledovanÃŊch Ãēčtov" +followersCount: "Počet sledujÃēcich" +sentReactionsCount: "Počet poslanÃŊch reakcií" +receivedReactionsCount: "Počet prijatÃŊch reakcií" +pollVotesCount: "Počet odoslanÃŊch hlasov" +pollVotedCount: "Počet prijatÃŊch hlasov" +yes: "Áno" +no: "Nie" +driveFilesCount: "Počet sÃēborov na disku" +driveUsage: "VyuÅžitÊ miesto na disku" +noCrawle: "OdmietaÅĨ indexovanie crawlerov" +noCrawleDescription: "PoÅžiadaÅĨ vyhÄžadÃĄvače, aby neindexovali vÃĄÅĄ profil, poznÃĄmky, strÃĄnky, atď." +lockedAccountInfo: "PokÃŊm nenastavíte viditeÄžnosÅĨ poznÃĄmok na \"Len pre sledujÃēcich\", vaÅĄe príspevky bude vidieÅĨ hocikto, aj keď vyÅžadujete manuÃĄlne potvrdenie sledovania." +alwaysMarkSensitive: "Predvolene označovaÅĨ ako NSFW" +loadRawImages: "NačítaÅĨ originÃĄlne obrÃĄzky namiesto miniatÃēr" +disableShowingAnimatedImages: "NeprehrÃĄvaÅĨ animovanÊ obrÃĄzky" +verificationEmailSent: "Odoslali sme overovací email. Overenie dokončíte kliknutím na odkaz v emaili." +notSet: "NenastavenÊ" +emailVerified: "Email overenÃŊ" +noteFavoritesCount: "Počet obÄžÃēbenÃŊch poznÃĄmok" +pageLikesCount: "Počet obÄžÃēbenÃŊch strÃĄnok" +pageLikedCount: "Počet prijatÃŊch \"pÃĄÄi sa mi\"" +contact: "Kontakt" +useSystemFont: "PouÅžiÅĨ predvolenÊ systÊmovÊ písmo" +clips: "Klip" +experimentalFeatures: "ExperimentÃĄlne funkcie" +developer: "VÃŊvojÃĄr" +makeExplorable: "SpraviÅĨ Ãēčet viditeÄžnÃŊ v \"ObjavovaÅĨ\"" +makeExplorableDescription: "Ak toto vypnete, vÃĄÅĄ Ãēčet sa nezobrazí v sekcii \"Objavovat\"." +showGapBetweenNotesInTimeline: "ZobraziÅĨ medzeru medzi príspevkami časovej osi." +duplicate: "DuplikovaÅĨ" +left: "NaÄžavo" +center: "Stred" +wide: "Å iroko" +narrow: "Úzko" +reloadToApplySetting: "Toto nastavenia sa prejaví aÅž po obnovení strÃĄnky. ObnoviÅĨ teraz?" +needReloadToApply: "Toto nastavenie sa prejaví aÅž po obnovení strÃĄnky." +showTitlebar: "ZobraziÅĨ riadok s nadpisom" +clearCache: "VyprÃĄzdniÅĨ cache" +onlineUsersCount: "{n} pouŞívateÄžov je online" +nUsers: "{n} pouŞívateÄžov" +nNotes: "{n} poznÃĄmok" +sendErrorReports: "PoslaÅĨ nahlÃĄsenie chyby" +sendErrorReportsDescription: "Keď je zapnutÊ, v prípade problÊmu sa odoÅĄlÃē podrobnÊ informÃĄcie o chybe do Misskey. PomôŞete tak zvÃŊÅĄiÅĨ kvalitu Misskey.\nTieto informÃĄcie zahŕňajÃē verziu vÃĄÅĄho OS, pouÅžitÃŊ prehliadač, histÃŗriu aktivít, atď." +myTheme: "Moja tÊma" +backgroundColor: "Pozadie" +accentColor: "Akcent" +textColor: "Text" +saveAs: "UloÅžiÅĨ ako..." +advanced: "RozÅĄÃ­renÊ" +value: "Hodnoty" +createdAt: "VytvorenÊ" +updatedAt: "UpravenÊ" +saveConfirm: "UloÅžiÅĨ zmeny?" +deleteConfirm: "Naozaj odstrÃĄniÅĨ?" +invalidValue: "NesprÃĄvna hodnota." +registry: "Register" +closeAccount: "ZavrieÅĨ Ãēčet" +currentVersion: "AktuÃĄlna verzia" +latestVersion: "NajnovÅĄia verzia" +youAreRunningUpToDateClient: "PouŞívate najnovÅĄiu verziu vÃĄÅĄho klienta." +newVersionOfClientAvailable: "Je dostupnÃĄ novÅĄia verzia vÃĄÅĄho klienta." +usageAmount: "VyuÅžitie" +capacity: "Kapacita" +inUse: "PouÅžitÊ" +editCode: "UpraviÅĨ kÃŗd" +apply: "PouÅžiÅĨ" +receiveAnnouncementFromInstance: "PrijaÅĨ notifikÃĄcie z tohoto servera" +emailNotification: "EmailovÊ upozornenia" +publish: "ZverejniÅĨ" +inChannelSearch: "HÄžadaÅĨ v kanÃĄli" +useReactionPickerForContextMenu: "OtvoriÅĨ vÃŊber reakcií na pravÃŊ klik" +typingUsers: "{users} pÃ­ÅĄe/u" +jumpToSpecifiedDate: "SkočiÅĨ na konkrÊtny dÃĄtum" +showingPastTimeline: "PrÃĄve vidíte starÃē časovÃē os" +clear: "VrÃĄtiÅĨ" +markAllAsRead: "OznačiÅĨ vÅĄetko ako prečítanÊ" +goBack: "SpäÅĨ" +unlikeConfirm: "Naozaj odstrÃĄniÅĨ vÃĄÅĄ like?" +fullView: "PlnÃŊ pohÄžad" +quitFullView: "ZavrieÅĨ plnÃŊ pohÄžad" +addDescription: "PridaÅĨ popis" +userPagePinTip: "Tu môŞete zobraziÅĨ poznÃĄmky zvolením \"PripnÃēÅĨ na profil\" z menu jednotlivÃŊch poznÃĄmok." +notSpecifiedMentionWarning: "TÃĄto poznÃĄmka obsahuje spomenutÃŊch pouŞívateÄžov, ktorí nie sÃē medzi adresÃĄtmi." +info: "InformÃĄcie" +userInfo: "InformÃĄcie o pouŞívateÄžovi" +unknown: "NeznÃĄme" +onlineStatus: "Online status" +hideOnlineStatus: "SkryÅĨ online status" +hideOnlineStatusDescription: "Skrytie vÃĄÅĄho online statusu zníŞi pohodlnosÅĨ niektorÃŊch funkcií ako napríklad vyhÄžadÃĄvanie." +online: "Online" +active: "Aktívny" +offline: "Offline" +notRecommended: "NeodporÃēčanÊ" +botProtection: "Bot ochrana" +instanceBlocking: "BlokovanÊ servery" +selectAccount: "Vyberte Ãēčet" +switchAccount: "PrepnÃēt Ãēčet" +enabled: "ZapnutÊ" +disabled: "VypnutÊ" +quickAction: "RÃŊchle akcie" +user: "PouŞívatelia" +administration: "Spravovanie" +accounts: "Účty" +switch: "PrepnÃēÅĨ" +noMaintainerInformationWarning: "InformÃĄcie sprÃĄvcu nie sÃē nastavenÊ." +noBotProtectionWarning: "Ochrana proti botom nie je nastavenÃĄ." +configure: "KonfigurovaÅĨ" +postToGallery: "VytvoriÅĨ novÃŊ príspevok v galÊrii" +gallery: "GalÊria" +recentPosts: "NajnovÅĄie príspevky" +popularPosts: "PopulÃĄrne príspevky" +shareWithNote: "ZdieÄžaÅĨ s poznÃĄmkou" +ads: "Reklamy" +expiration: "UkončiÅĨ hlasovanie" +memo: "Memo" +priority: "Priorita" +high: "VysokÃĄ" +middle: "StrednÊ" +low: "MÃĄlo" +emailNotConfiguredWarning: "Nie je nastavenÃĄ emailovÃĄ adresa." +ratio: "Pomer" +previewNoteText: "ZobraziÅĨ nÃĄhÄžad" +customCss: "VlastnÊ CSS" +customCssWarn: "Toto nastavenie by sa malo pouŞívaÅĨ iba ak viete čo robíte. Zadanie nesprÃĄvnych hodnôt môŞe spôsobiÅĨ nenormÃĄlne sprÃĄvanie klienta." +global: "GlobÃĄlne" +squareAvatars: "ZobrazovaÅĨ ÅĄtvorcovÊ avatary" +sent: "PoslaÅĨ" +received: "PrijatÊ" +searchResult: "VÃŊsledky hÄžadania" +hashtags: "Hashtagy" +troubleshooting: "RieÅĄenie problÊmov" +useBlurEffect: "PouŞívaÅĨ efekty rozmazania v UI" +learnMore: "ZistiÅĨ viac" +misskeyUpdated: "Misskey sa aktualizoval!" +whatIsNew: "Čo je novÊ?" +translate: "PreloÅžiÅĨ" +translatedFrom: "PreloÅženÊ z {x}" +accountDeletionInProgress: "Odstraňovanie Ãēčtu prebieha" +usernameInfo: "Meno, ktorÊ odliÅĄuje vÃĄÅĄ Ãēčet od ostatnÃŊch na tomto serveri. MôŞete pouÅžiÅĨ abecedu (a~z, A~Z), čísla (0~9) alebo podtrÅžník (_). PouŞívateÄžskÊ menÃĄ sa nedajÃē neskôr zmeniÅĨ." +aiChanMode: "Ai reÅžim" +keepCw: "NechaÅĨ varovania obsahu" +pubSub: "Pub/Sub Ãēčty" +lastCommunication: "PoslednÃĄ komunikÃĄcia" +resolved: "VyrieÅĄenÊ" +unresolved: "NevyrieÅĄenÊ" +breakFollow: "NesledovaÅĨ" +itsOn: "ZapnutÊ" +itsOff: "VypnutÊ" +emailRequiredForSignup: "RegistrÃĄcia vyÅžaduje emailovÃē adresu" +unread: "NeprečítanÊ" +filter: "Filter" +controlPanel: "OvlÃĄdací panel" +manageAccounts: "SprÃĄva Ãēčtov" +makeReactionsPublic: "Reakcie sÃē verejnÊ" +makeReactionsPublicDescription: "Toto spraví vÅĄetky vaÅĄe minulÊ reakcie viditeÄžnÊ verejnosti." +classic: "Klasika" +muteThread: "ZtÃ­ÅĄiÅĨ vlÃĄkno" +unmuteThread: "ZruÅĄiÅĨ stÃ­ÅĄenie vlÃĄkna" +ffVisibility: "ViditeÄžnosÅĨ sledujÃēcich/sledovanÃŊch" +ffVisibilityDescription: "UmoŞňuje nastaviÅĨ kto vidí koho sledujete a kto vÃĄs sleduje." +continueThread: "ZobraziÅĨ pokračovanie vlÃĄkna" +deleteAccountConfirm: "Toto nezvrÃĄtiteÄžne vymaÅže vÃĄÅĄ Ãēčet. PokračovaÅĨ?" +incorrectPassword: "NesprÃĄvne heslo." +voteConfirm: "Potvrdzujete svoj hlas za \"{choice}\"?" +hide: "SkryÅĨ" +leaveGroup: "OpustiÅĨ skupiny" +leaveGroupConfirm: "Naozaj chcete opustiÅĨ \"{name}\"?" +useDrawerReactionPickerForMobile: "ZobraziÅĨ vÃŊber reakcií ako ÅĄuflík na mobile" +welcomeBackWithName: "Vitajte späÅĨ, {name}" +clickToFinishEmailVerification: "Kliknutím na [{ok}] dokončíte overeniu emailu." +overridedDeviceKind: "Typ zariadenia" +smartphone: "SmartfÃŗn" +tablet: "Tablet" +auto: "Automaticky" +_emailUnavailable: + used: "TÃĄto emailovÃĄ adresa sa uÅž pouŞíva" + format: "FormÃĄt emailovej adresy je nesprÃĄvny" + disposable: "JednorÃĄzovÊ emailovÊ adresy sa nemôŞu pouŞívaÅĨ." + mx: "Tento emailovÃŊ server nefunguje." + smtp: "Tento emailovÃŊ server neodpovedÃĄ." +_ffVisibility: + public: "ZverejniÅĨ" + followers: "Len viditeÄžní sledujÃēci" + private: "SÃēkromnÊ" +_signup: + almostThere: "Skoro na konci" + emailAddressInfo: "Prosím zadajte svoju emailovÃē adresu!" + emailSent: "Na vaÅĄu emailovÃē adresu ({email}) sme odoslali email. Vytvorenie Ãēčtu dokončíte kliknutím na odkaz v emaili." +_accountDelete: + accountDelete: "OdstrÃĄniÅĨ Ãēčet" + mayTakeTime: "KeďŞe odstrÃĄnenie Ãēčtu je nÃĄročnÃŊ proces, môŞe to nejakÃŊ čas trvaÅĨ. ZÃĄleŞí koÄžko obsahu ste vytvorili a koÄžko sÃēborov ste nahrali." + sendEmail: "Po odstrÃĄnení Ãēčtu vÃĄm poÅĄleme email na emailovÃē adresu zadanÃē pri registrÃĄcii tohoto Ãēčtu." + requestAccountDelete: "PoÅžiadaÅĨ o zmazanie Ãēčtu" + started: "Odstraňovanie začalo." + inProgress: "Odstraňovanie prebieha" +_ad: + back: "SpäÅĨ" + reduceFrequencyOfThisAd: "TÃēto reklamu zobrazovaÅĨ menej" +_forgotPassword: + enterEmail: "Zadajte emailovÃē adresu, ktorÃē ste pouÅžili pri registrÃĄcii. PoÅĄleme vÃĄm na ňu odkaz, cez ktorÃŊ si môŞete obnoviÅĨ heslo." + ifNoEmail: "Ak ste pri registrÃĄcii nepouÅžili email, prosím kontaktujte administrÃĄtora." + contactAdmin: "Tento server nepodporuje pouŞívanie emailovÃŊch adries, prosím kontaktuje administrÃĄtor, ktorÃŊ vÃĄm resetuje heslo." +_gallery: + my: "Moja galÊria" + liked: "ObÄžÃēbenÊ príspevky" + like: "PÃĄÄi sa mi" + unlike: "NepÃĄÄi sa mi" +_email: + _follow: + title: "MÃĄte novÊho sledujÃēceho" + _receiveFollowRequest: + title: "Dostali ste ÅžiadosÅĨ o sledovanie" +_plugin: + install: "InÅĄtalova pluginy" + installWarn: "Prosím neinÅĄtalujte nedôveryhodnÊ pluginy." + manage: "Spravovanie pluginov" +_registry: + scope: "OblasÅĨ" + key: "KÄžÃēč" + keys: "KÄžÃēče" + domain: "DomÊna" + createKey: "VytvoriÅĨ kÄžÃēč" +_aboutMisskey: + about: "Misskey je open-source softvÊr, ktorÃŊ vyvíja syuilo od 2014." + contributors: "Hlavní prispievatelia" + allContributors: "VÅĄetci prispievatelia" + source: "ZdrojovÃŊ kÃŗd" + translation: "PreloÅžiÅĨ Misskey" + donate: "PodporiÅĨ Misskey" + morePatrons: "Takisto oceňujeme podporu mnoÃŊch ďalÅĄÃ­ch, ktorí tu nie sÃē uvedení. Ďakujeme! đŸĨ°" + patrons: "Prispievatelia" +_nsfw: + respect: "SkryÅĨ NSFW mÊdiÃĄ" + ignore: "NeskrÃŊvaÅĨ NSFW mÊdiÃĄ" + force: "SkryÅĨ vÅĄetky mÊdiÃĄ" +_mfm: + cheatSheet: "MFM Cheatsheet" + intro: "MFM je Misskey exkluzívny značkovací jazyk, ktorÃŊ sa dÃĄ pouŞívaÅĨ na viacerÃŊch miestach. Tu môŞete vidieÅĨ zoznam vÅĄetkej dostupnej MFM syntaxe." + dummy: "Misskey rozÅĄiruje svet Fediverza" + mention: "Zmienka" + mentionDescription: "PouŞívateÄža spomeniete pouŞítím zavinÃĄÄa a mena pouŞívateÄža" + hashtag: "Hashtag" + hashtagDescription: "MôŞete zadaÅĨ hashtag pouÅžitím mrieÅžky a textu" + url: "URL" + urlDescription: "URL sa dajÃē zobraziÅĨ." + link: "Odkaz" + linkDescription: "JednotlivÊ časti texty sa dajÃē zobraziÅĨ ako URL." + bold: "TučnÊ" + boldDescription: "ZvÃŊrazní písmenÃĄ tÃŊm, Åže budÃē tučnejÅĄie." + small: "MalÊ" + smallDescription: "Zobrazí obsah malÃŊ a tenkÃŊ." + center: "VystrediÅĨ prvky" + centerDescription: "Zobrazí obsah v strede" + inlineCode: "KÃŗd (inline)" + inlineCodeDescription: "Zobrazí kÃŗd so zvÃŊraznením syntaxe." + blockCode: "KÃŗd (blok)" + blockCodeDescription: "Zobrazí viacriadkovÃŊ kÃŗd so zvÃŊraznením syntaxe v bloku." + inlineMath: "Vzorec (inline)" + inlineMathDescription: "Zobrazí matematickÃŊ vzorec (KaTeX) v riadku." + blockMath: "Vzorec (blok)" + blockMathDescription: "Zobrazí viacriadkovÃŊ matematickÃŊ vzorec (KaTeX) v bloku" + quote: "CitovaÅĨ" + quoteDescription: "Zobrazí obsah ako citÃĄt." + emoji: "VlastnÊ emoji" + emojiDescription: "Pridaním dvojbodiek pred a za nÃĄzov vlastnej emoji, sa dÃĄ zobraziÅĨ vlastnÃĄ emoji." + search: "HÄžadaÅĨ" + searchDescription: "Zobrazí vyhÄžadÃĄvacie pole so zadanÃŊm textom." + flip: "PreklopiÅĨ" + flipDescription: "Preklopí obsah horizontÃĄlne alebo vertikÃĄlne" + jelly: "AnimÃĄcia (ÅželÊ)" + jellyDescription: "Obsah sa bude hÃŊbaÅĨ ako ÅželÊ." + tada: "AnimÃĄcia (tadÃĄ)" + tadaDescription: "Obsah sa bude hÃŊbaÅĨ ako Tada!" + jump: "AnimÃĄcia (skok)" + jumpDescription: "Obsah skočí." + bounce: "AnimÃĄcia (odraz)" + bounceDescription: "Obsah sa bude odrÃĄÅžaÅĨ." + shake: "AnimÃĄcia (trasenie)" + shakeDescription: "Obsah sa bude triasÅĨ." + twitch: "AnimÃĄcia (myknutie)" + twitchDescription: "Obsahu dÃĄ animÃĄciu silnÊho trasenia." + spin: "AnimÃĄcia (rotÃĄcia)" + spinDescription: "Obsahu pridÃĄ otÃĄÄajÃēcu animÃĄciu." + x2: "VeÄžkÃŊ" + x2Description: "Zobrazí obsah vÃ¤ÄÅĄÃ­." + x3: "VeÄžmi veÄžkÃŊ" + x3Description: "Zobrazí obsah eÅĄte vÃ¤ÄÅĄÃ­." + x4: "NeuveriteÄžne veÄžkÃŊ" + x4Description: "Zobrazí obsah eÅĄte viac veÄžkÃŊ neÅž veÄžmi veÄžkÃŊ." + blur: "Rozmazanie" + blurDescription: "TÃŊmto efektom môŞe byÅĨ obsah rozmazanÃŊ. Zaostrí sa keď ned neho príde kurzor." + font: "Písmo" + fontDescription: "Nastaví písmo, ktorÃŊm sa zobrazí text." + rainbow: "DÃēha" + rainbowDescription: "Zobrazí obsah vo farbÃĄch dÃēhy." + sparkle: "Trblietky" + sparkleDescription: "Obsahu dodÃĄ trblietajÃēci efekt." + rotate: "OtÃĄÄaÅĨ" + rotateDescription: "Otočí obsah o určitÃŊ uhol." +_instanceTicker: + none: "Nikdy nezobrazovaÅĨ" + remote: "ZobraziÅĨ pre vzdialenÃŊch pouŞívateÄžov" + always: "ZobraziÅĨ vÅždy" +_serverDisconnectedBehavior: + reload: "Automaticky obnoviÅĨ" + dialog: "ZobraziÅĨ okno s varovaním" + quiet: "ZobraziÅĨ neruÅĄivÊ varovanie" +_channel: + create: "VytvoriÅĨ kanÃĄl" + edit: "UpraviÅĨ kanÃĄl" + setBanner: "NastaviÅĨ banner" + removeBanner: "OdstrÃĄniÅĨ banner" + featured: "Trendy" + owned: "VlastnenÊ" + following: "SledovanÊ" + usersCount: "{n} Ãēčastníkov" + notesCount: "{n} poznÃĄmok" +_menuDisplay: + sideFull: "Strana" + sideIcon: "Strana (Ikony)" + top: "Hore" + hide: "SkryÅĨ" +_wordMute: + muteWords: "UmlčanÊ slovÃĄ" + muteWordsDescription: "Medzerami oddeÄžte pre podmienku AND a novÃŊmi riadkami pre podmienku OR." + muteWordsDescription2: "RegulÃĄrne vÃŊrazy sa pouÅžijÃē keď pouÅžijete okolo lomítka." + softDescription: "Skryje poznÃĄmky z časovej osi, ktorÊ spÄēňajÃē podmienky." + hardDescription: "ZabrÃĄni poznÃĄmky spÄēňajÃēce mnoÅžinu podmienok, aby boli pridanÊ do časovej osi. NavyÅĄe tieto poznÃĄmky nepribudnÃē v časovej osi ani keď sa podmienky zmenia." + soft: "MäkkÊ" + hard: "TvrdÊ" + mutedNotes: "UmlčanÊ poznÃĄmky" +_instanceMute: + instanceMuteDescription: "Toto umlčí vÅĄetky poznÃĄmky/preposlania zo zoznamu serverov, vrÃĄtane tÃŊch, na ktorÊ pouŞívatelia odpovedajÃē z umlčanÊho servera." + instanceMuteDescription2: "OddeÄžte novÃŊmi riadkami" + title: "Skryje poznÃĄmky z uvedenÃŊch serverov." + heading: "Zoznam umlčanÃŊch inÅĄtancií" +_theme: + explore: "ObjavovaÅĨ tÊmy" + install: "NainÅĄtalovaÅĨ tÊmu" + manage: "SpravovaÅĨ tÊmy" + code: "KÃŗd tÊmy" + description: "Popis" + installed: "{name} je nainÅĄtalovanÃĄ" + installedThemes: "NainÅĄtalovanÊ tÊmy" + builtinThemes: "VstavanÊ tÊmy" + alreadyInstalled: "TÃĄto tÊma je uÅž nainÅĄtalovanÃĄ" + invalid: "FormÃĄt tejto tÊmy je nesprÃĄvny" + make: "VytvoriÅĨ tÊmu" + base: "ZÃĄklad" + addConstant: "PridaÅĨ konÅĄtantu" + constant: "KonÅĄtanta" + defaultValue: "PredvolenÃĄ hodnota" + color: "Farba" + refProp: "Odkaz na vlastnosÅĨ" + refConst: "Odkaz na konÅĄtantu" + key: "KÄžÃēč" + func: "Funkcie" + funcKind: "Typ funkcie" + argument: "Argument" + basedProp: "OdkazovanÃĄ vlastnosÅĨ" + alpha: "PriehÄžadnosÅĨ" + darken: "StmaviÅĨ" + lighten: "ZosvetliÅĨ" + inputConstantName: "Zadajte nÃĄzov tejto konÅĄtanty" + importInfo: "Ak sem zadÃĄte kÃŗd tÊmy, môŞete ju importovaÅĨ do editora tÊm." + deleteConstantConfirm: "Naozaj chcete odstrÃĄniÅĨ konÅĄtantu {const}?" + keys: + accent: "Akcent" + bg: "Pozadie" + fg: "Text" + focus: "Fokus" + indicator: "IndikÃĄtor" + panel: "Panel" + shadow: "Tieň" + header: "Hlavička" + navBg: "Pozadie bočnÊho panela" + navFg: "Text bočnÊho panela" + navHoverFg: "Text bočnÊho panela (pod kurzorom)" + navActive: "Text bočnÊho panela (aktívny)" + navIndicator: "IndikÃĄtor bočnÊho panela" + link: "Odkaz" + hashtag: "Hashtag" + mention: "Zmienka" + mentionMe: "Zmienky (mňa)" + renote: "PreposlaÅĨ" + modalBg: "Pozadie modÃĄlu" + divider: "OddeÄžovač" + scrollbarHandle: "RÃēčka scrollbaru" + scrollbarHandleHover: "RÃēčka scrollbaru (pod kurzorom)" + dateLabelFg: "Text dÃĄtovÊho popisku" + infoBg: "Pozadie informÃĄcií" + infoFg: "InformačnÃŊ text" + infoWarnBg: "Pozadie varovania" + infoWarnFg: "Text varovania" + cwBg: "CW pozadie tlačidla" + cwFg: "CW text tlačidla" + cwHoverBg: "CW pozadie tlačidla (pod kurzorom)" + toastBg: "Pozadie upozornenia" + toastFg: "Text upozornenia" + buttonBg: "Pozadie tlačidla" + buttonHoverBg: "Pozadie tlačidla (pod kurzorom)" + inputBorder: "Okraj vstupnÊho poÄža" + listItemHoverBg: "Pozadie poloÅžky zoznamu (pod kurzorom)" + driveFolderBg: "Pozadie priečinu disku" + wallpaperOverlay: "Vrstvenie pozadia" + badge: "Odznak" + messageBg: "Pozadie chatu" + accentDarken: "Akcent (stmavenÊ)" + accentLighten: "Akcent (zosvetlenÊ)" + fgHighlighted: "ZvÃŊraznenÃŊ text" +_sfx: + note: "PoznÃĄmky" + noteMy: "VlastnÃĄ poznÃĄmka" + notification: "OznÃĄmenia" + chat: "Chat" + chatBg: "Chat (pozadie)" + antenna: "AntÊny" + channel: "Upozornenia kanÃĄla" +_ago: + unknown: "NeznÃĄme" + future: "BudÃēcnosÅĨ" + justNow: "Teraz" + secondsAgo: "pred {n} sekundami" + minutesAgo: "pred {n} minÃētami" + hoursAgo: "pred {n} hodinami" + daysAgo: "pred {n} dňami" + weeksAgo: "pred {n} tÃŊÅždňami" + monthsAgo: "pred {n} mesiacmi" + yearsAgo: "pred {n} rokmi" +_time: + second: "s" + minute: "min" + hour: "hod" + day: "dní" +_tutorial: + title: "Ako pouŞívaÅĨ Misskey" + step1_1: "Vitajte!" + step1_2: "TÃĄto strÃĄnka sa volÃĄ \"časovÃĄ os\". Zobrazuje chronologicky zoradenÊ \"poznÃĄmky\" od Äžudí, ktorÃŊch sledujete." + step1_3: "VaÅĄa časovÃĄ os je teraz prÃĄzdna pretoÅže ste nepridali Åžiadne poznÃĄmky ani nikoho zatiaÄž nesledujete." + step2_1: "Podˇme dokončiÅĨ nastavenia vÃĄÅĄho profilu pred napísaním poznÃĄmky alebo sledovaním niekoho." + step2_2: "Poskytnutím informÃĄcií o vÃĄs uÄžahčíte ostatnÃŊm, či chcÃē vidieÅĨ alebo sledovaÅĨ vaÅĄe poznÃĄmky." + step3_1: "Dokončili ste nastavovanie svojho profilu?" + step3_2: "Poďme vyskÃēÅĄaÅĨ napísaÅĨ poznÃĄmku. MôŞete to spraviÅĨ stlačením ikony ceruzky na vrchu obrazovky." + step3_3: "Vyplňte polia a stlačte tlačítko vpravo hore." + step3_4: "NemÃĄte čo povedaÅĨ? SkÃēste \"len si nastavujem môj msky\"!" + step4_1: "Napísali ste svoju prvÃē poznÃĄmku?" + step4_2: "HurÃĄ! Teraz by vaÅĄa prvÃĄ poznÃĄmka mala byÅĨ na vaÅĄej časovej osi." + step5_1: "Teraz skÃēsme oÅživiÅĨ časovÃē os sledovaním nejakÃŊch Äžudí." + step5_2: "{featured} zobrazí populÃĄrne poznÃĄmku na tomto serveri. {explore} môŞete objavovaÅĨ populÃĄrnych pouŞívateÄžov. SkÃēste tam nÃĄjsÅĨ Äžudí, ktorÃŊch by ste radi sledovali!" + step5_3: "Ak chcete sledovaÅĨ ďalÅĄÃ­ch pouŞívateÄžov, kliknite na ich ikonu a stlačte tlačidlo \"SledovaÅĨ\" na ich profile." + step5_4: "Ak mÃĄ niektorÃŊ pouŞívateÄž ikonu zÃĄmku vedÄža svojho mena, znamenÃĄ to, Åže môŞe trvaÅĨ určitÃŊ čas, kÃŊm danÃŊ pouŞívateÄž schvÃĄli vaÅĄu ÅžiadosÅĨ o sledovanie." + step6_1: "Teraz by ste mali vidieÅĨ poznÃĄmky ďalÅĄÃ­ch pouŞívateÄžov na svojej časovej osi." + step6_2: "MôŞete daÅĨ \"reakcie\" na poznÃĄmky ďalÅĄÃ­ch Äžudí ako rÃŊchlu odpoveď." + step6_3: "Reakciu pridÃĄte kliknutím na \"+\" niekoho poznÃĄmke a vybratím emoji, ktorou chcete reagovaÅĨ." + step7_1: "Gralujeme! Dokončili ste zÃĄkladnÊho sprievodcu Misskey." + step7_2: "Ak sa chcete naučiÅĨ viac o Misskey, skÃēste sekciu {help}." + step7_3: "A teraz, veÄža ÅĄÅĨastia, bavte sa s Misskey! 🚀" +_2fa: + alreadyRegistered: "UÅž ste zaregistrovali 2-faktorovÊ autentifikačnÊ zariadenie." + registerDevice: "RegistrovaÅĨ novÊ zariadenie" + registerKey: "RegistrovaÅĨ bezpečnostnÃŊ kÄžÃēč" + step1: "Najprv si nainÅĄtalujte autentifikačnÃē aplikÃĄciu (napríklad {a} alebo {b}) na svoje zariadenie." + step2: "Potom, naskenujte QR kÃŗd zobrazenÃŊ na obrazovke." + step3: "Nastavenie dokončíte zadaním tokenu z vaÅĄej aplikÃĄcie." + step4: "Od teraz, vÅĄetky ďalÅĄie prihlÃĄsenia budÃē vyÅžadovaÅĨ prihlasovací token." + securityKeyInfo: "Okrem odtlačku prsta alebo PIN autentifikÃĄcie si môŞete nastaviÅĨ autentifikÃĄciu cez hardvÊrovÃŊ bezpečnostnÃŊ kÄžÃēč podporujÃēci FIDO2 a tak eÅĄte viac zabezpečiÅĨ svoj Ãēčet." +_permissions: + "read:account": "VidieÅĨ informÃĄcie o vaÅĄom Ãēčte" + "write:account": "UpraviÅĨ informÃĄcie o vaÅĄom Ãēčte" + "read:blocks": "VidieÅĨ zoznam blokovanÃŊch pouŞívateÄžov" + "write:blocks": "UpraviÅĨ zoznam blokovanÃŊch pouŞívateÄžov" + "read:drive": "Prístup k sÃēborom a priečinkom na disku" + "write:drive": "UpraviÅĨ alebo odstrÃĄniÅĨ sÃēbory a priečinky na disku" + "read:favorites": "VidieÅĨ vÃĄÅĄ zoznam obÄžÃēbenÃŊch" + "write:favorites": "UpraviÅĨ vÃĄÅĄ zoznam obÄžÃēbenÃŊch" + "read:following": "VidieÅĨ koho sledujete" + "write:following": "SledovaÅĨ alebo nesledovaÅĨ ďalÅĄie Ãēčty" + "read:messaging": "VidieÅĨ vaÅĄe chaty" + "write:messaging": "PísaÅĨ alebo odstraňovaÅĨ sprÃĄvy v chate" + "read:mutes": "VidieÅĨ vÃĄÅĄ zoznam stÃ­ÅĄenÃŊch pouŞívateÄžov" + "write:mutes": "UpravovaÅĨ zoznam stÃ­ÅĄenÃŊch pouŞívateÄžov" + "write:notes": "PísaÅĨ alebo odstrÃĄniÅĨ poznÃĄmky" + "read:notifications": "VidieÅĨ vaÅĄe oznÃĄmenia" + "write:notifications": "PracovaÅĨ s vaÅĄimi notifikÃĄciami" + "read:reactions": "VidieÅĨ vaÅĄe reakcie" + "write:reactions": "UpravovaÅĨ vaÅĄe reakcie" + "write:votes": "HlasovaÅĨ v hlasovaniach" + "read:pages": "VidieÅĨ vaÅĄe strÃĄnky" + "write:pages": "UpraviÅĨ alebo odstrÃĄniÅĨ vaÅĄe strÃĄnky" + "read:page-likes": "VidieÅĨ vaÅĄe pÃĄÄiky na strÃĄnkach" + "write:page-likes": "UpraviÅĨ pÃĄÄiky na strÃĄnkach" + "read:user-groups": "VidieÅĨ vaÅĄe skupiny" + "write:user-groups": "UpraviÅĨ alebo odstrÃĄniÅĨ vaÅĄe skupiny" + "read:channels": "ČítaÅĨ vaÅĄe kanÃĄly" + "write:channels": "UpravovaÅĨ vaÅĄe kanÃĄly" + "read:gallery": "VidieÅĨ vaÅĄu galÊriu" + "write:gallery": "UpravovaÅĨ vaÅĄu galÊriu" + "read:gallery-likes": "VidieÅĨ zoznam obÄžÃēbenÃŊch príspevkov z galÊrie" + "write:gallery-likes": "UpraviÅĨ zoznam obÄžÃēbenÃŊch príspevov z galÊrie" +_auth: + shareAccess: "Prajete si povoliÅĨ \"{name}\", aby mal prístup k tomuto Ãēčtu?" + shareAccessAsk: "Naozaj chcete povoliÅĨ tejto aplikÃĄcii prístup k tomuto Ãēčtu?" + permissionAsk: "TÃĄto aplikÃĄcia vyÅžaduje nasledujÃēce nastavenia" + pleaseGoBack: "Prosím prejdite späÅĨ na aplikÃĄciu" + callback: "Vraciam sa späÅĨ na aplikÃĄciu" + denied: "Prístup zamietnutÃŊ" +_antennaSources: + all: "VÅĄetky poznÃĄmky" + homeTimeline: "PoznÃĄmky od sledovanÊho pouŞívateÄža" + users: "PoznÃĄmky od konkrÊtneho pouŞívateÄža" + userList: "PoznÃĄmky od pouŞívateÄžov v zozname" + userGroup: "PoznÃĄmky od pouŞívateÄžov z konkrÊtnej skupiny." +_weekday: + sunday: "NedeÄža" + monday: "Pondelok" + tuesday: "Utorok" + wednesday: "Streda" + thursday: "Å tvrtok" + friday: "Piatok" + saturday: "Sobota" +_widgets: + memo: "PrilepenÊ poznÃĄmky" + notifications: "OznÃĄmenia" + timeline: "ČasovÃĄ os" + calendar: "KalendÃĄr" + trends: "Trendy" + clock: "Hodiny" + rss: "RSS čítačka" + activity: "Aktivita" + photos: "Fotky" + digitalClock: "DigitÃĄlne hodiny" + federation: "FederÃĄcia" + postForm: "NapísaÅĨ poznÃĄmku" + slideshow: "PrezentÃĄcia" + button: "Tlačidlo" + onlineUsers: "Online pouŞívatelia" + jobQueue: "Fronta Ãēloh" + serverMetric: "Metriky servera" + aiscript: "Konzola AiScript" + aichan: "Ai" +_cw: + hide: "SkryÅĨ" + show: "ZobraziÅĨ viac" + chars: "{count} znakov" + files: "{count} sÃēbor/ov" +_poll: + noOnlyOneChoice: "Treba aspoň dve voÄžby" + choiceN: "VoÄžba {n}" + noMore: "NemôŞete pridaÅĨ viac volieb" + canMultipleVote: "PovoliÅĨ hlasovaÅĨ za viac volieb." + expiration: "UkončiÅĨ hlasovanie" + infinite: "Nikdy" + at: "KonkrÊtny dÃĄtum..." + after: "UkončiÅĨ po..." + deadlineDate: "DÃĄtum ukončenia" + deadlineTime: "hod" + duration: "Trvanie" + votesCount: "{n} hlasov" + totalVotes: "{n} hlasov celkom" + vote: "HlasovaÅĨ" + showResult: "VidieÅĨ vÃŊsledky hlasovania" + voted: "ZahlasovanÊ" + closed: "Skončilo" + remainingDays: "zostÃĄva {d} dní {h} hodín" + remainingHours: "zostÃĄva {h} hodín {m} minÃēt" + remainingMinutes: "zostÃĄva {m} minÃēt {s} sekÃēnd" + remainingSeconds: "zostÃĄva {s} sekÃēnd" +_visibility: + public: "VerejnÊ" + publicDescription: "VaÅĄa poznÃĄmku bude viditeÄžnÃĄ vÅĄetkÃŊm pouŞívateÄžom" + home: "Domov" + homeDescription: "PridaÅĨ iba na domÃĄcu časovÃē os" + followers: "SledujÃēci" + followersDescription: "ViditeÄžnÊ iba tÃŊm, ktorí vÃĄs sledujÃē" + specified: "Priame" + specifiedDescription: "ViditeÄžnÊ iba pre konkrÊtnych pouŞívateÄžov" + localOnly: "Iba lokÃĄlne" + localOnlyDescription: "VzdialenÃŊ pouŞívatelia nebudÃē vidieÅĨ" +_postForm: + replyPlaceholder: "Odpoveď na tÃēto poznÃĄmku..." + quotePlaceholder: "Citovanie tejto poznÃĄmky..." + channelPlaceholder: "PoslaÅĨ do kanÃĄla..." + _placeholders: + a: "Čo mÃĄte v plÃĄne?" + b: "Čo sa deje?" + c: "O čom rozmÃŊÅĄÄžaÅĄ?" + d: "Čo chcete povedaÅĨ?" + e: "Začnite písaÅĨ..." + f: "ČakÃĄ sa na písanie..." +_profile: + name: "NÃĄzov" + username: "Meno pouŞívateÄža" + description: "Bio" + youCanIncludeHashtags: "Vo svojom bio môŞete maÅĨ aj hashtagy." + metadata: "DodatočnÊ informÃĄcie" + metadataEdit: "UpraviÅĨ dodatočnÊ informÃĄcie" + metadataDescription: "Vo svojom profile môŞete uviesÅĨ aÅž ÅĄtyri dodatočnÊ informačnÊ polia." + metadataLabel: "Popisok" + metadataContent: "Obsah" + changeAvatar: "ZmeniÅĨ avatara" + changeBanner: "ZmeniÅĨ banner" +_exportOrImport: + allNotes: "VÅĄetky poznÃĄmky" + followingList: "Sledujete" + muteList: "VypnÃēÅĨ zvuk" + blockingList: "ZablokovaÅĨ" + userLists: "Zoznamy" + excludeMutingUsers: "VylÃēčiÅĨ stÃ­ÅĄenÃŊch pouŞívateÄžov" + excludeInactiveUsers: "VylÃēčiÅĨ neaktívnych pouŞívateÄžov" +_charts: + federation: "FederÃĄcia" + apRequest: "ÅŊiadosti" + usersIncDec: "Rozdiel v počte pouŞívateÄžov" + usersTotal: "CelkovÃŊ počet pouŞívateÄžov" + activeUsers: "Aktívni pouŞívatelia" + notesIncDec: "Rozdiel v počte poznÃĄmok" + localNotesIncDec: "Rozdiel v počte lokÃĄlnych poznÃĄmok" + remoteNotesIncDec: "Rozdiel v počte vzdialenÃŊch poznÃĄmok" + notesTotal: "CelkovÃŊ počet poznÃĄmok" + filesIncDec: "Rozdiel v počte sÃēborov" + filesTotal: "CelkovÃŊ počet sÃēborov" + storageUsageIncDec: "Rozdiel vyuÅžitÊho ÃēloÅžiska" + storageUsageTotal: "CelkovÊ vyuÅžitÊ ÃēloÅžisko" +_instanceCharts: + requests: "ÅŊiadosti" + users: "Rozdiel v počte pouŞívateÄžov" + usersTotal: "Celkom spolu počet pouŞívateÄžov" + notes: "Rozdiel v počte poznÃĄmok" + notesTotal: "Celkom spolu počet poznÃĄmok" + ff: "Rozdiel v počte sledovanÃŊch/sledujÃēcich" + ffTotal: "Celkom spolu počet sledovanÃŊch / sledujÃēcich" + cacheSize: "Rozdiel vo veÄžkosti cache" + cacheSizeTotal: "Celkom spolu veÄžkosÅĨ cache" + files: "Rozdiel v počte sÃēborov" + filesTotal: "Celkom spolu počet sÃēborov" +_timelines: + home: "Domov" + local: "LokÃĄlne" + social: "SociÃĄlne" + global: "GlobÃĄlne" +_pages: + newPage: "VytvoriÅĨ novÃē strÃĄnku" + editPage: "UpraviÅĨ tÃēto strÃĄnku" + readPage: "Zobrazenie zdroja aktívne" + created: "StrÃĄnka ÃēspeÅĄne vytvorenÃĄ" + updated: "StrÃĄnka ÃēspeÅĄne upravenÃĄ" + deleted: "StrÃĄnka ÃēspeÅĄne odstrÃĄnenÃĄ" + pageSetting: "Nastavenia strÃĄnky" + nameAlreadyExists: "ZadanÃĄ URL strÃĄnku uÅž existuje" + invalidNameTitle: "ZadanÃĄ URL strÃĄnku je nesprÃĄvna" + invalidNameText: "Uistite sa, Åže nadpis strÃĄnky nie je prÃĄzdny" + editThisPage: "UpraviÅĨ tÃēto strÃĄnku" + viewSource: "UkÃĄzaÅĨ zdroj" + viewPage: "UkÃĄzaÅĨ vaÅĄe strÃĄnky" + like: "PÃĄÄi sa mi" + unlike: "NepÃĄÄi sa mi" + my: "Moje strÃĄnky" + liked: "ObÄžÃēbenÊ strÃĄnky" + featured: "VÃŊznačnÊ" + inspector: "InÅĄpektor" + contents: "Obsah" + content: "Blok strÃĄnky" + variables: "PremennÊ" + title: "Nadpis" + url: "URL strÃĄnky" + summary: "Zhrnutie strÃĄnky" + alignCenter: "VystrediÅĨ prvky" + hideTitleWhenPinned: "SkryÅĨ nadpis strÃĄnky keď je pripnutÃĄ na profil" + font: "Písmo" + fontSerif: "PätkovÊ" + fontSansSerif: "BezpätkovÊ" + eyeCatchingImageSet: "NastaviÅĨ miniatÃēru" + eyeCatchingImageRemove: "OdstrÃĄniÅĨ miniatÃēru" + chooseBlock: "PridaÅĨ blok" + selectType: "Vyberte typ" + enterVariableName: "Zadajte meno premennej" + variableNameIsAlreadyUsed: "Meno premennej s uÅž pouŞíva" + contentBlocks: "Obsah" + inputBlocks: "Vstup" + specialBlocks: "Å peciÃĄlne" + blocks: + text: "Text" + textarea: "TextovÊ pole" + section: "Sekcia" + image: "ObrÃĄzky" + button: "Tlačidlo" + if: "Ak" + _if: + variable: "PremennÊ" + post: "NapísaÅĨ poznÃĄmku" + _post: + text: "Obsah" + attachCanvasImage: "Príspevok s obrÃĄzkom na plÃĄtne" + canvasId: "ID plÃĄtna" + textInput: "TextovÃŊ vstup" + _textInput: + name: "Meno premennej" + text: "Nadpis" + default: "PredvolenÃĄ hodnota" + textareaInput: "ViacriadkovÃŊ textovÃŊ vstup" + _textareaInput: + name: "Meno premennej" + text: "Nadpis" + default: "PredvolenÃĄ hodnota" + numberInput: "ČíselnÃŊ vstup" + _numberInput: + name: "Meno premennej" + text: "Nadpis" + default: "PredvolenÃĄ hodnota" + canvas: "PlÃĄtno" + _canvas: + id: "ID plÃĄtna" + width: "Šírka" + height: "VÃŊÅĄka" + note: "VloÅženÃĄ poznÃĄmka" + _note: + id: "ID poznÃĄmky" + idDescription: "Alebo môŞete vloÅžiÅĨ URL poznÃĄmky sem" + detailed: "PodrobnÃŊ pohÄžad" + switch: "PrepnÃēÅĨ" + _switch: + name: "Meno premennej" + text: "Nadpis" + default: "PredvolenÃĄ hodnota" + counter: "Počítadlo" + _counter: + name: "Meno premennej" + text: "Nadpis" + inc: "PripočítaÅĨ" + _button: + text: "Nadpis" + colored: "FarebnÊ" + action: "OperÃĄcia po stlačení tlačidla" + _action: + dialog: "ZobraziÅĨ dialÃŗg" + _dialog: + content: "Obsah" + resetRandom: "ResetovaÅĨ zdroj nÃĄhodnosti" + pushEvent: "PoslaÅĨ udalosÅĨ" + _pushEvent: + event: "NÃĄzov udalosti" + message: "ZobrazenÃĄ sprÃĄva po aktivÃĄcii" + variable: "OdoslanÃĄ premennÃĄ" + no-variable: "ÅŊiadne" + callAiScript: "SpustiÅĨ AiScript" + _callAiScript: + functionName: "NÃĄzov funkcie" + radioButton: "MoÅžnosÅĨ" + _radioButton: + name: "Meno premennej" + title: "Nadpis" + values: "Zoznam moÅžností oddelenÊ novÃŊmi riadkami" + default: "PredvolenÃĄ hodnota" + script: + categories: + flow: "Riadenie behu" + logical: "LogickÃĄ operÃĄcia" + operation: "VÃŊpočet" + comparison: "Porovnanie" + random: "NÃĄhodnÊ" + value: "Hodnoty" + fn: "Funkcie" + text: "TextovÊ operÃĄcie" + convert: "TransformÃĄcie" + list: "Zoznamy" + blocks: + text: "Text" + multiLineText: "Text (viacriadkovÃŊ)" + textList: "Zoznam textov" + _textList: + info: "OddeÄžte kaÅždÃē poloÅžku novÃŊm riadkom" + strLen: "DÄēÅžka textu" + _strLen: + arg1: "Text" + strPick: "VybraÅĨ znak" + _strPick: + arg1: "Text" + arg2: "Pozícia znaku" + strReplace: "NÃĄhradnÃŊ text" + _strReplace: + arg1: "Text" + arg2: "NahradenÃŊ text" + arg3: "NahradiÅĨ s" + strReverse: "OtočiÅĨ text" + _strReverse: + arg1: "Text" + join: "SpojiÅĨ texty" + _join: + arg1: "Zoznamy" + arg2: "OddeÄžovač" + add: "PridaÅĨ" + _add: + arg1: "A" + arg2: "B" + subtract: "OdčítaÅĨ" + _subtract: + arg1: "A" + arg2: "B" + multiply: "NÃĄsobiÅĨ" + _multiply: + arg1: "A" + arg2: "B" + divide: "DeliÅĨ" + _divide: + arg1: "A" + arg2: "B" + mod: "ZvyÅĄok po delení" + _mod: + arg1: "A" + arg2: "B" + round: "ZaokrÃēhliÅĨ" + _round: + arg1: "Číslo" + eq: "A a B sa rovnajÃē" + _eq: + arg1: "A" + arg2: "B" + notEq: "A a B sa nerovnajÃē" + _notEq: + arg1: "A" + arg2: "B" + and: "A a zÃĄroveň B" + _and: + arg1: "A" + arg2: "B" + or: "A alebo B" + _or: + arg1: "A" + arg2: "B" + lt: "< A je menÅĄie ako B" + _lt: + arg1: "A" + arg2: "B" + gt: "> A je vÃ¤ÄÅĄie ako B" + _gt: + arg1: "A" + arg2: "B" + ltEq: "<= A je menÅĄie alebo rovnÊ B" + _ltEq: + arg1: "A" + arg2: "B" + gtEq: ">= A je vÃ¤ÄÅĄie alebo rovnÊ B" + _gtEq: + arg1: "A" + arg2: "B" + if: "Vetva" + _if: + arg1: "Ak" + arg2: "Potom" + arg3: "Inak" + not: "Opak" + _not: + arg1: "Opak" + random: "NÃĄhodnÊ" + _random: + arg1: "PravdepodobnosÅĨ" + rannum: "NÃĄhodnÊ číslo" + _rannum: + arg1: "MinimÃĄlna hodnota" + arg2: "MaximÃĄlna hodnota" + randomPick: "NÃĄhodnÃŊ vÃŊber zo zoznamu" + _randomPick: + arg1: "Zoznam" + dailyRandom: "NÃĄhodne (zmení sa raz denne pre kaÅždÊho pouŞívateÄža)" + _dailyRandom: + arg1: "PravdepodobnosÅĨ" + dailyRannum: "NÃĄhodnÊ číslo (Mení sa denne pre kaÅždÊho pouŞívateÄža)" + _dailyRannum: + arg1: "MinimÃĄlna hodnota" + arg2: "MaximÃĄlna hodnota" + dailyRandomPick: "NÃĄhodnÃŊ vÃŊber zo zoznamu (Mení sa denne pre kaÅždÊho pouŞívateÄža)" + _dailyRandomPick: + arg1: "Zoznam" + seedRandom: "NÃĄhodne (so seedom)" + _seedRandom: + arg1: "Seed" + arg2: "PravdepodobnosÅĨ" + seedRannum: "NÃĄhodnÊ číslo (so seedom)" + _seedRannum: + arg1: "Seed" + arg2: "MinimÃĄlna hodnota" + arg3: "MaximÃĄlna hodnota" + seedRandomPick: "NÃĄhodnÃŊ vÃŊber zo zoznamu (so seedom)" + _seedRandomPick: + arg1: "Seed" + arg2: "Zoznam" + DRPWPM: "NÃĄhodnÃŊ vÃŊber z vÃĄÅženÊho zoznamu (Mení sa denne pre kaÅždÊho pouŞívateÄža)" + _DRPWPM: + arg1: "Zoznam textov" + pick: "VybraÅĨ zo zoznamu" + _pick: + arg1: "Zoznam" + arg2: "Pozícia" + listLen: "ZískaÅĨ dÄēÅžku zoznamu" + _listLen: + arg1: "Zoznam" + number: "Číslo" + stringToNumber: "Text na číslo" + _stringToNumber: + arg1: "Text" + numberToString: "Číslo na text" + _numberToString: + arg1: "Číslo" + splitStrByLine: "Rozdelí text po riadkoch" + _splitStrByLine: + arg1: "Text" + ref: "PremennÊ" + aiScriptVar: "AiScript premennÃĄ" + fn: "Funkcie" + _fn: + slots: "Sloty" + slots-info: "OddeÄžte kaÅždÃŊ slot novÃŊm riadkom" + arg1: "VÃŊstup" + for: "For cyklus" + _for: + arg1: "Počet opakovaní" + arg2: "Akcia" + typeError: "Slot {slot} akceptuje hodnoty typu \"{expect}\", ale dodanÃĄ hodnota je typu \"{actual}\"!" + thereIsEmptySlot: "Slot {slot} je prÃĄzdny!" + types: + string: "Text" + number: "Číslo" + boolean: "Boolean" + array: "Zoznamy" + stringArray: "Zoznam textov" + emptySlot: "PrÃĄzdny slot" + enviromentVariables: "PremennÊ prostredia" + pageVariables: "PremennÊ strÃĄnky" + argVariables: "VstupnÊ sloty" +_relayStatus: + requesting: "ČakÃĄ sa" + accepted: "AkceptovanÊ" + rejected: "OdmietnutÊ" +_notification: + fileUploaded: "SÃēbor sa ÃēspeÅĄne nahral" + youGotMention: "{name} vÃĄs spomenul/a" + youGotReply: "{name} vÃĄm odpovedal/a" + youGotQuote: "{name} vÃĄs citoval/a" + youRenoted: "{name} preposlal/a vaÅĄu poznÃĄmku" + youGotPoll: "{name} hlasoval/a" + youGotMessagingMessageFromUser: "{name} vÃĄm poslal/a sprÃĄvu" + youGotMessagingMessageFromGroup: "PriÅĄla sprÃĄva do skupiny {name}" + youWereFollowed: "MÃĄte novÊho sledujÃēceho" + youReceivedFollowRequest: "Dostali ste ÅžiadosÅĨ o sledovanie" + yourFollowRequestAccepted: "VaÅĄa ÅžiadosÅĨ o sledovanie bola prijatÃĄ" + youWereInvitedToGroup: "PozvaÅĨ do skupiny" + _types: + all: "VÅĄetky" + follow: "Sledujete" + mention: "Zmienka" + reply: "Odpovede" + renote: "PreposlaÅĨ" + quote: "CitovaÅĨ" + reaction: "Reakcie" + pollVote: "Hlasy v hlasovaniach" + receiveFollowRequest: "DoručenÊ Åžiadosti o sledovanie" + followRequestAccepted: "SchvÃĄlenÊ Åžiadosti o sledovanie" + groupInvited: "PozvÃĄnky do skupín" + app: "OznÃĄmenia z prepojenÃŊch aplikÃĄcií" +_deck: + alwaysShowMainColumn: "VÅždy zobraziÅĨ v hlavnom stÄēpci" + columnAlign: "ZarovnaÅĨ stÄēpce" + columnMargin: "Rozostup medzi stÄēpcami" + columnHeaderHeight: "VÃŊÅĄka hlavičky stÄēpca" + addColumn: "PridaÅĨ stÄēpec" + swapLeft: "VymeniÅĨ vÄžavo" + swapRight: "VymeniÅĨ vpravo" + swapUp: "VymeniÅĨ hore" + swapDown: "VymeniÅĨ s nasledujÃēcim" + stackLeft: "PriloÅžiÅĨ do ÄžavÊho stÄēpca" + popRight: "VybraÅĨ napravo" + profile: "Profil" + _columns: + main: "HlavnÃŊ" + widgets: "Widgety" + notifications: "OznÃĄmenia" + tl: "ČasovÃĄ os" + antenna: "AntÊny" + list: "Zoznam" + mentions: "Zmienky" + direct: "Priame poznÃĄmky" diff --git a/locales/uk-UA.yml b/locales/uk-UA.yml index 2dd605601..588df8d32 100644 --- a/locales/uk-UA.yml +++ b/locales/uk-UA.yml @@ -1038,7 +1038,8 @@ _exportOrImport: blockingList: "ЗабĐģĐžĐēŅƒĐ˛Đ°Ņ‚и" userLists: "ĐĄĐŋиŅĐēи" _charts: - federationInstancesTotal: "ЗаĐŗĐ°ĐģŅŒĐŊĐ° ĐēŅ–ĐģŅŒĐēŅ–ŅŅ‚ŅŒ Ņ„ĐĩĐ´ĐĩŅ€Đ°Ņ‚ивĐŊиŅ… Ņ–ĐŊŅŅ‚Đ°ĐŊŅŅ–в" + federation: "ФĐĩĐ´Ņ–вĐĩŅ€Ņ" + apRequest: "ЗаĐŋиŅ‚и" usersTotal: "ЗаĐŗĐ°ĐģŅŒĐŊĐ° ĐēŅ–ĐģŅŒĐēŅ–ŅŅ‚ŅŒ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Ņ–в" activeUsers: "АĐēŅ‚ивĐŊŅ– ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Ņ–" notesTotal: "ЗаĐŗĐ°ĐģŅŒĐŊĐ° ĐēŅ–ĐģŅŒĐēŅ–ŅŅ‚ŅŒ ĐŊĐžŅ‚Đ°Ņ‚ĐžĐē" diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml index c54e64214..f4f1680ca 100644 --- a/locales/zh-CN.yml +++ b/locales/zh-CN.yml @@ -141,6 +141,8 @@ flagAsBot: "čŋ™æ˜¯ä¸€ä¸Ēæœē器äēēč´Ļåˇ" flagAsBotDescription: "åĻ‚æžœæ­¤å¸æˆˇį”ąį¨‹åēæŽ§åˆļīŧŒč¯ˇå¯į”¨æ­¤éĄšã€‚启į”¨åŽīŧŒæ­¤æ ‡åŋ—可äģĨ帎劊å…ļäģ–åŧ€å‘äēēå‘˜é˜˛æ­ĸæœē器äēē之间äē§į”Ÿæ— é™äē’动įš„čĄŒä¸ēīŧŒåšļ莊Misskeyįš„内部įŗģįģŸå°†æ­¤å¸æˆˇč¯†åˆĢä¸ēæœē器äēē。" flagAsCat: "将čŋ™ä¸Ēč´ĻæˆˇčŽžåŽšä¸ē一åĒįŒĢ" flagAsCatDescription: "åĻ‚果您æƒŗčĄ¨æ˜Žæ­¤å¸æˆˇæ˜¯ä¸€åĒįŒĢīŧŒč¯ˇæ‰“åŧ€æ­¤æ ‡åŋ—。" +flagShowTimelineReplies: "在æ—ļ间įēŋ上昞į¤ē帖子įš„回复" +flagShowTimelineRepliesDescription: "启į”¨æ—ļīŧŒæ—ļ间įēŋ除äē†æ˜žį¤ēį”¨æˆˇįš„帖子外īŧŒčŋ˜äŧšæ˜žį¤ēå…ļäģ–į”¨æˆˇå¯šå¸–子įš„回复。" autoAcceptFollowed: "č‡ĒåŠ¨å…čŽ¸å…ŗæŗ¨" addAccount: "æˇģ加č´Ļæˆˇ" loginFailed: "į™ģåŊ•å¤ąč´Ĩ" @@ -822,6 +824,10 @@ leaveGroupConfirm: "įĄŽåŽšįĻģåŧ€ã€Œ{name}」īŧŸ" useDrawerReactionPickerForMobile: "在į§ģåŠ¨čŽžå¤‡ä¸ŠäŊŋį”¨æŠŊåą‰æ˜žį¤ē" welcomeBackWithName: "æŦĸčŋŽå›žæĨīŧŒ{name}" clickToFinishEmailVerification: "į‚šå‡ģ [{ok}] 厌成į”ĩ子邎äģļåœ°å€čŽ¤č¯ã€‚" +overridedDeviceKind: "čŽžå¤‡įąģ型" +smartphone: "æ™ēčƒŊ手æœē" +tablet: "åšŗæŋ" +auto: "č‡Ē动" _emailUnavailable: used: "åˇ˛įģčĸĢäŊŋį”¨čŋ‡" format: "无效įš„æ ŧåŧ" @@ -1258,8 +1264,8 @@ _exportOrImport: excludeMutingUsers: "æŽ’é™¤åąč”Ŋį”¨æˆˇ" excludeInactiveUsers: "排除不æ´ģ衃į”¨æˆˇ" _charts: - federationInstancesIncDec: "č”åˆīŧšåĸžåŠ /减少" - federationInstancesTotal: "č”åˆæ€ģ数" + federation: "č”åˆ" + apRequest: "č¯ˇæą‚" usersIncDec: "į”¨æˆˇæ•°é‡īŧšåĸžåŠ /减少" usersTotal: "į”¨æˆˇæ€ģ数" activeUsers: "æ´ģ衃į”¨æˆˇæ•°" diff --git a/locales/zh-TW.yml b/locales/zh-TW.yml index 798398a6a..b10871ec1 100644 --- a/locales/zh-TW.yml +++ b/locales/zh-TW.yml @@ -1114,6 +1114,8 @@ _exportOrImport: blockingList: "封鎖" userLists: "清喎" _charts: + federation: "įĢ™å°č¯é‚Ļ" + apRequest: "čĢ‹æą‚" usersIncDec: "äŊŋį”¨č€…åĸ—減" usersTotal: "äŊŋį”¨č€…åˆå…ą" activeUsers: "æ´ģčēäŊŋį”¨č€…" diff --git a/package.json b/package.json index 27fd81cd8..46dac95db 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "misskey", - "version": "12.103.1", + "version": "12.104.0", "codename": "indigo", "repository": { "type": "git", @@ -46,7 +46,7 @@ "@types/fluent-ffmpeg": "2.1.20", "@typescript-eslint/parser": "5.10.0", "cross-env": "7.0.3", - "cypress": "9.3.1", + "cypress": "9.4.1", "start-server-and-test": "1.14.0", "typescript": "4.5.5" } diff --git a/packages/backend/migration/1629833361000-AddShowTLReplies.js b/packages/backend/migration/1629833361000-AddShowTLReplies.js new file mode 100644 index 000000000..bfd4ab7ff --- /dev/null +++ b/packages/backend/migration/1629833361000-AddShowTLReplies.js @@ -0,0 +1,15 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class addShowTLReplies1629833361000 { + constructor() { + this.name = 'addShowTLReplies1629833361000'; + } + async up(queryRunner) { + await queryRunner.query(`ALTER TABLE "user" ADD "showTimelineReplies" boolean NOT NULL DEFAULT false`); + await queryRunner.query(`COMMENT ON COLUMN "user"."showTimelineReplies" IS 'Whether to show users replying to other users in the timeline.'`); + } + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "showTimelineReplies"`); + } +} +exports.addShowTLReplies1629833361000 = addShowTLReplies1629833361000; diff --git a/packages/backend/migration/1643963705770-chart-v4.js b/packages/backend/migration/1643963705770-chart-v4.js new file mode 100644 index 000000000..91b0a747e --- /dev/null +++ b/packages/backend/migration/1643963705770-chart-v4.js @@ -0,0 +1,63 @@ +const { MigrationInterface, QueryRunner } = require("typeorm"); + +module.exports = class chartV41643963705770 { + name = 'chartV41643963705770' + + async up(queryRunner) { + await queryRunner.query(`ALTER TABLE "__chart__instance" DROP COLUMN "___drive_totalUsage"`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" DROP COLUMN "___drive_totalUsage"`); + await queryRunner.query(`ALTER TABLE "__chart__drive" DROP COLUMN "___local_totalCount"`); + await queryRunner.query(`ALTER TABLE "__chart__drive" DROP COLUMN "___local_totalSize"`); + await queryRunner.query(`ALTER TABLE "__chart__drive" DROP COLUMN "___remote_totalCount"`); + await queryRunner.query(`ALTER TABLE "__chart__drive" DROP COLUMN "___remote_totalSize"`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" DROP COLUMN "___local_totalCount"`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" DROP COLUMN "___local_totalSize"`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" DROP COLUMN "___remote_totalCount"`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" DROP COLUMN "___remote_totalSize"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___local_users"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___local_users" bigint NOT NULL DEFAULT 0`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___remote_users"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___remote_users" bigint NOT NULL DEFAULT 0`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___local_users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___local_users" bigint NOT NULL DEFAULT 0`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___remote_users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___remote_users" bigint NOT NULL DEFAULT 0`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" DROP COLUMN "___local_users"`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" ADD "___local_users" bigint NOT NULL DEFAULT 0`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" DROP COLUMN "___remote_users"`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" ADD "___remote_users" bigint NOT NULL DEFAULT 0`); + await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" DROP COLUMN "___local_users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" ADD "___local_users" bigint NOT NULL DEFAULT 0`); + await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" DROP COLUMN "___remote_users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" ADD "___remote_users" bigint NOT NULL DEFAULT 0`); + } + + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" DROP COLUMN "___remote_users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" ADD "___remote_users" character varying array NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" DROP COLUMN "___local_users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" ADD "___local_users" character varying array NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" DROP COLUMN "___remote_users"`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" ADD "___remote_users" character varying array NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" DROP COLUMN "___local_users"`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" ADD "___local_users" character varying array NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___remote_users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___remote_users" character varying array NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___local_users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___local_users" character varying array NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___remote_users"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___remote_users" character varying array NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___local_users"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___local_users" character varying array NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ADD "___remote_totalSize" bigint NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ADD "___remote_totalCount" bigint NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ADD "___local_totalSize" bigint NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ADD "___local_totalCount" bigint NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ADD "___remote_totalSize" bigint NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ADD "___remote_totalCount" bigint NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ADD "___local_totalSize" bigint NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ADD "___local_totalCount" bigint NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ADD "___drive_totalUsage" bigint NOT NULL`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ADD "___drive_totalUsage" bigint NOT NULL`); + } +} diff --git a/packages/backend/migration/1643966656277-chart-v5.js b/packages/backend/migration/1643966656277-chart-v5.js new file mode 100644 index 000000000..9ff05be63 --- /dev/null +++ b/packages/backend/migration/1643966656277-chart-v5.js @@ -0,0 +1,27 @@ +const { MigrationInterface, QueryRunner } = require("typeorm"); + +module.exports = class chartV51643966656277 { + name = 'chartV51643966656277' + + async up(queryRunner) { + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___local_users" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___remote_users" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___local_users" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___remote_users" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" ADD "unique_temp___local_users" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" ADD "unique_temp___remote_users" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" ADD "unique_temp___local_users" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" ADD "unique_temp___remote_users" character varying array NOT NULL DEFAULT '{}'`); + } + + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" DROP COLUMN "unique_temp___remote_users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" DROP COLUMN "unique_temp___local_users"`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" DROP COLUMN "unique_temp___remote_users"`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" DROP COLUMN "unique_temp___local_users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___remote_users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___local_users"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___remote_users"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___local_users"`); + } +} diff --git a/packages/backend/migration/1643967331284-chart-v6.js b/packages/backend/migration/1643967331284-chart-v6.js new file mode 100644 index 000000000..86feade9d --- /dev/null +++ b/packages/backend/migration/1643967331284-chart-v6.js @@ -0,0 +1,343 @@ +const { MigrationInterface, QueryRunner } = require("typeorm"); + +module.exports = class chartV61643967331284 { + name = 'chartV61643967331284' + + async up(queryRunner) { + await queryRunner.query(`ALTER TABLE "__chart__federation" ALTER COLUMN "___instance_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__federation" ALTER COLUMN "___instance_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__federation" ALTER COLUMN "___instance_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" ALTER COLUMN "___instance_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" ALTER COLUMN "___instance_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" ALTER COLUMN "___instance_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_diffs_normal" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_diffs_reply" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_diffs_renote" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_diffs_normal" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_diffs_reply" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_diffs_renote" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_diffs_normal" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_diffs_reply" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_diffs_renote" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_diffs_normal" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_diffs_reply" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_diffs_renote" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___local_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___local_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___local_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___remote_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___remote_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___remote_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___local_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___local_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___local_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___remote_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___remote_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___remote_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___incomingRequests" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___outgoingRequests" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___totalTime" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___incomingBytes" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___outgoingBytes" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___incomingRequests" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___outgoingRequests" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___totalTime" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___incomingBytes" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___outgoingBytes" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___requests_failed" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___requests_succeeded" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___requests_received" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_diffs_normal" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_diffs_reply" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_diffs_renote" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___users_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___users_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___users_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___following_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___following_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___following_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___followers_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___followers_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___followers_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_totalFiles" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_incFiles" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_decFiles" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_incUsage" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_decUsage" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___requests_failed" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___requests_succeeded" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___requests_received" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_diffs_normal" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_diffs_reply" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_diffs_renote" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___users_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___users_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___users_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___following_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___following_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___following_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___followers_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___followers_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___followers_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_totalFiles" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_incFiles" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_decFiles" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_incUsage" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_decUsage" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___diffs_normal" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___diffs_reply" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___diffs_renote" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___diffs_normal" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___diffs_reply" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___diffs_renote" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_incCount" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_incSize" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_decCount" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_decSize" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_incCount" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_incSize" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_decCount" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_decSize" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_incCount" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_incSize" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_decCount" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_decSize" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_incCount" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_incSize" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_decCount" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_decSize" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_reaction" ALTER COLUMN "___local_count" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_reaction" ALTER COLUMN "___remote_count" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_reaction" ALTER COLUMN "___local_count" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_reaction" ALTER COLUMN "___remote_count" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followings_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followings_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followings_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followers_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followers_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followers_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followings_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followings_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followings_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followers_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followers_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followers_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followings_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followings_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followings_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followers_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followers_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followers_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followings_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followings_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followings_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followers_total" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followers_inc" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followers_dec" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___totalCount" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___totalSize" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___incCount" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___incSize" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___decCount" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___decSize" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___totalCount" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___totalSize" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___incCount" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___incSize" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___decCount" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___decSize" SET DEFAULT '0'`); + } + + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___decSize" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___decCount" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___incSize" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___incCount" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___totalSize" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___totalCount" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___decSize" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___decCount" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___incSize" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___incCount" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___totalSize" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___totalCount" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followers_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followers_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followers_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followings_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followings_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followings_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followers_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followers_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followers_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followings_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followings_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followings_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followers_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followers_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followers_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followings_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followings_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followings_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followers_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followers_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followers_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followings_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followings_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followings_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_reaction" ALTER COLUMN "___remote_count" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_reaction" ALTER COLUMN "___local_count" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_reaction" ALTER COLUMN "___remote_count" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_reaction" ALTER COLUMN "___local_count" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_decSize" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_decCount" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_incSize" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_incCount" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_decSize" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_decCount" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_incSize" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_incCount" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_decSize" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_decCount" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_incSize" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_incCount" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_decSize" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_decCount" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_incSize" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_incCount" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___diffs_renote" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___diffs_reply" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___diffs_normal" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___diffs_renote" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___diffs_reply" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___diffs_normal" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_decUsage" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_incUsage" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_decFiles" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_incFiles" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_totalFiles" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___followers_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___followers_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___followers_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___following_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___following_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___following_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___users_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___users_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___users_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_diffs_renote" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_diffs_reply" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_diffs_normal" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___requests_received" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___requests_succeeded" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___requests_failed" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_decUsage" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_incUsage" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_decFiles" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_incFiles" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_totalFiles" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___followers_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___followers_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___followers_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___following_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___following_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___following_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___users_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___users_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___users_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_diffs_renote" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_diffs_reply" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_diffs_normal" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___requests_received" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___requests_succeeded" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___requests_failed" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___outgoingBytes" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___incomingBytes" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___totalTime" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___outgoingRequests" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___incomingRequests" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___outgoingBytes" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___incomingBytes" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___totalTime" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___outgoingRequests" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___incomingRequests" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___remote_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___remote_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___remote_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___local_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___local_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___local_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___remote_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___remote_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___remote_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___local_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___local_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___local_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_diffs_renote" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_diffs_reply" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_diffs_normal" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_diffs_renote" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_diffs_reply" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_diffs_normal" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_diffs_renote" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_diffs_reply" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_diffs_normal" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_diffs_renote" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_diffs_reply" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_diffs_normal" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" ALTER COLUMN "___instance_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" ALTER COLUMN "___instance_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" ALTER COLUMN "___instance_total" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__federation" ALTER COLUMN "___instance_dec" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__federation" ALTER COLUMN "___instance_inc" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "__chart__federation" ALTER COLUMN "___instance_total" DROP DEFAULT`); + } +} diff --git a/packages/backend/migration/1644058404077-chart-v7.js b/packages/backend/migration/1644058404077-chart-v7.js new file mode 100644 index 000000000..a462a7cd3 --- /dev/null +++ b/packages/backend/migration/1644058404077-chart-v7.js @@ -0,0 +1,511 @@ +const { MigrationInterface, QueryRunner } = require("typeorm"); + +module.exports = class chartV71644058404077 { + name = 'chartV71644058404077' + + async up(queryRunner) { + await queryRunner.query(`UPDATE "__chart__federation" SET "___instance_total"=2147483647 WHERE "___instance_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__federation" SET "___instance_inc"=32767 WHERE "___instance_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart__federation" SET "___instance_dec"=32767 WHERE "___instance_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__federation" SET "___instance_total"=2147483647 WHERE "___instance_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__federation" SET "___instance_inc"=32767 WHERE "___instance_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__federation" SET "___instance_dec"=32767 WHERE "___instance_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart__notes" SET "___local_total"=2147483647 WHERE "___local_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__notes" SET "___local_inc"=2147483647 WHERE "___local_inc" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__notes" SET "___local_dec"=2147483647 WHERE "___local_dec" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__notes" SET "___local_diffs_normal"=2147483647 WHERE "___local_diffs_normal" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__notes" SET "___local_diffs_reply"=2147483647 WHERE "___local_diffs_reply" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__notes" SET "___local_diffs_renote"=2147483647 WHERE "___local_diffs_renote" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__notes" SET "___remote_total"=2147483647 WHERE "___remote_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__notes" SET "___remote_inc"=2147483647 WHERE "___remote_inc" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__notes" SET "___remote_dec"=2147483647 WHERE "___remote_dec" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__notes" SET "___remote_diffs_normal"=2147483647 WHERE "___remote_diffs_normal" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__notes" SET "___remote_diffs_reply"=2147483647 WHERE "___remote_diffs_reply" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__notes" SET "___remote_diffs_renote"=2147483647 WHERE "___remote_diffs_renote" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__notes" SET "___local_total"=2147483647 WHERE "___local_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__notes" SET "___local_inc"=2147483647 WHERE "___local_inc" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__notes" SET "___local_dec"=2147483647 WHERE "___local_dec" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__notes" SET "___local_diffs_normal"=2147483647 WHERE "___local_diffs_normal" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__notes" SET "___local_diffs_reply"=2147483647 WHERE "___local_diffs_reply" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__notes" SET "___local_diffs_renote"=2147483647 WHERE "___local_diffs_renote" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__notes" SET "___remote_total"=2147483647 WHERE "___remote_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__notes" SET "___remote_inc"=2147483647 WHERE "___remote_inc" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__notes" SET "___remote_dec"=2147483647 WHERE "___remote_dec" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__notes" SET "___remote_diffs_normal"=2147483647 WHERE "___remote_diffs_normal" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__notes" SET "___remote_diffs_reply"=2147483647 WHERE "___remote_diffs_reply" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__notes" SET "___remote_diffs_renote"=2147483647 WHERE "___remote_diffs_renote" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__users" SET "___local_total"=2147483647 WHERE "___local_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__users" SET "___local_inc"=32767 WHERE "___local_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart__users" SET "___local_dec"=32767 WHERE "___local_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart__users" SET "___remote_total"=2147483647 WHERE "___remote_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__users" SET "___remote_inc"=32767 WHERE "___remote_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart__users" SET "___remote_dec"=32767 WHERE "___remote_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__users" SET "___local_total"=2147483647 WHERE "___local_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__users" SET "___local_inc"=32767 WHERE "___local_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__users" SET "___local_dec"=32767 WHERE "___local_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__users" SET "___remote_total"=2147483647 WHERE "___remote_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__users" SET "___remote_inc"=32767 WHERE "___remote_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__users" SET "___remote_dec"=32767 WHERE "___remote_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart__network" SET "___incomingRequests"=2147483647 WHERE "___incomingRequests" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__network" SET "___outgoingRequests"=2147483647 WHERE "___outgoingRequests" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__network" SET "___totalTime"=2147483647 WHERE "___totalTime" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__network" SET "___incomingBytes"=2147483647 WHERE "___incomingBytes" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__network" SET "___outgoingBytes"=2147483647 WHERE "___outgoingBytes" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__network" SET "___incomingRequests"=2147483647 WHERE "___incomingRequests" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__network" SET "___outgoingRequests"=2147483647 WHERE "___outgoingRequests" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__network" SET "___totalTime"=2147483647 WHERE "___totalTime" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__network" SET "___incomingBytes"=2147483647 WHERE "___incomingBytes" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__network" SET "___outgoingBytes"=2147483647 WHERE "___outgoingBytes" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___requests_failed"=32767 WHERE "___requests_failed" > 32767`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___requests_succeeded"=32767 WHERE "___requests_succeeded" > 32767`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___requests_received"=32767 WHERE "___requests_received" > 32767`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___notes_total"=2147483647 WHERE "___notes_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___notes_inc"=2147483647 WHERE "___notes_inc" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___notes_dec"=2147483647 WHERE "___notes_dec" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___notes_diffs_normal"=2147483647 WHERE "___notes_diffs_normal" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___notes_diffs_reply"=2147483647 WHERE "___notes_diffs_reply" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___notes_diffs_renote"=2147483647 WHERE "___notes_diffs_renote" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___users_total"=2147483647 WHERE "___users_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___users_inc"=32767 WHERE "___users_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___users_dec"=32767 WHERE "___users_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___following_total"=2147483647 WHERE "___following_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___following_inc"=32767 WHERE "___following_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___following_dec"=32767 WHERE "___following_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___followers_total"=2147483647 WHERE "___followers_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___followers_inc"=32767 WHERE "___followers_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___followers_dec"=32767 WHERE "___followers_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___drive_totalFiles"=2147483647 WHERE "___drive_totalFiles" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___drive_incFiles"=2147483647 WHERE "___drive_incFiles" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___drive_decFiles"=2147483647 WHERE "___drive_decFiles" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___drive_incUsage"=2147483647 WHERE "___drive_incUsage" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__instance" SET "___drive_decUsage"=2147483647 WHERE "___drive_decUsage" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___requests_failed"=32767 WHERE "___requests_failed" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___requests_succeeded"=32767 WHERE "___requests_succeeded" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___requests_received"=32767 WHERE "___requests_received" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___notes_total"=2147483647 WHERE "___notes_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___notes_inc"=2147483647 WHERE "___notes_inc" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___notes_dec"=2147483647 WHERE "___notes_dec" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___notes_diffs_normal"=2147483647 WHERE "___notes_diffs_normal" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___notes_diffs_reply"=2147483647 WHERE "___notes_diffs_reply" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___notes_diffs_renote"=2147483647 WHERE "___notes_diffs_renote" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___users_total"=2147483647 WHERE "___users_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___users_inc"=32767 WHERE "___users_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___users_dec"=32767 WHERE "___users_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___following_total"=2147483647 WHERE "___following_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___following_inc"=32767 WHERE "___following_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___following_dec"=32767 WHERE "___following_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___followers_total"=2147483647 WHERE "___followers_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___followers_inc"=32767 WHERE "___followers_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___followers_dec"=32767 WHERE "___followers_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___drive_totalFiles"=2147483647 WHERE "___drive_totalFiles" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___drive_incFiles"=2147483647 WHERE "___drive_incFiles" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___drive_decFiles"=2147483647 WHERE "___drive_decFiles" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___drive_incUsage"=2147483647 WHERE "___drive_incUsage" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__instance" SET "___drive_decUsage"=2147483647 WHERE "___drive_decUsage" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__per_user_notes" SET "___total"=2147483647 WHERE "___total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__per_user_notes" SET "___inc"=32767 WHERE "___inc" > 32767`); + await queryRunner.query(`UPDATE "__chart__per_user_notes" SET "___dec"=32767 WHERE "___dec" > 32767`); + await queryRunner.query(`UPDATE "__chart__per_user_notes" SET "___diffs_normal"=32767 WHERE "___diffs_normal" > 32767`); + await queryRunner.query(`UPDATE "__chart__per_user_notes" SET "___diffs_reply"=32767 WHERE "___diffs_reply" > 32767`); + await queryRunner.query(`UPDATE "__chart__per_user_notes" SET "___diffs_renote"=32767 WHERE "___diffs_renote" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__per_user_notes" SET "___total"=2147483647 WHERE "___total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__per_user_notes" SET "___inc"=32767 WHERE "___inc" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__per_user_notes" SET "___dec"=32767 WHERE "___dec" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__per_user_notes" SET "___diffs_normal"=32767 WHERE "___diffs_normal" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__per_user_notes" SET "___diffs_reply"=32767 WHERE "___diffs_reply" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__per_user_notes" SET "___diffs_renote"=32767 WHERE "___diffs_renote" > 32767`); + await queryRunner.query(`UPDATE "__chart__drive" SET "___local_incCount"=2147483647 WHERE "___local_incCount" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__drive" SET "___local_incSize"=2147483647 WHERE "___local_incSize" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__drive" SET "___local_decCount"=2147483647 WHERE "___local_decCount" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__drive" SET "___local_decSize"=2147483647 WHERE "___local_decSize" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__drive" SET "___remote_incCount"=2147483647 WHERE "___remote_incCount" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__drive" SET "___remote_incSize"=2147483647 WHERE "___remote_incSize" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__drive" SET "___remote_decCount"=2147483647 WHERE "___remote_decCount" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__drive" SET "___remote_decSize"=2147483647 WHERE "___remote_decSize" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__drive" SET "___local_incCount"=2147483647 WHERE "___local_incCount" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__drive" SET "___local_incSize"=2147483647 WHERE "___local_incSize" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__drive" SET "___local_decCount"=2147483647 WHERE "___local_decCount" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__drive" SET "___local_decSize"=2147483647 WHERE "___local_decSize" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__drive" SET "___remote_incCount"=2147483647 WHERE "___remote_incCount" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__drive" SET "___remote_incSize"=2147483647 WHERE "___remote_incSize" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__drive" SET "___remote_decCount"=2147483647 WHERE "___remote_decCount" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__drive" SET "___remote_decSize"=2147483647 WHERE "___remote_decSize" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__per_user_reaction" SET "___local_count"=32767 WHERE "___local_count" > 32767`); + await queryRunner.query(`UPDATE "__chart__per_user_reaction" SET "___remote_count"=32767 WHERE "___remote_count" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__per_user_reaction" SET "___local_count"=32767 WHERE "___local_count" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__per_user_reaction" SET "___remote_count"=32767 WHERE "___remote_count" > 32767`); + await queryRunner.query(`UPDATE "__chart__per_user_following" SET "___local_followings_total"=2147483647 WHERE "___local_followings_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__per_user_following" SET "___local_followings_inc"=32767 WHERE "___local_followings_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart__per_user_following" SET "___local_followings_dec"=32767 WHERE "___local_followings_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart__per_user_following" SET "___local_followers_total"=2147483647 WHERE "___local_followers_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__per_user_following" SET "___local_followers_inc"=32767 WHERE "___local_followers_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart__per_user_following" SET "___local_followers_dec"=32767 WHERE "___local_followers_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart__per_user_following" SET "___remote_followings_total"=2147483647 WHERE "___remote_followings_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__per_user_following" SET "___remote_followings_inc"=32767 WHERE "___remote_followings_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart__per_user_following" SET "___remote_followings_dec"=32767 WHERE "___remote_followings_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart__per_user_following" SET "___remote_followers_total"=2147483647 WHERE "___remote_followers_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__per_user_following" SET "___remote_followers_inc"=32767 WHERE "___remote_followers_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart__per_user_following" SET "___remote_followers_dec"=32767 WHERE "___remote_followers_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__per_user_following" SET "___local_followings_total"=2147483647 WHERE "___local_followings_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__per_user_following" SET "___local_followings_inc"=32767 WHERE "___local_followings_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__per_user_following" SET "___local_followings_dec"=32767 WHERE "___local_followings_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__per_user_following" SET "___local_followers_total"=2147483647 WHERE "___local_followers_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__per_user_following" SET "___local_followers_inc"=32767 WHERE "___local_followers_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__per_user_following" SET "___local_followers_dec"=32767 WHERE "___local_followers_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__per_user_following" SET "___remote_followings_total"=2147483647 WHERE "___remote_followings_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__per_user_following" SET "___remote_followings_inc"=32767 WHERE "___remote_followings_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__per_user_following" SET "___remote_followings_dec"=32767 WHERE "___remote_followings_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__per_user_following" SET "___remote_followers_total"=2147483647 WHERE "___remote_followers_total" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__per_user_following" SET "___remote_followers_inc"=32767 WHERE "___remote_followers_inc" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__per_user_following" SET "___remote_followers_dec"=32767 WHERE "___remote_followers_dec" > 32767`); + await queryRunner.query(`UPDATE "__chart__per_user_drive" SET "___totalCount"=2147483647 WHERE "___totalCount" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__per_user_drive" SET "___totalSize"=2147483647 WHERE "___totalSize" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__per_user_drive" SET "___incCount"=32767 WHERE "___incCount" > 32767`); + await queryRunner.query(`UPDATE "__chart__per_user_drive" SET "___incSize"=2147483647 WHERE "___incSize" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__per_user_drive" SET "___decCount"=32767 WHERE "___decCount" > 32767`); + await queryRunner.query(`UPDATE "__chart__per_user_drive" SET "___decSize"=2147483647 WHERE "___decSize" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__per_user_drive" SET "___totalCount"=2147483647 WHERE "___totalCount" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__per_user_drive" SET "___totalSize"=2147483647 WHERE "___totalSize" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__per_user_drive" SET "___incCount"=32767 WHERE "___incCount" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__per_user_drive" SET "___incSize"=2147483647 WHERE "___incSize" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__per_user_drive" SET "___decCount"=32767 WHERE "___decCount" > 32767`); + await queryRunner.query(`UPDATE "__chart_day__per_user_drive" SET "___decSize"=2147483647 WHERE "___decSize" > 2147483647`); + + await queryRunner.query(`ALTER TABLE "__chart__federation" ALTER COLUMN "___instance_total" TYPE integer USING "___instance_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__federation" ALTER COLUMN "___instance_inc" TYPE smallint USING "___instance_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__federation" ALTER COLUMN "___instance_dec" TYPE smallint USING "___instance_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" ALTER COLUMN "___instance_total" TYPE integer USING "___instance_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" ALTER COLUMN "___instance_inc" TYPE smallint USING "___instance_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" ALTER COLUMN "___instance_dec" TYPE smallint USING "___instance_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_total" TYPE integer USING "___local_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_inc" TYPE integer USING "___local_inc"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_dec" TYPE integer USING "___local_dec"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_diffs_normal" TYPE integer USING "___local_diffs_normal"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_diffs_reply" TYPE integer USING "___local_diffs_reply"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_diffs_renote" TYPE integer USING "___local_diffs_renote"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_total" TYPE integer USING "___remote_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_inc" TYPE integer USING "___remote_inc"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_dec" TYPE integer USING "___remote_dec"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_diffs_normal" TYPE integer USING "___remote_diffs_normal"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_diffs_reply" TYPE integer USING "___remote_diffs_reply"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_diffs_renote" TYPE integer USING "___remote_diffs_renote"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_total" TYPE integer USING "___local_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_inc" TYPE integer USING "___local_inc"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_dec" TYPE integer USING "___local_dec"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_diffs_normal" TYPE integer USING "___local_diffs_normal"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_diffs_reply" TYPE integer USING "___local_diffs_reply"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_diffs_renote" TYPE integer USING "___local_diffs_renote"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_total" TYPE integer USING "___remote_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_inc" TYPE integer USING "___remote_inc"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_dec" TYPE integer USING "___remote_dec"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_diffs_normal" TYPE integer USING "___remote_diffs_normal"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_diffs_reply" TYPE integer USING "___remote_diffs_reply"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_diffs_renote" TYPE integer USING "___remote_diffs_renote"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___local_total" TYPE integer USING "___local_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___local_inc" TYPE smallint USING "___local_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___local_dec" TYPE smallint USING "___local_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___remote_total" TYPE integer USING "___remote_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___remote_inc" TYPE smallint USING "___remote_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___remote_dec" TYPE smallint USING "___remote_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___local_total" TYPE integer USING "___local_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___local_inc" TYPE smallint USING "___local_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___local_dec" TYPE smallint USING "___local_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___remote_total" TYPE integer USING "___remote_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___remote_inc" TYPE smallint USING "___remote_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___remote_dec" TYPE smallint USING "___remote_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___incomingRequests" TYPE integer USING "___incomingRequests"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___outgoingRequests" TYPE integer USING "___outgoingRequests"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___totalTime" TYPE integer USING "___totalTime"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___incomingBytes" TYPE integer USING "___incomingBytes"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___outgoingBytes" TYPE integer USING "___outgoingBytes"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___incomingRequests" TYPE integer USING "___incomingRequests"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___outgoingRequests" TYPE integer USING "___outgoingRequests"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___totalTime" TYPE integer USING "___totalTime"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___incomingBytes" TYPE integer USING "___incomingBytes"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___outgoingBytes" TYPE integer USING "___outgoingBytes"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___requests_failed" TYPE smallint USING "___requests_failed"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___requests_succeeded" TYPE smallint USING "___requests_succeeded"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___requests_received" TYPE smallint USING "___requests_received"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_total" TYPE integer USING "___notes_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_inc" TYPE integer USING "___notes_inc"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_dec" TYPE integer USING "___notes_dec"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_diffs_normal" TYPE integer USING "___notes_diffs_normal"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_diffs_reply" TYPE integer USING "___notes_diffs_reply"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_diffs_renote" TYPE integer USING "___notes_diffs_renote"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___users_total" TYPE integer USING "___users_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___users_inc" TYPE smallint USING "___users_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___users_dec" TYPE smallint USING "___users_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___following_total" TYPE integer USING "___following_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___following_inc" TYPE smallint USING "___following_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___following_dec" TYPE smallint USING "___following_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___followers_total" TYPE integer USING "___followers_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___followers_inc" TYPE smallint USING "___followers_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___followers_dec" TYPE smallint USING "___followers_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_totalFiles" TYPE integer USING "___drive_totalFiles"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_incFiles" TYPE integer USING "___drive_incFiles"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_decFiles" TYPE integer USING "___drive_decFiles"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_incUsage" TYPE integer USING "___drive_incUsage"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_decUsage" TYPE integer USING "___drive_decUsage"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___requests_failed" TYPE smallint USING "___requests_failed"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___requests_succeeded" TYPE smallint USING "___requests_succeeded"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___requests_received" TYPE smallint USING "___requests_received"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_total" TYPE integer USING "___notes_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_inc" TYPE integer USING "___notes_inc"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_dec" TYPE integer USING "___notes_dec"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_diffs_normal" TYPE integer USING "___notes_diffs_normal"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_diffs_reply" TYPE integer USING "___notes_diffs_reply"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_diffs_renote" TYPE integer USING "___notes_diffs_renote"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___users_total" TYPE integer USING "___users_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___users_inc" TYPE smallint USING "___users_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___users_dec" TYPE smallint USING "___users_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___following_total" TYPE integer USING "___following_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___following_inc" TYPE smallint USING "___following_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___following_dec" TYPE smallint USING "___following_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___followers_total" TYPE integer USING "___followers_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___followers_inc" TYPE smallint USING "___followers_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___followers_dec" TYPE smallint USING "___followers_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_totalFiles" TYPE integer USING "___drive_totalFiles"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_incFiles" TYPE integer USING "___drive_incFiles"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_decFiles" TYPE integer USING "___drive_decFiles"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_incUsage" TYPE integer USING "___drive_incUsage"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_decUsage" TYPE integer USING "___drive_decUsage"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___total" TYPE integer USING "___total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___inc" TYPE smallint USING "___inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___dec" TYPE smallint USING "___dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___diffs_normal" TYPE smallint USING "___diffs_normal"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___diffs_reply" TYPE smallint USING "___diffs_reply"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___diffs_renote" TYPE smallint USING "___diffs_renote"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___total" TYPE integer USING "___total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___inc" TYPE smallint USING "___inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___dec" TYPE smallint USING "___dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___diffs_normal" TYPE smallint USING "___diffs_normal"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___diffs_reply" TYPE smallint USING "___diffs_reply"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___diffs_renote" TYPE smallint USING "___diffs_renote"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_incCount" TYPE integer USING "___local_incCount"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_incSize" TYPE integer USING "___local_incSize"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_decCount" TYPE integer USING "___local_decCount"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_decSize" TYPE integer USING "___local_decSize"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_incCount" TYPE integer USING "___remote_incCount"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_incSize" TYPE integer USING "___remote_incSize"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_decCount" TYPE integer USING "___remote_decCount"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_decSize" TYPE integer USING "___remote_decSize"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_incCount" TYPE integer USING "___local_incCount"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_incSize" TYPE integer USING "___local_incSize"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_decCount" TYPE integer USING "___local_decCount"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_decSize" TYPE integer USING "___local_decSize"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_incCount" TYPE integer USING "___remote_incCount"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_incSize" TYPE integer USING "___remote_incSize"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_decCount" TYPE integer USING "___remote_decCount"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_decSize" TYPE integer USING "___remote_decSize"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_reaction" ALTER COLUMN "___local_count" TYPE smallint USING "___local_count"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_reaction" ALTER COLUMN "___remote_count" TYPE smallint USING "___remote_count"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_reaction" ALTER COLUMN "___local_count" TYPE smallint USING "___local_count"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_reaction" ALTER COLUMN "___remote_count" TYPE smallint USING "___remote_count"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followings_total" TYPE integer USING "___local_followings_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followings_inc" TYPE smallint USING "___local_followings_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followings_dec" TYPE smallint USING "___local_followings_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followers_total" TYPE integer USING "___local_followers_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followers_inc" TYPE smallint USING "___local_followers_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followers_dec" TYPE smallint USING "___local_followers_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followings_total" TYPE integer USING "___remote_followings_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followings_inc" TYPE smallint USING "___remote_followings_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followings_dec" TYPE smallint USING "___remote_followings_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followers_total" TYPE integer USING "___remote_followers_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followers_inc" TYPE smallint USING "___remote_followers_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followers_dec" TYPE smallint USING "___remote_followers_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followings_total" TYPE integer USING "___local_followings_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followings_inc" TYPE smallint USING "___local_followings_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followings_dec" TYPE smallint USING "___local_followings_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followers_total" TYPE integer USING "___local_followers_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followers_inc" TYPE smallint USING "___local_followers_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followers_dec" TYPE smallint USING "___local_followers_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followings_total" TYPE integer USING "___remote_followings_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followings_inc" TYPE smallint USING "___remote_followings_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followings_dec" TYPE smallint USING "___remote_followings_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followers_total" TYPE integer USING "___remote_followers_total"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followers_inc" TYPE smallint USING "___remote_followers_inc"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followers_dec" TYPE smallint USING "___remote_followers_dec"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___totalCount" TYPE integer USING "___totalCount"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___totalSize" TYPE integer USING "___totalSize"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___incCount" TYPE smallint USING "___incCount"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___incSize" TYPE integer USING "___incSize"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___decCount" TYPE smallint USING "___decCount"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___decSize" TYPE integer USING "___decSize"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___totalCount" TYPE integer USING "___totalCount"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___totalSize" TYPE integer USING "___totalSize"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___incCount" TYPE smallint USING "___incCount"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___incSize" TYPE integer USING "___incSize"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___decCount" TYPE smallint USING "___decCount"::smallint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___decSize" TYPE integer USING "___decSize"::integer`); + } + + async down(queryRunner) { + + await queryRunner.query(`ALTER TABLE "__chart__federation" ALTER COLUMN "___instance_total" TYPE bigint USING "___instance_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__federation" ALTER COLUMN "___instance_inc" TYPE bigint USING "___instance_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__federation" ALTER COLUMN "___instance_dec" TYPE bigint USING "___instance_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" ALTER COLUMN "___instance_total" TYPE bigint USING "___instance_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" ALTER COLUMN "___instance_inc" TYPE bigint USING "___instance_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" ALTER COLUMN "___instance_dec" TYPE bigint USING "___instance_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_total" TYPE bigint USING "___local_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_inc" TYPE bigint USING "___local_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_dec" TYPE bigint USING "___local_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_diffs_normal" TYPE bigint USING "___local_diffs_normal"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_diffs_reply" TYPE bigint USING "___local_diffs_reply"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_diffs_renote" TYPE bigint USING "___local_diffs_renote"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_total" TYPE bigint USING "___remote_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_inc" TYPE bigint USING "___remote_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_dec" TYPE bigint USING "___remote_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_diffs_normal" TYPE bigint USING "___remote_diffs_normal"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_diffs_reply" TYPE bigint USING "___remote_diffs_reply"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_diffs_renote" TYPE bigint USING "___remote_diffs_renote"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_total" TYPE bigint USING "___local_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_inc" TYPE bigint USING "___local_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_dec" TYPE bigint USING "___local_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_diffs_normal" TYPE bigint USING "___local_diffs_normal"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_diffs_reply" TYPE bigint USING "___local_diffs_reply"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_diffs_renote" TYPE bigint USING "___local_diffs_renote"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_total" TYPE bigint USING "___remote_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_inc" TYPE bigint USING "___remote_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_dec" TYPE bigint USING "___remote_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_diffs_normal" TYPE bigint USING "___remote_diffs_normal"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_diffs_reply" TYPE bigint USING "___remote_diffs_reply"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_diffs_renote" TYPE bigint USING "___remote_diffs_renote"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___local_total" TYPE bigint USING "___local_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___local_inc" TYPE bigint USING "___local_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___local_dec" TYPE bigint USING "___local_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___remote_total" TYPE bigint USING "___remote_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___remote_inc" TYPE bigint USING "___remote_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___remote_dec" TYPE bigint USING "___remote_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___local_total" TYPE bigint USING "___local_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___local_inc" TYPE bigint USING "___local_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___local_dec" TYPE bigint USING "___local_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___remote_total" TYPE bigint USING "___remote_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___remote_inc" TYPE bigint USING "___remote_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___remote_dec" TYPE bigint USING "___remote_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___incomingRequests" TYPE bigint USING "___incomingRequests"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___outgoingRequests" TYPE bigint USING "___outgoingRequests"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___totalTime" TYPE bigint USING "___totalTime"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___incomingBytes" TYPE bigint USING "___incomingBytes"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___outgoingBytes" TYPE bigint USING "___outgoingBytes"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___incomingRequests" TYPE bigint USING "___incomingRequests"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___outgoingRequests" TYPE bigint USING "___outgoingRequests"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___totalTime" TYPE bigint USING "___totalTime"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___incomingBytes" TYPE bigint USING "___incomingBytes"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___outgoingBytes" TYPE bigint USING "___outgoingBytes"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___requests_failed" TYPE bigint USING "___requests_failed"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___requests_succeeded" TYPE bigint USING "___requests_succeeded"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___requests_received" TYPE bigint USING "___requests_received"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_total" TYPE bigint USING "___notes_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_inc" TYPE bigint USING "___notes_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_dec" TYPE bigint USING "___notes_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_diffs_normal" TYPE bigint USING "___notes_diffs_normal"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_diffs_reply" TYPE bigint USING "___notes_diffs_reply"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_diffs_renote" TYPE bigint USING "___notes_diffs_renote"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___users_total" TYPE bigint USING "___users_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___users_inc" TYPE bigint USING "___users_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___users_dec" TYPE bigint USING "___users_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___following_total" TYPE bigint USING "___following_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___following_inc" TYPE bigint USING "___following_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___following_dec" TYPE bigint USING "___following_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___followers_total" TYPE bigint USING "___followers_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___followers_inc" TYPE bigint USING "___followers_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___followers_dec" TYPE bigint USING "___followers_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_totalFiles" TYPE bigint USING "___drive_totalFiles"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_incFiles" TYPE bigint USING "___drive_incFiles"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_decFiles" TYPE bigint USING "___drive_decFiles"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_incUsage" TYPE bigint USING "___drive_incUsage"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_decUsage" TYPE bigint USING "___drive_decUsage"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___requests_failed" TYPE bigint USING "___requests_failed"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___requests_succeeded" TYPE bigint USING "___requests_succeeded"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___requests_received" TYPE bigint USING "___requests_received"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_total" TYPE bigint USING "___notes_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_inc" TYPE bigint USING "___notes_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_dec" TYPE bigint USING "___notes_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_diffs_normal" TYPE bigint USING "___notes_diffs_normal"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_diffs_reply" TYPE bigint USING "___notes_diffs_reply"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_diffs_renote" TYPE bigint USING "___notes_diffs_renote"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___users_total" TYPE bigint USING "___users_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___users_inc" TYPE bigint USING "___users_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___users_dec" TYPE bigint USING "___users_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___following_total" TYPE bigint USING "___following_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___following_inc" TYPE bigint USING "___following_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___following_dec" TYPE bigint USING "___following_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___followers_total" TYPE bigint USING "___followers_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___followers_inc" TYPE bigint USING "___followers_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___followers_dec" TYPE bigint USING "___followers_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_totalFiles" TYPE bigint USING "___drive_totalFiles"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_incFiles" TYPE bigint USING "___drive_incFiles"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_decFiles" TYPE bigint USING "___drive_decFiles"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_incUsage" TYPE bigint USING "___drive_incUsage"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_decUsage" TYPE bigint USING "___drive_decUsage"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___total" TYPE bigint USING "___total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___inc" TYPE bigint USING "___inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___dec" TYPE bigint USING "___dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___diffs_normal" TYPE bigint USING "___diffs_normal"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___diffs_reply" TYPE bigint USING "___diffs_reply"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___diffs_renote" TYPE bigint USING "___diffs_renote"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___total" TYPE bigint USING "___total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___inc" TYPE bigint USING "___inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___dec" TYPE bigint USING "___dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___diffs_normal" TYPE bigint USING "___diffs_normal"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___diffs_reply" TYPE bigint USING "___diffs_reply"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___diffs_renote" TYPE bigint USING "___diffs_renote"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_incCount" TYPE bigint USING "___local_incCount"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_incSize" TYPE bigint USING "___local_incSize"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_decCount" TYPE bigint USING "___local_decCount"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_decSize" TYPE bigint USING "___local_decSize"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_incCount" TYPE bigint USING "___remote_incCount"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_incSize" TYPE bigint USING "___remote_incSize"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_decCount" TYPE bigint USING "___remote_decCount"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_decSize" TYPE bigint USING "___remote_decSize"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_incCount" TYPE bigint USING "___local_incCount"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_incSize" TYPE bigint USING "___local_incSize"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_decCount" TYPE bigint USING "___local_decCount"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_decSize" TYPE bigint USING "___local_decSize"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_incCount" TYPE bigint USING "___remote_incCount"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_incSize" TYPE bigint USING "___remote_incSize"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_decCount" TYPE bigint USING "___remote_decCount"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_decSize" TYPE bigint USING "___remote_decSize"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_reaction" ALTER COLUMN "___local_count" TYPE bigint USING "___local_count"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_reaction" ALTER COLUMN "___remote_count" TYPE bigint USING "___remote_count"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_reaction" ALTER COLUMN "___local_count" TYPE bigint USING "___local_count"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_reaction" ALTER COLUMN "___remote_count" TYPE bigint USING "___remote_count"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followings_total" TYPE bigint USING "___local_followings_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followings_inc" TYPE bigint USING "___local_followings_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followings_dec" TYPE bigint USING "___local_followings_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followers_total" TYPE bigint USING "___local_followers_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followers_inc" TYPE bigint USING "___local_followers_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followers_dec" TYPE bigint USING "___local_followers_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followings_total" TYPE bigint USING "___remote_followings_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followings_inc" TYPE bigint USING "___remote_followings_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followings_dec" TYPE bigint USING "___remote_followings_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followers_total" TYPE bigint USING "___remote_followers_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followers_inc" TYPE bigint USING "___remote_followers_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followers_dec" TYPE bigint USING "___remote_followers_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followings_total" TYPE bigint USING "___local_followings_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followings_inc" TYPE bigint USING "___local_followings_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followings_dec" TYPE bigint USING "___local_followings_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followers_total" TYPE bigint USING "___local_followers_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followers_inc" TYPE bigint USING "___local_followers_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followers_dec" TYPE bigint USING "___local_followers_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followings_total" TYPE bigint USING "___remote_followings_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followings_inc" TYPE bigint USING "___remote_followings_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followings_dec" TYPE bigint USING "___remote_followings_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followers_total" TYPE bigint USING "___remote_followers_total"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followers_inc" TYPE bigint USING "___remote_followers_inc"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followers_dec" TYPE bigint USING "___remote_followers_dec"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___totalCount" TYPE bigint USING "___totalCount"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___totalSize" TYPE bigint USING "___totalSize"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___incCount" TYPE bigint USING "___incCount"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___incSize" TYPE bigint USING "___incSize"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___decCount" TYPE bigint USING "___decCount"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___decSize" TYPE bigint USING "___decSize"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___totalCount" TYPE bigint USING "___totalCount"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___totalSize" TYPE bigint USING "___totalSize"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___incCount" TYPE bigint USING "___incCount"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___incSize" TYPE bigint USING "___incSize"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___decCount" TYPE bigint USING "___decCount"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___decSize" TYPE bigint USING "___decSize"::bigint`); + } +} diff --git a/packages/backend/migration/1644059847460-chart-v8.js b/packages/backend/migration/1644059847460-chart-v8.js new file mode 100644 index 000000000..7c5db0db3 --- /dev/null +++ b/packages/backend/migration/1644059847460-chart-v8.js @@ -0,0 +1,25 @@ +const { MigrationInterface, QueryRunner } = require("typeorm"); + +module.exports = class chartV81644059847460 { + name = 'chartV81644059847460' + + async up(queryRunner) { + await queryRunner.query(`UPDATE "__chart__active_users" SET "___local_users"=2147483647 WHERE "___local_users" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__active_users" SET "___remote_users"=2147483647 WHERE "___remote_users" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__active_users" SET "___local_users"=2147483647 WHERE "___local_users" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__active_users" SET "___remote_users"=2147483647 WHERE "___remote_users" > 2147483647`); + + await queryRunner.query(`ALTER TABLE "__chart__active_users" ALTER COLUMN "___local_users" TYPE integer USING "___local_users"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ALTER COLUMN "___remote_users" TYPE integer USING "___remote_users"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ALTER COLUMN "___local_users" TYPE integer USING "___local_users"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ALTER COLUMN "___remote_users" TYPE integer USING "___remote_users"::integer`); + } + + async down(queryRunner) { + + await queryRunner.query(`ALTER TABLE "__chart__active_users" ALTER COLUMN "___local_users" TYPE bigint USING "___local_users"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ALTER COLUMN "___remote_users" TYPE bigint USING "___remote_users"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ALTER COLUMN "___local_users" TYPE bigint USING "___local_users"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ALTER COLUMN "___remote_users" TYPE bigint USING "___remote_users"::bigint`); + } +} diff --git a/packages/backend/migration/1644060125705-chart-v9.js b/packages/backend/migration/1644060125705-chart-v9.js new file mode 100644 index 000000000..bc607067b --- /dev/null +++ b/packages/backend/migration/1644060125705-chart-v9.js @@ -0,0 +1,25 @@ +const { MigrationInterface, QueryRunner } = require("typeorm"); + +module.exports = class chartV91644060125705 { + name = 'chartV91644060125705' + + async up(queryRunner) { + await queryRunner.query(`UPDATE "__chart__hashtag" SET "___local_users"=2147483647 WHERE "___local_users" > 2147483647`); + await queryRunner.query(`UPDATE "__chart__hashtag" SET "___remote_users"=2147483647 WHERE "___remote_users" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__hashtag" SET "___local_users"=2147483647 WHERE "___local_users" > 2147483647`); + await queryRunner.query(`UPDATE "__chart_day__hashtag" SET "___remote_users"=2147483647 WHERE "___remote_users" > 2147483647`); + + await queryRunner.query(`ALTER TABLE "__chart__hashtag" ALTER COLUMN "___local_users" TYPE integer USING "___local_users"::integer`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" ALTER COLUMN "___remote_users" TYPE integer USING "___remote_users"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" ALTER COLUMN "___local_users" TYPE integer USING "___local_users"::integer`); + await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" ALTER COLUMN "___remote_users" TYPE integer USING "___remote_users"::integer`); + } + + async down(queryRunner) { + + await queryRunner.query(`ALTER TABLE "__chart__hashtag" ALTER COLUMN "___local_users" TYPE bigint USING "___local_users"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart__hashtag" ALTER COLUMN "___remote_users" TYPE bigint USING "___remote_users"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" ALTER COLUMN "___local_users" TYPE bigint USING "___local_users"::bigint`); + await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" ALTER COLUMN "___remote_users" TYPE bigint USING "___remote_users"::bigint`); + } +} diff --git a/packages/backend/migration/1644073149413-chart-v10.js b/packages/backend/migration/1644073149413-chart-v10.js new file mode 100644 index 000000000..6ca568718 --- /dev/null +++ b/packages/backend/migration/1644073149413-chart-v10.js @@ -0,0 +1,35 @@ +const { MigrationInterface, QueryRunner } = require("typeorm"); + +module.exports = class chartV101644073149413 { + name = 'chartV101644073149413' + + async up(queryRunner) { + await queryRunner.query(`CREATE TABLE "__chart__ap_request" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "___deliverFailed" integer NOT NULL DEFAULT '0', "___deliverSucceeded" integer NOT NULL DEFAULT '0', "___inboxReceived" integer NOT NULL DEFAULT '0', CONSTRAINT "UQ_e56f4beac5746d44bc3e19c80d0" UNIQUE ("date"), CONSTRAINT "PK_56a25cd447c7ee08876b3baf8d8" PRIMARY KEY ("id"))`); + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_e56f4beac5746d44bc3e19c80d" ON "__chart__ap_request" ("date") `); + await queryRunner.query(`CREATE TABLE "__chart_day__ap_request" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "___deliverFailed" integer NOT NULL DEFAULT '0', "___deliverSucceeded" integer NOT NULL DEFAULT '0', "___inboxReceived" integer NOT NULL DEFAULT '0', CONSTRAINT "UQ_a848f66d6cec11980a5dd595822" UNIQUE ("date"), CONSTRAINT "PK_9318b49daee320194e23f712e69" PRIMARY KEY ("id"))`); + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_a848f66d6cec11980a5dd59582" ON "__chart_day__ap_request" ("date") `); + await queryRunner.query(`ALTER TABLE "__chart__federation" ADD "unique_temp___deliveredInstances" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__federation" ADD "___deliveredInstances" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__federation" ADD "unique_temp___inboxInstances" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__federation" ADD "___inboxInstances" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" ADD "unique_temp___deliveredInstances" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" ADD "___deliveredInstances" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" ADD "unique_temp___inboxInstances" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" ADD "___inboxInstances" smallint NOT NULL DEFAULT '0'`); + } + + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "__chart_day__federation" DROP COLUMN "___inboxInstances"`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" DROP COLUMN "unique_temp___inboxInstances"`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" DROP COLUMN "___deliveredInstances"`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" DROP COLUMN "unique_temp___deliveredInstances"`); + await queryRunner.query(`ALTER TABLE "__chart__federation" DROP COLUMN "___inboxInstances"`); + await queryRunner.query(`ALTER TABLE "__chart__federation" DROP COLUMN "unique_temp___inboxInstances"`); + await queryRunner.query(`ALTER TABLE "__chart__federation" DROP COLUMN "___deliveredInstances"`); + await queryRunner.query(`ALTER TABLE "__chart__federation" DROP COLUMN "unique_temp___deliveredInstances"`); + await queryRunner.query(`DROP INDEX "public"."IDX_a848f66d6cec11980a5dd59582"`); + await queryRunner.query(`DROP TABLE "__chart_day__ap_request"`); + await queryRunner.query(`DROP INDEX "public"."IDX_e56f4beac5746d44bc3e19c80d"`); + await queryRunner.query(`DROP TABLE "__chart__ap_request"`); + } +} diff --git a/packages/backend/migration/1644095659741-chart-v11.js b/packages/backend/migration/1644095659741-chart-v11.js new file mode 100644 index 000000000..40b1c3072 --- /dev/null +++ b/packages/backend/migration/1644095659741-chart-v11.js @@ -0,0 +1,91 @@ +const { MigrationInterface, QueryRunner } = require("typeorm"); + +module.exports = class chartV111644095659741 { + name = 'chartV111644095659741' + + async up(queryRunner) { + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___local_users"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___remote_users"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___local_users"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___remote_users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___local_users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___remote_users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___local_users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___remote_users"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___users" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___users" integer NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___notedUsers" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___notedUsers" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___registeredWithinWeek" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___registeredWithinWeek" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___registeredWithinMonth" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___registeredWithinMonth" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___registeredWithinYear" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___registeredWithinYear" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___registeredOutsideWeek" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___registeredOutsideWeek" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___registeredOutsideMonth" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___registeredOutsideMonth" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___registeredOutsideYear" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___registeredOutsideYear" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___users" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___users" integer NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___notedUsers" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___notedUsers" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___registeredWithinWeek" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___registeredWithinWeek" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___registeredWithinMonth" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___registeredWithinMonth" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___registeredWithinYear" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___registeredWithinYear" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___registeredOutsideWeek" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___registeredOutsideWeek" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___registeredOutsideMonth" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___registeredOutsideMonth" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___registeredOutsideYear" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___registeredOutsideYear" smallint NOT NULL DEFAULT '0'`); + } + + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___registeredOutsideYear"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___registeredOutsideYear"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___registeredOutsideMonth"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___registeredOutsideMonth"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___registeredOutsideWeek"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___registeredOutsideWeek"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___registeredWithinYear"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___registeredWithinYear"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___registeredWithinMonth"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___registeredWithinMonth"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___registeredWithinWeek"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___registeredWithinWeek"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___notedUsers"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___notedUsers"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___users"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___registeredOutsideYear"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___registeredOutsideYear"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___registeredOutsideMonth"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___registeredOutsideMonth"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___registeredOutsideWeek"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___registeredOutsideWeek"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___registeredWithinYear"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___registeredWithinYear"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___registeredWithinMonth"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___registeredWithinMonth"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___registeredWithinWeek"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___registeredWithinWeek"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___notedUsers"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___notedUsers"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___users"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___remote_users" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___local_users" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___remote_users" integer NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___local_users" integer NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___remote_users" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___local_users" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___remote_users" integer NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___local_users" integer NOT NULL DEFAULT '0'`); + } +} diff --git a/packages/backend/migration/1644328606241-chart-v12.js b/packages/backend/migration/1644328606241-chart-v12.js new file mode 100644 index 000000000..226de6ece --- /dev/null +++ b/packages/backend/migration/1644328606241-chart-v12.js @@ -0,0 +1,27 @@ +const { MigrationInterface, QueryRunner } = require("typeorm"); + +module.exports = class chartV121644328606241 { + name = 'chartV121644328606241' + + async up(queryRunner) { + await queryRunner.query(`ALTER TABLE "__chart__notes" ADD "___local_diffs_withFile" integer NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__notes" ADD "___remote_diffs_withFile" integer NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ADD "___local_diffs_withFile" integer NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" ADD "___remote_diffs_withFile" integer NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__instance" ADD "___notes_diffs_withFile" integer NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" ADD "___notes_diffs_withFile" integer NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ADD "___diffs_withFile" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ADD "___diffs_withFile" smallint NOT NULL DEFAULT '0'`); + } + + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" DROP COLUMN "___diffs_withFile"`); + await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" DROP COLUMN "___diffs_withFile"`); + await queryRunner.query(`ALTER TABLE "__chart_day__instance" DROP COLUMN "___notes_diffs_withFile"`); + await queryRunner.query(`ALTER TABLE "__chart__instance" DROP COLUMN "___notes_diffs_withFile"`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" DROP COLUMN "___remote_diffs_withFile"`); + await queryRunner.query(`ALTER TABLE "__chart_day__notes" DROP COLUMN "___local_diffs_withFile"`); + await queryRunner.query(`ALTER TABLE "__chart__notes" DROP COLUMN "___remote_diffs_withFile"`); + await queryRunner.query(`ALTER TABLE "__chart__notes" DROP COLUMN "___local_diffs_withFile"`); + } +} diff --git a/packages/backend/migration/1644331238153-chart-v13.js b/packages/backend/migration/1644331238153-chart-v13.js new file mode 100644 index 000000000..ed36659b3 --- /dev/null +++ b/packages/backend/migration/1644331238153-chart-v13.js @@ -0,0 +1,19 @@ +const { MigrationInterface, QueryRunner } = require("typeorm"); + +module.exports = class chartV131644331238153 { + name = 'chartV131644331238153' + + async up(queryRunner) { + await queryRunner.query(`ALTER TABLE "__chart__federation" ADD "unique_temp___stalled" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__federation" ADD "___stalled" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" ADD "unique_temp___stalled" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" ADD "___stalled" smallint NOT NULL DEFAULT '0'`); + } + + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "__chart_day__federation" DROP COLUMN "___stalled"`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" DROP COLUMN "unique_temp___stalled"`); + await queryRunner.query(`ALTER TABLE "__chart__federation" DROP COLUMN "___stalled"`); + await queryRunner.query(`ALTER TABLE "__chart__federation" DROP COLUMN "unique_temp___stalled"`); + } +} diff --git a/packages/backend/migration/1644344266289-chart-v14.js b/packages/backend/migration/1644344266289-chart-v14.js new file mode 100644 index 000000000..8496cc2d4 --- /dev/null +++ b/packages/backend/migration/1644344266289-chart-v14.js @@ -0,0 +1,47 @@ +const { MigrationInterface, QueryRunner } = require("typeorm"); + +module.exports = class chartV141644344266289 { + name = 'chartV141644344266289' + + async up(queryRunner) { + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___users"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___users"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___notedUsers"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___notedUsers"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___users"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___notedUsers"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___notedUsers"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___readWrite" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___read" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___read" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___write" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___write" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___readWrite" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___read" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___read" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___write" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___write" smallint NOT NULL DEFAULT '0'`); + } + + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___write"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___write"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___read"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___read"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___readWrite"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___write"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___write"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___read"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___read"`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___readWrite"`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___notedUsers" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___notedUsers" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___users" integer NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___users" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___notedUsers" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___notedUsers" character varying array NOT NULL DEFAULT '{}'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___users" integer NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___users" character varying array NOT NULL DEFAULT '{}'`); + } +} diff --git a/packages/backend/package.json b/packages/backend/package.json index 3541e803f..d81688cbf 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -19,12 +19,11 @@ "@koa/cors": "3.1.0", "@koa/multer": "3.0.0", "@koa/router": "9.0.1", - "@sinonjs/fake-timers": "7.1.2", + "@sinonjs/fake-timers": "9.1.0", "@syuilo/aiscript": "0.11.1", "@types/bcryptjs": "2.4.2", "@types/bull": "3.15.7", "@types/cbor": "6.0.0", - "@types/dateformat": "3.0.1", "@types/escape-regexp": "0.0.1", "@types/glob": "7.2.0", "@types/is-url": "1.2.30", @@ -43,7 +42,7 @@ "@types/koa__multer": "2.0.4", "@types/koa__router": "8.0.11", "@types/mocha": "8.2.3", - "@types/node": "17.0.10", + "@types/node": "17.0.14", "@types/node-fetch": "3.0.3", "@types/nodemailer": "6.4.4", "@types/oauth": "0.9.1", @@ -56,43 +55,40 @@ "@types/ratelimiter": "3.4.3", "@types/redis": "4.0.11", "@types/rename": "1.0.4", - "@types/request-stats": "3.0.0", "@types/sanitize-html": "2.6.2", - "@types/seedrandom": "2.4.28", + "@types/seedrandom": "3.0.1", "@types/sharp": "0.29.5", - "@types/sinonjs__fake-timers": "6.0.4", + "@types/sinonjs__fake-timers": "8.1.1", "@types/speakeasy": "2.0.7", "@types/throttle-debounce": "2.1.0", "@types/tinycolor2": "1.4.3", "@types/tmp": "0.2.3", "@types/uuid": "8.3.4", "@types/web-push": "3.3.2", - "@types/webpack": "5.28.0", - "@types/webpack-stream": "3.2.12", - "@types/websocket": "1.0.4", + "@types/websocket": "1.0.5", "@types/ws": "8.2.2", - "@typescript-eslint/eslint-plugin": "5.10.0", - "@typescript-eslint/parser": "5.10.0", + "@typescript-eslint/eslint-plugin": "5.10.2", + "@typescript-eslint/parser": "5.10.2", "abort-controller": "3.0.0", "archiver": "5.3.0", "autobind-decorator": "2.4.0", "autwh": "0.1.0", - "aws-sdk": "2.1061.0", + "aws-sdk": "2.1067.0", "bcryptjs": "2.4.3", "blurhash": "1.1.4", "broadcast-channel": "4.9.0", - "bull": "4.2.1", + "bull": "4.5.0", "cacheable-lookup": "6.0.4", "cafy": "15.2.1", "cbor": "8.1.0", "chalk": "4.1.2", "cli-highlight": "2.1.11", "content-disposition": "0.5.4", - "crc-32": "1.2.0", - "dateformat": "4.5.1", + "crc-32": "1.2.1", + "date-fns": "2.28.0", "deep-email-validator": "0.1.21", "escape-regexp": "0.0.1", - "eslint": "8.7.0", + "eslint": "8.8.0", "eslint-plugin-import": "2.25.4", "eventemitter3": "4.0.7", "feed": "4.2.2", @@ -105,7 +101,7 @@ "ip-cidr": "3.0.4", "is-svg": "4.3.2", "js-yaml": "4.1.0", - "jsdom": "16.7.0", + "jsdom": "19.0.0", "json5": "2.2.0", "json5-loader": "4.0.1", "jsonld": "5.2.0", @@ -134,7 +130,7 @@ "pg": "8.7.1", "portscanner": "2.2.0", "private-ip": "2.3.3", - "probe-image-size": "7.2.2", + "probe-image-size": "7.2.3", "promise-limit": "2.7.0", "pug": "3.0.2", "punycode": "2.1.1", @@ -147,20 +143,19 @@ "redis-lock": "0.1.4", "reflect-metadata": "0.1.13", "rename": "1.0.4", - "request-stats": "3.0.0", "require-all": "3.0.0", "rndstr": "1.0.0", "s-age": "1.1.2", "sanitize-html": "2.6.1", "seedrandom": "3.0.5", - "sharp": "0.29.3", + "sharp": "0.30.0", "speakeasy": "2.0.0", "strict-event-emitter-types": "2.0.0", "stringz": "2.1.0", "style-loader": "3.3.1", "summaly": "2.5.0", "syslog-pro": "1.0.0", - "systeminformation": "5.9.9", + "systeminformation": "5.11.0", "throttle-debounce": "3.0.1", "tinycolor2": "1.4.2", "tmp": "0.2.1", diff --git a/packages/backend/@types/hcaptcha.d.ts b/packages/backend/src/@types/hcaptcha.d.ts similarity index 100% rename from packages/backend/@types/hcaptcha.d.ts rename to packages/backend/src/@types/hcaptcha.d.ts diff --git a/packages/backend/@types/http-signature.d.ts b/packages/backend/src/@types/http-signature.d.ts similarity index 100% rename from packages/backend/@types/http-signature.d.ts rename to packages/backend/src/@types/http-signature.d.ts diff --git a/packages/backend/@types/jsrsasign.d.ts b/packages/backend/src/@types/jsrsasign.d.ts similarity index 100% rename from packages/backend/@types/jsrsasign.d.ts rename to packages/backend/src/@types/jsrsasign.d.ts diff --git a/packages/backend/@types/koa-json-body.d.ts b/packages/backend/src/@types/koa-json-body.d.ts similarity index 100% rename from packages/backend/@types/koa-json-body.d.ts rename to packages/backend/src/@types/koa-json-body.d.ts diff --git a/packages/backend/@types/koa-slow.d.ts b/packages/backend/src/@types/koa-slow.d.ts similarity index 100% rename from packages/backend/@types/koa-slow.d.ts rename to packages/backend/src/@types/koa-slow.d.ts diff --git a/packages/backend/@types/langmap.d.ts b/packages/backend/src/@types/langmap.d.ts similarity index 100% rename from packages/backend/@types/langmap.d.ts rename to packages/backend/src/@types/langmap.d.ts diff --git a/packages/backend/@types/os-utils.d.ts b/packages/backend/src/@types/os-utils.d.ts similarity index 100% rename from packages/backend/@types/os-utils.d.ts rename to packages/backend/src/@types/os-utils.d.ts diff --git a/packages/backend/@types/package.json.d.ts b/packages/backend/src/@types/package.json.d.ts similarity index 100% rename from packages/backend/@types/package.json.d.ts rename to packages/backend/src/@types/package.json.d.ts diff --git a/packages/backend/@types/probe-image-size.d.ts b/packages/backend/src/@types/probe-image-size.d.ts similarity index 100% rename from packages/backend/@types/probe-image-size.d.ts rename to packages/backend/src/@types/probe-image-size.d.ts diff --git a/packages/backend/src/mfm/from-html.ts b/packages/backend/src/mfm/from-html.ts index fc6d3b306..21e5ebb7a 100644 --- a/packages/backend/src/mfm/from-html.ts +++ b/packages/backend/src/mfm/from-html.ts @@ -5,9 +5,7 @@ import { URL } from 'url'; const urlRegex = /^https?:\/\/[\w\/:%#@$&?!()\[\]~.,=+\-]+/; const urlRegexFull = /^https?:\/\/[\w\/:%#@$&?!()\[\]~.,=+\-]+$/; -export function fromHtml(html: string, hashtagNames?: string[]): string | null { - if (html == null) return null; - +export function fromHtml(html: string, hashtagNames?: string[]): string { const dom = parse5.parseFragment(html); let text = ''; diff --git a/packages/backend/src/misc/before-shutdown.ts b/packages/backend/src/misc/before-shutdown.ts index 33abf5fb4..93ac7a1f3 100644 --- a/packages/backend/src/misc/before-shutdown.ts +++ b/packages/backend/src/misc/before-shutdown.ts @@ -24,14 +24,14 @@ const SHUTDOWN_TIMEOUT = 15000; * down the process. * @type {BeforeShutdownListener[]} */ -const shutdownListeners = []; +const shutdownListeners: ((signalOrEvent: string) => void)[] = []; /** * Listen for signals and execute given `fn` function once. * @param {string[]} signals System signals to listen to. * @param {function(string)} fn Function to execute on shutdown. */ -const processOnce = (signals, fn) => { +const processOnce = (signals: string[], fn: (signalOrEvent: string) => void) => { for (const sig of signals) { process.once(sig, fn); } @@ -41,7 +41,7 @@ const processOnce = (signals, fn) => { * Sets a forced shutdown mechanism that will exit the process after `timeout` milliseconds. * @param {number} timeout Time to wait before forcing shutdown (milliseconds) */ -const forceExitAfter = timeout => () => { +const forceExitAfter = (timeout: number) => () => { setTimeout(() => { // Force shutdown after timeout console.warn(`Could not close resources gracefully after ${timeout}ms: forcing shutdown`); @@ -55,7 +55,7 @@ const forceExitAfter = timeout => () => { * be logged out as a warning, but won't prevent other callbacks from executing. * @param {string} signalOrEvent The exit signal or event name received on the process. */ -async function shutdownHandler(signalOrEvent) { +async function shutdownHandler(signalOrEvent: string) { if (process.env.NODE_ENV === 'test') return process.exit(0); console.warn(`Shutting down: received [${signalOrEvent}] signal`); @@ -64,7 +64,9 @@ async function shutdownHandler(signalOrEvent) { try { await listener(signalOrEvent); } catch (err) { - console.warn(`A shutdown handler failed before completing with: ${err.message || err}`); + if (err instanceof Error) { + console.warn(`A shutdown handler failed before completing with: ${err.message || err}`); + } } } @@ -78,7 +80,7 @@ async function shutdownHandler(signalOrEvent) { * @param {BeforeShutdownListener} listener The shutdown listener to register. * @returns {BeforeShutdownListener} Echoes back the supplied `listener`. */ -export function beforeShutdown(listener) { +export function beforeShutdown(listener: () => void) { shutdownListeners.push(listener); return listener; } diff --git a/packages/backend/src/misc/download-url.ts b/packages/backend/src/misc/download-url.ts index 8e1f7b9e2..ba2fa9fae 100644 --- a/packages/backend/src/misc/download-url.ts +++ b/packages/backend/src/misc/download-url.ts @@ -38,7 +38,9 @@ export async function downloadUrl(url: string, path: string): Promise { https: httpsAgent, }, http2: false, // default - retry: 0, + retry: { + limit: 0, + }, }).on('response', (res: Got.Response) => { if ((process.env.NODE_ENV === 'production' || process.env.NODE_ENV === 'test') && !config.proxy && res.ip) { if (isPrivateIp(res.ip)) { @@ -75,7 +77,7 @@ export async function downloadUrl(url: string, path: string): Promise { logger.succ(`Download finished: ${chalk.cyan(url)}`); } -function isPrivateIp(ip: string) { +function isPrivateIp(ip: string): boolean { for (const net of config.allowedPrivateNetworks || []) { const cidr = new IPCIDR(net); if (cidr.contains(ip)) { diff --git a/packages/backend/src/misc/gen-identicon.ts b/packages/backend/src/misc/gen-identicon.ts index 5cedd7afa..fca67fcf2 100644 --- a/packages/backend/src/misc/gen-identicon.ts +++ b/packages/backend/src/misc/gen-identicon.ts @@ -39,7 +39,7 @@ const sideN = Math.floor(n / 2); */ export function genIdenticon(seed: string, stream: WriteStream): Promise { const rand = gen.create(seed); - const canvas = p.make(size, size); + const canvas = p.make(size, size, undefined); const ctx = canvas.getContext('2d'); ctx.fillStyle = bg; diff --git a/packages/backend/src/misc/is-duplicate-key-value-error.ts b/packages/backend/src/misc/is-duplicate-key-value-error.ts index 23d8ceb1b..04ff191e4 100644 --- a/packages/backend/src/misc/is-duplicate-key-value-error.ts +++ b/packages/backend/src/misc/is-duplicate-key-value-error.ts @@ -1,3 +1,3 @@ -export function isDuplicateKeyValueError(e: Error): boolean { - return e.message.startsWith('duplicate key value'); +export function isDuplicateKeyValueError(e: unknown | Error): boolean { + return (e as any).message && (e as Error).message.startsWith('duplicate key value'); } diff --git a/packages/backend/src/models/entities/user.ts b/packages/backend/src/models/entities/user.ts index 0aa01ba00..e4d9a3ced 100644 --- a/packages/backend/src/models/entities/user.ts +++ b/packages/backend/src/models/entities/user.ts @@ -225,6 +225,12 @@ export class User { }) public followersUri: string | null; + @Column('boolean', { + default: false, + comment: 'Whether to show users replying to other users in the timeline' + }) + public showTimelineReplies: boolean; + @Index({ unique: true }) @Column('char', { length: 16, nullable: true, unique: true, diff --git a/packages/backend/src/models/repositories/abuse-user-report.ts b/packages/backend/src/models/repositories/abuse-user-report.ts index 943b65eb6..144195855 100644 --- a/packages/backend/src/models/repositories/abuse-user-report.ts +++ b/packages/backend/src/models/repositories/abuse-user-report.ts @@ -12,7 +12,7 @@ export class AbuseUserReportRepository extends Repository { return await awaitAll({ id: report.id, - createdAt: report.createdAt, + createdAt: report.createdAt.toISOString(), comment: report.comment, resolved: report.resolved, reporterId: report.reporterId, diff --git a/packages/backend/src/models/repositories/moderation-logs.ts b/packages/backend/src/models/repositories/moderation-logs.ts index 1585d5bfc..f530613bc 100644 --- a/packages/backend/src/models/repositories/moderation-logs.ts +++ b/packages/backend/src/models/repositories/moderation-logs.ts @@ -12,7 +12,7 @@ export class ModerationLogRepository extends Repository { return await awaitAll({ id: log.id, - createdAt: log.createdAt, + createdAt: log.createdAt.toISOString(), type: log.type, info: log.info, userId: log.userId, diff --git a/packages/backend/src/models/repositories/note-favorite.ts b/packages/backend/src/models/repositories/note-favorite.ts index c5de55c0c..f4cd64e39 100644 --- a/packages/backend/src/models/repositories/note-favorite.ts +++ b/packages/backend/src/models/repositories/note-favorite.ts @@ -13,7 +13,7 @@ export class NoteFavoriteRepository extends Repository { return { id: favorite.id, - createdAt: favorite.createdAt, + createdAt: favorite.createdAt.toISOString(), noteId: favorite.noteId, note: await Notes.pack(favorite.note || favorite.noteId, me), }; diff --git a/packages/backend/src/models/repositories/user.ts b/packages/backend/src/models/repositories/user.ts index 2b8398832..33b2b32fe 100644 --- a/packages/backend/src/models/repositories/user.ts +++ b/packages/backend/src/models/repositories/user.ts @@ -220,6 +220,7 @@ export class UserRepository extends Repository { isModerator: user.isModerator || falsy, isBot: user.isBot || falsy, isCat: user.isCat || falsy, + showTimelineReplies: user.showTimelineReplies || falsy, instance: user.host ? Instances.findOne({ host: user.host }).then(instance => instance ? { name: instance.name, softwareName: instance.softwareName, diff --git a/packages/backend/src/queue/index.ts b/packages/backend/src/queue/index.ts index f9994c3b5..16acabfbf 100644 --- a/packages/backend/src/queue/index.ts +++ b/packages/backend/src/queue/index.ts @@ -6,7 +6,8 @@ import { envOption } from '../env'; import processDeliver from './processors/deliver'; import processInbox from './processors/inbox'; import processDb from './processors/db/index'; -import procesObjectStorage from './processors/object-storage/index'; +import processObjectStorage from './processors/object-storage/index'; +import processSystemQueue from './processors/system/index'; import { queueLogger } from './logger'; import { DriveFile } from '@/models/entities/drive-file'; import { getJobInfo } from './get-job-info'; @@ -255,12 +256,19 @@ export default function() { deliverQueue.process(config.deliverJobConcurrency || 128, processDeliver); inboxQueue.process(config.inboxJobConcurrency || 16, processInbox); processDb(dbQueue); - procesObjectStorage(objectStorageQueue); + processObjectStorage(objectStorageQueue); systemQueue.add('resyncCharts', { }, { repeat: { cron: '0 0 * * *' }, }); + + systemQueue.add('cleanCharts', { + }, { + repeat: { cron: '0 0 * * *' }, + }); + + processSystemQueue(systemQueue); } export function destroy() { diff --git a/packages/backend/src/queue/processors/db/export-blocking.ts b/packages/backend/src/queue/processors/db/export-blocking.ts index 01edaaeb6..f4de9ce00 100644 --- a/packages/backend/src/queue/processors/db/export-blocking.ts +++ b/packages/backend/src/queue/processors/db/export-blocking.ts @@ -4,7 +4,7 @@ import * as fs from 'fs'; import { queueLogger } from '../../logger'; import { addFile } from '@/services/drive/add-file'; -import * as dateFormat from 'dateformat'; +import { format as dateFormat } from 'date-fns'; import { getFullApAccount } from '@/misc/convert-host'; import { Users, Blockings } from '@/models/index'; import { MoreThan } from 'typeorm'; @@ -85,7 +85,7 @@ export async function exportBlocking(job: Bull.Job, done: any): P stream.end(); logger.succ(`Exported to: ${path}`); - const fileName = 'blocking-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.csv'; + const fileName = 'blocking-' + dateFormat(new Date(), 'yyyy-MM-dd-HH-mm-ss') + '.csv'; const driveFile = await addFile({ user, path, name: fileName, force: true }); logger.succ(`Exported to: ${driveFile.id}`); diff --git a/packages/backend/src/queue/processors/db/export-custom-emojis.ts b/packages/backend/src/queue/processors/db/export-custom-emojis.ts index 240a542fe..2f7505f15 100644 --- a/packages/backend/src/queue/processors/db/export-custom-emojis.ts +++ b/packages/backend/src/queue/processors/db/export-custom-emojis.ts @@ -7,7 +7,7 @@ const mime = require('mime-types'); const archiver = require('archiver'); import { queueLogger } from '../../logger'; import { addFile } from '@/services/drive/add-file'; -import * as dateFormat from 'dateformat'; +import { format as dateFormat } from 'date-fns'; import { Users, Emojis } from '@/models/index'; import { } from '@/queue/types'; import { downloadUrl } from '@/misc/download-url'; @@ -110,7 +110,7 @@ export async function exportCustomEmojis(job: Bull.Job, done: () => void): Promi archiveStream.on('close', async () => { logger.succ(`Exported to: ${archivePath}`); - const fileName = 'custom-emojis-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.zip'; + const fileName = 'custom-emojis-' + dateFormat(new Date(), 'yyyy-MM-dd-HH-mm-ss') + '.zip'; const driveFile = await addFile({ user, path: archivePath, name: fileName, force: true }); logger.succ(`Exported to: ${driveFile.id}`); diff --git a/packages/backend/src/queue/processors/db/export-following.ts b/packages/backend/src/queue/processors/db/export-following.ts index 06572acec..2ac558381 100644 --- a/packages/backend/src/queue/processors/db/export-following.ts +++ b/packages/backend/src/queue/processors/db/export-following.ts @@ -4,7 +4,7 @@ import * as fs from 'fs'; import { queueLogger } from '../../logger'; import { addFile } from '@/services/drive/add-file'; -import * as dateFormat from 'dateformat'; +import { format as dateFormat } from 'date-fns'; import { getFullApAccount } from '@/misc/convert-host'; import { Users, Followings, Mutings } from '@/models/index'; import { In, MoreThan, Not } from 'typeorm'; @@ -86,7 +86,7 @@ export async function exportFollowing(job: Bull.Job, done: () => stream.end(); logger.succ(`Exported to: ${path}`); - const fileName = 'following-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.csv'; + const fileName = 'following-' + dateFormat(new Date(), 'yyyy-MM-dd-HH-mm-ss') + '.csv'; const driveFile = await addFile({ user, path, name: fileName, force: true }); logger.succ(`Exported to: ${driveFile.id}`); diff --git a/packages/backend/src/queue/processors/db/export-mute.ts b/packages/backend/src/queue/processors/db/export-mute.ts index 4a856f8ef..9e917ccbf 100644 --- a/packages/backend/src/queue/processors/db/export-mute.ts +++ b/packages/backend/src/queue/processors/db/export-mute.ts @@ -4,7 +4,7 @@ import * as fs from 'fs'; import { queueLogger } from '../../logger'; import { addFile } from '@/services/drive/add-file'; -import * as dateFormat from 'dateformat'; +import { format as dateFormat } from 'date-fns'; import { getFullApAccount } from '@/misc/convert-host'; import { Users, Mutings } from '@/models/index'; import { MoreThan } from 'typeorm'; @@ -85,7 +85,7 @@ export async function exportMute(job: Bull.Job, done: any): Promi stream.end(); logger.succ(`Exported to: ${path}`); - const fileName = 'mute-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.csv'; + const fileName = 'mute-' + dateFormat(new Date(), 'yyyy-MM-dd-HH-mm-ss') + '.csv'; const driveFile = await addFile({ user, path, name: fileName, force: true }); logger.succ(`Exported to: ${driveFile.id}`); diff --git a/packages/backend/src/queue/processors/db/export-notes.ts b/packages/backend/src/queue/processors/db/export-notes.ts index 305abf44c..0e65cb884 100644 --- a/packages/backend/src/queue/processors/db/export-notes.ts +++ b/packages/backend/src/queue/processors/db/export-notes.ts @@ -4,7 +4,7 @@ import * as fs from 'fs'; import { queueLogger } from '../../logger'; import { addFile } from '@/services/drive/add-file'; -import * as dateFormat from 'dateformat'; +import { format as dateFormat } from 'date-fns'; import { Users, Notes, Polls } from '@/models/index'; import { MoreThan } from 'typeorm'; import { Note } from '@/models/entities/note'; @@ -94,7 +94,7 @@ export async function exportNotes(job: Bull.Job, done: any): Prom stream.end(); logger.succ(`Exported to: ${path}`); - const fileName = 'notes-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.json'; + const fileName = 'notes-' + dateFormat(new Date(), 'yyyy-MM-dd-HH-mm-ss') + '.json'; const driveFile = await addFile({ user, path, name: fileName, force: true }); logger.succ(`Exported to: ${driveFile.id}`); diff --git a/packages/backend/src/queue/processors/db/export-user-lists.ts b/packages/backend/src/queue/processors/db/export-user-lists.ts index f907cf952..fcd2ba336 100644 --- a/packages/backend/src/queue/processors/db/export-user-lists.ts +++ b/packages/backend/src/queue/processors/db/export-user-lists.ts @@ -4,7 +4,7 @@ import * as fs from 'fs'; import { queueLogger } from '../../logger'; import { addFile } from '@/services/drive/add-file'; -import * as dateFormat from 'dateformat'; +import { format as dateFormat } from 'date-fns'; import { getFullApAccount } from '@/misc/convert-host'; import { Users, UserLists, UserListJoinings } from '@/models/index'; import { In } from 'typeorm'; @@ -62,7 +62,7 @@ export async function exportUserLists(job: Bull.Job, done: any): stream.end(); logger.succ(`Exported to: ${path}`); - const fileName = 'user-lists-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.csv'; + const fileName = 'user-lists-' + dateFormat(new Date(), 'yyyy-MM-dd-HH-mm-ss') + '.csv'; const driveFile = await addFile({ user, path, name: fileName, force: true }); logger.succ(`Exported to: ${driveFile.id}`); diff --git a/packages/backend/src/queue/processors/db/import-custom-emojis.ts b/packages/backend/src/queue/processors/db/import-custom-emojis.ts index 04e93671e..b6c012653 100644 --- a/packages/backend/src/queue/processors/db/import-custom-emojis.ts +++ b/packages/backend/src/queue/processors/db/import-custom-emojis.ts @@ -41,7 +41,9 @@ export async function importCustomEmojis(job: Bull.Job, don fs.writeFileSync(destPath, '', 'binary'); await downloadUrl(file.url, destPath); } catch (e) { // TODO: äŊ•åēĻか再čŠĻ行 - logger.error(e); + if (e instanceof Error || typeof e === 'string') { + logger.error(e); + } throw e; } diff --git a/packages/backend/src/queue/processors/db/import-user-lists.ts b/packages/backend/src/queue/processors/db/import-user-lists.ts index e060e86dd..9b3c0ed60 100644 --- a/packages/backend/src/queue/processors/db/import-user-lists.ts +++ b/packages/backend/src/queue/processors/db/import-user-lists.ts @@ -51,7 +51,6 @@ export async function importUserLists(job: Bull.Job, done: createdAt: new Date(), userId: user.id, name: listName, - userIds: [], }).then(x => UserLists.findOneOrFail(x.identifiers[0])); } @@ -67,9 +66,9 @@ export async function importUserLists(job: Bull.Job, done: target = await resolveUser(username, host); } - if (await UserListJoinings.findOne({ userListId: list.id, userId: target.id }) != null) continue; + if (await UserListJoinings.findOne({ userListId: list!.id, userId: target.id }) != null) continue; - pushUserToUserList(target, list); + pushUserToUserList(target, list!); } catch (e) { logger.warn(`Error in line:${linenum} ${e}`); } diff --git a/packages/backend/src/queue/processors/deliver.ts b/packages/backend/src/queue/processors/deliver.ts index 46aeb8cb7..bd91dfc3b 100644 --- a/packages/backend/src/queue/processors/deliver.ts +++ b/packages/backend/src/queue/processors/deliver.ts @@ -4,7 +4,7 @@ import request from '@/remote/activitypub/request'; import { registerOrFetchInstanceDoc } from '@/services/register-or-fetch-instance-doc'; import Logger from '@/services/logger'; import { Instances } from '@/models/index'; -import { instanceChart } from '@/services/chart/index'; +import { apRequestChart, federationChart, instanceChart } from '@/services/chart/index'; import { fetchInstanceMetadata } from '@/services/fetch-instance-metadata'; import { fetchMeta } from '@/misc/fetch-meta'; import { toPuny } from '@/misc/convert-host'; @@ -61,6 +61,8 @@ export default async (job: Bull.Job) => { fetchInstanceMetadata(i); instanceChart.requestSent(i.host, true); + apRequestChart.deliverSucc(); + federationChart.deliverd(i.host, true); }); return 'Success'; @@ -74,6 +76,8 @@ export default async (job: Bull.Job) => { }); instanceChart.requestSent(i.host, false); + apRequestChart.deliverFail(); + federationChart.deliverd(i.host, false); }); if (res instanceof StatusError) { diff --git a/packages/backend/src/queue/processors/inbox.ts b/packages/backend/src/queue/processors/inbox.ts index bfdebc007..c189256c3 100644 --- a/packages/backend/src/queue/processors/inbox.ts +++ b/packages/backend/src/queue/processors/inbox.ts @@ -5,7 +5,7 @@ import perform from '@/remote/activitypub/perform'; import Logger from '@/services/logger'; import { registerOrFetchInstanceDoc } from '@/services/register-or-fetch-instance-doc'; import { Instances } from '@/models/index'; -import { instanceChart } from '@/services/chart/index'; +import { apRequestChart, federationChart, instanceChart } from '@/services/chart/index'; import { fetchMeta } from '@/misc/fetch-meta'; import { toPuny, extractDbHost } from '@/misc/convert-host'; import { getApId } from '@/remote/activitypub/type'; @@ -54,10 +54,12 @@ export default async (job: Bull.Job): Promise => { authUser = await dbResolver.getAuthUserFromApId(getApId(activity.actor)); } catch (e) { // å¯žčąĄãŒ4xxãĒら゚キップ - if (e instanceof StatusError && e.isClientError) { - return `skip: Ignored deleted actors on both ends ${activity.actor} - ${e.statusCode}`; + if (e instanceof StatusError) { + if (e.isClientError) { + return `skip: Ignored deleted actors on both ends ${activity.actor} - ${e.statusCode}`; + } + throw `Error in actor ${activity.actor} - ${e.statusCode || e}`; } - throw `Error in actor ${activity.actor} - ${e.statusCode || e}`; } } @@ -141,6 +143,8 @@ export default async (job: Bull.Job): Promise => { fetchInstanceMetadata(i); instanceChart.requestReceived(i.host); + apRequestChart.inbox(); + federationChart.inbox(i.host); }); // ã‚ĸクテã‚Ŗビテã‚Ŗをå‡Ļį† diff --git a/packages/backend/src/queue/processors/system/clean-charts.ts b/packages/backend/src/queue/processors/system/clean-charts.ts new file mode 100644 index 000000000..3ae0f495f --- /dev/null +++ b/packages/backend/src/queue/processors/system/clean-charts.ts @@ -0,0 +1,28 @@ +import * as Bull from 'bull'; + +import { queueLogger } from '../../logger'; +import { activeUsersChart, driveChart, federationChart, hashtagChart, instanceChart, notesChart, perUserDriveChart, perUserFollowingChart, perUserNotesChart, perUserReactionsChart, usersChart, apRequestChart } from '@/services/chart/index'; + +const logger = queueLogger.createSubLogger('clean-charts'); + +export async function cleanCharts(job: Bull.Job>, done: any): Promise { + logger.info(`Clean charts...`); + + await Promise.all([ + federationChart.clean(), + notesChart.clean(), + usersChart.clean(), + activeUsersChart.clean(), + instanceChart.clean(), + perUserNotesChart.clean(), + driveChart.clean(), + perUserReactionsChart.clean(), + hashtagChart.clean(), + perUserFollowingChart.clean(), + perUserDriveChart.clean(), + apRequestChart.clean(), + ]); + + logger.succ(`All charts successfully cleaned.`); + done(); +} diff --git a/packages/backend/src/queue/processors/system/index.ts b/packages/backend/src/queue/processors/system/index.ts index 8460ea0a9..636fefc40 100644 --- a/packages/backend/src/queue/processors/system/index.ts +++ b/packages/backend/src/queue/processors/system/index.ts @@ -1,8 +1,10 @@ import * as Bull from 'bull'; import { resyncCharts } from './resync-charts'; +import { cleanCharts } from './clean-charts'; const jobs = { resyncCharts, + cleanCharts, } as Record> | Bull.ProcessPromiseFunction>>; export default function(dbQueue: Bull.Queue>) { diff --git a/packages/backend/src/remote/activitypub/kernel/announce/note.ts b/packages/backend/src/remote/activitypub/kernel/announce/note.ts index e9158f775..eae92d418 100644 --- a/packages/backend/src/remote/activitypub/kernel/announce/note.ts +++ b/packages/backend/src/remote/activitypub/kernel/announce/note.ts @@ -42,11 +42,14 @@ export default async function(resolver: Resolver, actor: IRemoteUser, activity: renote = await resolveNote(targetUri); } catch (e) { // å¯žčąĄãŒ4xxãĒら゚キップ - if (e instanceof StatusError && e.isClientError) { - logger.warn(`Ignored announce target ${targetUri} - ${e.statusCode}`); - return; + if (e instanceof StatusError) { + if (e.isClientError) { + logger.warn(`Ignored announce target ${targetUri} - ${e.statusCode}`); + return; + } + + logger.warn(`Error in announce target ${targetUri} - ${e.statusCode || e}`); } - logger.warn(`Error in announce target ${targetUri} - ${e.statusCode || e}`); throw e; } diff --git a/packages/backend/src/remote/activitypub/kernel/flag/index.ts b/packages/backend/src/remote/activitypub/kernel/flag/index.ts index aec6d2daa..d910e2ebe 100644 --- a/packages/backend/src/remote/activitypub/kernel/flag/index.ts +++ b/packages/backend/src/remote/activitypub/kernel/flag/index.ts @@ -10,7 +10,7 @@ export default async (actor: IRemoteUser, activity: IFlag): Promise => { // å¯žčąĄãƒĻãƒŧã‚ļãƒŧは一į•Ē最初ぎãƒĻãƒŧã‚ļãƒŧ としãĻ あとはã‚ŗãƒĄãƒŗトとしãĻæ ŧį´ã™ã‚‹ const uris = getApIds(activity.object); - const userIds = uris.filter(uri => uri.startsWith(config.url + '/users/')).map(uri => uri.split('/').pop()); + const userIds = uris.filter(uri => uri.startsWith(config.url + '/users/')).map(uri => uri.split('/').pop()!); const users = await Users.find({ id: In(userIds), }); diff --git a/packages/backend/src/remote/activitypub/kernel/index.ts b/packages/backend/src/remote/activitypub/kernel/index.ts index 20df28eec..a103e5a1b 100644 --- a/packages/backend/src/remote/activitypub/kernel/index.ts +++ b/packages/backend/src/remote/activitypub/kernel/index.ts @@ -25,8 +25,10 @@ export async function performActivity(actor: IRemoteUser, activity: IObject) { const act = await resolver.resolve(item); try { await performOneActivity(actor, act); - } catch (e) { - apLogger.error(e); + } catch (err) { + if (err instanceof Error || typeof err === 'string') { + apLogger.error(err); + } } } } else { diff --git a/packages/backend/src/remote/activitypub/misc/ld-signature.ts b/packages/backend/src/remote/activitypub/misc/ld-signature.ts index 946914bfa..3b799c755 100644 --- a/packages/backend/src/remote/activitypub/misc/ld-signature.ts +++ b/packages/backend/src/remote/activitypub/misc/ld-signature.ts @@ -24,7 +24,7 @@ export class LdSignature { } as { type: string; creator: string; - domain: string; + domain?: string; nonce: string; created: string; }; @@ -114,7 +114,7 @@ export class LdSignature { Accept: 'application/ld+json, application/json', }, timeout: this.loderTimeout, - agent: u => u.protocol == 'http:' ? httpAgent : httpsAgent, + agent: u => u.protocol === 'http:' ? httpAgent : httpsAgent, }).then(res => { if (!res.ok) { throw `${res.status} ${res.statusText}`; diff --git a/packages/backend/src/remote/activitypub/models/person.ts b/packages/backend/src/remote/activitypub/models/person.ts index 19a7a7090..aaccf51fa 100644 --- a/packages/backend/src/remote/activitypub/models/person.ts +++ b/packages/backend/src/remote/activitypub/models/person.ts @@ -164,6 +164,7 @@ export async function createPerson(uri: string, resolver?: Resolver): Promise { +export default async function renderNote(note: Note, dive = true, isTalk = false): Promise> { const getPromisedFiles = async (ids: string[]) => { if (!ids || ids.length === 0) return []; const items = await DriveFiles.find({ id: In(ids) }); diff --git a/packages/backend/src/remote/activitypub/renderer/ordered-collection.ts b/packages/backend/src/remote/activitypub/renderer/ordered-collection.ts index c4b4337af..ff9a77be3 100644 --- a/packages/backend/src/remote/activitypub/renderer/ordered-collection.ts +++ b/packages/backend/src/remote/activitypub/renderer/ordered-collection.ts @@ -6,7 +6,14 @@ * @param last URL of last page (optional) * @param orderedItems attached objects (optional) */ -export default function(id: string | null, totalItems: any, first?: string, last?: string, orderedItems?: Record) { +export default function(id: string | null, totalItems: any, first?: string, last?: string, orderedItems?: Record[]): { + id: string | null; + type: 'OrderedCollection'; + totalItems: any; + first?: string; + last?: string; + orderedItems?: Record[]; +} { const page: any = { id, type: 'OrderedCollection', diff --git a/packages/backend/src/server/activitypub/featured.ts b/packages/backend/src/server/activitypub/featured.ts index 40b8d8cc8..ed5bfc426 100644 --- a/packages/backend/src/server/activitypub/featured.ts +++ b/packages/backend/src/server/activitypub/featured.ts @@ -32,7 +32,7 @@ export default async (ctx: Router.RouterContext) => { const rendered = renderOrderedCollection( `${config.url}/users/${userId}/collections/featured`, - renderedNotes.length, undefined, undefined, renderedNotes + renderedNotes.length, undefined, undefined, renderedNotes, ); ctx.body = renderActivity(rendered); diff --git a/packages/backend/src/server/api/call.ts b/packages/backend/src/server/api/call.ts index 5bc7d2f25..18143340a 100644 --- a/packages/backend/src/server/api/call.ts +++ b/packages/backend/src/server/api/call.ts @@ -79,18 +79,28 @@ export default async (endpoint: string, user: User | null | undefined, token: Ac // Cast non JSON input if (ep.meta.requireFile && ep.meta.params) { - const body = (ctx!.request as any).body; for (const k of Object.keys(ep.meta.params)) { const param = ep.meta.params[k]; - if (['Boolean', 'Number'].includes(param.validator.name) && typeof body[k] === 'string') { - body[k] = JSON.parse(body[k]); + if (['Boolean', 'Number'].includes(param.validator.name) && typeof data[k] === 'string') { + try { + data[k] = JSON.parse(data[k]); + } catch (e) { + throw new ApiError({ + message: 'Invalid param.', + code: 'INVALID_PARAM', + id: '0b5f1631-7c1a-41a6-b399-cce335f34d85', + }, { + param: k, + reason: `cannot cast to ${param.validator.name}`, + }) + } } } } // API invoking const before = performance.now(); - return await ep.exec(data, user, token, ctx!.file).catch((e: Error) => { + return await ep.exec(data, user, token, ctx?.file).catch((e: Error) => { if (e instanceof ApiError) { throw e; } else { diff --git a/packages/backend/src/server/api/common/generate-replies-query.ts b/packages/backend/src/server/api/common/generate-replies-query.ts index fbc41b2c2..249064d58 100644 --- a/packages/backend/src/server/api/common/generate-replies-query.ts +++ b/packages/backend/src/server/api/common/generate-replies-query.ts @@ -1,7 +1,7 @@ import { User } from '@/models/entities/user'; import { Brackets, SelectQueryBuilder } from 'typeorm'; -export function generateRepliesQuery(q: SelectQueryBuilder, me?: { id: User['id'] } | null) { +export function generateRepliesQuery(q: SelectQueryBuilder, me?: Pick | null) { if (me == null) { q.andWhere(new Brackets(qb => { qb .where(`note.replyId IS NULL`) // čŋ”äŋĄã§ã¯ãĒい @@ -10,7 +10,7 @@ export function generateRepliesQuery(q: SelectQueryBuilder, me?: { id: User .andWhere('note.replyUserId = note.userId'); })); })); - } else { + } else if(!me.showTimelineReplies) { q.andWhere(new Brackets(qb => { qb .where(`note.replyId IS NULL`) // čŋ”äŋĄã§ã¯ãĒい .orWhere('note.replyUserId = :meId', { meId: me.id }) // čŋ”äŋĄã ã‘おč‡Ē分ぎノãƒŧトへぎčŋ”äŋĄ diff --git a/packages/backend/src/server/api/define.ts b/packages/backend/src/server/api/define.ts index 71e5fadde..e0720e2ad 100644 --- a/packages/backend/src/server/api/define.ts +++ b/packages/backend/src/server/api/define.ts @@ -9,6 +9,7 @@ type NonOptional = T extends undefined ? never : T; type SimpleUserInfo = { id: ILocalUser['id']; + createdAt: ILocalUser['createdAt']; host: ILocalUser['host']; username: ILocalUser['username']; uri: ILocalUser['uri']; diff --git a/packages/backend/src/server/api/endpoints/admin/resolve-abuse-user-report.ts b/packages/backend/src/server/api/endpoints/admin/resolve-abuse-user-report.ts index b00457f09..a47b69ec1 100644 --- a/packages/backend/src/server/api/endpoints/admin/resolve-abuse-user-report.ts +++ b/packages/backend/src/server/api/endpoints/admin/resolve-abuse-user-report.ts @@ -36,9 +36,9 @@ export default define(meta, async (ps, me) => { if (ps.forward && report.targetUserHost != null) { const actor = await getInstanceActor(); - const targetUser = await Users.findOne(report.targetUserId); + const targetUser = await Users.findOneOrFail(report.targetUserId); - deliver(actor, renderActivity(renderFlag(actor, [targetUser.uri], report.comment)), targetUser.inbox); + deliver(actor, renderActivity(renderFlag(actor, [targetUser.uri!], report.comment)), targetUser.inbox); } await AbuseUserReports.update(report.id, { diff --git a/packages/backend/src/server/api/endpoints/admin/show-user.ts b/packages/backend/src/server/api/endpoints/admin/show-user.ts index c2a6a294b..0d0cc9087 100644 --- a/packages/backend/src/server/api/endpoints/admin/show-user.ts +++ b/packages/backend/src/server/api/endpoints/admin/show-user.ts @@ -18,144 +18,6 @@ export const meta = { res: { type: 'object', nullable: false, optional: false, - properties: { - id: { - type: 'string', - nullable: false, optional: false, - format: 'id', - }, - createdAt: { - type: 'string', - nullable: false, optional: false, - format: 'date-time', - }, - updatedAt: { - type: 'string', - nullable: true, optional: false, - format: 'date-time', - }, - lastFetchedAt: { - type: 'string', - nullable: true, optional: false, - }, - username: { - type: 'string', - nullable: false, optional: false, - }, - name: { - type: 'string', - nullable: true, optional: false, - }, - folowersCount: { - type: 'number', - nullable: false, optional: true, - }, - followingCount: { - type: 'number', - nullable: false, optional: false, - }, - notesCount: { - type: 'number', - nullable: false, optional: false, - }, - avatarId: { - type: 'string', - nullable: true, optional: false, - }, - bannerId: { - type: 'string', - nullable: true, optional: false, - }, - tags: { - type: 'array', - nullable: false, optional: false, - items: { - type: 'string', - nullable: false, optional: false, - }, - }, - avatarUrl: { - type: 'string', - nullable: true, optional: false, - format: 'url', - }, - bannerUrl: { - type: 'string', - nullable: true, optional: false, - format: 'url', - }, - avatarBlurhash: { - type: 'any', - nullable: true, optional: false, - default: null, - }, - bannerBlurhash: { - type: 'any', - nullable: true, optional: false, - default: null, - }, - isSuspended: { - type: 'boolean', - nullable: false, optional: false, - }, - isSilenced: { - type: 'boolean', - nullable: false, optional: false, - }, - isLocked: { - type: 'boolean', - nullable: false, optional: false, - }, - isBot: { - type: 'boolean', - nullable: false, optional: false, - }, - isCat: { - type: 'boolean', - nullable: false, optional: false, - }, - isAdmin: { - type: 'boolean', - nullable: false, optional: false, - }, - isModerator: { - type: 'boolean', - nullable: false, optional: false, - }, - emojis: { - type: 'array', - nullable: false, optional: false, - items: { - type: 'string', - nullable: false, optional: false, - }, - }, - host: { - type: 'string', - nullable: true, optional: false, - }, - inbox: { - type: 'string', - nullable: true, optional: false, - }, - sharedInbox: { - type: 'string', - nullable: true, optional: false, - }, - featured: { - type: 'string', - nullable: true, optional: false, - }, - uri: { - type: 'string', - nullable: true, optional: false, - }, - token: { - type: 'string', - nullable: true, optional: false, - default: '', - }, - }, }, } as const; diff --git a/packages/backend/src/server/api/endpoints/announcements.ts b/packages/backend/src/server/api/endpoints/announcements.ts index 0bd29607d..22c13743a 100644 --- a/packages/backend/src/server/api/endpoints/announcements.ts +++ b/packages/backend/src/server/api/endpoints/announcements.ts @@ -89,5 +89,9 @@ export default define(meta, async (ps, user) => { } } - return ps.withUnreads ? announcements.filter((a: any) => !a.isRead) : announcements; + return (ps.withUnreads ? announcements.filter((a: any) => !a.isRead) : announcements).map((a) => ({ + ...a, + createdAt: a.createdAt.toISOString(), + updatedAt: a.updatedAt?.toISOString() ?? null, + })); }); diff --git a/packages/backend/src/server/api/endpoints/channels/timeline.ts b/packages/backend/src/server/api/endpoints/channels/timeline.ts index 927ce7c74..2639095f8 100644 --- a/packages/backend/src/server/api/endpoints/channels/timeline.ts +++ b/packages/backend/src/server/api/endpoints/channels/timeline.ts @@ -80,7 +80,7 @@ export default define(meta, async (ps, user) => { const timeline = await query.take(ps.limit!).getMany(); - if (user) activeUsersChart.update(user); + if (user) activeUsersChart.read(user); return await Notes.packMany(timeline, user); }); diff --git a/packages/backend/src/server/api/endpoints/charts/active-users.ts b/packages/backend/src/server/api/endpoints/charts/active-users.ts index f7eadc708..a51cd0035 100644 --- a/packages/backend/src/server/api/endpoints/charts/active-users.ts +++ b/packages/backend/src/server/api/endpoints/charts/active-users.ts @@ -22,7 +22,7 @@ export const meta = { }, }, - res: convertLog(activeUsersChart.schema), + // TODO: response definition } as const; // eslint-disable-next-line import/no-default-export diff --git a/packages/backend/src/server/api/endpoints/charts/network.ts b/packages/backend/src/server/api/endpoints/charts/ap-request.ts similarity index 71% rename from packages/backend/src/server/api/endpoints/charts/network.ts rename to packages/backend/src/server/api/endpoints/charts/ap-request.ts index c5a39bbd7..38bbddb27 100644 --- a/packages/backend/src/server/api/endpoints/charts/network.ts +++ b/packages/backend/src/server/api/endpoints/charts/ap-request.ts @@ -1,7 +1,7 @@ import $ from 'cafy'; import define from '../../define'; import { convertLog } from '@/services/chart/core'; -import { networkChart } from '@/services/chart/index'; +import { apRequestChart } from '@/services/chart/index'; export const meta = { tags: ['charts'], @@ -22,10 +22,10 @@ export const meta = { }, }, - res: convertLog(networkChart.schema), + // TODO: response definition } as const; // eslint-disable-next-line import/no-default-export export default define(meta, async (ps) => { - return await networkChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null); + return await apRequestChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null); }); diff --git a/packages/backend/src/server/api/endpoints/charts/drive.ts b/packages/backend/src/server/api/endpoints/charts/drive.ts index 364279da9..4bbb9861f 100644 --- a/packages/backend/src/server/api/endpoints/charts/drive.ts +++ b/packages/backend/src/server/api/endpoints/charts/drive.ts @@ -22,7 +22,7 @@ export const meta = { }, }, - res: convertLog(driveChart.schema), + // TODO: response definition } as const; // eslint-disable-next-line import/no-default-export diff --git a/packages/backend/src/server/api/endpoints/charts/federation.ts b/packages/backend/src/server/api/endpoints/charts/federation.ts index 6feb82b6d..237678ffe 100644 --- a/packages/backend/src/server/api/endpoints/charts/federation.ts +++ b/packages/backend/src/server/api/endpoints/charts/federation.ts @@ -22,7 +22,7 @@ export const meta = { }, }, - res: convertLog(federationChart.schema), + // TODO: response definition } as const; // eslint-disable-next-line import/no-default-export diff --git a/packages/backend/src/server/api/endpoints/charts/hashtag.ts b/packages/backend/src/server/api/endpoints/charts/hashtag.ts index 99dc77998..6c12cb063 100644 --- a/packages/backend/src/server/api/endpoints/charts/hashtag.ts +++ b/packages/backend/src/server/api/endpoints/charts/hashtag.ts @@ -26,7 +26,7 @@ export const meta = { }, }, - res: convertLog(hashtagChart.schema), + // TODO: response definition } as const; // eslint-disable-next-line import/no-default-export diff --git a/packages/backend/src/server/api/endpoints/charts/instance.ts b/packages/backend/src/server/api/endpoints/charts/instance.ts index 23e6fbf2b..32a10d5a2 100644 --- a/packages/backend/src/server/api/endpoints/charts/instance.ts +++ b/packages/backend/src/server/api/endpoints/charts/instance.ts @@ -26,7 +26,7 @@ export const meta = { }, }, - res: convertLog(instanceChart.schema), + // TODO: response definition } as const; // eslint-disable-next-line import/no-default-export diff --git a/packages/backend/src/server/api/endpoints/charts/notes.ts b/packages/backend/src/server/api/endpoints/charts/notes.ts index dcbd80c3e..09255f1d2 100644 --- a/packages/backend/src/server/api/endpoints/charts/notes.ts +++ b/packages/backend/src/server/api/endpoints/charts/notes.ts @@ -22,7 +22,7 @@ export const meta = { }, }, - res: convertLog(notesChart.schema), + // TODO: response definition } as const; // eslint-disable-next-line import/no-default-export diff --git a/packages/backend/src/server/api/endpoints/charts/user/drive.ts b/packages/backend/src/server/api/endpoints/charts/user/drive.ts index 94787b4a5..89379858d 100644 --- a/packages/backend/src/server/api/endpoints/charts/user/drive.ts +++ b/packages/backend/src/server/api/endpoints/charts/user/drive.ts @@ -27,7 +27,7 @@ export const meta = { }, }, - res: convertLog(perUserDriveChart.schema), + // TODO: response definition } as const; // eslint-disable-next-line import/no-default-export diff --git a/packages/backend/src/server/api/endpoints/charts/user/following.ts b/packages/backend/src/server/api/endpoints/charts/user/following.ts index effe0c54b..26c3f5c12 100644 --- a/packages/backend/src/server/api/endpoints/charts/user/following.ts +++ b/packages/backend/src/server/api/endpoints/charts/user/following.ts @@ -27,7 +27,7 @@ export const meta = { }, }, - res: convertLog(perUserFollowingChart.schema), + // TODO: response definition } as const; // eslint-disable-next-line import/no-default-export diff --git a/packages/backend/src/server/api/endpoints/charts/user/notes.ts b/packages/backend/src/server/api/endpoints/charts/user/notes.ts index df68a5fe5..ecf85becf 100644 --- a/packages/backend/src/server/api/endpoints/charts/user/notes.ts +++ b/packages/backend/src/server/api/endpoints/charts/user/notes.ts @@ -27,7 +27,7 @@ export const meta = { }, }, - res: convertLog(perUserNotesChart.schema), + // TODO: response definition } as const; // eslint-disable-next-line import/no-default-export diff --git a/packages/backend/src/server/api/endpoints/charts/user/reactions.ts b/packages/backend/src/server/api/endpoints/charts/user/reactions.ts index dcd067305..6e08d0751 100644 --- a/packages/backend/src/server/api/endpoints/charts/user/reactions.ts +++ b/packages/backend/src/server/api/endpoints/charts/user/reactions.ts @@ -27,7 +27,7 @@ export const meta = { }, }, - res: convertLog(perUserReactionsChart.schema), + // TODO: response definition } as const; // eslint-disable-next-line import/no-default-export diff --git a/packages/backend/src/server/api/endpoints/charts/users.ts b/packages/backend/src/server/api/endpoints/charts/users.ts index d32e14ad6..15a9ec038 100644 --- a/packages/backend/src/server/api/endpoints/charts/users.ts +++ b/packages/backend/src/server/api/endpoints/charts/users.ts @@ -22,7 +22,7 @@ export const meta = { }, }, - res: convertLog(usersChart.schema), + // TODO: response definition } as const; // eslint-disable-next-line import/no-default-export diff --git a/packages/backend/src/server/api/endpoints/drive/files/create.ts b/packages/backend/src/server/api/endpoints/drive/files/create.ts index 877e76677..ac7863ec7 100644 --- a/packages/backend/src/server/api/endpoints/drive/files/create.ts +++ b/packages/backend/src/server/api/endpoints/drive/files/create.ts @@ -86,7 +86,9 @@ export default define(meta, async (ps, user, _, file, cleanup) => { const driveFile = await addFile({ user, path: file.path, name, comment: ps.comment, folderId: ps.folderId, force: ps.force, sensitive: ps.isSensitive }); return await DriveFiles.pack(driveFile, { self: true }); } catch (e) { - apiLogger.error(e); + if (e instanceof Error || typeof e === 'string') { + apiLogger.error(e); + } throw new ApiError(); } finally { cleanup!(); diff --git a/packages/backend/src/server/api/endpoints/following/create.ts b/packages/backend/src/server/api/endpoints/following/create.ts index 96aede455..b840ab769 100644 --- a/packages/backend/src/server/api/endpoints/following/create.ts +++ b/packages/backend/src/server/api/endpoints/following/create.ts @@ -6,6 +6,7 @@ import define from '../../define'; import { ApiError } from '../../error'; import { getUser } from '../../common/getters'; import { Followings, Users } from '@/models/index'; +import { IdentifiableError } from '@/misc/identifiable-error'; export const meta = { tags: ['following', 'users'], @@ -92,8 +93,10 @@ export default define(meta, async (ps, user) => { try { await create(follower, followee); } catch (e) { - if (e.id === '710e8fb0-b8c3-4922-be49-d5d93d8e6a6e') throw new ApiError(meta.errors.blocking); - if (e.id === '3338392a-f764-498d-8855-db939dcf8c48') throw new ApiError(meta.errors.blocked); + if (e instanceof IdentifiableError) { + if (e.id === '710e8fb0-b8c3-4922-be49-d5d93d8e6a6e') throw new ApiError(meta.errors.blocking); + if (e.id === '3338392a-f764-498d-8855-db939dcf8c48') throw new ApiError(meta.errors.blocked); + } throw e; } diff --git a/packages/backend/src/server/api/endpoints/following/requests/cancel.ts b/packages/backend/src/server/api/endpoints/following/requests/cancel.ts index 19ed02c15..c9abbf36d 100644 --- a/packages/backend/src/server/api/endpoints/following/requests/cancel.ts +++ b/packages/backend/src/server/api/endpoints/following/requests/cancel.ts @@ -5,6 +5,7 @@ import define from '../../../define'; import { ApiError } from '../../../error'; import { getUser } from '../../../common/getters'; import { Users } from '@/models/index'; +import { IdentifiableError } from '@/misc/identifiable-error'; export const meta = { tags: ['following', 'account'], @@ -51,7 +52,9 @@ export default define(meta, async (ps, user) => { try { await cancelFollowRequest(followee, user); } catch (e) { - if (e.id === '17447091-ce07-46dd-b331-c1fd4f15b1e7') throw new ApiError(meta.errors.followRequestNotFound); + if (e instanceof IdentifiableError) { + if (e.id === '17447091-ce07-46dd-b331-c1fd4f15b1e7') throw new ApiError(meta.errors.followRequestNotFound); + } throw e; } diff --git a/packages/backend/src/server/api/endpoints/i/update.ts b/packages/backend/src/server/api/endpoints/i/update.ts index 6b7e53aa1..eb57aa2bf 100644 --- a/packages/backend/src/server/api/endpoints/i/update.ts +++ b/packages/backend/src/server/api/endpoints/i/update.ts @@ -96,6 +96,10 @@ export const meta = { validator: $.optional.bool, }, + showTimelineReplies: { + validator: $.optional.bool, + }, + injectFeaturedNote: { validator: $.optional.bool, }, @@ -197,6 +201,7 @@ export default define(meta, async (ps, _user, token) => { if (typeof ps.hideOnlineStatus === 'boolean') updates.hideOnlineStatus = ps.hideOnlineStatus; if (typeof ps.publicReactions === 'boolean') profileUpdates.publicReactions = ps.publicReactions; if (typeof ps.isBot === 'boolean') updates.isBot = ps.isBot; + if (typeof ps.showTimelineReplies === 'boolean') updates.showTimelineReplies = ps.showTimelineReplies; if (typeof ps.carefulBot === 'boolean') profileUpdates.carefulBot = ps.carefulBot; if (typeof ps.autoAcceptFollowed === 'boolean') profileUpdates.autoAcceptFollowed = ps.autoAcceptFollowed; if (typeof ps.noCrawle === 'boolean') profileUpdates.noCrawle = ps.noCrawle; diff --git a/packages/backend/src/server/api/endpoints/notes/global-timeline.ts b/packages/backend/src/server/api/endpoints/notes/global-timeline.ts index cac8b7d8a..cdd110994 100644 --- a/packages/backend/src/server/api/endpoints/notes/global-timeline.ts +++ b/packages/backend/src/server/api/endpoints/notes/global-timeline.ts @@ -96,7 +96,7 @@ export default define(meta, async (ps, user) => { process.nextTick(() => { if (user) { - activeUsersChart.update(user); + activeUsersChart.read(user); } }); diff --git a/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts b/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts index 9683df461..b43849102 100644 --- a/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts +++ b/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts @@ -153,7 +153,7 @@ export default define(meta, async (ps, user) => { process.nextTick(() => { if (user) { - activeUsersChart.update(user); + activeUsersChart.read(user); } }); diff --git a/packages/backend/src/server/api/endpoints/notes/local-timeline.ts b/packages/backend/src/server/api/endpoints/notes/local-timeline.ts index 777664412..ce0bcbeb7 100644 --- a/packages/backend/src/server/api/endpoints/notes/local-timeline.ts +++ b/packages/backend/src/server/api/endpoints/notes/local-timeline.ts @@ -122,7 +122,7 @@ export default define(meta, async (ps, user) => { process.nextTick(() => { if (user) { - activeUsersChart.update(user); + activeUsersChart.read(user); } }); diff --git a/packages/backend/src/server/api/endpoints/notes/timeline.ts b/packages/backend/src/server/api/endpoints/notes/timeline.ts index 8be2861ae..f8cd08324 100644 --- a/packages/backend/src/server/api/endpoints/notes/timeline.ts +++ b/packages/backend/src/server/api/endpoints/notes/timeline.ts @@ -145,7 +145,7 @@ export default define(meta, async (ps, user) => { process.nextTick(() => { if (user) { - activeUsersChart.update(user); + activeUsersChart.read(user); } }); diff --git a/packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts b/packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts index 89de73fb9..3512fb363 100644 --- a/packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts +++ b/packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts @@ -142,7 +142,7 @@ export default define(meta, async (ps, user) => { const timeline = await query.take(ps.limit!).getMany(); - activeUsersChart.update(user); + activeUsersChart.read(user); return await Notes.packMany(timeline, user); }); diff --git a/packages/backend/src/server/api/endpoints/stats.ts b/packages/backend/src/server/api/endpoints/stats.ts index 9879ef2ad..17281888a 100644 --- a/packages/backend/src/server/api/endpoints/stats.ts +++ b/packages/backend/src/server/api/endpoints/stats.ts @@ -56,8 +56,6 @@ export default define(meta, async () => { reactionsCount, //originalReactionsCount, instances, - driveUsageLocal, - driveUsageRemote, ] = await Promise.all([ Notes.count({ cache: 3600000 }), // 1 hour Notes.count({ where: { userHost: null }, cache: 3600000 }), @@ -66,8 +64,6 @@ export default define(meta, async () => { NoteReactions.count({ cache: 3600000 }), // 1 hour //NoteReactions.count({ where: { userHost: null }, cache: 3600000 }), federationChart.getChart('hour', 1, null).then(chart => chart.instance.total[0]), - driveChart.getChart('hour', 1, null).then(chart => chart.local.totalSize[0]), - driveChart.getChart('hour', 1, null).then(chart => chart.remote.totalSize[0]), ]); return { @@ -78,7 +74,7 @@ export default define(meta, async () => { reactionsCount, //originalReactionsCount, instances, - driveUsageLocal, - driveUsageRemote, + driveUsageLocal: 0, + driveUsageRemote: 0, }; }); diff --git a/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts b/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts index d67625e62..72e79c882 100644 --- a/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts +++ b/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts @@ -114,4 +114,6 @@ export default define(meta, async (ps, me) => { return await Users.packMany(users, me, { detail: !!ps.detail }); } + + return []; }); diff --git a/packages/backend/src/server/api/service/discord.ts b/packages/backend/src/server/api/service/discord.ts index f574fe387..dd731c422 100644 --- a/packages/backend/src/server/api/service/discord.ts +++ b/packages/backend/src/server/api/service/discord.ts @@ -11,18 +11,18 @@ import { fetchMeta } from '@/misc/fetch-meta'; import { Users, UserProfiles } from '@/models/index'; import { ILocalUser } from '@/models/entities/user'; -function getUserToken(ctx: Koa.Context) { +function getUserToken(ctx: Koa.BaseContext): string | null { return ((ctx.headers['cookie'] || '').match(/igi=(\w+)/) || [null, null])[1]; } -function compareOrigin(ctx: Koa.Context) { - function normalizeUrl(url: string) { +function compareOrigin(ctx: Koa.BaseContext): boolean { + function normalizeUrl(url?: string): string { return url ? url.endsWith('/') ? url.substr(0, url.length - 1) : url : ''; } const referer = ctx.headers['referer']; - return (normalizeUrl(referer) == normalizeUrl(config.url)); + return (normalizeUrl(referer) === normalizeUrl(config.url)); } // Init router diff --git a/packages/backend/src/server/api/service/github.ts b/packages/backend/src/server/api/service/github.ts index 5e0839df9..b23219986 100644 --- a/packages/backend/src/server/api/service/github.ts +++ b/packages/backend/src/server/api/service/github.ts @@ -11,18 +11,18 @@ import { fetchMeta } from '@/misc/fetch-meta'; import { Users, UserProfiles } from '@/models/index'; import { ILocalUser } from '@/models/entities/user'; -function getUserToken(ctx: Koa.Context) { +function getUserToken(ctx: Koa.BaseContext): string | null { return ((ctx.headers['cookie'] || '').match(/igi=(\w+)/) || [null, null])[1]; } -function compareOrigin(ctx: Koa.Context) { - function normalizeUrl(url: string) { +function compareOrigin(ctx: Koa.BaseContext): boolean { + function normalizeUrl(url?: string): string { return url ? url.endsWith('/') ? url.substr(0, url.length - 1) : url : ''; } const referer = ctx.headers['referer']; - return (normalizeUrl(referer) == normalizeUrl(config.url)); + return (normalizeUrl(referer) === normalizeUrl(config.url)); } // Init router diff --git a/packages/backend/src/server/api/service/twitter.ts b/packages/backend/src/server/api/service/twitter.ts index 8659b82cb..bca00b792 100644 --- a/packages/backend/src/server/api/service/twitter.ts +++ b/packages/backend/src/server/api/service/twitter.ts @@ -10,18 +10,18 @@ import { fetchMeta } from '@/misc/fetch-meta'; import { Users, UserProfiles } from '@/models/index'; import { ILocalUser } from '@/models/entities/user'; -function getUserToken(ctx: Koa.Context) { +function getUserToken(ctx: Koa.BaseContext): string | null { return ((ctx.headers['cookie'] || '').match(/igi=(\w+)/) || [null, null])[1]; } -function compareOrigin(ctx: Koa.Context) { - function normalizeUrl(url: string) { - return url.endsWith('/') ? url.substr(0, url.length - 1) : url; +function compareOrigin(ctx: Koa.BaseContext): boolean { + function normalizeUrl(url?: string): string { + return url == null ? '' : url.endsWith('/') ? url.substr(0, url.length - 1) : url; } const referer = ctx.headers['referer']; - return (normalizeUrl(referer) == normalizeUrl(config.url)); + return (normalizeUrl(referer) === normalizeUrl(config.url)); } // Init router diff --git a/packages/backend/src/server/api/stream/channels/global-timeline.ts b/packages/backend/src/server/api/stream/channels/global-timeline.ts index f14f597aa..ecd87d093 100644 --- a/packages/backend/src/server/api/stream/channels/global-timeline.ts +++ b/packages/backend/src/server/api/stream/channels/global-timeline.ts @@ -43,7 +43,7 @@ export default class extends Channel { } // é–ĸäŋ‚ãĒいčŋ”äŋĄã¯é™¤å¤– - if (note.reply) { + if (note.reply && !this.user!.showTimelineReplies) { const reply = note.reply; // 「チãƒŖãƒŗネãƒĢæŽĨįļšä¸ģへぎčŋ”äŋĄã€ã§ã‚‚ãĒければ、「チãƒŖãƒŗネãƒĢæŽĨįļšä¸ģãŒčĄŒãŖたčŋ”äŋĄã€ã§ã‚‚ãĒければ、「投į¨ŋč€…ãŽæŠ•į¨ŋ者č‡ĒčēĢへぎčŋ”äŋĄã€ã§ã‚‚ãĒい場合 if (reply.userId !== this.user!.id && note.userId !== this.user!.id && reply.userId !== note.userId) return; diff --git a/packages/backend/src/server/api/stream/channels/home-timeline.ts b/packages/backend/src/server/api/stream/channels/home-timeline.ts index 3bd491421..445db5c38 100644 --- a/packages/backend/src/server/api/stream/channels/home-timeline.ts +++ b/packages/backend/src/server/api/stream/channels/home-timeline.ts @@ -54,7 +54,7 @@ export default class extends Channel { } // é–ĸäŋ‚ãĒいčŋ”äŋĄã¯é™¤å¤– - if (note.reply) { + if (note.reply && !this.user!.showTimelineReplies) { const reply = note.reply; // 「チãƒŖãƒŗネãƒĢæŽĨįļšä¸ģへぎčŋ”äŋĄã€ã§ã‚‚ãĒければ、「チãƒŖãƒŗネãƒĢæŽĨįļšä¸ģãŒčĄŒãŖたčŋ”äŋĄã€ã§ã‚‚ãĒければ、「投į¨ŋč€…ãŽæŠ•į¨ŋ者č‡ĒčēĢへぎčŋ”äŋĄã€ã§ã‚‚ãĒい場合 if (reply.userId !== this.user!.id && note.userId !== this.user!.id && reply.userId !== note.userId) return; diff --git a/packages/backend/src/server/api/stream/channels/hybrid-timeline.ts b/packages/backend/src/server/api/stream/channels/hybrid-timeline.ts index 0ae19aa7c..c0be71fe2 100644 --- a/packages/backend/src/server/api/stream/channels/hybrid-timeline.ts +++ b/packages/backend/src/server/api/stream/channels/hybrid-timeline.ts @@ -62,7 +62,7 @@ export default class extends Channel { if (isInstanceMuted(note, new Set(this.userProfile?.mutedInstances ?? []))) return; // é–ĸäŋ‚ãĒいčŋ”äŋĄã¯é™¤å¤– - if (note.reply) { + if (note.reply && !this.user!.showTimelineReplies) { const reply = note.reply; // 「チãƒŖãƒŗネãƒĢæŽĨįļšä¸ģへぎčŋ”äŋĄã€ã§ã‚‚ãĒければ、「チãƒŖãƒŗネãƒĢæŽĨįļšä¸ģãŒčĄŒãŖたčŋ”äŋĄã€ã§ã‚‚ãĒければ、「投į¨ŋč€…ãŽæŠ•į¨ŋ者č‡ĒčēĢへぎčŋ”äŋĄã€ã§ã‚‚ãĒい場合 if (reply.userId !== this.user!.id && note.userId !== this.user!.id && reply.userId !== note.userId) return; diff --git a/packages/backend/src/server/api/stream/channels/local-timeline.ts b/packages/backend/src/server/api/stream/channels/local-timeline.ts index 3178b1d51..ae8f62ba6 100644 --- a/packages/backend/src/server/api/stream/channels/local-timeline.ts +++ b/packages/backend/src/server/api/stream/channels/local-timeline.ts @@ -43,7 +43,7 @@ export default class extends Channel { } // é–ĸäŋ‚ãĒいčŋ”äŋĄã¯é™¤å¤– - if (note.reply) { + if (note.reply && !this.user!.showTimelineReplies) { const reply = note.reply; // 「チãƒŖãƒŗネãƒĢæŽĨįļšä¸ģへぎčŋ”äŋĄã€ã§ã‚‚ãĒければ、「チãƒŖãƒŗネãƒĢæŽĨįļšä¸ģãŒčĄŒãŖたčŋ”äŋĄã€ã§ã‚‚ãĒければ、「投į¨ŋč€…ãŽæŠ•į¨ŋ者č‡ĒčēĢへぎčŋ”äŋĄã€ã§ã‚‚ãĒい場合 if (reply.userId !== this.user!.id && note.userId !== this.user!.id && reply.userId !== note.userId) return; diff --git a/packages/backend/src/server/api/stream/types.ts b/packages/backend/src/server/api/stream/types.ts index e70c26f5e..e2f1c6fc9 100644 --- a/packages/backend/src/server/api/stream/types.ts +++ b/packages/backend/src/server/api/stream/types.ts @@ -105,7 +105,10 @@ export interface NoteStreamTypes { }; reacted: { reaction: string; - emoji?: Emoji; + emoji?: { + name: string; + url: string; + } | null; userId: User['id']; }; unreacted: { diff --git a/packages/backend/src/server/api/streaming.ts b/packages/backend/src/server/api/streaming.ts index ad8731106..b706b1b8d 100644 --- a/packages/backend/src/server/api/streaming.ts +++ b/packages/backend/src/server/api/streaming.ts @@ -59,7 +59,7 @@ module.exports = (server: http.Server) => { }); connection.on('message', async (data) => { - if (data.utf8Data === 'ping') { + if (data.type === 'utf8' && data.utf8Data === 'ping') { connection.send('pong'); } }); diff --git a/packages/backend/src/server/index.ts b/packages/backend/src/server/index.ts index 764306c7d..4d6b402e6 100644 --- a/packages/backend/src/server/index.ts +++ b/packages/backend/src/server/index.ts @@ -10,7 +10,6 @@ import * as Koa from 'koa'; import * as Router from '@koa/router'; import * as mount from 'koa-mount'; import * as koaLogger from 'koa-logger'; -import * as requestStats from 'request-stats'; import * as slow from 'koa-slow'; import activityPub from './activitypub'; @@ -18,11 +17,9 @@ import nodeinfo from './nodeinfo'; import wellKnown from './well-known'; import config from '@/config/index'; import apiServer from './api/index'; -import { sum } from '@/prelude/array'; import Logger from '@/services/logger'; import { envOption } from '../env'; import { UserProfiles, Users } from '@/models/index'; -import { networkChart } from '@/services/chart/index'; import { genIdenticon } from '@/misc/gen-identicon'; import { createTemp } from '@/misc/create-temp'; import { publishMainStream } from '@/services/stream'; @@ -153,27 +150,4 @@ export default () => new Promise(resolve => { // Listen server.listen(config.port, resolve); - - //#region Network stats - let queue: any[] = []; - - requestStats(server, (stats: any) => { - if (stats.ok) { - queue.push(stats); - } - }); - - // Bulk write - setInterval(() => { - if (queue.length === 0) return; - - const requests = queue.length; - const time = sum(queue.map(x => x.time)); - const incomingBytes = sum(queue.map(x => x.req.byets)); - const outgoingBytes = sum(queue.map(x => x.res.byets)); - queue = []; - - networkChart.update(requests, time, incomingBytes, outgoingBytes); - }, 5000); - //#endregion }); diff --git a/packages/backend/src/server/nodeinfo.ts b/packages/backend/src/server/nodeinfo.ts index 44f32bf88..4209fc7f1 100644 --- a/packages/backend/src/server/nodeinfo.ts +++ b/packages/backend/src/server/nodeinfo.ts @@ -2,7 +2,7 @@ import * as Router from '@koa/router'; import config from '@/config/index'; import { fetchMeta } from '@/misc/fetch-meta'; import { Users, Notes } from '@/models/index'; -import { Not, IsNull, MoreThan } from 'typeorm'; +import { MoreThan } from 'typeorm'; const router = new Router(); @@ -25,14 +25,12 @@ const nodeinfo2 = async () => { activeHalfyear, activeMonth, localPosts, - localComments, ] = await Promise.all([ fetchMeta(true), Users.count({ where: { host: null } }), - Users.count({ where: { host: null, updatedAt: MoreThan(new Date(now - 15552000000)) } }), - Users.count({ where: { host: null, updatedAt: MoreThan(new Date(now - 2592000000)) } }), - Notes.count({ where: { userHost: null, replyId: null } }), - Notes.count({ where: { userHost: null, replyId: Not(IsNull()) } }), + Users.count({ where: { host: null, lastActiveDate: MoreThan(new Date(now - 15552000000)) } }), + Users.count({ where: { host: null, lastActiveDate: MoreThan(new Date(now - 2592000000)) } }), + Notes.count({ where: { userHost: null } }), ]); const proxyAccount = meta.proxyAccountId ? await Users.pack(meta.proxyAccountId).catch(() => null) : null; @@ -52,7 +50,7 @@ const nodeinfo2 = async () => { usage: { users: { total, activeHalfyear, activeMonth }, localPosts, - localComments, + localComments: 0, }, metadata: { nodeName: meta.name, diff --git a/packages/backend/src/server/proxy/proxy-media.ts b/packages/backend/src/server/proxy/proxy-media.ts index c234b70c5..b7dcd0292 100644 --- a/packages/backend/src/server/proxy/proxy-media.ts +++ b/packages/backend/src/server/proxy/proxy-media.ts @@ -11,6 +11,11 @@ import { FILE_TYPE_BROWSERSAFE } from '@/const'; export async function proxyMedia(ctx: Koa.Context) { const url = 'url' in ctx.query ? ctx.query.url : 'https://' + ctx.params.url; + if (typeof url !== 'string') { + ctx.status = 400; + return; + } + // Create temp file const [path, cleanup] = await createTemp(); diff --git a/packages/backend/src/server/web/index.ts b/packages/backend/src/server/web/index.ts index e95a115ae..a0667f0c2 100644 --- a/packages/backend/src/server/web/index.ts +++ b/packages/backend/src/server/web/index.ts @@ -276,6 +276,7 @@ router.get('/@:user/pages/:page', async (ctx, next) => { page: _page, profile, instanceName: meta.name || 'Misskey', + icon: meta.iconUrl, }); if (['public'].includes(page.visibility)) { @@ -305,6 +306,7 @@ router.get('/clips/:clip', async (ctx, next) => { clip: _clip, profile, instanceName: meta.name || 'Misskey', + icon: meta.iconUrl, }); ctx.set('Cache-Control', 'public, max-age=180'); @@ -350,6 +352,7 @@ router.get('/channels/:channel', async (ctx, next) => { await ctx.render('channel', { channel: _channel, instanceName: meta.name || 'Misskey', + icon: meta.iconUrl, }); ctx.set('Cache-Control', 'public, max-age=180'); diff --git a/packages/backend/src/server/web/url-preview.ts b/packages/backend/src/server/web/url-preview.ts index 71465c808..26fffbea8 100644 --- a/packages/backend/src/server/web/url-preview.ts +++ b/packages/backend/src/server/web/url-preview.ts @@ -9,22 +9,34 @@ import { getJson } from '@/misc/fetch'; const logger = new Logger('url-preview'); module.exports = async (ctx: Koa.Context) => { + const url = ctx.query.url; + if (typeof url !== 'string') { + ctx.status = 400; + return; + } + + const lang = ctx.query.lang; + if (Array.isArray(lang)) { + ctx.status = 400; + return; + } + const meta = await fetchMeta(); logger.info(meta.summalyProxy - ? `(Proxy) Getting preview of ${ctx.query.url}@${ctx.query.lang} ...` - : `Getting preview of ${ctx.query.url}@${ctx.query.lang} ...`); + ? `(Proxy) Getting preview of ${url}@${lang} ...` + : `Getting preview of ${url}@${lang} ...`); try { const summary = meta.summalyProxy ? await getJson(`${meta.summalyProxy}?${query({ - url: ctx.query.url, - lang: ctx.query.lang || 'ja-JP', - })}`) : await summaly(ctx.query.url, { + url: url, + lang: lang ?? 'ja-JP', + })}`) : await summaly(url, { followRedirects: false, - lang: ctx.query.lang || 'ja-JP', + lang: lang ?? 'ja-JP', }); - logger.succ(`Got preview of ${ctx.query.url}: ${summary.title}`); + logger.succ(`Got preview of ${url}: ${summary.title}`); summary.icon = wrap(summary.icon); summary.thumbnail = wrap(summary.thumbnail); @@ -33,8 +45,8 @@ module.exports = async (ctx: Koa.Context) => { ctx.set('Cache-Control', 'max-age=604800, immutable'); ctx.body = summary; - } catch (e) { - logger.warn(`Failed to get preview of ${ctx.query.url}: ${e}`); + } catch (err) { + logger.warn(`Failed to get preview of ${url}: ${err}`); ctx.status = 200; ctx.set('Cache-Control', 'max-age=86400, immutable'); ctx.body = '{}'; diff --git a/packages/backend/src/server/web/views/base.pug b/packages/backend/src/server/web/views/base.pug index 42c068c40..b8b733dd6 100644 --- a/packages/backend/src/server/web/views/base.pug +++ b/packages/backend/src/server/web/views/base.pug @@ -21,6 +21,7 @@ html meta(name='referrer' content='origin') meta(name='theme-color' content='#86b300') meta(name='theme-color-orig' content='#86b300') + meta(property='twitter:card' content='summary') meta(property='og:site_name' content= instanceName || 'Misskey') meta(name='viewport' content='width=device-width, initial-scale=1') link(rel='icon' href= icon || '/favicon.ico') @@ -29,8 +30,8 @@ html link(rel='prefetch' href='https://xn--931a.moe/assets/info.jpg') link(rel='prefetch' href='https://xn--931a.moe/assets/not-found.jpg') link(rel='prefetch' href='https://xn--931a.moe/assets/error.jpg') - link(rel='preload' href='https://use.fontawesome.com/releases/v5.15.3/css/all.css' as='style') - link(rel='stylesheet' href='https://use.fontawesome.com/releases/v5.15.3/css/all.css') + link(rel='preload' href='/assets/fontawesome/css/all.css' as='style') + link(rel='stylesheet' href='/assets/fontawesome/css/all.css') title block title @@ -42,7 +43,9 @@ html block meta block og - meta(property='og:image' content=img) + meta(property='og:title' content= title || 'Misskey') + meta(property='og:description' content= desc || '✨🌎✨ A interplanetary communication platform ✨🚀✨') + meta(property='og:image' content= img) style include ../style.css diff --git a/packages/backend/src/server/web/views/channel.pug b/packages/backend/src/server/web/views/channel.pug index 273632f0e..486f0ecc4 100644 --- a/packages/backend/src/server/web/views/channel.pug +++ b/packages/backend/src/server/web/views/channel.pug @@ -16,6 +16,3 @@ block og meta(property='og:description' content= channel.description) meta(property='og:url' content= url) meta(property='og:image' content= channel.bannerUrl) - -block meta - meta(name='twitter:card' content='summary') diff --git a/packages/backend/src/server/web/views/clip.pug b/packages/backend/src/server/web/views/clip.pug index 8de53f19d..7a84d50f6 100644 --- a/packages/backend/src/server/web/views/clip.pug +++ b/packages/backend/src/server/web/views/clip.pug @@ -26,8 +26,6 @@ block meta meta(name='misskey:user-id' content=user.id) meta(name='misskey:clip-id' content=clip.id) - meta(name='twitter:card' content='summary') - // todo if user.twitter meta(name='twitter:creator' content=`@${user.twitter.screenName}`) diff --git a/packages/backend/src/server/web/views/gallery-post.pug b/packages/backend/src/server/web/views/gallery-post.pug index 95bbb2437..ca0663a48 100644 --- a/packages/backend/src/server/web/views/gallery-post.pug +++ b/packages/backend/src/server/web/views/gallery-post.pug @@ -25,8 +25,6 @@ block meta meta(name='misskey:user-username' content=user.username) meta(name='misskey:user-id' content=user.id) - meta(name='twitter:card' content='summary') - // todo if user.twitter meta(name='twitter:creator' content=`@${user.twitter.screenName}`) diff --git a/packages/backend/src/server/web/views/note.pug b/packages/backend/src/server/web/views/note.pug index fce91bdab..34b03f983 100644 --- a/packages/backend/src/server/web/views/note.pug +++ b/packages/backend/src/server/web/views/note.pug @@ -26,9 +26,7 @@ block meta meta(name='misskey:user-username' content=user.username) meta(name='misskey:user-id' content=user.id) meta(name='misskey:note-id' content=note.id) - - meta(name='twitter:card' content='summary') - + // todo if user.twitter meta(name='twitter:creator' content=`@${user.twitter.screenName}`) diff --git a/packages/backend/src/server/web/views/page.pug b/packages/backend/src/server/web/views/page.pug index cb9e1039e..b6c954802 100644 --- a/packages/backend/src/server/web/views/page.pug +++ b/packages/backend/src/server/web/views/page.pug @@ -26,8 +26,6 @@ block meta meta(name='misskey:user-id' content=user.id) meta(name='misskey:page-id' content=page.id) - meta(name='twitter:card' content='summary') - // todo if user.twitter meta(name='twitter:creator' content=`@${user.twitter.screenName}`) diff --git a/packages/backend/src/server/web/views/user.pug b/packages/backend/src/server/web/views/user.pug index 1a8a6b441..2adec0f88 100644 --- a/packages/backend/src/server/web/views/user.pug +++ b/packages/backend/src/server/web/views/user.pug @@ -25,8 +25,6 @@ block meta meta(name='misskey:user-username' content=user.username) meta(name='misskey:user-id' content=user.id) - meta(name='twitter:card' content='summary') - if profile.twitter meta(name='twitter:creator' content=`@${profile.twitter.screenName}`) diff --git a/packages/backend/src/services/chart/charts/active-users.ts b/packages/backend/src/services/chart/charts/active-users.ts index 9490101e3..87dd95f4d 100644 --- a/packages/backend/src/services/chart/charts/active-users.ts +++ b/packages/backend/src/services/chart/charts/active-users.ts @@ -1,51 +1,44 @@ import autobind from 'autobind-decorator'; -import Chart, { Obj, DeepPartial } from '../core'; +import Chart, { KVs } from '../core'; import { User } from '@/models/entities/user'; -import { SchemaType } from '@/misc/schema'; import { Users } from '@/models/index'; import { name, schema } from './entities/active-users'; -type ActiveUsersLog = SchemaType; +const week = 1000 * 60 * 60 * 24 * 7; +const month = 1000 * 60 * 60 * 24 * 30; +const year = 1000 * 60 * 60 * 24 * 365; /** * ã‚ĸクテã‚ŖブãƒĻãƒŧã‚ļãƒŧãĢé–ĸするチãƒŖãƒŧト */ // eslint-disable-next-line import/no-default-export -export default class ActiveUsersChart extends Chart { +export default class ActiveUsersChart extends Chart { constructor() { super(name, schema); } @autobind - protected genNewLog(latest: ActiveUsersLog): DeepPartial { + protected async queryCurrentState(): Promise>> { return {}; } @autobind - protected aggregate(logs: ActiveUsersLog[]): ActiveUsersLog { - return { - local: { - users: logs.reduce((a, b) => a.concat(b.local.users), [] as ActiveUsersLog['local']['users']), - }, - remote: { - users: logs.reduce((a, b) => a.concat(b.remote.users), [] as ActiveUsersLog['remote']['users']), - }, - }; + public async read(user: { id: User['id'], host: null, createdAt: User['createdAt'] }): Promise { + await this.commit({ + 'read': [user.id], + 'registeredWithinWeek': (Date.now() - user.createdAt.getTime() < week) ? [user.id] : [], + 'registeredWithinMonth': (Date.now() - user.createdAt.getTime() < month) ? [user.id] : [], + 'registeredWithinYear': (Date.now() - user.createdAt.getTime() < year) ? [user.id] : [], + 'registeredOutsideWeek': (Date.now() - user.createdAt.getTime() > week) ? [user.id] : [], + 'registeredOutsideMonth': (Date.now() - user.createdAt.getTime() > month) ? [user.id] : [], + 'registeredOutsideYear': (Date.now() - user.createdAt.getTime() > year) ? [user.id] : [], + }); } @autobind - protected async fetchActual(): Promise> { - return {}; - } - - @autobind - public async update(user: { id: User['id'], host: User['host'] }): Promise { - const update: Obj = { - users: [user.id], - }; - - await this.inc({ - [Users.isLocalUser(user) ? 'local' : 'remote']: update, + public async write(user: { id: User['id'], host: null, createdAt: User['createdAt'] }): Promise { + await this.commit({ + 'write': [user.id], }); } } diff --git a/packages/backend/src/services/chart/charts/ap-request.ts b/packages/backend/src/services/chart/charts/ap-request.ts new file mode 100644 index 000000000..bac5e425c --- /dev/null +++ b/packages/backend/src/services/chart/charts/ap-request.ts @@ -0,0 +1,39 @@ +import autobind from 'autobind-decorator'; +import Chart, { KVs } from '../core'; +import { name, schema } from './entities/ap-request'; + +/** + * Chart about ActivityPub requests + */ +// eslint-disable-next-line import/no-default-export +export default class ApRequestChart extends Chart { + constructor() { + super(name, schema); + } + + @autobind + protected async queryCurrentState(): Promise>> { + return {}; + } + + @autobind + public async deliverSucc(): Promise { + await this.commit({ + 'deliverSucceeded': 1, + }); + } + + @autobind + public async deliverFail(): Promise { + await this.commit({ + 'deliverFailed': 1, + }); + } + + @autobind + public async inbox(): Promise { + await this.commit({ + 'inboxReceived': 1, + }); + } +} diff --git a/packages/backend/src/services/chart/charts/drive.ts b/packages/backend/src/services/chart/charts/drive.ts index 06cf7ebee..2f00adae2 100644 --- a/packages/backend/src/services/chart/charts/drive.ts +++ b/packages/backend/src/services/chart/charts/drive.ts @@ -1,95 +1,37 @@ import autobind from 'autobind-decorator'; -import Chart, { Obj, DeepPartial } from '../core'; -import { SchemaType } from '@/misc/schema'; +import Chart, { KVs } from '../core'; import { DriveFiles } from '@/models/index'; import { Not, IsNull } from 'typeorm'; import { DriveFile } from '@/models/entities/drive-file'; import { name, schema } from './entities/drive'; -type DriveLog = SchemaType; - /** * ドナイブãĢé–ĸするチãƒŖãƒŧト */ // eslint-disable-next-line import/no-default-export -export default class DriveChart extends Chart { +export default class DriveChart extends Chart { constructor() { super(name, schema); } @autobind - protected genNewLog(latest: DriveLog): DeepPartial { - return { - local: { - totalCount: latest.local.totalCount, - totalSize: latest.local.totalSize, - }, - remote: { - totalCount: latest.remote.totalCount, - totalSize: latest.remote.totalSize, - }, - }; - } - - @autobind - protected aggregate(logs: DriveLog[]): DriveLog { - return { - local: { - totalCount: logs[0].local.totalCount, - totalSize: logs[0].local.totalSize, - incCount: logs.reduce((a, b) => a + b.local.incCount, 0), - incSize: logs.reduce((a, b) => a + b.local.incSize, 0), - decCount: logs.reduce((a, b) => a + b.local.decCount, 0), - decSize: logs.reduce((a, b) => a + b.local.decSize, 0), - }, - remote: { - totalCount: logs[0].remote.totalCount, - totalSize: logs[0].remote.totalSize, - incCount: logs.reduce((a, b) => a + b.remote.incCount, 0), - incSize: logs.reduce((a, b) => a + b.remote.incSize, 0), - decCount: logs.reduce((a, b) => a + b.remote.decCount, 0), - decSize: logs.reduce((a, b) => a + b.remote.decSize, 0), - }, - }; - } - - @autobind - protected async fetchActual(): Promise> { - const [localCount, remoteCount, localSize, remoteSize] = await Promise.all([ - DriveFiles.count({ userHost: null }), - DriveFiles.count({ userHost: Not(IsNull()) }), - DriveFiles.calcDriveUsageOfLocal(), - DriveFiles.calcDriveUsageOfRemote(), - ]); - - return { - local: { - totalCount: localCount, - totalSize: localSize, - }, - remote: { - totalCount: remoteCount, - totalSize: remoteSize, - }, - }; + protected async queryCurrentState(): Promise>> { + return {}; } @autobind public async update(file: DriveFile, isAdditional: boolean): Promise { - const update: Obj = {}; - - update.totalCount = isAdditional ? 1 : -1; - update.totalSize = isAdditional ? file.size : -file.size; - if (isAdditional) { - update.incCount = 1; - update.incSize = file.size; - } else { - update.decCount = 1; - update.decSize = file.size; - } - - await this.inc({ - [file.userHost === null ? 'local' : 'remote']: update, + const fileSizeKb = file.size / 1000; + await this.commit(file.userHost === null ? { + 'local.incCount': isAdditional ? 1 : 0, + 'local.incSize': isAdditional ? fileSizeKb : 0, + 'local.decCount': isAdditional ? 0 : 1, + 'local.decSize': isAdditional ? 0 : fileSizeKb, + } : { + 'remote.incCount': isAdditional ? 1 : 0, + 'remote.incSize': isAdditional ? fileSizeKb : 0, + 'remote.decCount': isAdditional ? 0 : 1, + 'remote.decSize': isAdditional ? 0 : fileSizeKb, }); } } diff --git a/packages/backend/src/services/chart/charts/entities/active-users.ts b/packages/backend/src/services/chart/charts/entities/active-users.ts index d6b49c86c..843843836 100644 --- a/packages/backend/src/services/chart/charts/entities/active-users.ts +++ b/packages/backend/src/services/chart/charts/entities/active-users.ts @@ -2,35 +2,16 @@ import Chart from '../../core'; export const name = 'activeUsers'; -const logSchema = { - /** - * ã‚ĸクテã‚ŖブãƒĻãƒŧã‚ļãƒŧ - */ - users: { - type: 'array' as const, - optional: false as const, nullable: false as const, - items: { - type: 'string' as const, - optional: false as const, nullable: false as const, - }, - }, -}; - export const schema = { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - local: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: logSchema, - }, - remote: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: logSchema, - }, - }, -}; + 'readWrite': { intersection: ['read', 'write'], range: 'small' }, + 'read': { uniqueIncrement: true, range: 'small' }, + 'write': { uniqueIncrement: true, range: 'small' }, + 'registeredWithinWeek': { uniqueIncrement: true, range: 'small' }, + 'registeredWithinMonth': { uniqueIncrement: true, range: 'small' }, + 'registeredWithinYear': { uniqueIncrement: true, range: 'small' }, + 'registeredOutsideWeek': { uniqueIncrement: true, range: 'small' }, + 'registeredOutsideMonth': { uniqueIncrement: true, range: 'small' }, + 'registeredOutsideYear': { uniqueIncrement: true, range: 'small' }, +} as const; export const entity = Chart.schemaToEntity(name, schema); diff --git a/packages/backend/src/services/chart/charts/entities/ap-request.ts b/packages/backend/src/services/chart/charts/entities/ap-request.ts new file mode 100644 index 000000000..21fb40d13 --- /dev/null +++ b/packages/backend/src/services/chart/charts/entities/ap-request.ts @@ -0,0 +1,11 @@ +import Chart from '../../core'; + +export const name = 'apRequest'; + +export const schema = { + 'deliverFailed': { }, + 'deliverSucceeded': { }, + 'inboxReceived': { }, +} as const; + +export const entity = Chart.schemaToEntity(name, schema); diff --git a/packages/backend/src/services/chart/charts/entities/drive.ts b/packages/backend/src/services/chart/charts/entities/drive.ts index 3362cbd4c..c5cdfd85b 100644 --- a/packages/backend/src/services/chart/charts/entities/drive.ts +++ b/packages/backend/src/services/chart/charts/entities/drive.ts @@ -2,71 +2,15 @@ import Chart from '../../core'; export const name = 'drive'; -const logSchema = { - /** - * é›†č¨ˆæœŸé–“æ™‚į‚šã§ãŽã€å…¨ãƒ‰ãƒŠã‚¤ãƒ–ãƒ•ã‚Ąã‚¤ãƒĢ数 - */ - totalCount: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - /** - * é›†č¨ˆæœŸé–“æ™‚į‚šã§ãŽã€å…¨ãƒ‰ãƒŠã‚¤ãƒ–ãƒ•ã‚Ąã‚¤ãƒĢãŽåˆč¨ˆã‚ĩイã‚ē - */ - totalSize: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - /** - * åĸ—åŠ ã—ãŸãƒ‰ãƒŠã‚¤ãƒ–ãƒ•ã‚Ąã‚¤ãƒĢ数 - */ - incCount: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - /** - * åĸ—加したドナイブäŊŋį”¨é‡ - */ - incSize: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - /** - * æ¸›å°‘ã—ãŸãƒ‰ãƒŠã‚¤ãƒ–ãƒ•ã‚Ąã‚¤ãƒĢ数 - */ - decCount: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - /** - * 減少したドナイブäŊŋį”¨é‡ - */ - decSize: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, -}; - export const schema = { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - local: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: logSchema, - }, - remote: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: logSchema, - }, - }, -}; + 'local.incCount': {}, + 'local.incSize': {}, // in kilobyte + 'local.decCount': {}, + 'local.decSize': {}, // in kilobyte + 'remote.incCount': {}, + 'remote.incSize': {}, // in kilobyte + 'remote.decCount': {}, + 'remote.decSize': {}, // in kilobyte +} as const; export const entity = Chart.schemaToEntity(name, schema); diff --git a/packages/backend/src/services/chart/charts/entities/federation.ts b/packages/backend/src/services/chart/charts/entities/federation.ts index 836116bd0..0c8c20991 100644 --- a/packages/backend/src/services/chart/charts/entities/federation.ts +++ b/packages/backend/src/services/chart/charts/entities/federation.ts @@ -3,28 +3,12 @@ import Chart from '../../core'; export const name = 'federation'; export const schema = { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - instance: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - total: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - inc: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - dec: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - }, - }, - }, -}; + 'instance.total': { accumulate: true }, + 'instance.inc': { range: 'small' }, + 'instance.dec': { range: 'small' }, + 'deliveredInstances': { uniqueIncrement: true, range: 'small' }, + 'inboxInstances': { uniqueIncrement: true, range: 'small' }, + 'stalled': { uniqueIncrement: true, range: 'small' }, +} as const; export const entity = Chart.schemaToEntity(name, schema); diff --git a/packages/backend/src/services/chart/charts/entities/hashtag.ts b/packages/backend/src/services/chart/charts/entities/hashtag.ts index 43e15456a..bd2ae38a1 100644 --- a/packages/backend/src/services/chart/charts/entities/hashtag.ts +++ b/packages/backend/src/services/chart/charts/entities/hashtag.ts @@ -2,35 +2,9 @@ import Chart from '../../core'; export const name = 'hashtag'; -const logSchema = { - /** - * 投į¨ŋしたãƒĻãƒŧã‚ļãƒŧ - */ - users: { - type: 'array' as const, - optional: false as const, nullable: false as const, - items: { - type: 'string' as const, - optional: false as const, nullable: false as const, - }, - }, -}; - export const schema = { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - local: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: logSchema, - }, - remote: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: logSchema, - }, - }, -}; + 'local.users': { uniqueIncrement: true }, + 'remote.users': { uniqueIncrement: true }, +} as const; export const entity = Chart.schemaToEntity(name, schema, true); diff --git a/packages/backend/src/services/chart/charts/entities/instance.ts b/packages/backend/src/services/chart/charts/entities/instance.ts index 9d1f651db..b98e1640c 100644 --- a/packages/backend/src/services/chart/charts/entities/instance.ts +++ b/packages/backend/src/services/chart/charts/entities/instance.ts @@ -3,156 +3,30 @@ import Chart from '../../core'; export const name = 'instance'; export const schema = { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - requests: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - failed: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - succeeded: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - received: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - }, - }, - - notes: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - total: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - inc: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - dec: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - diffs: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - normal: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - reply: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - renote: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - }, - }, - }, - }, - - users: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - total: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - inc: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - dec: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - }, - }, - - following: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - total: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - inc: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - dec: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - }, - }, - - followers: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - total: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - inc: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - dec: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - }, - }, - - drive: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - totalFiles: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - totalUsage: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - incFiles: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - incUsage: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - decFiles: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - decUsage: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - }, - }, - }, -}; + 'requests.failed': { range: 'small' }, + 'requests.succeeded': { range: 'small' }, + 'requests.received': { range: 'small' }, + 'notes.total': { accumulate: true }, + 'notes.inc': {}, + 'notes.dec': {}, + 'notes.diffs.normal': {}, + 'notes.diffs.reply': {}, + 'notes.diffs.renote': {}, + 'notes.diffs.withFile': {}, + 'users.total': { accumulate: true }, + 'users.inc': { range: 'small' }, + 'users.dec': { range: 'small' }, + 'following.total': { accumulate: true }, + 'following.inc': { range: 'small' }, + 'following.dec': { range: 'small' }, + 'followers.total': { accumulate: true }, + 'followers.inc': { range: 'small' }, + 'followers.dec': { range: 'small' }, + 'drive.totalFiles': { accumulate: true }, + 'drive.incFiles': {}, + 'drive.decFiles': {}, + 'drive.incUsage': {}, // in kilobyte + 'drive.decUsage': {}, // in kilobyte +} as const; export const entity = Chart.schemaToEntity(name, schema, true); diff --git a/packages/backend/src/services/chart/charts/entities/network.ts b/packages/backend/src/services/chart/charts/entities/network.ts deleted file mode 100644 index 3d4fffb85..000000000 --- a/packages/backend/src/services/chart/charts/entities/network.ts +++ /dev/null @@ -1,32 +0,0 @@ -import Chart from '../../core'; - -export const name = 'network'; - -export const schema = { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - incomingRequests: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - outgoingRequests: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - totalTime: { // TIP: (totalTime / incomingRequests) ã§ã˛ã¨ã¤ãŽãƒĒクエ゚トãĢåšŗ均でおれくらいぎ時間がかかãŖたかįŸĨれる - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - incomingBytes: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - outgoingBytes: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - }, -}; - -export const entity = Chart.schemaToEntity(name, schema); diff --git a/packages/backend/src/services/chart/charts/entities/notes.ts b/packages/backend/src/services/chart/charts/entities/notes.ts index 554d3abe1..f9b9b20ee 100644 --- a/packages/backend/src/services/chart/charts/entities/notes.ts +++ b/packages/backend/src/services/chart/charts/entities/notes.ts @@ -2,59 +2,21 @@ import Chart from '../../core'; export const name = 'notes'; -const logSchema = { - total: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - inc: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - dec: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - diffs: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - normal: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - reply: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - renote: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - }, - }, -}; - export const schema = { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - local: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: logSchema, - }, - remote: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: logSchema, - }, - }, -}; + 'local.total': { accumulate: true }, + 'local.inc': {}, + 'local.dec': {}, + 'local.diffs.normal': {}, + 'local.diffs.reply': {}, + 'local.diffs.renote': {}, + 'local.diffs.withFile': {}, + 'remote.total': { accumulate: true }, + 'remote.inc': {}, + 'remote.dec': {}, + 'remote.diffs.normal': {}, + 'remote.diffs.reply': {}, + 'remote.diffs.renote': {}, + 'remote.diffs.withFile': {}, +} as const; export const entity = Chart.schemaToEntity(name, schema); diff --git a/packages/backend/src/services/chart/charts/entities/per-user-drive.ts b/packages/backend/src/services/chart/charts/entities/per-user-drive.ts index ebf64e733..00d85b162 100644 --- a/packages/backend/src/services/chart/charts/entities/per-user-drive.ts +++ b/packages/backend/src/services/chart/charts/entities/per-user-drive.ts @@ -3,57 +3,12 @@ import Chart from '../../core'; export const name = 'perUserDrive'; export const schema = { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - /** - * é›†č¨ˆæœŸé–“æ™‚į‚šã§ãŽã€å…¨ãƒ‰ãƒŠã‚¤ãƒ–ãƒ•ã‚Ąã‚¤ãƒĢ数 - */ - totalCount: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - /** - * é›†č¨ˆæœŸé–“æ™‚į‚šã§ãŽã€å…¨ãƒ‰ãƒŠã‚¤ãƒ–ãƒ•ã‚Ąã‚¤ãƒĢãŽåˆč¨ˆã‚ĩイã‚ē - */ - totalSize: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - /** - * åĸ—åŠ ã—ãŸãƒ‰ãƒŠã‚¤ãƒ–ãƒ•ã‚Ąã‚¤ãƒĢ数 - */ - incCount: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - /** - * åĸ—加したドナイブäŊŋį”¨é‡ - */ - incSize: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - /** - * æ¸›å°‘ã—ãŸãƒ‰ãƒŠã‚¤ãƒ–ãƒ•ã‚Ąã‚¤ãƒĢ数 - */ - decCount: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - /** - * 減少したドナイブäŊŋį”¨é‡ - */ - decSize: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - }, -}; + 'totalCount': { accumulate: true }, + 'totalSize': { accumulate: true }, // in kilobyte + 'incCount': { range: 'small' }, + 'incSize': {}, // in kilobyte + 'decCount': { range: 'small' }, + 'decSize': {}, // in kilobyte +} as const; export const entity = Chart.schemaToEntity(name, schema, true); diff --git a/packages/backend/src/services/chart/charts/entities/per-user-following.ts b/packages/backend/src/services/chart/charts/entities/per-user-following.ts index 8016c5fe9..1efd4977f 100644 --- a/packages/backend/src/services/chart/charts/entities/per-user-following.ts +++ b/packages/backend/src/services/chart/charts/entities/per-user-following.ts @@ -2,89 +2,19 @@ import Chart from '../../core'; export const name = 'perUserFollowing'; -const logSchema = { - /** - * フりロãƒŧしãĻいる - */ - followings: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - /** - * フりロãƒŧしãĻã„ã‚‹åˆč¨ˆ - */ - total: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - /** - * フりロãƒŧした数 - */ - inc: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - /** - * フりロãƒŧč§Ŗ除した数 - */ - dec: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - }, - }, - - /** - * フりロãƒŧされãĻいる - */ - followers: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - /** - * フりロãƒŧされãĻã„ã‚‹åˆč¨ˆ - */ - total: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - /** - * フりロãƒŧされた数 - */ - inc: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - /** - * フりロãƒŧč§Ŗ除された数 - */ - dec: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - }, - }, -}; - export const schema = { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - local: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: logSchema, - }, - remote: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: logSchema, - }, - }, -}; + 'local.followings.total': { accumulate: true }, + 'local.followings.inc': { range: 'small' }, + 'local.followings.dec': { range: 'small' }, + 'local.followers.total': { accumulate: true }, + 'local.followers.inc': { range: 'small' }, + 'local.followers.dec': { range: 'small' }, + 'remote.followings.total': { accumulate: true }, + 'remote.followings.inc': { range: 'small' }, + 'remote.followings.dec': { range: 'small' }, + 'remote.followers.total': { accumulate: true }, + 'remote.followers.inc': { range: 'small' }, + 'remote.followers.dec': { range: 'small' }, +} as const; export const entity = Chart.schemaToEntity(name, schema, true); diff --git a/packages/backend/src/services/chart/charts/entities/per-user-notes.ts b/packages/backend/src/services/chart/charts/entities/per-user-notes.ts index d8f645b36..562cde9b0 100644 --- a/packages/backend/src/services/chart/charts/entities/per-user-notes.ts +++ b/packages/backend/src/services/chart/charts/entities/per-user-notes.ts @@ -3,45 +3,13 @@ import Chart from '../../core'; export const name = 'perUserNotes'; export const schema = { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - total: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - inc: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - dec: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - diffs: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - normal: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - reply: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - renote: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - }, - }, - }, -}; + 'total': { accumulate: true }, + 'inc': { range: 'small' }, + 'dec': { range: 'small' }, + 'diffs.normal': { range: 'small' }, + 'diffs.reply': { range: 'small' }, + 'diffs.renote': { range: 'small' }, + 'diffs.withFile': { range: 'small' }, +} as const; export const entity = Chart.schemaToEntity(name, schema, true); diff --git a/packages/backend/src/services/chart/charts/entities/per-user-reactions.ts b/packages/backend/src/services/chart/charts/entities/per-user-reactions.ts index bcb701266..ab315d24c 100644 --- a/packages/backend/src/services/chart/charts/entities/per-user-reactions.ts +++ b/packages/backend/src/services/chart/charts/entities/per-user-reactions.ts @@ -2,31 +2,9 @@ import Chart from '../../core'; export const name = 'perUserReaction'; -const logSchema = { - /** - * čĸĢãƒĒã‚ĸã‚¯ã‚ˇãƒ§ãƒŗ数 - */ - count: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, -}; - export const schema = { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - local: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: logSchema, - }, - remote: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: logSchema, - }, - }, -}; + 'local.count': { range: 'small' }, + 'remote.count': { range: 'small' }, +} as const; export const entity = Chart.schemaToEntity(name, schema, true); diff --git a/packages/backend/src/services/chart/charts/entities/test-grouped.ts b/packages/backend/src/services/chart/charts/entities/test-grouped.ts index ca1c8c570..78c2bbd54 100644 --- a/packages/backend/src/services/chart/charts/entities/test-grouped.ts +++ b/packages/backend/src/services/chart/charts/entities/test-grouped.ts @@ -3,30 +3,9 @@ import Chart from '../../core'; export const name = 'testGrouped'; export const schema = { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - foo: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - total: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - inc: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - dec: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - }, - }, - }, -}; + 'foo.total': { accumulate: true }, + 'foo.inc': {}, + 'foo.dec': {}, +} as const; export const entity = Chart.schemaToEntity(name, schema, true); diff --git a/packages/backend/src/services/chart/charts/entities/test-intersection.ts b/packages/backend/src/services/chart/charts/entities/test-intersection.ts new file mode 100644 index 000000000..dc56eb93f --- /dev/null +++ b/packages/backend/src/services/chart/charts/entities/test-intersection.ts @@ -0,0 +1,11 @@ +import Chart from '../../core'; + +export const name = 'testIntersection'; + +export const schema = { + 'a': { uniqueIncrement: true }, + 'b': { uniqueIncrement: true }, + 'aAndB': { intersection: ['a', 'b'] }, +} as const; + +export const entity = Chart.schemaToEntity(name, schema); diff --git a/packages/backend/src/services/chart/charts/entities/test-unique.ts b/packages/backend/src/services/chart/charts/entities/test-unique.ts index 2e917ee9e..dc7c1520e 100644 --- a/packages/backend/src/services/chart/charts/entities/test-unique.ts +++ b/packages/backend/src/services/chart/charts/entities/test-unique.ts @@ -3,18 +3,7 @@ import Chart from '../../core'; export const name = 'testUnique'; export const schema = { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - foo: { - type: 'array' as const, - optional: false as const, nullable: false as const, - items: { - type: 'string' as const, - optional: false as const, nullable: false as const, - }, - }, - }, -}; + 'foo': { uniqueIncrement: true }, +} as const; export const entity = Chart.schemaToEntity(name, schema); diff --git a/packages/backend/src/services/chart/charts/entities/test.ts b/packages/backend/src/services/chart/charts/entities/test.ts index fa536ff2c..edfa4c524 100644 --- a/packages/backend/src/services/chart/charts/entities/test.ts +++ b/packages/backend/src/services/chart/charts/entities/test.ts @@ -3,30 +3,9 @@ import Chart from '../../core'; export const name = 'test'; export const schema = { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - foo: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - total: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - inc: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - dec: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - }, - }, - }, -}; + 'foo.total': { accumulate: true }, + 'foo.inc': {}, + 'foo.dec': {}, +} as const; export const entity = Chart.schemaToEntity(name, schema); diff --git a/packages/backend/src/services/chart/charts/entities/users.ts b/packages/backend/src/services/chart/charts/entities/users.ts index 08d51c941..d2cec7249 100644 --- a/packages/backend/src/services/chart/charts/entities/users.ts +++ b/packages/backend/src/services/chart/charts/entities/users.ts @@ -2,47 +2,13 @@ import Chart from '../../core'; export const name = 'users'; -const logSchema = { - /** - * é›†č¨ˆæœŸé–“æ™‚į‚šã§ãŽã€å…¨ãƒĻãƒŧã‚ļãƒŧ数 - */ - total: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - /** - * åĸ—加したãƒĻãƒŧã‚ļãƒŧ数 - */ - inc: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, - - /** - * 減少したãƒĻãƒŧã‚ļãƒŧ数 - */ - dec: { - type: 'number' as const, - optional: false as const, nullable: false as const, - }, -}; - export const schema = { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: { - local: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: logSchema, - }, - remote: { - type: 'object' as const, - optional: false as const, nullable: false as const, - properties: logSchema, - }, - }, -}; + 'local.total': { accumulate: true }, + 'local.inc': { range: 'small' }, + 'local.dec': { range: 'small' }, + 'remote.total': { accumulate: true }, + 'remote.inc': { range: 'small' }, + 'remote.dec': { range: 'small' }, +} as const; export const entity = Chart.schemaToEntity(name, schema); diff --git a/packages/backend/src/services/chart/charts/federation.ts b/packages/backend/src/services/chart/charts/federation.ts index 8abb18b51..19c75c98a 100644 --- a/packages/backend/src/services/chart/charts/federation.ts +++ b/packages/backend/src/services/chart/charts/federation.ts @@ -1,66 +1,50 @@ import autobind from 'autobind-decorator'; -import Chart, { Obj, DeepPartial } from '../core'; -import { SchemaType } from '@/misc/schema'; +import Chart, { KVs } from '../core'; import { Instances } from '@/models/index'; import { name, schema } from './entities/federation'; -type FederationLog = SchemaType; - /** * フェデãƒŦãƒŧã‚ˇãƒ§ãƒŗãĢé–ĸするチãƒŖãƒŧト */ // eslint-disable-next-line import/no-default-export -export default class FederationChart extends Chart { +export default class FederationChart extends Chart { constructor() { super(name, schema); } @autobind - protected genNewLog(latest: FederationLog): DeepPartial { - return { - instance: { - total: latest.instance.total, - }, - }; - } - - @autobind - protected aggregate(logs: FederationLog[]): FederationLog { - return { - instance: { - total: logs[0].instance.total, - inc: logs.reduce((a, b) => a + b.instance.inc, 0), - dec: logs.reduce((a, b) => a + b.instance.dec, 0), - }, - }; - } - - @autobind - protected async fetchActual(): Promise> { + protected async queryCurrentState(): Promise>> { const [total] = await Promise.all([ Instances.count({}), ]); return { - instance: { - total: total, - }, + 'instance.total': total, }; } @autobind public async update(isAdditional: boolean): Promise { - const update: Obj = {}; + await this.commit({ + 'instance.total': isAdditional ? 1 : -1, + 'instance.inc': isAdditional ? 1 : 0, + 'instance.dec': isAdditional ? 0 : 1, + }); + } - update.total = isAdditional ? 1 : -1; - if (isAdditional) { - update.inc = 1; - } else { - update.dec = 1; - } + @autobind + public async deliverd(host: string, succeeded: boolean): Promise { + await this.commit(succeeded ? { + 'deliveredInstances': [host], + } : { + 'stalled': [host], + }); + } - await this.inc({ - instance: update, + @autobind + public async inbox(host: string): Promise { + await this.commit({ + 'inboxInstances': [host], }); } } diff --git a/packages/backend/src/services/chart/charts/hashtag.ts b/packages/backend/src/services/chart/charts/hashtag.ts index 34e061464..0b7bc467d 100644 --- a/packages/backend/src/services/chart/charts/hashtag.ts +++ b/packages/backend/src/services/chart/charts/hashtag.ts @@ -1,51 +1,28 @@ import autobind from 'autobind-decorator'; -import Chart, { Obj, DeepPartial } from '../core'; +import Chart, { KVs } from '../core'; import { User } from '@/models/entities/user'; -import { SchemaType } from '@/misc/schema'; import { Users } from '@/models/index'; import { name, schema } from './entities/hashtag'; -type HashtagLog = SchemaType; - /** * ãƒãƒƒã‚ˇãƒĨã‚ŋグãĢé–ĸするチãƒŖãƒŧト */ // eslint-disable-next-line import/no-default-export -export default class HashtagChart extends Chart { +export default class HashtagChart extends Chart { constructor() { super(name, schema, true); } @autobind - protected genNewLog(latest: HashtagLog): DeepPartial { - return {}; - } - - @autobind - protected aggregate(logs: HashtagLog[]): HashtagLog { - return { - local: { - users: logs.reduce((a, b) => a.concat(b.local.users), [] as HashtagLog['local']['users']), - }, - remote: { - users: logs.reduce((a, b) => a.concat(b.remote.users), [] as HashtagLog['remote']['users']), - }, - }; - } - - @autobind - protected async fetchActual(): Promise> { + protected async queryCurrentState(): Promise>> { return {}; } @autobind public async update(hashtag: string, user: { id: User['id'], host: User['host'] }): Promise { - const update: Obj = { - users: [user.id], - }; - - await this.inc({ - [Users.isLocalUser(user) ? 'local' : 'remote']: update, + await this.commit({ + 'local.users': Users.isLocalUser(user) ? [user.id] : [], + 'remote.users': Users.isLocalUser(user) ? [] : [user.id], }, hashtag); } } diff --git a/packages/backend/src/services/chart/charts/instance.ts b/packages/backend/src/services/chart/charts/instance.ts index 7f3419b69..5ea4d567e 100644 --- a/packages/backend/src/services/chart/charts/instance.ts +++ b/packages/backend/src/services/chart/charts/instance.ts @@ -1,221 +1,110 @@ import autobind from 'autobind-decorator'; -import Chart, { Obj, DeepPartial } from '../core'; -import { SchemaType } from '@/misc/schema'; +import Chart, { KVs } from '../core'; import { DriveFiles, Followings, Users, Notes } from '@/models/index'; import { DriveFile } from '@/models/entities/drive-file'; import { Note } from '@/models/entities/note'; import { toPuny } from '@/misc/convert-host'; import { name, schema } from './entities/instance'; -type InstanceLog = SchemaType; - /** * イãƒŗã‚šã‚ŋãƒŗ゚ごとぎチãƒŖãƒŧト */ // eslint-disable-next-line import/no-default-export -export default class InstanceChart extends Chart { +export default class InstanceChart extends Chart { constructor() { super(name, schema, true); } @autobind - protected genNewLog(latest: InstanceLog): DeepPartial { - return { - notes: { - total: latest.notes.total, - }, - users: { - total: latest.users.total, - }, - following: { - total: latest.following.total, - }, - followers: { - total: latest.followers.total, - }, - drive: { - totalFiles: latest.drive.totalFiles, - totalUsage: latest.drive.totalUsage, - }, - }; - } - - @autobind - protected aggregate(logs: InstanceLog[]): InstanceLog { - return { - requests: { - failed: logs.reduce((a, b) => a + b.requests.failed, 0), - succeeded: logs.reduce((a, b) => a + b.requests.succeeded, 0), - received: logs.reduce((a, b) => a + b.requests.received, 0), - }, - notes: { - total: logs[0].notes.total, - inc: logs.reduce((a, b) => a + b.notes.inc, 0), - dec: logs.reduce((a, b) => a + b.notes.dec, 0), - diffs: { - reply: logs.reduce((a, b) => a + b.notes.diffs.reply, 0), - renote: logs.reduce((a, b) => a + b.notes.diffs.renote, 0), - normal: logs.reduce((a, b) => a + b.notes.diffs.normal, 0), - }, - }, - users: { - total: logs[0].users.total, - inc: logs.reduce((a, b) => a + b.users.inc, 0), - dec: logs.reduce((a, b) => a + b.users.dec, 0), - }, - following: { - total: logs[0].following.total, - inc: logs.reduce((a, b) => a + b.following.inc, 0), - dec: logs.reduce((a, b) => a + b.following.dec, 0), - }, - followers: { - total: logs[0].followers.total, - inc: logs.reduce((a, b) => a + b.followers.inc, 0), - dec: logs.reduce((a, b) => a + b.followers.dec, 0), - }, - drive: { - totalFiles: logs[0].drive.totalFiles, - totalUsage: logs[0].drive.totalUsage, - incFiles: logs.reduce((a, b) => a + b.drive.incFiles, 0), - incUsage: logs.reduce((a, b) => a + b.drive.incUsage, 0), - decFiles: logs.reduce((a, b) => a + b.drive.decFiles, 0), - decUsage: logs.reduce((a, b) => a + b.drive.decUsage, 0), - }, - }; - } - - @autobind - protected async fetchActual(group: string): Promise> { + protected async queryCurrentState(group: string): Promise>> { const [ notesCount, usersCount, followingCount, followersCount, driveFiles, - driveUsage, + //driveUsage, ] = await Promise.all([ Notes.count({ userHost: group }), Users.count({ host: group }), Followings.count({ followerHost: group }), Followings.count({ followeeHost: group }), DriveFiles.count({ userHost: group }), - DriveFiles.calcDriveUsageOfHost(group), + //DriveFiles.calcDriveUsageOfHost(group), ]); return { - notes: { - total: notesCount, - }, - users: { - total: usersCount, - }, - following: { - total: followingCount, - }, - followers: { - total: followersCount, - }, - drive: { - totalFiles: driveFiles, - totalUsage: driveUsage, - }, + 'notes.total': notesCount, + 'users.total': usersCount, + 'following.total': followingCount, + 'followers.total': followersCount, + 'drive.totalFiles': driveFiles, }; } @autobind public async requestReceived(host: string): Promise { - await this.inc({ - requests: { - received: 1, - }, + await this.commit({ + 'requests.received': 1, }, toPuny(host)); } @autobind public async requestSent(host: string, isSucceeded: boolean): Promise { - const update: Obj = {}; - - if (isSucceeded) { - update.succeeded = 1; - } else { - update.failed = 1; - } - - await this.inc({ - requests: update, + await this.commit({ + 'requests.succeeded': isSucceeded ? 1 : 0, + 'requests.failed': isSucceeded ? 0 : 1, }, toPuny(host)); } @autobind public async newUser(host: string): Promise { - await this.inc({ - users: { - total: 1, - inc: 1, - }, + await this.commit({ + 'users.total': 1, + 'users.inc': 1, }, toPuny(host)); } @autobind public async updateNote(host: string, note: Note, isAdditional: boolean): Promise { - const diffs = {} as Record; - - if (note.replyId != null) { - diffs.reply = isAdditional ? 1 : -1; - } else if (note.renoteId != null) { - diffs.renote = isAdditional ? 1 : -1; - } else { - diffs.normal = isAdditional ? 1 : -1; - } - - await this.inc({ - notes: { - total: isAdditional ? 1 : -1, - inc: isAdditional ? 1 : 0, - dec: isAdditional ? 0 : 1, - diffs: diffs, - }, + await this.commit({ + 'notes.total': isAdditional ? 1 : -1, + 'notes.inc': isAdditional ? 1 : 0, + 'notes.dec': isAdditional ? 0 : 1, + 'notes.diffs.normal': note.replyId == null && note.renoteId == null ? (isAdditional ? 1 : -1) : 0, + 'notes.diffs.renote': note.renoteId != null ? (isAdditional ? 1 : -1) : 0, + 'notes.diffs.reply': note.replyId != null ? (isAdditional ? 1 : -1) : 0, + 'notes.diffs.withFile': note.fileIds.length > 0 ? (isAdditional ? 1 : -1) : 0, }, toPuny(host)); } @autobind public async updateFollowing(host: string, isAdditional: boolean): Promise { - await this.inc({ - following: { - total: isAdditional ? 1 : -1, - inc: isAdditional ? 1 : 0, - dec: isAdditional ? 0 : 1, - }, + await this.commit({ + 'following.total': isAdditional ? 1 : -1, + 'following.inc': isAdditional ? 1 : 0, + 'following.dec': isAdditional ? 0 : 1, }, toPuny(host)); } @autobind public async updateFollowers(host: string, isAdditional: boolean): Promise { - await this.inc({ - followers: { - total: isAdditional ? 1 : -1, - inc: isAdditional ? 1 : 0, - dec: isAdditional ? 0 : 1, - }, + await this.commit({ + 'followers.total': isAdditional ? 1 : -1, + 'followers.inc': isAdditional ? 1 : 0, + 'followers.dec': isAdditional ? 0 : 1, }, toPuny(host)); } @autobind public async updateDrive(file: DriveFile, isAdditional: boolean): Promise { - const update: Obj = {}; - - update.totalFiles = isAdditional ? 1 : -1; - update.totalUsage = isAdditional ? file.size : -file.size; - if (isAdditional) { - update.incFiles = 1; - update.incUsage = file.size; - } else { - update.decFiles = 1; - update.decUsage = file.size; - } - - await this.inc({ - drive: update, + const fileSizeKb = file.size / 1000; + await this.commit({ + 'drive.totalFiles': isAdditional ? 1 : -1, + 'drive.incFiles': isAdditional ? 1 : 0, + 'drive.incUsage': isAdditional ? fileSizeKb : 0, + 'drive.decFiles': isAdditional ? 1 : 0, + 'drive.decUsage': isAdditional ? fileSizeKb : 0, }, file.userHost); } } diff --git a/packages/backend/src/services/chart/charts/network.ts b/packages/backend/src/services/chart/charts/network.ts deleted file mode 100644 index 73ea2f7e1..000000000 --- a/packages/backend/src/services/chart/charts/network.ts +++ /dev/null @@ -1,49 +0,0 @@ -import autobind from 'autobind-decorator'; -import Chart, { DeepPartial } from '../core'; -import { SchemaType } from '@/misc/schema'; -import { name, schema } from './entities/network'; - -type NetworkLog = SchemaType; - -/** - * ネットワãƒŧクãĢé–ĸするチãƒŖãƒŧト - */ -// eslint-disable-next-line import/no-default-export -export default class NetworkChart extends Chart { - constructor() { - super(name, schema); - } - - @autobind - protected genNewLog(latest: NetworkLog): DeepPartial { - return {}; - } - - @autobind - protected aggregate(logs: NetworkLog[]): NetworkLog { - return { - incomingRequests: logs.reduce((a, b) => a + b.incomingRequests, 0), - outgoingRequests: logs.reduce((a, b) => a + b.outgoingRequests, 0), - totalTime: logs.reduce((a, b) => a + b.totalTime, 0), - incomingBytes: logs.reduce((a, b) => a + b.incomingBytes, 0), - outgoingBytes: logs.reduce((a, b) => a + b.outgoingBytes, 0), - }; - } - - @autobind - protected async fetchActual(): Promise> { - return {}; - } - - @autobind - public async update(incomingRequests: number, time: number, incomingBytes: number, outgoingBytes: number): Promise { - const inc: DeepPartial = { - incomingRequests: incomingRequests, - totalTime: time, - incomingBytes: incomingBytes, - outgoingBytes: outgoingBytes, - }; - - await this.inc(inc); - } -} diff --git a/packages/backend/src/services/chart/charts/notes.ts b/packages/backend/src/services/chart/charts/notes.ts index 86cda1722..5c56a9a71 100644 --- a/packages/backend/src/services/chart/charts/notes.ts +++ b/packages/backend/src/services/chart/charts/notes.ts @@ -1,101 +1,44 @@ import autobind from 'autobind-decorator'; -import Chart, { Obj, DeepPartial } from '../core'; -import { SchemaType } from '@/misc/schema'; +import Chart, { KVs } from '../core'; import { Notes } from '@/models/index'; import { Not, IsNull } from 'typeorm'; import { Note } from '@/models/entities/note'; import { name, schema } from './entities/notes'; -type NotesLog = SchemaType; - /** * ノãƒŧトãĢé–ĸするチãƒŖãƒŧト */ // eslint-disable-next-line import/no-default-export -export default class NotesChart extends Chart { +export default class NotesChart extends Chart { constructor() { super(name, schema); } @autobind - protected genNewLog(latest: NotesLog): DeepPartial { - return { - local: { - total: latest.local.total, - }, - remote: { - total: latest.remote.total, - }, - }; - } - - @autobind - protected aggregate(logs: NotesLog[]): NotesLog { - return { - local: { - total: logs[0].local.total, - inc: logs.reduce((a, b) => a + b.local.inc, 0), - dec: logs.reduce((a, b) => a + b.local.dec, 0), - diffs: { - reply: logs.reduce((a, b) => a + b.local.diffs.reply, 0), - renote: logs.reduce((a, b) => a + b.local.diffs.renote, 0), - normal: logs.reduce((a, b) => a + b.local.diffs.normal, 0), - }, - }, - remote: { - total: logs[0].remote.total, - inc: logs.reduce((a, b) => a + b.remote.inc, 0), - dec: logs.reduce((a, b) => a + b.remote.dec, 0), - diffs: { - reply: logs.reduce((a, b) => a + b.remote.diffs.reply, 0), - renote: logs.reduce((a, b) => a + b.remote.diffs.renote, 0), - normal: logs.reduce((a, b) => a + b.remote.diffs.normal, 0), - }, - }, - }; - } - - @autobind - protected async fetchActual(): Promise> { + protected async queryCurrentState(): Promise>> { const [localCount, remoteCount] = await Promise.all([ Notes.count({ userHost: null }), Notes.count({ userHost: Not(IsNull()) }), ]); return { - local: { - total: localCount, - }, - remote: { - total: remoteCount, - }, + 'local.total': localCount, + 'remote.total': remoteCount, }; } @autobind public async update(note: Note, isAdditional: boolean): Promise { - const update: Obj = { - diffs: {}, - }; + const prefix = note.userHost === null ? 'local' : 'remote'; - update.total = isAdditional ? 1 : -1; - - if (isAdditional) { - update.inc = 1; - } else { - update.dec = 1; - } - - if (note.replyId != null) { - update.diffs.reply = isAdditional ? 1 : -1; - } else if (note.renoteId != null) { - update.diffs.renote = isAdditional ? 1 : -1; - } else { - update.diffs.normal = isAdditional ? 1 : -1; - } - - await this.inc({ - [note.userHost === null ? 'local' : 'remote']: update, + await this.commit({ + [`${prefix}.total`]: isAdditional ? 1 : -1, + [`${prefix}.inc`]: isAdditional ? 1 : 0, + [`${prefix}.dec`]: isAdditional ? 0 : 1, + [`${prefix}.diffs.normal`]: note.replyId == null && note.renoteId == null ? (isAdditional ? 1 : -1) : 0, + [`${prefix}.diffs.renote`]: note.renoteId != null ? (isAdditional ? 1 : -1) : 0, + [`${prefix}.diffs.reply`]: note.replyId != null ? (isAdditional ? 1 : -1) : 0, + [`${prefix}.diffs.withFile`]: note.fileIds.length > 0 ? (isAdditional ? 1 : -1) : 0, }); } } diff --git a/packages/backend/src/services/chart/charts/per-user-drive.ts b/packages/backend/src/services/chart/charts/per-user-drive.ts index fff790367..969ed018f 100644 --- a/packages/backend/src/services/chart/charts/per-user-drive.ts +++ b/packages/backend/src/services/chart/charts/per-user-drive.ts @@ -1,68 +1,41 @@ import autobind from 'autobind-decorator'; -import Chart, { Obj, DeepPartial } from '../core'; -import { SchemaType } from '@/misc/schema'; +import Chart, { KVs } from '../core'; import { DriveFiles } from '@/models/index'; import { DriveFile } from '@/models/entities/drive-file'; import { name, schema } from './entities/per-user-drive'; -type PerUserDriveLog = SchemaType; - /** * ãƒĻãƒŧã‚ļãƒŧごとぎドナイブãĢé–ĸするチãƒŖãƒŧト */ // eslint-disable-next-line import/no-default-export -export default class PerUserDriveChart extends Chart { +export default class PerUserDriveChart extends Chart { constructor() { super(name, schema, true); } @autobind - protected genNewLog(latest: PerUserDriveLog): DeepPartial { - return { - totalCount: latest.totalCount, - totalSize: latest.totalSize, - }; - } - - @autobind - protected aggregate(logs: PerUserDriveLog[]): PerUserDriveLog { - return { - totalCount: logs[0].totalCount, - totalSize: logs[0].totalSize, - incCount: logs.reduce((a, b) => a + b.incCount, 0), - incSize: logs.reduce((a, b) => a + b.incSize, 0), - decCount: logs.reduce((a, b) => a + b.decCount, 0), - decSize: logs.reduce((a, b) => a + b.decSize, 0), - }; - } - - @autobind - protected async fetchActual(group: string): Promise> { + protected async queryCurrentState(group: string): Promise>> { const [count, size] = await Promise.all([ DriveFiles.count({ userId: group }), DriveFiles.calcDriveUsageOf(group), ]); return { - totalCount: count, - totalSize: size, + 'totalCount': count, + 'totalSize': size, }; } @autobind public async update(file: DriveFile, isAdditional: boolean): Promise { - const update: Obj = {}; - - update.totalCount = isAdditional ? 1 : -1; - update.totalSize = isAdditional ? file.size : -file.size; - if (isAdditional) { - update.incCount = 1; - update.incSize = file.size; - } else { - update.decCount = 1; - update.decSize = file.size; - } - - await this.inc(update, file.userId); + const fileSizeKb = file.size / 1000; + await this.commit({ + 'totalCount': isAdditional ? 1 : -1, + 'totalSize': isAdditional ? fileSizeKb : -fileSizeKb, + 'incCount': isAdditional ? 1 : 0, + 'incSize': isAdditional ? fileSizeKb : 0, + 'decCount': isAdditional ? 0 : 1, + 'decSize': isAdditional ? 0 : fileSizeKb, + }, file.userId); } } diff --git a/packages/backend/src/services/chart/charts/per-user-following.ts b/packages/backend/src/services/chart/charts/per-user-following.ts index d0a80abda..cdd0aad94 100644 --- a/packages/backend/src/services/chart/charts/per-user-following.ts +++ b/packages/backend/src/services/chart/charts/per-user-following.ts @@ -1,76 +1,21 @@ import autobind from 'autobind-decorator'; -import Chart, { Obj, DeepPartial } from '../core'; -import { SchemaType } from '@/misc/schema'; +import Chart, { KVs } from '../core'; import { Followings, Users } from '@/models/index'; import { Not, IsNull } from 'typeorm'; import { User } from '@/models/entities/user'; import { name, schema } from './entities/per-user-following'; -type PerUserFollowingLog = SchemaType; - /** * ãƒĻãƒŧã‚ļãƒŧごとぎフりロãƒŧãĢé–ĸするチãƒŖãƒŧト */ // eslint-disable-next-line import/no-default-export -export default class PerUserFollowingChart extends Chart { +export default class PerUserFollowingChart extends Chart { constructor() { super(name, schema, true); } @autobind - protected genNewLog(latest: PerUserFollowingLog): DeepPartial { - return { - local: { - followings: { - total: latest.local.followings.total, - }, - followers: { - total: latest.local.followers.total, - }, - }, - remote: { - followings: { - total: latest.remote.followings.total, - }, - followers: { - total: latest.remote.followers.total, - }, - }, - }; - } - - @autobind - protected aggregate(logs: PerUserFollowingLog[]): PerUserFollowingLog { - return { - local: { - followings: { - total: logs[0].local.followings.total, - inc: logs.reduce((a, b) => a + b.local.followings.inc, 0), - dec: logs.reduce((a, b) => a + b.local.followings.dec, 0), - }, - followers: { - total: logs[0].local.followers.total, - inc: logs.reduce((a, b) => a + b.local.followers.inc, 0), - dec: logs.reduce((a, b) => a + b.local.followers.dec, 0), - }, - }, - remote: { - followings: { - total: logs[0].remote.followings.total, - inc: logs.reduce((a, b) => a + b.remote.followings.inc, 0), - dec: logs.reduce((a, b) => a + b.remote.followings.dec, 0), - }, - followers: { - total: logs[0].remote.followers.total, - inc: logs.reduce((a, b) => a + b.remote.followers.inc, 0), - dec: logs.reduce((a, b) => a + b.remote.followers.dec, 0), - }, - }, - }; - } - - @autobind - protected async fetchActual(group: string): Promise> { + protected async queryCurrentState(group: string): Promise>> { const [ localFollowingsCount, localFollowersCount, @@ -84,42 +29,27 @@ export default class PerUserFollowingChart extends Chart { ]); return { - local: { - followings: { - total: localFollowingsCount, - }, - followers: { - total: localFollowersCount, - }, - }, - remote: { - followings: { - total: remoteFollowingsCount, - }, - followers: { - total: remoteFollowersCount, - }, - }, + 'local.followings.total': localFollowingsCount, + 'local.followers.total': localFollowersCount, + 'remote.followings.total': remoteFollowingsCount, + 'remote.followers.total': remoteFollowersCount, }; } @autobind public async update(follower: { id: User['id']; host: User['host']; }, followee: { id: User['id']; host: User['host']; }, isFollow: boolean): Promise { - const update: Obj = {}; + const prefixFollower = Users.isLocalUser(follower) ? 'local' : 'remote'; + const prefixFollowee = Users.isLocalUser(followee) ? 'local' : 'remote'; - update.total = isFollow ? 1 : -1; - - if (isFollow) { - update.inc = 1; - } else { - update.dec = 1; - } - - this.inc({ - [Users.isLocalUser(follower) ? 'local' : 'remote']: { followings: update }, + this.commit({ + [`${prefixFollower}.followings.total`]: isFollow ? 1 : -1, + [`${prefixFollower}.followings.inc`]: isFollow ? 1 : 0, + [`${prefixFollower}.followings.dec`]: isFollow ? 0 : 1, }, follower.id); - this.inc({ - [Users.isLocalUser(followee) ? 'local' : 'remote']: { followers: update }, + this.commit({ + [`${prefixFollowee}.followers.total`]: isFollow ? 1 : -1, + [`${prefixFollowee}.followers.inc`]: isFollow ? 1 : 0, + [`${prefixFollowee}.followers.dec`]: isFollow ? 0 : 1, }, followee.id); } } diff --git a/packages/backend/src/services/chart/charts/per-user-notes.ts b/packages/backend/src/services/chart/charts/per-user-notes.ts index d048c8888..6a4f0363b 100644 --- a/packages/backend/src/services/chart/charts/per-user-notes.ts +++ b/packages/backend/src/services/chart/charts/per-user-notes.ts @@ -1,45 +1,21 @@ import autobind from 'autobind-decorator'; -import Chart, { Obj, DeepPartial } from '../core'; +import Chart, { KVs } from '../core'; import { User } from '@/models/entities/user'; -import { SchemaType } from '@/misc/schema'; import { Notes } from '@/models/index'; import { Note } from '@/models/entities/note'; import { name, schema } from './entities/per-user-notes'; -type PerUserNotesLog = SchemaType; - /** * ãƒĻãƒŧã‚ļãƒŧごとぎノãƒŧトãĢé–ĸするチãƒŖãƒŧト */ // eslint-disable-next-line import/no-default-export -export default class PerUserNotesChart extends Chart { +export default class PerUserNotesChart extends Chart { constructor() { super(name, schema, true); } @autobind - protected genNewLog(latest: PerUserNotesLog): DeepPartial { - return { - total: latest.total, - }; - } - - @autobind - protected aggregate(logs: PerUserNotesLog[]): PerUserNotesLog { - return { - total: logs[0].total, - inc: logs.reduce((a, b) => a + b.inc, 0), - dec: logs.reduce((a, b) => a + b.dec, 0), - diffs: { - reply: logs.reduce((a, b) => a + b.diffs.reply, 0), - renote: logs.reduce((a, b) => a + b.diffs.renote, 0), - normal: logs.reduce((a, b) => a + b.diffs.normal, 0), - }, - }; - } - - @autobind - protected async fetchActual(group: string): Promise> { + protected async queryCurrentState(group: string): Promise>> { const [count] = await Promise.all([ Notes.count({ userId: group }), ]); @@ -51,26 +27,14 @@ export default class PerUserNotesChart extends Chart { @autobind public async update(user: { id: User['id'] }, note: Note, isAdditional: boolean): Promise { - const update: Obj = { - diffs: {}, - }; - - update.total = isAdditional ? 1 : -1; - - if (isAdditional) { - update.inc = 1; - } else { - update.dec = 1; - } - - if (note.replyId != null) { - update.diffs.reply = isAdditional ? 1 : -1; - } else if (note.renoteId != null) { - update.diffs.renote = isAdditional ? 1 : -1; - } else { - update.diffs.normal = isAdditional ? 1 : -1; - } - - await this.inc(update, user.id); + await this.commit({ + 'total': isAdditional ? 1 : -1, + 'inc': isAdditional ? 1 : 0, + 'dec': isAdditional ? 0 : 1, + 'diffs.normal': note.replyId == null && note.renoteId == null ? (isAdditional ? 1 : -1) : 0, + 'diffs.renote': note.renoteId != null ? (isAdditional ? 1 : -1) : 0, + 'diffs.reply': note.replyId != null ? (isAdditional ? 1 : -1) : 0, + 'diffs.withFile': note.fileIds.length > 0 ? (isAdditional ? 1 : -1) : 0, + }, user.id); } } diff --git a/packages/backend/src/services/chart/charts/per-user-reactions.ts b/packages/backend/src/services/chart/charts/per-user-reactions.ts index 2f5353340..2ec347f40 100644 --- a/packages/backend/src/services/chart/charts/per-user-reactions.ts +++ b/packages/backend/src/services/chart/charts/per-user-reactions.ts @@ -1,48 +1,29 @@ import autobind from 'autobind-decorator'; -import Chart, { DeepPartial } from '../core'; +import Chart, { KVs } from '../core'; import { User } from '@/models/entities/user'; import { Note } from '@/models/entities/note'; -import { SchemaType } from '@/misc/schema'; import { Users } from '@/models/index'; import { name, schema } from './entities/per-user-reactions'; -type PerUserReactionsLog = SchemaType; - /** * ãƒĻãƒŧã‚ļãƒŧごとぎãƒĒã‚ĸã‚¯ã‚ˇãƒ§ãƒŗãĢé–ĸするチãƒŖãƒŧト */ // eslint-disable-next-line import/no-default-export -export default class PerUserReactionsChart extends Chart { +export default class PerUserReactionsChart extends Chart { constructor() { super(name, schema, true); } @autobind - protected genNewLog(latest: PerUserReactionsLog): DeepPartial { - return {}; - } - - @autobind - protected aggregate(logs: PerUserReactionsLog[]): PerUserReactionsLog { - return { - local: { - count: logs.reduce((a, b) => a + b.local.count, 0), - }, - remote: { - count: logs.reduce((a, b) => a + b.remote.count, 0), - }, - }; - } - - @autobind - protected async fetchActual(group: string): Promise> { + protected async queryCurrentState(group: string): Promise>> { return {}; } @autobind public async update(user: { id: User['id'], host: User['host'] }, note: Note): Promise { - this.inc({ - [Users.isLocalUser(user) ? 'local' : 'remote']: { count: 1 }, + const prefix = Users.isLocalUser(user) ? 'local' : 'remote'; + this.commit({ + [`${prefix}.count`]: 1, }, note.userId); } } diff --git a/packages/backend/src/services/chart/charts/test-grouped.ts b/packages/backend/src/services/chart/charts/test-grouped.ts index c851d2df0..5f0b1aafd 100644 --- a/packages/backend/src/services/chart/charts/test-grouped.ts +++ b/packages/backend/src/services/chart/charts/test-grouped.ts @@ -1,15 +1,12 @@ import autobind from 'autobind-decorator'; -import Chart, { Obj, DeepPartial } from '../core'; -import { SchemaType } from '@/misc/schema'; +import Chart, { KVs } from '../core'; import { name, schema } from './entities/test-grouped'; -type TestGroupedLog = SchemaType; - /** * For testing */ // eslint-disable-next-line import/no-default-export -export default class TestGroupedChart extends Chart { +export default class TestGroupedChart extends Chart { private total = {} as Record; constructor() { @@ -17,31 +14,9 @@ export default class TestGroupedChart extends Chart { } @autobind - protected genNewLog(latest: TestGroupedLog): DeepPartial { + protected async queryCurrentState(group: string): Promise>> { return { - foo: { - total: latest.foo.total, - }, - }; - } - - @autobind - protected aggregate(logs: TestGroupedLog[]): TestGroupedLog { - return { - foo: { - total: logs[0].foo.total, - inc: logs.reduce((a, b) => a + b.foo.inc, 0), - dec: logs.reduce((a, b) => a + b.foo.dec, 0), - }, - }; - } - - @autobind - protected async fetchActual(group: string): Promise> { - return { - foo: { - total: this.total[group], - }, + 'foo.total': this.total[group], }; } @@ -49,14 +24,11 @@ export default class TestGroupedChart extends Chart { public async increment(group: string): Promise { if (this.total[group] == null) this.total[group] = 0; - const update: Obj = {}; - - update.total = 1; - update.inc = 1; this.total[group]++; - await this.inc({ - foo: update, + await this.commit({ + 'foo.total': 1, + 'foo.inc': 1, }, group); } } diff --git a/packages/backend/src/services/chart/charts/test-intersection.ts b/packages/backend/src/services/chart/charts/test-intersection.ts new file mode 100644 index 000000000..c6ba71a95 --- /dev/null +++ b/packages/backend/src/services/chart/charts/test-intersection.ts @@ -0,0 +1,32 @@ +import autobind from 'autobind-decorator'; +import Chart, { KVs } from '../core'; +import { name, schema } from './entities/test-intersection'; + +/** + * For testing + */ +// eslint-disable-next-line import/no-default-export +export default class TestIntersectionChart extends Chart { + constructor() { + super(name, schema); + } + + @autobind + protected async queryCurrentState(): Promise>> { + return {}; + } + + @autobind + public async addA(key: string): Promise { + await this.commit({ + a: [key], + }); + } + + @autobind + public async addB(key: string): Promise { + await this.commit({ + b: [key], + }); + } +} diff --git a/packages/backend/src/services/chart/charts/test-unique.ts b/packages/backend/src/services/chart/charts/test-unique.ts index 3564f675a..e67036ace 100644 --- a/packages/backend/src/services/chart/charts/test-unique.ts +++ b/packages/backend/src/services/chart/charts/test-unique.ts @@ -1,39 +1,24 @@ import autobind from 'autobind-decorator'; -import Chart, { DeepPartial } from '../core'; -import { SchemaType } from '@/misc/schema'; +import Chart, { KVs } from '../core'; import { name, schema } from './entities/test-unique'; -type TestUniqueLog = SchemaType; - /** * For testing */ // eslint-disable-next-line import/no-default-export -export default class TestUniqueChart extends Chart { +export default class TestUniqueChart extends Chart { constructor() { super(name, schema); } @autobind - protected genNewLog(latest: TestUniqueLog): DeepPartial { - return {}; - } - - @autobind - protected aggregate(logs: TestUniqueLog[]): TestUniqueLog { - return { - foo: logs.reduce((a, b) => a.concat(b.foo), [] as TestUniqueLog['foo']), - }; - } - - @autobind - protected async fetchActual(): Promise> { + protected async queryCurrentState(): Promise>> { return {}; } @autobind public async uniqueIncrement(key: string): Promise { - await this.inc({ + await this.commit({ foo: [key], }); } diff --git a/packages/backend/src/services/chart/charts/test.ts b/packages/backend/src/services/chart/charts/test.ts index 06add7ede..878acd51b 100644 --- a/packages/backend/src/services/chart/charts/test.ts +++ b/packages/backend/src/services/chart/charts/test.ts @@ -1,15 +1,12 @@ import autobind from 'autobind-decorator'; -import Chart, { Obj, DeepPartial } from '../core'; -import { SchemaType } from '@/misc/schema'; +import Chart, { KVs } from '../core'; import { name, schema } from './entities/test'; -type TestLog = SchemaType; - /** * For testing */ // eslint-disable-next-line import/no-default-export -export default class TestChart extends Chart { +export default class TestChart extends Chart { public total = 0; // publicãĢするぎはテ゚トぎため constructor() { @@ -17,57 +14,29 @@ export default class TestChart extends Chart { } @autobind - protected genNewLog(latest: TestLog): DeepPartial { + protected async queryCurrentState(): Promise>> { return { - foo: { - total: latest.foo.total, - }, - }; - } - - @autobind - protected aggregate(logs: TestLog[]): TestLog { - return { - foo: { - total: logs[0].foo.total, - inc: logs.reduce((a, b) => a + b.foo.inc, 0), - dec: logs.reduce((a, b) => a + b.foo.dec, 0), - }, - }; - } - - @autobind - protected async fetchActual(): Promise> { - return { - foo: { - total: this.total, - }, + 'foo.total': this.total, }; } @autobind public async increment(): Promise { - const update: Obj = {}; - - update.total = 1; - update.inc = 1; this.total++; - await this.inc({ - foo: update, + await this.commit({ + 'foo.total': 1, + 'foo.inc': 1, }); } @autobind public async decrement(): Promise { - const update: Obj = {}; - - update.total = -1; - update.dec = 1; this.total--; - await this.inc({ - foo: update, + await this.commit({ + 'foo.total': -1, + 'foo.dec': 1, }); } } diff --git a/packages/backend/src/services/chart/charts/users.ts b/packages/backend/src/services/chart/charts/users.ts index c36c6cd97..50fca3a8d 100644 --- a/packages/backend/src/services/chart/charts/users.ts +++ b/packages/backend/src/services/chart/charts/users.ts @@ -1,80 +1,40 @@ import autobind from 'autobind-decorator'; -import Chart, { Obj, DeepPartial } from '../core'; -import { SchemaType } from '@/misc/schema'; +import Chart, { KVs } from '../core'; import { Users } from '@/models/index'; import { Not, IsNull } from 'typeorm'; import { User } from '@/models/entities/user'; import { name, schema } from './entities/users'; -type UsersLog = SchemaType; - /** * ãƒĻãƒŧã‚ļãƒŧ数ãĢé–ĸするチãƒŖãƒŧト */ // eslint-disable-next-line import/no-default-export -export default class UsersChart extends Chart { +export default class UsersChart extends Chart { constructor() { super(name, schema); } @autobind - protected genNewLog(latest: UsersLog): DeepPartial { - return { - local: { - total: latest.local.total, - }, - remote: { - total: latest.remote.total, - }, - }; - } - - @autobind - protected aggregate(logs: UsersLog[]): UsersLog { - return { - local: { - total: logs[0].local.total, - inc: logs.reduce((a, b) => a + b.local.inc, 0), - dec: logs.reduce((a, b) => a + b.local.dec, 0), - }, - remote: { - total: logs[0].remote.total, - inc: logs.reduce((a, b) => a + b.remote.inc, 0), - dec: logs.reduce((a, b) => a + b.remote.dec, 0), - }, - }; - } - - @autobind - protected async fetchActual(): Promise> { + protected async queryCurrentState(): Promise>> { const [localCount, remoteCount] = await Promise.all([ Users.count({ host: null }), Users.count({ host: Not(IsNull()) }), ]); return { - local: { - total: localCount, - }, - remote: { - total: remoteCount, - }, + 'local.total': localCount, + 'remote.total': remoteCount, }; } @autobind public async update(user: { id: User['id'], host: User['host'] }, isAdditional: boolean): Promise { - const update: Obj = {}; + const prefix = Users.isLocalUser(user) ? 'local' : 'remote'; - update.total = isAdditional ? 1 : -1; - if (isAdditional) { - update.inc = 1; - } else { - update.dec = 1; - } - - await this.inc({ - [Users.isLocalUser(user) ? 'local' : 'remote']: update, + await this.commit({ + [`${prefix}.total`]: isAdditional ? 1 : -1, + [`${prefix}.inc`]: isAdditional ? 1 : 0, + [`${prefix}.dec`]: isAdditional ? 0 : 1, }); } } diff --git a/packages/backend/src/services/chart/core.ts b/packages/backend/src/services/chart/core.ts index e406449f4..5888e1a14 100644 --- a/packages/backend/src/services/chart/core.ts +++ b/packages/backend/src/services/chart/core.ts @@ -7,24 +7,19 @@ import * as nestedProperty from 'nested-property'; import autobind from 'autobind-decorator'; import Logger from '../logger'; -import { Schema } from '@/misc/schema'; import { EntitySchema, getRepository, Repository, LessThan, Between } from 'typeorm'; import { dateUTC, isTimeSame, isTimeBefore, subtractTime, addTime } from '@/prelude/time'; import { getChartInsertLock } from '@/misc/app-lock'; const logger = new Logger('chart', 'white', process.env.NODE_ENV !== 'test'); -export type Obj = { [key: string]: any }; +const columnPrefix = '___' as const; +const uniqueTempColumnPrefix = 'unique_temp___' as const; +const columnDot = '_' as const; -export type DeepPartial = { - [P in keyof T]?: DeepPartial; -}; +type KeyToColumnName = T extends `${infer R1}.${infer R2}` ? `${R1}${typeof columnDot}${KeyToColumnName}` : T; -type ArrayValue = { - [P in keyof T]: T[P] extends number ? T[P][] : ArrayValue; -}; - -type Log = { +type RawRecord = { id: number; /** @@ -36,6 +31,10 @@ type Log = { * 集計æ—Ĩ時ぎUnixã‚ŋイム゚ã‚ŋãƒŗプ(į§’) */ date: number; +} & { + [K in keyof S as `${typeof uniqueTempColumnPrefix}${KeyToColumnName}`]: S[K]['uniqueIncrement'] extends true ? string[] : never; +} & { + [K in keyof S as `${typeof columnPrefix}${KeyToColumnName}`]: number; }; const camelToSnake = (str: string): string => { @@ -44,123 +43,74 @@ const camelToSnake = (str: string): string => { const removeDuplicates = (array: any[]) => Array.from(new Set(array)); +type Schema = Record; + + range?: 'big' | 'small' | 'medium'; + + // previousãĒ値をåŧ•ãįļ™ãã‹ãŠã†ã‹ + accumulate?: boolean; +}>; + +type Commit = { + [K in keyof S]?: S[K]['uniqueIncrement'] extends true ? string[] : number; +}; + +export type KVs = { + [K in keyof S]: number; +}; + +type ChartResult = { + [P in keyof T]: number[]; +}; + /** * 様々ãĒチãƒŖãƒŧトぎįŽĄį†ã‚’司るクナ゚ */ // eslint-disable-next-line import/no-default-export -export default abstract class Chart> { - private static readonly columnPrefix = '___'; - private static readonly columnDot = '_'; +export default abstract class Chart { + public schema: T; private name: string; private buffer: { - diff: DeepPartial; + diff: Commit; group: string | null; }[] = []; - public schema: Schema; - protected repositoryForHour: Repository; - protected repositoryForDay: Repository; + protected repositoryForHour: Repository>; + protected repositoryForDay: Repository>; - protected abstract genNewLog(latest: T): DeepPartial; - - /** - * @param logs æ—Ĩ時が新しい斚が先頭 - */ - protected abstract aggregate(logs: T[]): T; - - protected abstract fetchActual(group: string | null): Promise>; + protected abstract queryCurrentState(group: string | null): Promise>>; @autobind - private static convertSchemaToFlatColumnDefinitions(schema: Schema) { - const columns = {} as Record; - const flatColumns = (x: Obj, path?: string) => { - for (const [k, v] of Object.entries(x)) { - const p = path ? `${path}${this.columnDot}${k}` : k; - if (v.type === 'object') { - flatColumns(v.properties, p); - } else if (v.type === 'number') { - columns[this.columnPrefix + p] = { - type: 'bigint', - }; - } else if (v.type === 'array' && v.items.type === 'string') { - columns[this.columnPrefix + p] = { - type: 'varchar', - array: true, - }; - } + private static convertSchemaToColumnDefinitions(schema: Schema): Record { + const columns = {} as Record; + for (const [k, v] of Object.entries(schema)) { + const name = k.replaceAll('.', columnDot); + const type = v.range === 'big' ? 'bigint' : v.range === 'small' ? 'smallint' : 'integer'; + if (v.uniqueIncrement) { + columns[uniqueTempColumnPrefix + name] = { + type: 'varchar', + array: true, + default: '{}', + }; + columns[columnPrefix + name] = { + type, + default: 0, + }; + } else { + columns[columnPrefix + name] = { + type, + default: 0, + }; } - }; - flatColumns(schema.properties!); + } return columns; } @autobind - private static convertFlattenColumnsToObject(x: Record): Record { - const obj = {} as Record; - for (const k of Object.keys(x).filter(k => k.startsWith(Chart.columnPrefix))) { - // now k is ___x_y_z - const path = k.substr(Chart.columnPrefix.length).split(Chart.columnDot).join('.'); - nestedProperty.set(obj, path, x[k]); - } - return obj; - } - - @autobind - private static convertObjectToFlattenColumns(x: Record) { - const columns = {} as Record; - const flatten = (x: Obj, path?: string) => { - for (const [k, v] of Object.entries(x)) { - const p = path ? `${path}${this.columnDot}${k}` : k; - if (typeof v === 'object' && !Array.isArray(v)) { - flatten(v, p); - } else { - columns[this.columnPrefix + p] = v; - } - } - }; - flatten(x); - return columns; - } - - @autobind - private static countUniqueFields(x: Record) { - const exec = (x: Obj) => { - const res = {} as Record; - for (const [k, v] of Object.entries(x)) { - if (typeof v === 'object' && !Array.isArray(v)) { - res[k] = exec(v); - } else if (Array.isArray(v)) { - res[k] = Array.from(new Set(v)).length; - } else { - res[k] = v; - } - } - return res; - }; - return exec(x); - } - - @autobind - private static convertQuery(diff: Record) { - const query: Record string> = {}; - - for (const [k, v] of Object.entries(diff)) { - if (typeof v === 'number') { - if (v > 0) query[k] = () => `"${k}" + ${v}`; - if (v < 0) query[k] = () => `"${k}" - ${Math.abs(v)}`; - } else if (Array.isArray(v)) { - // TODO: item が文字列äģĨ外ぎ場合も寞åŋœ - // TODO: item をSQLã‚¨ã‚šã‚ąãƒŧプ - const items = v.map(item => `"${item}"`).join(','); - query[k] = () => `array_cat("${k}", '{${items}}'::varchar[])`; - } - } - - return query; - } - - @autobind - private static dateToTimestamp(x: Date): Log['date'] { + private static dateToTimestamp(x: Date): number { return Math.floor(x.getTime() / 1000); } @@ -207,7 +157,7 @@ export default abstract class Chart> { length: 128, }, } : {}), - ...Chart.convertSchemaToFlatColumnDefinitions(schema), + ...Chart.convertSchemaToColumnDefinitions(schema), }, indices: [{ columns: grouped ? ['date', 'group'] : ['date'], @@ -233,37 +183,39 @@ export default abstract class Chart> { }; } - constructor(name: string, schema: Schema, grouped = false) { + constructor(name: string, schema: T, grouped = false) { this.name = name; this.schema = schema; const { hour, day } = Chart.schemaToEntity(name, schema, grouped); - this.repositoryForHour = getRepository(hour); - this.repositoryForDay = getRepository(day); + this.repositoryForHour = getRepository>(hour); + this.repositoryForDay = getRepository>(day); } @autobind - private getNewLog(latest: T | null): T { - const log = latest ? this.genNewLog(latest) : {}; - const flatColumns = (x: Obj, path?: string) => { - for (const [k, v] of Object.entries(x)) { - const p = path ? `${path}.${k}` : k; - if (v.type === 'object') { - flatColumns(v.properties, p); - } else { - if (nestedProperty.get(log, p) == null) { - const emptyValue = v.type === 'number' ? 0 : []; - nestedProperty.set(log, p, emptyValue); - } - } + private convertRawRecord(x: RawRecord): KVs { + const kvs = {} as KVs; + for (const k of Object.keys(x).filter(k => k.startsWith(columnPrefix))) { + kvs[k.substr(columnPrefix.length).split(columnDot).join('.')] = x[k]; + } + return kvs; + } + + @autobind + private getNewLog(latest: KVs | null): KVs { + const log = {} as Record; + for (const [k, v] of Object.entries(this.schema)) { + if (v.accumulate && latest) { + log[k] = latest[k]; + } else { + log[k] = 0; } - }; - flatColumns(this.schema.properties!); - return log as T; + } + return log as KVs; } @autobind - private getLatestLog(group: string | null, span: 'hour' | 'day'): Promise { + private getLatestLog(group: string | null, span: 'hour' | 'day'): Promise | null> { const repository = span === 'hour' ? this.repositoryForHour : span === 'day' ? this.repositoryForDay : @@ -282,7 +234,7 @@ export default abstract class Chart> { * įžåœ¨(=äģŠãŽHour or Day)ぎログをデãƒŧã‚ŋベãƒŧ゚からæŽĸしãĻ、あればそれをčŋ”し、ãĒければäŊœæˆã—ãĻčŋ”しぞす。 */ @autobind - private async claimCurrentLog(group: string | null, span: 'hour' | 'day'): Promise { + private async claimCurrentLog(group: string | null, span: 'hour' | 'day'): Promise> { const [y, m, d, h] = Chart.getCurrentDate(); const current = dateUTC( @@ -306,8 +258,8 @@ export default abstract class Chart> { return currentLog; } - let log: Log; - let data: T; + let log: RawRecord; + let data: KVs; // é›†č¨ˆæœŸé–“ãŒå¤‰ã‚ãŖãĻから、初めãĻぎチãƒŖãƒŧト更新ãĒら // 最も最čŋ‘ぎログを持ãŖãĻくる @@ -318,10 +270,8 @@ export default abstract class Chart> { const latest = await this.getLatestLog(group, span); if (latest != null) { - const obj = Chart.convertFlattenColumnsToObject(latest) as T; - // įŠēログデãƒŧã‚ŋをäŊœæˆ - data = this.getNewLog(obj); + data = this.getNewLog(this.convertRawRecord(latest)); } else { // ログが存在しãĒかãŖたら // (Misskeyイãƒŗã‚šã‚ŋãƒŗã‚šã‚’åģēãĻãĻ初めãĻぎチãƒŖãƒŧト更新時ãĒお) @@ -346,11 +296,17 @@ export default abstract class Chart> { // ログがあればそれをčŋ”しãĻįĩ‚äē† if (currentLog != null) return currentLog; + const columns = {} as Record; + for (const [k, v] of Object.entries(data)) { + const name = k.replaceAll('.', columnDot); + columns[columnPrefix + name] = v; + } + // 新čĻãƒ­ã‚°æŒŋå…Ĩ log = await repository.insert({ date: date, ...(group ? { group: group } : {}), - ...Chart.convertObjectToFlattenColumns(data), + ...columns, }).then(x => repository.findOneOrFail(x.identifiers[0])); logger.info(`${this.name + (group ? `:${group}` : '')}(${span}): New commit created`); @@ -362,7 +318,10 @@ export default abstract class Chart> { } @autobind - protected commit(diff: DeepPartial, group: string | null = null): void { + protected commit(diff: Commit, group: string | null = null): void { + for (const [k, v] of Object.entries(diff)) { + if (v == null || v === 0 || (Array.isArray(v) && v.length === 0)) delete diff[k]; + } this.buffer.push({ diff, group, }); @@ -381,13 +340,11 @@ export default abstract class Chart> { // そぎログはæœŦæĨは 01:00~ ぎログとしãĻDBãĢäŋå­˜ã•ã‚ŒãĻæŦ˛ã—いぎãĢ、02:00~ ãŽãƒ­ã‚°æ‰ąã„ãĢãĒãŖãĻしぞう。 // これを回éŋするためぎ原čŖ…ã¯č¤‡é›‘ãĢãĒりそうãĒため、一æ—Ļäŋį•™ã€‚ - const update = async (logHour: Log, logDay: Log): Promise => { + const update = async (logHour: RawRecord, logDay: RawRecord): Promise => { const finalDiffs = {} as Record; for (const diff of this.buffer.filter(q => q.group == null || (q.group === logHour.group)).map(q => q.diff)) { - const columns = Chart.convertObjectToFlattenColumns(diff); - - for (const [k, v] of Object.entries(columns)) { + for (const [k, v] of Object.entries(diff)) { if (finalDiffs[k] == null) { finalDiffs[k] = v; } else { @@ -400,18 +357,72 @@ export default abstract class Chart> { } } - const query = Chart.convertQuery(finalDiffs); + const queryForHour: Record string)> = {}; + const queryForDay: Record string)> = {}; + for (const [k, v] of Object.entries(finalDiffs)) { + if (typeof v === 'number') { + const name = columnPrefix + k.replaceAll('.', columnDot); + if (v > 0) queryForHour[name] = () => `"${name}" + ${v}`; + if (v < 0) queryForHour[name] = () => `"${name}" - ${Math.abs(v)}`; + if (v > 0) queryForDay[name] = () => `"${name}" + ${v}`; + if (v < 0) queryForDay[name] = () => `"${name}" - ${Math.abs(v)}`; + } else if (Array.isArray(v) && v.length > 0) { // ãƒĻニãƒŧクイãƒŗクãƒĒãƒĄãƒŗト + const tempColumnName = uniqueTempColumnPrefix + k.replaceAll('.', columnDot); + // TODO: item をSQLã‚¨ã‚šã‚ąãƒŧプ + const itemsForHour = v.filter(item => !logHour[tempColumnName].includes(item)).map(item => `"${item}"`); + const itemsForDay = v.filter(item => !logDay[tempColumnName].includes(item)).map(item => `"${item}"`); + if (itemsForHour.length > 0) queryForHour[tempColumnName] = () => `array_cat("${tempColumnName}", '{${itemsForHour.join(',')}}'::varchar[])`; + if (itemsForDay.length > 0) queryForDay[tempColumnName] = () => `array_cat("${tempColumnName}", '{${itemsForDay.join(',')}}'::varchar[])`; + } + } + + // bake unique count + for (const [k, v] of Object.entries(finalDiffs)) { + if (this.schema[k].uniqueIncrement) { + const name = columnPrefix + k.replaceAll('.', columnDot); + const tempColumnName = uniqueTempColumnPrefix + k.replaceAll('.', columnDot); + queryForHour[name] = new Set([...v, ...logHour[tempColumnName]]).size; + queryForDay[name] = new Set([...v, ...logDay[tempColumnName]]).size; + } + } + + // compute intersection + // TODO: intersectionãĢ指厚されたã‚ĢナムがintersectionだãŖた場合ぎ寞åŋœ + for (const [k, v] of Object.entries(this.schema)) { + const intersection = v.intersection; + if (intersection) { + const name = columnPrefix + k.replaceAll('.', columnDot); + const firstKey = intersection[0]; + const firstTempColumnName = uniqueTempColumnPrefix + firstKey.replaceAll('.', columnDot); + const currentValuesForHour = new Set([...(finalDiffs[firstKey] ?? []), ...logHour[firstTempColumnName]]); + const currentValuesForDay = new Set([...(finalDiffs[firstKey] ?? []), ...logDay[firstTempColumnName]]); + for (let i = 1; i < intersection.length; i++) { + const targetKey = intersection[i]; + const targetTempColumnName = uniqueTempColumnPrefix + targetKey.replaceAll('.', columnDot); + const targetValuesForHour = new Set([...(finalDiffs[targetKey] ?? []), ...logHour[targetTempColumnName]]); + const targetValuesForDay = new Set([...(finalDiffs[targetKey] ?? []), ...logDay[targetTempColumnName]]); + currentValuesForHour.forEach(v => { + if (!targetValuesForHour.has(v)) currentValuesForHour.delete(v); + }); + currentValuesForDay.forEach(v => { + if (!targetValuesForDay.has(v)) currentValuesForDay.delete(v); + }); + } + queryForHour[name] = currentValuesForHour.size; + queryForDay[name] = currentValuesForDay.size; + } + } // ログ更新 await Promise.all([ this.repositoryForHour.createQueryBuilder() .update() - .set(query) + .set(queryForHour) .where('id = :id', { id: logHour.id }) .execute(), this.repositoryForDay.createQueryBuilder() .update() - .set(query) + .set(queryForDay) .where('id = :id', { id: logDay.id }) .execute(), ]); @@ -435,18 +446,28 @@ export default abstract class Chart> { @autobind public async resync(group: string | null = null): Promise { - const data = await this.fetchActual(group); + const data = await this.queryCurrentState(group); - const update = async (logHour: Log, logDay: Log): Promise => { + const columns = {} as Record; + for (const [k, v] of Object.entries(data)) { + const name = k.replaceAll('.', columnDot); + columns[columnPrefix + name] = v; + } + + if (Object.keys(columns).length === 0) { + return; + } + + const update = async (logHour: RawRecord, logDay: RawRecord): Promise => { await Promise.all([ this.repositoryForHour.createQueryBuilder() .update() - .set(Chart.convertObjectToFlattenColumns(data)) + .set(columns as any) .where('id = :id', { id: logHour.id }) .execute(), this.repositoryForDay.createQueryBuilder() .update() - .set(Chart.convertObjectToFlattenColumns(data)) + .set(columns as any) .where('id = :id', { id: logDay.id }) .execute(), ]); @@ -460,12 +481,43 @@ export default abstract class Chart> { } @autobind - protected async inc(inc: DeepPartial, group: string | null = null): Promise { - await this.commit(inc, group); + public async clean(): Promise { + const current = dateUTC(Chart.getCurrentDate()); + + // 一æ—ĨäģĨ上前かつ三æ—ĨäģĨ内 + const gt = Chart.dateToTimestamp(current) - (60 * 60 * 24 * 3); + const lt = Chart.dateToTimestamp(current) - (60 * 60 * 24); + + const columns = {} as Record; + for (const [k, v] of Object.entries(this.schema)) { + if (v.uniqueIncrement) { + const name = k.replaceAll('.', columnDot); + columns[uniqueTempColumnPrefix + name] = []; + } + } + + if (Object.keys(columns).length === 0) { + return; + } + + await Promise.all([ + this.repositoryForHour.createQueryBuilder() + .update() + .set(columns as any) + .where('date > :gt', { gt }) + .andWhere('date < :lt', { lt }) + .execute(), + this.repositoryForDay.createQueryBuilder() + .update() + .set(columns as any) + .where('date > :gt', { gt }) + .andWhere('date < :lt', { lt }) + .execute(), + ]); } @autobind - public async getChart(span: 'hour' | 'day', amount: number, cursor: Date | null, group: string | null = null): Promise> { + public async getChartRaw(span: 'hour' | 'day', amount: number, cursor: Date | null, group: string | null = null): Promise> { const [y, m, d, h, _m, _s, _ms] = cursor ? Chart.parseDate(subtractTime(addTime(cursor, 1, span), 1)) : Chart.getCurrentDate(); const [y2, m2, d2, h2] = cursor ? Chart.parseDate(addTime(cursor, 1, span)) : [] as never; @@ -526,7 +578,7 @@ export default abstract class Chart> { } } - const chart: T[] = []; + const chart: KVs[] = []; for (let i = (amount - 1); i >= 0; i--) { const current = @@ -537,17 +589,16 @@ export default abstract class Chart> { const log = logs.find(l => isTimeSame(new Date(l.date * 1000), current)); if (log) { - const data = Chart.convertFlattenColumnsToObject(log); - chart.unshift(Chart.countUniqueFields(data) as T); + chart.unshift(this.convertRawRecord(log)); } else { // 隙間埋め const latest = logs.find(l => isTimeBefore(new Date(l.date * 1000), current)); - const data = latest ? Chart.convertFlattenColumnsToObject(latest) as T : null; - chart.unshift(Chart.countUniqueFields(this.getNewLog(data)) as T); + const data = latest ? this.convertRawRecord(latest) : null; + chart.unshift(this.getNewLog(data)); } } - const res = {} as Record; + const res = {} as ChartResult; /** * [{ foo: 1, bar: 5 }, { foo: 2, bar: 6 }, { foo: 3, bar: 7 }] @@ -555,36 +606,26 @@ export default abstract class Chart> { * { foo: [1, 2, 3], bar: [5, 6, 7] } * ãĢする */ - const compact = (x: Obj, path?: string): void => { - for (const [k, v] of Object.entries(x)) { - const p = path ? `${path}.${k}` : k; - if (typeof v === 'object' && !Array.isArray(v)) { - compact(v, p); + for (const record of chart) { + for (const [k, v] of Object.entries(record)) { + if (res[k]) { + res[k].push(v); } else { - const values = chart.map(s => nestedProperty.get(s, p)); - nestedProperty.set(res, p, values); + res[k] = [v]; } } - }; - - compact(chart[0]); - - return res as ArrayValue; - } -} - -export function convertLog(logSchema: Schema): Schema { - const v: Schema = JSON.parse(JSON.stringify(logSchema)); // copy - if (v.type === 'number') { - v.type = 'array'; - v.items = { - type: 'number' as const, - optional: false as const, nullable: false as const, - }; - } else if (v.type === 'object') { - for (const k of Object.keys(v.properties!)) { - v.properties![k] = convertLog(v.properties![k]); } + + return res; + } + + @autobind + public async getChart(span: 'hour' | 'day', amount: number, cursor: Date | null, group: string | null = null): Promise> { + const result = await this.getChartRaw(span, amount, cursor, group); + const object = {}; + for (const [k, v] of Object.entries(result)) { + nestedProperty.set(object, k, v); + } + return object; } - return v; } diff --git a/packages/backend/src/services/chart/entities.ts b/packages/backend/src/services/chart/entities.ts index dedbd4708..569b32855 100644 --- a/packages/backend/src/services/chart/entities.ts +++ b/packages/backend/src/services/chart/entities.ts @@ -1,7 +1,6 @@ import { entity as FederationChart } from './charts/entities/federation'; import { entity as NotesChart } from './charts/entities/notes'; import { entity as UsersChart } from './charts/entities/users'; -import { entity as NetworkChart } from './charts/entities/network'; import { entity as ActiveUsersChart } from './charts/entities/active-users'; import { entity as InstanceChart } from './charts/entities/instance'; import { entity as PerUserNotesChart } from './charts/entities/per-user-notes'; @@ -10,12 +9,12 @@ import { entity as PerUserReactionsChart } from './charts/entities/per-user-reac import { entity as HashtagChart } from './charts/entities/hashtag'; import { entity as PerUserFollowingChart } from './charts/entities/per-user-following'; import { entity as PerUserDriveChart } from './charts/entities/per-user-drive'; +import { entity as ApRequestChart } from './charts/entities/ap-request'; export const entities = [ FederationChart.hour, FederationChart.day, NotesChart.hour, NotesChart.day, UsersChart.hour, UsersChart.day, - NetworkChart.hour, NetworkChart.day, ActiveUsersChart.hour, ActiveUsersChart.day, InstanceChart.hour, InstanceChart.day, PerUserNotesChart.hour, PerUserNotesChart.day, @@ -24,4 +23,5 @@ export const entities = [ HashtagChart.hour, HashtagChart.day, PerUserFollowingChart.hour, PerUserFollowingChart.day, PerUserDriveChart.hour, PerUserDriveChart.day, + ApRequestChart.hour, ApRequestChart.day, ]; diff --git a/packages/backend/src/services/chart/index.ts b/packages/backend/src/services/chart/index.ts index 0b9887b36..1c0f7aadc 100644 --- a/packages/backend/src/services/chart/index.ts +++ b/packages/backend/src/services/chart/index.ts @@ -3,7 +3,6 @@ import { beforeShutdown } from '@/misc/before-shutdown'; import FederationChart from './charts/federation'; import NotesChart from './charts/notes'; import UsersChart from './charts/users'; -import NetworkChart from './charts/network'; import ActiveUsersChart from './charts/active-users'; import InstanceChart from './charts/instance'; import PerUserNotesChart from './charts/per-user-notes'; @@ -12,11 +11,11 @@ import PerUserReactionsChart from './charts/per-user-reactions'; import HashtagChart from './charts/hashtag'; import PerUserFollowingChart from './charts/per-user-following'; import PerUserDriveChart from './charts/per-user-drive'; +import ApRequestChart from './charts/ap-request'; export const federationChart = new FederationChart(); export const notesChart = new NotesChart(); export const usersChart = new UsersChart(); -export const networkChart = new NetworkChart(); export const activeUsersChart = new ActiveUsersChart(); export const instanceChart = new InstanceChart(); export const perUserNotesChart = new PerUserNotesChart(); @@ -25,12 +24,12 @@ export const perUserReactionsChart = new PerUserReactionsChart(); export const hashtagChart = new HashtagChart(); export const perUserFollowingChart = new PerUserFollowingChart(); export const perUserDriveChart = new PerUserDriveChart(); +export const apRequestChart = new ApRequestChart(); const charts = [ federationChart, notesChart, usersChart, - networkChart, activeUsersChart, instanceChart, perUserNotesChart, @@ -39,6 +38,7 @@ const charts = [ hashtagChart, perUserFollowingChart, perUserDriveChart, + apRequestChart, ]; // 20分おきãĢãƒĄãƒĸãƒĒæƒ…å ąã‚’DBãĢ書きčžŧãŋ diff --git a/packages/backend/src/services/drive/add-file.ts b/packages/backend/src/services/drive/add-file.ts index a89e068f4..9a8a54390 100644 --- a/packages/backend/src/services/drive/add-file.ts +++ b/packages/backend/src/services/drive/add-file.ts @@ -160,8 +160,8 @@ export async function generateAlts(path: string, type: string, generateWeb: bool webpublic: null, thumbnail, }; - } catch (e) { - logger.warn(`GenerateVideoThumbnail failed: ${e}`); + } catch (err) { + logger.warn(`GenerateVideoThumbnail failed: ${err}`); return { webpublic: null, thumbnail: null, @@ -191,8 +191,8 @@ export async function generateAlts(path: string, type: string, generateWeb: bool thumbnail: null, }; } - } catch (e) { - logger.warn(`sharp failed: ${e}`); + } catch (err) { + logger.warn(`sharp failed: ${err}`); return { webpublic: null, thumbnail: null, @@ -215,8 +215,8 @@ export async function generateAlts(path: string, type: string, generateWeb: bool } else { logger.debug(`web image not created (not an required image)`); } - } catch (e) { - logger.warn(`web image not created (an error occured)`, e); + } catch (err) { + logger.warn(`web image not created (an error occured)`, err as Error); } } else { logger.info(`web image not created (from remote)`); @@ -234,8 +234,8 @@ export async function generateAlts(path: string, type: string, generateWeb: bool } else { logger.debug(`thumbnail not created (not an required file)`); } - } catch (e) { - logger.warn(`thumbnail not created (an error occured)`, e); + } catch (err) { + logger.warn(`thumbnail not created (an error occured)`, err as Error); } // #endregion thumbnail @@ -451,9 +451,9 @@ export async function addFile({ file.storedInternal = false; file = await DriveFiles.insert(file).then(x => DriveFiles.findOneOrFail(x.identifiers[0])); - } catch (e) { + } catch (err) { // duplicate key error (when already registered) - if (isDuplicateKeyValueError(e)) { + if (isDuplicateKeyValueError(err)) { logger.info(`already registered ${file.uri}`); file = await DriveFiles.findOne({ @@ -461,8 +461,8 @@ export async function addFile({ userId: user ? user.id : null, }) as DriveFile; } else { - logger.error(e); - throw e; + logger.error(err as Error); + throw err; } } } else { diff --git a/packages/backend/src/services/logger.ts b/packages/backend/src/services/logger.ts index 626cc6b44..1962088b6 100644 --- a/packages/backend/src/services/logger.ts +++ b/packages/backend/src/services/logger.ts @@ -1,6 +1,6 @@ import * as cluster from 'cluster'; import * as chalk from 'chalk'; -import * as dateformat from 'dateformat'; +import { format as dateFormat } from 'date-fns'; import { envOption } from '../env'; import config from '@/config/index'; @@ -57,7 +57,7 @@ export default class Logger { return; } - const time = dateformat(new Date(), 'HH:MM:ss'); + const time = dateFormat(new Date(), 'HH:mm:ss'); const worker = cluster.isPrimary ? '*' : cluster.worker.id; const l = level === 'error' ? important ? chalk.bgRed.white('ERR ') : chalk.red('ERR ') : @@ -116,7 +116,7 @@ export default class Logger { } public debug(message: string, data?: Record | null, important = false): void { // デバッグį”¨ãĢäŊŋう(開į™ē者ãĢåŋ…čĻã ãŒåˆŠį”¨č€…ãĢ不čĻãĒæƒ…å ą) - if (process.env.NODE_ENV != 'production' || envOption.verbose) { + if (process.env.NODE_ENV !== 'production' || envOption.verbose) { this.log('debug', message, data, important); } } diff --git a/packages/backend/src/services/note/create.ts b/packages/backend/src/services/note/create.ts index fb22bd659..7a4c2cef1 100644 --- a/packages/backend/src/services/note/create.ts +++ b/packages/backend/src/services/note/create.ts @@ -59,7 +59,7 @@ class NotificationManager { if (exist) { // ã€ŒãƒĄãƒŗã‚ˇãƒ§ãƒŗされãĻいるかつčŋ”äŋĄã•ã‚ŒãĻã„ã‚‹ã€å ´åˆã¯ã€ãƒĄãƒŗã‚ˇãƒ§ãƒŗとしãĻぎ通įŸĨではãĒくčŋ”äŋĄã¨ã—ãĻぎ通įŸĨãĢする - if (reason != 'mention') { + if (reason !== 'mention') { exist.reason = reason; } } else { @@ -111,7 +111,7 @@ type Option = { app?: App | null; }; -export default async (user: { id: User['id']; username: User['username']; host: User['host']; isSilenced: User['isSilenced']; }, data: Option, silent = false) => new Promise(async (res, rej) => { +export default async (user: { id: User['id']; username: User['username']; host: User['host']; isSilenced: User['isSilenced']; createdAt: User['createdAt']; }, data: Option, silent = false) => new Promise(async (res, rej) => { // チãƒŖãƒŗネãƒĢ外ãĢãƒĒãƒ—ãƒŠã‚¤ã—ãŸã‚‰å¯žčąĄãŽã‚šã‚ŗãƒŧプãĢ合わせる // (クナイã‚ĸãƒŗトã‚ĩイドでやãŖãĻã‚‚č‰¯ã„å‡Ļį†ã ã¨æ€ã†ã‘おとりあえずã‚ĩãƒŧバãƒŧã‚ĩイドで) if (data.reply && data.channel && data.reply.channelId !== data.channel.id) { @@ -201,7 +201,7 @@ export default async (user: { id: User['id']; username: User['username']; host: mentionedUsers.push(await Users.findOneOrFail(data.reply.userId)); } - if (data.visibility == 'specified') { + if (data.visibility === 'specified') { if (data.visibleUsers == null) throw new Error('invalid param'); for (const u of data.visibleUsers) { @@ -297,11 +297,10 @@ export default async (user: { id: User['id']; username: User['username']; host: } if (!silent) { - // ロãƒŧã‚ĢãƒĢãƒĻãƒŧã‚ļãƒŧぎチãƒŖãƒŧトはã‚ŋイムナイãƒŗ取垗時ãĢ更新しãĻいるぎでãƒĒãƒĸãƒŧトãƒĻãƒŧã‚ļãƒŧぎ場合だけでよい - if (Users.isRemoteUser(user)) activeUsersChart.update(user); + if (Users.isLocalUser(user)) activeUsersChart.write(user); // æœĒčĒ­é€šįŸĨをäŊœæˆ - if (data.visibility == 'specified') { + if (data.visibility === 'specified') { if (data.visibleUsers == null) throw new Error('invalid param'); for (const u of data.visibleUsers) { @@ -439,7 +438,7 @@ export default async (user: { id: User['id']; username: User['username']; host: async function renderNoteOrRenoteActivity(data: Option, note: Note) { if (data.localOnly) return null; - const content = data.renote && data.text == null && data.poll == null && (data.files == null || data.files.length == 0) + const content = data.renote && data.text == null && data.poll == null && (data.files == null || data.files.length === 0) ? renderAnnounce(data.renote.uri ? data.renote.uri : `${config.url}/notes/${data.renote.id}`, note) : renderCreate(await renderNote(note, false), note); @@ -478,7 +477,7 @@ async function insertNote(user: { id: User['id']; host: User['host']; }, data: O userId: user.id, localOnly: data.localOnly!, visibility: data.visibility as any, - visibleUserIds: data.visibility == 'specified' + visibleUserIds: data.visibility === 'specified' ? data.visibleUsers ? data.visibleUsers.map(u => u.id) : [] @@ -502,7 +501,7 @@ async function insertNote(user: { id: User['id']; host: User['host']; }, data: O insert.mentions = mentionedUsers.map(u => u.id); const profiles = await UserProfiles.find({ userId: In(insert.mentions) }); insert.mentionedRemoteUsers = JSON.stringify(mentionedUsers.filter(u => Users.isRemoteUser(u)).map(u => { - const profile = profiles.find(p => p.userId == u.id); + const profile = profiles.find(p => p.userId === u.id); const url = profile != null ? profile.url : null; return { uri: u.uri, diff --git a/packages/backend/src/services/note/delete.ts b/packages/backend/src/services/note/delete.ts index 64383ee92..77723fe8b 100644 --- a/packages/backend/src/services/note/delete.ts +++ b/packages/backend/src/services/note/delete.ts @@ -39,7 +39,7 @@ export default async function(user: User, note: Note, quiet = false) { let renote: Note | undefined; // if deletd note is renote - if (note.renoteId && note.text == null && !note.hasPoll && (note.fileIds == null || note.fileIds.length == 0)) { + if (note.renoteId && note.text == null && !note.hasPoll && (note.fileIds == null || note.fileIds.length === 0)) { renote = await Notes.findOne({ id: note.renoteId, }); diff --git a/packages/backend/src/services/note/reaction/create.ts b/packages/backend/src/services/note/reaction/create.ts index 47f46419d..c01d43c22 100644 --- a/packages/backend/src/services/note/reaction/create.ts +++ b/packages/backend/src/services/note/reaction/create.ts @@ -76,7 +76,7 @@ export default async (user: { id: User['id']; host: User['host']; }, note: Note, // ã‚Ģã‚šã‚ŋムįĩĩ文字ãƒĒã‚ĸã‚¯ã‚ˇãƒ§ãƒŗだãŖたらįĩĩæ–‡å­—æƒ…å ąã‚‚é€ã‚‹ const decodedReaction = decodeReaction(reaction); - let emoji = await Emojis.findOne({ + const emoji = await Emojis.findOne({ where: { name: decodedReaction.name, host: decodedReaction.host, diff --git a/packages/backend/src/services/note/read.ts b/packages/backend/src/services/note/read.ts index aaf1c5ed7..032f1e84e 100644 --- a/packages/backend/src/services/note/read.ts +++ b/packages/backend/src/services/note/read.ts @@ -52,7 +52,7 @@ export default async function( if (note.user != null) { // たãļんnullãĢãĒることはį„Ąã„はずだけお一åŋœ for (const antenna of myAntennas) { - if (await checkHitAntenna(antenna, note, note.user as any, undefined, Array.from(following))) { + if (await checkHitAntenna(antenna, note, note.user, undefined, Array.from(following))) { readAntennaNotes.push(note); } } diff --git a/packages/backend/src/services/send-email.ts b/packages/backend/src/services/send-email.ts index f5f36148f..1fd406cb6 100644 --- a/packages/backend/src/services/send-email.ts +++ b/packages/backend/src/services/send-email.ts @@ -114,9 +114,9 @@ export async function sendEmail(to: string, subject: string, html: string, text: `, }); - logger.info('Message sent: %s', info.messageId); - } catch (e) { - logger.error(e); - throw e; + logger.info(`Message sent: ${info.messageId}`); + } catch (err) { + logger.error(err as Error); + throw err; } } diff --git a/packages/backend/test/chart.ts b/packages/backend/test/chart.ts index 66000bc92..bd8d4c817 100644 --- a/packages/backend/test/chart.ts +++ b/packages/backend/test/chart.ts @@ -6,14 +6,17 @@ import { async, initTestDb } from './utils'; import TestChart from '../src/services/chart/charts/test'; import TestGroupedChart from '../src/services/chart/charts/test-grouped'; import TestUniqueChart from '../src/services/chart/charts/test-unique'; +import TestIntersectionChart from '../src/services/chart/charts/test-intersection'; import * as _TestChart from '../src/services/chart/charts/entities/test'; import * as _TestGroupedChart from '../src/services/chart/charts/entities/test-grouped'; import * as _TestUniqueChart from '../src/services/chart/charts/entities/test-unique'; +import * as _TestIntersectionChart from '../src/services/chart/charts/entities/test-intersection'; describe('Chart', () => { let testChart: TestChart; let testGroupedChart: TestGroupedChart; let testUniqueChart: TestUniqueChart; + let testIntersectionChart: TestIntersectionChart; let clock: lolex.Clock; beforeEach(async(async () => { @@ -21,11 +24,13 @@ describe('Chart', () => { _TestChart.entity.hour, _TestChart.entity.day, _TestGroupedChart.entity.hour, _TestGroupedChart.entity.day, _TestUniqueChart.entity.hour, _TestUniqueChart.entity.day, + _TestIntersectionChart.entity.hour, _TestIntersectionChart.entity.day, ]); testChart = new TestChart(); testGroupedChart = new TestGroupedChart(); testUniqueChart = new TestUniqueChart(); + testIntersectionChart = new TestIntersectionChart(); clock = lolex.install({ now: new Date(Date.UTC(2000, 0, 1, 0, 0, 0)) @@ -426,6 +431,53 @@ describe('Chart', () => { foo: [2, 0, 0], }); })); + + describe('Intersection', () => { + it('æĄäģļがæē€ãŸã•ã‚ŒãĻいãĒい場合はã‚Ģã‚ĻãƒŗトされãĒい', async(async () => { + await testIntersectionChart.addA('alice'); + await testIntersectionChart.addA('bob'); + await testIntersectionChart.addB('carol'); + await testIntersectionChart.save(); + + const chartHours = await testIntersectionChart.getChart('hour', 3, null); + const chartDays = await testIntersectionChart.getChart('day', 3, null); + + assert.deepStrictEqual(chartHours, { + a: [2, 0, 0], + b: [1, 0, 0], + aAndB: [0, 0, 0], + }); + + assert.deepStrictEqual(chartDays, { + a: [2, 0, 0], + b: [1, 0, 0], + aAndB: [0, 0, 0], + }); + })); + + it('æĄäģļがæē€ãŸã•ã‚ŒãĻいる場合ãĢã‚Ģã‚Ļãƒŗトされる', async(async () => { + await testIntersectionChart.addA('alice'); + await testIntersectionChart.addA('bob'); + await testIntersectionChart.addB('carol'); + await testIntersectionChart.addB('alice'); + await testIntersectionChart.save(); + + const chartHours = await testIntersectionChart.getChart('hour', 3, null); + const chartDays = await testIntersectionChart.getChart('day', 3, null); + + assert.deepStrictEqual(chartHours, { + a: [2, 0, 0], + b: [2, 0, 0], + aAndB: [1, 0, 0], + }); + + assert.deepStrictEqual(chartDays, { + a: [2, 0, 0], + b: [2, 0, 0], + aAndB: [1, 0, 0], + }); + })); + }); }); describe('Resync', () => { diff --git a/packages/backend/tsconfig.json b/packages/backend/tsconfig.json index 3311e117d..f3252b286 100644 --- a/packages/backend/tsconfig.json +++ b/packages/backend/tsconfig.json @@ -30,7 +30,7 @@ "outDir": "./built", "typeRoots": [ "./node_modules/@types", - "./@types" + "./src/@types" ], "lib": [ "esnext" diff --git a/packages/backend/yarn.lock b/packages/backend/yarn.lock index 5bf6e05a7..c4afef8b5 100644 --- a/packages/backend/yarn.lock +++ b/packages/backend/yarn.lock @@ -238,9 +238,9 @@ integrity sha512-JiX9vxoKMmu8Y3Zr2RVathBL1Cdu4Nt4MuNWemt1Nc06A0RAin9c5FArkhGsyMBWfCu4zj+9b+GxtjAnE4qqLQ== "@sindresorhus/is@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.0.0.tgz#2ff674e9611b45b528896d820d3d7a812de2f0e4" - integrity sha512-FyD2meJpDPjyNQejSjvnhpgI/azsQkA4lGbuu5BQZfjvJ9cbRZXzeWL2HceCekW4lixO9JPesIIQkSoLjeJHNQ== + version "4.4.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.4.0.tgz#e277e5bdbdf7cb1e20d320f02f5e2ed113cd3185" + integrity sha512-QppPM/8l3Mawvh4rn9CNEYIU9bxpXUCRMaX9yUpvBk1nMKusLKpfXGDEKExKaPhLzcn3lzil7pR6rnJ11HgeRQ== "@sinonjs/commons@^1.7.0": version "1.7.2" @@ -249,10 +249,10 @@ dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@7.1.2": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz#2524eae70c4910edccf99b2f4e6efc5894aff7b5" - integrity sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg== +"@sinonjs/fake-timers@9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.0.tgz#8c92c56f195e0bed4c893ba59c8e3d55831ca0df" + integrity sha512-M8vapsv9qQupMdzrVzkn5rb9jG7aUTEPAZdMtME2PuBaefksFZVE2C1g4LBRTkF/k3nRDNbDc5tp5NFC1PEYxA== dependencies: "@sinonjs/commons" "^1.7.0" @@ -289,6 +289,11 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + "@tsconfig/node10@^1.0.7": version "1.0.7" resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.7.tgz#1eb1de36c73478a2479cc661ef5af1c16d86d606" @@ -316,11 +321,6 @@ dependencies: "@types/node" "*" -"@types/anymatch@*": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz#336badc1beecb9dacc38bea2cf32adf627a8421a" - integrity sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA== - "@types/bcryptjs@2.4.2": version "2.4.2" resolved "https://registry.yarnpkg.com/@types/bcryptjs/-/bcryptjs-2.4.2.tgz#e3530eac9dd136bfdfb0e43df2c4c5ce1f77dfae" @@ -386,11 +386,6 @@ "@types/keygrip" "*" "@types/node" "*" -"@types/dateformat@3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/dateformat/-/dateformat-3.0.1.tgz#98d747a2e5e9a56070c6bf14e27bff56204e34cc" - integrity sha512-KlPPdikagvL6ELjWsljbyDIPzNCeliYkqRpI+zea99vBBbCIA5JNshZAwQKTON139c87y9qvTFVgkFd14rtS4g== - "@types/disposable-email-domains@^1.0.1": version "1.0.2" resolved "https://registry.yarnpkg.com/@types/disposable-email-domains/-/disposable-email-domains-1.0.2.tgz#0280f6b38fa7f14e54b056a434135ecd254483b1" @@ -401,27 +396,6 @@ resolved "https://registry.yarnpkg.com/@types/escape-regexp/-/escape-regexp-0.0.1.tgz#f1a977ccdf2ef059e9862bd3af5e92cbbe723e0e" integrity sha512-ogj/ZTIdeFkiuxDwawYuZSIgC6suFGgBeZPr6Xs5lHEcvIXTjXGtH+/n8f1XhZhespaUwJ5LIGRICPji972FLw== -"@types/eslint-scope@^3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.0.tgz#4792816e31119ebd506902a482caec4951fabd86" - integrity sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.2.0.tgz#eb5c5b575237334df24c53195e37b53d66478d7b" - integrity sha512-LpUXkr7fnmPXWGxB0ZuLEzNeTURuHPavkC5zuU4sg62/TgL5ZEjamr5Y8b6AftwHtx2bPJasI+CL0TT2JwQ7aA== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*", "@types/estree@^0.0.46": - version "0.0.46" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.46.tgz#0fb6bfbbeabd7a30880504993369c4bf1deab1fe" - integrity sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg== - "@types/express-serve-static-core@*": version "4.17.5" resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.5.tgz#a00ac7dadd746ae82477443e4d480a6a93ea083c" @@ -496,11 +470,6 @@ "@types/parse5" "*" "@types/tough-cookie" "*" -"@types/json-schema@*": - version "7.0.5" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd" - integrity sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ== - "@types/json-schema@^7.0.6": version "7.0.6" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" @@ -665,10 +634,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-16.6.2.tgz#331b7b9f8621c638284787c5559423822fdffc50" integrity sha512-LSw8TZt12ZudbpHc6EkIyDM3nHVWKYrAvGy6EAJfNfjusbwnThqjqxUKKRwuV3iWYeW/LYMzNgaq3MaLffQ2xA== -"@types/node@17.0.10": - version "17.0.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.10.tgz#616f16e9d3a2a3d618136b1be244315d95bd7cab" - integrity sha512-S/3xB4KzyFxYGCppyDt68yzBU9ysL88lSdIah4D6cptdcltc4NCPCAMc0+PCpg/lLIyC7IPvj2Z52OJWeIUkog== +"@types/node@17.0.14": + version "17.0.14" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.14.tgz#33b9b94f789a8fedd30a68efdbca4dbb06b61f20" + integrity sha512-SbjLmERksKOGzWzPNuW7fJM7fk3YXVTFiZWB/Hs99gwhk+/dnrQRPBQjPW9aO+fi1tAffi9PrwFvsmOKmDTyng== "@types/node@^14.11.8": version "14.17.9" @@ -770,13 +739,6 @@ resolved "https://registry.yarnpkg.com/@types/rename/-/rename-1.0.4.tgz#30c6f0306042591a560361ea02639e89647dd173" integrity sha512-eV81+6bVv2mdCBahkMefjEUwAjKDAP3AuyhqWCWRxcRaeVdUeHUBaoq2zSz+5HNHF2jzTajMcfLvJsy4K3cbwA== -"@types/request-stats@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/request-stats/-/request-stats-3.0.0.tgz#d3909a9f778b8ae0b42fb8c1ed20cb936ed95f99" - integrity sha512-POsDF7nETH8up49iBNvbZuO0pEk9F+TG0rXCkvjxCClcOS99xfF+mKmJteYlwKYpuRKkixzysKlL8rwN1hU2lw== - dependencies: - "@types/node" "*" - "@types/responselike@*", "@types/responselike@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" @@ -791,10 +753,10 @@ dependencies: htmlparser2 "^6.0.0" -"@types/seedrandom@2.4.28": - version "2.4.28" - resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-2.4.28.tgz#9ce8fa048c1e8c85cb71d7fe4d704e000226036f" - integrity sha512-SMA+fUwULwK7sd/ZJicUztiPs8F1yCPwF3O23Z9uQ32ME5Ha0NmDK9+QTsYE4O2tHXChzXomSWWeIhCnoN1LqA== +"@types/seedrandom@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-3.0.1.tgz#1254750a4fec4aff2ebec088ccd0bb02e91fedb4" + integrity sha512-giB9gzDeiCeloIXDgzFBCgjj1k4WxcDrZtGl6h1IqmUPlxF+Nx8Ve+96QCyDZ/HseB/uvDsKbpib9hU5cU53pw== "@types/serve-static@*": version "1.13.3" @@ -811,15 +773,10 @@ dependencies: "@types/node" "*" -"@types/sinonjs__fake-timers@6.0.4": - version "6.0.4" - resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.4.tgz#0ecc1b9259b76598ef01942f547904ce61a6a77d" - integrity sha512-IFQTJARgMUBF+xVd2b+hIgXWrZEjND3vJtRCvIelcFB5SIXfjV4bOHbHJ0eXKh+0COrBRc8MqteKAz/j88rE0A== - -"@types/source-list-map@*": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" - integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== +"@types/sinonjs__fake-timers@8.1.1": + version "8.1.1" + resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz#b49c2c70150141a15e0fa7e79cf1f92a72934ce3" + integrity sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g== "@types/speakeasy@2.0.7": version "2.0.7" @@ -828,11 +785,6 @@ dependencies: "@types/node" "*" -"@types/tapable@^1": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.7.tgz#545158342f949e8fd3bfd813224971ecddc3fac4" - integrity sha512-0VBprVqfgFD7Ehb2vd8Lh9TG3jP98gvr8rgehQqzztZNI7o8zS8Ad4jyZneKELphpuE212D8J70LnSNQSyO6bQ== - "@types/throttle-debounce@2.1.0": version "2.1.0" resolved "https://registry.yarnpkg.com/@types/throttle-debounce/-/throttle-debounce-2.1.0.tgz#1c3df624bfc4b62f992d3012b84c56d41eab3776" @@ -853,13 +805,6 @@ resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.0.tgz#fef1904e4668b6e5ecee60c52cc6a078ffa6697d" integrity sha512-I99sngh224D0M7XgW1s120zxCt3VYQ3IQsuw3P3jbq5GG4yc79+ZjyKznyOGIQrflfylLgcfekeZW/vk0yng6A== -"@types/uglify-js@*": - version "3.9.0" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.9.0.tgz#4490a140ca82aa855ad68093829e7fd6ae94ea87" - integrity sha512-3ZcoyPYHVOCcLpnfZwD47KFLr8W/mpUcgjpf1M4Q78TMJIw7KMAHSjiCLJp1z3ZrBR9pTLbe191O0TldFK5zcw== - dependencies: - source-map "^0.6.1" - "@types/uuid@8.3.4": version "8.3.4" resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" @@ -872,48 +817,10 @@ dependencies: "@types/node" "*" -"@types/webpack-sources@*": - version "0.1.7" - resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-0.1.7.tgz#0a330a9456113410c74a5d64180af0cbca007141" - integrity sha512-XyaHrJILjK1VHVC4aVlKsdNN5KBTwufMb43cQs+flGxtPAf/1Qwl8+Q0tp5BwEGaI8D6XT1L+9bSWXckgkjTLw== - dependencies: - "@types/node" "*" - "@types/source-list-map" "*" - source-map "^0.6.1" - -"@types/webpack-stream@3.2.12": - version "3.2.12" - resolved "https://registry.yarnpkg.com/@types/webpack-stream/-/webpack-stream-3.2.12.tgz#cf13e64067a662a7acd8cd0524b3f64c86b0ecb6" - integrity sha512-znMUl4kKT0V0SwkUgRgwUNSAO7J5I/jdTCBNy3utkCsgMJ3IHp4FBTDwsQC+tfQ73TWeKIH05QNmbUYmeGThGw== - dependencies: - "@types/node" "*" - "@types/webpack" "^4" - -"@types/webpack@5.28.0": - version "5.28.0" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-5.28.0.tgz#78dde06212f038d77e54116cfe69e88ae9ed2c03" - integrity sha512-8cP0CzcxUiFuA9xGJkfeVpqmWTk9nx6CWwamRGCj95ph1SmlRRk9KlCZ6avhCbZd4L68LvYT6l1kpdEnQXrF8w== - dependencies: - "@types/node" "*" - tapable "^2.2.0" - webpack "^5" - -"@types/webpack@^4": - version "4.41.27" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.27.tgz#f47da488c8037e7f1b2dbf2714fbbacb61ec0ffc" - integrity sha512-wK/oi5gcHi72VMTbOaQ70VcDxSQ1uX8S2tukBK9ARuGXrYM/+u4ou73roc7trXDNmCxCoerE8zruQqX/wuHszA== - dependencies: - "@types/anymatch" "*" - "@types/node" "*" - "@types/tapable" "^1" - "@types/uglify-js" "*" - "@types/webpack-sources" "*" - source-map "^0.6.0" - -"@types/websocket@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@types/websocket/-/websocket-1.0.4.tgz#1dc497280d8049a5450854dd698ee7e6ea9e60b8" - integrity sha512-qn1LkcFEKK8RPp459jkjzsfpbsx36BBt3oC3pITYtkoBw/aVX+EZFa5j3ThCRTNpLFvIMr5dSTD4RaMdilIOpA== +"@types/websocket@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/websocket/-/websocket-1.0.5.tgz#3fb80ed8e07f88e51961211cd3682a3a4a81569c" + integrity sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ== dependencies: "@types/node" "*" @@ -929,14 +836,14 @@ resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.2.tgz#808c9fa7e4517274ed555fa158f2de4b4f468e71" integrity sha512-HrCIVMLjE1MOozVoD86622S7aunluLb2PJdPfb3nYiEtohm8mIB/vyv0Fd37AdeMFrTUQXEunw78YloMA3Qilg== -"@typescript-eslint/eslint-plugin@5.10.0": - version "5.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.0.tgz#e90afea96dff8620892ad216b0e4ccdf8ee32d3a" - integrity sha512-XXVKnMsq2fuu9K2KsIxPUGqb6xAImz8MEChClbXmE3VbveFtBUU5bzM6IPVWqzyADIgdkS2Ws/6Xo7W2TeZWjQ== +"@typescript-eslint/eslint-plugin@5.10.2": + version "5.10.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.2.tgz#f8c1d59fc37bd6d9d11c97267fdfe722c4777152" + integrity sha512-4W/9lLuE+v27O/oe7hXJKjNtBLnZE8tQAFpapdxwSVHqtmIoPB1gph3+ahNwVuNL37BX7YQHyGF9Xv6XCnIX2Q== dependencies: - "@typescript-eslint/scope-manager" "5.10.0" - "@typescript-eslint/type-utils" "5.10.0" - "@typescript-eslint/utils" "5.10.0" + "@typescript-eslint/scope-manager" "5.10.2" + "@typescript-eslint/type-utils" "5.10.2" + "@typescript-eslint/utils" "5.10.2" debug "^4.3.2" functional-red-black-tree "^1.0.1" ignore "^5.1.8" @@ -944,69 +851,69 @@ semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/parser@5.10.0": - version "5.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.10.0.tgz#8f59e036f5f1cffc178cacbd5ccdd02aeb96c91c" - integrity sha512-pJB2CCeHWtwOAeIxv8CHVGJhI5FNyJAIpx5Pt72YkK3QfEzt6qAlXZuyaBmyfOdM62qU0rbxJzNToPTVeJGrQw== +"@typescript-eslint/parser@5.10.2": + version "5.10.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.10.2.tgz#b6076d27cc5499ce3f2c625f5ccde946ecb7db9a" + integrity sha512-JaNYGkaQVhP6HNF+lkdOr2cAs2wdSZBoalE22uYWq8IEv/OVH0RksSGydk+sW8cLoSeYmC+OHvRyv2i4AQ7Czg== dependencies: - "@typescript-eslint/scope-manager" "5.10.0" - "@typescript-eslint/types" "5.10.0" - "@typescript-eslint/typescript-estree" "5.10.0" + "@typescript-eslint/scope-manager" "5.10.2" + "@typescript-eslint/types" "5.10.2" + "@typescript-eslint/typescript-estree" "5.10.2" debug "^4.3.2" -"@typescript-eslint/scope-manager@5.10.0": - version "5.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.10.0.tgz#bb5d872e8b9e36203908595507fbc4d3105329cb" - integrity sha512-tgNgUgb4MhqK6DoKn3RBhyZ9aJga7EQrw+2/OiDk5hKf3pTVZWyqBi7ukP+Z0iEEDMF5FDa64LqODzlfE4O/Dg== +"@typescript-eslint/scope-manager@5.10.2": + version "5.10.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.10.2.tgz#92c0bc935ec00f3d8638cdffb3d0e70c9b879639" + integrity sha512-39Tm6f4RoZoVUWBYr3ekS75TYgpr5Y+X0xLZxXqcZNDWZdJdYbKd3q2IR4V9y5NxxiPu/jxJ8XP7EgHiEQtFnw== dependencies: - "@typescript-eslint/types" "5.10.0" - "@typescript-eslint/visitor-keys" "5.10.0" + "@typescript-eslint/types" "5.10.2" + "@typescript-eslint/visitor-keys" "5.10.2" -"@typescript-eslint/type-utils@5.10.0": - version "5.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.10.0.tgz#8524b9479c19c478347a7df216827e749e4a51e5" - integrity sha512-TzlyTmufJO5V886N+hTJBGIfnjQDQ32rJYxPaeiyWKdjsv2Ld5l8cbS7pxim4DeNs62fKzRSt8Q14Evs4JnZyQ== +"@typescript-eslint/type-utils@5.10.2": + version "5.10.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.10.2.tgz#ad5acdf98a7d2ab030bea81f17da457519101ceb" + integrity sha512-uRKSvw/Ccs5FYEoXW04Z5VfzF2iiZcx8Fu7DGIB7RHozuP0VbKNzP1KfZkHBTM75pCpsWxIthEH1B33dmGBKHw== dependencies: - "@typescript-eslint/utils" "5.10.0" + "@typescript-eslint/utils" "5.10.2" debug "^4.3.2" tsutils "^3.21.0" -"@typescript-eslint/types@5.10.0": - version "5.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.10.0.tgz#beb3cb345076f5b088afe996d57bcd1dfddaa75c" - integrity sha512-wUljCgkqHsMZbw60IbOqT/puLfyqqD5PquGiBo1u1IS3PLxdi3RDGlyf032IJyh+eQoGhz9kzhtZa+VC4eWTlQ== +"@typescript-eslint/types@5.10.2": + version "5.10.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.10.2.tgz#604d15d795c4601fffba6ecb4587ff9fdec68ce8" + integrity sha512-Qfp0qk/5j2Rz3p3/WhWgu4S1JtMcPgFLnmAKAW061uXxKSa7VWKZsDXVaMXh2N60CX9h6YLaBoy9PJAfCOjk3w== -"@typescript-eslint/typescript-estree@5.10.0": - version "5.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.0.tgz#4be24a3dea0f930bb1397c46187d0efdd955a224" - integrity sha512-x+7e5IqfwLwsxTdliHRtlIYkgdtYXzE0CkFeV6ytAqq431ZyxCFzNMNR5sr3WOlIG/ihVZr9K/y71VHTF/DUQA== +"@typescript-eslint/typescript-estree@5.10.2": + version "5.10.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.2.tgz#810906056cd3ddcb35aa333fdbbef3713b0fe4a7" + integrity sha512-WHHw6a9vvZls6JkTgGljwCsMkv8wu8XU8WaYKeYhxhWXH/atZeiMW6uDFPLZOvzNOGmuSMvHtZKd6AuC8PrwKQ== dependencies: - "@typescript-eslint/types" "5.10.0" - "@typescript-eslint/visitor-keys" "5.10.0" + "@typescript-eslint/types" "5.10.2" + "@typescript-eslint/visitor-keys" "5.10.2" debug "^4.3.2" globby "^11.0.4" is-glob "^4.0.3" semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/utils@5.10.0": - version "5.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.10.0.tgz#c3d152a85da77c400e37281355561c72fb1b5a65" - integrity sha512-IGYwlt1CVcFoE2ueW4/ioEwybR60RAdGeiJX/iDAw0t5w0wK3S7QncDwpmsM70nKgGTuVchEWB8lwZwHqPAWRg== +"@typescript-eslint/utils@5.10.2": + version "5.10.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.10.2.tgz#1fcd37547c32c648ab11aea7173ec30060ee87a8" + integrity sha512-vuJaBeig1NnBRkf7q9tgMLREiYD7zsMrsN1DA3wcoMDvr3BTFiIpKjGiYZoKPllfEwN7spUjv7ZqD+JhbVjEPg== dependencies: "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.10.0" - "@typescript-eslint/types" "5.10.0" - "@typescript-eslint/typescript-estree" "5.10.0" + "@typescript-eslint/scope-manager" "5.10.2" + "@typescript-eslint/types" "5.10.2" + "@typescript-eslint/typescript-estree" "5.10.2" eslint-scope "^5.1.1" eslint-utils "^3.0.0" -"@typescript-eslint/visitor-keys@5.10.0": - version "5.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.0.tgz#770215497ad67cd15a572b52089991d5dfe06281" - integrity sha512-GMxj0K1uyrFLPKASLmZzCuSddmjZVbVj3Ouy5QVuIGKZopxvOr24JsS7gruz6C3GExE01mublZ3mIBOaon9zuQ== +"@typescript-eslint/visitor-keys@5.10.2": + version "5.10.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.2.tgz#fdbf272d8e61c045d865bd6c8b41bea73d222f3d" + integrity sha512-zHIhYGGGrFJvvyfwHk5M08C5B5K4bewkm+rrvNTKk1/S15YHR+SA/QUF8ZWscXSfEaB8Nn2puZj+iHcoxVOD/Q== dependencies: - "@typescript-eslint/types" "5.10.0" + "@typescript-eslint/types" "5.10.2" eslint-visitor-keys "^3.0.0" "@ungap/promise-all-settled@1.1.2": @@ -1014,137 +921,6 @@ resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== -"@webassemblyjs/ast@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.0.tgz#a5aa679efdc9e51707a4207139da57920555961f" - integrity sha512-kX2W49LWsbthrmIRMbQZuQDhGtjyqXfEmmHyEi4XWnSZtPmxY0+3anPIzsnRb45VH/J55zlOfWvZuY47aJZTJg== - dependencies: - "@webassemblyjs/helper-numbers" "1.11.0" - "@webassemblyjs/helper-wasm-bytecode" "1.11.0" - -"@webassemblyjs/floating-point-hex-parser@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.0.tgz#34d62052f453cd43101d72eab4966a022587947c" - integrity sha512-Q/aVYs/VnPDVYvsCBL/gSgwmfjeCb4LW8+TMrO3cSzJImgv8lxxEPM2JA5jMrivE7LSz3V+PFqtMbls3m1exDA== - -"@webassemblyjs/helper-api-error@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.0.tgz#aaea8fb3b923f4aaa9b512ff541b013ffb68d2d4" - integrity sha512-baT/va95eXiXb2QflSx95QGT5ClzWpGaa8L7JnJbgzoYeaA27FCvuBXU758l+KXWRndEmUXjP0Q5fibhavIn8w== - -"@webassemblyjs/helper-buffer@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.0.tgz#d026c25d175e388a7dbda9694e91e743cbe9b642" - integrity sha512-u9HPBEl4DS+vA8qLQdEQ6N/eJQ7gT7aNvMIo8AAWvAl/xMrcOSiI2M0MAnMCy3jIFke7bEee/JwdX1nUpCtdyA== - -"@webassemblyjs/helper-numbers@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.0.tgz#7ab04172d54e312cc6ea4286d7d9fa27c88cd4f9" - integrity sha512-DhRQKelIj01s5IgdsOJMKLppI+4zpmcMQ3XboFPLwCpSNH6Hqo1ritgHgD0nqHeSYqofA6aBN/NmXuGjM1jEfQ== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.0" - "@webassemblyjs/helper-api-error" "1.11.0" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.0.tgz#85fdcda4129902fe86f81abf7e7236953ec5a4e1" - integrity sha512-MbmhvxXExm542tWREgSFnOVo07fDpsBJg3sIl6fSp9xuu75eGz5lz31q7wTLffwL3Za7XNRCMZy210+tnsUSEA== - -"@webassemblyjs/helper-wasm-section@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.0.tgz#9ce2cc89300262509c801b4af113d1ca25c1a75b" - integrity sha512-3Eb88hcbfY/FCukrg6i3EH8H2UsD7x8Vy47iVJrP967A9JGqgBVL9aH71SETPx1JrGsOUVLo0c7vMCN22ytJew== - dependencies: - "@webassemblyjs/ast" "1.11.0" - "@webassemblyjs/helper-buffer" "1.11.0" - "@webassemblyjs/helper-wasm-bytecode" "1.11.0" - "@webassemblyjs/wasm-gen" "1.11.0" - -"@webassemblyjs/ieee754@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.0.tgz#46975d583f9828f5d094ac210e219441c4e6f5cf" - integrity sha512-KXzOqpcYQwAfeQ6WbF6HXo+0udBNmw0iXDmEK5sFlmQdmND+tr773Ti8/5T/M6Tl/413ArSJErATd8In3B+WBA== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.0.tgz#f7353de1df38aa201cba9fb88b43f41f75ff403b" - integrity sha512-aqbsHa1mSQAbeeNcl38un6qVY++hh8OpCOzxhixSYgbRfNWcxJNJQwe2rezK9XEcssJbbWIkblaJRwGMS9zp+g== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.0.tgz#86e48f959cf49e0e5091f069a709b862f5a2cadf" - integrity sha512-A/lclGxH6SpSLSyFowMzO/+aDEPU4hvEiooCMXQPcQFPPJaYcPQNKGOCLUySJsYJ4trbpr+Fs08n4jelkVTGVw== - -"@webassemblyjs/wasm-edit@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.0.tgz#ee4a5c9f677046a210542ae63897094c2027cb78" - integrity sha512-JHQ0damXy0G6J9ucyKVXO2j08JVJ2ntkdJlq1UTiUrIgfGMmA7Ik5VdC/L8hBK46kVJgujkBIoMtT8yVr+yVOQ== - dependencies: - "@webassemblyjs/ast" "1.11.0" - "@webassemblyjs/helper-buffer" "1.11.0" - "@webassemblyjs/helper-wasm-bytecode" "1.11.0" - "@webassemblyjs/helper-wasm-section" "1.11.0" - "@webassemblyjs/wasm-gen" "1.11.0" - "@webassemblyjs/wasm-opt" "1.11.0" - "@webassemblyjs/wasm-parser" "1.11.0" - "@webassemblyjs/wast-printer" "1.11.0" - -"@webassemblyjs/wasm-gen@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.0.tgz#3cdb35e70082d42a35166988dda64f24ceb97abe" - integrity sha512-BEUv1aj0WptCZ9kIS30th5ILASUnAPEvE3tVMTrItnZRT9tXCLW2LEXT8ezLw59rqPP9klh9LPmpU+WmRQmCPQ== - dependencies: - "@webassemblyjs/ast" "1.11.0" - "@webassemblyjs/helper-wasm-bytecode" "1.11.0" - "@webassemblyjs/ieee754" "1.11.0" - "@webassemblyjs/leb128" "1.11.0" - "@webassemblyjs/utf8" "1.11.0" - -"@webassemblyjs/wasm-opt@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.0.tgz#1638ae188137f4bb031f568a413cd24d32f92978" - integrity sha512-tHUSP5F4ywyh3hZ0+fDQuWxKx3mJiPeFufg+9gwTpYp324mPCQgnuVKwzLTZVqj0duRDovnPaZqDwoyhIO8kYg== - dependencies: - "@webassemblyjs/ast" "1.11.0" - "@webassemblyjs/helper-buffer" "1.11.0" - "@webassemblyjs/wasm-gen" "1.11.0" - "@webassemblyjs/wasm-parser" "1.11.0" - -"@webassemblyjs/wasm-parser@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.0.tgz#3e680b8830d5b13d1ec86cc42f38f3d4a7700754" - integrity sha512-6L285Sgu9gphrcpDXINvm0M9BskznnzJTE7gYkjDbxET28shDqp27wpruyx3C2S/dvEwiigBwLA1cz7lNUi0kw== - dependencies: - "@webassemblyjs/ast" "1.11.0" - "@webassemblyjs/helper-api-error" "1.11.0" - "@webassemblyjs/helper-wasm-bytecode" "1.11.0" - "@webassemblyjs/ieee754" "1.11.0" - "@webassemblyjs/leb128" "1.11.0" - "@webassemblyjs/utf8" "1.11.0" - -"@webassemblyjs/wast-printer@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.0.tgz#680d1f6a5365d6d401974a8e949e05474e1fab7e" - integrity sha512-Fg5OX46pRdTgB7rKIUojkh9vXaVN6sGYCnEiJN1GYkb0RPwShZXp6KTDqmoMdQPKhcroOXh3fEzmkWmCYaKYhQ== - dependencies: - "@webassemblyjs/ast" "1.11.0" - "@xtuc/long" "4.2.2" - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - abab@^2.0.3, abab@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" @@ -1198,22 +974,12 @@ acorn@^7.1.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.0.4: - version "8.1.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.1.0.tgz#52311fd7037ae119cbb134309e901aa46295b3fe" - integrity sha512-LWCF/Wn0nfHOmJ9rzQApGnxnvgfROzGilS8936rqN/lfcYkY9MYZzdMqN+2NJ4SlTc+m5HiSa+kNfDtI64dwUA== - -acorn@^8.2.4: - version "8.2.4" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.2.4.tgz#caba24b08185c3b56e3168e97d15ed17f4d31fd0" - integrity sha512-Ibt84YwBDDA890eDiDCEqcbwvHlBvzzDkU2cGBBDDI1QWT12jTiXIOn2CIw5KK4i6N5Z2HUxwYjzriDyqaqqZg== - acorn@^8.4.1: version "8.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.4.1.tgz#56c36251fc7cabc7096adc18f05afe814321a28c" integrity sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA== -acorn@^8.7.0: +acorn@^8.5.0, acorn@^8.7.0: version "8.7.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== @@ -1476,10 +1242,10 @@ autwh@0.1.0: dependencies: oauth "0.9.15" -aws-sdk@2.1061.0: - version "2.1061.0" - resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1061.0.tgz#79c75e6856e5a59e0857d0d066a8ff5ff5e0d752" - integrity sha512-T29yV+EPo4Fis9hAArxAXS/u6utKnlBq3DEu85LTSIA8i6e6Xg7e9u7Rveo8DmrlVrf7EGCNThaeF9WERHnwLg== +aws-sdk@2.1067.0: + version "2.1067.0" + resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1067.0.tgz#2e7f5a2d765fcf77a45f25fdd1f12a64942628a7" + integrity sha512-3Ys1k4cNQy4z37IpPjQ9c5ldkXMeZGbWoarKHynPPY3WCEj+Nw2u6zk484fA9/lTHNN3YesLuZ0OmEzGgjFEOw== dependencies: buffer "4.9.2" events "1.1.1" @@ -1638,17 +1404,6 @@ browser-stdout@1.3.1: resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== -browserslist@^4.14.5: - version "4.16.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.3.tgz#340aa46940d7db878748567c5dea24a48ddf3717" - integrity sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw== - dependencies: - caniuse-lite "^1.0.30001181" - colorette "^1.2.1" - electron-to-chromium "^1.3.649" - escalade "^3.1.1" - node-releases "^1.1.70" - buffer-crc32@^0.2.1, buffer-crc32@^0.2.13: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" @@ -1711,16 +1466,17 @@ bufferutil@^4.0.1: dependencies: node-gyp-build "~3.7.0" -bull@4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/bull/-/bull-4.2.1.tgz#c5a7e1496c7903274ce90192e4e5cb18f6c866c0" - integrity sha512-YkCQZMOub++siHw3SbYYXZ5xGEn6Tt3BPoCVq/irPNCxUqUYzta8yDlXyyAsfMKMVj0M7PcnynUabfMf9PFpOA== +bull@4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/bull/-/bull-4.5.0.tgz#d6106b011b711ffb76c687d7f2db416955225f64" + integrity sha512-BejJxGwNNQPIrK1jFTN74kymFORYQ6ZyXWNsZx+6jtDtafQNUMHNSdoepabLLmeldmUvgAHvZDDIJWFGEo2MYg== dependencies: - cron-parser "^2.13.0" + cron-parser "^4.2.1" debuglog "^1.0.0" get-port "^5.1.1" ioredis "^4.27.0" lodash "^4.17.21" + msgpackr "^1.5.2" p-timeout "^3.2.0" semver "^7.3.2" uuid "^8.3.0" @@ -1821,11 +1577,6 @@ camelcase@^6.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== -caniuse-lite@^1.0.30001181: - version "1.0.30001191" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001191.tgz#bacb432b6701f690c8c5f7c680166b9a9f0843d9" - integrity sha512-xJJqzyd+7GCJXkcoBiQ1GuxEiOBCLQ0aVW9HMekifZsAVGdj5eJ4mFB9fEhSHipq9IOk/QXFJUiIr9lZT+EsGw== - canonicalize@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/canonicalize/-/canonicalize-1.0.1.tgz#657b4f3fa38a6ecb97a9e5b7b26d7a19cc6e0da9" @@ -1945,13 +1696,6 @@ chownr@^2.0.0: resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== -chrome-trace-event@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" - integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== - dependencies: - tslib "^1.9.0" - clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" @@ -2053,10 +1797,10 @@ color-name@^1.0.0, color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-string@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.6.0.tgz#c3915f61fe267672cb7e1e064c9d692219f6c312" - integrity sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA== +color-string@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.0.tgz#63b6ebd1bec11999d1df3a79a7569451ac2be8aa" + integrity sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ== dependencies: color-name "^1.0.0" simple-swizzle "^0.2.2" @@ -2066,15 +1810,15 @@ color-support@^1.1.2: resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== -color@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/color/-/color-4.0.1.tgz#21df44cd10245a91b1ccf5ba031609b0e10e7d67" - integrity sha512-rpZjOKN5O7naJxkH2Rx1sZzzBgaiWECc6BYXjeCE6kF0kcASJYbUq02u7JqIHwCb/j3NhV+QhRL2683aICeGZA== +color@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/color/-/color-4.2.0.tgz#0c782459a3e98838ea01e4bc0fb43310ca35af78" + integrity sha512-hHTcrbvEnGjC7WBMk6ibQWFVDgEFTVmjrz2Q5HlU6ltwxv0JJN2Z8I7uRbWeQLF04dikxs8zgyZkazRJvSMtyQ== dependencies: color-convert "^2.0.1" - color-string "^1.6.0" + color-string "^1.9.0" -colorette@^1.2.0, colorette@^1.2.1: +colorette@^1.2.0: version "1.2.2" resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== @@ -2086,7 +1830,7 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" -commander@^2.19.0, commander@^2.20.0: +commander@^2.19.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -2195,7 +1939,15 @@ core-util-is@1.0.2, core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -crc-32@1.2.0, crc-32@^1.2.0: +crc-32@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.1.tgz#436d2bcaad27bcb6bd073a2587139d3024a16460" + integrity sha512-Dn/xm/1vFFgs3nfrpEVScHoIslO9NZRITWGz/1E/St6u4xw99vfZzVkW0OSnzx2h9egej9xwMCEut6sqwokM/w== + dependencies: + exit-on-epipe "~1.0.1" + printj "~1.3.1" + +crc-32@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208" integrity sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA== @@ -2216,13 +1968,12 @@ create-require@^1.1.0: resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== -cron-parser@^2.13.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/cron-parser/-/cron-parser-2.13.0.tgz#6f930bb6f2931790d2a9eec83b3ec276e27a6725" - integrity sha512-UWeIpnRb0eyoWPVk+pD3TDpNx3KCFQeezO224oJIkktBrcW6RoAPOx5zIKprZGfk6vcYSmA8yQXItejSaDBhbQ== +cron-parser@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/cron-parser/-/cron-parser-4.2.1.tgz#b43205d05ccd5c93b097dae64f3bd811f5993af3" + integrity sha512-5sJBwDYyCp+0vU5b7POl8zLWfgV5fOHxlc45FWoWdHecGC7MQHCjx0CHivCMRnGFovghKhhyYM+Zm9DcY5qcHg== dependencies: - is-nan "^1.2.1" - moment-timezone "^0.5.25" + luxon "^1.28.0" cross-env@7.0.3: version "7.0.3" @@ -2255,10 +2006,10 @@ css-what@2.1: resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== -cssom@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" - integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== +cssom@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" + integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== cssom@~0.3.6: version "0.3.8" @@ -2297,19 +2048,19 @@ data-uri-to-buffer@^4.0.0: resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz#b5db46aea50f6176428ac05b73be39a57701a64b" integrity sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA== -data-urls@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" - integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== +data-urls@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.1.tgz#597fc2ae30f8bc4dbcf731fcd1b1954353afc6f8" + integrity sha512-Ds554NeT5Gennfoo9KN50Vh6tpgtvYEwraYjejXnyTpu1C7oXKxdFk75REooENHE8ndTVOJuv+BEs4/J/xcozw== dependencies: abab "^2.0.3" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^10.0.0" -dateformat@4.5.1: - version "4.5.1" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.5.1.tgz#c20e7a9ca77d147906b6dc2261a8be0a5bd2173c" - integrity sha512-OD0TZ+B7yP7ZgpJf5K2DIbj3FZvFvxgFUuaqA/V5zTjAtAAXZ1E8bktHxmAGs4x5b7PflqA9LeQ84Og7wYtF7Q== +date-fns@2.28.0: + version "2.28.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.28.0.tgz#9570d656f5fc13143e50c975a3b6bbeb46cd08b2" + integrity sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw== debug@2, debug@^2.2.0, debug@^2.5.2, debug@^2.6.9: version "2.6.9" @@ -2368,10 +2119,10 @@ decamelize@^4.0.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== -decimal.js@^10.2.1: - version "10.2.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.1.tgz#238ae7b0f0c793d3e3cea410108b35a2c01426a3" - integrity sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw== +decimal.js@^10.3.1: + version "10.3.1" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" + integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== decompress-response@^6.0.0: version "6.0.0" @@ -2462,10 +2213,10 @@ detect-file@^1.0.0: resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= -detect-libc@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= +detect-libc@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.0.tgz#c528bc09bc6d1aa30149228240917c225448f204" + integrity sha512-S55LzUl8HUav8l9E2PBTlC5PAJrHK7tkM+XXFGD+fbsbkTzhCpG6K05LxJcUOEWzMa4v6ptcMZ9s3fOdJDu0Zw== detect-node@2.1.0, detect-node@^2.1.0: version "2.1.0" @@ -2566,12 +2317,12 @@ domelementtype@^2.2.0: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== -domexception@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" - integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== +domexception@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" + integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== dependencies: - webidl-conversions "^5.0.0" + webidl-conversions "^7.0.0" domhandler@^2.3.0: version "2.4.2" @@ -2661,11 +2412,6 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.649: - version "1.3.672" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.672.tgz#3a6e335016dab4bc584d5292adc4f98f54541f6a" - integrity sha512-gFQe7HBb0lbOMqK2GAS5/1F+B0IMdYiAgB9OT/w1F4M7lgJK2aNOMNOM622aEax+nS1cTMytkiT0uMOkbtFmHw== - emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -2708,14 +2454,6 @@ enhanced-resolve@^5.0.0: graceful-fs "^4.2.4" tapable "^2.2.0" -enhanced-resolve@^5.7.0: - version "5.7.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.7.0.tgz#525c5d856680fbd5052de453ac83e32049958b5c" - integrity sha512-6njwt/NsZFUKhM6j9U8hzVyD4E4r0x7NQzhTCbcWOJ0IQjNSAoalWmb0AE51Wn+fwan5qVESWi7t2ToBxs9vrw== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - entities@^1.1.1, entities@~1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" @@ -2762,11 +2500,6 @@ es-abstract@^1.19.0, es-abstract@^1.19.1: string.prototype.trimstart "^1.0.4" unbox-primitive "^1.0.1" -es-module-lexer@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.4.0.tgz#21f4181cc8b7eee06855f1c59e6087c7bc4f77b0" - integrity sha512-iuEGihqqhKWFgh72Q/Jtch7V2t/ft8w8IPP2aEN8ArYKO+IWyo6hsi96hCdgyeEDQIV3InhYQ9BlwUFPGXrbEQ== - es-to-primitive@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" @@ -2912,10 +2645,10 @@ eslint-visitor-keys@^3.1.0, eslint-visitor-keys@^3.2.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz#6fbb166a6798ee5991358bc2daa1ba76cc1254a1" integrity sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ== -eslint@8.7.0: - version "8.7.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.7.0.tgz#22e036842ee5b7cf87b03fe237731675b4d3633c" - integrity sha512-ifHYzkBGrzS2iDU7KjhCAVMGCvF6M3Xfs8X8b37cgrUlDt6bWRTpRh6T/gtSXv1HJ/BUGgmjvNvOEGu85Iif7w== +eslint@8.8.0: + version "8.8.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.8.0.tgz#9762b49abad0cb4952539ffdb0a046392e571a2d" + integrity sha512-H3KXAzQGBH1plhYS3okDix2ZthuYJlQQEGE5k0IKuEqUSiyu4AmxxlJ2MtTYeJ3xB4jDhcYCwGOg2TXYdnDXlQ== dependencies: "@eslint/eslintrc" "^1.0.5" "@humanwhocodes/config-array" "^0.9.2" @@ -3021,11 +2754,6 @@ events@1.1.1: resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= -events@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" - integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg== - execa@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/execa/-/execa-6.0.0.tgz#598b46f09ae44f5d8097a30cfb1681d0f0371503" @@ -3241,10 +2969,10 @@ follow-redirects@^1.14.4: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.7.tgz#2004c02eb9436eee9a21446a6477debf17e81685" integrity sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ== -form-data@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.0.tgz#31b7e39c85f1355b7139ee0c647cf0de7f83c682" - integrity sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg== +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== dependencies: asynckit "^0.4.0" combined-stream "^1.0.8" @@ -3419,11 +3147,6 @@ glob-parent@^6.0.1: dependencies: is-glob "^4.0.3" -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - glob@7.1.6, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" @@ -3619,12 +3342,12 @@ hpagent@^0.1.1: resolved "https://registry.yarnpkg.com/hpagent/-/hpagent-0.1.1.tgz#66f67f16e5c7a8b59a068e40c2658c2c749ad5e2" integrity sha512-IxJWQiY0vmEjetHdoE9HZjD4Cx+mYTr25tR7JCxXaiI3QxW0YqYyM11KyZbHufoa/piWhMb2+D3FGpMgmA2cFQ== -html-encoding-sniffer@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" - integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== +html-encoding-sniffer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" + integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== dependencies: - whatwg-encoding "^1.0.5" + whatwg-encoding "^2.0.0" html-entities@2.3.2: version "2.3.2" @@ -3687,13 +3410,6 @@ http-errors@~1.6.2: setprototypeof "1.1.0" statuses ">= 1.4.0 < 2" -http-headers@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/http-headers/-/http-headers-3.0.2.tgz#5147771292f0b39d6778d930a3a59a76fc7ef44d" - integrity sha512-87E1I+2Wg4dxxz4rcxElo3dxO/w1ZtgL1yA0Sb6vH3qU16vRKq1NjWQv9SCY3ly2OQROcoxHZOUpmelS+k6wOw== - dependencies: - next-line "^1.1.0" - http-proxy-agent@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" @@ -3703,6 +3419,15 @@ http-proxy-agent@^4.0.1: agent-base "6" debug "4" +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + http-signature@1.3.6: version "1.3.6" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.3.6.tgz#cb6fbfdf86d1c974f343be94e87f7fc128662cf9" @@ -3712,7 +3437,7 @@ http-signature@1.3.6: jsprim "^2.0.2" sshpk "^1.14.1" -http2-wrapper@^1.0.0-beta.5.0: +http2-wrapper@^1.0.0-beta.5.0, http2-wrapper@^1.0.0-beta.5.2: version "1.0.3" resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== @@ -3720,14 +3445,6 @@ http2-wrapper@^1.0.0-beta.5.0: quick-lru "^5.1.1" resolve-alpn "^1.0.0" -http2-wrapper@^1.0.0-beta.5.2: - version "1.0.0-beta.5.2" - resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.0-beta.5.2.tgz#8b923deb90144aea65cf834b016a340fc98556f3" - integrity sha512-xYz9goEyBnC8XwXDTuC/MZ6t+MrKVQZOk4s7+PaDkwIsQd8IwqvM+0M6bA/2lvG8GHXcPdf+MejTUeO2LCPCeQ== - dependencies: - quick-lru "^5.1.1" - resolve-alpn "^1.0.0" - http_ece@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/http_ece/-/http_ece-1.1.0.tgz#74780c6eb32d8ddfe9e36a83abcd81fe0cd4fb75" @@ -3767,6 +3484,13 @@ iconv-lite@0.4.24, iconv-lite@^0.4.4: dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + iconv-lite@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01" @@ -4043,13 +3767,6 @@ is-lambda@^1.0.1: resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" integrity sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU= -is-nan@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.0.tgz#85d1f5482f7051c2019f5673ccebdb06f3b0db03" - integrity sha512-z7bbREymOqt2CCaZVly8aC4ML3Xhfi0ekuOnjO2L8vKdl+CttdVoGZQhd4adMFAsxQ5VeRVwORs4tU8RH+HFtQ== - dependencies: - define-properties "^1.1.3" - is-negative-zero@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" @@ -4184,15 +3901,6 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= -jest-worker@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" - integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^7.0.0" - jmespath@0.16.0: version "0.16.0" resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.16.0.tgz#b15b0a85dfd4d930d43e69ed605943c802785076" @@ -4253,23 +3961,23 @@ jschardet@3.0.0: resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-3.0.0.tgz#898d2332e45ebabbdb6bf2feece9feea9a99e882" integrity sha512-lJH6tJ77V8Nzd5QWRkFYCLc13a3vADkh3r/Fi8HupZGWk2OVVDfnZP8V/VgQgZ+lzW0kG2UGb5hFgt3V3ndotQ== -jsdom@16.7.0: - version "16.7.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" - integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== +jsdom@19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-19.0.0.tgz#93e67c149fe26816d38a849ea30ac93677e16b6a" + integrity sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A== dependencies: abab "^2.0.5" - acorn "^8.2.4" + acorn "^8.5.0" acorn-globals "^6.0.0" - cssom "^0.4.4" + cssom "^0.5.0" cssstyle "^2.3.0" - data-urls "^2.0.0" - decimal.js "^10.2.1" - domexception "^2.0.1" + data-urls "^3.0.1" + decimal.js "^10.3.1" + domexception "^4.0.0" escodegen "^2.0.0" - form-data "^3.0.0" - html-encoding-sniffer "^2.0.1" - http-proxy-agent "^4.0.1" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" is-potential-custom-element-name "^1.0.1" nwsapi "^2.2.0" @@ -4278,24 +3986,19 @@ jsdom@16.7.0: symbol-tree "^3.2.4" tough-cookie "^4.0.0" w3c-hr-time "^1.0.2" - w3c-xmlserializer "^2.0.0" - webidl-conversions "^6.1.0" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.5.0" - ws "^7.4.6" - xml-name-validator "^3.0.0" + w3c-xmlserializer "^3.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^10.0.0" + ws "^8.2.3" + xml-name-validator "^4.0.0" json-buffer@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== -json-parse-better-errors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -4610,11 +4313,6 @@ listenercount@~1.0.1: resolved "https://registry.yarnpkg.com/listenercount/-/listenercount-1.0.1.tgz#84c8a72ab59c4725321480c975e6508342e70937" integrity sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc= -loader-runner@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" - integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== - loader-utils@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" @@ -4731,17 +4429,12 @@ lodash.some@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0= -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= - lodash.union@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" integrity sha1-SLtQiECfFvGCFmZkHETdGqrjzYg= -lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.7.0: +lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -4773,6 +4466,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +luxon@^1.28.0: + version "1.28.0" + resolved "https://registry.yarnpkg.com/luxon/-/luxon-1.28.0.tgz#e7f96daad3938c06a62de0fb027115d251251fbf" + integrity sha512-TfTiyvZhwBYM/7QdAVDh+7dBTBA29v4ik0Ce9zda3Mnf8on1S5KJI8P2jKFZ8+5C0jhmr0KwJEO/Wdpm0VeWJQ== + mailcheck@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/mailcheck/-/mailcheck-1.1.1.tgz#d87cf6ba0b64ba512199dbf93f1489f479591e34" @@ -4867,7 +4565,7 @@ mime-types@2.1.34: dependencies: mime-db "1.51.0" -mime-types@^2.1.12, mime-types@^2.1.18, mime-types@^2.1.27, mime-types@~2.1.24: +mime-types@^2.1.12, mime-types@^2.1.18, mime-types@~2.1.24: version "2.1.27" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== @@ -5029,14 +4727,7 @@ mocha@8.4.0: yargs-parser "20.2.4" yargs-unparser "2.0.0" -moment-timezone@^0.5.25: - version "0.5.28" - resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.28.tgz#f093d789d091ed7b055d82aa81a82467f72e4338" - integrity sha512-TDJkZvAyKIVWg5EtVqRzU97w0Rb0YVbfpqyjgu6GwXCAohVRqwZjf4fOzDE6p1Ch98Sro/8hQQi65WDXW5STPw== - dependencies: - moment ">= 2.9.0" - -"moment@>= 2.9.0", moment@^2.22.2: +moment@^2.22.2: version "2.24.0" resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== @@ -5061,6 +4752,21 @@ ms@3.0.0-canary.1: resolved "https://registry.yarnpkg.com/ms/-/ms-3.0.0-canary.1.tgz#c7b34fbce381492fd0b345d1cf56e14d67b77b80" integrity sha512-kh8ARjh8rMN7Du2igDRO9QJnqCb2xYTJxyQYK7vJJS4TvLLmsbyhiKpSW+t+y26gyOyMd0riphX0GeWKU3ky5g== +msgpackr-extract@^1.0.14: + version "1.0.16" + resolved "https://registry.yarnpkg.com/msgpackr-extract/-/msgpackr-extract-1.0.16.tgz#701c4f6e6f25c100ae84557092274e8fffeefe45" + integrity sha512-fxdRfQUxPrL/TizyfYfMn09dK58e+d65bRD/fcaVH4052vj30QOzzqxcQIS7B0NsqlypEQ/6Du3QmP2DhWFfCA== + dependencies: + nan "^2.14.2" + node-gyp-build "^4.2.3" + +msgpackr@^1.5.2: + version "1.5.4" + resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.5.4.tgz#2b6ea6cb7d79c0ad98fc76c68163c48eda50cf0d" + integrity sha512-Z7w5Jg+2Q9z9gJxeM68d7tSuWZZGnFIRhZnyqcZCa/1dKkhOCNvR1TUV3zzJ3+vj78vlwKRzUgVDlW4jiSOeDA== + optionalDependencies: + msgpackr-extract "^1.0.14" + multer@1.4.4: version "1.4.4" resolved "https://registry.yarnpkg.com/multer/-/multer-1.4.4.tgz#e2bc6cac0df57a8832b858d7418ccaa8ebaf7d8c" @@ -5089,7 +4795,7 @@ mz@^2.4.0, mz@^2.7.0: object-assign "^4.0.1" thenify-all "^1.0.0" -nan@^2.15.0: +nan@^2.14.2, nan@^2.15.0: version "2.15.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== @@ -5135,11 +4841,6 @@ negotiator@0.6.2, negotiator@^0.6.2: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - nested-property@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/nested-property/-/nested-property-4.0.0.tgz#a67b5a31991e701e03cdbaa6453bc5b1011bb88d" @@ -5150,11 +4851,6 @@ netmask@^2.0.2: resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7" integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== -next-line@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/next-line/-/next-line-1.1.0.tgz#fcae57853052b6a9bae8208e40dd7d3c2d304603" - integrity sha1-/K5XhTBStqm66CCOQN19PC0wRgM= - next-tick@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" @@ -5167,10 +4863,10 @@ node-abi@^3.3.0: dependencies: semver "^7.3.5" -node-addon-api@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.2.0.tgz#117cbb5a959dff0992e1c586ae0393573e4d2a87" - integrity sha512-eazsqzwG2lskuzBqCGPi7Ac2UgOoMz8JVOXVhTvvPDYhthvNpefx8jWD8Np7Gv+2Sz0FlPWZk0nJV0z598Wn8Q== +node-addon-api@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f" + integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ== node-domexception@^1.0.0: version "1.0.0" @@ -5199,6 +4895,11 @@ node-fetch@3.0.0-beta.9: data-uri-to-buffer "^3.0.1" fetch-blob "^2.1.1" +node-gyp-build@^4.2.3: + version "4.3.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" + integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q== + node-gyp-build@~3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-3.7.0.tgz#daa77a4f547b9aed3e2aac779eaf151afd60ec8d" @@ -5220,11 +4921,6 @@ node-gyp@^8.4.1: tar "^6.1.2" which "^2.0.2" -node-releases@^1.1.70: - version "1.1.71" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" - integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== - nodemailer@6.7.2: version "6.7.2" resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.7.2.tgz#44b2ad5f7ed71b7067f7a21c4fedabaec62b85e0" @@ -5464,13 +5160,6 @@ p-limit@^3.0.2: dependencies: p-try "^2.0.0" -p-limit@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" @@ -5743,12 +5432,12 @@ postgres-interval@^1.1.0: dependencies: xtend "^4.0.0" -prebuild-install@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.0.0.tgz#3c5ce3902f1cb9d6de5ae94ca53575e4af0c1574" - integrity sha512-IvSenf33K7JcgddNz2D5w521EgO+4aMMjFt73Uk9FRzQ7P+QZPKrp7qPsDydsSwjGt3T5xRNnM1bj1zMTD5fTA== +prebuild-install@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.0.1.tgz#c10075727c318efe72412f333e0ef625beaf3870" + integrity sha512-QBSab31WqkyxpnMWQxubYAHR5S9B2+r81ucocew34Fkl98FhvKIF50jIJnNOBmAZfyNV7vE5T6gd3hTVWgY6tg== dependencies: - detect-libc "^1.0.3" + detect-libc "^2.0.0" expand-template "^2.0.3" github-from-package "0.0.0" minimist "^1.2.3" @@ -5786,6 +5475,11 @@ printj@~1.1.0: resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222" integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ== +printj@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/printj/-/printj-1.3.1.tgz#9af6b1d55647a1587ac44f4c1654a4b95b8e12cb" + integrity sha512-GA3TdL8szPK4AQ2YnOe/b+Y1jUFwmmGMMK/qbY7VcE3Z7FU8JstbKiKRzO6CIiAKPhTO8m01NoQ0V5f3jc4OGg== + private-ip@2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/private-ip/-/private-ip-2.3.3.tgz#1e80ff8443e5ac78f555631aec3ea6ff027fa6aa" @@ -5796,10 +5490,10 @@ private-ip@2.3.3: is-ip "^3.1.0" netmask "^2.0.2" -probe-image-size@7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/probe-image-size/-/probe-image-size-7.2.2.tgz#e5851b9be7864f21e3bac5e6e4fac9da9055b412" - integrity sha512-QUm+w1S9WTsT5GZB830u0BHExrUmF0J4fyRm5kbLUMEP3fl9UVYXc3xOBVqZNnH9tnvVEJO8vDk3PMtsLqjxug== +probe-image-size@7.2.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/probe-image-size/-/probe-image-size-7.2.3.tgz#d49c64be540ec8edea538f6f585f65a9b3ab4309" + integrity sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w== dependencies: lodash.merge "^4.6.2" needle "^2.5.2" @@ -6194,14 +5888,6 @@ rename@1.0.4: dependencies: debug "^2.5.2" -request-stats@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/request-stats/-/request-stats-3.0.0.tgz#769155dc8974d78d4a1cb87bbf14eaab985afe25" - integrity sha1-dpFV3Il0141KHLh7vxTqq5ha/iU= - dependencies: - http-headers "^3.0.1" - once "^1.4.0" - require-all@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/require-all/-/require-all-3.0.0.tgz#473d49704be310115ce124f77383b1ebd8671312" @@ -6397,7 +6083,7 @@ semver@^7.3.5: dependencies: lru-cache "^6.0.0" -serialize-javascript@5.0.1, serialize-javascript@^5.0.1: +serialize-javascript@5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== @@ -6432,17 +6118,17 @@ sha.js@^2.4.11: inherits "^2.0.1" safe-buffer "^5.0.1" -sharp@0.29.3: - version "0.29.3" - resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.29.3.tgz#0da183d626094c974516a48fab9b3e4ba92eb5c2" - integrity sha512-fKWUuOw77E4nhpyzCCJR1ayrttHoFHBT2U/kR/qEMRhvPEcluG4BKj324+SCO1e84+knXHwhJ1HHJGnUt4ElGA== +sharp@0.30.0: + version "0.30.0" + resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.30.0.tgz#b2dd62d5f14088b11c72212354f31dff6511b070" + integrity sha512-L3m/l6yQFr3oGBUzcSAlN/R9yGFPYqM9FpMUe6Z4nHg4sWtP3hW1rcz+aaHklhD4wX5Jqh5PY9z+A1d4Qt3Hfg== dependencies: - color "^4.0.1" - detect-libc "^1.0.3" - node-addon-api "^4.2.0" - prebuild-install "^7.0.0" + color "^4.2.0" + detect-libc "^2.0.0" + node-addon-api "^4.3.0" + prebuild-install "^7.0.1" semver "^7.3.5" - simple-get "^4.0.0" + simple-get "^4.0.1" tar-fs "^2.1.1" tunnel-agent "^0.6.0" @@ -6496,6 +6182,15 @@ simple-get@^4.0.0: once "^1.3.1" simple-concat "^1.0.0" +simple-get@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" + integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== + dependencies: + decompress-response "^6.0.0" + once "^1.3.1" + simple-concat "^1.0.0" + simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" @@ -6530,34 +6225,16 @@ socks@^2.6.1: ip "^1.1.5" smart-buffer "^4.1.0" -source-list-map@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" - integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== - source-map-js@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e" integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug== -source-map-support@~0.5.19: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: +source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@~0.7.2: - version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== - speakeasy@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/speakeasy/-/speakeasy-2.0.0.tgz#85c91a071b09a5cb8642590d983566165f57613a" @@ -6794,7 +6471,7 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^7.0.0, supports-color@^7.1.0: +supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== @@ -6813,12 +6490,12 @@ syslog-pro@1.0.0: dependencies: moment "^2.22.2" -systeminformation@5.9.9: - version "5.9.9" - resolved "https://registry.yarnpkg.com/systeminformation/-/systeminformation-5.9.9.tgz#aa8234a138363bd988f438fed3273370f79d7e30" - integrity sha512-xciy6NKCLfs4dqMD1Tdlo7v1/g0NfdA1EKsIptUQjlcVvpwHyjifAbNOF7ppFezGSMXxYE8me+l2+RlFF4lyTg== +systeminformation@5.11.0: + version "5.11.0" + resolved "https://registry.yarnpkg.com/systeminformation/-/systeminformation-5.11.0.tgz#2060779e1e7c7372192dbcd850c65cfd85f4ea71" + integrity sha512-mI/5nFK7NUe9Qbmy65WoB5TlCWKAhP4kG0w6uR2mZM8Mpdi8b45b3hTIK3W5+kQYZnYFWeS9/O5nn5rdcSvqfA== -tapable@^2.1.1, tapable@^2.2.0: +tapable@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.0.tgz#5c373d281d9c672848213d0e037d1c4165ab426b" integrity sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw== @@ -6889,27 +6566,6 @@ tar@^6.1.2: mkdirp "^1.0.3" yallist "^4.0.0" -terser-webpack-plugin@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.1.1.tgz#7effadee06f7ecfa093dbbd3e9ab23f5f3ed8673" - integrity sha512-5XNNXZiR8YO6X6KhSGXfY0QrGrCRlSwAEjIIrlRQR4W8nP69TaJUlh3bkuac6zzgspiGPfKEHcY295MMVExl5Q== - dependencies: - jest-worker "^26.6.2" - p-limit "^3.1.0" - schema-utils "^3.0.0" - serialize-javascript "^5.0.1" - source-map "^0.6.1" - terser "^5.5.1" - -terser@^5.5.1: - version "5.5.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.5.1.tgz#540caa25139d6f496fdea056e414284886fb2289" - integrity sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ== - dependencies: - commander "^2.20.0" - source-map "~0.7.2" - source-map-support "~0.5.19" - text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -6990,10 +6646,10 @@ tough-cookie@^4.0.0: punycode "^2.1.1" universalify "^0.1.2" -tr46@^2.0.0, tr46@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479" - integrity sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg== +tr46@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" + integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== dependencies: punycode "^2.1.1" @@ -7057,7 +6713,7 @@ tsconfig-paths@3.12.0, tsconfig-paths@^3.12.0: minimist "^1.2.0" strip-bom "^3.0.0" -tslib@^1.8.1, tslib@^1.9.0: +tslib@^1.8.1: version "1.11.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== @@ -7318,20 +6974,12 @@ w3c-hr-time@^1.0.2: dependencies: browser-process-hrtime "^1.0.0" -w3c-xmlserializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" - integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== +w3c-xmlserializer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz#06cdc3eefb7e4d0b20a560a5a3aeb0d2d9a65923" + integrity sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg== dependencies: - xml-name-validator "^3.0.0" - -watchpack@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.0.0.tgz#b12248f32f0fd4799b7be0802ad1f6573a45955c" - integrity sha512-xSdCxxYZWNk3VK13bZRYhsQpfa8Vg63zXG+3pyU8ouqSLRCv4IGXIp9Kr226q6GBkGRlZrST2wwKtjfKz2m7Cg== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" + xml-name-validator "^4.0.0" web-push@3.4.5: version "3.4.5" @@ -7350,52 +6998,10 @@ web-streams-polyfill@^3.0.3: resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.0.tgz#a6b74026b38e4885869fb5c589e90b95ccfc7965" integrity sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA== -webidl-conversions@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" - integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== - -webidl-conversions@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" - integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== - -webpack-sources@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-2.2.0.tgz#058926f39e3d443193b6c31547229806ffd02bac" - integrity sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w== - dependencies: - source-list-map "^2.0.1" - source-map "^0.6.1" - -webpack@^5: - version "5.33.2" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.33.2.tgz#c049717c9b038febf5a72fd2f53319ad59a8c1fc" - integrity sha512-X4b7F1sYBmJx8mlh2B7mV5szEkE0jYNJ2y3akgAP0ERi0vLCG1VvdsIxt8lFd4st6SUy0lf7W0CCQS566MBpJg== - dependencies: - "@types/eslint-scope" "^3.7.0" - "@types/estree" "^0.0.46" - "@webassemblyjs/ast" "1.11.0" - "@webassemblyjs/wasm-edit" "1.11.0" - "@webassemblyjs/wasm-parser" "1.11.0" - acorn "^8.0.4" - browserslist "^4.14.5" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.7.0" - es-module-lexer "^0.4.0" - eslint-scope "^5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.4" - json-parse-better-errors "^1.0.2" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.0.0" - tapable "^2.1.1" - terser-webpack-plugin "^5.1.1" - watchpack "^2.0.0" - webpack-sources "^2.1.1" +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== websocket@1.0.34: version "1.0.34" @@ -7409,35 +7015,25 @@ websocket@1.0.34: utf-8-validate "^5.0.2" yaeti "^0.0.6" -whatwg-encoding@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== +whatwg-encoding@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" + integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== dependencies: - iconv-lite "0.4.24" + iconv-lite "0.6.3" -whatwg-mimetype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== +whatwg-mimetype@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" + integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== -whatwg-url@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.0.0.tgz#37f256cb746398e19b107bd6ef820b4ae2d15871" - integrity sha512-41ou2Dugpij8/LPO5Pq64K5q++MnRCBpEHvQr26/mArEKTkCV5aoXIqyhuYtE0pkqScXwhf2JP57rkRTYM29lQ== +whatwg-url@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-10.0.0.tgz#37264f720b575b4a311bd4094ed8c760caaa05da" + integrity sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w== dependencies: - lodash.sortby "^4.7.0" - tr46 "^2.0.0" - webidl-conversions "^5.0.0" - -whatwg-url@^8.5.0: - version "8.5.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.5.0.tgz#7752b8464fc0903fec89aa9846fc9efe07351fd3" - integrity sha512-fy+R77xWv0AiqfLl4nuGUlQ3/6b5uNfQ4WAbGQVMYshCTCCPK9psC1nWh3XHuxGVCtlcDDQPQW1csmmIQo+fwg== - dependencies: - lodash "^4.7.0" - tr46 "^2.0.2" - webidl-conversions "^6.1.0" + tr46 "^3.0.0" + webidl-conversions "^7.0.0" which-boxed-primitive@^1.0.2: version "1.0.2" @@ -7526,16 +7122,11 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -ws@8.4.2: +ws@8.4.2, ws@^8.2.3: version "8.4.2" resolved "https://registry.yarnpkg.com/ws/-/ws-8.4.2.tgz#18e749868d8439f2268368829042894b6907aa0b" integrity sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA== -ws@^7.4.6: - version "7.5.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" - integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== - xev@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/xev/-/xev-2.0.1.tgz#24484173a22115bc8a990ef5d4d5129695b827a7" @@ -7548,10 +7139,10 @@ xml-js@^1.6.11: dependencies: sax "^1.2.4" -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== +xml-name-validator@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" + integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== xml2js@0.4.19: version "0.4.19" @@ -7695,11 +7286,6 @@ yn@3.1.1: resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - zen-observable-ts@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-1.0.0.tgz#30d1202b81d8ba4c489e3781e8ca09abf0075e70" diff --git a/packages/client/package.json b/packages/client/package.json index b840bafe8..cf4214e72 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -11,8 +11,8 @@ }, "dependencies": { "@discordapp/twemoji": "13.1.0", + "@fortawesome/fontawesome-free": "6.0.0-beta3", "@syuilo/aiscript": "0.11.1", - "@types/dateformat": "3.0.1", "@types/escape-regexp": "0.0.1", "@types/glob": "7.2.0", "@types/gulp": "4.0.9", @@ -26,7 +26,6 @@ "@types/punycode": "2.1.0", "@types/qrcode": "1.4.2", "@types/random-seed": "0.3.3", - "@types/request-stats": "3.0.0", "@types/seedrandom": "2.4.28", "@types/throttle-debounce": "2.1.0", "@types/tinycolor2": "1.4.3", @@ -47,6 +46,7 @@ "broadcast-channel": "4.9.0", "chart.js": "3.7.0", "chartjs-adapter-date-fns": "2.0.0", + "chartjs-plugin-gradient": "0.2.1", "chartjs-plugin-zoom": "1.2.0", "compare-versions": "4.1.3", "content-disposition": "0.5.4", @@ -87,7 +87,6 @@ "querystring": "0.2.1", "random-seed": "0.3.0", "reflect-metadata": "0.1.13", - "request-stats": "3.0.0", "rndstr": "1.0.0", "s-age": "1.1.2", "sass": "1.49.0", diff --git a/packages/client/src/components/chart-tooltip.vue b/packages/client/src/components/chart-tooltip.vue index b080eaf2b..20e094a5a 100644 --- a/packages/client/src/components/chart-tooltip.vue +++ b/packages/client/src/components/chart-tooltip.vue @@ -1,5 +1,5 @@ - diff --git a/packages/client/src/pages/admin/users.vue b/packages/client/src/pages/admin/users.vue index 03e155ddc..f05aa5ff4 100644 --- a/packages/client/src/pages/admin/users.vue +++ b/packages/client/src/pages/admin/users.vue @@ -36,7 +36,7 @@ - +